claude-coder 1.5.6 → 1.6.2
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/README.md +3 -2
- package/bin/cli.js +27 -2
- package/docs/ARCHITECTURE.md +8 -8
- package/docs/PLAYWRIGHT_CREDENTIALS.md +123 -97
- package/docs/README.en.md +3 -2
- package/package.json +4 -2
- package/src/auth.js +171 -38
- package/src/config.js +20 -4
- package/src/hooks.js +13 -3
- package/src/indicator.js +19 -37
- package/src/prompts.js +38 -10
- package/src/runner.js +14 -2
- package/src/session.js +5 -3
- package/src/setup.js +37 -25
- package/src/tasks.js +5 -1
- package/src/validator.js +66 -38
- package/templates/CLAUDE.md +13 -40
- package/templates/SCAN_PROTOCOL.md +4 -4
- package/templates/test_rule.md +158 -0
- package/docs/PHASE_INJECTION_RESEARCH.md +0 -325
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
# 分阶段提示语注入 — 技术调研与方向探讨
|
|
2
|
-
|
|
3
|
-
> 状态:调研阶段,仅探讨,未实现
|
|
4
|
-
> 日期:2026-03-04
|
|
5
|
-
> 背景:当前所有 10 个 Hint 在 session 开始前一次性注入 user prompt。本文探讨利用 Hook 的 `additionalContext` 能力,将提示语拆分到不同阶段按需注入。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 当前架构
|
|
10
|
-
|
|
11
|
-
### 提示语注入时机
|
|
12
|
-
|
|
13
|
-
```mermaid
|
|
14
|
-
sequenceDiagram
|
|
15
|
-
participant H as Harness
|
|
16
|
-
participant SDK as Claude Agent SDK
|
|
17
|
-
participant Agent as Agent (Model)
|
|
18
|
-
|
|
19
|
-
H->>H: buildSystemPrompt()<br/>CLAUDE.md (~260行)
|
|
20
|
-
H->>H: buildCodingPrompt()<br/>10 个 Hint 全部拼接
|
|
21
|
-
H->>SDK: query({ prompt, options })
|
|
22
|
-
Note over SDK,Agent: 所有提示语一次性加载
|
|
23
|
-
|
|
24
|
-
loop Agent 自主运行
|
|
25
|
-
Agent->>SDK: 工具调用 (Read/Edit/Bash...)
|
|
26
|
-
SDK->>H: PreToolUse hook 回调
|
|
27
|
-
H->>H: inferPhaseStep() 更新 spinner
|
|
28
|
-
H->>H: 检查编辑循环
|
|
29
|
-
H-->>SDK: return {} (放行)
|
|
30
|
-
SDK->>Agent: 工具结果
|
|
31
|
-
end
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### 问题
|
|
35
|
-
|
|
36
|
-
| 问题 | 说明 |
|
|
37
|
-
|------|------|
|
|
38
|
-
| **Token 浪费** | 10 个 Hint 全部注入 user prompt,但大部分 Hint 仅在特定阶段有用(如 testHint 仅 Step 5 需要) |
|
|
39
|
-
| **注意力稀释** | 一次性注入大量指令,模型在真正需要某条指令时可能已"忘记"(context rot) |
|
|
40
|
-
| **时机错位** | 工具使用指导(Hint 10)在 Agent 还没开始读文件时就注入了,但 Agent 在 Step 4 编码阶段才真正需要这些规则 |
|
|
41
|
-
| **无法纠正** | 当前 Hook 仅用于监控和死循环拦截,无法在 Agent 做出低效工具选择时即时纠正 |
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## 2. Hook 能力盘点
|
|
46
|
-
|
|
47
|
-
### SDK 内联 Hook(当前使用方式)
|
|
48
|
-
|
|
49
|
-
通过 `query()` 的 `options.hooks` 定义,进程内回调:
|
|
50
|
-
|
|
51
|
-
```javascript
|
|
52
|
-
sdk.query({
|
|
53
|
-
prompt,
|
|
54
|
-
options: {
|
|
55
|
-
hooks: {
|
|
56
|
-
PreToolUse: [{ matcher: '*', hooks: [async (input) => { ... }] }],
|
|
57
|
-
PostToolUse: [{ matcher: '*', hooks: [async (input) => { ... }] }],
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
| Hook 事件 | SDK 内联支持 | 能力 |
|
|
64
|
-
|-----------|-------------|------|
|
|
65
|
-
| `PreToolUse` | 是 | `permissionDecision` (allow/deny/ask), `message`, **`additionalContext`** (v2.1.9+), `updatedInput` |
|
|
66
|
-
| `PostToolUse` | 是 | `decision` (block), `reason`, **`additionalContext`** |
|
|
67
|
-
| `UserPromptSubmit` | 是 | `decision` (block), `reason`, `additionalContext` |
|
|
68
|
-
| `Stop` | 是 | `decision` (block), `reason` |
|
|
69
|
-
| `SessionStart` | **否** (仅 CLI 声明式) | 不适用 |
|
|
70
|
-
| `SessionEnd` | **否** (仅 CLI 声明式) | 不适用 |
|
|
71
|
-
|
|
72
|
-
### `additionalContext` 关键特性
|
|
73
|
-
|
|
74
|
-
- **作用**: 将文本注入 Agent 的 context window,Agent 在后续推理中可以看到并遵循
|
|
75
|
-
- **注入位置**: 作为工具调用的附加上下文出现,紧邻工具结果
|
|
76
|
-
- **注意力**: 因为紧跟当前工具调用,处于模型注意力的高峰区域(recency zone)
|
|
77
|
-
- **限制**: 2026年1月新增,可能存在边缘 bug
|
|
78
|
-
|
|
79
|
-
### `decision: 'block'` + `message`(当前已在用)
|
|
80
|
-
|
|
81
|
-
- **作用**: 阻止工具调用,`message` 作为错误反馈传回模型
|
|
82
|
-
- **注意力**: 模型会将其视为"操作失败"信息,遵循率高
|
|
83
|
-
- **适用场景**: 拦截不当操作并引导替代方案
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## 3. 提议架构:分阶段注入
|
|
88
|
-
|
|
89
|
-
### 核心思想
|
|
90
|
-
|
|
91
|
-
**按 Agent 的工作阶段,在 Hook 中按需注入对应阶段的提示语。** 初始 prompt 仅包含最核心的内容(身份、任务、约束),其余指导在 Agent 进入相应阶段时即时注入。
|
|
92
|
-
|
|
93
|
-
```mermaid
|
|
94
|
-
sequenceDiagram
|
|
95
|
-
participant H as Harness
|
|
96
|
-
participant SDK as Claude Agent SDK
|
|
97
|
-
participant Agent as Agent
|
|
98
|
-
|
|
99
|
-
H->>SDK: query({ prompt: 精简版 })
|
|
100
|
-
Note over H: 仅注入: 身份 + 任务上下文 + 约束
|
|
101
|
-
|
|
102
|
-
rect rgb(200, 230, 255)
|
|
103
|
-
Note over Agent: Phase 1: 恢复上下文
|
|
104
|
-
Agent->>SDK: Read(.claude-coder/profile.json)
|
|
105
|
-
SDK->>H: PreToolUse
|
|
106
|
-
H-->>SDK: additionalContext: 路径提示 + 文档指引
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
rect rgb(200, 255, 200)
|
|
110
|
-
Note over Agent: Phase 2: 编码阶段
|
|
111
|
-
Agent->>SDK: Edit(src/app.ts)
|
|
112
|
-
SDK->>H: PreToolUse
|
|
113
|
-
H-->>SDK: additionalContext: 工具使用规范 + MultiEdit提示
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
rect rgb(255, 230, 200)
|
|
117
|
-
Note over Agent: Phase 3: 测试阶段
|
|
118
|
-
Agent->>SDK: Bash(curl ...)
|
|
119
|
-
SDK->>H: PreToolUse
|
|
120
|
-
H-->>SDK: additionalContext: 测试效率规则
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
rect rgb(230, 200, 255)
|
|
124
|
-
Note over Agent: Phase 4: 收尾阶段
|
|
125
|
-
Agent->>SDK: Bash(git commit)
|
|
126
|
-
SDK->>H: PreToolUse
|
|
127
|
-
H-->>SDK: additionalContext: 服务管理 + session_result 格式
|
|
128
|
-
end
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Hint 拆分方案
|
|
132
|
-
|
|
133
|
-
| # | Hint | 当前位置 | 建议注入时机 | 注入方式 |
|
|
134
|
-
|---|------|----------|-------------|----------|
|
|
135
|
-
| 1 | `reqSyncHint` | user prompt | **保留在 user prompt** | 需求变更需要在 Step 1 就知道 |
|
|
136
|
-
| 7 | `taskHint` | user prompt | **保留在 user prompt** | 任务上下文是 Agent 开始工作的前提 |
|
|
137
|
-
| 8 | `memoryHint` | user prompt | **保留在 user prompt** | 上次会话记忆需要一开始就有 |
|
|
138
|
-
| 5 | `envHint` | user prompt | **保留在 user prompt** | Step 2 环境检查需要一开始就知道 |
|
|
139
|
-
| 2 | `mcpHint` | user prompt | PreToolUse (Bash: curl/test) | 测试时才需要知道 Playwright 可用 |
|
|
140
|
-
| 3 | `testHint` | user prompt | PreToolUse (Bash: curl/test) | 测试时才需要避免重复验证 |
|
|
141
|
-
| 4 | `docsHint` | user prompt | PreToolUse (Read: 首次读文件) | 读文件时提醒先读文档 |
|
|
142
|
-
| 6 | `retryContext` | user prompt | **保留在 user prompt** | 重试上下文需要一开始就有 |
|
|
143
|
-
| 9 | `serviceHint` | user prompt | PreToolUse (Bash: git) | 收尾时才需要知道是否停服务 |
|
|
144
|
-
| 10 | `toolGuidance` | user prompt | PreToolUse (首次工具调用) | 开始使用工具时注入 |
|
|
145
|
-
|
|
146
|
-
**结论**: 10 个 Hint 中,5 个适合保留在初始 prompt(1, 5, 6, 7, 8),5 个适合延迟注入到 Hook(2, 3, 4, 9, 10)。
|
|
147
|
-
|
|
148
|
-
### 实现草案
|
|
149
|
-
|
|
150
|
-
```javascript
|
|
151
|
-
// session.js - PreToolUse hook 增强版(概念代码,仅供讨论)
|
|
152
|
-
const injected = new Set(); // 跟踪已注入的 Hint,每个仅注入一次
|
|
153
|
-
|
|
154
|
-
hooks: {
|
|
155
|
-
PreToolUse: [{
|
|
156
|
-
matcher: '*',
|
|
157
|
-
hooks: [async (input) => {
|
|
158
|
-
const name = input.tool_name;
|
|
159
|
-
const toolInput = input.tool_input || {};
|
|
160
|
-
let additionalContext = '';
|
|
161
|
-
|
|
162
|
-
// --- Phase: 读取文件 → 注入文档指引 ---
|
|
163
|
-
if (['Read', 'Glob', 'Grep', 'LS'].includes(name) && !injected.has('docs')) {
|
|
164
|
-
additionalContext += docsHint; // Hint 4
|
|
165
|
-
injected.add('docs');
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// --- Phase: 首次工具调用 → 注入工具使用规范 ---
|
|
169
|
-
if (!injected.has('toolGuide')) {
|
|
170
|
-
additionalContext += '\n' + toolGuidance; // Hint 10
|
|
171
|
-
injected.add('toolGuide');
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// --- Phase: 测试阶段 → 注入测试规则 ---
|
|
175
|
-
if (name === 'Bash') {
|
|
176
|
-
const cmd = toolInput.command || '';
|
|
177
|
-
if ((cmd.includes('curl') || cmd.includes('test') || cmd.includes('pytest'))
|
|
178
|
-
&& !injected.has('test')) {
|
|
179
|
-
additionalContext += '\n' + testHint; // Hint 3
|
|
180
|
-
additionalContext += '\n' + mcpHint; // Hint 2
|
|
181
|
-
injected.add('test');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// --- Phase: Git 操作 → 注入收尾提示 ---
|
|
185
|
-
if (cmd.includes('git ') && !injected.has('service')) {
|
|
186
|
-
additionalContext += '\n' + serviceHint; // Hint 9
|
|
187
|
-
injected.add('service');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// --- Bash 命令纠正(进阶) ---
|
|
192
|
-
if (name === 'Bash') {
|
|
193
|
-
const cmd = toolInput.command || '';
|
|
194
|
-
if (/\bgrep\b/.test(cmd) && !cmd.includes('rg ')) {
|
|
195
|
-
return {
|
|
196
|
-
permissionDecision: 'deny',
|
|
197
|
-
permissionDecisionReason: '请使用 Grep 工具替代 bash grep,效率更高且结果格式化更好。',
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
if (/\bfind\b/.test(cmd)) {
|
|
201
|
-
return {
|
|
202
|
-
permissionDecision: 'deny',
|
|
203
|
-
permissionDecisionReason: '请使用 Glob 工具替代 bash find。',
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
if (/\bcat\b/.test(cmd) && !cmd.includes('<<')) {
|
|
207
|
-
return {
|
|
208
|
-
permissionDecision: 'deny',
|
|
209
|
-
permissionDecisionReason: '请使用 Read 工具替代 bash cat。',
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// --- 编辑循环检测(已有功能) ---
|
|
215
|
-
// ... existing loop detection code ...
|
|
216
|
-
|
|
217
|
-
// 注入上下文
|
|
218
|
-
if (additionalContext.trim()) {
|
|
219
|
-
return { additionalContext: additionalContext.trim() };
|
|
220
|
-
}
|
|
221
|
-
return {};
|
|
222
|
-
}]
|
|
223
|
-
}]
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## 4. Bash 命令拦截:工具纠正的最短路径
|
|
230
|
-
|
|
231
|
-
在完整的分阶段注入之前,有一个**低成本高收益**的中间步骤:在 PreToolUse hook 中拦截 Agent 使用 Bash 执行低效命令(grep/find/cat/ls/head/tail),引导其使用专用工具。
|
|
232
|
-
|
|
233
|
-
### 行为矩阵
|
|
234
|
-
|
|
235
|
-
| Agent 执行 | Hook 行为 | 反馈给 Agent |
|
|
236
|
-
|------------|----------|-------------|
|
|
237
|
-
| `Bash: grep -r "pattern" .` | **deny** | "请使用 Grep 工具替代 bash grep" |
|
|
238
|
-
| `Bash: find . -name "*.ts"` | **deny** | "请使用 Glob 工具替代 bash find" |
|
|
239
|
-
| `Bash: cat src/app.ts` | **deny** | "请使用 Read 工具替代 bash cat" |
|
|
240
|
-
| `Bash: ls -la` | **deny** | "请使用 LS 工具替代 bash ls" |
|
|
241
|
-
| `Bash: head -20 file.txt` | **deny** | "请使用 Read 工具(支持 offset/limit)替代 bash head" |
|
|
242
|
-
| `Bash: npm test` | allow | -- |
|
|
243
|
-
| `Bash: git commit` | allow + additionalContext | 注入收尾提示 |
|
|
244
|
-
|
|
245
|
-
### 优势
|
|
246
|
-
|
|
247
|
-
- **确定性**: Hook 拦截是确定性的,不依赖模型是否"记住"了 prompt 中的工具规则
|
|
248
|
-
- **即时纠正**: 在 Agent 犯错的那一刻就纠正,而不是等它浪费完 context
|
|
249
|
-
- **渐进式**: 可以先实现拦截(deny + message),后续再加 additionalContext
|
|
250
|
-
- **非 Claude 模型必需**: qwen/deepseek 等模型对 prompt 的遵循率不如 Claude,但 deny 是硬性拦截,模型无法绕过
|
|
251
|
-
|
|
252
|
-
### 风险
|
|
253
|
-
|
|
254
|
-
| 风险 | 缓解方案 |
|
|
255
|
-
|------|----------|
|
|
256
|
-
| 误拦截合法 Bash 命令(如 `cat <<EOF` heredoc) | 正则匹配需要排除 heredoc、管道等场景 |
|
|
257
|
-
| 某些 grep 用法没有 Grep 工具替代(如 `grep -c`) | 只拦截简单模式,复杂 grep 放行 |
|
|
258
|
-
| 过度拦截导致 Agent 陷入循环 | 每种拦截最多触发 2 次,第 3 次放行 |
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## 5. 与现有方案的对比
|
|
263
|
-
|
|
264
|
-
| 维度 | 当前方案 | 分阶段注入 | Bash 拦截纠正 |
|
|
265
|
-
|------|---------|-----------|-------------|
|
|
266
|
-
| 实现复杂度 | 低 | 高 | 中 |
|
|
267
|
-
| Token 效率 | 低(全量注入) | 高(按需注入) | 不变(不影响初始 prompt) |
|
|
268
|
-
| 注意力效果 | 中(U型优化) | 高(时机精准) | 高(即时纠正,deny 不可忽略) |
|
|
269
|
-
| 非 Claude 模型支持 | 中(靠 prompt) | 高(时机 + prompt) | **最高(硬性拦截)** |
|
|
270
|
-
| 风险 | 低 | 中(additionalContext 较新) | 低(deny 已验证) |
|
|
271
|
-
| 依赖 SDK 版本 | 无 | v2.1.9+(additionalContext) | 无(deny + message 已有) |
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
## 6. 建议路线图
|
|
276
|
-
|
|
277
|
-
### P0 — 立即可做(不依赖新 SDK 特性)
|
|
278
|
-
|
|
279
|
-
**Bash 命令拦截纠正**
|
|
280
|
-
|
|
281
|
-
在现有 PreToolUse hook 中增加 bash 命令检测,对 `grep`/`find`/`cat`/`ls`/`head`/`tail` 返回 `deny + message` 引导使用专用工具。这是最短路径、最高确定性的优化。
|
|
282
|
-
|
|
283
|
-
### P1 — 短期(需要验证 additionalContext)
|
|
284
|
-
|
|
285
|
-
**工具使用指导延迟注入**
|
|
286
|
-
|
|
287
|
-
将 Hint 10(toolGuidance)从初始 prompt 移到 PreToolUse hook 的 `additionalContext`,在 Agent 首次使用工具时注入。验证 `additionalContext` 在非 Claude 模型上的效果。
|
|
288
|
-
|
|
289
|
-
### P2 — 中期
|
|
290
|
-
|
|
291
|
-
**测试/收尾阶段指导延迟注入**
|
|
292
|
-
|
|
293
|
-
将 Hint 2/3/9 移到 PreToolUse hook,按阶段(test/git)触发注入。
|
|
294
|
-
|
|
295
|
-
### P3 — 远期
|
|
296
|
-
|
|
297
|
-
**完整分阶段注入**
|
|
298
|
-
|
|
299
|
-
所有可延迟的 Hint 通过 Hook 按需注入。初始 prompt 仅保留身份、任务、约束。配合 `additionalContext` 的 PostToolUse 版本,实现"编码后注入代码审查提示"等高级场景。
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## 7. 学术/行业参考
|
|
304
|
-
|
|
305
|
-
| 来源 | 核心概念 | 与本方案的关联 |
|
|
306
|
-
|------|----------|---------------|
|
|
307
|
-
| Anthropic Context Engineering (2025) | Context 是有限资源,需精心管理 | 按需注入减少 context 浪费 |
|
|
308
|
-
| Claude Code System Prompt (gist) | 每个工具都有 "when to use / when NOT to use" 指导 | Hint 10 和 Bash 拦截复现这一设计 |
|
|
309
|
-
| SWE-Agent (2024) ACI | Agent-Computer Interface 设计应优化工具发现和使用 | Hook 即时纠正是 ACI 的运行时优化 |
|
|
310
|
-
| Anthropic "Writing effective tools for agents" (2025) | 工具设计影响 Agent 行为,工具在 context 中很显眼 | 扩展 allowedTools 让工具自然出现在模型视野 |
|
|
311
|
-
| ContextBench (2025) | 复杂脚手架边际收益递减 | 不过度设计分阶段注入,先做确定性拦截 |
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## 8. 结论
|
|
316
|
-
|
|
317
|
-
当前 harness 的提示语架构已经相当成熟(U型注意力 + 10个条件Hint + recency zone 注入)。下一步优化的核心方向是**从"一次性全量注入"向"按需分阶段注入"演进**,但需要渐进式推进:
|
|
318
|
-
|
|
319
|
-
1. **先做 Bash 命令拦截**(P0)— 零风险,最高确定性,不依赖新 SDK 特性
|
|
320
|
-
2. **验证 `additionalContext`**(P1)— 确认非 Claude 模型是否能看到并遵循
|
|
321
|
-
3. **逐步迁移 Hint**(P2-P3)— 每次迁移一个 Hint,A/B 测试效果
|
|
322
|
-
|
|
323
|
-
**核心原则:确定性拦截(Hook deny)> 即时注入(additionalContext)> 初始 prompt 指导(Hint)> 系统 prompt 规则(CLAUDE.md)**
|
|
324
|
-
|
|
325
|
-
这个优先级排序体现了一个关键洞察:**越靠近行为发生的时刻,指导的遵循率越高**。
|