claude-coder 1.6.2 → 1.7.0

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.
@@ -1,516 +0,0 @@
1
- # Claude Coder — 技术架构文档
2
-
3
- > 本文件面向开发者和 AI,用于快速理解本工具的设计、文件结构、提示语架构和扩展方向。
4
-
5
- ---
6
-
7
- ## 一句话定位
8
-
9
- 一个基于 Claude Agent SDK 的**自主编码 harness**:自动扫描项目 → 拆解任务 → 逐个实现 → 校验 → 回滚/重试 → 推送,全程无需人工干预。
10
-
11
- ---
12
-
13
- ## 0. 核心设计规则(MUST READ)
14
-
15
- > 以下规则按重要性排序(注意力 primacy zone),所有代码修改和架构决策必须遵循。
16
-
17
- ### 规则 1:长 Session 不停工
18
-
19
- Agent 在单次 session 中应最大化推进任务进度。**任何非致命问题都不应中断 session**。
20
-
21
- - 缺少 API Key → 用 mock 或代码逻辑验证替代,记录到 `test.env`,继续推进
22
- - 测试环境未就绪 → 跳过该测试步骤,完成其余可验证的步骤
23
- - 服务启动失败 → 尝试排查修复,无法修复则记录问题后推进代码实现
24
- - **长时间思考是正常行为**:模型处理大文件(如 500+ 行的代码文件)时可能出现 10-20 分钟的思考间隔,不代表卡死
25
-
26
- **反面案例**:Agent 因 `OPENAI_API_KEY` 缺失直接标记任务 `failed` → 浪费整个 session
27
-
28
- > Harness 兜底机制:当工具调用间隔超过 `SESSION_STALL_TIMEOUT`(默认 30 分钟)时自动中断 session 并触发 rollback + 重试。此阈值设计为远超正常思考时长,仅捕捉真正的卡死场景。
29
-
30
- ### 规则 2:回滚即彻底回滚
31
-
32
- `git reset --hard` 是全量回滚,不做部分文件保护。
33
-
34
- - 凭证文件(`test.env`、`playwright-auth.json`、`browser-profile/`)应通过 `.gitignore` 排除在 git 之外
35
- - 如果回滚发生,说明 session 确实失败,代码应全部还原
36
- - 不需要 backup/restore 机制 — 这是过度设计
37
-
38
- ### 规则 3:分层校验(fatal / recoverable / pass)
39
-
40
- 不是所有校验失败都需要回滚:
41
-
42
- | 情况 | 有新 commit | 处理 |
43
- |------|------------|------|
44
- | session_result.json 格式异常 | 是 | **warn** — 代码已提交且可能正确,不回滚 |
45
- | session_result.json 格式异常 | 否 | **fatal** — 无进展,回滚 |
46
- | 代码结构性错误 | — | **fatal** — 回滚 |
47
- | 全部通过 | — | **pass** — 推送 |
48
-
49
- ### 规则 4:凭证与代码分离
50
-
51
- | 文件 | git 状态 | 说明 |
52
- |------|---------|------|
53
- | `test.env` | .gitignore | Agent 可写入发现的 API Key、测试账号 |
54
- | `playwright-auth.json` | .gitignore | cookies + localStorage 快照(isolated 模式,`claude-coder auth` 生成) |
55
- | `.runtime/browser-profile/` | .gitignore | 持久化浏览器 Profile(persistent 模式,`claude-coder auth` 生成) |
56
- | `session_result.json` | git-tracked | Agent 每次 session 覆盖写入 |
57
- | `tasks.json` | git-tracked | Agent 修改 status 字段 |
58
-
59
- ### 规则 5:Harness 准备上下文,Agent 直接执行
60
-
61
- Agent 不应浪费工具调用读取 harness 已知的数据。所有可预读的上下文通过 prompt hint 注入(见第 5 节 Prompt 注入架构)。
62
-
63
- ### 规则 6:停顿检测 — 模型卡死自动恢复
64
-
65
- 模型可能长时间「思考」但不调用工具(20+ 分钟无进展)。Harness 通过 PreToolUse hook 追踪最后一次工具调用时间:
66
-
67
- - 无工具调用 > `SESSION_STALL_TIMEOUT`(默认 1800 秒 / 30 分钟) → 自动中断 session
68
- - 中断后进入 runner 的重试逻辑(连续失败 ≥ 3 次 → 标记 task failed)
69
- - Spinner 在无工具调用 > 2 分钟时显示红色警告
70
-
71
- 配置方式:`.claude-coder/.env` 中设置 `SESSION_STALL_TIMEOUT=1800`(秒)
72
-
73
- ---
74
-
75
- ## 1. 核心架构
76
-
77
- ```mermaid
78
- flowchart TB
79
- subgraph Harness["bin/cli.js → src/runner.js (Harness 主控)"]
80
- direction TB
81
- scan["scanner.scan()<br/>首次扫描"]
82
- coding["session.runCodingSession()<br/>编码循环"]
83
- validate["validator.validate()<br/>校验"]
84
- indicator["Indicator 类<br/>setInterval 500ms 刷新"]
85
- end
86
-
87
- subgraph SDK["Claude Agent SDK"]
88
- query["query() 函数"]
89
- hook_sys["PreToolUse hook<br/>hooks.js 工厂"]
90
- end
91
-
92
- subgraph Files["文件系统 (.claude-coder/)"]
93
- direction TB
94
- profile["project_profile.json<br/>tasks.json"]
95
- runtime["session_result.json<br/>progress.json"]
96
- phase[".runtime/<br/>phase / step / logs/"]
97
- end
98
-
99
- scan -->|"systemPrompt =<br/>CLAUDE.md + SCAN_PROTOCOL.md"| query
100
- coding -->|"systemPrompt = CLAUDE.md"| query
101
-
102
- query -->|PreToolUse 事件| hook_sys
103
- hook_sys -->|inferPhaseStep()| indicator
104
-
105
- query -->|Agent 工具调用| Files
106
- validate -->|读取| runtime
107
- validate -->|"pass → 下一 session<br/>fatal → rollback<br/>recoverable + commit → warn"| coding
108
- ```
109
-
110
- **核心特征:**
111
- - **项目无关**:项目信息由 Agent 扫描后存入 `project_profile.json`,harness 不含项目特定逻辑
112
- - **可恢复**:通过 `session_result.json` 跨会话记忆,任意 session 可断点续跑
113
- - **可观测**:SDK 内联 `PreToolUse` hook 实时显示当前工具、操作目标和停顿警告
114
- - **自愈**:编辑死循环检测 + 停顿超时自动中断 + runner 重试机制
115
- - **跨平台**:纯 Node.js 实现,macOS / Linux / Windows 通用
116
- - **零依赖**:`dependencies` 为空,Claude Agent SDK 作为 peerDependency
117
-
118
- ---
119
-
120
- ## 2. 执行流程
121
-
122
- ```mermaid
123
- flowchart LR
124
- start(["claude-coder run ..."]) --> mode{模式?}
125
-
126
- mode -->|"add 指令"| add["runAddSession()"]
127
- add --> exit_add([exit 0])
128
-
129
- mode -->|run| check{profile<br/>存在?}
130
-
131
- check -->|否| req["读取<br/>requirements.md"]
132
- req --> scan["scanner.scan()"]
133
- scan --> profile_out["生成<br/>profile + tasks.json"]
134
- profile_out --> loop
135
-
136
- check -->|是| loop
137
-
138
- loop["编码循环"] --> session["runCodingSession(N)"]
139
- session --> val["validator.validate()"]
140
- val -->|pass| push["git push"]
141
- push --> done_check{所有任务<br/>done?}
142
- done_check -->|否| pause_check{每N个session<br/>暂停?}
143
- pause_check -->|继续| session
144
- done_check -->|是| finish([完成])
145
-
146
- val -->|fatal| rollback["git reset --hard"]
147
- rollback --> retry_check{连续失败<br/>≥3次?}
148
- retry_check -->|否| session
149
- retry_check -->|是| mark_failed["标记 task failed"]
150
- mark_failed --> session
151
- ```
152
-
153
- ---
154
-
155
- ## 3. 模块职责
156
-
157
- ```
158
- bin/cli.js CLI 入口:参数解析、命令路由
159
- src/
160
- config.js 配置管理:.env 加载、模型映射、环境变量构建、全局同步
161
- runner.js 主循环:scan → session → validate → retry/rollback
162
- session.js SDK 交互:query() 调用、SDK 加载、日志流
163
- hooks.js Hook 工厂:停顿检测 + 编辑死循环防护(可复用于所有 session 类型)
164
- prompts.js 提示语构建:系统 prompt 组合 + 条件 hint + 任务分解指导
165
- init.js 环境初始化:读取 profile 执行依赖安装、服务启动、健康检查
166
- scanner.js 初始化扫描:调用 runScanSession + 重试
167
- validator.js 校验引擎:分层校验(fatal/recoverable/pass)+ git 检查 + 测试覆盖
168
- tasks.js 任务管理:CRUD + 状态机 + 进度展示
169
- auth.js Playwright 凭证:导出登录状态 + MCP 配置 + gitignore
170
- indicator.js 进度指示:终端 spinner + 工具目标显示 + 停顿警告 + phase/step 文件写入
171
- setup.js 交互式配置:模型选择、API Key、MCP 工具
172
- templates/
173
- CLAUDE.md Agent 协议(注入为 systemPrompt)
174
- SCAN_PROTOCOL.md 首次扫描协议(与 CLAUDE.md 拼接注入)
175
- requirements.example.md 需求文件模板
176
- ```
177
-
178
- ---
179
-
180
- ## 4. 文件清单
181
-
182
- ### npm 包分发内容
183
-
184
- | 文件 | 用途 |
185
- |------|------|
186
- | `bin/cli.js` | CLI 入口 |
187
- | `src/config.js` | .env 加载、模型映射 |
188
- | `src/runner.js` | Harness 主循环 |
189
- | `src/session.js` | SDK query() 封装 + 日志流 |
190
- | `src/hooks.js` | Hook 工厂(停顿检测 + 编辑防护,可复用于所有 session 类型) |
191
- | `src/prompts.js` | 提示语构建(系统 prompt + 条件 hint + 任务分解指导) |
192
- | `src/init.js` | 环境初始化(依赖安装、服务启动) |
193
- | `src/scanner.js` | 项目初始化扫描 |
194
- | `src/validator.js` | 校验引擎(分层校验) |
195
- | `src/tasks.js` | 任务 CRUD + 状态机 |
196
- | `src/auth.js` | Playwright 凭证持久化 |
197
- | `src/indicator.js` | 终端进度指示器 |
198
- | `src/setup.js` | 交互式配置向导 |
199
- | `templates/CLAUDE.md` | Agent 协议 |
200
- | `templates/SCAN_PROTOCOL.md` | 首次扫描协议 |
201
-
202
- ### 用户项目运行时数据(.claude-coder/)
203
-
204
- | 文件 | 生成时机 | 用途 |
205
- |------|----------|------|
206
- | `.env` | `claude-coder setup` | 模型配置 + API Key(gitignored) |
207
- | `project_profile.json` | 首次扫描 | 项目元数据 |
208
- | `tasks.json` | 首次扫描 | 任务列表 + 状态跟踪 |
209
- | `progress.json` | 每次 session 结束 | 结构化会话日志 + 成本记录 |
210
- | `session_result.json` | 每次 session 结束 | 当前 session 结果(扁平格式,向后兼容旧 `current` 包装) |
211
- | `playwright-auth.json` | `claude-coder auth`(isolated 模式) | 浏览器 cookies + localStorage 快照 |
212
- | `.runtime/browser-profile/` | `claude-coder auth`(persistent 模式) | 持久化浏览器 Profile(MCP 通过 `--user-data-dir` 使用) |
213
- | `tests.json` | 首次测试时 | 验证记录(防止反复测试) |
214
- | `.runtime/` | 运行时 | 临时文件(logs/、browser-profile/);工具调用记录合并到 session log |
215
-
216
- ---
217
-
218
- ## 5. Prompt 注入架构
219
-
220
- ### 架构图
221
-
222
- ```mermaid
223
- flowchart TB
224
- subgraph Templates["templates/ (静态模板)"]
225
- claude_md["CLAUDE.md<br/>Agent 协议 ~255 行"]
226
- scan_md["SCAN_PROTOCOL.md<br/>扫描协议 ~133 行"]
227
- end
228
-
229
- subgraph Prompts["src/prompts.js (动态构建)"]
230
- sys_p["buildSystemPrompt()<br/>组合系统提示"]
231
- coding_p["buildCodingPrompt()<br/>编码 session prompt"]
232
- task_g["buildTaskGuide()<br/>任务分解指导"]
233
- scan_p["buildScanPrompt()<br/>扫描 session prompt"]
234
- add_p["buildAddPrompt()"]
235
- end
236
-
237
- subgraph Session["src/session.js (SDK 调用)"]
238
- query["SDK query()<br/>systemPrompt + prompt"]
239
- end
240
-
241
- claude_md --> sys_p
242
- scan_md --> sys_p
243
- sys_p --> query
244
- coding_p --> query
245
- task_g --> scan_p
246
- task_g --> add_p
247
- scan_p --> query
248
- add_p --> query
249
- ```
250
-
251
- ### Session 类型与注入内容
252
-
253
- | Session 类型 | systemPrompt | user prompt | 触发条件 |
254
- |---|---|---|---|
255
- | **编码** | CLAUDE.md | `buildCodingPrompt()` + 11 个条件 hint | 主循环每次迭代 |
256
- | **扫描** | CLAUDE.md + SCAN_PROTOCOL.md | `buildScanPrompt()` + 任务分解指导 + profile 质量要求 | 首次运行 |
257
- | **追加** | 精简角色提示(不注入 CLAUDE.md) | `buildAddPrompt()` + 任务分解指导 + session_result 格式 | `claude-coder add` |
258
-
259
- ### 编码 Session 的 11 个条件 Hint
260
-
261
- | # | Hint | 触发条件 | 影响 |
262
- |---|---|---|---|
263
- | 1 | `mcpHint` | MCP_PLAYWRIGHT=true | Step 5:可用 Playwright |
264
- | 2 | `retryContext` | 上次校验失败 | 全局:避免同样错误 |
265
- | 3 | `envHint` | 连续成功且 session>1 | Step 2:跳过 init |
266
- | 4 | `testHint` | tests.json 有记录 | Step 5:避免重复验证 |
267
- | 5 | `docsHint` | profile.existing_docs 非空或 profile 有缺陷 | Step 4:读文档后再编码;profile 缺陷时提示 Agent 在 Step 6 补全 services/docs |
268
- | 6 | `taskHint` | tasks.json 存在且有待办任务 | Step 1:跳过读取 tasks.json,harness 已注入当前任务上下文 + 项目绝对路径 |
269
- | 6b | `testEnvHint` | 始终注入(内容因 test.env 是否存在而不同) | Step 5:存在时提示加载;不存在时告知可创建 |
270
- | 6c | `playwrightAuthHint` | MCP_PLAYWRIGHT=true(按 playwrightMode 动态生成) | Step 5:告知 Agent 当前 Playwright 模式(persistent/isolated/extension)及认证状态 |
271
- | 7 | `memoryHint` | session_result.json 存在(扁平格式) | Step 1:跳过读取 session_result.json,harness 已注入上次会话摘要 |
272
- | 8 | `serviceHint` | 始终注入 | Step 6:单次模式停止服务,连续模式保持服务运行 |
273
- | 9 | `toolGuidance` | 始终注入 | 全局:工具使用规范(Grep/Glob/Read/LS/MultiEdit/Task 替代 bash 命令),非 Claude 模型必需 |
274
-
275
- ---
276
-
277
- ## 6. 注意力机制与设计决策
278
-
279
- ### U 型注意力优化
280
-
281
- CLAUDE.md 的内容按 LLM 注意力 U 型曲线排列:
282
-
283
- ```
284
- 顶部 (primacy zone) → 铁律(约束规则) → 最高遵循率
285
- 中部 (低注意力区) → 参考数据(文件格式等) → 按需查阅
286
- 底部 (recency zone) → 6 步工作流(行动指令) → 最高行为合规率
287
- ```
288
-
289
- ### 关键设计决策
290
-
291
- | 决策 | 理由 |
292
- |------|------|
293
- | **静态规则 vs 动态上下文分离** | CLAUDE.md 是"宪法"(低频修改),hints 依赖运行时状态(动态生成) |
294
- | **扫描协议单独文件** | 仅首次注入,编码 session 不需要,节省 ~2000 token |
295
- | **任务分解指导在 user prompt** | 从系统 prompt 中部(低注意力)迁移到 user prompt(recency zone),提升遵循率 |
296
- | **docsHint 动态注入** | 当 profile.existing_docs 非空时,在 user prompt 提醒 Agent 读文档再编码。CLAUDE.md Step 4 有静态指令,docsHint 在 recency zone 强化 |
297
- | **tests.json 保留 last_run_session** | Agent 判断是否需要重新验证的依据(代码可能在中间 session 被修改) |
298
- | **prompts.js 集中管理** | 所有 prompt 文本一处可见,与 session.js 的 SDK 交互职责分离 |
299
-
300
- ### 学术依据
301
-
302
- | 优化项 | 理论来源 |
303
- |---|---|
304
- | U 型注意力布局 | Anthropic Context Engineering |
305
- | DAG 依赖约束 | ACONIC (2025, arXiv 2510.07772) |
306
- | 反面案例排除 | SCoT (2023) + Expert Context Framework |
307
- | scan/add 复用 taskGuide | User Story Decomposition (SSRN 2025) |
308
-
309
- ---
310
-
311
- ## 7. Hook 数据流
312
-
313
- SDK 的 hooks 是**进程内回调**(非独立进程),零延迟、无 I/O 开销:
314
-
315
- ```mermaid
316
- sequenceDiagram
317
- participant SDK as Claude Agent SDK
318
- participant Hook as inferPhaseStep()
319
- participant Ind as Indicator (setInterval)
320
- participant Stall as stallChecker (30s)
321
- participant Term as 终端
322
-
323
- SDK->>Hook: PreToolUse 回调<br/>{tool_name: "Edit", tool_input: {path: "src/app.tsx"}}
324
- Hook->>Hook: 推断阶段: Edit → coding
325
- Hook->>Ind: updatePhase("coding")
326
- Hook->>Ind: lastToolTime = now
327
- Hook->>Ind: toolTarget = "src/app.tsx"
328
- Hook->>Ind: appendActivity("Edit", "src/app.tsx")
329
-
330
- Note over SDK,Hook: 同步回调,return {decision: "allow"}
331
-
332
- loop 每 500ms
333
- Ind->>Term: ⠋ [Session 3] 编码中 02:15 | 读取文件: ppt_generator.py
334
- end
335
-
336
- loop 每 30s
337
- Stall->>Ind: 检查 now - lastToolTime
338
- alt 超过 STALL_TIMEOUT
339
- Stall->>SDK: stallDetected = true → break for-await
340
- end
341
- end
342
- ```
343
-
344
- ---
345
-
346
- ## 8. 评分
347
-
348
- | 维度 | 评分 | 说明 |
349
- |------|------|------|
350
- | **CLAUDE.md 系统提示** | 8/10 | U 型注意力设计;铁律清晰;状态机和 6 步流程是核心竞争力 |
351
- | **动态 prompt** | 9/10 | 10 个条件 hint 精准注入,含 task/memory 上下文注入 + cwd 路径 + test.env + 服务管理 + 工具使用指导,减少 Agent 冗余操作 |
352
- | **SCAN_PROTOCOL.md** | 8.5/10 | 新旧项目分支完整,profile 格式全面 |
353
- | **tests.json 设计** | 7.5/10 | 精简字段,核心目的(防反复测试)明确 |
354
- | **注入时机** | 9/10 | 静态规则 vs 动态上下文分离干净 |
355
- | **整体架构** | 8/10 | 文件组织清晰,prompts.js 分离提升可维护性 |
356
-
357
- ---
358
-
359
- ## 9. Context Injection 架构(v1.0.4+)
360
-
361
- ### 设计原则
362
-
363
- **Harness 准备上下文,Agent 直接执行。** Agent 不应浪费工具调用读取 harness 已知的数据。
364
-
365
- ### 优化前后对比
366
-
367
- ```mermaid
368
- flowchart TD
369
- subgraph before ["优化前:Agent 自行读取"]
370
- A1[Agent starts] --> A2["Read tasks.json"]
371
- A2 --> A3["Read profile.json"]
372
- A3 --> A4["Read session_result.json"]
373
- A4 --> A5["Read requirements.md"]
374
- A5 --> A6["Read tests.json"]
375
- A6 --> A7["开始编码(5+ Read 调用浪费)"]
376
- end
377
-
378
- subgraph after ["优化后:Harness 注入上下文"]
379
- B1["Harness 预读文件"] --> B2["注入 Hint 6: 任务上下文"]
380
- B1 --> B3["注入 Hint 7: 会话记忆"]
381
- B2 --> B4["Agent prompt 就绪"]
382
- B3 --> B4
383
- B4 --> B5["Agent 直接开始编码"]
384
- end
385
- ```
386
-
387
- ### Hint 6: 任务上下文注入
388
-
389
- Harness 在 `buildCodingPrompt()` 中预读 `tasks.json`,将下一个待办任务的 id、description、category、steps 数量和整体进度注入 user prompt。Agent 无需自行读取 `tasks.json`。
390
-
391
- ### Hint 7: 会话记忆注入
392
-
393
- Harness 在 `buildCodingPrompt()` 中预读 `session_result.json`,将上次会话的 task_id、结果和 notes 摘要注入 user prompt。Agent 无需自行读取历史 session 数据。
394
-
395
- ### 自愈机制
396
-
397
- **编辑死循环检测**:PreToolUse hook 追踪每个文件的编辑次数,同一文件 Write/Edit 超 5 次 → `decision: "block"`。
398
-
399
- **停顿超时检测**:每 30 秒检查 `indicator.lastToolTime`,若距上次工具调用超过 `SESSION_STALL_TIMEOUT`(默认 1800 秒 / 30 分钟),自动 `break` 退出并触发 rollback + 重试。
400
- > 注意:模型在处理复杂文件时可能出现 10-20 分钟的长时间思考,这是正常行为。超时设为 30 分钟以避免误杀正常思考。可通过 `.env` 中 `SESSION_STALL_TIMEOUT=秒数` 自定义。
401
-
402
- ### 文件权限模型
403
-
404
- | 文件 | 写入方 | Agent 权限 | git 状态 |
405
- |------|--------|-----------|---------|
406
- | `progress.json` | Harness | 只读 | tracked |
407
- | `session_result.json` | Agent 每次 session 覆盖写入(扁平格式) | 写入 | tracked |
408
- | `tasks.json` | Agent(仅 `status` 字段) | 修改 `status` | tracked |
409
- | `project_profile.json` | Agent(仅扫描阶段) | 扫描时写入 | tracked |
410
- | `test.env` | Agent + 用户 | 可追加写入 | .gitignore |
411
- | `playwright-auth.json` | 用户(`claude-coder auth`,isolated 模式) | cookies + localStorage 快照 | .gitignore |
412
- | `.runtime/browser-profile/` | 用户(`claude-coder auth`,persistent 模式) | 持久化浏览器 Profile | .gitignore |
413
-
414
- ---
415
-
416
- ## 10. Claude Agent SDK V1/V2 对比与迁移计划
417
-
418
- 当前使用 **V1 稳定 API**(`query()`),V2 为 preview 状态(`unstable_` 前缀)。
419
-
420
- ### V1 vs V2 API 对比
421
-
422
- | 维度 | V1 `query()` | V2 `send()/stream()` |
423
- |------|-------------|---------------------|
424
- | **状态** | 稳定,生产可用 | `unstable_` 前缀,preview |
425
- | **入口函数** | `query({ prompt, options })` | `unstable_v2_createSession(opts)` / `unstable_v2_prompt()` |
426
- | **多轮会话** | 需手动管理 AsyncGenerator | `session.send()` + `session.stream()`,更简洁 |
427
- | **会话恢复** | `options.resume: sessionId` | `unstable_v2_resumeSession(id)` |
428
- | **Hooks** | `options.hooks: { PreToolUse, PostToolUse, ... }` | 未支持 |
429
- | **Subagents** | `options.agents: { name: AgentDefinition }` | 未支持 |
430
- | **Session Fork** | `options.forkSession: true` | 未支持 |
431
- | **Plugins** | `options.plugins: [{ type, path }]` | 未支持 |
432
- | **结构化输出** | `options.outputFormat: { type: 'json_schema', schema }` | 支持 |
433
- | **文件检查点** | `options.enableFileCheckpointing + rewindFiles()` | 未明确 |
434
- | **Cost Tracking** | `SDKResultMessage.total_cost_usd` | `SDKResultMessage.total_cost_usd` |
435
- | **权限控制** | `canUseTool`, `permissionMode`, `allowedTools`, `disallowedTools` | 继承 |
436
-
437
- ### 当前实现使用的 V1 特性
438
-
439
- ```javascript
440
- query({
441
- prompt,
442
- options: {
443
- systemPrompt, // 注入 CLAUDE.md
444
- allowedTools, // 工具白名单
445
- permissionMode: 'bypassPermissions',
446
- allowDangerouslySkipPermissions: true,
447
- model, // 从 .env 传入
448
- env, // 环境变量透传
449
- settingSources: ['project'], // 加载项目 CLAUDE.md
450
- hooks: { PreToolUse: [...] }, // 实时 spinner 监控
451
- }
452
- })
453
- ```
454
-
455
- ### V2 迁移条件(等待稳定后)
456
-
457
- 1. V2 去掉 `unstable_` 前缀,正式发布
458
- 2. V2 支持 Hooks(当前项目依赖 PreToolUse 做 spinner 和日志记录)
459
- 3. V2 支持 Subagents(未来可能用于扫描 Agent / 编码 Agent 分离)
460
-
461
- ### 可利用但尚未使用的 V1 特性
462
-
463
- | 特性 | 说明 | 优先级 |
464
- |------|------|--------|
465
- | `maxBudgetUsd` | SDK 内置成本上限,替代自研追踪 | P0 |
466
- | `effort` | 控制思考深度(`low`/`medium`/`high`/`max`) | P1 |
467
- | `enableFileCheckpointing` | 文件操作检查点,比 git reset 更精细 | P1 |
468
- | `outputFormat` | 结构化输出,让 Agent 直接输出 JSON 格式 | P1 |
469
- | `agents` | 定义子 Agent,不同模型/工具集 | P2 |
470
- | `betas` | 扩展上下文窗口 | P2 |
471
-
472
- ---
473
-
474
- ## 11. 后续优化方向
475
-
476
- ### P0 — 近期
477
-
478
- | 方向 | 说明 |
479
- |------|------|
480
- | **TCR 纪律** | Test && Commit \|\| Revert,可配置 strict/smart/off |
481
- | **配置分层** | defaults.env → .env → .env.local 三层合并 |
482
- | **Reminders 注入** | 用户自定义提醒文件,拼接到编码 prompt |
483
- | **MCP 工具自动检测** | `claude mcp list` 自动启用已安装工具 |
484
-
485
- ### P1 — 远期
486
-
487
- | 方向 | 说明 |
488
- |------|------|
489
- | **TUI 终端监控** | 基于 ANSI 的全屏界面,替代单行 spinner |
490
- | **Web UI 监控** | 可选插件包 `@claude-coder/web-ui` |
491
- | **PR/CI 集成** | Session 完成后自动创建 PR、监控 CI |
492
- | **Prompt A/B 测试** | 多版本 CLAUDE.md 并行对比效果 |
493
- | **并行 Worktree** | 多任务在不同 git worktree 中并行执行 |
494
-
495
- ---
496
-
497
- ## 实现原则
498
-
499
- > 核心设计规则见 Section 0(primacy zone),以下为实现层面的补充原则。
500
-
501
- 1. **SDK 原生集成**:通过 `query()` 调用 Claude,内联 hooks,原生 cost tracking
502
- 2. **零硬依赖**:Claude Agent SDK 作为 peerDependency
503
- 3. **幂等设计**:所有入口可重复执行,不产生副作用
504
- 4. **跨平台**:纯 Node.js + `child_process` 调用 git,无平台特定脚本
505
- 5. **运行时隔离**:每个项目的 `.claude-coder/` 独立,不同项目互不干扰
506
- 6. **文档即上下文**:Blueprint(`project_profile.json`)给 harness,Context Docs 给 Agent。Hint 6 动态提醒 Agent 读取相关文档
507
-
508
- ### 文档架构的学术依据
509
-
510
- | 来源 | 核心概念 | 本项目映射 |
511
- |------|----------|-----------|
512
- | DeepCode (arXiv 2512.07921) | Blueprint Distillation — 源文档压缩为结构化蓝图 | `project_profile.json` 是项目蓝图 |
513
- | CodeMem (arXiv 2512.15813) | Procedural Memory — 验证过的逻辑持久化为可索引技能库 | 架构文档记录"决策"供 Agent 按需检索 |
514
- | Anthropic Memory Tool | Just-in-time 检索 — 按需从文件系统拉取 | Hint 6 按需提示 Agent 读文档 |
515
- | ContextBench (arXiv 2602.05892) | 复杂脚手架边际收益递减 | 不过度设计文档体系,关键信息必须准确 |
516
- | LangChain Harness Engineering | Build-Verify + Context on behalf of Agent | Harness 准备上下文,Agent 专注编码 |
@@ -1,178 +0,0 @@
1
- # Playwright MCP 浏览器模式与凭证管理
2
-
3
- ## 三种模式一览
4
-
5
- | | persistent(默认推荐) | isolated | extension |
6
- |---|---|---|---|
7
- | **一句话** | **懒人模式** — 登录一次,永久生效 | **开发模式** — 验证登录流程的自动化测试 | 连接真实浏览器(实验性) |
8
- | **使用的浏览器** | Chrome for Testing(Playwright 自带) | Chrome for Testing(Playwright 自带) | **用户的真实 Chrome/Edge** |
9
- | **登录态** | 持久化,关闭后下次自动恢复 | 每次从 JSON 快照加载(auth 录制一次) | 直接复用浏览器已有登录态 |
10
- | **典型场景** | Google SSO、企业内网 API 文档拉取、日常维护开发 | 验证登录流程本身、需要可重复的干净测试环境 | 需要浏览器插件或绕过自动化检测 |
11
- | **状态存储** | `.claude-coder/.runtime/browser-profile/` | `.claude-coder/playwright-auth.json` | 无(浏览器自身管理) |
12
- | **前置安装** | `npx playwright install chromium` | `npx playwright install chromium` | Playwright MCP Bridge 扩展 |
13
- | **.mcp.json 参数** | `--user-data-dir=<path>` | `--isolated --storage-state=<path>` | `--extension` |
14
-
15
- ### 如何选择
16
-
17
- - **persistent(推荐)**:适合需要 Google 登录态、内网 API 获取等场景。登录一次,后续所有 MCP 会话自动复用。
18
- - **isolated**:适合需要验证登录流程的自动化测试,或需要每次干净环境的场景。cookies 过期后需重新 `auth`。
19
- - **extension**(实验性):适合需要浏览器插件(VPN、广告拦截等)的场景。需安装 Chrome 扩展。
20
-
21
- ---
22
-
23
- ## 前置安装
24
-
25
- ### persistent / isolated 模式
26
-
27
- ```bash
28
- # 安装 Playwright 自带的 Chromium 浏览器(Chrome for Testing)
29
- npx playwright install chromium
30
- ```
31
-
32
- 安装后位于 `~/Library/Caches/ms-playwright/chromium-*/`(macOS)。这不是你的真实 Chrome,是 Playwright 专用的自动化浏览器。
33
-
34
- ### extension 模式
35
-
36
- 1. 在真实 Chrome/Edge 中安装 [Playwright MCP Bridge](https://chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm) 扩展
37
- 2. 确保扩展已启用
38
- 3. 无需安装 Chromium
39
-
40
- ---
41
-
42
- ## 配置流程
43
-
44
- ### Step 1:选择模式
45
-
46
- ```bash
47
- claude-coder setup
48
- # → 启用 Playwright MCP → 选择模式(persistent / isolated / extension)
49
- # → 模式写入 .claude-coder/.env 的 MCP_PLAYWRIGHT_MODE
50
- ```
51
-
52
- ### Step 2:运行认证
53
-
54
- ```bash
55
- # persistent / isolated:打开浏览器,手动登录后关闭
56
- claude-coder auth http://your-target-url.com
57
-
58
- # extension:不开浏览器,只生成 .mcp.json 配置
59
- claude-coder auth
60
- ```
61
-
62
- `auth` 命令会自动完成:
63
- 1. 根据当前模式执行对应的认证流程
64
- 2. 生成/更新 `.mcp.json`(Claude Code SDK 读取此文件启动 MCP 服务)
65
- 3. 更新 `.gitignore`
66
- 4. 启用 `.env` 中 `MCP_PLAYWRIGHT=true`
67
-
68
- ### Step 3:开始使用
69
-
70
- ```bash
71
- claude-coder run "你的需求"
72
- # Agent 自动通过 Playwright MCP 工具操作浏览器
73
- ```
74
-
75
- ---
76
-
77
- ## 各模式详细说明
78
-
79
- ### persistent 模式(默认)
80
-
81
- **原理**:使用 `--user-data-dir` 创建持久化浏览器配置文件(类似 Chrome Profile)。所有 cookies、localStorage、IndexedDB、Service Worker 状态都保留在磁盘上。
82
-
83
- ```
84
- .claude-coder/.runtime/browser-profile/ ← 持久化浏览器配置(~20-50MB)
85
- ```
86
-
87
- **优点**:
88
- - 登录状态完整保留,包括 Google SSO、OAuth 回调等复杂流程
89
- - 无需重复登录
90
- - cookies 自动续期
91
-
92
- **缺点**:
93
- - 配置目录较大
94
- - 不同 session 共享状态(非隔离)
95
-
96
- ### isolated 模式
97
-
98
- **原理**:使用 `--isolated --storage-state` 将 cookies + localStorage 快照注入新的隔离上下文。每次 MCP 会话从 JSON 文件重新加载。
99
-
100
- ```
101
- .claude-coder/playwright-auth.json ← cookies + localStorage 快照(~10-20KB)
102
- ```
103
-
104
- **优点**:
105
- - 每次 session 从相同状态开始,可重复性好
106
- - 状态文件小,可版本控制(脱敏后)
107
-
108
- **缺点**:
109
- - cookies 过期后需重新 `claude-coder auth`
110
- - Google SSO 等复杂登录可能无法完整恢复(缺少 IndexedDB/Service Worker 状态)
111
-
112
- ### extension 模式
113
-
114
- **原理**:使用 `--extension` 通过 Chrome 扩展(WebSocket CDP relay)连接到用户正在运行的真实浏览器。
115
-
116
- **优点**:
117
- - 直接复用浏览器已有登录态,无需额外认证
118
- - 可使用浏览器已安装的扩展(VPN、广告拦截等)
119
- - 绕过自动化检测
120
-
121
- **缺点**:
122
- - 需要安装 [Playwright MCP Bridge](https://chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm) 扩展
123
- - Agent 操作会影响用户正在使用的浏览器
124
- - 首次连接需要用户审批(可用 Token 自动跳过)
125
-
126
- ---
127
-
128
- ## 测试凭证管理
129
-
130
- 除浏览器登录态外,Agent 还需要 API Key、测试账号等凭证:
131
-
132
- | 文件 | 创建方 | 写入方 | 用途 |
133
- |------|--------|--------|------|
134
- | `.claude-coder/.env` | `setup` | 用户 | 模型配置、MCP 开关 |
135
- | `.claude-coder/test.env` | Agent 或用户 | Agent + 用户 | 测试凭证(API Key、测试账号) |
136
-
137
- ```bash
138
- # 用户预配置
139
- cat >> .claude-coder/test.env << 'EOF'
140
- OPENAI_API_KEY=sk-xxx
141
- TEST_USER=testuser@example.com
142
- TEST_PASSWORD=xxx
143
- EOF
144
- ```
145
-
146
- Agent 在测试前会 `source .claude-coder/test.env` 加载凭证。发现新凭证需求时也会自动追加写入。
147
-
148
- ---
149
-
150
- ## 切换模式
151
-
152
- ```bash
153
- # 推荐:一行命令切换(同时更新 .env 和 .mcp.json)
154
- claude-coder config mcp persistent
155
- claude-coder config mcp isolated
156
- claude-coder config mcp extension
157
-
158
- # 如果新模式需要登录(persistent / isolated),还需运行 auth
159
- claude-coder auth <URL>
160
- ```
161
-
162
- > **说明**:`config mcp` 会同时更新 `.env` 中的 `MCP_PLAYWRIGHT_MODE` 和重新生成 `.mcp.json`,无需重走 `setup` 全流程。如果之前已经 auth 过对应模式(如 persistent 的 browser-profile 还在),切换回去后无需重新 auth。
163
-
164
- ---
165
-
166
- ## 清理
167
-
168
- ```bash
169
- # 清除 persistent 模式配置
170
- rm -rf .claude-coder/.runtime/browser-profile
171
-
172
- # 清除 isolated 模式登录状态
173
- rm .claude-coder/playwright-auth.json
174
-
175
- # 完全重置 Playwright 配置
176
- rm .mcp.json
177
- # 然后重新运行 claude-coder auth
178
- ```