@tencent-ai/codebuddy-code 2.109.0 → 2.109.2
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/CHANGELOG.md +26 -0
- package/dist/codebuddy-headless.js +165 -103
- package/dist/codebuddy.js +177 -115
- package/dist/web-ui/docs/cn/cli/cli-reference.md +8 -3
- package/dist/web-ui/docs/cn/cli/env-vars.md +2 -1
- package/dist/web-ui/docs/cn/cli/iam.md +9 -5
- package/dist/web-ui/docs/cn/cli/interactive-mode.md +2 -2
- package/dist/web-ui/docs/cn/cli/permission-modes.md +373 -101
- package/dist/web-ui/docs/cn/cli/permissions.md +36 -14
- package/dist/web-ui/docs/cn/cli/prewarm.md +134 -0
- package/dist/web-ui/docs/cn/cli/release-notes/README.md +14 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.0.md +48 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.1.md +13 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.2.md +24 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.3.md +14 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.4.md +24 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.5.md +18 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.6.md +15 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.106.7.md +13 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.107.0.md +30 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.108.0.md +20 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.108.1.md +15 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.108.2.md +13 -0
- package/dist/web-ui/docs/cn/cli/release-notes/v2.109.0.md +24 -0
- package/dist/web-ui/docs/cn/cli/settings.md +166 -2
- package/dist/web-ui/docs/en/cli/cli-reference.md +15 -10
- package/dist/web-ui/docs/en/cli/env-vars.md +6 -5
- package/dist/web-ui/docs/en/cli/iam.md +9 -5
- package/dist/web-ui/docs/en/cli/interactive-mode.md +3 -3
- package/dist/web-ui/docs/en/cli/permission-modes.md +373 -101
- package/dist/web-ui/docs/en/cli/permissions.md +46 -24
- package/dist/web-ui/docs/en/cli/prewarm.md +124 -0
- package/dist/web-ui/docs/en/cli/release-notes/README.md +14 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.0.md +48 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.1.md +13 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.2.md +24 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.3.md +14 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.4.md +24 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.5.md +18 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.6.md +15 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.106.7.md +13 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.107.0.md +30 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.108.0.md +20 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.108.1.md +15 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.108.2.md +13 -0
- package/dist/web-ui/docs/en/cli/release-notes/v2.109.0.md +24 -0
- package/dist/web-ui/docs/en/cli/settings.md +166 -2
- package/dist/web-ui/docs/search-index-en.json +1 -1
- package/dist/web-ui/docs/search-index-zh.json +1 -1
- package/dist/web-ui/docs/sidebar-en.json +1 -1
- package/dist/web-ui/docs/sidebar-zh.json +1 -1
- package/package.json +1 -1
- package/product.cloudhosted.json +2 -2
- package/product.internal.json +2 -2
- package/product.ioa.json +2 -2
- package/product.json +2 -2
- package/product.selfhosted.json +2 -2
- package/vendor/shim/genie-safe-delete.cjs +53 -0
- package/vendor/shim/safe-bin/safe-delete-common.sh +108 -0
- package/vendor/shim/sitecustomize.py +62 -0
|
@@ -1,76 +1,115 @@
|
|
|
1
1
|
# 权限模式
|
|
2
2
|
|
|
3
|
-
> 控制 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
|
|
31
|
+
CodeBuddy Code 提供以下权限模式。其中多数模式可在 CLI 中直接切换或指定;部分模式用于 IDE 集成与子代理场景。
|
|
8
32
|
|
|
9
33
|
### 用户可手动切换的模式
|
|
10
34
|
|
|
11
|
-
| 模式
|
|
12
|
-
|
|
|
13
|
-
| `default`
|
|
14
|
-
| [`acceptEdits`](#
|
|
15
|
-
| [`
|
|
16
|
-
| [`
|
|
17
|
-
| [`
|
|
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`
|
|
24
|
-
| `work`
|
|
25
|
-
| `ignore`
|
|
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
|
-
|
|
55
|
+
## 如何切换权限模式
|
|
30
56
|
|
|
31
|
-
###
|
|
57
|
+
### 会话中切换:`Shift+Tab`
|
|
32
58
|
|
|
33
|
-
CLI
|
|
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
|
-
|
|
|
44
|
-
|
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
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
|
|
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
|
-
|
|
97
|
+
`--permission-mode` 官方支持这 6 个字面量。其他模式(`delegate` / `work` / `fullAccess` / `ignore`)不能作为标准 CLI 启动参数。
|
|
60
98
|
|
|
61
|
-
|
|
99
|
+
非交互模式下同样可用:
|
|
62
100
|
|
|
63
101
|
```bash
|
|
64
|
-
codebuddy -p --permission-mode
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
131
|
+
- 只有 **user settings** 与 **CLI 注入的 settings** 可以授予 `auto`
|
|
132
|
+
- `.codebuddy/settings.json` 与 `.codebuddy/settings.local.json` 中的 `defaultMode: "auto"` 都会被忽略并回退到 `default`
|
|
133
|
+
- 如果 `auto` 被禁用或当前不可用,也会回退到 `default`
|
|
88
134
|
|
|
89
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| 其他 | 一律询问 |
|
|
156
|
+
适合:
|
|
157
|
+
|
|
158
|
+
- 初次进入陌生仓库
|
|
159
|
+
- 改动涉及敏感目录、生产脚本、外部服务
|
|
160
|
+
- 你希望每个高风险动作都可见
|
|
104
161
|
|
|
105
162
|
### acceptEdits(自动批准文件编辑)
|
|
106
163
|
|
|
107
|
-
|
|
164
|
+
自动放行 Edit 类工具,但不放行 Bash。
|
|
165
|
+
|
|
166
|
+
| 工具类型 | 行为 |
|
|
167
|
+
| :--- | :--- |
|
|
168
|
+
| Read | 信任目录内放行;信任目录外询问 |
|
|
169
|
+
| Edit | 自动放行 |
|
|
170
|
+
| Bash | 询问 |
|
|
171
|
+
| 其他 | 询问 |
|
|
172
|
+
|
|
173
|
+
这里的 Edit 类主要包括:
|
|
108
174
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
| Bash | 一律询问 |
|
|
114
|
-
| 其他 | 一律询问 |
|
|
175
|
+
- `Edit`
|
|
176
|
+
- `Write`
|
|
177
|
+
- `MultiEdit`
|
|
178
|
+
- `NotebookEdit`
|
|
115
179
|
|
|
116
180
|
注意:
|
|
117
181
|
|
|
118
|
-
-
|
|
119
|
-
-
|
|
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
|
-
|
|
290
|
+
`plan` 模式的目标是:先探查、先写计划、再征求确认,而不是立即落地修改源码。
|
|
125
291
|
|
|
126
|
-
plan
|
|
292
|
+
CodeBuddy 的 `plan` 不是一个独立的“完全只读模式”,而是**委托给进入 plan 前的模式**:
|
|
127
293
|
|
|
128
|
-
- Read
|
|
129
|
-
- Edit:仅当目标路径是当前会话的**计划文件**时放行;否则委托给前置模式
|
|
294
|
+
- Read:委托给前置模式
|
|
130
295
|
- Bash:委托给前置模式
|
|
131
|
-
-
|
|
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
|
-
|
|
326
|
+
也就是说,下面这些说法是不准确的:
|
|
142
327
|
|
|
143
|
-
-
|
|
144
|
-
-
|
|
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
|
-
|
|
342
|
+
关闭该模式:
|
|
159
343
|
|
|
160
344
|
```json
|
|
161
345
|
{
|
|
@@ -165,39 +349,50 @@ codebuddy --dangerously-skip-permissions
|
|
|
165
349
|
}
|
|
166
350
|
```
|
|
167
351
|
|
|
168
|
-
|
|
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
|
-
-
|
|
177
|
-
-
|
|
364
|
+
- 主代理只保留协调类工具(如 `Agent`、`TaskCreate`、`SendMessage`)
|
|
365
|
+
- 执行类工具(如 `Read`、`Write`、`Edit`、`Bash`)不会暴露给主代理
|
|
366
|
+
- 真正的读写、执行工作交给子代理完成
|
|
178
367
|
|
|
179
|
-
|
|
368
|
+
适合:
|
|
180
369
|
|
|
181
|
-
|
|
370
|
+
- 主代理专注拆任务、分派、收敛结果
|
|
371
|
+
- 你在做 Team / Swarm 风格的协作执行
|
|
182
372
|
|
|
183
373
|
### work(IDE 集成)
|
|
184
374
|
|
|
185
|
-
|
|
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
|
|
386
|
+
仅由 IDE 客户端通过协议设置;语义上接近 `bypassPermissions`。
|
|
197
387
|
|
|
198
388
|
### ignore(子代理专用)
|
|
199
389
|
|
|
200
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
-
- 子代理 frontmatter 里写 `permissionMode: ignore` → 仍按主会话模式跑(不被本设置影响)
|
|
434
|
+
目前唯一的特殊继承映射是:
|
|
229
435
|
|
|
230
|
-
|
|
436
|
+
- 主会话 `delegate` → 子代理默认改为 `default`
|
|
231
437
|
|
|
232
|
-
|
|
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
|
-
|
|
246
|
-
|
|
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
|
-
- [
|
|
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
|
-
- [
|
|
254
|
-
- [
|
|
255
|
-
- [
|
|
256
|
-
- [
|
|
524
|
+
- [Hooks 钩子系统](hooks-guide.md):用 `PreToolUse` / `PermissionRequest` / `PermissionDenied` 扩展权限判定
|
|
525
|
+
- [非交互模式](headless.md):`-p` 流程下怎样设计权限策略
|
|
526
|
+
- [Bash 沙箱化](bash-sandboxing.md):在命令层额外加文件系统 / 网络隔离
|
|
527
|
+
- [安全](security.md):整体安全模型与最佳实践
|
|
528
|
+
- [IAM 身份与访问](iam.md):组织级身份认证与权限控制
|