← 返回
未分类 Key

Report Expert

生成 HTML 报告页面并部署到 Cloudflare Pages 站点。涵盖设计系统、页面结构、索引管理、iframe 内嵌查看、自动部署全流程。触发词:写报告、发布报告、部署报告、生成报告页面、report publisher、报告专家、升级报告专家、更新报告技能、发布技能升级。
生成 HTML 报告页面并部署到 Cloudflare Pages 站点。五模块架构:输入适配、报告生产、结构检查修复、小站维护、验证修复。触发词:写报告、发布报告、部署报告、生成报告页面、出报告、做报告、写页面、发布到CF、部署到CF、上线报告、报告发布器、报告专家、部署仓库...
tomtrije tomtrije 来源
未分类 clawhub v2.0.0 3 版本 100000 Key: 需要
★ 0
Stars
📥 587
下载
💾 0
安装
3
版本
#latest

概述

报告专家 v2.0

将调研内容生成 HTML 报告,部署到 Cloudflare Pages 小站,自动检查修复 HTML 结构问题,验证线上正确性。支持多种输入格式(HTML/Markdown/URL/纯文本)自动适配,CF双向同步保证本地与线上一致。


前置配置

TOOLS.md 中添加:

### Report Expert 技能配置
- `CLOUDFLARE_API_TOKEN=cfat_xxxx`    # 必需
- `REPORT_CF_PROJECT=xuedi`           # 必需,CF Pages 项目名
- `REPORT_SITE_NAME=雪地`              # 必需,小站显示名
- `REPORT_CUSTOM_DOMAIN=xue.mei.pub`  # 可选,不填用 *.pages.dev

五模块架构

模块文件职责
------------------
输入适配lib/adapter.py自动检测输入类型(HTML/Markdown/URL/纯文本),转换为规范 HTML
报告生产lib/report.py提取 body → lint 修复 → 图片同步 → 生成页面 → 写入 dist
结构修复lib/html_lint.py可扩展的 lint+fix 管线,12 条规则自动检查+修复
小站维护lib/site.py索引管理、资源同步、CF双向同步、页面更新、CF 部署
验证修复lib/verify.py从 lint 管线生成线上验证清单,诊断失败原因

依赖:adapter → report → html_lint → page → configsite → html_lint → page → config → remote_deployverify → html_lint → config

html_lint 是 report/site 的共享守门人——produce 和 update_pages 都用同一套管线。


输入适配

支持四种输入类型,自动检测转换:

  • HTML — 直接使用,无需转换
  • Markdown — markdown 库渲染(表格、代码块、目录)
  • URL — curl 抓取网页,提取 body 清洗(移除 script/nav/sidebar)
  • 纯文本 — 按段落包裹

    标签

