Commit c8b8bc46 authored by 谢宇轩's avatar 谢宇轩

docs: 同步 README 与本次 skill 改动

- 前置条件: macOS 手写 Chromium 命令 → ensure-chromium.js --list/--login 跨平台引导
- 添加新源流程: 3步闭环 → 4步闭环 (加 recipe-test 锁定)
- 归档产物结构: 摘要文件移到 summary/ 子目录, 加 category/tags/date 字段说明
- 分工说明: tags 从 [category,source] 改为 agent 从摘要提取 ≤3 语义关键词
- 浏览器说明: 加 --login 引导登录态, --list/--check 检测
- 能力概览表: "自动分类" → "分类与标签" (脚本猜测+agent覆盖 / agent提取)
parent 45dcc7de
# News Harvester Skill
一个通用 Skill:从配置的新闻源(Reuters、The Conversation、The Guardian 等)采集最新文章,生成中文摘要 + 英文原文,归档到 Obsidian vault。支持去重和自动分类
一个通用 Skill:从配置的新闻源(Reuters、The Conversation、The Guardian 等)采集最新文章,生成中文摘要 + 英文原文,归档到 Obsidian vault。支持去重、自动分类与语义标签提取
> 适用于任何支持 Skill 加载的 Agent 环境(如 [Claude Code](https://docs.claude.com/en/docs/claude-code)、ZCode 等),包括交互模式和无头模式。
......@@ -14,7 +14,7 @@
| 📡 文章采集 | 抓取首页链接 → 提取全文(标题/日期/作者/正文/配图) |
| 🗄 Obsidian 归档 | 每篇文章生成中文摘要 + 英文原文 + 当日索引 + 去重注册表 |
| 🔁 去重 | 滑动窗口(默认 7 天)的 registry,避免重复采集 |
| 🏷 自动分类 | 基于关键词映射到 7 个分类(地缘政治/科技AI/中美关系/财经/社会/国际冲突/国际) |
| 🏷 分类与标签 | `category` 脚本按关键词初始猜测 + Agent 覆盖(7 类);`tags` 由 Agent 从摘要/正文提取 ≤3 个语义关键词 |
---
......@@ -52,7 +52,7 @@ config.json ──▶ harvest.js ──▶ 有 helpers/<id>.md ?
**脚本与 Agent 分工**
- **脚本**`scripts/`):确定性工作 —— HTTP 请求、HTML 解析、图片下载、去重、**写原文.md / registry / index**(中文标题先用哨兵占位,全文直接落盘)
- **Agent**(LLM):智能工作 —— 读紧凑 manifest(无全文,仅 `bodyPreview` ~4000 字),生成中文标题 + 四段摘要 + 分类,写入 `.summaries.json`
- **Agent**(LLM):智能工作 —— 读紧凑 manifest(无全文,仅 `bodyPreview` ~4000 字),生成中文标题 + 四段摘要 + 分类`category`)+ 从摘要/正文提取的 ≤3 个 `tags`,写入 `.summaries.json`
- **finalize.js**:读 `.summaries.json`,写中文摘要文档,把原文里的哨兵替换成真实标题,更新 registry/index,清理临时文件
> 全文 body 由脚本直接写盘,**永不进入 Agent 上下文**——这是降低 token 消耗的关键。
......@@ -97,13 +97,14 @@ news-harvester/
- [Node.js](https://nodejs.org/) ≥ 18
- 一个可写的 Obsidian vault 目录
- (可选)Chromium / Google Chrome / Edge —— 仅当使用 `browser` 方法的源(如 reuters)时需要。脚本会跨平台自动发现已安装的浏览器(macOS `.app`、Linux PATH、Windows 安装目录),推荐手动启动,指定profile 目录和端口
- (可选)Chromium / Google Chrome / Edge —— 仅当使用 `browser` 方法的源(如 reuters)时需要。脚本会跨平台自动发现已安装的浏览器(macOS `.app`、Linux PATH、Windows 安装目录)**需要登录态的源**(订阅/付费墙)用 `ensure-chromium.js --login` 引导跨平台登录:
```sh
"/Applications/Chromium.app/Contents/MacOS/Chromium" \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.news-harvester/chromium-profile" \
--no-first-run --no-default-browser-check &
```bash
# 检测环境与可用浏览器
node scripts/ensure-chromium.js --list
# 启动窗口化浏览器登录(自动用固定 profile,登录态持久化)
node scripts/ensure-chromium.js --login --url https://www.reuters.com/
```
### 1. 克隆并安装依赖
......@@ -292,7 +293,7 @@ claude -p \
└─▶ 更新 registry + index
```
### 添加新 browser 源(3 步闭环:add → inspect --write → verify
### 添加新 browser 源(4 步闭环:add → inspect --write → verify → lock
```bash
# 1. 加入 config(browser 源应配 recipe,articleUrlPattern 是 legacy 专用)
......@@ -303,6 +304,9 @@ node scripts/inspect-source.js https://example.com/ --scroll 3 --write mysrc
# 3. 只读验证
node scripts/harvest.js mysrc 3 --preview
# 4. 锁定回归测试(recipe 稳定后,需 helpers/mysrc.fixtures.json)
node scripts/recipe-test.js mysrc
```
**收敛判定**:preview 通过 = 抓到的链接是真实文章(非 nav/section 页)且 `charCount > 500`。不通过时按症状调 `helpers/mysrc.md`:链接是导航 → 收紧 `urlPattern`;文章太少 → 调大 `scrollSteps`;正文空 → 调 `bodySelectors`。改完重跑 preview。
......@@ -390,19 +394,22 @@ recipe 存放在 `helpers/`(入库共享,跨机器一致),区别于 `con
```
YYYYMMDD/
├── <中文标题>.md # 中文摘要(事件概述/背景/关键引语/影响分析)— finalize.js 生成
├── <英文标题> - <SourceName>原文.md # 英文原文(含配图)— harvest.js 生成,finalize.js 修补中文标题链接
├── index.md # 当日索引(分类统计 + 文章列表 + 分类导航)
├── <英文标题> - <SourceName>原文.md # 英文原文(含配图)— harvest.js 生成,finalize.js 修补中文标题链接 + tags/category
├── index.md # 当日索引(分类统计 + 文章列表[含原文标题列] + 分类导航)
├── registry.json # 去重注册表
├── summary/
│ └── <中文标题>.md # 中文摘要(事件概述/背景/关键引语/影响分析)— finalize.js 生成
├── assets/
│ └── <slug>-N.jpg # 下载的配图
├── .manifest.json # ⏳ 临时:harvest.js 写,finalize.js 消费后删除
└── .summaries.json # ⏳ 临时:Agent 写,finalize.js 消费后删除
```
> harvest → finalize 之间,原文/registry/index 里的中文标题是哨兵占位符 `__SUMMARY_<slug>__`,finalize 完成后替换为真实标题。两个 `.` 开头的临时文件在 finalize 后自动删除。
> 中英文档通过 YAML frontmatter 的 `related` 字段双向 `[[链接]]`(裸标题,Obsidian 按文件名解析,摘要文件虽在 `summary/` 子目录下仍可正常跳转)。
>
> frontmatter 含独立的 `category` 字段(支持 Obsidian Bases/属性筛选)和 `tags`(Agent 从摘要/正文提取的 ≤3 语义关键词)。`date` 存完整 ISO 8601 时间戳(无损,Obsidian 可按任意时区解析),info callout 的发布时间显示上海时区(UTC+8)。
中英文档通过 YAML frontmatter 的 `related` 字段双向 `[[链接]]`
> harvest → finalize 之间,原文/registry/index 里的中文标题是哨兵占位符 `__SUMMARY_<slug>__`,finalize 完成后替换为真实标题。两个 `.` 开头的临时文件在 finalize 后自动删除
---
......@@ -410,7 +417,7 @@ YYYYMMDD/
- **正文提取依赖正则**:网站改版可能导致提取失败(正文 < 100 字会被跳过)
- **中文标题/摘要由 Agent 生成**`harvest.js` 在原文/registry/index 中用哨兵 `__SUMMARY_<slug>__` 占位,`finalize.js` 读取 Agent 写的 `.summaries.json` 后替换为真实标题并生成摘要文档
- **browser 方法自动启动 Chromium**`harvest.js` 在抓取前调用 `ensure-chromium.js`,自动发现并启动浏览器(跨平台:macOS `.app` bundle、Linux PATH、Windows 安装目录),默认 `headless=new`,轮询 `/json/version` 直到就绪。无需手动 `chromium ... &`。若发现失败可在 `config.json``chromium.executablePath` 指定路径;调试用 `node scripts/ensure-chromium.js`(失败时打印二进制路径/端口/stderr 日志尾)。需要登录态的源:设 `chromium.userDataDir` 指向一个登录过的固定 profile,后续自动启动即带 cookie/环境。配置项见 SKILL.md 的 Configuration
- **browser 方法自动启动 Chromium**`harvest.js` 在抓取前调用 `ensure-chromium.js`,自动发现并启动浏览器(跨平台:macOS `.app` bundle、Linux PATH、Windows 安装目录),默认 `headless=new`,轮询 `/json/version` 直到就绪。无需手动 `chromium ... &`。若发现失败可在 `config.json``chromium.executablePath` 指定路径;`node scripts/ensure-chromium.js --list` 检测可用浏览器,`--check` 查端口状态。**需要登录态的源**(订阅/付费墙):用 `node scripts/ensure-chromium.js --login --url <homepage>` 启动窗口化浏览器跨平台登录,登录态保存到固定 profile(`~/.news-harvester/chromium-profile`),后续 headless 抓取自动复用。配置项见 SKILL.md 的 Configuration
- **图片下载无重试**:失败仅跳过
- **Token 卫生**:归档任务为「harvest → 写 .summaries.json → finalize」三步;不要为同一源/日重跑 harvest 仅为"多取几篇"(registry 已去重,二次跑只取真正的新文章并安全合并进待处理 manifest);不要用 Read 反复读原文大文件——manifest 里的 `bodyPreview`(~4000 字)足够写摘要
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment