deny 规则allow 规则ask 规则bypassPermissions 短路allow 规则auto / dontAsk 的最终收口deny 永远比 mode 更强allow / ask 规则会改变 mode 的实际效果auto 只接管“最后仍然会 ask 的动作”dontAsk 不是“更宽松”,而是“不弹框,直接拒绝未预批准动作”bypassPermissions 也不是绝对无条件放行:前面的 deny / ask 规则与交互态危险命令检查仍可能拦住它模式 | 不询问就能跑什么 | 适用场景 |
default | 信任目录内的 Read 工具 | 默认;适合敏感工作 / 上手期 |
acceptEdits | 信任目录内的 Read + Edit 系列工具 | 边写边走 git diff 复核 |
auto | 原本会 ask 的动作,交给分类器判定 allow / deny | 想减少打断,但保留安全边界 |
dontAsk | 仅已预批准动作继续执行;其余不询问直接拒绝 | 非交互自动化 / 固定白名单代理 |
plan | 委托给“进入 plan 前”的那个模式(默认 = default);额外允许写入会话计划文件 | 落手改动前先摸清代码再决定 |
bypassPermissions | 跳过绝大多数审批 | 沙箱容器 / VM / 离线 dev container 才用 |
delegate | 仅协调类工具(如 Agent / TaskCreate / SendMessage / 团队管理),实现类工具被屏蔽 | 主代理只做拆派、把执行交给子代理 |
模式 | 何时出现 |
fullAccess | IDE 客户端通过协议传入;语义上接近 bypassPermissions 的全局放行 |
work | IDE 客户端传入。Read 直接放行(不查信任目录),Edit 一律询问,Bash 仅安全命令直接放行,其他询问 |
ignore | 仅在子代理(subagent / teammate)场景生效,表示“用主会话的模式,不要被子代理自己的 frontmatter 覆盖”;主会话用不到 |
auto、dontAsk、plan、bypassPermissions 都可以通过 CLI 或 settings 指定;delegate 主要通过会话内 Shift+Tab 切换。Shift+TabShift+Tab 在以下模式之间循环:default → bypassPermissions → acceptEdits → auto(可用时)→ plan → delegate → default → ...
auto 只有当前环境可用时才会出现在循环里dontAsk 不在键盘循环中,只能通过 CLI、settings、SDK / IDE 控制信号进入Shift+Tab 和 Alt+M 均可触发(Alt+M 为兼容别名)~/.codebuddy/keybindings.json 自定义快捷键模式 | 文案 | 说明 |
default | 不显示 | 默认模式不额外占位 |
bypassPermissions | ⏵⏵ bypass permissions on (shift+tab to cycle) | 可循环切回其他模式 |
acceptEdits | ⏵⏵ accept edits on (shift+tab to cycle) | 可循环切回其他模式 |
auto | ⏵⏵ auto mode on (shift+tab to cycle) | 仅在可用时出现 |
dontAsk | ⏵⏵ don't ask on | 不在循环链里,所以无 cycle hint |
plan | ⏸ plan mode on (shift+tab to cycle) | 表示当前在计划模式 |
plan + 前置模式 | ⏸ plan + accept edits (shift+tab to cycle) 等 | 显示 plan 前继承的基线模式 |
delegate | ⇢ delegate mode on (shift+tab to cycle) | 主代理只做协调 |
--permission-modecodebuddy --permission-mode defaultcodebuddy --permission-mode acceptEditscodebuddy --permission-mode autocodebuddy --permission-mode dontAskcodebuddy --permission-mode plancodebuddy --permission-mode bypassPermissions
--permission-mode 官方支持这 6 个字面量。其他模式(delegate / work / fullAccess / ignore)不能作为标准 CLI 启动参数。codebuddy -p --permission-mode dontAsk "只允许白名单动作,其余直接失败"codebuddy -p --permission-mode auto "先尝试自动修复 lint 错误"
-y / --dangerously-skip-permissions:等价于 --permission-mode bypassPermissionspermissions.defaultMode~/.codebuddy/settings.json 或项目 settings 中配置:{"permissions": {"defaultMode": "acceptEdits"}}
--permission-modepermissions.defaultModedefaultdefaultMode: "auto" 还有额外限制:auto.codebuddy/settings.json 与 .codebuddy/settings.local.json 中的 defaultMode: "auto" 都会被忽略并回退到 defaultauto 被禁用或当前不可用,也会回退到 defaultplan 会记住进入前的模式plan 时,CodeBuddy 会记录“进入 plan 前的权限模式”;退出后恢复。也就是说:acceptEdits 切进 plan,plan 期间普通 Read / Bash / 非计划文件 Edit 仍按 acceptEdits 的基线处理plan 时会回到先前模式,而不是强制掉回 default工具类型 | 行为 |
Read | 路径在信任目录内(cwd + permissions.additionalDirectories + 用户加的 addDir)→ 放行;否则询问 |
Edit | 询问 |
Bash | 询问 |
其他 | 询问 |
工具类型 | 行为 |
Read | 信任目录内放行;信任目录外询问 |
Edit | 自动放行 |
Bash | 询问 |
其他 | 询问 |
EditWriteMultiEditNotebookEditacceptEdits 只影响 Edit 类工具,不影响 Bash —— Bash 永远走单独的安全分级permissions.additionalDirectories + 启动时 --add-dir 为准deny / ask 规则命中,规则仍然优先git diff 统一复核改动auto 不是“全自动放行”,而是把本来会 ask 的动作交给分类器做二次判断。deny 规则拒绝allow 规则提前放行ask 规则askautoauto 只接管“最后仍然悬而未决的 ask”,不会替代整套权限系统。auto 分类器:allow / deny 规则的工具调用ask 规则命中的工具调用AskUserQuestionExitPlanModeask 规则在 auto 下依然是“强制人工审批”。allow(放行)或 deny(拒绝),没有“部分批准”这类中间态。auto、回退到 default。-p / stream-json 等 headless 模式直接中止当前 run。auto 会暂停——交互式回退为普通弹窗,headless 中止 run,避免反复空转。auto 下的 allow 规则注意点auto 模式下 CodeBuddy 会临时忽略“过宽 / 危险”的 allow 规则(只在本次判断时从内存过滤,不改写您的 settings)。被忽略的主要有:Bash、Bash(*)、PowerShell、PowerShell(*)Bash(sudo *)、Bash(eval *)、PowerShell(iex *)Agent / Task 规则:如 Agent(*) —— 防止借子代理绕过分类器Bash(npm test)、Bash(git status)、PowerShell(Get-Content foo.txt)、Read、Edit(src/foo.ts)。auto 下免审,正确做法是配置 autoMode 规则(见下),而不是写宽 allow 规则。auto 配置与自检命令auto 分类器的受信边界与放行 / 拦截规则由顶层 autoMode settings 控制(environment / allow / soft_deny / hard_deny),详见 Settings 配置。codebuddy auto-mode defaults # 查看内置默认规则codebuddy auto-mode config # 查看当前实际生效的规则($defaults 展开后)codebuddy auto-mode critique # 让模型检查您的自定义规则是否含糊、冗余或易误伤
bypassPermissionsdontAsk 的核心语义是:任何本来要弹审批的动作,都不要弹,直接拒绝。它不是 bypassPermissions 的别名,恰好相反,它更严格。工具类型 | 基线行为 |
Read | 仅信任目录内只读操作继续执行;信任目录外读取拒绝 |
Edit | 拒绝,除非已被 allow 规则预批准 |
Bash | 拒绝,除非已被 allow 规则预批准 |
其他 | 拒绝,除非已被 allow 规则预批准 |
dontAsk 只改写最终的 ask 结果;已经 allow / deny 的动作不受影响ask 规则在 dontAsk 下不会弹窗,而是直接转成 denyAskUserQuestion、ExitPlanMode 在 dontAsk 下也被拒绝(不弹框 / 不进入计划审批)——dontAsk 的本意就是“绝不打断用户”,所以连这类交互工具也不例外allowedTools / permissions.allow 与 dontAsk 配合使用,可以做出“固定白名单代理”plan 模式的目标是:先探查、先写计划、再征求确认,而不是立即落地修改源码。plan 不是一个独立的“完全只读模式”,而是委托给进入 plan 前的模式:default 进入 plan,普通 Edit / Bash 仍然会 askacceptEdits 进入 plan,非计划文件 Edit 仍按 acceptEdits 的基线自动放行plan 真正额外放行的只有“当前 session 的计划文件写入”Shift+Tab 或 EnterPlanModeShift+Tab 或 ExitPlanModecodebuddy --permission-mode plan
bypassPermissions 会跳过大部分正常审批流程,适合隔离容器 / VM / dev container、没有外网的 sandbox、或您完全清楚后果的脚本化场景。deny / ask 规则仍先评估permissions.disableBypassPermissionsMode: "disable",该模式会退化回 default 基线ask 规则就失效”codebuddy --permission-mode bypassPermissions# 等价codebuddy -ycodebuddy --dangerously-skip-permissions
{"permissions": {"disableBypassPermissionsMode": "disable"}}
delegate 模式下只负责协调,不直接执行实现类工具。Agent、TaskCreate、SendMessage)Read、Write、Edit、Bash)不会暴露给主代理work 仅由 IDE 侧协议传入,CLI 用户一般不会直接用到。工具类型 | 行为 |
Read | 直接放行,不检查信任目录 |
Edit | 询问 |
Bash | 安全命令直接放行;其余询问 |
其他 | 放行 |
bypassPermissions。ignore 只用于子代理配置,表示:acceptEdits / bypassPermissions 也会保留特殊处理:.git、.gitconfig、.gitmodules.bashrc / .bash_profile / .zshrc / .zprofile / .envrc 等.npmrc / .yarnrc / .pnpmfile.cjs / bunfig.toml 等.vscode / .idea / .husky / .devcontainer / .cargo / .yarn / .mvn.codebuddy(除 .codebuddy/worktrees).mcp.json / .codebuddy.json{"permissions": {"subagentPermissionMode": "bypassPermissions"}}
auto / dontAsk 时,子代理 mode 按下列顺序解析:modepermissionMode(写 ignore 时沿用父会话模式)--subagent-permission-modeCODEBUDDY_SUBAGENT_PERMISSION_MODEpermissions.subagentPermissionModedelegate → 子代理默认改为 defaultauto / dontAsk 的父会话上限auto 或 dontAsk,会先触发一层权限上限(ceiling):mode,也不会生效auto / dontAsk 时,这些短路会被禁用,必须回到正常权限检查流程。-p、stream-json、后台代理这类不能弹审批框的环境里工作,推荐这样理解各模式:模式 | 非交互下的典型结果 |
default / acceptEdits / plan | 任何最终仍需 ask 的动作都会被拒绝 |
auto | 原本会 ask 的动作走 classifier;classifier 不可用时 fail-closed;transcript 过长会中止 run |
dontAsk | 未预批准动作直接拒绝,不会等待人工确认 |
bypassPermissions | 大多数动作直接继续执行 |
dontAsk + allow 规则autobypassPermissionsallow / ask / deny 定义例外{"permissions": {"defaultMode": "default","allow": ["Bash(npm test)", "Read(/etc/hosts)"],"ask": ["WebFetch"],"deny": ["Bash(rm -rf *)", "Edit(.git/**)"]}}
{"permissions": {"defaultMode": "dontAsk","allow": ["Read","Grep","Glob","Bash(npm test:*)"],"deny": ["Bash(git push:*)"]}}
Read / Grep / Glob 自动通过npm test ... 自动通过git push ... 永远拒绝dontAsk 下直接拒绝defaultMode、disableAutoMode、autoMode、subagentPermissionMode 等字段--permission-mode、--subagent-permission-mode、codebuddy auto-mode 等命令delegate 模式下的协作方式PreToolUse / PermissionRequest / PermissionDenied 扩展权限判定-p 流程下怎样设计权限策略文档反馈