ホーム / 全スキル / コンテンツ制作 / ralph-wiggum-marketer
コンテンツ制作 · muratcankoylan/ralph-wiggum-marketer

ralph-wiggum-marketer

Use this skill when the user asks to "analyze my content", "learn my writing style", "research competitors", "find content angles", "improve my blog", "write like me", "embody my brand voice", or mentions content strategy, voice analysis, competitive research, or iterative content improvement.

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行依存関係インストールネットワーク通信ファイル書き込みDual-pass Audit
Author muratcankoylanGitHub muratcankoylan/ralph-wiggum-marketer ↗Stars 775License MIT(仓库内无 LICENSE 文件,仅 README 末节 '## License / MIT' 与 package.json、.claude-plugin/plugin.json、marketplace.json 的 "license": "MIT" 声明;GitHub API license=null,与此一致)Commit 4c1f5f3bdf
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

Stop hook は SKILL テキストではなく、ループを駆動する真のエンジンです。プラグインは matcher "*" で Claude Code の Stop イベントを登録し、コマンドはプラグイン内の stop-hook.sh(timeout 30s)を指定します。エージェントがターンを終了しようとするたびにホストがこのスクリプトを実行し、スクリプトは stdout の JSON で完了を許可するか次ラウンドへ引き戻すかを決定します——「止まらない動作」はホスト hook プロトコルによって実現されています。

hooks/hooks.json
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh",
ここでの処理内容:すべての停止アクションに stop-hook.sh をフック。介入ポイントはタイマーではなく、エージェントが能動的にターンを終了しようとした瞬間です。状態ファイルがなければ exit 0(正常通過)、存在する場合のみ停止をブロックして再注入します。

ループ状態はプロジェクト内の .claude/ralph-marketer-loop.local.md に保存されます。YAML frontmatter が iteration / max_iterations / completion_promise を保持し、スクリプトは grep+sed で読み取って iteration をインクリメントします(BSD の sed -i '' を試行後、GNU sed -i へフォールバック)。状態ファイルが存在しない場合はアクティブなループなしとみなされ、そのまま通過します。

hooks/stop-hook.sh
if [ ! -f "$LOOP_STATE_FILE" ]; then
解析パイプライン:grep -E "^iteration:" | sed 's/iteration: *//' | tr -d ' '。毎ターン iteration フィールドをインプレースで書き換えます。これはループを最も手軽にキャンセルできる仕組みでもあります(ファイルを削除するだけ)。

終了条件には3重のセーフティネットがあります:① 直前のアシスタントメッセージ(jq で stdin の .transcript[-1].content を読み取り)が <promise>COMPLETION_PROMISE</promise> に一致 → 状態ファイルを削除して {"decision":"allow"} を返却;② NEXT_ITERATION が max_iterations を超えた場合も同様にファイルを削除して通過;③ iteration フィールドが数値でない場合は状態ファイルの破損と判定し、警告を出力・削除・通過させて、異常な状態によるセッションの永久ロックを防ぎます。

hooks/stop-hook.sh
"decision": "allow", "message": "Ralph loop completed successfully!"
3つの出口すべてで rm -f "$LOOP_STATE_FILE" が伴います。max_iterations が不正な場合は MAX_ITERATIONS=999999 にフォールバックし、実質的な上限なしとして動作します。

終了しない場合、スクリプトは構築した SYSTEM_MSG を {"decision": "block", "message": "$SYSTEM_MSG"} として出力します。ホストはこれを受けて停止を拒否し、message を次ラウンドの入力として注入します。メッセージには第 N ラウンド/全 M ラウンドである旨、「同一タスクが再投入され、前ラウンドの成果はファイルと git 履歴にある」というプロンプト、prd.json と progress.txt のパス、完了シグナルのフォーマットが記載されます。

hooks/stop-hook.sh
"decision": "block",
再注入コンテンツ = 固定ヘッダー(ラウンド数 + プロンプト + 完了シグナル) + 状態ファイルの frontmatter 以降からそのまま抽出した PROMPT(sed -n '/^---$/,/^---$/!p')。PROMPT が空の場合は cat scripts/ralph/prompt.md にフォールバックし、さらに1行のデフォルトテキストへと縮退します。

