agent-purge 0.2.10 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +64 -0
- package/LICENSE +21 -21
- package/README.md +169 -138
- package/backends/index.mjs +204 -244
- package/bench/bench-armor.mjs +844 -832
- package/bench/capture-hot.mjs +58 -0
- package/bench/capture-provider.mjs +66 -0
- package/bench/capture-report.mjs +15 -0
- package/bench/capture-server-hot.mjs +55 -0
- package/bench/capture-system.mjs +36 -0
- package/bench/judge-armor.mjs +119 -119
- package/bin/agent-purge.mjs +956 -780
- package/docs/LEGAL.md +27 -0
- package/docs/architecture.md +39 -0
- package/docs/compatibility.md +78 -0
- package/docs/images/console-desktop.png +0 -0
- package/docs/images/console-mobile.png +0 -0
- package/docs/releasing.md +87 -0
- package/docs/usage.md +158 -0
- package/lib/activation.mjs +38 -0
- package/lib/apply.mjs +227 -0
- package/lib/armed.mjs +38 -38
- package/lib/armor.mjs +225 -222
- package/lib/caps.mjs +182 -173
- package/lib/capture.mjs +324 -0
- package/lib/clean.mjs +124 -0
- package/lib/control.mjs +60 -0
- package/lib/detect.mjs +74 -70
- package/lib/doctor.mjs +7 -7
- package/lib/dsh.mjs +495 -453
- package/lib/environment.mjs +36 -0
- package/lib/evidence.mjs +41 -0
- package/lib/extension.mjs +140 -0
- package/lib/footprints.mjs +59 -0
- package/lib/home.mjs +47 -47
- package/lib/launch-conflicts.mjs +24 -0
- package/lib/launch.mjs +57 -0
- package/lib/opencode.mjs +62 -0
- package/lib/paths.mjs +25 -0
- package/lib/persist.mjs +439 -280
- package/lib/persona-import.mjs +351 -0
- package/lib/personas.mjs +17 -7
- package/lib/private-server.mjs +54 -0
- package/lib/project.mjs +134 -0
- package/lib/restore.mjs +131 -114
- package/lib/rewrite.mjs +124 -0
- package/lib/root.mjs +37 -0
- package/lib/shim.mjs +203 -160
- package/lib/slashes.mjs +227 -628
- package/lib/spawn.mjs +182 -126
- package/lib/state.mjs +85 -137
- package/lib/templates/personas/neutral.md +30 -30
- package/lib/update.mjs +137 -0
- package/lib/verification.mjs +23 -0
- package/lib/window.mjs +58 -0
- package/lib/wrappers.mjs +49 -0
- package/magpie-plugin/README.md +44 -0
- package/matrix.json +325 -341
- package/package.json +30 -4
- package/web/app.js +590 -0
- package/web/assets/agent-purge.ico +0 -0
- package/web/assets/claude.ico +0 -0
- package/web/assets/codebuddy.png +0 -0
- package/web/assets/codex.webp +0 -0
- package/web/assets/dsh.ico +0 -0
- package/web/assets/grok.ico +0 -0
- package/web/assets/hermes.ico +0 -0
- package/web/assets/omp.png +0 -0
- package/web/assets/opencode.ico +0 -0
- package/web/assets/opencode2.ico +0 -0
- package/web/assets/pi.png +0 -0
- package/web/assets/zcode.png +0 -0
- package/web/model.mjs +49 -0
- package/web/server.mjs +330 -191
- package/web/styles.css +1072 -0
- package/web/ui.html +76 -1163
package/backends/index.mjs
CHANGED
|
@@ -1,244 +1,204 @@
|
|
|
1
|
-
// 每家的 build() 是纯函数:只描述"怎么启动",不 spawn、不写盘。
|
|
2
|
-
// setup/cleanup 由入口统一调用,保证能按哈希回滚。
|
|
3
|
-
import { mkdirSync,
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { SESSION as DSH_SESSION, addPlugin,
|
|
6
|
-
import { opencodePlugins } from "../lib/persist.mjs";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (mode === "off") return { cmd: "
|
|
95
|
-
return {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
mode === "
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
],
|
|
158
|
-
}),
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}),
|
|
204
|
-
|
|
205
|
-
if (mode === "off") return { cmd: "opencode", args: ["run", prompt] };
|
|
206
|
-
const b = backends.opencode({ personaText, mode, cwd, args: ["run", prompt] });
|
|
207
|
-
return b;
|
|
208
|
-
},
|
|
209
|
-
opencode2: ({ prompt, personaText, mode }) => {
|
|
210
|
-
if (mode === "off") return { cmd: "opencode2", args: ["run", prompt] };
|
|
211
|
-
const b = backends.opencode2({ personaText, mode, args: ["run", prompt] });
|
|
212
|
-
return b;
|
|
213
|
-
},
|
|
214
|
-
dsh: ({ prompt, personaText, mode }) => {
|
|
215
|
-
if (mode === "off") return { cmd: "dsh", args: ["--profile", "headless", prompt] };
|
|
216
|
-
// backends.dsh 会自己补 --profile headless,这里只给 prompt(否则重复)
|
|
217
|
-
return backends.dsh({ personaText, mode, args: [prompt] });
|
|
218
|
-
},
|
|
219
|
-
zcode: ({ prompt }) => ({
|
|
220
|
-
cmd: "zcode",
|
|
221
|
-
args: ["--prompt", prompt, "--mode", "yolo", "--output-format", "stream-json", "--no-color"],
|
|
222
|
-
note: "persona 对 zcode CLI 不生效:customSystemPrompt 只有 app-server/SDK 能传",
|
|
223
|
-
}),
|
|
224
|
-
codebuddy: ({ prompt, personaPath, personaText, mode }) => ({
|
|
225
|
-
cmd: "codebuddy",
|
|
226
|
-
args: [
|
|
227
|
-
"-p",
|
|
228
|
-
prompt,
|
|
229
|
-
"--max-turns",
|
|
230
|
-
"5",
|
|
231
|
-
...(mode === "off"
|
|
232
|
-
? []
|
|
233
|
-
: mode === "append"
|
|
234
|
-
? ["--append-system-prompt", inline(personaText)]
|
|
235
|
-
: ["--system-prompt-file", personaPath]),
|
|
236
|
-
],
|
|
237
|
-
}),
|
|
238
|
-
hermes: ({ prompt, mode }) => ({
|
|
239
|
-
cmd: "hermes",
|
|
240
|
-
// --ignore-rules 是关键:不加时 Hermes 自带 rules 层会把人设顶回去(模型自称 Hermes、明说“不照办”)。
|
|
241
|
-
args: ["-z", prompt, ...(mode === "off" ? [] : ["--ignore-rules"])],
|
|
242
|
-
note: "身份段来自 $HERMES_HOME/SOUL.md;注入时必须带 --ignore-rules,关电源时不带",
|
|
243
|
-
}),
|
|
244
|
-
};
|
|
1
|
+
// 每家的 build() 是纯函数:只描述"怎么启动",不 spawn、不写盘。
|
|
2
|
+
// setup/cleanup 由入口统一调用,保证能按哈希回滚。
|
|
3
|
+
import { mkdirSync, readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { SESSION as DSH_SESSION, addPlugin, sessionSource } from "../lib/dsh.mjs";
|
|
6
|
+
import { opencodePlugins, targets } from "../lib/persist.mjs";
|
|
7
|
+
import { opencodeSource } from "../lib/opencode.mjs";
|
|
8
|
+
import { dataHome } from "../lib/home.mjs";
|
|
9
|
+
import { swapFile } from "../lib/restore.mjs";
|
|
10
|
+
|
|
11
|
+
function temporaryPlugin(harness, file, root, args) {
|
|
12
|
+
let undo = null;
|
|
13
|
+
return { cmd: harness, args, runtime: true,
|
|
14
|
+
setup: () => { mkdirSync(join(file, ".."), { recursive: true }); if (!undo) undo = swapFile(file, opencodeSource(root, harness, { temporary: true })); },
|
|
15
|
+
cleanup: () => { if (undo) { undo(); undo = null; } },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const inline = (text) => text.replace(/\s+$/, "");
|
|
20
|
+
// codex 的 -c 值按 TOML 解析:整段人设必须包成 basic string,否则空格/引号/换行会解析失败。
|
|
21
|
+
const tomlStr = (value) => JSON.stringify(String(value));
|
|
22
|
+
|
|
23
|
+
export const backends = {
|
|
24
|
+
// pi:命令行已试过 --system-prompt,但 pi.cmd 走 cmd.exe,10K 人设会撞 8191 上限(实测“命令行太长”)。
|
|
25
|
+
// 所以 pi 的注入靠扩展(sys 层、无长度限制、跟 state.json 走),这里只透传。
|
|
26
|
+
// 扩展由 launch() 在启动前自动确保安装。
|
|
27
|
+
pi: ({ args }) => ({ cmd: "pi", args }),
|
|
28
|
+
|
|
29
|
+
codex: ({ personaPath, personaText, mode, args }) => ({
|
|
30
|
+
cmd: "codex",
|
|
31
|
+
args:
|
|
32
|
+
mode === "off"
|
|
33
|
+
? [...args]
|
|
34
|
+
: mode === "append"
|
|
35
|
+
? ["-c", `developer_instructions=${tomlStr(inline(personaText))}`, ...args]
|
|
36
|
+
: ["-c", `model_instructions_file=${tomlStr(personaPath.replace(/\\/g, "/"))}`, ...args],
|
|
37
|
+
}),
|
|
38
|
+
|
|
39
|
+
// CodeBuddy(腾讯云,npm @tencent-ai/codebuddy-code):原生整段替换,无残留
|
|
40
|
+
codebuddy: ({ personaPath, personaText, mode, args }) => ({
|
|
41
|
+
cmd: "codebuddy",
|
|
42
|
+
args:
|
|
43
|
+
mode === "off"
|
|
44
|
+
? [...args]
|
|
45
|
+
: mode === "append"
|
|
46
|
+
? ["--append-system-prompt", inline(personaText), ...args]
|
|
47
|
+
// replace 走文件:内联 9.6K 会把裸命令(.cmd 包装器)撞上 8191 上限
|
|
48
|
+
: ["--system-prompt-file", personaPath, ...args],
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
claude: ({ personaPath, mode, args }) => ({
|
|
52
|
+
cmd: "claude",
|
|
53
|
+
args:
|
|
54
|
+
mode === "off"
|
|
55
|
+
? [...args]
|
|
56
|
+
: mode === "append"
|
|
57
|
+
? ["--append-system-prompt-file", personaPath, ...args]
|
|
58
|
+
: ["--system-prompt-file", personaPath, ...args],
|
|
59
|
+
residueHint: mode === "off" ? "" : "不补丁时残留 62 字身份句",
|
|
60
|
+
}),
|
|
61
|
+
|
|
62
|
+
grok: ({ personaText, mode, args }) => ({
|
|
63
|
+
cmd: "grok",
|
|
64
|
+
args:
|
|
65
|
+
mode === "off"
|
|
66
|
+
? [...args]
|
|
67
|
+
: mode === "append"
|
|
68
|
+
? ["--rules", inline(personaText), ...args]
|
|
69
|
+
: ["--system-prompt-override", inline(personaText), ...args],
|
|
70
|
+
}),
|
|
71
|
+
|
|
72
|
+
omp: ({ personaText, mode, args }) =>
|
|
73
|
+
mode === "off"
|
|
74
|
+
? { cmd: "omp", args: [...args] }
|
|
75
|
+
: {
|
|
76
|
+
cmd: "omp",
|
|
77
|
+
args: [mode === "append" ? "--append-system-prompt" : "--system-prompt", inline(personaText), ...args],
|
|
78
|
+
residueHint: "MCP tool routes 仍会追加(10K 量级),关掉 MCP server 可缩",
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
// 临时插件与常驻插件不共享许可;人设正文不编译进孤儿文件。
|
|
82
|
+
opencode: ({ mode, cwd, args, root = dataHome() }) => {
|
|
83
|
+
if (mode === "off") return { cmd: "opencode", args: [...args] };
|
|
84
|
+
return temporaryPlugin("opencode", join(cwd, ".opencode", "plugin", "agent-purge.ts"), root, args);
|
|
85
|
+
},
|
|
86
|
+
dsh: ({ mode, args, root = dataHome() }) => {
|
|
87
|
+
if (mode === "off") return { cmd: "dsh", args: ["--profile", "headless", ...args] };
|
|
88
|
+
let temporary = null;
|
|
89
|
+
return { cmd: "dsh", args: ["--profile", "headless", ...args], runtime: true,
|
|
90
|
+
setup: () => { if (!temporary) temporary = addPlugin(DSH_SESSION, sessionSource("", mode, root), { temporary: true }); },
|
|
91
|
+
cleanup: () => { if (temporary) { temporary.cleanup(); temporary = null; } } };
|
|
92
|
+
},
|
|
93
|
+
opencode2: ({ mode, args, root = dataHome() }) => {
|
|
94
|
+
if (mode === "off") return { cmd: "opencode2", args: [...args], privateServer: true };
|
|
95
|
+
return { ...temporaryPlugin("opencode2", join(opencodePlugins(), "agent-purge-v2-session.ts"), root, args), privateServer: true };
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
// 需要落盘或调用方配合,CLI 不代劳,只给可复制的配方
|
|
99
|
+
zcode: () => ({
|
|
100
|
+
manual: [
|
|
101
|
+
"CLI 拿不到 customSystemPrompt(只有 app-server/SDK 能传);CLI 只有 UserPromptSubmit hook 注入,且落在 user 角色。",
|
|
102
|
+
"注入配方: ~/.zcode/cli/config.json 里 hooks.enabled=true + UserPromptSubmit hook 返回 additionalContext。",
|
|
103
|
+
"归零配方: 等长替换 resources/glm/zcode.cjs 里的 IJs(42 字),但 cli_prefix 段仍留 42 字。",
|
|
104
|
+
],
|
|
105
|
+
}),
|
|
106
|
+
|
|
107
|
+
// 交互式:SOUL.md 是唯一身份入口。启动前写入、退出还原(在 UI 里接管着就一直留着)。
|
|
108
|
+
// 注意它只在会话首次/重建时读 SOUL.md:续会话从 session DB 还原 system 提示词,改文件不当场生效
|
|
109
|
+
// (源码 agent/conversation_loop.py::_restore_or_build_system_prompt)。
|
|
110
|
+
hermes: ({ personaText, personaPath, mode, args = [] }) => {
|
|
111
|
+
let undo = null;
|
|
112
|
+
return {
|
|
113
|
+
cmd: "hermes",
|
|
114
|
+
args: [...(mode === "off" ? [] : ["--ignore-rules"]), ...args],
|
|
115
|
+
note: "SOUL.md 仅供新会话读取;退出后恢复启动前的原字节,不更改常驻选择",
|
|
116
|
+
setup: () => {
|
|
117
|
+
if (mode === "off" || undo) return;
|
|
118
|
+
const file = targets.hermes.file();
|
|
119
|
+
mkdirSync(join(file, ".."), { recursive: true });
|
|
120
|
+
const original = existsSync(file) ? readFileSync(file, "utf8") : "";
|
|
121
|
+
const body = personaText ?? readFileSync(personaPath, "utf8");
|
|
122
|
+
undo = swapFile(file, mode === "append" ? original + "\n\n" + body : body);
|
|
123
|
+
},
|
|
124
|
+
cleanup: () => { if (undo) { undo(); undo = null; } },
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
antigravity: () => ({
|
|
129
|
+
manual: [
|
|
130
|
+
"prompt 在 resources/bin/language_server.exe(Go embed.FS)。",
|
|
131
|
+
"闭源 App 的身份句在二进制里,只能等长替换;改动会使签名失效、更新被覆盖,所以默认不做。",
|
|
132
|
+
],
|
|
133
|
+
}),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
// 一次性问答(headless)规格:Web UI 与 `agent-purge <h> --ask` 共用。
|
|
140
|
+
// 只收录实测过参数的 harness,没验过的不猜。
|
|
141
|
+
export const oneshots = {
|
|
142
|
+
pi: ({ prompt }) => ({
|
|
143
|
+
cmd: "pi",
|
|
144
|
+
args: ["-p", prompt],
|
|
145
|
+
note: "注入靠扩展(sys 层);人设走 state.json,不占命令行",
|
|
146
|
+
}),
|
|
147
|
+
claude: ({ prompt, personaPath, mode }) => ({
|
|
148
|
+
cmd: "claude",
|
|
149
|
+
args: ["-p", prompt, ...(mode === "off" ? [] : [mode === "append" ? "--append-system-prompt-file" : "--system-prompt-file", personaPath])],
|
|
150
|
+
}),
|
|
151
|
+
grok: ({ prompt, personaText, mode }) => ({
|
|
152
|
+
cmd: "grok",
|
|
153
|
+
args: ["-p", prompt, "--always-approve", ...(mode === "off" ? [] : [mode === "append" ? "--rules" : "--system-prompt-override", inline(personaText)])],
|
|
154
|
+
}),
|
|
155
|
+
omp: ({ prompt, personaText, mode }) => ({
|
|
156
|
+
cmd: "omp",
|
|
157
|
+
args: ["-p", ...(mode === "off" ? [] : [mode === "append" ? "--append-system-prompt" : "--system-prompt", inline(personaText)]), prompt],
|
|
158
|
+
}),
|
|
159
|
+
codex: ({ prompt, personaPath, personaText, mode }) => ({
|
|
160
|
+
cmd: "codex",
|
|
161
|
+
args: [
|
|
162
|
+
...(mode === "off"
|
|
163
|
+
? []
|
|
164
|
+
: ["-c", mode === "append" ? `developer_instructions=${tomlStr(inline(personaText))}` : `model_instructions_file=${tomlStr(personaPath.replace(/\\/g, "/"))}`]),
|
|
165
|
+
"exec",
|
|
166
|
+
prompt,
|
|
167
|
+
],
|
|
168
|
+
}),
|
|
169
|
+
opencode: ({ prompt, personaText, mode, cwd, root }) => {
|
|
170
|
+
if (mode === "off") return { cmd: "opencode", args: ["run", prompt] };
|
|
171
|
+
const b = backends.opencode({ personaText, mode, cwd, root, args: ["run", prompt] });
|
|
172
|
+
return b;
|
|
173
|
+
},
|
|
174
|
+
opencode2: ({ prompt, personaText, mode, root }) => {
|
|
175
|
+
if (mode === "off") return { cmd: "opencode2", args: ["run", prompt], privateServer: true };
|
|
176
|
+
const b = backends.opencode2({ personaText, mode, root, args: ["run", prompt] });
|
|
177
|
+
return b;
|
|
178
|
+
},
|
|
179
|
+
dsh: ({ prompt, personaText, mode, root }) => {
|
|
180
|
+
if (mode === "off") return { cmd: "dsh", args: ["--profile", "headless", prompt] };
|
|
181
|
+
// backends.dsh 会自己补 --profile headless,这里只给 prompt(否则重复)
|
|
182
|
+
return backends.dsh({ personaText, mode, root, args: [prompt] });
|
|
183
|
+
},
|
|
184
|
+
zcode: ({ prompt }) => ({
|
|
185
|
+
cmd: "zcode",
|
|
186
|
+
args: ["--prompt", prompt, "--mode", "yolo", "--output-format", "stream-json", "--no-color"],
|
|
187
|
+
note: "persona 对 zcode CLI 不生效:customSystemPrompt 只有 app-server/SDK 能传",
|
|
188
|
+
}),
|
|
189
|
+
codebuddy: ({ prompt, personaPath, personaText, mode }) => ({
|
|
190
|
+
cmd: "codebuddy",
|
|
191
|
+
args: [
|
|
192
|
+
"-p",
|
|
193
|
+
prompt,
|
|
194
|
+
"--max-turns",
|
|
195
|
+
"5",
|
|
196
|
+
...(mode === "off"
|
|
197
|
+
? []
|
|
198
|
+
: mode === "append"
|
|
199
|
+
? ["--append-system-prompt", inline(personaText)]
|
|
200
|
+
: ["--system-prompt-file", personaPath]),
|
|
201
|
+
],
|
|
202
|
+
}),
|
|
203
|
+
hermes: ({ prompt, personaText, personaPath, mode }) => backends.hermes({ personaText, personaPath, mode, args: ["-z", prompt] }),
|
|
204
|
+
};
|