Skip to content

Commit 3481152

Browse files
authored
Merge pull request #11 from YingchaoX/feat/simplify-modes-build-plan
Feat/simplify modes build plan
2 parents f13919f + 7b7437d commit 3481152

28 files changed

Lines changed: 875 additions & 365 deletions

README.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
- **权限与安全**
3535
- `internal/security` + `internal/permission` 负责工作区边界、危险命令识别与策略决策。
36-
- 策略值 `allow/ask/deny`,支持按工具与 bash pattern 配置,`yolo + bash` 特殊全放行路径
36+
- 仅保留 `build`/`plan` 两套运行预设,`/mode``/permissions` 联动切换
3737

3838
- **存储与会话**
3939
- 使用 SQLite 持久化消息、会话、todo 及权限日志,默认路径 `~/.coder`(可通过配置覆盖)。
@@ -155,7 +155,7 @@ go build -o coder ./cmd/agent
155155

156156
```text
157157
context: 0 tokens · model: qwen2.5-coder-32b-instruct
158-
[default] /path/to/your/workspace>
158+
[build] /path/to/your/workspace>
159159
```
160160

161161
即表示 REPL 已启动成功。
@@ -181,16 +181,16 @@ context: 0 tokens · model: qwen2.5-coder-32b-instruct
181181
- 特点:
182182
- 不调用模型,视为“用户自己在 shell 中执行”。
183183
- 结果以 `[COMMAND]` 区块返回,包含命令回显、exit code、持续时间、stdout/stderr 等。
184-
- 仍受工作区边界与 `bash` 工具内部超时/输出截断约束。
184+
- 仍受 Agent/Policy/审批链、工作区边界与 `bash` 工具内部超时/输出截断约束。
185185

186186
### `/` 内建命令
187187

188188
`/` 命令由 `internal/orchestrator` 的 slash 分支解析,当前实现包括(详见 `docs/technical/02-Orchestrator执行循环.md`):
189189

190190
- `/help`:展示基本使用说明与命令列表。
191191
- `/model <name>`:切换当前会话模型,并尝试写入 `./.coder/config.json`
192-
- `/permissions [preset]`:展示或切换权限预设(`strict``balanced``auto-edit``yolo`
193-
- `/mode <name>`:切换模式,也可使用 `/plan``/default``/auto-edit``/yolo` 快捷命令。
192+
- `/permissions [preset]`:展示或切换权限预设(`build``plan`),并联动当前模式
193+
- `/mode <build|plan>`:切换模式,也可使用 `/build``/plan` 快捷命令。
194194
- `/tools`:展示当前注册与可用的工具列表。
195195
- `/skills`:展示当前可用的 Skills 列表。
196196
- `/todos`:查看当前会话 todo 列表(只读)。
@@ -206,12 +206,10 @@ context: 0 tokens · model: qwen2.5-coder-32b-instruct
206206

207207
### 模式(REPL /mode)
208208

209-
当前支持四种模式`internal/orchestrator` 中的 `mode` 字段):
209+
当前支持两种模式`internal/orchestrator` 中的 `mode` 字段):
210210

211-
- `plan`:仅规划与拆解,默认禁写入(`write/patch`)与高风险命令,不启用自动验证。
212-
- `default`:均衡模式,写入与高风险操作按策略 `allow/ask/deny` 执行,自动验证仅在用户明确要求时触发。
213-
- `auto-edit`:偏向交付改动,允许主动读写与自动验证,支持失败后注入修复提示并重试。
214-
- `yolo`:高自治模式,对 `bash` 走全放行路径,但仍有工作区与基础安全约束。
211+
- `build`:交付模式,支持代码修改与验证;禁用 `todowrite`(不能设置 todos)。
212+
- `plan`:规划模式,可联网与规划 todo;禁用写改删相关工具能力;`bash` 对白名单命令直接放行,其它命令走审批。
215213

216214
模式会直接体现在提示符第二行的 `[mode]` 部分。
217215

docs/design-v2.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ flowchart TD
101101
- `storage.SessionMeta``storage.TodoItem`:会话与 todo 状态。
102102

103103
## 7. 当前实现约束与已知差异
104-
- `/mode` 目前主要是会话展示状态,不直接改变策略引擎决策。
104+
- `/mode` 仅保留 `build|plan`,并与同名 Agent + Permission preset 联动切换。
105+
- `build` 禁用 `todowrite`;todo 规划与写入仅在 `plan` 模式允许。
106+
- `plan` 为硬只读规划模式:禁用 `edit/write/patch/task``bash` 仅允许只读白名单命令。
105107
- `/undo` 为整工作区 git 回滚(`git restore . && git clean -fd`),不是“按回合精确撤销”。
106108
- 自动验证命令选择为“配置优先 + 项目类型启发式”,当前未启用固定白名单硬约束。
107109

