权限与沙箱
每个有副作用的工具调用都先过权限引擎。你用模式(会话有多宽松)、规则(逐工具 allow/deny/ask 模式串)以及可选的OS 级沙箱兜底来控制它。
配置写在哪(保持简洁)
| 文件 | 作用 |
|---|---|
~/.hipmmcode/settings.json | 推荐放 permissions.defaultMode 与长期 allow / deny / ask(Claude 兼容分层 settings) |
项目 .hipmmcode/settings.json / .hipmmcode/settings.local.json | 项目共享 / 本地(通常 gitignore)规则 |
~/.hipmmcode/config.json | 模型、密钥、MCP、UI —— 不要堆成百条一次性 allow |
自 v0.14.1 起,首次运行若没有用户 settings,会 seed 一份最小文件:
{
"permissions": {
"defaultMode": "auto"
}
}保持这种 Claude 式简洁即可。不要从其它工具整包拷贝历史 allow 列表 —— 低风险交给 Auto,只把你主动「always」的规则写进 allow。
升级二进制不会覆盖你的 settings,也不会从安装包再塞回旧的一次性授权。脏 allow 只来自本机已有文件或你后来的「don't ask again」。
权限模式
| 模式 | 行为 |
|---|---|
auto | 新安装默认(v0.14.1+)。分类器自动放行低风险调用;高风险拦截或谨慎回退。对齐 Claude Code 的 Auto 默认 |
default | 手动:只读放行;变更弹窗(或按规则) |
acceptEdits | 文件编辑自动批准;危险 shell 仍弹窗 |
plan | 只读规划 —— 批准计划前不允许任何变更(EnterPlanMode / /plan) |
bypassPermissions | 除显式 deny 规则外全部放行 |
dontAsk | 限制模式(不在日常 Shift+Tab 循环里) |
随时切换:
- Shift+Tab 会话中循环(状态栏显示)。常见顺序:default → acceptEdits → plan → (可用时 auto) → …
/permissions mode auto- CLI:
--permission-mode auto|plan|…,或--dangerously-skip-permissions(= bypass)。
托管策略可用 disableAutoMode 在组织层禁用 Auto。
审批弹窗
被门控的工具调用需要你决策时,终端内弹出对话框 —— 流式输出暂停,等你作答:
Bash command npm install ❯ Allow once Allow always — 为该命令持久化一条 allow 规则 Deny (Esc) ↑/↓ 移动 · Enter 确认 · Shift+Tab 切换权限模式
Allow always 会把永久 allow 规则写到你选择的 settings 层(user / project / local),同样的命令以后不再弹窗。请保持规则短而有意 —— 不要堆一长串一次性命令。对话框标题标明工具,正文显示将要执行的确切内容。
打开 /workflows 监视面板时,若有工具审批在等,审批会抢占面板焦点(权限优先于监视),避免只有 Esc 关面板后才突然弹出。
策略级 killswitch(disableBypassPermissionsMode)可在组织层面禁用 bypass。
规则
规则存在配置(permissions)与标准 settings 文件里,也可实时编辑:
/permissions allow Bash(git push:*)
/permissions deny Bash(rm -rf:*)
/permissions ask FileWrite(src/**)
/permissions # 查看当前规则 + 模式JSON 形状:
{
"permissions": {
"allow": ["Bash(git status:*)", "FileEdit(src/**)"],
"deny": ["Bash(sudo:*)", "WebFetch"],
"ask": ["Bash(git push:*)"]
}
}规则语法:Tool(整个工具)或 Tool(specifier) —— Bash 用命令前缀模式(Bash(git push:*)),文件工具用 glob 路径(FileEdit(src/**)),MCP 用 mcp__server 或 mcp__server__tool。优先级:deny > ask > allow,更具体的规则赢。会话中回答弹窗时可选"always allow",记录为会话级授权。
内置护栏
独立于你的规则:
- Bash 只读分类器 ——
ls、git status、grep… 免弹窗;改状态命令弹窗(bashPromptForWrites,默认开)。 - 毁灭性命令硬阻断 —— 灾难模式(
rm -rf /、擦盘、保护分支强推)在任何模式下直接拒绝。 - 保护路径写确认 —— 写敏感路径(shell rc、凭证文件)永远确认。
- 工作区边界 —— 越出 cwd +
--add-dir根的文件访问先问(confirmOutsideWorkspace,默认开)。 - 信任对话框 —— 首次在某目录运行时询问是否信任(
trustedDirs)。
无人值守运行
没人在场时,ask 决策失败关闭(拒绝)。自动化要主动选择:
| 选项 | 用途 |
|---|---|
--permission-mode acceptEdits | 要改文件但不许跑危险 shell 的 CI |
--dangerously-skip-permissions | 仅限完全可信的沙箱环境 |
--permission-webhook <url> | 你的服务来决策:收到每个请求,回 allow / deny / allow_always |
--permission-prompt-tool <mcp-tool> | 决策委托给某个 MCP 工具 |
同样的失败关闭规则适用于服务器任务队列与 hooks 驱动的运行。
Auto 模式(默认)与分类器配置
会话模式 auto(v0.14.1 默认)把 ask 桶里的工具调用交给分类器:低风险免人工弹窗;高风险或不明确则拦截/谨慎回退(分类器不可用时不会静默放行)。
可选 autoMode 配置用自然语言意图微调分类器:
{
"autoMode": {
"allow": ["推送到 feature 分支", "删除 .cache/ 下的文件"],
"hard_deny": ["永远不要销毁生产库"],
"classifierModel": "claude-haiku-4-5",
"classifyAllShell": false
}
}| 字段 | 含义 |
|---|---|
allow / soft_deny / hard_deny / environment | 分类器自然语言策略桶(不是 shell glob) |
classifierModel | 用于 yes/no 判定的廉价模型(未设时按 provider 默认) |
classifyAllShell | 为 true 时暂停 Bash 正向 allow,所有 shell 都走分类 |
托管环境有 disableAutoMode killswitch。
OS 沙箱
在权限弹窗之外,hipmmcode 自带真正 OS 级 shell 隔离后端:Linux 用 bubblewrap,macOS 用 Seatbelt。默认关闭。
| 配置键 | 环境变量 | 效果 |
|---|---|---|
sandbox.enabled | HIPMMCODE_SANDBOX=1 | 总开关 —— Bash 在沙箱内运行 |
sandbox.allowNetwork | HIPMMCODE_SANDBOX_NETWORK=1 | 沙箱内允许出网 |
sandbox.writableRoots | HIPMMCODE_SANDBOX_WRITABLE=/a:/b | 额外可写根(默认:cwd、HOME、tmp) |
sandbox.hideRoots | HIPMMCODE_SANDBOX_HIDE=/secret | 完全屏蔽的路径(多租户隔离) |
sandbox.failIfUnavailable | HIPMMCODE_SANDBOX_FAIL=1 | 无沙箱后端时拒绝执行命令 |
沙箱开启后,即便被 allow 的命令也物理上写不出可写根、够不到被隐藏的路径。
Worktree 隔离
与权限正交:把高风险工作放进 git worktree,主检出保持干净 —— 会话级 /worktree <name>,每队友 Agent(isolation: "worktree"),完事 /worktree exit keep|remove。worktreeBaseRef 选基线(head 或 fresh)。