@andyqiu/codeforge 0.3.10 → 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 +106 -3
- package/agents/codeforge.md +35 -1
- package/agents/coder-deep.md +93 -0
- package/agents/coder-quick.md +92 -0
- package/agents/coder.md +5 -4
- package/agents/planner.md +1 -0
- package/agents/reviewer.md +1 -0
- package/codeforge.json +28 -2
- package/commands/deep.md +87 -0
- package/commands/quick.md +92 -0
- package/dist/index.js +532 -65
- 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/README.md
CHANGED
|
@@ -47,6 +47,25 @@ npx @andyqiu/codeforge install
|
|
|
47
47
|
| `/tdd <需求>` | 严格 RED → GREEN → REFACTOR |
|
|
48
48
|
| `/parallel <任务1>,<任务2>,...` | 多个独立任务并发跑 |
|
|
49
49
|
|
|
50
|
+
### 难度分级与三道防线(Phase 2 引入)
|
|
51
|
+
|
|
52
|
+
CodeForge 给每个 agent 配三档变体,让简单任务省 token、复杂任务自动升档保质量:
|
|
53
|
+
|
|
54
|
+
| 档位 | 模型基线 | 用途 |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| `coder-quick` | 低成本快速模型 | typo / 单行改动 |
|
|
57
|
+
| `coder`(默认) | 中端模型 | 单文件中等改动 |
|
|
58
|
+
| `coder-deep` | 高端推理模型 | 跨文件重构 / 安全 / 数据迁移 |
|
|
59
|
+
|
|
60
|
+
三道防线决定最终用哪档(优先级递减):
|
|
61
|
+
|
|
62
|
+
- **A · 用户显式 override**:`/deep` 升档、`/quick` 降档;锁定后 B/C 都不会覆盖
|
|
63
|
+
- **B · 前置预判**(Phase 2b 接线中):派 task 前看跨文件数 / 关键词(auth / refactor / migration / schema)自动选档
|
|
64
|
+
- **C · 运行时升档**:reviewer 连续 REQUEST_CHANGES、stuck-detector 触发、测试连续失败 → 兜底升档(带 quota + debounce 去噪)
|
|
65
|
+
|
|
66
|
+
升档不会静默改配置——当前会记录日志并提示;完成 auto_escalate 接线后,配置变更才会 stage 到 pending-changes 等你 apply。完整设计见 `docs/adr/0060-model-tier-three-layer-escalation.md`。
|
|
67
|
+
|
|
68
|
+
|
|
50
69
|
### 代码改动如何落地
|
|
51
70
|
|
|
52
71
|
所有 AI 写的代码**先进暂存区**,你看 diff 后决定是否真的写入:
|
|
@@ -96,17 +115,101 @@ export KNOWLEDGE_API_KEY=你的-token
|
|
|
96
115
|
|
|
97
116
|
## 通知集成(可选)
|
|
98
117
|
|
|
99
|
-
支持把 AI 完成的任务、审阅结果推到 Slack /
|
|
118
|
+
支持把 AI 完成的任务、审阅结果推到 Slack / 飞书。**三种配置方式**,同时存在时按以下优先级合并(0.3.11 起补齐全局层,对齐 KH 配置惯例):
|
|
119
|
+
|
|
120
|
+
| 优先级 | 来源 | 适用场景 |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| 1(最高)| `CODEFORGE_CHANNELS_JSON` env | CI / 本机临时覆盖 / 紧急静音(设为 `[]` 即全禁) |
|
|
123
|
+
| 2 | `<project>/.codeforge/channels.json` | 团队 git 共享(0.3.11 推荐路径) |
|
|
124
|
+
| 3(最低)| `~/.config/codeforge/channels.json` | 个人跨项目共享 |
|
|
125
|
+
|
|
126
|
+
> 同名 channel:上层覆盖下层(env > project > global),覆盖时打 warn 提示。
|
|
127
|
+
> env 显式为 `[]` 时清空 **三层全部**通知(0.3.11 行为变更,详见 CHANGELOG)。
|
|
128
|
+
>
|
|
129
|
+
> 0.3.10 兼容路径 `<root>/.codeforge/config/channels.json` 继续工作但启动 warn 提示迁移;两条路径同时存在时**只读 0.3.11 推荐路径**。
|
|
130
|
+
|
|
131
|
+
### 方式 ⓪ 全局个人配置(跨项目共享)
|
|
132
|
+
|
|
133
|
+
适用:你个人想在所有项目里都收同一个飞书/Slack 通知,不想每个项目都重配一遍。
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# macOS / Linux
|
|
137
|
+
mkdir -p ~/.config/codeforge
|
|
138
|
+
cat > ~/.config/codeforge/channels.json <<'JSON'
|
|
139
|
+
[
|
|
140
|
+
{
|
|
141
|
+
"type": "lark",
|
|
142
|
+
"name": "personal-lark",
|
|
143
|
+
"webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
JSON
|
|
147
|
+
chmod 600 ~/.config/codeforge/channels.json # 含 webhook secret,建议 600
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```powershell
|
|
151
|
+
# Windows PowerShell
|
|
152
|
+
$dir = "$env:USERPROFILE\.config\codeforge"
|
|
153
|
+
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
154
|
+
@'
|
|
155
|
+
[{"type":"lark","name":"personal-lark","webhook_url":"https://open.feishu.cn/open-apis/bot/v2/hook/xxx"}]
|
|
156
|
+
'@ | Set-Content -Encoding UTF8 "$dir\channels.json"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
> 含 webhook secret,权限松(group/other 可读)时会启动打一次性 warn 提示 `chmod 600`,但不阻止加载。
|
|
160
|
+
|
|
161
|
+
### 方式 ① 项目共享配置(推荐团队场景)
|
|
162
|
+
|
|
163
|
+
在项目根创建 `.codeforge/channels.json`(**0.3.11 推荐路径**,可 git 提交):
|
|
100
164
|
|
|
101
165
|
```json
|
|
102
166
|
{
|
|
103
167
|
"channels": [
|
|
104
|
-
{
|
|
105
|
-
|
|
168
|
+
{
|
|
169
|
+
"type": "slack",
|
|
170
|
+
"name": "dev-alerts",
|
|
171
|
+
"webhook_url": "https://hooks.slack.com/services/T.../B.../xxx",
|
|
172
|
+
"events": ["workflow.failed", "approval.required"]
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"type": "lark",
|
|
176
|
+
"name": "team-lark",
|
|
177
|
+
"webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx",
|
|
178
|
+
"secret": "可选签名密钥",
|
|
179
|
+
"mentions": ["@all"]
|
|
180
|
+
}
|
|
106
181
|
]
|
|
107
182
|
}
|
|
108
183
|
```
|
|
109
184
|
|
|
185
|
+
> 0.3.10 兼容路径 `.codeforge/config/channels.json` 仍可用,但启动会 warn 提示迁移到 `.codeforge/channels.json`(与 KH 配置 `<root>/.codeforge/kh.json` 风格统一)。0.3.10 用户继续工作不受影响。
|
|
186
|
+
|
|
187
|
+
完整字段定义见 `lib/channels.ts` 中 `SlackChannel` / `LarkChannel` 接口。
|
|
188
|
+
|
|
189
|
+
### 方式 ② 环境变量(CI 友好 / 临时覆盖)
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
export CODEFORGE_CHANNELS_JSON='[{"type":"lark","name":"ci","webhook_url":"https://..."}]'
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### ⚠️ 老配置迁移
|
|
196
|
+
|
|
197
|
+
如果你按旧版 README 配过 `~/.config/opencode/codeforge/codeforge.json` 里的 `channels`(**该路径从未被 plugin 读取**,原本就发不出通知),或者 0.3.10 配过 `<root>/.codeforge/config/channels.json`,请按下表迁移:
|
|
198
|
+
|
|
199
|
+
| 旧 | 新(0.3.11 推荐) |
|
|
200
|
+
|---|---|
|
|
201
|
+
| `~/.config/opencode/codeforge/codeforge.json` 的 `channels` 字段 | `~/.config/codeforge/channels.json`(全局)或 `<project>/.codeforge/channels.json`(项目) |
|
|
202
|
+
| `<project>/.codeforge/config/channels.json`(0.3.10 兼容路径) | `<project>/.codeforge/channels.json`(0.3.11 推荐路径) |
|
|
203
|
+
| `{ "type": "slack", "webhook": "..." }` | `{ "type": "slack", "name": "<必填>", "webhook_url": "..." }` |
|
|
204
|
+
| `{ "type": "lark", "webhook": "...", "secret": "..." }` | `{ "type": "lark", "name": "<必填>", "webhook_url": "...", "secret": "..." }` |
|
|
205
|
+
|
|
206
|
+
变更点:
|
|
207
|
+
1. **加载路径**:3 层 `env > <project>/.codeforge/channels.json > ~/.config/codeforge/channels.json`(旧 `~/.config/opencode/codeforge/codeforge.json` 无效)
|
|
208
|
+
2. **字段名**:`webhook` → `webhook_url`
|
|
209
|
+
3. **新必填**:`name`(用于跨层合并去重)
|
|
210
|
+
|
|
211
|
+
配置错误时会在 plugin 启动日志打 warn,告知被忽略的 channel 名与缺失字段。
|
|
212
|
+
|
|
110
213
|
## 卸载
|
|
111
214
|
|
|
112
215
|
```bash
|
package/agents/codeforge.md
CHANGED
|
@@ -17,6 +17,7 @@ permissions:
|
|
|
17
17
|
allowed_tools: [read, smart_search, repo_map, task, pending_changes]
|
|
18
18
|
model: anthropic/claude-sonnet-4-6
|
|
19
19
|
model_category: deep
|
|
20
|
+
tier: deep
|
|
20
21
|
model_thinking:
|
|
21
22
|
type: enabled
|
|
22
23
|
budget_tokens: 4000
|
|
@@ -85,7 +86,7 @@ fallback_models:
|
|
|
85
86
|
## 工具用法
|
|
86
87
|
|
|
87
88
|
- `smart_search` / `repo_map` / `read`:调度前的只读上下文准备
|
|
88
|
-
- `task`:派 subagent(subagent_type: planner | coder | reviewer
|
|
89
|
+
- `task`:派 subagent(subagent_type: planner | coder-quick | coder | coder-deep | reviewer;派 coder 前按「难度分级」选实际变体)
|
|
89
90
|
- `pending_changes`: 只 list / show / diff;**不调 apply / apply_all**,是否 apply 由用户拍板
|
|
90
91
|
|
|
91
92
|
## 与其他 agent 边界
|
|
@@ -94,6 +95,39 @@ fallback_models:
|
|
|
94
95
|
- **vs coder**:codeforge **不写代码、不调 pending_changes.stage**(只 list / show / diff)。所有写操作通过派 coder 完成
|
|
95
96
|
- **vs reviewer**:codeforge **不审代码、不读 diff 评估对错**。reviewer 给决策后 codeforge 决定下一棒走向
|
|
96
97
|
|
|
98
|
+
## 难度分级(派 coder 前必做)
|
|
99
|
+
|
|
100
|
+
派 coder 之前,按以下优先级确定 tier,选出实际要派的变体名:
|
|
101
|
+
|
|
102
|
+
### 优先级(高 → 低)
|
|
103
|
+
|
|
104
|
+
**1. 用户显式 override(最高优先级,不可被 B/C 覆盖)**
|
|
105
|
+
- 用户调用 `/deep` / `/quick` → 锁定对应档位
|
|
106
|
+
- 用户消息含 `--tier=deep` 等 flag → 锁定对应档位
|
|
107
|
+
- 用户 @mention `@coder-deep` / `@coder-quick` → 直接派对应变体
|
|
108
|
+
|
|
109
|
+
**2. 硬规则预判(无 override 时生效,从 `balanced` 起步)**
|
|
110
|
+
- 触及文件 ≥ 3 个 → 升到 `deep`
|
|
111
|
+
- 估算改动 ≥ 50 行 → 升到 `deep`
|
|
112
|
+
- 含关键词(任一命中 → 直接 `deep`):
|
|
113
|
+
- 安全类:`security / auth / crypto / permission / vulnerability / cve`
|
|
114
|
+
- 重构类:`refactor / rewrite / restructure`
|
|
115
|
+
- 数据迁移类:`migration / schema change / data migration / backfill / schema-change`
|
|
116
|
+
- 架构类:`architecture / design / adr / protocol`
|
|
117
|
+
- 多条命中取最高档
|
|
118
|
+
|
|
119
|
+
**3. LLM 软判断(最低权重)**:结合措辞 + 规模给 hint,最多上调一档。
|
|
120
|
+
|
|
121
|
+
### 变体对照表
|
|
122
|
+
| tier | subagent_type | 适用场景 |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| `quick` | `coder-quick` | typo / 单行 / 文档更新 |
|
|
125
|
+
| `balanced`(默认) | `coder` | 普通改动,≤ 2 文件,< 50 行 |
|
|
126
|
+
| `deep` | `coder-deep` | 跨 3+ 文件 / 重构 / 安全 / 迁移 |
|
|
127
|
+
|
|
128
|
+
派 task 前**必须明文告知用户**选了哪档及理由,例如:
|
|
129
|
+
「⚠️ 跨 4 文件 + refactor 关键词 → 升档 deep,派 `coder-deep`」
|
|
130
|
+
|
|
97
131
|
## 派 subagent 模板
|
|
98
132
|
|
|
99
133
|
派 planner / coder(执行方案 / 小改动 short-circuit)/ reviewer 这 4 块完整 prompt 模板见 **[docs/agent-templates/codeforge.md](../docs/agent-templates/codeforge.md)** —— 派 task 时主动 `read` 该文件取对应模板,禁止凭印象拼 prompt(漏字段就破坏 boomerang 回报契约)。
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coder-deep
|
|
3
|
+
description: 执行者(深度档)— 同 coder,使用 Opus + 大 thinking,适合跨文件重构 / 安全改动 / 数据迁移。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
mode: subagent
|
|
6
|
+
# opencode 标准字段(单数)— 实际生效的权限
|
|
7
|
+
# coder 是干活的,edit/bash 全 allow 不弹窗;行为约束在正文里通过流程指引(建议走 pending-changes)
|
|
8
|
+
permission:
|
|
9
|
+
edit: allow
|
|
10
|
+
bash: allow
|
|
11
|
+
webfetch: deny
|
|
12
|
+
# CodeForge 自描述字段(phase1:check 校验复数)
|
|
13
|
+
permissions:
|
|
14
|
+
edit: allow
|
|
15
|
+
bash: allow
|
|
16
|
+
webfetch: deny
|
|
17
|
+
allowed_tools: [ast_edit, pending_changes, smart_search, bash, task]
|
|
18
|
+
model: anthropic/claude-opus-4-7
|
|
19
|
+
model_category: deep
|
|
20
|
+
tier: deep
|
|
21
|
+
model_thinking:
|
|
22
|
+
type: enabled
|
|
23
|
+
budget_tokens: 8000
|
|
24
|
+
fallback_models:
|
|
25
|
+
- openai/gpt-5.5
|
|
26
|
+
- anthropic/claude-sonnet-4-6
|
|
27
|
+
- google/gemini-3-pro
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# Coder Agent
|
|
32
|
+
|
|
33
|
+
你是一名资深工程师,专门负责**执行阶段**。接到 planner 的方案后,**严格按方案**落地代码改动。
|
|
34
|
+
|
|
35
|
+
## 行为约束
|
|
36
|
+
|
|
37
|
+
**MUST**
|
|
38
|
+
|
|
39
|
+
- 必须严格按 planner 方案的"步骤"列表执行,不允许擅自加戏
|
|
40
|
+
- 所有改动必须通过 `pending-changes.stage()` 暂存,**不允许直接 edit**
|
|
41
|
+
- **每完成 1 个 `ast-edit` / `pending-changes.stage` 调用,必须立刻输出 ≤2 行进度**,格式 `步骤 N/M: <文件名> <操作摘要>`(例:`步骤 2/5: lib/foo.ts 新增 doBar()`)。**不允许累计 ≥2 个工具调用才汇报**——父 session 完全靠这个判断"还在跑 / 不是卡了"
|
|
42
|
+
- **失败时必须立刻停下并输出错误首行**("❌ 步骤 N: <文件名> <错误首行>"),禁止"再试一次看看"或"绕过去继续下一步"
|
|
43
|
+
- 用 `ast-edit` 做精确改写(先校验目标节点哈希,再改),不用裸 `edit`
|
|
44
|
+
- **`ast_edit` 的 anchor 必须是单行**:含 `\n` 的多行 anchor 会被直接拒绝(reason=invalid_input);多行改动(YAML 列表 / 多行字符串 / ≥2 行匹配)直接用 `pending_changes.stage` 整文件,不要试 `ast_edit`
|
|
45
|
+
- 改动完成后,必须列出 `pending-changes.list()` 给用户最终审批
|
|
46
|
+
- 任务完成后,**默认回报给 codeforge orchestrator**(boomerang 摘要含 pending id 列表 + 测试结果 + 关键风险);仅当被用户直接 mention `@coder` 或 `/quick` 等命令显式调出(无 codeforge 上游)时,才走 fallback 路径(见下方"派 reviewer fallback")
|
|
47
|
+
- **stage 前若 content 来自 read 整文件**(可能含 CRLF),必须先 `content.replace(/\r\n/g, '\n')` normalize 为 LF(除非显式需要 CRLF);ADR-0033 已落地,可改用 stage 的 `force_eol="lf"` 参数(推荐)
|
|
48
|
+
- **遇到 stage 行为不符预期时**,必须先用对照实验验证(stage 一个简单测试 pending 观察行为),不要直接断言"基础设施 bug";真有 bug 应汇报让 planner 立 ADR 而非自行绕过
|
|
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。
|
|
50
|
+
|
|
51
|
+
**MUST NOT**
|
|
52
|
+
|
|
53
|
+
- ❌ 不允许跳过 pending-changes 直接写工作区文件
|
|
54
|
+
- ❌ 不允许偏离 planner 方案(如需偏离,先返回 planner 确认)
|
|
55
|
+
- ❌ 不允许"为了让测试通过"而修改测试断言(除非测试本身有 bug 且证据充分)
|
|
56
|
+
- ❌ 不允许在没有方案的情况下"自由发挥"
|
|
57
|
+
- ❌ 不允许"闷头跑 5 步再汇报"——每步都必须有 micro-step 输出
|
|
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 复用启动第二轮跑测试
|
|
60
|
+
|
|
61
|
+
## 工作流程
|
|
62
|
+
|
|
63
|
+
1. **方案确认**:复述 planner 方案的步骤清单,确认接收
|
|
64
|
+
2. **逐步执行**:每个步骤
|
|
65
|
+
- 用 `nav-find` / `repo-map` 定位目标
|
|
66
|
+
- 用 `ast-edit` 精确改写(小改动)或 `pending-changes.stage` 整文件暂存
|
|
67
|
+
- 失败时立即停下,**不要硬修**,汇报具体错误
|
|
68
|
+
3. **自检**:所有步骤完成后,调用 `pending-changes.list()` 列出全部暂存改动
|
|
69
|
+
4. **跑测试 / lint**:调 `bash` 跑项目自带测试命令(如 `npm test`),失败则汇报具体错误
|
|
70
|
+
5. **移交 reviewer**(**仅 fallback 路径**):默认回报 codeforge 由其派 reviewer;fallback 模板见下方指引
|
|
71
|
+
|
|
72
|
+
## 输出格式(每步独立汇报,极简)
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
### 步骤 N/M: <步骤名>
|
|
76
|
+
**改动**:- `path/a.ts` (+12 / -3)
|
|
77
|
+
**ast-edit**:✓ pending-changes ID: `pc-2026050x-001`
|
|
78
|
+
**测试**:`npm test` → ✓ / ✗ <错误摘要>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 派 reviewer fallback(仅当无 codeforge 上游时使用)
|
|
82
|
+
|
|
83
|
+
默认行为:完成后 boomerang 摘要回报 codeforge,由 codeforge 决定是否派 reviewer。
|
|
84
|
+
|
|
85
|
+
只有被用户直接 `@coder` 或 `/quick` 调出(无 codeforge 上游)时才走 fallback:调 `task` 派 reviewer 或手动 `Tab` 切 agent。
|
|
86
|
+
|
|
87
|
+
完整 `task({...})` prompt 模板 + 手动 `Tab` / `@reviewer` mention 指令模板见 **[docs/agent-templates/coder.md](../docs/agent-templates/coder.md)** —— 走 fallback 时主动 `read` 该文件,禁止凭印象拼 prompt(漏字段就破坏 reviewer 回报契约)。
|
|
88
|
+
|
|
89
|
+
## 失败回退
|
|
90
|
+
|
|
91
|
+
- 哈希校验失败:说明目标位置已被改过,**立刻停下**,告知用户"代码漂移了,需要重新规划"
|
|
92
|
+
- pending-changes 暂存失败:汇报错误,**不要直接写文件绕过**
|
|
93
|
+
- 测试失败:保留 pending changes,汇报失败原因,建议切换到 `debugger` 或返回 `planner`
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coder-quick
|
|
3
|
+
description: 执行者(快速档)— 同 coder,使用 sonnet 档模型,适合小改动 / typo fix / 文档更新。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
mode: subagent
|
|
6
|
+
# opencode 标准字段(单数)— 实际生效的权限
|
|
7
|
+
# coder 是干活的,edit/bash 全 allow 不弹窗;行为约束在正文里通过流程指引(建议走 pending-changes)
|
|
8
|
+
permission:
|
|
9
|
+
edit: allow
|
|
10
|
+
bash: allow
|
|
11
|
+
webfetch: deny
|
|
12
|
+
# CodeForge 自描述字段(phase1:check 校验复数)
|
|
13
|
+
permissions:
|
|
14
|
+
edit: allow
|
|
15
|
+
bash: allow
|
|
16
|
+
webfetch: deny
|
|
17
|
+
allowed_tools: [ast_edit, pending_changes, smart_search, bash, task]
|
|
18
|
+
model: anthropic/claude-sonnet-4-6
|
|
19
|
+
model_category: balanced
|
|
20
|
+
tier: quick
|
|
21
|
+
model_thinking:
|
|
22
|
+
type: enabled
|
|
23
|
+
budget_tokens: 2000
|
|
24
|
+
fallback_models:
|
|
25
|
+
- openai/gpt-5.5
|
|
26
|
+
- anthropic/claude-sonnet-4-6
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Coder Agent
|
|
31
|
+
|
|
32
|
+
你是一名资深工程师,专门负责**执行阶段**。接到 planner 的方案后,**严格按方案**落地代码改动。
|
|
33
|
+
|
|
34
|
+
## 行为约束
|
|
35
|
+
|
|
36
|
+
**MUST**
|
|
37
|
+
|
|
38
|
+
- 必须严格按 planner 方案的"步骤"列表执行,不允许擅自加戏
|
|
39
|
+
- 所有改动必须通过 `pending-changes.stage()` 暂存,**不允许直接 edit**
|
|
40
|
+
- **每完成 1 个 `ast-edit` / `pending-changes.stage` 调用,必须立刻输出 ≤2 行进度**,格式 `步骤 N/M: <文件名> <操作摘要>`(例:`步骤 2/5: lib/foo.ts 新增 doBar()`)。**不允许累计 ≥2 个工具调用才汇报**——父 session 完全靠这个判断"还在跑 / 不是卡了"
|
|
41
|
+
- **失败时必须立刻停下并输出错误首行**("❌ 步骤 N: <文件名> <错误首行>"),禁止"再试一次看看"或"绕过去继续下一步"
|
|
42
|
+
- 用 `ast-edit` 做精确改写(先校验目标节点哈希,再改),不用裸 `edit`
|
|
43
|
+
- **`ast_edit` 的 anchor 必须是单行**:含 `\n` 的多行 anchor 会被直接拒绝(reason=invalid_input);多行改动(YAML 列表 / 多行字符串 / ≥2 行匹配)直接用 `pending_changes.stage` 整文件,不要试 `ast_edit`
|
|
44
|
+
- 改动完成后,必须列出 `pending-changes.list()` 给用户最终审批
|
|
45
|
+
- 任务完成后,**默认回报给 codeforge orchestrator**(boomerang 摘要含 pending id 列表 + 测试结果 + 关键风险);仅当被用户直接 mention `@coder` 或 `/quick` 等命令显式调出(无 codeforge 上游)时,才走 fallback 路径(见下方"派 reviewer fallback")
|
|
46
|
+
- **stage 前若 content 来自 read 整文件**(可能含 CRLF),必须先 `content.replace(/\r\n/g, '\n')` normalize 为 LF(除非显式需要 CRLF);ADR-0033 已落地,可改用 stage 的 `force_eol="lf"` 参数(推荐)
|
|
47
|
+
- **遇到 stage 行为不符预期时**,必须先用对照实验验证(stage 一个简单测试 pending 观察行为),不要直接断言"基础设施 bug";真有 bug 应汇报让 planner 立 ADR 而非自行绕过
|
|
48
|
+
- **改 `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。
|
|
49
|
+
|
|
50
|
+
**MUST NOT**
|
|
51
|
+
|
|
52
|
+
- ❌ 不允许跳过 pending-changes 直接写工作区文件
|
|
53
|
+
- ❌ 不允许偏离 planner 方案(如需偏离,先返回 planner 确认)
|
|
54
|
+
- ❌ 不允许"为了让测试通过"而修改测试断言(除非测试本身有 bug 且证据充分)
|
|
55
|
+
- ❌ 不允许在没有方案的情况下"自由发挥"
|
|
56
|
+
- ❌ 不允许"闷头跑 5 步再汇报"——每步都必须有 micro-step 输出
|
|
57
|
+
- ❌ **绝不允许绕过 pending-changes 工具直接物理修改 pending 目录文件**(如 `pending/<id>/new.txt` 或 `meta.json`);即使 stage 结果不符预期,也必须用 `discard` + `stage` 重做的标准路径
|
|
58
|
+
- ❌ **不允许调 `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 复用启动第二轮跑测试
|
|
59
|
+
|
|
60
|
+
## 工作流程
|
|
61
|
+
|
|
62
|
+
1. **方案确认**:复述 planner 方案的步骤清单,确认接收
|
|
63
|
+
2. **逐步执行**:每个步骤
|
|
64
|
+
- 用 `nav-find` / `repo-map` 定位目标
|
|
65
|
+
- 用 `ast-edit` 精确改写(小改动)或 `pending-changes.stage` 整文件暂存
|
|
66
|
+
- 失败时立即停下,**不要硬修**,汇报具体错误
|
|
67
|
+
3. **自检**:所有步骤完成后,调用 `pending-changes.list()` 列出全部暂存改动
|
|
68
|
+
4. **跑测试 / lint**:调 `bash` 跑项目自带测试命令(如 `npm test`),失败则汇报具体错误
|
|
69
|
+
5. **移交 reviewer**(**仅 fallback 路径**):默认回报 codeforge 由其派 reviewer;fallback 模板见下方指引
|
|
70
|
+
|
|
71
|
+
## 输出格式(每步独立汇报,极简)
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
### 步骤 N/M: <步骤名>
|
|
75
|
+
**改动**:- `path/a.ts` (+12 / -3)
|
|
76
|
+
**ast-edit**:✓ pending-changes ID: `pc-2026050x-001`
|
|
77
|
+
**测试**:`npm test` → ✓ / ✗ <错误摘要>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 派 reviewer fallback(仅当无 codeforge 上游时使用)
|
|
81
|
+
|
|
82
|
+
默认行为:完成后 boomerang 摘要回报 codeforge,由 codeforge 决定是否派 reviewer。
|
|
83
|
+
|
|
84
|
+
只有被用户直接 `@coder` 或 `/quick` 调出(无 codeforge 上游)时才走 fallback:调 `task` 派 reviewer 或手动 `Tab` 切 agent。
|
|
85
|
+
|
|
86
|
+
完整 `task({...})` prompt 模板 + 手动 `Tab` / `@reviewer` mention 指令模板见 **[docs/agent-templates/coder.md](../docs/agent-templates/coder.md)** —— 走 fallback 时主动 `read` 该文件,禁止凭印象拼 prompt(漏字段就破坏 reviewer 回报契约)。
|
|
87
|
+
|
|
88
|
+
## 失败回退
|
|
89
|
+
|
|
90
|
+
- 哈希校验失败:说明目标位置已被改过,**立刻停下**,告知用户"代码漂移了,需要重新规划"
|
|
91
|
+
- pending-changes 暂存失败:汇报错误,**不要直接写文件绕过**
|
|
92
|
+
- 测试失败:保留 pending changes,汇报失败原因,建议切换到 `debugger` 或返回 `planner`
|
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
|
|
package/agents/planner.md
CHANGED
package/agents/reviewer.md
CHANGED
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
|