检测逻辑:看扩展名 → 看 URL 前缀 → 读前 2000 字符判断内容特征。标题从 Markdown 首行标题、HTML </code> 标签、URL 页面标题自动提取。</p><hr><h2>HTML 结构检查修复(核心能力)</h2><p>lint+fix 管线保证产出 HTML 结构完整。每条规则同时具备 check+fix,发现问题就修。流程:检查 → 修复 → 确认(最多 3 轮)。</p><h3>规则清单</h3><table><thead><tr><th>Rule</th><th>Stage</th><th>修复动作</th></tr></thead><tbody><tr><td>------</td><td>-------</td><td>---------</td></tr><tr><td>DivBalance</td><td>body</td><td>多余/缺失 <code></div></code> 从尾部处理</td></tr><tr><td>NoDuplicateWrapper</td><td>body</td><td>多余 wrapper 剥离</td></tr><tr><td>NoFrameworkChrome</td><td>body</td><td>移除 header/footer/toc 等模板 chrome</td></tr><tr><td>ImgPathAbsolute</td><td>body</td><td><code>../images/</code> → <code>/images/</code></td></tr><tr><td>ScriptSafety</td><td>body</td><td>移除危险 <code><script></code>(只检查 <code><script></code> 标签内)</td></tr><tr><td>TagBalance</td><td>body</td><td>非语义标签闭合补充</td></tr><tr><td>StyleConflict</td><td>body</td><td>全局样式加 <code>.page-body</code> 前缀</td></tr><tr><td>BodyNotEmpty</td><td>body</td><td>❌ 无法修复,阻断部署</td></tr><tr><td>PageDivBalance</td><td>page</td><td><code></body></code> 前补充/移除 <code></div></code></td></tr><tr><td>PageImgIntegrity</td><td>page</td><td>缺失图片 → SVG 占位图</td></tr><tr><td>PageStructure</td><td>page</td><td>❌ 无法修复,阻断部署</td></tr></tbody></table><p><strong>新增规则只需定义 LintRule 子类,注册到 default_pipeline()。</strong></p><hr><h2>工作流程</h2><h3>一键部署(自动适配输入类型)</h3><pre><code>uv run deploy.py deploy <category> <source> --title "标题" --desc "描述" # source 支持: .html / .md / URL / 纯文本文件 </code></pre><h3>分步操作</h3><pre><code>uv run deploy.py produce <category> <source> --title "标题" # 适配+生产到 dist uv run deploy.py publish # 部署到 CF uv run deploy.py sync # 从 CF 线上同步缺失文件到 dist uv run deploy.py verify # 验证线上结果 </code></pre><h3>维护命令</h3><pre><code>uv run deploy.py add <filename> --title T --desc D --category C [--url U] uv run deploy.py remove <category/filename> uv run deploy.py rebuild_index uv run deploy.py update # 用最新模板+lint 重新包裹所有页面 uv run deploy.py check # 检查配置 </code></pre><hr><h2>CF双向同步</h2><p><code>sync_from_cf()</code> 从线上站点拉取缺失文件到 dist,保证本地与线上一致:</p><ol><li>拉取线上 index.json 获取页面列表</li><li>对比 dist 中缺失的文件逐个下载</li><li>合并线上索引到本地索引</li></ol><p>应用场景:dist 被意外清理后恢复、新环境初始化、多人协作同步。</p><hr><h2>索引安全</h2><p>三层保障防止 dist 被清理时丢失:</p><ol><li><strong>dist/index.json</strong> — 正常路径</li><li><strong>技能根目录 index.json</strong> — 每次写索引时同步备份</li><li><strong>线上 index.json</strong> — 终极恢复源</li></ol><p><code>load_index_safe()</code> 按优先级依次恢复。</p><hr><h2>验证流程</h2><p>部署后 agent 用 web_fetch 逐项验证。验证清单从 lint 管线 online stage 规则自动生成。失败 → diagnose → 修复 → publish → 再验证,最多 3 次。</p><hr><h2>文件清单</h2><pre><code>deploy.py — CLI 入口 lib/adapter.py — 输入适配(HTML/Markdown/URL/纯文本 → HTML) lib/config.py — 配置加载 + 索引读写 + 分类常量 lib/html_lint.py — lint+fix 管线(LintRule + LintPipeline + 12 规则) lib/page.py — 页面 HTML 生成(纯模板渲染) lib/report.py — 报告生产(提取 → lint → 图片 → 生成 → 写入) lib/site.py — 小站维护(索引 + 资源 + CF双向同步 + 更新 + 部署) lib/remote_deploy.py — CF Pages wrangler 调用 lib/verify.py — 验证修复(URL 清单 + 诊断) references/ — 详细规范 templates/base.css — 设计系统 templates/index.html — 首页模板 scripts/main.js — 交互系统 </code></pre></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 3 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v2.0.0</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-06-19 15:10 </div> </li> <li> <div> <span class="version-tag">v1.6.15</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-07 03:47 安全 安全 </div> </li> <li> <div> <span class="version-tag">v1.6.14</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-02 10:32 安全 安全 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-queued"> 队列中 </div> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-queued"> 队列中 </div> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">dev-programming</span> <h3><a href="/s/codeconductor">CodeConductor.ai</a></h3> <div class="rec-owner">larsonreever</div> <div class="rec-desc">AI驱动平台,提供快速全栈开发、智能体、工作流自动化及低代码AI集成的可扩展产品创建。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 72</span> <span style="color:#5b6abf;">📥 181,598</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">dev-programming</span> <h3><a href="/s/github">Github</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">使用 `gh` CLI 与 GitHub 交互,通过 `gh issue`、`gh pr`、`gh run` 和 `gh api` 管理议题、PR、CI 运行及高级查询。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 677</span> <span style="color:#5b6abf;">📥 326,498</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">design-media</span> <h3><a href="/s/music-creator">Music Creator</a></h3> <div class="rec-owner">tomtrije</div> <div class="rec-desc">AI 音乐创作全流程技能。根据主题和风格创作歌词,使用 MiniMax AI 生成音乐和封面图;Whisper ASR +V2 高精度对齐(纯 Python,无需 espeak-ng)精准校准歌词时序;生成标准 LRC 歌词文件和带歌词同步</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 0</span> <span style="color:#5b6abf;">📥 486</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>