docs/requirements/01-产品形态与界面.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
### 2.1 TTY 输入
1111
- Enter:发送当前输入。
1212
- 多行粘贴(Bracketed Paste):显示 `[copy N lines]`,再按 Enter 发送整段。
13+
- Tab(输入框为空时):在 `build``plan` 模式之间切换。
1314
- Ctrl+D:忽略,不作为发送键。
1415
- Ctrl+C:中断输入循环并退出程序。
1516
- Esc(输入编辑态):清空当前输入框,不提交。
@@ -35,7 +36,7 @@
3536
- `/help`
3637
- `/model <name>`
3738
- `/permissions [preset]`
38-
- `/mode <name>``/plan``/default``/auto-edit``/yolo`
39+
- `/mode <build|plan>``/build``/plan`
3940
- `/tools``/skills``/todos`
4041
- `/new``/resume [session-id]``/sessions`
4142
- `/compact``/diff``/undo`
@@ -44,8 +45,10 @@
4445
- `/help` 输出中的命令列表需按“每行一个命令”展示,避免全部命令挤在同一行。
4546

4647
## 5. 模式(用户可见)
47-
- 支持值:`plan``default``auto-edit``yolo`
48-
- 当前实现中,模式主要用于提示符显示与会话状态表达;工具执行策略仍主要由 Agent 工具开关与 Permission Policy 决定。
48+
- 支持值:`build``plan`
49+
- `/mode` 与 Agent 联动:切换模式会同时切换同名 Agent 与同名权限预设。
50+
- `build`:交付模式,可读写代码;禁止 `todowrite`(不能设置 todos)。
51+
- `plan`:规划模式,可联网与规划 todos;禁止写改删相关能力(如 `edit/write/patch`)。
4952

5053
## 6. 颜色约定(终端 ANSI)
5154
- context 行:dim gray

docs/requirements/02-交互逻辑与状态流.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@
2525

2626
## 4. `!` 命令模式
2727
- 跳过模型调用。
28-
- 直接执行 `bash` 工具
29-
- 不走 Policy/风险审批链,但仍受
28+
- 通过 `bash` 工具执行命令
29+
- 走与普通工具调用一致的 Agent/Policy/审批链,仍受
3030
- 当前 Agent 是否允许 `bash`
31+
- `bash` pattern 策略(如 `plan` 模式下只读白名单)
3132
- `bash` 工具自身超时/输出限制
3233
- 工作区 cwd 约束
3334
- 结果按 `[COMMAND]` 块展示,并写入会话消息。
3435

3536
## 5. `/` 内建命令行为
3637
- `/model <name>`:切换当前 provider model,并尝试持久化到 `./.coder/config.json`
37-
- `/permissions [preset]`:查看或套用 `strict|balanced|auto-edit|yolo`
38+
- `/permissions [preset]`:查看或套用 `build|plan`(与 `/mode` 联动)。
39+
- `/mode <build|plan>`:切换模式,并同时切换同名 Agent 与权限预设。
40+
- `/build``/plan``/mode build|plan` 的快捷命令。
3841
- `/new`:创建新会话并清空当前内存消息。
3942
- `/resume [session-id]`
4043
- 带参数:从存储加载该会话消息。

docs/requirements/04-安全与权限规则.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,22 @@
3131
- `always` 仅对策略 ask 生效,会写入项目级 allowlist(`./.coder/config.json`)。
3232

3333
## 5. 命令模式 `!` 的例外
34-
`!` 命令不经过 Policy 与风险审批链,但仍受
34+
`!` 命令与普通 `bash` 工具调用一致,经过 Policy 与风险审批链,并受
3535
- Agent 工具开关(`bash` 是否启用)
36+
- `bash` pattern 策略
3637
- `bash` 工具超时/输出限制
3738
- 工作区执行目录约束
3839

3940
## 6. `/permissions` 预设
40-
- `strict`
41-
- `balanced`
42-
- `auto-edit`
43-
- `yolo`
41+
- `build`
42+
- `plan`
4443

45-
说明:这是运行时策略切换,不改变 `/mode` 本身行为语义
44+
说明:`/permissions``/mode` 联动,切换其中任一命令都会同步到同名运行态
4645

