$ cat post.metadata

Claude Codeをlaunchdで定期実行する——日次コンテンツパイプラインの構築

Claude CodeDevTools

macOSのlaunchdスケジューラでClaude Codeを日次バッチ実行し、情報収集→翻訳→品質チェック→SNS投稿予約の4フェーズパイプラインを自動化する。

$ cat post.content | render --format=markdown

Claude Codeをlaunchdで定期実行する——日次コンテンツパイプラインの構築

やりたいこと

毎朝、以下のパイプラインを人手なしで回す。

  1. 06:00 — RSSフィードとWeb検索で情報を収集し、関心度スコアで絞り込む
  2. 07:00 — 3並列エージェントで日本語・英語・note向け・ニュースレター向けに翻訳
  3. 08:00 — 品質スコアリングと承認ワークフロー
  4. 09:00 — X投稿・note記事の予約登録

Claude Codeの claude -p コマンドを使えば、CLIからプロンプトを投げて結果を受け取れる。これをmacOSのlaunchdで定期実行する。

launchdの設定

macOSのcronに相当するlaunchdで、各フェーズをplistファイルとして登録する。

xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.user.content-pipeline-collect</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>-c</string> <string>/usr/local/bin/claude -p "$(cat ~/.claude/pipelines/collect.md)" > ~/logs/collect-$(date +%Y%m%d).log 2>&amp;1</string> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>6</integer> <key>Minute</key> <integer>0</integer> </dict> <key>StandardErrorPath</key> <string>/tmp/content-pipeline-error.log</string> </dict> </plist>

launchctl load ~/Library/LaunchAgents/com.user.content-pipeline-collect.plist で登録。

フェーズ1:情報収集

収集プロンプトでは、WebSearch MCPを使ってRSSフィードと検索結果を取得し、関心度スコア7.0以上のものだけを抽出する。

markdown
## 収集タスク 1. 以下のRSSフィードから最新記事を取得 - Hacker News Top, TechCrunch, The Verge 2. 各記事を以下の基準でスコアリング(1-10) - AI/LLM関連: +3 - 開発ツール: +2 - SaaS/プロダクト: +2 3. スコア7.0以上を ~/pipeline/collected-{date}.json に出力

フェーズ2:並列翻訳

Agent Teamを使い、3つのエージェントが同時に翻訳を実行する。

  • Agent A: 日本語技術記事(X投稿用、280文字以内)
  • Agent B: 英語要約(ニュースレター用)
  • Agent C: note記事(長文解説、2000-3000文字)

並列実行により、逐次処理の1/3の時間で完了する。

フェーズ3:品質チェック

AI slop(AIっぽい表現)を検出し、自然な文章に修正する。チェック項目:

  • 「〜と言えるでしょう」「〜ではないでしょうか」の排除
  • 過剰な接続詞の削除
  • 具体性のない抽象表現の書き換え

スコアが閾値を下回った場合は修正ループを回す。

フェーズ4:投稿予約

X APIとnote APIを使い、最適な時間帯に投稿を予約する。

  • X: 平日 7:30, 12:00, 18:00 の3枠
  • note: 週2回、火曜・金曜の8:00

認証の管理

非対話的環境でのAPI認証には1Password CLIを使う。

bash
# 1Password CLIでトークンを取得 export ANTHROPIC_API_KEY=$(op read "op://Development/Claude/api-key")

launchdジョブは非対話的に実行されるため、キーチェーンや環境変数ではなく、1Password CLIのサービスアカウント経由でシークレットを注入する。

Slack通知

各フェーズの完了・失敗をSlackに通知する。

bash
curl -X POST "$SLACK_WEBHOOK" \ -H "Content-Type: application/json" \ -d "{\"text\": \"Content Pipeline Phase 1 complete: ${COUNT} articles collected\"}"

運用して気づいたこと

  • claude -p のレスポンスタイムは入力トークン数に依存する。収集フェーズは10-30秒、翻訳フェーズは1-2分
  • launchdジョブが失敗した場合の自動リトライは ThrottleInterval で制御できるが、API課金を考慮して手動確認を挟む方が安全
  • ログファイルは日付ローテーションで管理し、1週間分を保持

cronジョブの延長線でAIパイプラインが組める時代になった。CLIインターフェースさえあれば、既存のUnixツールチェインと組み合わせられる。

$ echo $TAGS
#Claude Code#launchd#自動化#コンテンツパイプライン