首页 / 全部技能 / 内容创作 / 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)。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外部依赖

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;每次 agent 尝试结
  • scripts/ 或 SKILL.md: 声明动态安装外部语言包依赖
  • 网络端点: 声明外部网络访问: 间接网络面 1:依赖安装拉包——package-lock.json 记录 resolved https://registry.npmjs.org/be
  • 本地工作目录: 文件读写与工件输出: data/content.db(SQLite):init.js 的 const DB_PATH = './data/content.db' 配合 mk
审计说明: 风险提醒:黄色(常规本地自动化 + 可预期网络面),不是绿色。理由与源码证据:① 强行为面可实证——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 的期望,不是仓库里的实现。
    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.