4746
## 7. 当前已知边界
48-
- `mode=yolo` 本身不会绕过 Policy;真正放行依赖 `/permissions yolo` 或配置策略。
47+
- `plan` 模式下:
48+
- 通过 Agent 工具开关禁用 `edit/write/patch/task` 与变更型 git 工具。
49+
- `bash` 采用 “allow + ask”:
50+
- 常见只读诊断命令白名单(如 `ls/cat/grep/git status|diff|log/uname/pwd/id`)直接 `allow`
51+
- 非白名单命令默认 `ask`,进入审批链后再执行或拒绝。
4952
- `allowlist` 按命令名匹配,不按完整参数串匹配。

docs/requirements/05-Agent与任务编排.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# 05. Agent 与任务编排
22

33
## 1. 内置 Agent
4-
- `build`(primary):默认主代理,工具全开
5-
- `plan`(primary):规划代理,禁用 `write/edit/patch`
4+
- `build`(primary):默认主代理,负责交付改动;禁用 `todowrite`(不能设置 todos)
5+
- `plan`(primary):规划代理,可联网与规划 todo;禁用写改删相关工具(`write/edit/patch`)与 `task`
66
- `general`(subagent):通用子代理。
77
- `explore`(subagent):只读探索,禁用 `edit/write/patch/bash/task/todowrite`
88

99
## 2. Agent 生效方式
1010
- Agent 决定“模型可见工具集合”和“执行前工具开关检查”。
1111
- 即使模型返回禁用工具调用,也会在执行前被拦截为 blocked tool 结果。
12-
- `/mode` 与 Agent 解耦:`/mode` 不会自动切换 Agent。
12+
- `/mode <build|plan>` 与 Agent 联动:切换模式会同步切换同名 Agent 与同名权限预设
1313

1414
## 3. 子任务(task 工具)
1515
- 输入:`agent + objective`
@@ -30,6 +30,10 @@
3030
- 输入被 `isComplexTask` 判定为复杂
3131
- 当前会话无“未完成 todo”
3232

33+
约束:
34+
- `build` 因禁用 `todowrite`,不会自动初始化 todos。
35+
- todo 创建/更新仅允许在 `plan` 模式完成。
36+
3337
默认生成策略:
3438
- 中文输入:`阅读代码并确认目标/验收标准 -> 实施修改 -> 验证总结`
3539
- 英文输入:`Clarify scope -> Implement changes -> Validate and summarize`

docs/technical/00-总体架构.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656

5757
## 7. 核心不变量
5858
- 文件工具始终受工作区边界约束。
59-
- 四模式均可用:`plan``default``auto-edit``yolo`
60-
- `yolo + bash` 始终走全放行路径。
59+
- 仅保留两种模式:`build``plan`
60+
- `/mode` 与 Agent/Permission 预设联动切换。
61+
- `build` 禁用 `todowrite``plan` 禁用 `edit/write/patch/task``bash` 仅只读白名单。
6162
- 自动验证只执行白名单命令。
6263
- `/undo` 仅在检测到 git 可用且当前目录为 git 仓库时启用。

docs/technical/02-Orchestrator执行循环.md

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,36 +30,32 @@
3030
5. 执行工具。
3131
6. 结果写入 `tool` 消息并更新运行状态。
3232

33-
例外:`yolo + bash`
34-
- 跳过策略拦截与风险审批,直接执行。
35-
3633
## 5. 模式行为矩阵
37-
- `plan`
38-
- 目标:方案与拆解。
39-
- 默认禁写入链路(`write/patch`)与副作用命令。
40-
- 不触发自动验证。
41-
- `default`
42-
- 目标:均衡执行。
43-
- 写入与高风险操作按策略审批。
44-
- 自动验证仅在用户明确要求时触发。
45-
- `auto-edit`
34+
- `build`
4635
- 目标:交付改动。
47-
- 允许主动读写、自动验证、失败修复重试。
48-
- `yolo`
49-
- 目标:高自治执行。
50-
- `bash` 全放行(包含高风险命令)。
36+
- 允许读写与自动验证。
37+
- 禁用 `todowrite`(不能设置 todos)。
38+
- `plan`
39+
- 目标:规划与分析。
40+
- 工具层阻断写改删:禁用 `edit/write/patch/task` 与变更型 git 工具。
41+
- 允许联网(`fetch`)与 todo 规划(`todoread/todowrite`)。
42+
- `bash` 使用白名单直通 + 非白名单审批:
43+
- 白名单(如 `ls/cat/grep/git status|diff|log/uname/pwd/id`)直接执行。
44+
- 其他命令默认 `ask`,走审批后执行。
5145

