ニュースレター ダイジェスト
RSSフィードからコンテンツを集約し、Geminiで今週のトップニュースを要約し、ダイジェストをGhost CMSに公開します。週次ダイジェスト、トピック別まとめ、キュレーションピックの形式に対応しています。
ライティングスタイル
生成されるすべてのダイジェストコンテンツに適用:
- 能動態のみ
- 短い文、一文につき1つのアイデア
- ダッシュ(—)は使用禁止 — 代わりにピリオドまたはカンマを使用
- セミコロンは使用禁止
- 最終的なニュースレター本文ではマークダウンやアスタリスクを使用しない
- ハッシュタグは使用禁止
禁止ワード — ダイジェストで以下の単語を使用しない: 信じられない、素晴らしい、活用する、シナジーを生む、革新的、ゲームチェンジャー、深く掘り下げる、活用する、解き放つ、画期的、最先端、注目すべき、パラダイム、革命を起こす、破壊的、変革をもたらす、興奮している、共有できることを嬉しく思う、パワフル、革新的、包括的、実用的、重要な、不可欠な、極めて重要な、明らかにする、活用する、深く掘り下げる、タペストリー、照らし出す、革命を起こす
重要ルール
ダイジェスト内のすべての主張、統計、要約は、取得した記事に基づいていなければなりません。データ、引用、事実を捏造してはなりません。ソース記事に意味のあるコンテンツがない場合は、スキップしてください。
ステップ 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に保存
特定のフィードでエラーが発生した場合、警告をログに記録して続行します。1つの不良フィードがあっても実行は停止しません。
スクリプト完了後、出力を確認:
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 をすべて読んでください。以下を内部化:
- 3つのダイジェスト形式 (Weekly Roundup, Topic Deep Dive, Curated Picks) とそれぞれの使用条件
- 形式ごとのセクション構成と長さの要件
- 帰属ルール (すべての主張はソースにリンクされる)
- トーンと文体のガイドライン
references/output-template.md を読み、リクエストされた形式に一致するテンプレートを選択します。
ユーザーが形式を指定しなかった場合、デフォルトで Weekly Roundup を使用します。
ステップ 4: Gemini で要約
/tmp/newsletter-digest-articles.json を読み込み、要約プロンプトを構築します。
プロンプト構造:
あなたは今週のトップニュースのダイジェストを書くニュースレター編集者です。
ソース (これのみを使用 — 事実を捏造しない):
[各記事について: タイトル | ソース | 日付 | 要約]
タスク:
以下の構造に従って [FORMAT] ダイジェストを書いてください:
[references/output-template.md から選択したテンプレートを貼り付け]
ルール:
- すべての主張、統計、引用は上記のソースからのみ
- 能動態、短い文、短縮形は許可
- 使用禁止: 信じられない、素晴らしい、活用する、ゲームチェンジャー、深く掘り下げる、画期的、最先端、革命を起こす
- ダッシュなし、セミコロンなし、ハッシュタグなし
- 主要な主張の後には [ソース: 名前](URL) の帰属を含める
- プレーンテキストでHTML見出しタグのみ出力 (マークダウンのアスタリスクなし)
このプロンプトでGeminiを呼び出します。ターゲットモデル: gemini-2.0-flash または最新の利用可能モデル。
応答に禁止ワードやソース記事にない統計が含まれている場合、より厳格なプロンプトで再生成します。
ステップ 5: 自己QA
提示する前にすべてのチェックを実行します。違反があれば修正します。
- すべての主張、統計、引用がソース記事に遡れること
- どのセクションにも禁止ワードがないこと
- テキストにダッシュがないこと
- テキストにセミコロンがないこと
- すべてのセクションに少なくとも1つのソース帰属と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 (ステップ6でエージェントが書き込む) を読み込み、Ghostに投稿します。
投稿後、スクリプトは下書きのGhost管理画面URLを返します。これをユーザーに提示: 「下書きが保存されました: [URL]。Ghostダッシュボードで確認して公開してください。」
ユーザーがすぐに公開したい場合、スクリプトに --status "published" を渡します。
Ghostが設定されていない、またはユーザーが「出力のみ」と言った場合:
ダイジェストを3つの形式で出力:
- HTML — 任意のCMSに貼り付け可能
- Markdown — Substack、Notion、Hashnode向け
- プレーンテキスト — メールクライアント向け
補足: 「Substackは公開APIを提供していません。Markdown版をSubstackエディタに直接コピーしてください。」
Substackに関する注意事項
Substackには公開APIがありません。内部エンドポイントをリバースエンジニアリングしない限りプログラムによる投稿は不可能であり、利用規約に違反します。このスキルは、Substackエディタに貼り付ける準備ができたフォーマット済みMarkdownダイジェストを出力します。これが正しいアプローチです。