電子報摘要
從 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": "來源名稱" },
{ "url": "https://another.com/rss", "name": "另一個來源" }
]
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('文章總數:', data.articles.length);
console.log('來自摘要:', data.feedsSummary.map(f => f.name + ': ' + f.count).join(', '));
console.log('日期範圍:', data.dateRange.from, '至', data.dateRange.to);
"
如果找到的文章少於 3 篇,請警告使用者,並詢問是否要將日期範圍延長至 14 天。傳遞 --days=14 參數給腳本以擴大視窗。
步驟 3:閱讀格式規則
在生成任何內容之前,請完整閱讀 references/digest-format.md。內化以下規則:
- 三種摘要格式(每週摘要、主題深度探討、精選推薦)及其使用時機
- 每種格式的章節結構和篇幅要求
- 歸因規則(每一項主張都需連結到來源)
- 語調和語氣指南
閱讀 references/output-template.md 並選擇與請求格式相符的範本。
如果使用者未指定格式,預設為「每週摘要」。
步驟 4:使用 Gemini 進行合成
讀取 /tmp/newsletter-digest-articles.json 並建立一個合成提示。
提示結構:
你是一位電子報編輯,正在撰寫本週頭條新聞的摘要。
來源(僅使用這些 — 請勿捏造事實):
[針對每篇文章:標題 | 來源 | 日期 | 摘要]
任務:
撰寫一份 [格式] 摘要,遵循以下結構:
[貼上參考文獻/output-template.md 中的選定範本]
規則:
- 每一項陳述、統計數據和引用都必須來自上述來源
- 使用主動語態、短句、允許縮寫
- 請勿使用:incredible, amazing, leveraging, game-changing, delve, groundbreaking, cutting-edge, revolutionize
- 不要使用破折號、不要使用分號、不要使用主題標籤
- 在每個主要陳述之後加上 [來源:名稱](URL) 歸因
- 輸出純文字,僅使用 HTML 標題標籤(不要使用 markdown 星號)
使用此提示調用 Gemini。目標模型:gemini-2.0-flash 或最新的可用模型。
如果回應中包含任何禁用詞彙或來源文章中未出現的捏造統計數據,請使用更嚴格的提示重新生成。
步驟 5:自我品質檢查
在呈現之前執行每一項檢查。先修正違規事項。
- 每一項陳述、統計數據和引用都可追溯到來源文章
- 任何章節中都沒有禁用詞彙
- 文字中沒有破折號
- 文字中沒有分號
- 每個章節至少有一個包含 URL 的來源歸因
- 字數在目標格式的範圍內(參見 references/digest-format.md)
- 沒有章節重複相同的故事
- 標題是具體的(包含日期範圍或期號,而不僅僅是「每週摘要」)
- 如果發佈到 Ghost,HTML 輸出必須有效(沒有未閉合的標籤)
在呈現給使用者之前,修正所有違規事項。
步驟 6:格式化與預覽
按以下順序向使用者呈現摘要:
- 標題 — 期號日期範圍或主題
- 摘要內容 — 完整的格式化文字
- 來源清單 — 所有使用的文章及其 URL
- 字數和文章數量
詢問:「準備好以草稿形式發佈到 Ghost,還是您想先編輯?」
步驟 7:發佈到 Ghost 或輸出
如果已設定 GHOST_URL 和 GHOST_ADMIN_KEY 且使用者確認:
執行發佈腳本:
node /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/ghost-publish.js \
--title "摘要標題" \
--status "draft"
該腳本會讀取 /tmp/newsletter-digest-output.json(由代理程式在步驟 6 中寫入)並發佈到 Ghost。
發佈後,腳本會回傳草稿的 Ghost 管理員 URL。將此資訊呈現給使用者:「草稿已儲存於:[URL]。請從您的 Ghost 儀表板檢閱並發佈。」
如果使用者想立即發佈,請傳遞 --status "published" 參數給腳本。
如果未設定 Ghost 或使用者表示「僅輸出」:
以三種格式輸出摘要:
- HTML — 可直接貼入任何 CMS
- Markdown — 適用於 Substack、Notion 或 Hashnode
- 純文字 — 適用於電子郵件用戶端
補充說明:「Substack 不提供公開 API。請將 Markdown 版本直接複製到您的 Substack 編輯器中。」
關於 Substack 的注意事項
Substack 沒有公開 API。如果沒有逆向工程其內部端點(這違反其服務條款),就無法以程式化方式發佈。該技能會輸出格式化的 Markdown 摘要,準備好讓您貼入 Substack 編輯器。這是正確的做法。