5246
## 6. `!` 命令分支
5347
- 直接调用 `bash` 工具,不发模型请求。
54-
- 视为用户直接在终端执行 shell:**不经过策略层与风险审批链**,仅受工作区路径等基础安全约束(详见《04-安全与权限规则》中的“命令模式 `!`”小节)。
48+
- 经过与普通 `bash` 一致的策略与审批链:
49+
- Policy 决策(`allow/ask/deny`
50+
- 工具层风险审批(如危险命令与重定向覆盖检查)
5551
- 返回结构化执行结果(命令、exit code、stdout/stderr)。
5652

5753
## 7. `/` 命令分支
5854
首发全量支持(与需求 02 子命令契约一致):
5955
- `/help`
6056
- `/model <name>`
6157
- `/permissions [preset]`
62-
- `/mode <name>`(或 `/plan``/default``/auto-edit``/yolo` 等价形式)
58+
- `/mode <build|plan>`(或 `/build``/plan` 等价形式)
6359
- `/tools`
6460
- `/skills`
6561
- `/todos`
@@ -72,8 +68,8 @@
7268
子命令契约摘要:
7369
- `/help`:展示命令、Enter/Ctrl+D 输入规则、流式中断等说明。
7470
- `/model <name>`:立即切换当前会话模型,并尝试持久化到 `./.coder/config.json`
75-
- `/permissions [preset]`:无参数时展示当前权限矩阵;有参数时切换权限预设(`strict``balanced``auto-edit``yolo`
76-
- `/mode <name>`切换当前模式并更新提示符(或使用 `/plan``/default``/auto-edit``/yolo`)。
71+
- `/permissions [preset]`:无参数时展示当前权限矩阵;有参数时切换权限预设(`build``plan`),并联动当前模式
72+
- `/mode <build|plan>`切换当前模式并联动切换同名 Agent 与权限预设(或使用 `/build``/plan`)。
7773
- `/tools`:展示当前可用工具列表/摘要。
7874
- `/skills`:展示当前可用技能列表/摘要。
7975
- `/todos`:仅查看当前会话 todo 列表(只读)。
@@ -97,7 +93,7 @@
9793
- `workflow.auto_verify_after_edit=true`
9894
- `bash` 工具可用。
9995
- 尝试次数未超过 `max_verify_attempts`
100-
- 当前模式为 `auto-edit``yolo`,或 `default` 下用户明确要求
96+
- 当前模式为 `build`,且用户明确要求或流程判定需要自动验证
10197

10298
执行规则:
10399
- 仅允许白名单命令:

docs/technical/04-安全与权限实现.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,12 @@
3939
- 破坏系统可用性命令(如格式化磁盘、直接关机/重启)。
4040
- 越权写受保护路径且无白名单授权。
4141

42-
## 6. `yolo + bash` 特例
43-
- 直接执行。
44-
- 不触发 `ask``deny`、风险审批、硬阻断拦截。
42+
## 6. 模式与权限联动
43+
- 仅保留 `build``plan` 两个运行态预设。
44+
- `/mode``/permissions` 使用同名预设联动切换,避免“模式与策略脱节”。
45+
- `plan` 通过 Agent + Policy 双层限制实现“工具只读 + bash 审批”:
46+
- Agent 侧禁用 `edit/write/patch/task` 与变更型 git 工具。
47+
- Policy 侧 `bash` 基线为 `ask`,白名单命令 `allow`
4548

4649
## 7. 审批交互契约
4750
当启用交互审批时,必须提供三选项(仅对**策略层 `ask`** 生效):
@@ -59,15 +62,14 @@
5962
- `sudo` 不纳入自动放行。
6063

6164
适用范围:
62-
- 仅用于**模型触发的工具调用**(包括自动触发的 `skill`),由策略层 `ask` 驱动的审批交互产生
63-
- **命令模式 `!`** 不走策略/风险审批链,等价用户在终端直接执行命令,不受 allowlist 影响。
65+
- 用于策略层 `ask` 的 bash 调用(包括模型触发与命令模式 `!`),由审批交互产生
66+
- 危险命令风险审批仍为 y/n,不受 allowlist 影响。
6467

6568
## 9. 决策优先级
66-
1. `yolo + bash` 直接放行。
67-
2. `deny`(策略或硬阻断)。
68-
3. 用户拒绝。
69-
4. 自动触发 skill 免审批例外(前提非 `deny`)。
70-
5. allowlist 命中。
71-
6. 用户同意一次。
72-
7. `ask + auto_approve_ask=true`
73-
8. 普通 `allow`
69+
1. `deny`(策略或硬阻断)。
70+
2. 用户拒绝。
71+
3. 自动触发 skill 免审批例外(前提非 `deny`)。
72+
4. allowlist 命中。
73+
5. 用户同意一次。
74+
6. `ask + auto_approve_ask=true`
75+
7. 普通 `allow`

docs/technical/09-REPL交互与渲染实现.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@
77

88
示例:
99
- 第一行:`context: 1200 tokens · model: gpt-4o`
10-
- 第二行:`[default] /Users/dev/myapp> `(或后接用户已输入内容)
10+
- 第二行:`[build] /Users/dev/myapp> `(或后接用户已输入内容)
1111

1212
## 2. 输入规则
1313
- **发送**:Enter 即发送当前输入。单行时直接 Enter 发送;多行仅支持粘贴:粘贴后终端显示 `[copy N lines]`,再按 Enter 发送该多行内容。TTY 下为 raw 模式;非 TTY(管道)下按行或 EOF 读取。
14+
- **Tab 模式切换**:仅当输入框为空时,Tab 在 `build``plan` 之间切换;当输入框非空时,Tab 保持输入编辑行为。
1415
- **输入历史(↑/↓)**:与典型 Linux 终端行为接近。在输入态下,↑ 可调出上一条用户输入,连续按 ↑ 逐条回溯直至最早记录并停留;↓ 则在历史中向前移动,越过最新记录后返回到“空输入行”(不保留中途编辑内容)。历史仅包含当前 REPL 进程内已成功提交的输入行。
1516
- **输入分支**
1617
- `!` 前缀:命令模式,直走 `bash`
1718
- `/` 前缀:内建命令。
1819
- 普通文本:进入模型-工具循环。
1920

2021
## 3. 模式切换
21-
- 通过内建命令切换:`/mode <name>``/plan``/default``/auto-edit``/yolo`
22+
- 通过内建命令切换:`/mode <build|plan>``/build``/plan`
2223
- 切换后提示符立即体现当前模式(第二行 `[mode]` 更新)。
2324

2425
## 4. 流式输出
@@ -65,7 +66,7 @@
6566
- **Tools、Skills**:通过 `/tools``/skills` 按需查看,非固定侧栏。
6667

6768
## 8. 审批交互
68-
- 触发场景:仅当**模型触发工具调用**且策略层或工具层判定为 `ask` 时(例如模型调用 `bash` 执行命令),命令模式 `!` 不走此交互链
69+
- 触发场景:当工具调用(包含命令模式 `!`)在策略层或工具层判定为 `ask` 时触发审批交互
6970
- 策略层 `ask`(如 `bash policy requires approval`):在 stdout 打印待执行命令与说明,从 REPL 读审批输入(y/n/always)后继续;`always` 表示将该命令记录到项目级 allowlist,后续相同命令在策略层自动放行。
7071
- 工具层危险命令风险审批(如 `matches dangerous command policy`):在 stdout 打印命令与说明,仅接受 y/n(不提供 `always`)。
7172
- 审批等待期间按 `Esc`:触发全局取消(等价 Cancel 整条自动化流程),不是 `N`
@@ -124,7 +125,7 @@ sequenceDiagram
124125
- `RunInput` 内部通过 `parseBangCommand` 判断是否为命令模式;命中后调用 `runBangCommand`,否则走 `/` 内建命令或 `RunTurn`(模型-工具循环)。
125126
- `runBangCommand` 首先追加一条 `user` 消息,内容为原始输入(例如 `"! ls"`),确保命令本身在后续模型上下文中可见。
126127
- **命令执行与风险模型**
127-
- 命令模式通过 `registry.Execute("bash", args)` 直接调用 `bash` 工具;**显式跳过策略层 Policy 与工具层风险审批链**,语义等价“用户自己在 shell 中执行该命令”
128+
- 命令模式通过 `bash` 工具执行命令,并复用 Agent/Policy/审批链(与普通 tool call 一致)
128129
- 仍受工具层安全配置约束:`command_timeout_ms``output_limit_bytes``bash` 在 JSON 结果中返回 `exit_code``stdout``stderr``truncated``duration_ms` 等字段。
129130
- 是否允许调用 `bash` 仅由 `activeAgent.ToolEnabled["bash"]` 控制;禁止时返回 `command mode denied: bash disabled by active agent <name>``assistant` 文本。
130131
- **渲染与 `[COMMAND]` 区块**

0 commit comments

Comments
 (0)