Deep Code 内置了一套细粒度的权限控制机制,在 AI 助手执行工具调用(如执行 Shell 命令、读写文件、访问网络等)前,根据用户配置的策略决定是自动放行、直接拒绝、还是弹出交互式确认。
每次 AI 助手调用工具时,系统会自动分析该操作涉及的权限范围(Permission Scope),然后根据 settings.json 中的权限配置做出决策。对于需要用户确认的操作,会在终端中弹出交互式选择界面,用户可以选择:
- Yes — 仅本次放行
- Yes, during this session — 当前会话本次运行期间,同一类操作不再询问,也不写入权限配置
- Yes, and always allow — 本次放行,并将该权限范围写入项目配置文件,后续同类操作不再询问;Plan Mode 下不提供此选项
- No — 拒绝本次操作
unknown 范围只提供 Yes 和 No。已配置为拒绝的操作仍会保持拒绝。
Deep Code 定义了以下 12 种权限范围,覆盖了工具调用的各类风险场景:
| 权限范围 | 说明 |
|---|---|
read-in-cwd |
读取当前工作区内的文件 |
read-in-tmp |
读取 /tmp 或 /private/tmp 内的文件 |
read-out-cwd |
读取当前工作区外的文件 |
write-in-cwd |
在当前工作区内创建或覆写文件 |
write-in-tmp |
在 /tmp 或 /private/tmp 内创建或覆写文件 |
write-out-cwd |
在当前工作区外创建或覆写文件 |
delete-in-cwd |
删除当前工作区内的文件 |
delete-out-cwd |
删除当前工作区外的文件 |
query-git-log |
查询 Git 历史(如 git log、git show、git blame) |
mutate-git-log |
修改 Git 历史(如 git commit、git rebase、git tag) |
network |
访问网络(如 curl、npm install 等联网操作) |
mcp |
调用 MCP 外部工具 |
此外还有一个特殊的 unknown 范围,当 LLM 无法准确分类命令的副作用时使用,unknown 总是触发询问。
在 ~/.deepcode/settings.json(用户级)或 .deepcode/settings.json(项目级)中通过 permissions 字段配置。
也可以在交互界面输入 /permissions 打开权限编辑器。如果当前项目已有项目级配置,就修改项目级配置;否则修改用户级配置。编辑器支持:
- 将默认模式设为
allowAll或askAll,选择后返回主菜单。 - 将各权限范围设为自动允许、拒绝、询问,或跟随默认配置。
- 预览当前项目的实际生效配置。所有修改统一通过主菜单的 Save 保存;在子菜单按
Esc返回上一页并保留修改,在主菜单按Esc关闭编辑器并放弃尚未保存的修改。
手动配置时,使用 permissions 字段:
{
"permissions": {
"allow": [],
"deny": [],
"ask": [],
"defaultMode": "allowAll",
"addWorkingDirs": ["/opt/my-project"]
}
}| 字段 | 类型 | 说明 |
|---|---|---|
allow |
string[] |
始终自动放行的权限范围列表 |
deny |
string[] |
始终自动拒绝的权限范围列表 |
ask |
string[] |
始终弹出询问的权限范围列表 |
defaultMode |
"allowAll" | "askAll" |
未在 allow/deny/ask 中明确列出的权限范围的默认处理方式。默认为 "allowAll" |
addWorkingDirs |
string[] |
额外按当前工作区处理的目录列表 |
addWorkingDirs 的用户级和项目级配置会去重合并。绝对路径直接使用,相对路径相对当前项目根目录解析;目录无需预先存在。当路径同时属于工作区和系统临时目录时,工作区范围优先。
默认的 allowAll 模式会自动放行 read-in-tmp 和 write-in-tmp。显式配置的 allow、ask、deny 及 askAll 仍按下述优先级生效。
当一个工具调用涉及多个权限范围时,决策按以下优先级进行:
- 若任一范围命中
deny→ 拒绝 - 若任一范围命中
ask→ 询问 - 若所有范围均在
allow中 → 自动放行 - 否则 → 按
defaultMode处理
{
"permissions": {
"defaultMode": "allowAll"
}
}默认行为:所有操作自动放行,无需确认。
{
"permissions": {
"allow": ["read-in-cwd", "write-in-cwd", "query-git-log"],
"defaultMode": "askAll"
}
}此配置的效果:
- 工作区内读写、Git 查询 → 自动放行
- 其他操作都需要用户确认。
选择 Yes, and always allow 会把对应权限范围保存到当前项目的 .deepcode/settings.json,之后的新会话和重新启动都会沿用该选择,不再询问同类操作。
选择 Yes, during this session 只对当前会话的本次运行有效,不写入权限配置。暂时切换到其他会话再切回来时仍然有效;新会话、fork 会话和重新启动后恢复的会话都需要重新授权。