问题现象

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_PROMPT245-247强制每次对话调用 mcp__happy__change_title 工具设置标题
CO_AUTHORED_CREDITS248-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