@tencent-ai/codebuddy-code 2.109.0 → 2.109.1

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.
Files changed (57) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/codebuddy-headless.js +8 -8
  3. package/dist/codebuddy.js +9 -9
  4. package/dist/web-ui/docs/cn/cli/cli-reference.md +8 -3
  5. package/dist/web-ui/docs/cn/cli/env-vars.md +2 -1
  6. package/dist/web-ui/docs/cn/cli/iam.md +9 -5
  7. package/dist/web-ui/docs/cn/cli/interactive-mode.md +2 -2
  8. package/dist/web-ui/docs/cn/cli/permission-modes.md +373 -101
  9. package/dist/web-ui/docs/cn/cli/permissions.md +36 -14
  10. package/dist/web-ui/docs/cn/cli/prewarm.md +135 -0
  11. package/dist/web-ui/docs/cn/cli/release-notes/README.md +14 -0
  12. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.0.md +48 -0
  13. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.1.md +13 -0
  14. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.2.md +24 -0
  15. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.3.md +14 -0
  16. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.4.md +24 -0
  17. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.5.md +18 -0
  18. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.6.md +15 -0
  19. package/dist/web-ui/docs/cn/cli/release-notes/v2.106.7.md +13 -0
  20. package/dist/web-ui/docs/cn/cli/release-notes/v2.107.0.md +30 -0
  21. package/dist/web-ui/docs/cn/cli/release-notes/v2.108.0.md +20 -0
  22. package/dist/web-ui/docs/cn/cli/release-notes/v2.108.1.md +15 -0
  23. package/dist/web-ui/docs/cn/cli/release-notes/v2.108.2.md +13 -0
  24. package/dist/web-ui/docs/cn/cli/release-notes/v2.109.0.md +24 -0
  25. package/dist/web-ui/docs/cn/cli/settings.md +166 -2
  26. package/dist/web-ui/docs/en/cli/cli-reference.md +15 -10
  27. package/dist/web-ui/docs/en/cli/env-vars.md +6 -5
  28. package/dist/web-ui/docs/en/cli/iam.md +9 -5
  29. package/dist/web-ui/docs/en/cli/interactive-mode.md +3 -3
  30. package/dist/web-ui/docs/en/cli/permission-modes.md +373 -101
  31. package/dist/web-ui/docs/en/cli/permissions.md +46 -24
  32. package/dist/web-ui/docs/en/cli/prewarm.md +125 -0
  33. package/dist/web-ui/docs/en/cli/release-notes/README.md +14 -0
  34. package/dist/web-ui/docs/en/cli/release-notes/v2.106.0.md +48 -0
  35. package/dist/web-ui/docs/en/cli/release-notes/v2.106.1.md +13 -0
  36. package/dist/web-ui/docs/en/cli/release-notes/v2.106.2.md +24 -0
  37. package/dist/web-ui/docs/en/cli/release-notes/v2.106.3.md +14 -0
  38. package/dist/web-ui/docs/en/cli/release-notes/v2.106.4.md +24 -0
  39. package/dist/web-ui/docs/en/cli/release-notes/v2.106.5.md +18 -0
  40. package/dist/web-ui/docs/en/cli/release-notes/v2.106.6.md +15 -0
  41. package/dist/web-ui/docs/en/cli/release-notes/v2.106.7.md +13 -0
  42. package/dist/web-ui/docs/en/cli/release-notes/v2.107.0.md +30 -0
  43. package/dist/web-ui/docs/en/cli/release-notes/v2.108.0.md +20 -0
  44. package/dist/web-ui/docs/en/cli/release-notes/v2.108.1.md +15 -0
  45. package/dist/web-ui/docs/en/cli/release-notes/v2.108.2.md +13 -0
  46. package/dist/web-ui/docs/en/cli/release-notes/v2.109.0.md +24 -0
  47. package/dist/web-ui/docs/en/cli/settings.md +166 -2
  48. package/dist/web-ui/docs/search-index-en.json +1 -1
  49. package/dist/web-ui/docs/search-index-zh.json +1 -1
  50. package/dist/web-ui/docs/sidebar-en.json +1 -1
  51. package/dist/web-ui/docs/sidebar-zh.json +1 -1
  52. package/package.json +1 -1
  53. package/product.cloudhosted.json +2 -2
  54. package/product.internal.json +2 -2
  55. package/product.ioa.json +2 -2
  56. package/product.json +2 -2
  57. package/product.selfhosted.json +2 -2
@@ -1,76 +1,115 @@
1
1
  # 权限模式
2
2
 