状態と素材は SQLite(./data/content.db)に永続化されます:init.js が mkdirSync(dirname(DB_PATH), { recursive: true }) を実行し、foreign_keys を有効化してから、DISCOVER/LEARN/RESEARCH/IDEATE/WRITE-CRITIQUE-ITERATE-PUBLISH の全プロセスをカバーする14のテーブル(founder_content、competitor_content、trends、research、communications、voice_profile、content_patterns、research_briefs、content_ideas、content_plan、drafts、critique_results、published、agent_log)を作成。状態フィールドには CHECK 制約を用いてパイプラインの状態遷移マシンをスキーマに直接組み込んでいます。

scripts/src/db/init.js
status TEXT DEFAULT 'planned' CHECK(status IN ('planned', 'researching', 'writing', 'critiquing', 'iterating', 'review', 'published', 'cancelled')),
content_plan.status の enum は README の PLANNED→…→PUBLISHED パイプラインそのものです。drafts は version/critique_passed/voice_match_score/uniqueness_score を保持し、critique_results は7項目の品質チェックリストをブール値カラム化することで、「合格基準を満たすまでの反復」を照会・再開・監査可能にしています。

seed.js により、プロジェクトは即座に入力データを持った状態で開始できます:各テーブルを DELETE FROM でクリアした後、サンプルの創業者コンテンツ、1件の voice DNA(トーン/文構造/口癖/回避パターン)、競合のギャップ、トレンド、リサーチ、社内広報、パターンを注入し、最後に agent_log へ 'database_seeded' を記録します——これらはすべてパイプラインを立ち上げるための架空のサンプル(example.com / TechCorp)であり、実際のクライアントデータではありません。

scripts/src/db/seed.js
INSERT INTO voice_profile ( profile_name, tone, formality, sentence_patterns, paragraph_style,
voice_profile.avoid_patterns には "In today's rapidly evolving..."、"It's important to note..."、"In conclusion..." などの AI 決まり文句が直接列挙されており、SKILL.md の Red Flags リストと1対1で対応しています——執筆規律を構造化・クエリ可能なデータに落とし込んでいます。

タスクの分解は PRD を通じて行われます:templates/prd.json が userStories 配列として12のストーリー(SETUP/PLAN/WRITE/REVIEW/PUBLISH/SOCIAL/NEWSLETTER/METRICS)を提供し、各ストーリーには description、acceptanceCriteria リスト、priority、passes、notes が含まれます。エージェントは各ターンで priority が最小かつ passes:false のタスクを取り出して実行し、完了後に passes:true を書き戻して progress.txt にログを追記します。

templates/prd.json
"Create draft in drafts table linked to plan", "Draft is at least 800 words", "Includes all key messages from the communication",
検収基準は厳格に照合可能です(最低文字数制限、DBへの格納必須、ステータス更新必須)。npm test と連携して「基準未達のストーリーは true にしない」クローズドループを形成します。README では Small stories / Explicit criteria / Fast feedback と要約されています。

ターンを跨ぐ記憶はファイルと git のみに依存します:各ターンは完全に新しいコンテキストウィンドウとなり、記憶は SQLite + prd.json + progress.txt + git コミットによって保持されます。progress.txt のテンプレートはストーリー完了ごとに「日付 / STORY-ID / 文字数 / DB変更 / 成果物ファイル / 学び」を追記することを要求し、Codebase Patterns セクションを再利用可能に維持します。

README.md
Each iteration is a fresh context window. Memory persists through files.
テンプレート原文には 'Ralph appends entries below after each completed story:' と追記型ログであることが明記されています。templates/prompt.md の Step 5 では毎ターン git add -A && git commit -m "content: [STORY-ID] - [Story Title]" の実行が要求されるため、git 履歴もロールバックポイントとして機能します。

4つのスラッシュコマンドが役割を分担し、モデルとツールの権限を階層化しています:ralph-init はディレクトリ作成、${CLAUDE_PLUGIN_ROOT} からのスクリプトとテンプレートのコピー、npm install + npm run db:reset を実行;ralph-marketer は反復プロトコルを定義(model sonnet、allowed-tools に WebFetch を含む);ralph-status は読み取り専用レポート(model haiku、Bash/Read のみ);ralph-cancel は状態ファイルを削除してループを停止します。

commands/ralph-cancel.md
rm -f .claude/ralph-marketer-loop.local.md 2>/dev/null && echo "Loop state cleared" || echo "No active loop found"
停止パスはシンプルで信頼性が高いです(hook は状態ファイルがなければ通過)。対照的に、起動パスにはリポジトリ内に対応するファイル書き込みアクションが存在しません——verification.second_pass の discrepancy 項目を参照。

2コア機能

01Hook 駆動の自律ループ執筆:エージェントが停止を試みるたびに遮断されてプロンプトが再投入され、完了シグナル出力または上限到達まで継続
02PRD 駆動のタスクスケジューリングとレジューム実行:priority + passes:false でタスクを取得し、完了後に passes と進捗ログを書き戻し
03マーケティングコンテンツパイプライン DB と状態遷移マシン:トレンド/リサーチ/社内広報の3系統入力 → 計画/ドラフト/スコアリング/公開/アクティビティログ
04音声クローニング(Voice DNA):創業者の既存コンテンツからトーン、文構造、口癖、禁止表現をクエリ可能なプロファイルとして抽出
057フェーズの品質ループと自己批評ゲート:DISCOVER→LEARN→RESEARCH→IDEATE→WRITE→CRITIQUE→ITERATE、Founder Test や Red Flags によるリライトトリガーを内包
06品質検証テストスイート:npm test によるデータベース整合性、ドラフトの非空チェック、文字数とDB記録の一致、進捗/PRDファイルの存在確認
07素材と進捗の確認 CLI:db:status によるパイプライン概観、content/list.js による利用可能素材のリスト化とトピック優先度提案、query.js によるコマンド指定テーブル検索
08ワンクリックの足場作成と停止スイッチ:/ralph-init によるスクリプトテンプレートのコピーと DB 初期化、/ralph-cancel による状態ファイル削除とループ停止

3外部依存関係

KindDependency / Endpoint
packagebetter-sqlite3 ^11.0.0(唯一运行时依赖,同步 SQLite 驱动)
networknpm registry(安装依赖时拉包)
packageprebuild-install / node-gyp 链路(better-sqlite3 安装期原生模块构建,hasInstallScript=true)
clinode
clinpm(install / run db:reset / test)
clijq(stop-hook.sh 解析宿主传入的 transcript JSON;缺失时静默降级为空串)
clised/grep/tr/rm(POSIX 工具链,hook 内解析与改写状态文件)
cligit(每轮 add/commit,兼作记忆与回滚点)
networkWebFetch(宿主工具,仅 /ralph-marketer 命令显式授权;插件脚本自身无任何网络调用,竞品/趋势研究抓哪些公开网页由 agent 决定)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: hooks/stop-hook.sh(Claude Code の Stop イベント matcher "*"、timeout 30s。エージェントがターンを終了しようとするたびに実行)
  • scripts/ 或 SKILL.md: 外部言語パッケージ依存の動的インストールの宣言
  • 网络端点: 外部ネットワークアクセスの宣言: 間接的なネットワーク面 1:依存関係インストール時のパッケージ取得——package-lock.json に resolved https://registry.npmjs.org/... の記録あり
  • 本地工作目录: ファイル読み書きおよび成果物の出力: data/content.db(SQLite):init.js の const DB_PATH = './data/content.db' と mkdirSync の併用
監査ノート: リスク評価:イエロー(標準的なローカル自動化 + 予測可能なネットワーク通信面)。グリーンではありません。理由およびソースコード上の証拠:① 明確に確認できる強力な振る舞い面——hooks/hooks.json が matcher "*" で stop-hook.sh を毎回の Stop イベントにフックしており、スクリプトが rm/sed でプロジェクト内の状態ファイルを書き換える(stop-hook.sh 21-24、46-51、57-65 行目)ため、「エージェントが停止を試みるたびにシェルを実行する」構成になっています;② ローカル書き込みが多く cwd 相対であること(data/content.db、content/**、scripts/ralph/**、git add -A)、作業ディレクトリに依存して影響範囲が広がります;③ ループがデフォルトで unlimited であること(commands/ralph-marketer.md '--max-iterations <n>: Stop after N iterations (default: unlimited)')、コスト上限が完了シグナルのみに依存するため、権限リスクではなくリソース/課金リスクが存在します;④ ネットワーク面は予測可能であるもののゼロではない:依存インストールは公式 npm レジストリ経由であり、ループコマンドも明示的に WebFetch を許可(allowed-tools 行)。通信先は公開ウェブページおよび公式レジストリであり、リポジトリ全体に TLS 検証無効化、スクレイピング対策回避、標的型一括収集などのコードは見当たらないため、オレンジには該当しません;⑤ 認証情報/API キーの読み取りなし、独自の LLM/API 呼び出しなし——認証情報面のオレンジには該当しません;⑥ すべての振る舞いがソースコード上で特定可能であり、十分な証拠があるためグレーには該当しません。補足:リポジトリに LICENSE ファイルが存在しない点はコンプライアンス上の不備ですが、動作リスクの判定区分には影響しません。

5二重目の独立検証

  • [ok] Stop hook 注册与执行时机 — hooks/hooks.json 仅一条 hook:事件 Stop、matcher "*"、command ${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh、timeout 30;stop-hook.sh 逐行确认接收 stdin JSON、无状态文件即 exit 0、有状态文件才介入。
  • [discrepancy] 「循环如何被启动」——第一遍默认成立,第二遍证伪 — 全仓 grep ralph-marketer-loop 只命中 3 处:stop-hook.sh 读取/更新、ralph-cancel.md 删除、.gitignore 忽略。没有任何命令或脚本创建该状态文件(ralph-marketer.md 全文仅描述迭代协议与 $ARGUMENTS,无写入指令)。结论:按仓库代码,/ralph-marketer 执行后若无外部手段创建状态文件,hook 不会拦停、循环不会启动——插件缺『arm loop』这一步,使用前需自行创建 .claude/ralph-marketer-loop.local.md(或依赖未入库的 ralph.sh,见下条)。
  • [discrepancy] progress.txt 引用的 scripts/ralph/ralph.sh — templates/progress.txt 第 37 行 'Loop script: `scripts/ralph/ralph.sh`' 与 README 的『Ralph is a Bash loop』叙事互相印证,但 find 全量文件确认仓库内不存在 ralph.sh;实际循环由 Stop hook 实现。该引用是遗留/未入库说明,照模板找脚本会扑空。
  • [unlocatable] 脚本内是否有网络调用或凭证读取 — 对 .js/.sh 检索 fetch/axios/http./API_KEY/api_key/process.env/curl/wget/token/secret 零命中——即『未发现任何一处』;但无法据此证明运行期绝对无网络(npm 安装与 agent 的 WebFetch 属外部工具面),故按 unlocatable 记录,并在 security.reason 中以这两条外部面说明档位。
  • [discrepancy] jq 依赖未声明,缺失时完成信号静默失效 — stop-hook.sh 用 jq 提取 .transcript[-1].content,但 README/命令文档均未提 jq 依赖,脚本以 '2>/dev/null || echo ""' 静默降级——jq 缺失时 LAST_OUTPUT 恒为空,<promise>COMPLETE</promise> 永不触发,循环只能靠 max_iterations 或 /ralph-cancel 结束。属真实使用陷阱(安全上无害,安全上是『无法自停』的风险)。
  • [ok] 状态文件容错与 sed -i 跨平台兼容 — iteration 非数字 → 告警 + rm 状态文件 + exit 0(防坏状态锁死);max_iterations 非数字 → 回退 999999;sed -i 先试 BSD 写法(sed -i '')再回退 GNU 写法;set -e 与 `||` 组合不会误退。
  • [ok] 回注内容来源与拼装是否如实 — PROMPT=$(sed -n '/^---$/,/^---$/!p' "$LOOP_STATE_FILE") 取 frontmatter 之后全文;空则 cat scripts/ralph/prompt.md;再空则一行默认文案。最终 cat << EOF 输出 {"decision": "block", "message": "$SYSTEM_MSG"} —— 与 Claude Code Stop hook 协议相符(协议本身由宿主定义,不在本仓可校验范围)。
  • [ok] SQLite 表数与 schema 完整性 — init.js 内共 14 个 CREATE TABLE(founder_content、competitor_content、trends、research、communications、voice_profile、content_patterns、research_briefs、content_ideas、content_plan、drafts、critique_results、published、agent_log),与其 console.log 自述一致;content_plan/drafts 有 CHECK 枚举与外键,foreign_keys 已开启,DB 路径相对 cwd。

6結論

  • 完全に監査可能なループ機構:自律継続のロジックは101行の bash(振る舞いを持つ唯一の非 md ファイル)に集約されており、exit 0 / allow / block の3つの出口、完了シグナル形式、反復上限、破損状態のクリーンアップを行単位で確認可能でブラックボックスがありません。
  • ブレークポイントからの再開を真にサポートする状態設計:14のテーブルが7フェーズのパイプラインを固定化(content_plan.status の CHECK enum、drafts.version、critique_results のブール値リスト、agent_log)、prd.json の passes や progress.txt と連動し、どのラウンドで中断しても DB とファイルから復旧可能です。
  • お題目に留まらない品質ゲート:SKILL.md が Founder Test / Red Flags / Draft 1-5 のラダーを定義し、test.js で機械検証を実施(ドラフト文字数とDB記録の一致、公開時の meta description 必須化、孤立ドラフトの排除)。npm test パスをストーリー完了の必須要件としています。
  • 認証情報ゼロ、独自通信ゼロ:API キー不要、業務用の process.env 読み取りなし、HTTP クライアントなし。執筆機能はホストエージェントのものを完全に再利用するため、ユーザーは秘密情報を一切渡す必要がなく、サードパーティサービスへのコンテンツ流出も防げます。
  • コストと権限の階層化:status コマンドには haiku を採用し Bash/Read のみに制限、init は制限されたツールセットを使用し、長時間の marketer のみに sonnet + WebFetch を付与——最小権限の意図が反映されています。
  • 最適な用途: すでに Claude Code を利用しており、「長期スパン・中断可能・証跡が残る」コンテンツ制作を必要とするユーザーに最適です:SaaS 創業者やコンテンツ責任者が、トレンド・リサーチ・社内広報を SQLite に投入し、PRD で今期作成するブログ/事例/SNS/ニュースレターをリストアップしておけば、就寝中にラウンドを重ねて進行させ、翌朝 progress.txt と git 履歴で検収できます。また、Ralph ループのエンジニアリングを学びたい開発者にも適しています——「hook 遮断 + PRD 台帳 + progress ログ + 状態 DB」の4要素を組み合わせた最小完全サンプルであり、hook スクリプトは直接参考にできます。前提として「モデルの出力は公開前に必ず人間がレビューする」という運用の受け入れが必要です。
    不向きな用途: 「コマンド1発で完成品が欲しい」ユーザーには不向きです:デフォルトでは自動停止せず(--max-iterations または手動での状態ファイル作成が必要)、arm ステップの欠如、jq への依存、ドキュメントとコードの乖離などがあり、ある程度のトラブルシューティング能力が求められます。トークンコストに敏感な方や、完全放置での長時間稼働(コスト上限なし)には不向きです。「CMS や SNS へのワンクリック自動投稿」を求めるシナリオには適していません——リポジトリ内にプラットフォーム API 連携コードは一切なく、公開処理は content/published/*.md への書き出しと DB 記録にとどまります。作業ディレクトリ内でネイティブモジュールの npm install や git add -A が実行されることを嫌うクリーン志向のワークフローには向きません。「analyze my Twitter/LinkedIn」を自動スクレイピングの意味として捉える方にも不適です——それはホストエージェント側に期待される振る舞いであり、本リポジトリ内の実装ではありません。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload ralph-wiggum-marketer.tar.gz
    sha256: 525719530027f17d…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 4c1f5f3bdf.