with one click
with one click
| name | ai-news-daily |
| description | 端到端 pipeline —— 抓 X/知乎/Bilibili AI 相关热门 → 整理成 wiki → 推送飞书日报 |
| allowed-tools | ["Bash","Read","Write","Glob","Grep","Notify"] |
| triggers | ["ai-news","ai-news-daily","每日简报","ai简报","daily digest","日报"] |
| tags | ["pipeline","knowledge","daily","cron-ready"] |
| priority | 8 |
一条命令从抓取到送达。把 browser-scrape、knowledge-compile、Notify 三个技能串成闭环。适合挂 prax cron。
用户说:
或 prax cron 调度到期。
重要 — 不要递归 shell out:你已经被这个 skill 触发了。直接按下面的 Step 1-6 自己执行,不要再 python -m praxdaily run-now / prax prompt "..." / prax cron run 之类把同样的事情又派出去 —— 那会无限递归 + 把 permission-mode 重置回默认。autocli / Bash 命令直接用 Bash 工具跑就行。
先验证:
autocli doctor → 全绿(浏览器抓取依赖).prax/notify.yaml 存在且包含目标通道(默认 daily-digest)——没配就明确告诉用户先配,不要继续抓验证失败:返回一条简要说明即可停止,不要继续。
DATE = 今天的日期(YYYY-MM-DD,按用户本地时区)
VAULT = .prax/vault/ai-news-hub/$DATE
mkdir -p $VAULT $VAULT/raw
读 .prax/notify.yaml 取通道名,绝不硬编码 "daily-digest"。挑选规则(按优先级):
.prax/cron.yaml 里当前 job 的 notify_channel 在 notify.yaml 中存在 → 用它notify.yaml.channels 第一个 wechat_personal 类型的通道notify.yaml.channels 任意第一个通道把选中的 channel 名字记成 CHANNEL,给 Step 5 用。
读 .prax/sources.yaml,若不存在或字段缺失就用 DEFAULTS 兜底。配置完整 schema:
# 每个 source 都是可选 enable / 可改 limit
sources:
- id: twitter # 已知 id:twitter / zhihu / bilibili / hackernews
enabled: true
limit: 50 # autocli 抓取条数(拉得多但下面只过滤前 N 条)
top_n: 10 # 关键词过滤后保留 top N(按平台原生热度)
- id: zhihu
enabled: true
limit: 30
top_n: 10
- id: bilibili
enabled: true
limit: 20
top_n: 5
- id: hackernews
enabled: true
limit: 20
top_n: 10
# 关键词过滤:必须命中 include 之一,且不命中任何 exclude
keywords:
include: [AI, LLM, GPT, Claude, 模型, 智能体, agent, RAG, 推理, 微调, transformer]
exclude: [] # 比如 [广告, 推广] 用来去噪
DEFAULTS = 上面这份完整配置(即 .prax/sources.yaml 不存在时的行为,跟 0.5.4 之前完全一致)。
GUI 用户通常通过 praxdaily Sources 屏写这个文件,命令行用户也可以手写。
遍历配置里 enabled: true 的每个 source(失败的单独记录,不要一错就整批停):
| source id | autocli 命令 | 输出文件 |
|---|---|---|
twitter | autocli twitter timeline --limit <limit> --format json | $VAULT/raw/twitter-$DATE.json |
zhihu | autocli zhihu hot --limit <limit> --format json | $VAULT/raw/zhihu-$DATE.json |
bilibili | autocli bilibili hot --limit <limit> --format json | $VAULT/raw/bilibili-$DATE.json |
hackernews | autocli hackernews top --limit <limit> --format json | $VAULT/raw/hn-$DATE.json |
<limit> 取自配置;如果用户设置了别的 source id 但映射不到 autocli 命令,跳过它并在最终汇报里说明。
从每个抓回来的 json 里:
keywords.include / keywords.exclude(来自 Step 1.5 配置或 DEFAULTS)过滤top_n 条每条存成一个 markdown 文件:
$VAULT/<source>-<id>.md
frontmatter 必备:
---
source: twitter
id: 172xxxx
url: https://x.com/...
author: "..."
metric: "likes=1234"
scraped_at: 2026-04-22T17:00:00+08:00
---
# <原文标题或首句>
<正文,不加编辑加工>
进入 $VAULT 跑 knowledge-compile 流程,产出:
$VAULT/index.md
$VAULT/daily-digest.md
$VAULT/topics/<slug>.md ...
严格按 knowledge-compile 的约定(双链 [[...]]、一屏 digest、3-7 个主题)。
读 $VAULT/daily-digest.md 内容,调 Notify 工具。channel 必须用 Step 1.6 解析出来的 CHANNEL,不要硬编码:
Notify(
channel = CHANNEL, # ← 来自 Step 1.6
title = "AI 日报 · " + DATE,
body = <daily-digest.md 的内容>, # 完整正文,让用户在微信里直接读
level = "info"
)
如果 daily-digest.md 超过 2000 字,按主题截到 2000 字以内 + 末尾加 \n\n— 完整版见 $VAULT/index.md。微信单条消息 4096 字符上限,留余量给标题。
最后回给用户一段:
$VAULT/index.md 路径| 阶段 | 失败表现 | 应对 |
|---|---|---|
| Step 2 某个源 | autocli 超时 / 非零退出 | 跳过这个源,记录在最终汇报里;不整体失败 |
| Step 2 全部失败 | 所有源都挂 | 停止 pipeline,报告用户检查 autocli / Chrome |
| Step 3 AI 过滤后为空 | 今天真没 AI 新闻 | 仍然产出 digest("今日无显著 AI 动态"),正常推送 |
| Step 5 Notify 失败 | webhook 连不上 | 返回失败,但 wiki 已落盘,下次定时会覆盖 |
典型调度:
prax cron add \
--name ai-news-daily \
--schedule "0 17 * * *" \
--prompt "触发 ai-news-daily 技能" \
--session-id cron-ai-news \
--notify-on failure \
--notify-channel <你 notify.yaml 里的通道名>
重要:notify-on 只填 failure,绝不要 success。理由:
notify-on 还包含 success,cron dispatcher 会在 skill 之外额外发一条 dev-speak 状态 ping("job: xxx, schedule: xxx, log: xxx"),用户看不懂还会以为日报跑两遍failure 是兜底:当 skill 整体崩了(连 Step 5 都没跑到),dispatcher 至少能告诉用户"今天没成"Prax 风格的 Git 工作流,强调最小 diff、验证后提交和清晰状态。
Prax 风格的 TDD 工作流,强调 RED → GREEN → VERIFY。
在提交、交付或大型改动后运行 Prax 风格的验证闭环。
用 AutoCLI 二进制驱动用户已登录的 Chrome 抓取 Twitter/X、知乎、Bilibili、Reddit 等 55+ 站点
中文编程优化 — 注释、文档和错误信息使用中文
对比近期代码改动和文档变更,找出"代码改了文档没跟上"的 drift