| name | daily-brief |
| description | AutoPM built-in daily intelligence brief for high-signal web, market, KOL, GitHub Trending, venture, startup, and product insights. Use when the user types /daily-brief or asks to "run the daily brief", "produce today's intelligence summary", "scan news for today", "做个 daily brief", or describes wanting today's curated brief. |
AutoPM Daily Brief Protocol
This skill is package-owned under resources/skills/daily-brief/ inside the installed AutoPM package.
Bundled helpers are resolved relative to this skill folder, not the user's current working directory: scripts/rss_digest.py, scripts/run_last30days.sh, scripts/submit_brief.sh, and vendor/last30days/scripts/last30days.py.
Before any shell block that calls a bundled helper, resolve the skill folder:
DAILY_BRIEF_SKILL_DIR="${DAILY_BRIEF_SKILL_DIR:-}"
if [ -z "$DAILY_BRIEF_SKILL_DIR" ]; then
for candidate in \
"$PWD/resources/skills/daily-brief" \
"$PWD/node_modules/@jacfrost/autopm/resources/skills/daily-brief" \
"$(npm root -g 2>/dev/null)/@jacfrost/autopm/resources/skills/daily-brief"; do
[ -f "$candidate/SKILL.md" ] || continue
DAILY_BRIEF_SKILL_DIR="$(cd "$candidate" && pwd)"
break
done
fi
[ -f "$DAILY_BRIEF_SKILL_DIR/SKILL.md" ] || { echo "ERROR: daily-brief skill folder not found; set DAILY_BRIEF_SKILL_DIR to the folder containing SKILL.md" >&2; exit 2; }
If the host shows the loaded skill path, set DAILY_BRIEF_SKILL_DIR directly to that daily-brief folder. Do not cd into the skill folder; run from the project root so .autopm/ state stays in the current workspace.
You are running the product management daily intelligence brief. Two phases: research the product and the world (Phase 1), then archive today's brief locally (Phase 2). Stages below execute in strict order.
Objective: 产出高质量、可执行的每日情报简报,并保存在本地归档目录。
KOL list(手动编辑此处增减;Phase 1 第 3 个 bucket 引用此名单 如果没有或者你认为需要更新,根据产品context增加高质量KOL信息源):
1) Hard Rules (抗过时/抗硬编码)
- 所有时间窗口都基于 today 动态计算(每个 bash 块里就地
$(date +%Y-%m-%d),不要跨 bash 块传递 shell 变量 —— Claude Code 每次 Bash 工具调用都是独立 subshell,赋值不会持续)。
- 选题优先级必须来自当前 context,不使用历史默认主题填充。
- 若某条信息已过期或已闭环,不要继续写入当日重点。
- 优先引用近 72 小时来源;若引用更早内容,标注其为背景信息。
2) Context Loading (先读再写)
读取最近 3 份历史简报,抽出已用过的 URL 作为黑名单:
mkdir -p ".autopm/briefings"
RECENT=$(ls -t .autopm/briefings/*.md 2>/dev/null | head -n3)
[ -n "$RECENT" ] && grep -hoP 'https?://[^\s\)]+' $RECENT | sort -u > /tmp/daily-brief.url-blacklist || : > /tmp/daily-brief.url-blacklist
echo "blacklist size: $(wc -l < /tmp/daily-brief.url-blacklist)"
然后用 Read 工具把 /tmp/daily-brief.url-blacklist 装进 context;Phase 1 引用前先比对,已出现过的 URL 跳过。
重跑保护:执行下面这一行检查今天的简报是否已存在:
TODAY_FILE=".autopm/briefings/$(date +%Y-%m-%d).md"
[ -s "$TODAY_FILE" ] && { echo "=== existing brief: $TODAY_FILE ==="; head -n10 "$TODAY_FILE"; } || echo "no brief yet"
如果已存在,问用户三选一,根据回答分支:
- "查看现有简报" → 打开
$TODAY_FILE 给用户看,确认后 halt。
- "备份后重跑" → 跑
F=".autopm/briefings/$(date +%Y-%m-%d).md"; cp "$F" "${F}.bak-$(date +%H%M%S)"(自包含一行,新 subshell 也能跑),备份后继续 Phase 1。
- "重跑覆盖" → 跑
F=".autopm/briefings/$(date +%Y-%m-%d).md"; cp "$F" "${F}.bak-$(date +%H%M%S)"(自包含一行,新 subshell 也能跑),备份后继续 Phase 1。
- "取消" → halt。
不存在就直接进 Phase 1。
3) Phase 1: Deep Research → Full Brief
3.0 RSS Radar(先跑,拓宽信息源)
先运行 RSS discovery,把它当作候选源雷达,不是自动写入简报的正文生成器:
mkdir -p /tmp/daily-brief
DAILY_BRIEF_SKILL_DIR="${DAILY_BRIEF_SKILL_DIR:-}"
if [ -z "$DAILY_BRIEF_SKILL_DIR" ]; then
for candidate in "$PWD/resources/skills/daily-brief" "$PWD/node_modules/@jacfrost/autopm/resources/skills/daily-brief" "$(npm root -g 2>/dev/null)/@jacfrost/autopm/resources/skills/daily-brief"; do
[ -f "$candidate/SKILL.md" ] || continue
DAILY_BRIEF_SKILL_DIR="$(cd "$candidate" && pwd)"
break
done
fi
[ -f "$DAILY_BRIEF_SKILL_DIR/SKILL.md" ] || { echo "ERROR: daily-brief skill folder not found; set DAILY_BRIEF_SKILL_DIR" >&2; exit 2; }
PYTHONDONTWRITEBYTECODE=1 python3 "$DAILY_BRIEF_SKILL_DIR/scripts/rss_digest.py" \
--blacklist /tmp/daily-brief.url-blacklist \
--output /tmp/daily-brief/rss-radar.md \
--json-output /tmp/daily-brief/rss-radar.json \
--max-age-hours 96 \
--limit 50
以下命令默认在当前工作区的 .autopm/ 写入状态。
RSS 流程借鉴 rss-ai-reader 的“抓取 feed → 去重 → 摘要候选”思路,但明确删除推送/通知环节:rss_digest.py 只输出本地 markdown/json,供本次 brief 筛选与引用。最终只做本地完成检查。
RSS weight / 筛选规则
$DAILY_BRIEF_SKILL_DIR/assets/rss-feeds.json 是默认 feed registry;可用 .autopm/daily-brief-rss-feeds.json 追加个人 feed、关键词和权重,不要直接删默认 registry。
- 大型 newsletter feed 可在 registry 中设置
timeout_seconds / max_download_bytes 做特殊处理;当前 Not Boring 与 The Generalist 已单独加长 timeout,避免默认抓取窗口下误判失败。
- 每条候选都有
weight:base_weight + freshness + priority_keyword_hits - downrank_keyword_hits。
- 只纳入 weight ≥ 6 且与 本产品相关的条目;高分但无行动价值的也可以丢弃。
- 优先级解释:
base_weight:来源可信度/与本产品方向相关度。
freshness:≤24h 加分最高,≤48/72h 次之;超过 96h 默认不进入候选。
priority_keywords:与产品高度相关的词条。
downrank_keywords:sponsored、giveaway、weekly links、纯融资新闻等降权。
- 创业/前沿方向优先看这些 category:
startup-frontier、startup-products、startup-product-gtm、startup-strategy、market-maps、venture-thesis。目标是捕捉“新需求/新分发/新类别/新创业 wedge”,不是泛泛记录融资新闻。
- TL;DR 和主 section 不得被 devtools 来源淹没:除非本产品当天任务明确是纯开发者工具,否则 HN/GitHub/Simon/arXiv/devtools 更新最多占 2 条最高信号;有证据时必须给 consumer/prosumer personal agent 与创投/资本信号预留位置。
- Consumer/prosumer personal agent 必须主动覆盖:Notion、ChatGPT、Gemini、Perplexity、Granola、Rewind/Limitless、Lindy、Manus、Genspark、Claude Projects/Artifacts、Apple/Google/Microsoft productivity AI,以及会议记录、个人知识管理、second brain、file search/retrieval、long-running task delivery、personal memory privacy、desktop app、Chrome Web Store、App Store/Mac App Store/Google Play 等采用或痛点信号。
- 创投信息源分三层使用,避免把低价值、重复或不可稳定抓取的源塞满 brief:
- 默认 RSS radar(每日扫):YC Blog、Product Hunt、TechCrunch Startups、Sifted、CB Insights Research、Sequoia、a16z/Future、Lightspeed、StrictlyVC、Fortune Term Sheet、ARK Invest、The Generalist、Contrary Research、SaaStr、LatePost。只写“新类别、新需求、新分发、新价格/商业模式、新技术平台迁移、新监管/资本约束”。
- 定向检索/周期复核(不做默认 RSS 噪音源):SVB State of the Markets、Carta Data Desk、NVCA Yearbook、PitchBook public reports、Dealroom ecosystem pages、YC batch/Demo Day/RFS、SEC EDGAR、S-1/F-1/10-K/10-Q/8-K、NASDAQ/NYSE/HKEX/SSE/SZSE/BSE/北交所文件、公募公司 IR/earnings/investor presentation、Quartr public materials、IPO Action、36氪研究院、IT桔子、投中、清科、Rime/烯牛、证监会公告、中国招股书。只有当它们命中 产品相关主题,或出现重要市场拐点时才进 brief。
- 辅助验证源(不单独成条):Crunchbase free pages、company websites、pricing pages、changelogs、docs/API docs、hiring pages、App Store/Google Play/Chrome Web Store/marketplace listings、patent databases、customer case studies、public job posts。用于验证公司状态、定价、招聘方向、分发渠道或产品采用,不作为“创投趋势”单独播报。
3.1 last30days Deep Signal
RSS Radar 之后,调用 last30days 做 30 天窗口的社区/社媒/开发者语境挖掘。它和 RSS 分工不同:
- RSS:发现最近 24-96h 的新材料和长尾 feed。
- last30days:使用本 skill 内置的
vendor/last30days/ runtime,补足过去 30 天内 HN/GitHub/X/视频/市场等信号、反复出现的痛点、KOL/用户原话、创业方向的持续热度。
AutoPM daily-brief 对 vendored last30days 采用 host-agent planning:你必须先生成 JSON query plan 并用 --plan "$QUERY_PLAN_FILE" 传给 wrapper。Wrapper 会强制 LAST30DAYS_REASONING_PROVIDER=local,所以 vendored engine 不会自己调用内部 LLM planner/reranker;推理和计划由当前 agent 负责。Wrapper 也默认排除 Reddit public JSON source,避免未认证 reddit.com/search.json 403 噪音。
若需要 X/Twitter 推文级信号,提醒用户在 last30days 配置里提供可用 XAI_API_KEY(~/.config/last30days/.env 或当前环境变量)。没有可用 XAI key 时,X/Twitter section 应标注数据暂缺或使用普通 web search 退化验证。
严格串行运行,不要并发:
DAILY_BRIEF_SKILL_DIR="${DAILY_BRIEF_SKILL_DIR:-}"
if [ -z "$DAILY_BRIEF_SKILL_DIR" ]; then
for candidate in "$PWD/resources/skills/daily-brief" "$PWD/node_modules/@jacfrost/autopm/resources/skills/daily-brief" "$(npm root -g 2>/dev/null)/@jacfrost/autopm/resources/skills/daily-brief"; do
[ -f "$candidate/SKILL.md" ] || continue
DAILY_BRIEF_SKILL_DIR="$(cd "$candidate" && pwd)"
break
done
fi
[ -f "$DAILY_BRIEF_SKILL_DIR/SKILL.md" ] || { echo "ERROR: daily-brief skill folder not found; set DAILY_BRIEF_SKILL_DIR" >&2; exit 2; }
write_daily_brief_plan() {
local topic="$1"
local plan_file="$2"
python3 - "$topic" "$plan_file" <<'PY'
import json, sys
topic, plan_file = sys.argv[1], sys.argv[2]
plan = {
"intent": "product",
"freshness_mode": "balanced_recent",
"cluster_mode": "none",
"subqueries": [{
: ,
: topic,
: f,
: [, , , , , ],
: 1.0,
}],
}
open(plan_file, , encoding=).write(json.dumps(plan, ensure_ascii=False))
PY
}
() {
topic=
slug=
QUERY_PLAN_FILE
QUERY_PLAN_FILE=
write_daily_brief_plan
bash \
\
\
--plan
}
run_planned_last30days product-core-workflow
run_planned_last30days consumer-personal-agent
run_planned_last30days competitor-prosumer-ai
run_planned_last30days venture-personal-agent
每条命令 stdout 只返回一个 research file path,例如:
.autopm/daily-brief-last30days/YYYY-MM-DD-ai-agents-devtools.md
把这些文件读入 context 后再写简报。使用规则:
- 每个 last30days 文件最多提炼 2-4 个高信号主题;宁缺毋滥。
- 优先引用“真实用户/开发者/KOL 的重复痛点、强烈反对意见、未满足需求、正在形成的新类别”。
- 对 consumer/prosumer personal-agent 查询,必须提炼知识整理、文件检索、会议/笔记工作流、长任务交付、个人记忆隐私、跨应用/桌面操作、Chrome extension/App Store 采用等信号;不要只写模型能力、API 或 devtools 讨论。
- 不要把 last30days 输出整段复制进 brief;必须压缩为判断。
- 如果 X/Twitter 不可用,不要伪造 KOL 信号;标注
> 数据暂缺(XAI_API_KEY 未配置或 X API 403),然后继续其他 bucket。
- 若内置 last30days 失败,fallback:调用 slash command
/last30days <TOPIC>(如果当前宿主环境提供该 slash command),再把 ~/.local/share/last30days/out/last30days.context.md 复制到对应 .autopm/daily-brief-last30days/YYYY-MM-DD-<slug>.md。fallback 也失败时,在 30-day Deep Signals section 写 > 数据暂缺(last30days 失败:原因),继续其他 bucket,不要中断整个 daily brief。
Research skeleton
Content freshness rules
- 禁止引用
/tmp/daily-brief.url-blacklist 里的 URL(历史简报已经写过的)。
- 无新信号不播报:项目在过去 48 小时内没有具体、实质性的新消息(新代码提交、新提案、新重大讨论),严禁在简报中提及。
- 严禁复读背景:不要为填充篇幅而重复已知的技术定义或战略定位。
- 项目关键词不得绑架搜索:优先搜行业广度信号,而非死磕固定项目关键词。
- 每条引用必须附发布日期(格式:
[来源](url) (YYYY-MM-DD))。
Writing constraints
- 专业、直接、可执行
- 每条关键判断带来源链接 + 发布日期
- 目标是"高信号 + 可行动",不是堆砌素材
- 完成后做"质量自查":是否有重复 URL、是否有旧闻复读、是否有项目无新信号还硬写
Output template (固定结构)
把简报写到 .autopm/briefings/$(date +%Y-%m-%d).md,严格使用以下骨架 —— 每个 bucket 一个 ## section;某 bucket 数据暂缺就在该 section 下写一行 > 数据暂缺(原因),不要删除整段 section(保持每日简报形态可比较、可 diff、可归档):
# [AUTO-PM-DAILY-BRIEF] YYYY-MM-DD
## TL;DR
3-5 行,每行一个最高信号判断 + 来源链接(YYYY-MM-DD)。
## 0. 30-day Deep Signals(last30days)
- **<主题/痛点>** — <过去 30 天的重复信号;为何对 本产品重要>。[来源](url) (YYYY-MM-DD)
- ...
## 1. Hacker News 顶流
- **<标题>** — <一句话信号判断>。[来源](url) (YYYY-MM-DD)
- ...
## 2. 产品行业 更新
- **<事件/发布>** — <信号判断>。[来源](url) (YYYY-MM-DD)
- ...
## 2.5 Consumer / Prosumer Personal Agent Signals
- **<用户痛点/采用信号/竞品变化>** — <来自竞品、creator、App Store/Chrome Web Store、社区或 last30days 的证据;说明对 personal agent / second brain / productivity 的意义>。[来源](url) (YYYY-MM-DD)
- ...
## 3. KOL 信号
- **<KOL 名>** — <推文/发布要点>。[来源](url) (YYYY-MM-DD)
- ...
## 4. 创投 / 资本市场信号
- **<资本/市场信号>** — <来自报告、交易、IPO/招股书、IR/财报、投资人研究或公开榜单的可行动判断;为什么影响 产品方向>。[来源](url) (YYYY-MM-DD)
- ...
## 5. RSS Radar / 创业前沿概念
- **<概念/方向>** — <触发信号;为什么现在;本产品可验证/利用的 wedge>。[来源](url) (YYYY-MM-DD)
- ...
## 6. GitHub Trending
- (今日 + stars)— <只允许来自 且已确认 daily star delta 的 repo;与 产品方向的关联判断>。[]()
...
[ ] 与最近 3 份简报无重复 URL(对照 )
[ ] 每条引用都带发布日期
[ ] 已读取 RSS Radar 与 last30days 输出;若缺失已在对应 section 标注原因
[ ] Consumer/prosumer section 已检查 Notion/ChatGPT/Gemini/Perplexity/Granola/Rewind-Limitless/Lindy/Manus/Genspark、App Store/Chrome Web Store、知识整理/文件检索/记忆隐私/长任务交付痛点
[ ] 创投 section 已尝试覆盖 market map/thesis、market data/filing、China-side AI agent/个人生产力动态;缺失项已明示
[ ] 无 48h 内无新信号的项目
[ ] 没有复读背景定义
第一行必须是 # [AUTO-PM-DAILY-BRIEF] $(date +%Y-%m-%d) —— 归档时人眼能直接对应标题。
4 Pipeline summary
Section 2(含重跑保护 + 黑名单)→ Section 3(写盘)→ Section 4(本地完成检查)。把 submit_brief.sh 的输出(日期、标题、文件路径、字节数)逐字回显给用户。
Failure modes
- bundled last30days missing → 该 skill 包不完整;确认
$DAILY_BRIEF_SKILL_DIR/vendor/last30days/scripts/last30days.py 和 $DAILY_BRIEF_SKILL_DIR/vendor/last30days/scripts/lib/ 随包一起存在,然后重跑对应 bucket。
- Python 3.12+ missing → 安装 Python 3.12+,或设置
PYTHON=/path/to/python3.12 后重跑对应 bucket。
Completion behavior
- 标题:
[AUTO-PM-DAILY-BRIEF] <YYYY-MM-DD>,不可变。
- 正文:当日简报全文保存在本地归档目录。
bash "$DAILY_BRIEF_SKILL_DIR/scripts/submit_brief.sh" 只做本地存在性检查并回显路径;不执行网络请求。