3
- > 控制 CodeBuddy 在编辑文件、运行命令、发起网络请求前要不要先停下来询问。模式决定整段会话的节奏:保守模式逐次审批,宽松模式让 CodeBuddy 长时间不打断地推进、最后回报。敏感操作选严格、信任方向时选宽松。
3
+ > 控制 CodeBuddy 在编辑文件、运行命令、访问网络或调用其他高风险工具前,应该自动继续、询问用户,还是直接拒绝。权限模式决定的是**会话节奏**,不是整套权限系统的全部逻辑。
4
+
5
+ ## 先理解:权限模式只是权限系统中的一层
6
+
7
+ 每次工具调用,CodeBuddy 不会只看当前 mode,还会先后经过:
8
+
9
+ 1. hooks / 交互型工具的特殊处理
10
+ 2. `deny` 规则
11
+ 3. 可信 `allow` 规则
12
+ 4. 命令安全检查(仅交互式)
13
+ 5. `ask` 规则
14
+ 6. `bypassPermissions` 短路
15
+ 7. 不可信 `allow` 规则
16
+ 8. 当前权限模式自己的基线策略
17
+ 9. 非交互兜底与 `auto` / `dontAsk` 的最终收口
18
+
19
+ 所以:
20
+
21
+ - `deny` 永远比 mode 更强
22
+ - `allow` / `ask` 规则会改变 mode 的实际效果
23
+ - `auto` 只接管“最后仍然会 ask 的动作”
24
+ - `dontAsk` 不是“更宽松”,而是“不弹框,直接拒绝未预批准动作”
25
+ - `bypassPermissions` 也不是绝对无条件放行:前面的 `deny` / `ask` 规则与交互态危险命令检查仍可能拦住它
26
+
27
+ 权限规则的完整求值顺序见 [权限规则](permissions.md)。
4
28
 
5
29
  ## 可用模式
6
30
 
7
- CodeBuddy Code 提供以下权限模式。前 4 个是用户可在 CLI 中直接切换或指定的;后几个用于 IDE 集成与子代理场景。
31
+ CodeBuddy Code 提供以下权限模式。其中多数模式可在 CLI 中直接切换或指定;部分模式用于 IDE 集成与子代理场景。
8
32
 
9
33
  ### 用户可手动切换的模式
10
34
 
