审批与安全
每次工具调用执行前,Mework 都会判断它是直接执行还是先问你。安全层级划定这条线,审批卡是你作答的地方;计划模式和沙箱另有各自的限制。
安全层级
安全层级是输入框底栏上显示当前层级名称的按钮,共三档:手动、允许编辑、完全访问。切换立即生效,正在运行的这一轮、它的子代理和后台工作也一样。预设会保存安全层级(内置预设 mework 用的是手动),分支和分叉会复制它。
受信任目录 指本对话的工作区——项目的目录和你附加的目录(见工作区与机器)——加上 Mework 的应用数据目录:macOS 上是 ~/Library/Application Support/com.mework.app,Windows 上是 %APPDATA%\com.mework.app。本对话的指令文件用 @ 导入的文件,不论在哪里,都按受信任目录里的文件处理:只是这个文件本身,不包括它所在的目录。想让模型以和项目相同的条件使用另一个目录,把它附加为工作区,而不是提高安全层级。
| 调用 | 手动 | 允许编辑 | 完全访问 |
|---|---|---|---|
受信任目录内的 read、ls、find、grep |
执行 | 执行 | 执行 |
| ……受信任目录外 | 询问 | 执行 | 执行 |
受信任目录内的 write、edit |
询问 | 执行 ¹ | 执行 |
| ……受信任目录外 | 询问 | 询问 | 执行 |
agent_spawn |
询问 | 执行 | 执行 |
Shell 命令(前台或后台);web_search 和 web_fetch;workflow;MCP 工具;工作区有自己的 .mework/lsp.json 时的 lsp ²;启动或停止服务器、操作页面、读取控制台、网络请求或截图的预览工具 |
询问 | 询问 | 执行 |
其余预览工具;读记忆和写项目记忆;plan、交接工具、ask_user、task_wait、task_list、skill、tool_search |
执行 | 执行 | 执行 |
| 写全局记忆 | 询问 | 询问 | 询问 |
¹ Mework 自己的状态文件(应用数据目录里的 document.v1.json)除外,写它仍要询问。
² 在其他工作区,lsp 按 read 那几行处理。
任何层级都会询问
下面这些在完全访问下也会询问,总是允许 管不到它们,钩子也不能事先放行:
- 目标是文件系统根目录、你的主目录或系统目录(如
/etc、/usr、/bin、/var;在 Windows 上是盘符根、你的用户目录、\Windows或\Program Files)的递归删除(rm -rf、Remove-Item -Recurse之类),以及删除目标由变量或命令替换拼出来的递归删除。其他递归删除,例如rm -rf /tmp/build,按上表处理。 - 写全局记忆。
- 服务器标明需要你交互的 MCP 工具,或你列在
disabledAutoApproveTools里的工具,见 MCP 服务器。 - 接管你已登录的预览标签页。
fork:模型请求分叉对话时,会单独出一张卡,它不会阻塞这一轮。
钩子也可以在任何层级强制出卡,或者跳过不在这份清单里的卡片。
审批卡
审批卡出现在输入框上方;子代理发起的卡出现在它的面板里。卡片用应用的语言写出工具名称,给出风险等级和询问的原因,并显示这次调用要做什么(钩子改写之后的样子):各个 shell 显示完整命令,在后台运行时标 [后台];文件工具显示路径;web_fetch 显示网址列表;工作流显示运行名。
用 拒绝、总是允许(提供时)或 允许 作答。总是允许 让这个工具在本对话里(包括它的子代理和工作流步骤)不再询问,上限是你所回答那张卡的风险等级:同一工具风险更高的调用仍会询问。这个回答随对话保存,Mework 退出或重启后仍然有效,直到你删除这个对话;分支、分叉和预设都不会复制它。shell 命令、MCP 工具、操作页面的预览工具,以及任何层级都会询问的各类,都不提供它。
卡片 30 分钟无人作答就按拒绝处理,模型得知的是超时,而不是你拒绝了。停止运行会撤回这次运行的卡片。
选了钩子时,在手动和允许编辑层级下,每一轮开始前都会弹出一个对话框,列出这些钩子和它们的命令:你可以允许这一轮,或者取消并结束这一轮。
计划模式
计划模式下,模型先写计划、请你批准,然后才改动你的文件。用输入框里安全层级旁边的 计划 开关打开,运行中途也可以。它不存进预设,所以新对话开始时总是关闭;分支和分叉会复制它。
打开时,对话里会追加计划模式的指令;第一次打开时还会加上 plan 和 exit_plan_mode 两个工具。如果模型不能在对话中途追加工具,而这两个工具在本对话里从未发出过,开关是灰的。
它拦住什么。 write 和 edit 拒绝写 Git 跟踪的任何文件,以及 Git 工作树里未被忽略的新文件——在任何钩子或审批卡之前就拒绝,本机、WSL 和 SSH 工作区都一样。
它不拦什么。 shell 命令;Git 忽略的文件或任何 Git 仓库之外的文件;子代理和工作流步骤(它们既拿不到这两个工具,也收不到指令);你在时间线上手动重新执行的调用。这些仍按安全层级处理。
批准。 模型用 plan 写计划(随对话保存,不是文件),然后调用 exit_plan_mode,这是唯一会询问的一步。计划面板随之打开,并出现一张卡:发送意见 把你写的意见发出去,模型修改计划后再来请你批准;批准 关闭计划模式,模型在同一轮里开始实施。这张卡在任何层级都会询问,不提供 总是允许,30 分钟后超时。
沙箱
沙箱让模型的 shell 命令(前台和后台)在操作系统沙箱里运行,并让它的文件工具受同样的限制。默认关闭,按工作区设置。
注意 沙箱排在安全层级之前:任何层级、回答或钩子都不能放宽它允许命令或文件工具做的事,沙箱会拒绝的调用在任何审批卡出现之前就被拒绝。在沙箱之内仍由安全层级决定:在完全访问以下,shell 命令照样询问。沙箱不覆盖预览服务器、语言服务器、MCP 服务器、钩子,以及你自己打开的终端。
开启方法:
- 点输入框里的工作区标签。
- 点目录旁的齿轮;附加的工作区则点它标签上的齿轮。
- 进入 环境 → 沙箱,打开 在沙箱中运行命令。
这项设置作用于在该目录里工作的所有对话,包括它的工作树。开关下的状态行说明这台机器能否使用沙箱;不能时,命令会在询问你之前就被拒绝,而不会在沙箱外运行;WSL 和 SSH 机器上的文件工具也一样。
| 机器 | 沙箱 | 准备 |
|---|---|---|
| macOS | Seatbelt | 无需准备 |
| Linux、WSL 2 | bubblewrap | 安装系统的 bubblewrap 软件包 |
| Windows | Windows 沙箱 | 以管理员身份设置一次:点 设置 Windows 沙箱 下的 设置。它会创建一个隐藏的本地账户 srt-sandbox 和几条防火墙规则,或沿用 Claude Code 已做好的设置 |
| 经 SSH 连接的 Windows | Windows 沙箱 | 由管理员在那台机器上运行状态行里给出的命令 |
沙箱里的命令只能写这个工作区、自己的临时目录和包缓存,以及本对话在同一台机器上、沙箱设置完全相同的其他工作区,不包括指令从别处导入的文件;.git/hooks、.git/config、.mework、.vscode、.envrc 这类文件仍然只读。在 Linux 和 WSL 上,如果工作区所在的文件系统不区分大小写(比如 WSL 里的 Windows 磁盘),这类文件保护不全:沙箱只能按确切的名字保护文件,所以 .envrc、.mcp.json、.git/config 这类文件在那里仍可能被改动,受保护的目录和其余限制照常。这种工作区仍可以开沙箱,工作区的沙箱设置会给出提示;放在 Linux 自己的文件系统里(例如 WSL 的主目录下)就能完整保护。它读不到 SSH 密钥、云令牌、钥匙串和浏览器资料这类凭据,也看不到沙箱外的进程;名字像密钥的环境变量会被去掉。它只能经代理联网,代理按下面的规则放行。
文件工具(ls、grep、find、read、write、edit)能读写的,正是同一工作区里沙箱中的命令能读写的,此外一概不行:写 .mework 或工作区外、读 ~/.ssh 都会被拒绝,工作区里的链接也绕不过去。在 WSL 和 SSH 机器上,它们在沙箱里执行;在这台电脑上,Mework 按同一套规则检查每个路径。
网络。 规则按主机名判断:放行 github.com,就放行了经 github.com 能做的一切。
| 模式 | 效果 |
|---|---|
| 只允许白名单(默认) | 只放行 白名单 上的主机。默认名单包括 GitHub、GitLab、Bitbucket 和主要的包仓库;恢复默认白名单 可以把它找回来 |
| 任意公网主机 | 任何公网主机 |
| 不联网 | 一律不放行 |
白名单一行一个:example.com,或只匹配子域的 *.example.com,都可以加 :端口。回环和内网地址只有写明才可达。在 macOS 和 Windows 上,沙箱自己起的开发服务器也算在内,所以要写上 localhost 或 localhost:端口;在 Linux 和 WSL 上,沙箱有自己的回环。
github.com
*.npmjs.org
localhost:5432黑名单 上的主机在任何模式下都不放行,且先于白名单判断。额外可写目录 和 额外禁读路径 填工作区所在机器上的绝对路径或以 ~ 开头的路径。