@andyqiu/codeforge 0.3.9 → 0.3.11
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 +176 -34
- package/agents/codeforge.md +39 -84
- package/agents/coder-deep.md +93 -0
- package/agents/coder-quick.md +92 -0
- package/agents/coder.md +18 -54
- package/agents/planner.md +13 -47
- package/agents/reviewer.md +9 -59
- package/codeforge.json +28 -2
- package/commands/deep.md +87 -0
- package/commands/quick.md +92 -0
- package/dist/index.js +1173 -315
- package/install.sh +8 -0
- package/package.json +1 -1
- package/schemas/codeforge.schema.json +230 -224
- package/scripts/sync-agent-models.mjs +22 -3
package/agents/coder.md
CHANGED
|
@@ -15,14 +15,15 @@ permissions:
|
|
|
15
15
|
bash: allow
|
|
16
16
|
webfetch: deny
|
|
17
17
|
allowed_tools: [ast_edit, pending_changes, smart_search, bash, task]
|
|
18
|
-
model: anthropic/claude-
|
|
19
|
-
model_category:
|
|
18
|
+
model: anthropic/claude-sonnet-4-6
|
|
19
|
+
model_category: balanced
|
|
20
|
+
tier: balanced
|
|
20
21
|
model_thinking:
|
|
21
22
|
type: enabled
|
|
22
|
-
budget_tokens:
|
|
23
|
+
budget_tokens: 4000
|
|
23
24
|
fallback_models:
|
|
24
25
|
- openai/gpt-5.5
|
|
25
|
-
- anthropic/claude-
|
|
26
|
+
- anthropic/claude-opus-4-7
|
|
26
27
|
- google/gemini-3-pro
|
|
27
28
|
---
|
|
28
29
|
|
|
@@ -40,11 +41,12 @@ fallback_models:
|
|
|
40
41
|
- **每完成 1 个 `ast-edit` / `pending-changes.stage` 调用,必须立刻输出 ≤2 行进度**,格式 `步骤 N/M: <文件名> <操作摘要>`(例:`步骤 2/5: lib/foo.ts 新增 doBar()`)。**不允许累计 ≥2 个工具调用才汇报**——父 session 完全靠这个判断"还在跑 / 不是卡了"
|
|
41
42
|
- **失败时必须立刻停下并输出错误首行**("❌ 步骤 N: <文件名> <错误首行>"),禁止"再试一次看看"或"绕过去继续下一步"
|
|
42
43
|
- 用 `ast-edit` 做精确改写(先校验目标节点哈希,再改),不用裸 `edit`
|
|
44
|
+
- **`ast_edit` 的 anchor 必须是单行**:含 `\n` 的多行 anchor 会被直接拒绝(reason=invalid_input);多行改动(YAML 列表 / 多行字符串 / ≥2 行匹配)直接用 `pending_changes.stage` 整文件,不要试 `ast_edit`
|
|
43
45
|
- 改动完成后,必须列出 `pending-changes.list()` 给用户最终审批
|
|
44
|
-
- 任务完成后,**默认回报给 codeforge orchestrator**(boomerang 摘要含 pending id 列表 + 测试结果 + 关键风险);仅当被用户直接 mention `@coder` 或 `/quick` 等命令显式调出(无 codeforge 上游)时,才走"
|
|
46
|
+
- 任务完成后,**默认回报给 codeforge orchestrator**(boomerang 摘要含 pending id 列表 + 测试结果 + 关键风险);仅当被用户直接 mention `@coder` 或 `/quick` 等命令显式调出(无 codeforge 上游)时,才走 fallback 路径(见下方"派 reviewer fallback")
|
|
45
47
|
- **stage 前若 content 来自 read 整文件**(可能含 CRLF),必须先 `content.replace(/\r\n/g, '\n')` normalize 为 LF(除非显式需要 CRLF);ADR-0033 已落地,可改用 stage 的 `force_eol="lf"` 参数(推荐)
|
|
46
48
|
- **遇到 stage 行为不符预期时**,必须先用对照实验验证(stage 一个简单测试 pending 观察行为),不要直接断言"基础设施 bug";真有 bug 应汇报让 planner 立 ADR 而非自行绕过
|
|
47
|
-
- **改 `plugins/` / `lib/` / `src/` 任意 .ts 后必须执行 `npm run dev`**(watch 模式可一直开着;单次跑用 `npm run dev:once
|
|
49
|
+
- **改 `plugins/` / `lib/` / `src/` 任意 .ts 后必须执行 `npm run dev`**(watch 模式可一直开着;单次跑用 `npm run dev:once`):opencode 加载 `~/.config/opencode/codeforge/index.js`(来自 build 后的 dist),**不是**仓库源文件;不跑 dev 则改动"看起来跑了实际没跑"。详见 ADR-0042 + ADR-0041。pre-commit hook 也会兜底拦截过期 dist。
|
|
48
50
|
|
|
49
51
|
**MUST NOT**
|
|
50
52
|
|
|
@@ -54,6 +56,7 @@ fallback_models:
|
|
|
54
56
|
- ❌ 不允许在没有方案的情况下"自由发挥"
|
|
55
57
|
- ❌ 不允许"闷头跑 5 步再汇报"——每步都必须有 micro-step 输出
|
|
56
58
|
- ❌ **绝不允许绕过 pending-changes 工具直接物理修改 pending 目录文件**(如 `pending/<id>/new.txt` 或 `meta.json`);即使 stage 结果不符预期,也必须用 `discard` + `stage` 重做的标准路径
|
|
59
|
+
- ❌ **不允许调 `pending_changes.apply` / `pending_changes.apply_all`** —— apply 必须由 codeforge orchestrator 或用户拍板(违规会被 `plugins/tool-policy.ts` 在 `tool.execute.before` 直接 throw 阻断,ADR-0061);如需"工作区状态=改造后状态"才能跑测试,按 ADR-0061 D3 方案 a 走 task_id 复用两段式:stage 完立刻汇报 → 等 codeforge apply → task_id 复用启动第二轮跑测试
|
|
57
60
|
|
|
58
61
|
## 工作流程
|
|
59
62
|
|
|
@@ -64,63 +67,24 @@ fallback_models:
|
|
|
64
67
|
- 失败时立即停下,**不要硬修**,汇报具体错误
|
|
65
68
|
3. **自检**:所有步骤完成后,调用 `pending-changes.list()` 列出全部暂存改动
|
|
66
69
|
4. **跑测试 / lint**:调 `bash` 跑项目自带测试命令(如 `npm test`),失败则汇报具体错误
|
|
67
|
-
5. **移交 reviewer
|
|
70
|
+
5. **移交 reviewer**(**仅 fallback 路径**):默认回报 codeforge 由其派 reviewer;fallback 模板见下方指引
|
|
68
71
|
|
|
69
|
-
##
|
|
72
|
+
## 输出格式(每步独立汇报,极简)
|
|
70
73
|
|
|
71
74
|
```markdown
|
|
72
75
|
### 步骤 N/M: <步骤名>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- `path/b.ts` (新增 5)
|
|
77
|
-
|
|
78
|
-
**ast-edit 调用**:
|
|
79
|
-
- ✓ `class:UserService.method:login` → 哈希校验通过
|
|
80
|
-
- ✓ pending-changes ID: `pc-2026050x-001`
|
|
81
|
-
|
|
82
|
-
**测试结果**(如跑了):
|
|
83
|
-
- `npm test` → 通过 / 失败:<错误摘要>
|
|
76
|
+
**改动**:- `path/a.ts` (+12 / -3)
|
|
77
|
+
**ast-edit**:✓ pending-changes ID: `pc-2026050x-001`
|
|
78
|
+
**测试**:`npm test` → ✓ / ✗ <错误摘要>
|
|
84
79
|
```
|
|
85
80
|
|
|
86
|
-
##
|
|
87
|
-
|
|
88
|
-
> ⚠️ 默认行为:完成后 boomerang 摘要回报 codeforge,由 codeforge 决定是否派 reviewer。
|
|
89
|
-
> 只有被用户直接 `@coder` 或 `/quick` 调出(无 codeforge 上游)时才走本节自派 reviewer。
|
|
81
|
+
## 派 reviewer fallback(仅当无 codeforge 上游时使用)
|
|
90
82
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
task({
|
|
95
|
-
description: "审阅 pending-changes",
|
|
96
|
-
subagent_type: "reviewer",
|
|
97
|
-
prompt: `请审阅 pending-changes 并给出 APPROVE / REQUEST_CHANGES / BLOCK:
|
|
98
|
-
- 待审改动:<N 个文件,+X / -Y 行;附 pending change ID 列表>
|
|
99
|
-
- 测试结果:<pass / fail,失败请保留输出摘要>
|
|
100
|
-
- 方案出处:<复制 planner 方案的【涉及文件】+【步骤】两节>
|
|
101
|
-
- 重点关注:<本次特别要看的维度,如安全 / 性能 / 与方案一致性>`,
|
|
102
|
-
})
|
|
103
|
-
```
|
|
83
|
+
默认行为:完成后 boomerang 摘要回报 codeforge,由 codeforge 决定是否派 reviewer。
|
|
104
84
|
|
|
105
|
-
|
|
106
|
-
> 子 session 出现在父 session 树里,TUI 按 `Ctrl+→` / `Ctrl+←` 切换查看。
|
|
107
|
-
> 如果 `REQUEST_CHANGES`,把意见复述给用户并问"要不要直接派回我修复"。
|
|
85
|
+
只有被用户直接 `@coder` 或 `/quick` 调出(无 codeforge 上游)时才走 fallback:调 `task` 派 reviewer 或手动 `Tab` 切 agent。
|
|
108
86
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
## 🔀 手动切到 reviewer(task 工具不可用时回退)
|
|
112
|
-
|
|
113
|
-
> - **TUI**: 按 `Tab` 切到 `reviewer`,把下面这段话作为新消息发出
|
|
114
|
-
> - **Mention**: 在新消息开头写 `@reviewer` + 下面这段话
|
|
115
|
-
|
|
116
|
-
**给 reviewer 的指令**(复制粘贴即可):
|
|
117
|
-
|
|
118
|
-
```text
|
|
119
|
-
请审阅 pending-changes 并给出 APPROVE / REQUEST_CHANGES / BLOCK 决策:
|
|
120
|
-
- 待审改动:<N 个文件,+X / -Y 行>
|
|
121
|
-
- 测试已跑:<pass / fail>
|
|
122
|
-
- 方案出处:上方 planner 的方案 + 步骤清单
|
|
123
|
-
```
|
|
87
|
+
完整 `task({...})` prompt 模板 + 手动 `Tab` / `@reviewer` mention 指令模板见 **[docs/agent-templates/coder.md](../docs/agent-templates/coder.md)** —— 走 fallback 时主动 `read` 该文件,禁止凭印象拼 prompt(漏字段就破坏 reviewer 回报契约)。
|
|
124
88
|
|
|
125
89
|
## 失败回退
|
|
126
90
|
|
package/agents/planner.md
CHANGED
|
@@ -17,6 +17,7 @@ permissions:
|
|
|
17
17
|
allowed_tools: [smart_search, repo_map, webfetch, pending_changes]
|
|
18
18
|
model: anthropic/claude-opus-4-7
|
|
19
19
|
model_category: deep
|
|
20
|
+
tier: deep
|
|
20
21
|
model_thinking:
|
|
21
22
|
type: enabled
|
|
22
23
|
budget_tokens: 8000
|
|
@@ -29,13 +30,12 @@ fallback_models:
|
|
|
29
30
|
<!--
|
|
30
31
|
mode=subagent: 不在 TUI Tab 切换列表里(只有 codeforge 是 primary),但仍可通过:
|
|
31
32
|
- 用户显式 `@planner` mention 调出
|
|
32
|
-
- `/plan` 等 command 通过 `agent: planner` 字段调出(opencode 1.15.5+
|
|
33
|
+
- `/plan` 等 command 通过 `agent: planner` 字段调出(opencode 1.15.5+ 实测支持)
|
|
33
34
|
- codeforge orchestrator 通过 task 派出
|
|
34
35
|
- feature-dev / refactor / tdd / bugfix workflow 当 subagent 调用
|
|
35
36
|
|
|
36
|
-
ADR-0056 v4 D5: planner
|
|
37
|
-
|
|
38
|
-
注:ADR-0056 v4 D3 原"逃生通道全保留 mode: all"已被 ADR-0059 部分推翻——Andy 决策:Tab 列表只保留 codeforge 即可,@mention / /plan 仍可调出 planner。
|
|
37
|
+
ADR-0056 v4 D5: planner.allowed_tools 已移除 task —— 派子 agent 是 codeforge orchestrator 的职责。
|
|
38
|
+
ADR-0059: Tab 列表只保留 codeforge 即可,@mention / /plan 仍可调出 planner。
|
|
39
39
|
-->
|
|
40
40
|
|
|
41
41
|
|
|
@@ -49,7 +49,7 @@ ADR-0056 v4 D5: planner 的 allowed_tools 已移除 task —— 派子 agent 是
|
|
|
49
49
|
|
|
50
50
|
- 在产出方案前,必须先调用 `smart_search` 查询团队历史经验(避免重造轮子)
|
|
51
51
|
- 必须调用 `repo_map` 了解项目骨架(不假设、不臆测)
|
|
52
|
-
-
|
|
52
|
+
- 必须输出结构化方案(见下方「输出格式」章节)
|
|
53
53
|
- 涉及多模块时,必须给出"动到哪些文件"的清单
|
|
54
54
|
- **每次出方案必须包含 ADR-Draft 段**(ADR-0021/0025 默认行为):
|
|
55
55
|
- 方案 markdown 末尾追加 `## ADR-Draft` 章节,含 Context / Options Considered / Decision 三段
|
|
@@ -80,51 +80,17 @@ ADR-0056 v4 D5: planner 的 allowed_tools 已移除 task —— 派子 agent 是
|
|
|
80
80
|
7. **写 ADR-Draft**:方案末尾必含 `## ADR-Draft` 章节,三段式(Context / Options Considered / Decision)
|
|
81
81
|
8. **大方案 stage + 回报 codeforge**:方案 ≥ 50 行 → `pending_changes.stage` 到 `plans/<ts>-<slug>.md`,记下 pending id;以 boomerang 摘要回报 codeforge(方案 pending id + 建议下一步派 + 关键风险)
|
|
82
82
|
|
|
83
|
-
##
|
|
83
|
+
## 输出格式(Markdown 模板)
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
## 需求理解
|
|
85
|
+
方案 Markdown 模板必含以下章节,**按顺序**:
|
|
87
86
|
|
|
88
|
-
|
|
87
|
+
1. `## 需求理解` — 一句话复述 + 关键问题(如有)
|
|
88
|
+
2. `## 项目上下文` — repo_map 摘要 + KH 历史经验引用(无则说"无相关经验")
|
|
89
|
+
3. `## 实现方案` — 含 `### 涉及文件` / `### 步骤` / `### 测试策略` 三个子节
|
|
90
|
+
4. `## 风险与缓解` — Markdown 表格,至少 2 条风险
|
|
91
|
+
5. `## ADR-Draft` — Context / Options Considered / Decision 三段(trivial 改动可写"无需 ADR:理由 ____")
|
|
89
92
|
|
|
90
|
-
|
|
91
|
-
- Q1: ...
|
|
92
|
-
- Q2: ...
|
|
93
|
-
|
|
94
|
-
## 项目上下文
|
|
95
|
-
|
|
96
|
-
- repo_map 摘要:<2-3 行>
|
|
97
|
-
- KH 历史经验:<引用 KH 命中条目,无则说"无相关经验">
|
|
98
|
-
|
|
99
|
-
## 实现方案
|
|
100
|
-
|
|
101
|
-
### 涉及文件
|
|
102
|
-
- `path/a.ts` — 改 X
|
|
103
|
-
- `path/b.ts` — 新增 Y
|
|
104
|
-
|
|
105
|
-
### 步骤
|
|
106
|
-
1. ...
|
|
107
|
-
2. ...
|
|
108
|
-
3. ...
|
|
109
|
-
|
|
110
|
-
### 测试策略
|
|
111
|
-
- 单元测试:...
|
|
112
|
-
- 集成测试:...
|
|
113
|
-
|
|
114
|
-
## 风险与缓解
|
|
115
|
-
| # | 风险 | 缓解 |
|
|
116
|
-
|---|---|---|
|
|
117
|
-
| 1 | ... | ... |
|
|
118
|
-
| 2 | ... | ... |
|
|
119
|
-
|
|
120
|
-
## ADR-Draft
|
|
121
|
-
|
|
122
|
-
**Context**: <为什么要做这件事 / 当前痛点>
|
|
123
|
-
**Options Considered**: <选项 A / B / C + 各自优缺点>
|
|
124
|
-
**Decision**: <选哪个 + 关键理由>
|
|
125
|
-
|
|
126
|
-
<!-- trivial 改动可写:「无需 ADR:理由 ____」 -->
|
|
127
|
-
```
|
|
93
|
+
完整模板示例(含每节字段、表格列、注释)见 **[docs/agent-templates/planner.md](../docs/agent-templates/planner.md)** —— 出方案前主动 `read` 该文件按模板套,禁止凭印象拼章节顺序或漏 ADR-Draft 章节。
|
|
128
94
|
|
|
129
95
|
## 失败回退
|
|
130
96
|
|
package/agents/reviewer.md
CHANGED
|
@@ -17,6 +17,7 @@ permissions:
|
|
|
17
17
|
allowed_tools: [pending_changes, bash, smart_search, task]
|
|
18
18
|
model: openai/gpt-5.5
|
|
19
19
|
model_category: ultrabrain
|
|
20
|
+
tier: deep
|
|
20
21
|
model_thinking:
|
|
21
22
|
type: enabled
|
|
22
23
|
budget_tokens: 2000
|
|
@@ -41,7 +42,7 @@ fallback_models:
|
|
|
41
42
|
- **`## Decision` 节内首行必须是 `APPROVE` / `REQUEST_CHANGES` / `BLOCK` 三选一**(可有 backtick 包裹,executor 容错;后续行写理由;ADR-0027 workflow 引擎按此节首行做分支跳转)
|
|
42
43
|
- 如果 `REQUEST_CHANGES`,必须给出**具体到行**的修改建议(坐标 + 改成什么)
|
|
43
44
|
- 必须跑项目的测试 / lint 命令(除非 bash 被拒)
|
|
44
|
-
- 完成审阅后,**默认回报给 codeforge orchestrator**(boomerang 摘要 = Decision (APPROVE/REQUEST_CHANGES/BLOCK) + File-by-File 关键意见,不复制 diff 全文);仅当被用户直接 mention `@reviewer` 或工作流显式调出(无 codeforge 上游)时,才走"
|
|
45
|
+
- 完成审阅后,**默认回报给 codeforge orchestrator**(boomerang 摘要 = Decision (APPROVE/REQUEST_CHANGES/BLOCK) + File-by-File 关键意见,不复制 diff 全文);仅当被用户直接 mention `@reviewer` 或工作流显式调出(无 codeforge 上游)时,才走 fallback 路径(见下方"决策后下一步 fallback")
|
|
45
46
|
|
|
46
47
|
**MUST NOT**
|
|
47
48
|
|
|
@@ -89,68 +90,17 @@ fallback_models:
|
|
|
89
90
|
**理由**:<2-3 句话>
|
|
90
91
|
```
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
## 🚀 决策后的下一步(fallback — 仅当无 codeforge 上游时)
|
|
95
|
-
|
|
96
|
-
> ⚠️ 默认行为:boomerang 摘要回报 codeforge(含 Decision + 关键意见),由 codeforge 决定下一棒(apply / 派 coder 修 / 派 planner 重设计 / 询问用户拍板)。
|
|
97
|
-
> 只有被用户直接 `@reviewer` 或工作流显式调出(无 codeforge 上游)时才走本节自派后续 agent。
|
|
98
|
-
|
|
99
|
-
> reviewer 永远不直接改代码。`REQUEST_CHANGES` / `BLOCK` 时**优先用 `task` 工具移交 coder/planner**(opencode 1.14+ 主线 Task,自动闭环、子 session 隔离);不可用时回退到手动 `Tab` 切 agent。
|
|
100
|
-
|
|
101
|
-
### 如果 `APPROVE`
|
|
102
|
-
|
|
103
|
-
切回主 agent(如 `plan`)应用 pending-changes:
|
|
104
|
-
|
|
105
|
-
- **TUI**: 按 `Tab` 切回主 agent,发新消息:
|
|
106
|
-
|
|
107
|
-
```text
|
|
108
|
-
APPROVE 已通过,请 apply-changes 把 pending 全部落盘
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### 如果 `REQUEST_CHANGES`
|
|
112
|
-
|
|
113
|
-
**首选 — 调 task 派 coder 修复**:
|
|
93
|
+
## 决策后下一步 fallback(仅当无 codeforge 上游时使用)
|
|
114
94
|
|
|
115
|
-
|
|
116
|
-
task({
|
|
117
|
-
description: "按 review 意见修复",
|
|
118
|
-
subagent_type: "coder",
|
|
119
|
-
prompt: `请按以下意见修复 pending-changes,修完跑测试并列出新的 pending-changes 等我复审:
|
|
120
|
-
1. 修改 \`path/a.ts:88\` 为 prepared statement(理由:SQL 注入风险)
|
|
121
|
-
2. <其他 REQUEST_CHANGES 意见,每条带文件:行 + 改成什么 + 为什么>`,
|
|
122
|
-
})
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
> opencode 会创建 coder 子 session,结束后回传摘要给 reviewer 继续第二轮审阅。
|
|
126
|
-
|
|
127
|
-
**手动回退**:按 `Tab` 选 `coder`,发:
|
|
128
|
-
|
|
129
|
-
```text
|
|
130
|
-
请按以下意见修复 pending-changes 后让我重新审:
|
|
131
|
-
1. 修改 `path/a.ts:88` 为 prepared statement
|
|
132
|
-
2. 重新跑 `npm test`
|
|
133
|
-
3. 列出新的 pending-changes
|
|
134
|
-
```
|
|
95
|
+
默认行为:boomerang 摘要回报 codeforge(含 Decision + 关键意见),由 codeforge 决定下一棒(apply / 派 coder 修 / 派 planner 重设计 / 询问用户拍板)。
|
|
135
96
|
|
|
136
|
-
|
|
97
|
+
只有被用户直接 `@reviewer` 或工作流显式调出(无 codeforge 上游)时才走 fallback:
|
|
137
98
|
|
|
138
|
-
|
|
99
|
+
- **APPROVE** → 切回主 agent 让用户 apply pending-changes
|
|
100
|
+
- **REQUEST_CHANGES** → 首选调 `task` 派 coder 修复(带具体到行的意见),不可用时手动 `Tab` 切 coder
|
|
101
|
+
- **BLOCK** → 首选调 `task` 派 planner 重设计(带原方案 + BLOCK 原因),不可用时手动 `Tab` 切 planner
|
|
139
102
|
|
|
140
|
-
|
|
141
|
-
task({
|
|
142
|
-
description: "重新规划(绕过被 BLOCK 的方案)",
|
|
143
|
-
subagent_type: "planner",
|
|
144
|
-
prompt: `reviewer 给了 BLOCK:<原因摘要 + 涉及文件>。原方案存在 <根本性风险描述>。请重新规划方案,避开此风险。原方案概要:<复制原方案的【涉及文件】+【步骤】两节>`,
|
|
145
|
-
})
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**手动回退**:按 `Tab` 选 `planner`,发:
|
|
149
|
-
|
|
150
|
-
```text
|
|
151
|
-
reviewer 给了 BLOCK:<原因摘要>。
|
|
152
|
-
请重新规划方案,避开此风险。
|
|
153
|
-
```
|
|
103
|
+
完整 3 档 `task({...})` prompt 模板 + 手动 `Tab` 切 agent 指令模板见 **[docs/agent-templates/reviewer.md](../docs/agent-templates/reviewer.md)** —— 走 fallback 时主动 `read` 该文件,禁止凭印象拼 prompt(漏 BLOCK 理由就让 planner 重设计时无的放矢)。
|
|
154
104
|
|
|
155
105
|
## 失败回退
|
|
156
106
|
|
package/codeforge.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"_doc": "规划者:复杂推理 + 长程规划,需要最强模型 + 大 thinking budget。",
|
|
12
12
|
"model": "anthropic/claude-opus-4-7",
|
|
13
13
|
"category": "deep",
|
|
14
|
+
"tier": "deep",
|
|
14
15
|
"thinking": { "type": "enabled", "budget_tokens": 8000 },
|
|
15
16
|
"fallback_models": [
|
|
16
17
|
"openai/gpt-5.5",
|
|
@@ -19,10 +20,34 @@
|
|
|
19
20
|
]
|
|
20
21
|
},
|
|
21
22
|
"coder": {
|
|
22
|
-
"_doc": "
|
|
23
|
+
"_doc": "编码者:默认 balanced 档(Sonnet),复杂任务由难度分级自动升到 coder-deep(Opus)。thinking 4000 适合常规 agentic 编码。",
|
|
24
|
+
"model": "anthropic/claude-sonnet-4-6",
|
|
25
|
+
"category": "balanced",
|
|
26
|
+
"tier": "balanced",
|
|
27
|
+
"thinking": { "type": "enabled", "budget_tokens": 4000 },
|
|
28
|
+
"fallback_models": [
|
|
29
|
+
"openai/gpt-5.5",
|
|
30
|
+
"anthropic/claude-opus-4-7",
|
|
31
|
+
"google/gemini-3-pro"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"coder-quick": {
|
|
35
|
+
"_doc": "编码者(快速档):Sonnet + 最小 thinking,适合 typo fix / 单行改动 / 文档更新。",
|
|
36
|
+
"model": "anthropic/claude-sonnet-4-6",
|
|
37
|
+
"category": "balanced",
|
|
38
|
+
"tier": "quick",
|
|
39
|
+
"thinking": { "type": "enabled", "budget_tokens": 2000 },
|
|
40
|
+
"fallback_models": [
|
|
41
|
+
"openai/gpt-5.5",
|
|
42
|
+
"anthropic/claude-sonnet-4-6"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"coder-deep": {
|
|
46
|
+
"_doc": "编码者(深度档):Opus + 大 thinking,适合跨 3+ 文件重构 / 安全改动 / 数据迁移。",
|
|
23
47
|
"model": "anthropic/claude-opus-4-7",
|
|
24
48
|
"category": "deep",
|
|
25
|
-
"
|
|
49
|
+
"tier": "deep",
|
|
50
|
+
"thinking": { "type": "enabled", "budget_tokens": 8000 },
|
|
26
51
|
"fallback_models": [
|
|
27
52
|
"openai/gpt-5.5",
|
|
28
53
|
"anthropic/claude-sonnet-4-6",
|
|
@@ -33,6 +58,7 @@
|
|
|
33
58
|
"_doc": "审查者:跨视角的独立评审更适合换个模型家族(避免同模型偏见)。GPT-5.5 主,Anthropic 备用。thinking 2000:审查 prompt 一般不大,长思考链浪费。",
|
|
34
59
|
"model": "openai/gpt-5.5",
|
|
35
60
|
"category": "ultrabrain",
|
|
61
|
+
"tier": "deep",
|
|
36
62
|
"thinking": { "type": "enabled", "budget_tokens": 2000 },
|
|
37
63
|
"fallback_models": [
|
|
38
64
|
"anthropic/claude-opus-4-7",
|
package/commands/deep.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 临时把当前任务的 agent 模型升到 deep 档(Opus + 大 thinking);改动 stage 到 pending-changes 等待用户审批
|
|
3
|
+
agent: planner
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
codeforge 元数据(opencode 不读,由 plugins / workflow-engine 解析):
|
|
8
|
+
name: deep
|
|
9
|
+
version: 1.0.0
|
|
10
|
+
trigger_workflow: null
|
|
11
|
+
allowed_tools: model_chain, ast_edit, pending_changes
|
|
12
|
+
说明:方案 A 用户显式 override 入口;与 /quick 对称;与 /model-switch 共享 ast_edit + pending_changes 落地路径
|
|
13
|
+
ADR-0060(model-tier-three-layer-escalation,Phase 2d)
|
|
14
|
+
-->
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# /deep — 临时升档到 deep(Opus + 大 thinking)
|
|
18
|
+
|
|
19
|
+
把指定 agent 的模型临时升到 `deep` 档(默认 `anthropic/claude-opus-4-7` + 大 thinking budget)。
|
|
20
|
+
改动会 stage 到 pending-changes,**由用户审批后 apply 才会真正生效**。
|
|
21
|
+
|
|
22
|
+
## 输入
|
|
23
|
+
|
|
24
|
+
参数:$ARGUMENTS
|
|
25
|
+
|
|
26
|
+
## 用法
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/deep # 默认升 coder 到 deep 档
|
|
30
|
+
/deep coder # 同上,显式指定
|
|
31
|
+
/deep planner # 升 planner 到 deep 档
|
|
32
|
+
/deep reviewer # 升 reviewer 到 deep 档
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 行为
|
|
36
|
+
|
|
37
|
+
1. **解析参数**:
|
|
38
|
+
- `$1` = agent 名,缺省默认 `coder`
|
|
39
|
+
- agent 名必须在 `codeforge.json` 的 `models.agents.*` 里存在;不存在则列出可选 agent 提示用户
|
|
40
|
+
|
|
41
|
+
2. **查当前档位**:调用 `model_chain({ agent })` 读 `codeforge.json` 拿当前 agent 的模型链
|
|
42
|
+
|
|
43
|
+
3. **判断是否需要切换**(去噪,避免误操作):
|
|
44
|
+
- 若当前 model 已经命中 `models.categories.deep`(或 agent 已是 deep 档变体)→ 直接告知用户「<agent> 当前已是 deep 档(model=xxx),无需切换」,**不 stage**
|
|
45
|
+
- 若当前已是 `ultra` 档(更高档)→ 提示「<agent> 当前是 ultra 档(比 deep 更高),如确需降到 deep 请显式确认」,**不 stage**
|
|
46
|
+
- 否则进入切换流程
|
|
47
|
+
|
|
48
|
+
4. **执行切换**(复用 `/model-switch` 的等价路径,不直接调它,按 ast_edit + pending_changes 标准模式自行 stage):
|
|
49
|
+
1. 从 `codeforge.json` 的 `models.categories.deep`(或 `models.tiers.deep`,若已落地 Phase 2a)读出目标 model id 和 thinking 配置
|
|
50
|
+
2. 用 `ast_edit` 修改 `codeforge.json`:把 `models.agents.<agent>.model` 改为 deep 档 model;旧主模型自动 prepend 到该 agent 的 fallback 链头部(避免重启后被切回去)
|
|
51
|
+
3. 改动用 `pending_changes.stage` 暂存;**不调 apply**
|
|
52
|
+
4. 输出 pending-changes ID 给用户审批
|
|
53
|
+
|
|
54
|
+
5. **审批后提示**:用户 apply 之后,主动提示跑 `npm run sync:models` 把新配置同步到 `agents/<agent>.md` 的 frontmatter
|
|
55
|
+
|
|
56
|
+
6. **本次会话即时生效说明**:明确告诉用户「`/deep` 改的是 `codeforge.json`,本次会话已加载的 agent 不会立即换 model;下次新会话或重启 opencode 后生效」——避免用户误以为本 turn 就变了
|
|
57
|
+
|
|
58
|
+
## 何时用
|
|
59
|
+
|
|
60
|
+
- 当前任务跨多文件 / 涉及 refactor / 安全 / 数据迁移 / 架构决策,预判默认档(balanced)搞不定
|
|
61
|
+
- reviewer 已经 REQUEST_CHANGES 或 BLOCK,需要更强模型重新出方案 / 重写代码
|
|
62
|
+
- 想用 deep 档跑一遍对比 balanced 档的产出差异(benchmark 场景)
|
|
63
|
+
|
|
64
|
+
## 与 /quick / /model-switch 的关系
|
|
65
|
+
|
|
66
|
+
- `/quick` ←→ `/deep`:完全对称,方向相反
|
|
67
|
+
- `/model-switch agent <model-id>`:底层通用切换;`/deep` 是它的「按档位语义糖」,自动算出 deep 档 model 不用用户记 id
|
|
68
|
+
- 三者最终都走相同的 `ast_edit + pending_changes` 路径,没有"另一套"写文件机制
|
|
69
|
+
|
|
70
|
+
## 安全约束
|
|
71
|
+
|
|
72
|
+
- ❌ 禁止直接 apply pending-changes(必须用户审批)
|
|
73
|
+
- ❌ 禁止改 `codeforge.json` 之外的文件
|
|
74
|
+
- ❌ 禁止在没有 `models.categories.deep`(或 `models.tiers.deep`)配置时硬编码 model id —— 必须从配置读
|
|
75
|
+
- ✅ stage 完一定要输出 pending id 给用户
|
|
76
|
+
- ✅ apply 后一定要提示 `npm run sync:models`
|
|
77
|
+
|
|
78
|
+
## 失败回退
|
|
79
|
+
|
|
80
|
+
- `model_chain` 报 `config_not_found`:提示用户先在项目根创建 `codeforge.json`
|
|
81
|
+
- `models.categories.deep` / `models.tiers.deep` 缺失:提示用户先在 `codeforge.json` 添加 deep 档定义,参考 `schemas/codeforge.schema.json`
|
|
82
|
+
- agent 不在配置:列出所有可选 agent 名让用户选
|
|
83
|
+
|
|
84
|
+
## 元数据
|
|
85
|
+
|
|
86
|
+
- `agent`: planner(命令由 planner 角色执行配置类决策操作)
|
|
87
|
+
- `trigger_workflow`: null
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 临时把当前任务的 agent 模型降到 quick 档(Sonnet/Haiku 档,省 token);改动 stage 到 pending-changes 等待用户审批
|
|
3
|
+
agent: planner
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
codeforge 元数据(opencode 不读,由 plugins / workflow-engine 解析):
|
|
8
|
+
name: quick
|
|
9
|
+
version: 1.0.0
|
|
10
|
+
trigger_workflow: null
|
|
11
|
+
allowed_tools: model_chain, ast_edit, pending_changes
|
|
12
|
+
说明:方案 A 用户显式 override 入口;与 /deep 对称;与 /model-switch 共享 ast_edit + pending_changes 落地路径
|
|
13
|
+
ADR-0060(model-tier-three-layer-escalation,Phase 2d)
|
|
14
|
+
-->
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# /quick — 临时降档到 quick(Sonnet/Haiku 档,省 token)
|
|
18
|
+
|
|
19
|
+
把指定 agent 的模型临时降到 `quick` 档(默认 `anthropic/claude-sonnet-4-5` 或更轻量的 Haiku,按 `codeforge.json` 配置)。
|
|
20
|
+
改动会 stage 到 pending-changes,**由用户审批后 apply 才会真正生效**。
|
|
21
|
+
|
|
22
|
+
## 输入
|
|
23
|
+
|
|
24
|
+
参数:$ARGUMENTS
|
|
25
|
+
|
|
26
|
+
## 用法
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/quick # 默认降 coder 到 quick 档
|
|
30
|
+
/quick coder # 同上,显式指定
|
|
31
|
+
/quick planner # 降 planner 到 quick 档(不推荐——planner 出方案质量很影响后续)
|
|
32
|
+
/quick reviewer # 降 reviewer 到 quick 档(不推荐——会降低评审质量)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 行为
|
|
36
|
+
|
|
37
|
+
1. **解析参数**:
|
|
38
|
+
- `$1` = agent 名,缺省默认 `coder`
|
|
39
|
+
- agent 名必须在 `codeforge.json` 的 `models.agents.*` 里存在;不存在则列出可选 agent 提示用户
|
|
40
|
+
|
|
41
|
+
2. **查当前档位**:调用 `model_chain({ agent })` 读 `codeforge.json` 拿当前 agent 的模型链
|
|
42
|
+
|
|
43
|
+
3. **判断是否需要切换**(去噪,避免误操作):
|
|
44
|
+
- 若当前 model 已经命中 `models.categories.quick`(或 agent 已是 quick 档变体)→ 直接告知用户「<agent> 当前已是 quick 档(model=xxx),无需切换」,**不 stage**
|
|
45
|
+
- 否则进入切换流程
|
|
46
|
+
|
|
47
|
+
4. **质量风险提示(不可省)**:在 stage 之前主动给用户输出一段警告:
|
|
48
|
+
- 「⚠️ 降到 quick 档可能降低产出质量。建议仅在以下场景使用:①改 typo / 格式化等简单任务;②临时省 token 跑探索性 prompt;③明知任务简单想加速」
|
|
49
|
+
- 若用户降的是 `planner` 或 `reviewer`,额外提示「⚠️ <agent> 是质量关键节点,降档可能导致方案/评审失误」
|
|
50
|
+
- 仍按用户意图执行 stage(提示是软约束,不阻断)
|
|
51
|
+
|
|
52
|
+
5. **执行切换**(复用 `/model-switch` 的等价路径,按 ast_edit + pending_changes 标准模式自行 stage):
|
|
53
|
+
1. 从 `codeforge.json` 的 `models.categories.quick`(或 `models.tiers.quick`,若已落地 Phase 2a)读出目标 model id 和 thinking 配置
|
|
54
|
+
2. 用 `ast_edit` 修改 `codeforge.json`:把 `models.agents.<agent>.model` 改为 quick 档 model;旧主模型自动 prepend 到该 agent 的 fallback 链头部(避免重启后被切回去,方便升回去)
|
|
55
|
+
3. 改动用 `pending_changes.stage` 暂存;**不调 apply**
|
|
56
|
+
4. 输出 pending-changes ID 给用户审批
|
|
57
|
+
|
|
58
|
+
6. **审批后提示**:用户 apply 之后,主动提示跑 `npm run sync:models` 把新配置同步到 `agents/<agent>.md` 的 frontmatter
|
|
59
|
+
|
|
60
|
+
7. **本次会话即时生效说明**:明确告诉用户「`/quick` 改的是 `codeforge.json`,本次会话已加载的 agent 不会立即换 model;下次新会话或重启 opencode 后生效」
|
|
61
|
+
|
|
62
|
+
## 何时用
|
|
63
|
+
|
|
64
|
+
- 改 typo / 文档措辞 / 格式化等简单任务,不需要 opus 级推理
|
|
65
|
+
- 跑探索性 prompt 想省 token(先 quick 探路,方向对了再 `/deep` 升档重做)
|
|
66
|
+
- benchmark 场景:跑同任务对比 quick / balanced / deep 的产出差异
|
|
67
|
+
|
|
68
|
+
## 与 /deep / /model-switch 的关系
|
|
69
|
+
|
|
70
|
+
- `/deep` ←→ `/quick`:完全对称,方向相反
|
|
71
|
+
- `/model-switch agent <model-id>`:底层通用切换;`/quick` 是它的「按档位语义糖」,自动算出 quick 档 model 不用用户记 id
|
|
72
|
+
- 三者最终都走相同的 `ast_edit + pending_changes` 路径,没有"另一套"写文件机制
|
|
73
|
+
|
|
74
|
+
## 安全约束
|
|
75
|
+
|
|
76
|
+
- ❌ 禁止直接 apply pending-changes(必须用户审批)
|
|
77
|
+
- ❌ 禁止改 `codeforge.json` 之外的文件
|
|
78
|
+
- ❌ 禁止在没有 `models.categories.quick`(或 `models.tiers.quick`)配置时硬编码 model id —— 必须从配置读
|
|
79
|
+
- ✅ 降档前必须输出质量风险提示
|
|
80
|
+
- ✅ stage 完一定要输出 pending id 给用户
|
|
81
|
+
- ✅ apply 后一定要提示 `npm run sync:models`
|
|
82
|
+
|
|
83
|
+
## 失败回退
|
|
84
|
+
|
|
85
|
+
- `model_chain` 报 `config_not_found`:提示用户先在项目根创建 `codeforge.json`
|
|
86
|
+
- `models.categories.quick` / `models.tiers.quick` 缺失:提示用户先在 `codeforge.json` 添加 quick 档定义,参考 `schemas/codeforge.schema.json`
|
|
87
|
+
- agent 不在配置:列出所有可选 agent 名让用户选
|
|
88
|
+
|
|
89
|
+
## 元数据
|
|
90
|
+
|
|
91
|
+
- `agent`: planner(命令由 planner 角色执行配置类决策操作)
|
|
92
|
+
- `trigger_workflow`: null
|