Skip to content

Commit 5955cb7

Browse files
authored
Merge pull request #51 from iflytek/chore/doc-watch-automation
chore: 上游文档每日巡检 doc-watch(抓取+对比+告警,附联网补全 routine)
2 parents e8c753b + 1cf374f commit 5955cb7

5 files changed

Lines changed: 1269 additions & 0 deletions

File tree

.github/workflows/doc-watch.yml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
name: doc-watch
2+
3+
# 每日抓取上游文档站(Loomy Docs / AstronClaw 使用指南),与仓库基线对比,
4+
# 发现新增内容或图片时,自动维护一条 [doc-watch] Issue 汇总待补全清单。
5+
#
6+
# 触发:每天 01:00 UTC(北京时间 09:00)+ 可手动触发。
7+
8+
on:
9+
schedule:
10+
- cron: '0 1 * * *'
11+
workflow_dispatch: {}
12+
13+
permissions:
14+
contents: read
15+
issues: write
16+
17+
jobs:
18+
watch:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- uses: actions/setup-node@v4
24+
with:
25+
node-version: 20
26+
27+
- name: Run doc-watch
28+
id: watch
29+
run: |
30+
set +e
31+
node scripts/doc-watch/check-updates.mjs --report doc-watch-report.md
32+
echo "code=$?" >> "$GITHUB_OUTPUT"
33+
set -e
34+
35+
- name: Upsert summary issue on changes
36+
if: steps.watch.outputs.code == '1'
37+
env:
38+
GH_TOKEN: ${{ github.token }}
39+
run: |
40+
BODY_FILE=doc-watch-report.md
41+
{
42+
echo ""
43+
echo "---"
44+
echo "_由 \`doc-watch\` 工作流自动生成 · run [#${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})_"
45+
echo ""
46+
echo "处理完成后,在补全内容的 PR 里执行 \`node scripts/doc-watch/check-updates.mjs --update\` 刷新基线,本 Issue 即可关闭。"
47+
} >> "$BODY_FILE"
48+
49+
TITLE="[doc-watch] 上游文档有新增内容待补全"
50+
EXISTING=$(gh issue list --label doc-watch --state open --json number --jq '.[0].number' 2>/dev/null)
51+
if [ -n "$EXISTING" ]; then
52+
gh issue edit "$EXISTING" --body-file "$BODY_FILE"
53+
gh issue comment "$EXISTING" --body "🔄 巡检报告已于本次 run 更新(run #${{ github.run_number }})。"
54+
echo "Updated issue #$EXISTING"
55+
else
56+
gh label create doc-watch --color FBCA04 --description "上游文档巡检" 2>/dev/null || true
57+
gh issue create --title "$TITLE" --label doc-watch --body-file "$BODY_FILE"
58+
fi
59+
60+
- name: Report capture failure
61+
if: steps.watch.outputs.code == '2'
62+
env:
63+
GH_TOKEN: ${{ github.token }}
64+
run: |
65+
gh label create doc-watch --color FBCA04 --description "上游文档巡检" 2>/dev/null || true
66+
gh issue create \
67+
--title "[doc-watch] ⚠️ 巡检抓取失败" \
68+
--label doc-watch \
69+
--body "doc-watch 工作流抓取上游文档时出错,请查看 run [#${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) 日志。可能是上游站点改版或网络问题。"
70+
71+
- name: Upload report artifact
72+
if: steps.watch.outputs.code == '1'
73+
uses: actions/upload-artifact@v4
74+
with:
75+
name: doc-watch-report
76+
path: doc-watch-report.md