11
- | 模式 | 不询问就能跑什么 | 适用场景 |
12
- | :----------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------- |
13
- | `default` | 信任目录内的 Read 工具 | 默认;适合敏感工作 / 上手期 |
14
- | [`acceptEdits`](#auto-edits自动批准文件编辑) | 信任目录内的 Read + Edit 系列工具 | 边写边走 git diff 复核 |
15
- | [`plan`](#plan探索后再改) | 委托给"进入 plan 前"的那个模式(默认 = `default`);额外允许写入会话计划文件 | 落手改动前先摸清代码再决定 |
16
- | [`bypassPermissions`](#bypasspermissions跳过所有检查) | 全部工具,无询问 | 沙箱容器 / VM / 离线 dev container 才用 |
17
- | [`delegate`](#delegate多代理协调模式) | 仅协调类工具(如 Agent / TaskCreate / SendMessage / 团队管理),实现类工具被屏蔽 | 主代理只做拆派、把执行交给子代理 |
35
+ | 模式 | 不询问就能跑什么 | 适用场景 |
36
+ | :--- | :--- | :--- |
37
+ | `default` | 信任目录内的 Read 工具 | 默认;适合敏感工作 / 上手期 |
38
+ | [`acceptEdits`](#acceptedits自动批准文件编辑) | 信任目录内的 Read + Edit 系列工具 | 边写边走 `git diff` 复核 |
39
+ | [`auto`](#auto分类器自动判定) | 原本会 ask 的动作,交给分类器判定 allow / deny | 想减少打断,但保留安全边界 |
40
+ | [`dontAsk`](#dontask不弹框直接拒绝未预批准动作) | 仅已预批准动作继续执行;其余不询问直接拒绝 | 非交互自动化 / 固定白名单代理 |
41
+ | [`plan`](#plan探索后再改) | 委托给“进入 plan 前”的那个模式(默认 = `default`);额外允许写入会话计划文件 | 落手改动前先摸清代码再决定 |
42
+ | [`bypassPermissions`](#bypasspermissions尽量跳过审批) | 跳过绝大多数审批 | 沙箱容器 / VM / 离线 dev container 才用 |
43
+ | [`delegate`](#delegate多代理协调模式) | 仅协调类工具(如 Agent / TaskCreate / SendMessage / 团队管理),实现类工具被屏蔽 | 主代理只做拆派、把执行交给子代理 |
18
44
 
19
45
  ### 程序化 / 集成模式(不在 Shift+Tab 循环里)
20
46
 
21
- | 模式 | 何时出现 |
22
- | :-------------- | :-------------------------------------------------------------------------------------------------------------------------------- |
23
- | `fullAccess` | IDE 客户端通过协议传入;语义上等价于 `bypassPermissions` 的全局放行 |
24
- | `work` | IDE 客户端传入。Read 直接放行(不查信任目录),Edit 一律询问,Bash 仅安全命令直接放行,其他询问 |
25
- | `ignore` | 仅在子代理(subagent / teammate)场景生效,表示"用主会话的模式,不要被子代理自己的 frontmatter 覆盖";主会话用不到 |
47
+ | 模式 | 何时出现 |
48
+ | :--- | :--- |
49
+ | `fullAccess` | IDE 客户端通过协议传入;语义上接近 `bypassPermissions` 的全局放行 |
50
+ | `work` | IDE 客户端传入。Read 直接放行(不查信任目录),Edit 一律询问,Bash 仅安全命令直接放行,其他询问 |
51
+ | `ignore` | 仅在子代理(subagent / teammate)场景生效,表示“用主会话的模式,不要被子代理自己的 frontmatter 覆盖”;主会话用不到 |
26
52
 
27
- ## 切换权限模式
53
+ > 说明:从实现上看,`auto`、`dontAsk`、`plan`、`bypassPermissions` 都可以通过 CLI 或 settings 指定;`delegate` 主要通过会话内 `Shift+Tab` 切换。
28
54
 
29
- 模式不是用对话告诉 CodeBuddy 来切的,而是通过下面三个入口设置。
55
+ ## 如何切换权限模式
30
56
 
31
- ### 会话中切换:Shift+Tab
57
+ ### 会话中切换:`Shift+Tab`
32
58
 
33
- CLI 里按 `Shift+Tab` 在以下 5 个模式之间循环:
59
+ CLI 中按 `Shift+Tab` 在以下模式之间循环:
34
60
 
61
+ ```text
62
+ default → bypassPermissions → acceptEdits → auto(可用时)→ plan → delegate → default → ...
35
63
  ```
36
- default → bypassPermissions → acceptEdits → plan → delegate → default → ...
37
- ```
38
64
 
39
- 切换后会话状态栏左下角会显示当前模式:
65
+ 说明:
66
+
67
+ - `auto` 只有当前环境可用时才会出现在循环里
68
+ - `dontAsk` **不在**键盘循环中,只能通过 CLI、settings、SDK / IDE 控制信号进入
69
+ - Windows 上默认使用 `Alt+M` 触发同一逻辑
70
+
71
+ ### 状态栏提示
40
72
 
41
- | 模式 | 状态栏文案 | 颜色 |
42
- | :------------------- | :-------------------------------------- | :---------------------------------- |
43
- | `default` | 不显示 | |
44
- | `bypassPermissions` | `⏵⏵ bypass permissions on (shift+tab to cycle)` | warning(警示) |
45
- | `acceptEdits` | `⏵⏵ accept edits on (shift+tab to cycle)` | info |
46
- | `plan` | `⏸ plan mode on (shift+tab to cycle)` | planMode |
47
- | `plan` + 前置 | `⏸ plan + accept edits (shift+tab to cycle)` | planMode |
48
- | `delegate` | `⇢ delegate mode on (shift+tab to cycle)` | delegateMode |
73
+ 切换后,输入区下方会显示当前 mode:
74
+
75
+ | 模式 | 文案 | 说明 |
76
+ | :--- | :--- | :--- |
77
+ | `default` | 不显示 | 默认模式不额外占位 |
78
+ | `bypassPermissions` | `⏵⏵ bypass permissions on (shift+tab to cycle)` | 可循环切回其他模式 |
79
+ | `acceptEdits` | `⏵⏵ accept edits on (shift+tab to cycle)` | 可循环切回其他模式 |
80
+ | `auto` | `⏵⏵ auto mode on (shift+tab to cycle)` | 仅在可用时出现 |
81
+ | `dontAsk` | `⏵⏵ don't ask on` | 不在循环链里,所以无 cycle hint |
82
+ | `plan` | `⏸ plan mode on (shift+tab to cycle)` | 表示当前在计划模式 |
83
+ | `plan` + 前置模式 | `⏸ plan + accept edits (shift+tab to cycle)` 等 | 显示 plan 前继承的基线模式 |
84
+ | `delegate` | `⇢ delegate mode on (shift+tab to cycle)` | 主代理只做协调 |
49
85
 
50
86
  ### 启动时指定:`--permission-mode`
51
87
 
52
88
  ```bash
53
- codebuddy --permission-mode plan
89
+ codebuddy --permission-mode default
54
90
  codebuddy --permission-mode acceptEdits
91
+ codebuddy --permission-mode auto
92
+ codebuddy --permission-mode dontAsk
93
+ codebuddy --permission-mode plan
55
94
  codebuddy --permission-mode bypassPermissions
56
- codebuddy --permission-mode default
57
95
  ```
58
96
 
59
- CLI 选项 `--permission-mode` 只接受这 4 个字面量。其他模式(`delegate` / `work` / `fullAccess` / `ignore`)不能在命令行传入。
97
+ `--permission-mode` 官方支持这 6 个字面量。其他模式(`delegate` / `work` / `fullAccess` / `ignore`)不能作为标准 CLI 启动参数。
60
98
 
61
- `-p`([非交互模式](headless.md))下同样有效:
99
+ 非交互模式下同样可用:
62
100
 
63
101
  ```bash
64
- codebuddy -p --permission-mode acceptEdits "重构 src/utils/foo.ts"
102
+ codebuddy -p --permission-mode dontAsk "只允许白名单动作,其余直接失败"
103
+ codebuddy -p --permission-mode auto "先尝试自动修复 lint 错误"
65
104
  ```
66
105
 
67
- 启动时还可以追加:
106
+ 额外快捷方式:
68
107
 
69
- - `-y` / `--dangerously-skip-permissions`:等价于 `--permission-mode bypassPermissions`,跳过全部权限检查
108
+ - `-y` / `--dangerously-skip-permissions`:等价于 `--permission-mode bypassPermissions`
70
109
 
71
- ### 持久化默认值:`defaultMode`
110
+ ### 持久化默认值:`permissions.defaultMode`
72
111
 
73
- 写到 `~/.codebuddy/settings.json` 或仓库 `.codebuddy/settings.json`:
112
+ `~/.codebuddy/settings.json` 或项目 settings 中配置:
74
113
 
75
114
  ```json
76
115
  {
@@ -80,55 +119,192 @@ codebuddy -p --permission-mode acceptEdits "重构 src/utils/foo.ts"
80
119
  }
81
120
  ```
82
121
 
83
- 启动时同时给 `--permission-mode` 时,CLI 参数优先。优先级顺序为:会话当前值 → `permissions.defaultMode` → `default`。
122
+ 优先级顺序:
123
+
124
+ 1. 会话当前值
125
+ 2. CLI `--permission-mode`
126
+ 3. `permissions.defaultMode`
127
+ 4. `default`
84
128
 
85
- ### 计划进入前的"前置模式"自动记忆
129
+ `defaultMode: "auto"` 还有额外限制:
86
130
 
87
- 进入 `plan` 时,CodeBuddy 会记住当前模式,离开 plan 时还原。这意味着:
131
+ - 只有 **user settings** **CLI 注入的 settings** 可以授予 `auto`
132
+ - `.codebuddy/settings.json` 与 `.codebuddy/settings.local.json` 中的 `defaultMode: "auto"` 都会被忽略并回退到 `default`
133
+ - 如果 `auto` 被禁用或当前不可用,也会回退到 `default`
88
134
 
89
- - 你在 `acceptEdits` 下按 `Shift+Tab` 进 `plan`,plan 期间 Read/Edit/Bash 的审批策略仍然按 `acceptEdits` 的规则做(计划文件除外,永不询问)
90
- - 离开 plan 时回到 `acceptEdits`,不会被强行掉到 `default`
135
+ ### `plan` 会记住进入前的模式
91
136
 
92
- ## 各模式语义详解
137
+ 进入 `plan` 时,CodeBuddy 会记录“进入 plan 前的权限模式”;退出后恢复。也就是说:
138
+
139
+ - 你从 `acceptEdits` 切进 `plan`,plan 期间普通 Read / Bash / 非计划文件 Edit 仍按 `acceptEdits` 的基线处理
140
+ - 只有当前 session 的**计划文件**写入是 plan 模式额外放行的特例
141
+ - 退出 `plan` 时会回到先前模式,而不是强制掉回 `default`
142
+
143
+ ## 各模式详解
93
144
 
94
145
  ### default(默认)
95
146
 
96
- 逐次审批模式,是初学者和处理敏感工作时的安全选项。
147
+ 最保守、最稳定的模式。
148
+
149
+ | 工具类型 | 行为 |
150
+ | :--- | :--- |
151
+ | Read | 路径在信任目录内(cwd + `permissions.additionalDirectories` + 用户加的 `addDir`)→ 放行;否则询问 |
152
+ | Edit | 询问 |
153
+ | Bash | 询问 |
154
+ | 其他 | 询问 |
97
155
 
98
- | 工具类型 | 决定 |
99
- | :------- | :-------------------------------------------------------------------------------------------------- |
100
- | Read | 路径在信任目录内(cwd + `permissions.additionalDirectories` + 用户加的 `addDir`)→ 放行;否则询问 |
101
- | Edit | 一律询问 |
102
- | Bash | 一律询问 |
103
- | 其他 | 一律询问 |
156
+ 适合:
157
+
158
+ - 初次进入陌生仓库
159
+ - 改动涉及敏感目录、生产脚本、外部服务
160
+ - 你希望每个高风险动作都可见
104
161
 
105
162
  ### acceptEdits(自动批准文件编辑)
106
163
 
107
- 适合"想边写边过 diff,不想被每个 Edit 弹窗打断"
164
+ 自动放行 Edit 类工具,但不放行 Bash
165
+
166
+ | 工具类型 | 行为 |
167
+ | :--- | :--- |
168
+ | Read | 信任目录内放行;信任目录外询问 |
169
+ | Edit | 自动放行 |
170
+ | Bash | 询问 |
171
+ | 其他 | 询问 |
172
+
173
+ 这里的 Edit 类主要包括:
108
174
 
109
- | 工具类型 | 决定 |
110
- | :------- | :-------------------------------------------------------------------------------------------------- |
111
- | Read | 信任目录内 → 放行;否则询问 |
112
- | Edit | **一律放行** |
113
- | Bash | 一律询问 |
114
- | 其他 | 一律询问 |
175
+ - `Edit`
176
+ - `Write`
177
+ - `MultiEdit`
178
+ - `NotebookEdit`
115
179
 
116
180
  注意:
117
181
 
118
- - 仅自动批准 **`Edit` 类工具**(Edit / Write / NotebookEdit 等),不影响 Bash —— Bash 永远走单独的安全分级
119
- - "信任目录"以工作区根 + 用户配置的 `permissions.additionalDirectories` + 启动时 `--add-dir` 为准
182
+ - `acceptEdits` 只影响 Edit 类工具,不影响 Bash —— Bash 永远走单独的安全分级
183
+ - “信任目录”以工作区根 + 用户配置的 `permissions.additionalDirectories` + 启动时 `--add-dir` 为准
120
184
  - 读写[受保护文件](#受保护的关键文件)仍照原模式询问,不走自动放行
185
+ - 如果某个操作先被 `deny` / `ask` 规则命中,规则仍然优先
186
+
187
+ 适合:
188
+
189
+ - 你愿意让 CodeBuddy 连续改文件,但不想让它自行跑命令
190
+ - 你习惯通过 `git diff` 统一复核改动
191
+
192
+ ### auto(分类器自动判定)
193
+
194
+ `auto` 不是“全自动放行”,而是把**本来会 ask 的动作**交给分类器做二次判断。
195
+
196
+ #### `auto` 何时会接管?
197
+
198
+ 只有满足下面条件时,分类器才会运行:
199
+
200
+ 1. 这次工具调用没有被 `deny` 规则拒绝
201
+ 2. 也没有被 `allow` 规则提前放行
202
+ 3. 没有命中显式 `ask` 规则
203
+ 4. 常规权限链最终仍得到一个 `ask`
204
+ 5. 当前 mode 是 `auto`
205
+
206
+ 所以 `auto` 只接管“最后仍然悬而未决的 ask”,不会替代整套权限系统。
207
+
208
+ #### 哪些情况不会进入分类器?
209
+
210
+ 以下情况**不会**走 `auto` 分类器:
211
+
212
+ - 已命中 `allow` / `deny` 规则的工具调用
213
+ - 显式 `ask` 规则命中的工具调用
214
+ - `AskUserQuestion`
215
+ - `ExitPlanMode`
216
+
217
+ 也就是说,`ask` 规则在 `auto` 下依然是“强制人工审批”。
218
+
219
+ #### 分类器可能给出什么结果?
220
+
221
+ 分类器只有两种结论:`allow`(放行)或 `deny`(拒绝),没有“部分批准”这类中间态。
222
+
223
+ #### 分类器无法判定时会怎样?
224
+
225
+ - **分类器出错 / 不可用**:为安全起见**直接拒绝**该动作(fail-closed),并提示模型可改用其他自然工具达成、或停下来向用户说明;连续多次失败会自动退出 `auto`、回退到 `default`。
226
+ - **对话太长、超出分类器可处理范围**:交互式会话回退为普通审批弹窗;`-p` / `stream-json` 等 headless 模式直接中止当前 run。
227
+ - **被拒次数过多**(短时间内反复被分类器拒绝):`auto` 会暂停——交互式回退为普通弹窗,headless 中止 run,避免反复空转。
228
+
229
+ 这些都是自动行为,无需配置。
230
+
231
+ #### `auto` 下的 allow 规则注意点
232
+
233
+ 为了避免 allow 规则把分类器整个绕过,`auto` 模式下 CodeBuddy 会**临时忽略“过宽 / 危险”的 allow 规则**(只在本次判断时从内存过滤,不改写你的 settings)。被忽略的主要有:
234
+
235
+ - 全通配的 shell 规则:`Bash`、`Bash(*)`、`PowerShell`、`PowerShell(*)`
236
+ - 危险命令 / cmdlet 前缀:如 `Bash(sudo *)`、`Bash(eval *)`、`PowerShell(iex *)`
237
+ - 任意 `Agent` / `Task` 规则:如 `Agent(*)` —— 防止借子代理绕过分类器
238
+
239
+ 窄而具体的安全规则仍然有效,例如 `Bash(npm test)`、`Bash(git status)`、`PowerShell(Get-Content foo.txt)`、`Read`、`Edit(src/foo.ts)`。
240
+
241
+ 如果你确实需要让某类动作在 `auto` 下免审,正确做法是配置 `autoMode` 规则(见下),而不是写宽 allow 规则。
242
+
243
+ #### `auto` 配置与自检命令
244
+
245
+ `auto` 分类器的受信边界与放行 / 拦截规则由顶层 `autoMode` settings 控制(`environment` / `allow` / `soft_deny` / `hard_deny`),详见 [Settings 配置](settings.md#auto-mode-配置)。
246
+
247
+ 3 个本地命令帮你查看与校验配置:
248
+
249
+ ```bash
250
+ codebuddy auto-mode defaults # 查看内置默认规则
251
+ codebuddy auto-mode config # 查看当前实际生效的规则($defaults 展开后)
252
+ codebuddy auto-mode critique # 让模型检查你的自定义规则是否含糊、冗余或易误伤
253
+ ```
254
+
255
+ 适合:
256
+
257
+ - 你想减少日常确认弹窗
258
+ - 但又不想直接进入 `bypassPermissions`
259
+ - 并且愿意为组织内部 repo / 域名 / bucket 明确配置受信边界
260
+
261
+ ### dontAsk(不弹框,直接拒绝未预批准动作)
262
+
263
+ `dontAsk` 的核心语义是:**任何本来要弹审批的动作,都不要弹,直接拒绝。**
264
+
265
+ 它不是 `bypassPermissions` 的别名,恰好相反,它更严格。
266
+
267
+ | 工具类型 | 基线行为 |
268
+ | :--- | :--- |
269
+ | Read | 仅信任目录内只读操作继续执行;信任目录外读取拒绝 |
270
+ | Edit | 拒绝,除非已被 `allow` 规则预批准 |
271
+ | Bash | 拒绝,除非已被 `allow` 规则预批准 |
272
+ | 其他 | 拒绝,除非已被 `allow` 规则预批准 |
273
+
274
+ 重要细节:
275
+
276
+ - `dontAsk` 只改写最终的 `ask` 结果;已经 allow / deny 的动作不受影响
277
+ - 显式 `ask` 规则在 `dontAsk` 下不会弹窗,而是直接转成 deny
278
+ - `AskUserQuestion`、`ExitPlanMode` 在 `dontAsk` 下也**被拒绝**(不弹框 / 不进入计划审批)——`dontAsk` 的本意就是“绝不打断用户”,所以连这类交互工具也不例外
279
+ - 被拒时模型会收到提示:可改用其他自然工具达成目标,若该能力确实必需则停下来向用户说明
280
+ - 把 `allowedTools` / `permissions.allow` 与 `dontAsk` 配合使用,可以做出“固定白名单代理”
281
+
282
+ 适合:
283
+
284
+ - CI / 批处理 / 后台代理
285
+ - 明确希望“能做就做,不能做就立即失败”
286
+ - 需要稳定、可预测的工具面,而不是运行中临时审批
121
287
 
122
288
  ### plan(探索后再改)
123
289
 
124
- CodeBuddy 在 plan 模式下专心读代码、跑只读 Bash 命令探查,把方案写成计划再回来征求你的同意;不会落地修改你的源码。
290
+ `plan` 模式的目标是:先探查、先写计划、再征求确认,而不是立即落地修改源码。
125
291
 
126
- plan 模式不是独立的"全块只读",而是**委托给前置模式**:
292
+ CodeBuddy 的 `plan` 不是一个独立的“完全只读模式”,而是**委托给进入 plan 前的模式**:
127
293
 
128
- - Read:把决定权交给前置模式(默认是 `default`)
129
- - Edit:仅当目标路径是当前会话的**计划文件**时放行;否则委托给前置模式
294
+ - Read:委托给前置模式
130
295
  - Bash:委托给前置模式
131
- - 进入 plan 通过 `Shift+Tab` 或工具 `EnterPlanMode`;退出通过再次 `Shift+Tab` 或 `ExitPlanMode`
296
+ - Edit:如果目标是当前 session 的计划文件,则直接放行;否则委托给前置模式
297
+
298
+ 这意味着:
299
+
300
+ - 从 `default` 进入 `plan`,普通 Edit / Bash 仍然会 ask
301
+ - 从 `acceptEdits` 进入 `plan`,非计划文件 Edit 仍按 `acceptEdits` 的基线自动放行
302
+ - `plan` 真正额外放行的只有“当前 session 的计划文件写入”
303
+
304
+ 进入 / 退出方式:
305
+
306
+ - 进入:`Shift+Tab` 或 `EnterPlanMode`
307
+ - 退出:再次 `Shift+Tab` 或 `ExitPlanMode`
132
308
 
133
309
  启动时直接进 plan:
134
310
 
@@ -136,13 +312,21 @@ plan 模式不是独立的"全块只读",而是**委托给前置模式**:
136
312
  codebuddy --permission-mode plan
137
313
  ```
138
314
 
139
- ### bypassPermissions(跳过所有检查)
315
+ ### bypassPermissions(尽量跳过审批)
316
+
317
+ `bypassPermissions` 会跳过大部分正常审批流程,适合隔离容器 / VM / dev container、没有外网的 sandbox、或你完全清楚后果的脚本化场景。
318
+
319
+ 但它**不是“前面所有规则都失效”**。更准确地说:
320
+
321
+ - 未被前置规则拦住的工具,会在 bypass 阶段直接放行
322
+ - 但在它之前,`deny` / `ask` 规则仍先评估
323
+ - 交互式会话里,危险 Bash 命令仍可能要求显式确认
324
+ - 如果 `permissions.disableBypassPermissionsMode: "disable"`,该模式会退化回 `default` 基线
140
325
 
141
- 字面意思:**全部跳过审批**。所有 Bash、Edit、网络、MCP 都立刻执行。仅在以下场景使用:
326
+ 也就是说,下面这些说法是不准确的:
142
327
 
143
- - 隔离的容器 / VM / dev container
144
- - 没有外网的 sandbox
145
- - 你完全清楚后果的脚本化场景
328
+ - “只要开了 bypass,`ask` 规则就失效”
329
+ - “只要开了 bypass,危险命令也一定无条件通过”
146
330
 
147
331
  启动方式:
148
332
 
@@ -155,7 +339,7 @@ codebuddy --dangerously-skip-permissions
155
339
 
156
340
  #### 关闭通道(管理员)
157
341
 
158
- 把 `permissions.disableBypassPermissionsMode: "disable"` 写到任一层 settings:
342
+ 关闭该模式:
159
343
 
160
344
  ```json
161
345
  {
@@ -165,39 +349,50 @@ codebuddy --dangerously-skip-permissions
165
349
  }
166
350
  ```
167
351
 
168
- 写入后即使会话切到 `bypassPermissions`,权限策略也会**降级回 `default` 的判定**;多层 settings(user / project / local / CLI 启动参数)任一层为 `"disable"` 即生效。
352
+ 适合:
353
+
354
+ - 隔离容器 / 沙箱 / dev container
355
+ - 没有外网、没有共享状态的环境
356
+ - 你明确接受全自动执行的后果
169
357
 
170
358
  ### delegate(多代理协调模式)
171
359
 
172
- 主代理在 `delegate` 模式下**只能调度**:发任务、起子代理、跨成员通信,自己不动手编辑或跑命令。
360
+ 主代理在 `delegate` 模式下只负责协调,不直接执行实现类工具。
173
361
 
174
362
  行为:
175
363
 
176
- - 主代理可用的工具集中只保留协调类工具(Agent / TaskCreate / SendMessage 等),全部自动放行
177
- - 实现类工具(Read / Write / Edit / Bash 等)会被屏蔽,由子代理执行
364
+ - 主代理只保留协调类工具(如 `Agent`、`TaskCreate`、`SendMessage`)
365
+ - 执行类工具(如 `Read`、`Write`、`Edit`、`Bash`)不会暴露给主代理
366
+ - 真正的读写、执行工作交给子代理完成
178
367
 
179
- 适合的场景:你明确要做"主代理只规划、各专业子代理实施"的协作任务([Agent Teams](agent-teams.md) / [子代理](sub-agents.md))。
368
+ 适合:
180
369
 
181
- `Shift+Tab` 循环到 `delegate` 即可进入。
370
+ - 主代理专注拆任务、分派、收敛结果
371
+ - 你在做 Team / Swarm 风格的协作执行
182
372
 
183
373
  ### work(IDE 集成)
184
374
 
185
- IDE 客户端通过协议设置,CLI 用户不直接接触。语义:
375
+ `work` 仅由 IDE 侧协议传入,CLI 用户一般不会直接用到。
186
376
 
187
- | 工具类型 | 决定 |
188
- | :------- | :-------------------------------------------------- |
189
- | Read | **直接放行**(不检查信任目录) |
190
- | Edit | 一律询问 |
191
- | Bash | 安全命令直接放行;危险或需要审批的命令询问 |
192
- | 其他 | 放行 |
377
+ | 工具类型 | 行为 |
378
+ | :--- | :--- |
379
+ | Read | 直接放行,不检查信任目录 |
380
+ | Edit | 询问 |
381
+ | Bash | 安全命令直接放行;其余询问 |
382
+ | 其他 | 放行 |
193
383
 
194
384
  ### fullAccess(IDE 集成)
195
385
 
196
- 仅由 IDE 客户端通过协议传入;与 `bypassPermissions` 同语义。
386
+ 仅由 IDE 客户端通过协议设置;语义上接近 `bypassPermissions`。
197
387
 
198
388
  ### ignore(子代理专用)
199
389
 
200
- 仅子代理的 frontmatter / option 用到 —— 子代理把 `permissionMode: ignore` 写在自己的元信息里时,会被识别为"不要覆盖父代理的模式",沿用父会话当前模式。主会话不会出现这个值。
390
+ `ignore` 只用于子代理配置,表示:
391
+
392
+ - 不要采用子代理自己 frontmatter 里的 mode
393
+ - 沿用父会话当前模式
394
+
395
+ 主会话不会出现这个值。
201
396
 
202
397
  ## 受保护的关键文件
203
398
 
@@ -210,9 +405,11 @@ codebuddy --dangerously-skip-permissions
210
405
  - CodeBuddy 自身:`.codebuddy`(除 `.codebuddy/worktrees`)
211
406
  - MCP / 配置:`.mcp.json` / `.codebuddy.json`
212
407
 
213
- ## 子代理的权限模式继承
408
+ ## 子代理如何继承权限模式
214
409
 
215
- 子代理([Agent](sub-agents.md) 工具调用、[Agent Teams](agent-teams.md) 队员)默认继承主会话的权限模式。要在团队 / 项目层强制覆盖:
410
+ 默认情况下,子代理([Agent](sub-agents.md) 工具调用、[Agent Teams](agent-teams.md) 队员)会继承主会话的权限模式,但实际优先级比“简单继承”更细。
411
+
412
+ 要在团队 / 项目层强制覆盖默认子代理模式:
216
413
 
217
414
  ```json
218
415
  {
@@ -222,14 +419,61 @@ codebuddy --dangerously-skip-permissions
222
419
  }
223
420
  ```
224
421
 
225
- 写入后所有子代理都会按 `bypassPermissions` 跑。注意:
422
+ ### 子代理 permission mode 优先级
423
+
424
+ 当主会话**不是** `auto` / `dontAsk` 时,子代理 mode 按下列顺序解析:
425
+
426
+ 1. Agent 工具调用时显式传入的 `mode`
427
+ 2. 子代理 frontmatter / product config 中 agent 自带的 `permissionMode`(写 `ignore` 时沿用父会话模式)
428
+ 3. CLI `--subagent-permission-mode`
429
+ 4. 环境变量 `CODEBUDDY_SUBAGENT_PERMISSION_MODE`
430
+ 5. settings `permissions.subagentPermissionMode`
431
+ 6. 代码内继承映射
432
+ 7. 否则直接继承主会话当前模式
226
433
 
227
- - Agent 工具调用时显式传 `mode` 参数 → **优先级最高**,覆盖此设置
228
- - 子代理 frontmatter 里写 `permissionMode: ignore` → 仍按主会话模式跑(不被本设置影响)
434
+ 目前唯一的特殊继承映射是:
229
435
 
230
- ## Permissions 规则配合
436
+ - 主会话 `delegate` → 子代理默认改为 `default`
231
437
 
232
- 权限模式定义"基线"。在 `~/.codebuddy/settings.json` 或仓库 `.codebuddy/settings.json` 的 `permissions` 下还可以叠加规则:
438
+ 原因很简单:主代理受限于“只能协调”,但子代理必须能真正工作。
439
+
440
+ ### `auto` / `dontAsk` 的父会话上限
441
+
442
+ 如果主会话当前是 `auto` 或 `dontAsk`,会先触发一层**权限上限(ceiling)**:
443
+
444
+ - 子代理会被直接钳到和父会话相同的 mode
445
+ - 这时就算 Agent 工具显式传入更宽松的 `mode`,也不会生效
446
+ - 目的是避免子代理绕开父会话的安全边界
447
+
448
+ 这条上限同样会影响后台子代理 / team member 的 interruption 层“自动直批”短路;父会话是 `auto` / `dontAsk` 时,这些短路会被禁用,必须回到正常权限检查流程。
449
+
450
+ ## 非交互 / 自动化场景怎么选
451
+
452
+ 如果你在 `-p`、`stream-json`、后台代理这类**不能弹审批框**的环境里工作,推荐这样理解各模式:
453
+
454
+ | 模式 | 非交互下的典型结果 |
455
+ | :--- | :--- |
456
+ | `default` / `acceptEdits` / `plan` | 任何最终仍需 ask 的动作都会被拒绝 |
457
+ | `auto` | 原本会 ask 的动作走 classifier;classifier 不可用时 fail-closed;transcript 过长会中止 run |
458
+ | `dontAsk` | 未预批准动作直接拒绝,不会等待人工确认 |
459
+ | `bypassPermissions` | 大多数动作直接继续执行 |
460
+
461
+ 因此:
462
+
463
+ - 想做“固定白名单自动化” → `dontAsk` + `allow` 规则
464
+ - 想做“尽可能自动,但保留分类器安全边界” → `auto`
465
+ - 想做“绝大多数都别拦” → `bypassPermissions`
466
+
467
+ ## 与权限规则配合使用
468
+
469
+ 一个常见误区是:把 mode 当成唯一权限来源。
470
+
471
+ 实际上更推荐的理解是:
472
+
473
+ - **mode 定义基线**
474
+ - **`allow` / `ask` / `deny` 定义例外**
475
+
476
+ 常规规则叠加示例:
233
477
 
234
478
  ```json
235
479
  {
@@ -242,15 +486,43 @@ codebuddy --dangerously-skip-permissions
242
486
  }
243
487
  ```
244
488
 
245
- - `allow` / `ask` / `deny` 三层优先级高于 mode 的判定(除 `bypassPermissions` 整段跳过权限层)
246
- - 详细规则语法见 [Settings 配置](settings.md)、[安全](security.md) 与 [IAM](iam.md)
489
+ 固定白名单自动化示例:
490
+
491
+ ```json
492
+ {
493
+ "permissions": {
494
+ "defaultMode": "dontAsk",
495
+ "allow": [
496
+ "Read",
497
+ "Grep",
498
+ "Glob",
499
+ "Bash(npm test:*)"
500
+ ],
501
+ "deny": [
502
+ "Bash(git push:*)"
503
+ ]
504
+ }
505
+ }
506
+ ```
507
+
508
+ 第二套配置的效果是:
509
+
510
+ - `Read` / `Grep` / `Glob` 自动通过
511
+ - `npm test ...` 自动通过
512
+ - `git push ...` 永远拒绝
513
+ - 其他未列出的动作在 `dontAsk` 下直接拒绝
514
+
515
+ 这正是最常见的“只给代理一小组明确能力”的做法。
247
516
 
248
517
  ## 相关资源
249
518
 
250
- - [Agent Teams:多代理协作](agent-teams.md):在 `delegate` 模式下让主代理专注调度
519
+ - [权限规则](permissions.md):allow / ask / deny 的匹配语法与完整求值顺序
520
+ - [Settings 配置](settings.md):`defaultMode`、`disableAutoMode`、`autoMode`、`subagentPermissionMode` 等字段
521
+ - [CLI 参考](cli-reference.md):`--permission-mode`、`--subagent-permission-mode`、`codebuddy auto-mode` 等命令
522
+ - [Agent Teams:多代理协作](agent-teams.md):`delegate` 模式下的协作方式
251
523
  - [子代理(Sub-agents)](sub-agents.md):子代理的工具与权限模式继承
252
- - [Hooks 钩子系统](hooks-guide.md):用 `PreToolUse` 钩子做自定义放行 / 拦截
253
- - [Bash 沙箱化](bash-sandboxing.md):在 Bash 命令层加文件系统 / 网络隔离
254
- - [Settings 配置](settings.md):权限规则、信任目录、`disableBypassPermissionsMode` 等完整字段
255
- - [CLI 参考](cli-reference.md):`--permission-mode` / `-y` / `--add-dir` 等启动参数
256
- - [非交互模式](headless.md):`-p` 流程下使用权限模式
524
+ - [Hooks 钩子系统](hooks-guide.md):用 `PreToolUse` / `PermissionRequest` / `PermissionDenied` 扩展权限判定
525
+ - [非交互模式](headless.md):`-p` 流程下怎样设计权限策略
526
+ - [Bash 沙箱化](bash-sandboxing.md):在命令层额外加文件系统 / 网络隔离
527
+ - [安全](security.md):整体安全模型与最佳实践
528
+ - [IAM 身份与访问](iam.md):组织级身份认证与权限控制