全部技能 / 内容创作 / 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.

风险提醒:黄色 · 留意使用AI 侦查报告
作者 muratcankoylanGitHub muratcankoylan/ralph-wiggum-marketer ↗Stars 775许可 MIT(仓库内无 LICENSE 文件,仅 README 末节 '## License / MIT' 与 package.json、.claude-plugin/plugin.json、marketplace.json 的 "license": "MIT" 声明;GitHub API license=null,与此一致)commit 4c1f5f3bdf
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

Stop hook 是循环真正的引擎,而不是 SKILL 文本:插件用 matcher "*" 注册 Claude Code 的 Stop 事件,命令指向插件内的 stop-hook.sh(timeout 30s)。agent 每次想结束回合时该脚本都会被宿主执行,脚本以 stdout 的 JSON 决定放行或把 agent 拽回下一轮——『不停歇』由宿主 hook 协议实现。

hooks/hooks.json
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh",
注:这里在做什么:把 stop-hook.sh 挂到每次停止动作上。介入点发生在 agent 主动结束回合的那一刻,不是定时器;脚本无状态文件就 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 字段。这也是取消循环最省事的原理(删文件即可)。

终止条件有三重兜底:① 上一条助手消息(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!"
注:三处出口均伴随 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,再退化为一行默认文案。

状态与素材持久化在 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 约束把管线状态机固化进 schema。

scripts/src/db/init.js
status TEXT DEFAULT 'planned' CHECK(status IN ('planned', 'researching', 'writing', 'critiquing', 'iterating', 'review', 'published', 'cancelled')),
注:content_plan.status 的枚举就是 README 的 PLANNED→…→PUBLISHED 流水线;drafts 带 version/critique_passed/voice_match_score/uniqueness_score,critique_results 把 7 项质量清单变成布尔列,使『迭代到合格』可查询、可续跑、可审计。

seed.js 让项目开箱即有输入:先 DELETE FROM 各表清空,再注入样例 founder 内容、1 份 voice DNA(语气/句式/口头禅/回避模式)、竞品 gap、趋势、研究、公司 com 与 patterns,最后写一条 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 清单一一对应——把写作纪律数据化、可查询。

任务分解走 PRD:templates/prd.json 以 userStories 数组给出 12 条故事(SETUP/PLAN/WRITE/REVIEW/PUBLISH/SOCIAL/NEWSLETTER/METRICS),每条含 description、acceptanceCriteria 列表、priority、passes、notes;agent 每轮取 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",
注:验收标准是硬性可核对的(字数下限、必须落库、必须更新状态),配合 npm test 形成『story 未达标不置 true』的闭环;README 概括为 Small stories / Explicit criteria / Fast feedback。

跨轮记忆只靠文件与 git:每轮都是全新上下文窗口,记忆由 SQLite + prd.json + progress.txt + git 提交承载;progress.txt 模板要求每次完成 story 后追加『日期 / STORY-ID / 字数 / 数据库变更 / 产出文件 / learnings』,并保持 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 历史因此也是回滚点。

四个 slash command 各司其职并做模型/工具分级: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 驱动的自主循环写作:agent 想停就被拦下重喂 prompt,直至输出完成信号或触顶
02PRD 驱动的任务调度与断点续跑:按 priority + passes:false 取活,完成后回写 passes 与进度日志
03营销内容管线数据库与状态机:趋势/研究/公司 com 三类输入 → 计划/草稿/评分/发布/活动日志
04声音克隆(Voice DNA):把创始人存量内容提炼成可查询的语气、句式、口头禅与禁忌词画像
05七相位质量环与自我批评门禁:DISCOVER→LEARN→RESEARCH→IDEATE→WRITE→CRITIQUE→ITERATE,含 Founder Test 与 Red Flags 触发重写
06质量校验测试套件:npm test 校验数据库完整性、草稿非空、字数与库内记录一致、进度/PRD 文件存在
07素材与进度检视 CLI:db:status 管线概览、content/list.js 列可用素材并给出选题优先级建议、query.js 按命令查表
08一键脚手架与停止开关:/ralph-init 复制脚本模板并初始化数据库;/ralph-cancel 删除状态文件终止循环

3外部依赖

类型依赖
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风险提醒 风险提醒:黄色 · 留意使用

风险提醒:黄色 · 留意使用
  • 无上限循环 = 无上限 token 账单 — 默认 unlimited(commands/ralph-marketer.md '--max-iterations <n>: Stop after N iterations (default: unlimited)',正文并写 'You have unlimited iterations.')。每轮都要读库 + 读 PRD + 读 progress + 跑 npm test + 生成长文草稿,token 消耗远超一次性 skill;自停依赖模型每轮自评全部 story 都 passes:true,若 PRD 与库状态不一致(或 jq 缺失使完成信号检测静默失效)则永不自停,只能靠 /ralph-cancel 或显式 --max-iterations 兜底。建议始终显式传 --max-iterations。
  • hook 每次停止都执行 shell,且带写操作 — matcher "*" 使其在所有会话的每次 Stop 事件触发(有状态文件时),脚本会 sed -i 改写 .claude/ralph-marketer-loop.local.md,必要时 rm 之。虽是本地文件、逻辑简单,但『每次停下都被执行』的风险画像与纯 prompt skill 完全不同;宿主若放宽 hook 权限需自行评估。
  • 状态文件即指令源(prompt 注入面) — hook 把状态文件 frontmatter 之后的文本原样拼进回注消息当新一轮输入,prompt.md 亦然。任何能写这两个文件的人或进程(含共享仓库/共享工作目录的其他人)都能向循环注入指令;多 agent 或多用户共用目录时尤需注意。
  • 对标外内容无隔离:间接注入 + 事实污染 — trends/research/competitor_content 与 WebFetch 抓回的网页文本会被 agent 当写作依据(prompt.md『Read source materials』),既是 prompt 注入面,也是事实错误与版权风险的入口:竞品文案、抓取片段可能被改写成对外发布内容。发布前必须人工复核(这正是流水线里 REVIEW/PUBLISH 分工存在的意义)。
  • 写入路径相对 cwd,且 git add -A — db 落在 ./data/content.db、产出落在 content/**,均由当前工作目录决定;prompt.md Step 5 要求 'git add -A',在错误目录运行会把无关改动一并提交。使用前应确认目录干净并先 commit 基线。
  • 工程细节缺口会直接让功能不工作 — ① 无任何命令创建 .claude/ralph-marketer-loop.local.md → 按仓库代码循环不会自行启动;② hook 依赖 jq 但未声明,缺失时完成信号检测静默失效;③ README 的 schema 段与实际 14 张表不同步;④ templates/progress.txt 引用不存在的 scripts/ralph/ralph.sh。以上属可用性缺陷,不是安全问题。
  • 许可证证据不完整 — 仓库无 LICENSE 文件,只有 README/package.json/plugin.json/marketplace.json 的 MIT 文本声明,GitHub API license=null。企业内二次分发前建议要求作者补文件(本侦查不构成法律意见)。
风险提醒:黄色(常规本地自动化 + 可预期网络面),不是绿色。理由与源码证据:① 强行为面可实证——hooks/hooks.json 以 matcher "*" 把 stop-hook.sh 挂在每一次 Stop 事件上,脚本会 rm/sed 改写项目内状态文件(stop-hook.sh 第 21-24、46-51、57-65 行),即『每次 agent 想停下都执行 shell』;② 本地写入多且相对 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 registry,循环命令又显式授权 WebFetch(allowed-tools 行),外发对象是公开网页与官方 registry,全仓未见关 TLS 校验、反爬绕过、批量定向采集等代码——不到 orange;⑤ 无凭证/密钥读取、无自建 LLM/API 调用——不到 orange 的凭证档;⑥ 行为全部可在源码定位、证据充分——不到 grey。补充:仓库无 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 三条出口、完成信号格式、迭代上限、脏状态清理都能逐行核对,没有黑盒。
  • 状态设计真正支持断点续跑:14 张表把七相位流水线固化(content_plan.status 的 CHECK 枚举、drafts.version、critique_results 布尔清单、agent_log),配合 prd.json 的 passes 与 progress.txt,任何一轮中断都能从库与文件恢复。
  • 质量门禁不止是口号:SKILL.md 给出 Founder Test / Red Flags / Draft 1-5 阶梯,仓库再用 test.js 做机器校验(草稿字数与库内记录一致、发布必须有 meta description、无孤儿草稿),并规定 npm test 通过才可标记 story 完成。
  • 零凭证、零自建网络:无 API key、无业务 process.env 读取、无 HTTP 客户端,写作能力完全复用宿主 agent——用户不必交出任何密钥,也避免把内容外发给第三方服务。
  • 成本与权限做了分级:status 命令使用 haiku 且仅授权 Bash/Read,init 用受限工具集,只有长跑的 marketer 拿 sonnet + WebFetch——体现按需授权的意图。
  • 适合:适合已经用 Claude Code、需要『长周期、可中断、要留痕』内容生产的人:SaaS 创始人/内容负责人把趋势、调研、公司 com 灌进 SQLite,用 PRD 列出这一轮要出的博客/案例/社媒/newsletter,让它在你睡觉时一轮轮推进,第二天按 progress.txt 与 git 记录验收。也适合想学 Ralph 循环工程化的开发者——这是把『hook 拦停 + PRD 记账 + progress 日志 + 状态库』四件事拼起来的最小完整样本,hook 脚本可直接借鉴。前提是接受『模型产出必须人工过一遍再发布』。
    不适合:不适合想要『一条命令产出成品』的用户:它默认不会自停(需 --max-iterations 或手工建状态文件),且缺 arm 步骤、依赖 jq、文档与代码有出入,需要一定动手排障能力。不适合对 token 成本敏感或无人值守长跑(无成本上限)。不适合要求『一键发布到 CMS/社媒』的场景——仓库内没有任何平台 API 集成,发布只是写 content/published/*.md 与数据库记录。不适合不愿在生产目录跑 npm install 原生模块与 git add -A 的洁癖型工作流;也不适合把『analyze my Twitter/LinkedIn』理解成自动抓取的人——那部分是交给宿主 agent 的期望,不是仓库里的实现。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-15
    方式 A · 人下载镜像包下载 ralph-wiggum-marketer.tar.gz
    sha256: 525719530027f17d…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit 4c1f5f3bdf;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库muratcankoylan / muratcankoylan/ralph-wiggum-marketer
    Stars775
    最近推送2026-04-09
    本 skill commit4c1f5f3bdf
    许可MIT(仓库内无 LICENSE 文件,仅 README 末节 '## License / MIT' 与 package.json、.claude-plugin/plugin.json、marketplace.json 的 "license": "MIT" 声明;GitHub API license=null,与此一致)
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近