scripts/doc-watch/README.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# doc-watch · 上游文档每日巡检
2+
3+
每天抓取上游文档站,与仓库基线对比,发现**新增内容 / 新增图片**,并辅助把新内容(含配图)补全到本教程站点。
4+
5+
## 监测的源
6+
7+
|| 地址 | 抓取方式 |
8+
|---|---|---|
9+
| Loomy Docs | https://loomy.xunfei.cn/docs | VitePress SSG,自动从侧边栏发现全部页面 |
10+
| AstronClaw 使用指南 | https://www.xfyun.cn/doc/spark/Agent-AstronClaw使用指南.html | 单页 SSR |
11+
12+
## 组成
13+
14+
```
15+
scripts/doc-watch/
16+
check-updates.mjs # 抓取 + 对比引擎(零依赖,Node 18+ 内置 fetch)
17+
baseline/ # 基线快照(每源一个 JSON:页面 / 小节 / 图片 / 正文哈希)
18+
loomy.json
19+
astronclaw.json
20+
.github/workflows/doc-watch.yml # 每日 cron,发现变化时维护一条 [doc-watch] Issue
21+
```
22+
23+
## 本地用法
24+
25+
```bash
26+
# 巡检:与基线对比,有变化时退出码 1,并打印 Markdown 报告
27+
node scripts/doc-watch/check-updates.mjs
28+
29+
# 把报告写到文件
30+
node scripts/doc-watch/check-updates.mjs --report report.md
31+
32+
# 输出 JSON(便于程序消费)
33+
node scripts/doc-watch/check-updates.mjs --json
34+
35+
# 首次创建 / 重建基线
36+
node scripts/doc-watch/check-updates.mjs --init
37+
38+
# 接受当前线上状态为新基线(补全内容后执行,用于关闭巡检告警)
39+
node scripts/doc-watch/check-updates.mjs --update
40+
```
41+
42+
退出码:`0` 无变化 · `1` 有新增/变化 · `2` 抓取失败。
43+
44+
## 工作机制
45+
46+
1. Loomy 站点是 VitePress,HTML 里直接含侧边栏全部页面链接 → 自动发现页面清单,无需浏览器。
47+
2. 每页提取:标题、各级小节标题(h1–h4)、正文图片 URL(已绝对化,过滤站点 logo)、正文文本哈希。
48+
3.`baseline/*.json` 对比,输出:🆕 新增页面 / ✏️ 内容变化(含新增小节、新增图片)/ 🗑️ 下线页面。
49+
4. 基线提交在仓库里;补全内容的 PR 顺带 `--update` 刷新基线,避免重复告警。
50+
51+
## 两层自动化
52+
53+
### 第一层:GitHub Actions(确定性巡检,已内置)
54+
55+
`.github/workflows/doc-watch.yml` 每天 01:00 UTC(北京时间 09:00)运行脚本。发现变化时,
56+
自动维护**一条**`doc-watch` 标签的 Issue,列出新增页面 / 小节 / 图片 URL,供后续补全。
57+
免费、纯确定性,但不含联网搜索与自动起草。
58+
59+
### 第二层:Claude 定时云 agent(联网搜索 + 自动起草 PR)
60+
61+
确定性巡检之上,再用一个每日 Claude routine 完成「联网找新内容 + 抓图 + 起草 PR」。
62+
routine 的提示词如下(可直接用于 `/schedule` 或定时 agent):
63+
64+
```
65+
每天巡检本仓库的上游文档,发现并补全新内容:
66+
67+
1. 运行 `node scripts/doc-watch/check-updates.mjs --report /tmp/doc-watch.md`,读取报告。
68+
2. 若报告显示有「新增页面 / 新增小节 / 新增图片」:
69+
- 对每处新内容,抓取上游对应页面与配图(图片落到 docs/public/loomy/<区域>/ 或
70+
docs/public/astronclaw/,本地引用而非外链)。
71+
- 按现有页面风格写成中文页面,并补一份等价的英文页面(docs/ 与 docs/en/)。
72+
- 需要时更新 docs/.vitepress/config.mts 的中英侧边栏。
73+
3. 此外,联网搜索 Loomy / 讯飞 AstronClaw 的近期官方更新(发布说明、新功能、新渠道、
74+
新技能),判断是否有本站尚未覆盖、且适合补充的内容;有则一并补上并注明来源。
75+
4. 运行 `npm run docs:build` 确认死链检查通过、搜索索引重新生成。
76+
5. 运行 `node scripts/doc-watch/check-updates.mjs --update` 刷新基线。
77+
6. 新建分支并开 PR,标题 `docs: 同步上游文档新增内容 (<日期>)`,PR 描述列出每处新增的来源链接。
78+
遵循仓库约定:提交与 PR 不得包含任何 AI 署名。
79+
若本次无任何新增,则不创建 PR,仅留一句说明。
80+
```
81+
82+
> 说明:联网搜索与「读懂新内容→翻译成双语页面→挑选配图」需要判断力,必须由带联网与
83+
> 写作能力的 agent 完成;纯 CI 只能做到确定性 diff + 告警。两层配合即可覆盖
84+
> 「抓取 + 对比 + 配图 + 联网补全」的完整需求。
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
{
2+
"source": "astronclaw",
3+
"name": "AstronClaw 使用指南",
4+
"pageCount": 1,
5+
"pages": {
6+
"https://www.xfyun.cn/doc/spark/Agent-AstronClaw%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html": {
7+
"url": "https://www.xfyun.cn/doc/spark/Agent-AstronClaw%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html",
8+
"title": "AstronClaw:你的云端 AI 助手,全天候在线服务 | 讯飞开放平台文档中心",
9+
"headings": [
10+
"h1:AstronClaw:你的云端 AI 助手,全天候在线服务",
11+
"h2:目录",
12+
"h2:AstronClaw核心优势",
13+
"h2:AstronClaw对比本地OpenClaw",
14+
"h2:如何使用AstronClaw",
15+
"h3:第一步:立即部署",
16+
"h3:第二步:开始对话",
17+
"h3:第三步:安装技能",
18+
"h3:第四步:配置消息渠道",
19+
"h2:技能系统",
20+
"h3:一、技能是什么",
21+
"h3:二、技能如何获取",
22+
"h4:1️⃣ 技能市场手动安装",
23+
"h4:2️⃣ 对话自动安装",
24+
"h3:三、技能如何被调用",
25+
"h4:1️⃣ 自动调用",
26+
"h4:2️⃣ 指定调用",
27+
"h4:3️⃣ 多技能链式调用",
28+
"h3:四、技能触发机制",
29+
"h3:五、技能市场",
30+
"h3:六、我的技能(管理)",
31+
"h3:七、创建完成后的使用方式",
32+
"h2:订阅与积分规则",
33+
"h3:1.订阅套餐",
34+
"h3:2.积分类型",
35+
"h3:3.积分获取",
36+
"h3:4.积分消耗",
37+
"h3:5.积分抵扣顺序",
38+
"h3:6.服务升级和降级",
39+
"h3:7.促销优惠和新用户福利",
40+
"h3:8.退款与异常处理规则",
41+
"h3:9.常见Q&A",
42+
"h2:常见问题",
43+
"h3:一键部署需要什么条件?",
44+
"h3:如果 AstronClaw 不响应怎么办?",
45+
"h3:重启、重置、删除有什么区别?",
46+
"h3:支持哪些文件上传?",
47+
"h3:如何切换对话模型?",
48+
"h3:AstronClaw 可以发送文件给我吗?",
49+
"h2:实际应用场景",
50+
"h3:1. 行业研报",
51+
"h3:2. 资讯播客",
52+
"h3:3. PPT 自动生成",
53+
"h2:飞书渠道配置指南",
54+
"h3:前置条件",
55+
"h3:操作步骤",
56+
"h4:步骤一:创建飞书应用",
57+
"h4:步骤二:获取应用凭证",
58+
"h4:步骤三:配置应用权限并启用机器人能力",
59+
"h4:步骤四:配置事件订阅",
60+
"h4:步骤五:发布飞书应用",
61+
"h3:测试连接",
62+
"h3:推荐使用场景",
63+
"h2:钉钉渠道配置指南",
64+
"h3:前置条件",
65+
"h3:操作步骤",
66+
"h4:步骤一:创建钉钉应用",
67+
"h4:步骤二:为钉钉应用添加权限",
68+
"h4:步骤三:配置钉钉机器人",
69+
"h4:步骤四:发布应用版本",
70+
"h4:步骤五:获取应用信息",
71+
"h4:步骤六:在 AstronClaw 中完成配置",
72+
"h2:企业微信渠道配置指南",
73+
"h3:前置条件",
74+
"h3:操作步骤方法一:",
75+
"h4:步骤一:创建企业微信机器人",
76+
"h4:步骤二:开启长连接",
77+
"h4:步骤三:在 AstronClaw 中完成配置",
78+
"h3:操作步骤方法二:",
79+
"h4:步骤一:使用企业微信扫码创建机器人",
80+
"h4:步骤二:点击自动创建",
81+
"h2:微信渠道配置指南",
82+
"h3:前置条件",
83+
"h3:操作步骤",
84+
"h4:步骤一:在AstronClaw中获取二维码",
85+
"h4:步骤二:使用微信进行扫码",
86+
"h3:添加多账号与解绑",
87+
"h2:微博渠道配置指南",
88+
"h3:操作步骤:",
89+
"h4:步骤一:获取凭证",
90+
"h4:步骤二:在 AstronClaw 中完成配置"
91+
],
92+
"images": [
93+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/8f1df446-d2ad-4eb7-a203-2adb61c375ba.png",
94+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/31652b25-be74-4572-bf34-05a9a2d719c9.png",
95+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/78ebe6bc-d797-4cc1-afd8-9621714f09af.png",
96+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/f39bdb4f-9749-410c-82d1-99d7649a683d.png",
97+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/14db3e34-a75f-4683-b3a4-60abe51bc32b.png",
98+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/7a15e0f8-f245-4fb5-a7fb-40b510dc3e77.png",
99+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/0dc10451-5cbb-4a8a-b242-c60a22145d33.png",
100+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/77875bfb-bae0-4724-948d-53e5b04b3b43.png",
101+
"https://bjcdn.openstorage.cn/aicontest/2026-05-13/c01fe8e2-5fe0-49d4-a902-d29be5f89e2b.png",
102+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/1f82fb01-c211-4925-9507-33dc1ff548d3.png",
103+
"https://bjcdn.openstorage.cn/aicontest/2026-05-13/fa8e4356-126f-45fc-8e8a-168ff2a3116b.png",
104+
"https://bjcdn.openstorage.cn/aicontest/2026-05-13/e876cf46-94a0-4b3b-8fde-1a27210a21dc.png",
105+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/195ecb47-6373-4af7-bb68-eb75e45130c3.png",
106+
"https://bjcdn.openstorage.cn/aicontest/2026-05-13/3cce905d-414d-463a-bb20-763a2274db55.png",
107+
"https://bjcdn.openstorage.cn/aicontest/2026-05-13/f5216a9f-6ed6-433a-9968-83cad5e93ed7.png",
108+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/360cda54-f0f3-454a-883d-93b9fb564a66.webp",
109+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/7c71de39-0909-4178-9d19-a7e746e6328c.webp",
110+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/62090a39-a0c5-4167-8d95-7e899b2ff3b3.webp",
111+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/d59e4fa9-eee3-46e5-859b-cdf61599611c.webp",
112+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/9d664481-5ceb-406f-9e78-06375eb9ac32.webp",
113+
"https://bjcdn.openstorage.cn/aicontest/2026-03-12/67d8b161-46f0-408e-b6fa-3ff5ad06aadb.webp",
114+
"https://bjcdn.openstorage.cn/aicontest/2026-03-13/2e0f9959-dee9-4b40-92ce-8df194d63f4d.png",
115+
"https://bjcdn.openstorage.cn/aicontest/2026-03-13/6effe2f3-6cc0-49dc-b037-7b34ec8a5d68.jpg",
116+
"https://bjcdn.openstorage.cn/aicontest/2026-03-13/2c5e217b-6129-4b7e-85b8-3f79f4e897e9.jpg",
117+
"https://bjcdn.openstorage.cn/aicontest/2026-03-30/0efa8092-b8d4-4caf-9c5f-9c9adaa80cbc.png",
118+
"https://bjcdn.openstorage.cn/aicontest/2026-03-30/ed272a6b-1952-4e81-beae-0dd92db65767.png",
119+
"https://bjcdn.openstorage.cn/aicontest/2026-03-27/aa7fc599-f956-446f-aae6-28b00efbe39d.png",
120+
"https://bjcdn.openstorage.cn/aicontest/2026-03-30/1fa6ca11-0d49-4e58-8697-ba20b974795c.png",
121+
"https://bjcdn.openstorage.cn/aicontest/2026-03-30/dfc5292c-bdc7-4620-8de5-4ef3f41946b3.png",
122+
"https://bjcdn.openstorage.cn/aicontest/2026-03-17/d4f8d3f0-4d65-4703-8ffd-2a0ac0e810df.png",
123+
"https://bjcdn.openstorage.cn/aicontest/2026-03-17/d5d25f8b-ef51-4ad3-8b29-576f6f1821aa.png",
124+
"https://bjcdn.openstorage.cn/aicontest/2026-03-17/88a48006-063e-4f2d-95df-d4eb949eb004.png"
125+
],
126+
"textHash": "c155dc6f637fc84b",
127+
"textLen": 9343
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)