问题现象
happy-code 服务启动后,通过 happy 派生的 Claude Code 子进程命令行中包含大量注入的提示词,通过 --append-system-prompt 参数传递。
提示词来源分析
happy-coder 有 两层 提示词注入:
1. 客户端本地硬编码(可 patch)
位于 /usr/local/lib/node_modules/happy-coder/dist/index-B3gQr6vs.mjs:
| 常量 | 行号 | 内容 |
|---|---|---|
BASE_SYSTEM_PROMPT | 245-247 | 强制每次对话调用 mcp__happy__change_title 工具设置标题 |
CO_AUTHORED_CREDITS | 248-258 | 在 git commit 时追加 Happy 署名 |
两段合并为 systemPrompt 变量,通过两个注入点传递给 claude:
- 第 285 行(
claudeLocal模式):args.push("--append-system-prompt", systemPrompt) - 第 1703-1704 行(SDK 模式):
customSystemPrompt/appendSystemPrompt字段
2. 服务端远程下发(本地无法控制)
happy 服务端(远程 server)通过 WebSocket 向客户端下发 appendSystemPrompt,内容为 “Options” XML 格式说明:
# Options
You have a way to give a user a easy way to answer your questions...
<options>
<option>Option 1</option>
...
</options>
...
这段提示词在本地代码中不存在,由服务端动态注入,本地 patch 无法消除。
解决方案
步骤 1:关闭 CO_AUTHORED 署名(配置方式)
在 ~/.claude/settings.json 中添加:
{
"includeCoAuthoredBy": false
}
步骤 2:Patch 本地源码,去除所有客户端注入
备份:
sudo cp /usr/local/lib/node_modules/happy-coder/dist/index-B3gQr6vs.mjs \
/usr/local/lib/node_modules/happy-coder/dist/index-B3gQr6vs.mjs.bak
Patch 1:将三段提示词常量置空(原第 245-266 行)
// 原始代码(已替换):
// const BASE_SYSTEM_PROMPT = (() => trimIdent(`...`))();
// const CO_AUTHORED_CREDITS = (() => trimIdent(`...`))();
// const systemPrompt = (() => { ... })();
// 替换为:
const BASE_SYSTEM_PROMPT = "";
const CO_AUTHORED_CREDITS = "";
const systemPrompt = "";
Patch 2:给 --append-system-prompt 加空值守卫(第 285 行)
// 原始:
args.push("--append-system-prompt", systemPrompt);
// 替换为:
if (systemPrompt) args.push("--append-system-prompt", systemPrompt);
Patch 3:SDK 模式 appendSystemPrompt 空值处理(第 1704 行)
// 原始:
appendSystemPrompt: initial.mode.appendSystemPrompt
? initial.mode.appendSystemPrompt + "\n\n" + systemPrompt
: systemPrompt,
// 替换为:
appendSystemPrompt: initial.mode.appendSystemPrompt
? initial.mode.appendSystemPrompt
: systemPrompt || void 0,
步骤 3:重启服务
systemctl --user restart happy-code
systemctl --user status happy-code
验证
查看子进程参数确认本地提示词已消除:
ps aux | grep happy
cat /proc/<PID>/cmdline | tr '\0' '\n'
Patch 后,--append-system-prompt 参数中的 BASE_SYSTEM_PROMPT(change_title 指令)和 CO_AUTHORED_CREDITS(署名)均不再出现。
残留问题
服务端下发的 “Options” 提示词仍会出现在子进程参数中。要彻底去除需要修改 happy-server 端代码(部署在远程服务器的 Docker 容器中)。
注意事项
- happy-coder 版本:
0.13.0 npm update -g happy-coder升级后 patch 会丢失,需重新执行- 源文件路径:
/usr/local/lib/node_modules/happy-coder/dist/index-B3gQr6vs.mjs - systemd 服务文件:
/home/dev/.config/systemd/user/happy-code.service