关于 newsletter-digest
newsletter-digest 可将 RSS 文章整理为每周或主题类简报,并使用 Gemini 进行综合。配置 Ghost CMS 后可发布内容,否则可生成格式化稿件。
主要功能
- 01获取并去重 RSS 文章
- 02按日期范围筛选文章
- 03使用 Gemini 综合简报
- 04生成每周、主题或精选格式
- 05向 Ghost CMS 发布草稿或文章
适用场景
- 01根据已配置的订阅源制作每周汇总
- 02制作聚焦特定主题的简报
- 03未配置 Ghost 时生成简报稿件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill newsletter-digest安装后在 Claude Code 中输入/newsletter-digest确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.env.examplefeeds.jsonpackage.jsonREADME.mdevals/evals.jsonreferences/digest-format.mdoutput-template.mdscripts/fetch-feeds.jsghost-publish.js详细介绍
新闻简报
汇总 RSS 订阅源的内容,使用 Gemini 综合本周热门报道,并发布到 Ghost CMS。支持每周简报、主题精选和编辑推荐格式。
写作风格
所有生成的简报内容都应遵循以下要求:
- 只使用主动语态
- 句子简短,每句只表达一个意思
- 不使用破折号,改用句号或逗号
- 不使用分号
- 最终简报正文中不使用 Markdown 或星号
- 不使用话题标签
禁用词语 — 简报中不得使用以下任何词语: incredible, amazing, leveraging, synergize, game-changing, game changer, delve, harness, unlock, groundbreaking, cutting-edge, remarkable, paradigm, revolutionize, disruptive, transformative, thrilled, excited to share, powerful, innovative, comprehensive, actionable, crucial, vital, pivotal, elucidate, utilize, dive deep, tapestry, illuminate, revolutionize
重要规则
简报中的每项说法、统计数据和总结都必须来自抓取到的文章。绝不捏造数据、引言或事实。如果来源文章没有有意义的内容,请跳过。
步骤 1:检查设置
1a. 确认已配置订阅源
检查技能目录中是否存在 feeds.json:
ls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/feeds.json 2>/dev/null
如果不存在,请询问用户:“你想让我监控哪些 RSS 订阅源?请提供 URL 列表,我会创建 feeds.json。”
格式如下:
[
{ "url": "https://example.com/feed", "name": "Source Name" },
{ "url": "https://another.com/rss", "name": "Another Source" }
]
1b. 确认必需的环境变量
检查是否已设置以下变量:
GEMINI_API_KEY(必需):用于内容综合GHOST_URL和GHOST_ADMIN_KEY(发布到 Ghost 时必需,仅输出时可选)
如果缺少 GEMINI_API_KEY,请停止并要求用户设置该变量。
GHOST 配置为可选项。如果未设置,技能会输出格式化的 Markdown,而不会发布内容。
1c. 确认脚本依赖
ls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/node_modules 2>/dev/null | head -1
如果缺少依赖:
cd /Users/ksd/Desktop/Varnan_skills/newsletter-digest && npm install
步骤 2:抓取和解析订阅源
运行抓取脚本:
node /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/fetch-feeds.js
脚本将:
- 从
feeds.json读取订阅源列表 - 使用
rss-parser抓取每个订阅源 - 筛选过去 7 天内发布的条目
- 按 URL 去重
- 按发布日期排序,最新的排在最前
- 将结果保存到
/tmp/newsletter-digest-articles.json
如果脚本在某个特定订阅源上出错,会记录警告并继续运行。单个订阅源出错不会中断运行。
脚本完成后,验证输出:
node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('/tmp/newsletter-digest-articles.json', 'utf8'));
console.log('Total articles:', data.articles.length);
console.log('From feeds:', data.feedsSummary.map(f => f.name + ': ' + f.count).join(', '));
console.log('Date range:', data.dateRange.from, 'to', data.dateRange.to);
"
如果找到的文章少于 3 篇,请警告用户,并询问是否将日期范围延长至 14 天。向脚本传入 --days=14 可扩大时间范围。
步骤 3:阅读格式规则
生成任何内容之前,请完整阅读 references/digest-format.md。熟悉以下内容:
- 三种简报格式(每周综述、主题深入探讨、编辑推荐)及各自的适用场景
- 各格式的章节结构和长度要求
- 署名规则(每项说法都必须链接到来源)
- 语气和文风指南
阅读 references/output-template.md,并选择与所需格式对应的模板。
如果用户没有指定格式,默认使用每周综述。
步骤 4:使用 Gemini 综合内容
读取 /tmp/newsletter-digest-articles.json 并构建综合提示词。
提示词结构:
You are a newsletter editor writing a digest of this week's top stories.
Sources (use ONLY these — do not invent facts):
[For each article: Title | Source | Date | Summary]
Task:
Write a [FORMAT] digest following this structure:
[Paste the selected template from references/output-template.md]
Rules:
- Every claim, statistic, and quote must come from the sources above
- Write in active voice, short sentences, contractions allowed
- Do not use: incredible, amazing, leveraging, game-changing, delve, groundbreaking, cutting-edge, revolutionize
- No em dashes, no semicolons, no hashtags
- Include [Source: Name](URL) attribution after each major claim
- Output plain text with HTML heading tags only (no markdown asterisks)
使用此提示词调用 Gemini。目标模型:gemini-2.0-flash 或最新可用模型。
如果响应中包含任何禁用词语,或出现来源文章中没有的虚构统计数据,请使用更严格的提示词重新生成。
步骤 5:自我检查
提交前运行所有检查。先修复违规项。
- 每项陈述、统计数据和引述均可追溯到来源文章
- 所有部分均不含禁用词
- 文本中不含破折号
- 文本中不含分号
- 每个部分至少有一个附带 URL 的来源标注
- 字数在格式的目标范围内(参见 references/digest-format.md)
- 各部分没有重复讲述同一则新闻
- 标题具体明确(包含日期范围或期号,而不只是“每周摘要”)
- HTML 输出有效(如果发布到 Ghost,不得有未闭合的标签)
向用户提交前修复所有违规项。
步骤 6:排版和预览
按以下顺序向用户呈现摘要:
- 标题 — 期号日期范围或主题
- 摘要内容 — 完整排版后的文本
- 来源列表 — 使用过的所有文章及其 URL
- 字数和文章数
询问:“准备好以草稿形式发布到 Ghost,还是想先编辑?”
步骤 7:发布到 Ghost 或输出
如果已设置 GHOST_URL 和 GHOST_ADMIN_KEY,且用户确认:
运行发布脚本:
node /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/ghost-publish.js \
--title "DIGEST_TITLE" \
--status "draft"
脚本会读取 /tmp/newsletter-digest-output.json(由 Agent 在步骤 6 中写入),并发布到 Ghost。
发布后,脚本会返回草稿的 Ghost 管理员 URL。向用户显示:“草稿已保存至:[URL]。请前往 Ghost 控制面板审核并发布。”
如果用户希望立即发布,将 --status "published" 传递给脚本。
如果未配置 Ghost 或用户表示“仅输出”:
以三种格式输出摘要:
- HTML — 可直接粘贴到任何 CMS
- Markdown — 适用于 Substack、Notion 或 Hashnode
- 纯文本 — 适用于电子邮件客户端
补充:“Substack 不提供公开 API。请将 Markdown 版本直接复制到 Substack 编辑器中。”
关于 Substack 的说明
Substack 没有公开 API。未经逆向工程分析内部端点,无法通过程序发布内容,而这违反其条款。此技能会输出排版好的 Markdown 摘要,可直接粘贴到 Substack 编辑器中。这是正确的做法。