远程跑 Claude Code 时,最怕代理「好心」改到仓库旁边的全局配置、家目录脚本或另一份实验工程。v2.1.314 起,可以打开 permissions.blockWritesOutsideWorkingDirectories:Write、Edit、NotebookEdit 在所有权限模式下都会拒绝工作目录外的路径。这篇讲怎么在一台常开的新加坡 Mac mini 上启用、核对项目布局,并完成可复现的验收。
账号由你自己开通与登录。本文只讨论稳定合规的使用环境与机器侧配置,不涉及共享账号或绕过平台规则。
这项开关解决什么
公开说明与社区讨论可以概括成三点:
- 作用对象:文件写入类工具——Write、Edit、NotebookEdit。
- 规则:目标路径若落在当前工作目录之外,直接拒绝;与你当前处于「默认询问」还是更宽松的权限模式无关,该拦截都会生效。
- 目的:把可写范围收紧到「你这次启动时选定的仓库」,降低无人值守或远程会话里误改旁路目录的风险。
它不能代替:把敏感路径写进 hooks、用 git 做 diff 复查、或把密钥放进密钥链而不是明文文件。它也不会禁止 Bash 等命令行工具读写目录外文件——若你依赖 shell 改文件,仍要靠允许列表与人工确认。本文只聚焦 目录外写入拦截本身。
第一步:确认版本与启动工作目录
用 SSH 或 UU 远程连接登录 Mac mini:
claude --version
确认已到 2.1.314 或更新(补丁号以官方发行说明为准)。然后固定到真实仓库根再启动:
tmux new -s claude-cwd || tmux attach -t claude-cwd
cd ~/work/your-repo
pwd
claude
关键习惯:先 cd 到仓库根,再开会话。工作目录就是拦截边界——从家目录或错误子目录启动,边界会跟着偏。
建议长期只在这台机器上放主仓库,笔记本只做远程接入,避免「本机一份、远端一份」导致你以为边界在 A、实际会话开在 B。
第二步:打开 blockWritesOutsideWorkingDirectories
交互式入口:
claude
# 会话内:
/config
在权限相关项里找到 blockWritesOutsideWorkingDirectories(文案随版本可能略有出入),设为开启。
也可以写进用户或项目级 settings.json(路径以当前版本文档为准)。示意:
{
"permissions": {
"blockWritesOutsideWorkingDirectories": true
}
}
改完后新开一轮会话,再查 /config,确认 UI 与文件一致。若团队共用同一仓库,把该约定写进仓库旁注或 CLAUDE.md 专属段:
# Claude Code 本机约定(仅 Claude)
- 启动:始终在仓库根目录
- permissions.blockWritesOutsideWorkingDirectories = true
- 跨仓改动:另开会话,不要指望一次会话跨多个根目录写文件
第三步:理清项目布局,让「边界」看得见
拦截只认工作目录。布局越清晰,误拒和漏拦都越少:
- 一仓一根:相关代码放在同一 git 仓库;需要同时改的两个产品,优先用 monorepo 或明确的子目录,而不是两个平级「兄弟文件夹」指望一次会话两边写。
- 配置进仓:项目相关的脚本、编辑器片段、本地说明放到仓库内(可被
.gitignore忽略),不要散落在~/bin或全局配置目录让代理「顺手」去改。 - 密钥不进仓:API Key、证书放进系统钥匙串或环境变量由你注入;拦截挡的是误写,不是密钥管理本身。
- 临时实验单独目录:开一个
~/sandbox/experiments/,需要改它时另开claude,不要在主仓会话里指过去写。
快速自检当前边界:
pwd
ls -la
# 确认这里就是你希望唯一可写的根
第四步:一轮「目录外拒绝、目录内可写」验收
用真实仓库做可复现测试:
- 在仓库根启动
claude,确认开关为开。 - 明确要求它 Edit 或 Write 一个仓库外的路径(例如用户主目录下与本项目无关的文本文件)。预期:工具调用被拒绝,路径未改动。
- 再要求它 编辑仓库内一个无害文件(例如
README.md加一行注释,或专用scratch.md)。预期:可正常写入。 - 用
git status/git diff核对:只有预期文件有变更;目录外目标保持原样。 - 若你同时用 VS Code 扩展或 Desktop 的 Code 标签,在同一台 Mac mini、同一仓库根再测一次,避免「终端开了、图形入口还没开」。
验收标准很简单:目录外必拒,目录内可写,git 里没有意外路径。
第五步:远程与无人值守时怎么更稳
常开新加坡 Mac mini 上跑长任务时,这条开关尤其有用:
- 远程断线不等于会话结束:SSH 或 UU 远程连接断开只丢掉画面;远端
claude仍可能继续改文件。把可写范围锁在仓库根,等于给无人值守加了一道闸。 - 多窗口别混根目录:手机、笔记本、本机桌面若各自
cd到不同路径再开会话,边界会不一致。统一约定「只在~/work/your-repo启动」。 - 权限模式再松也不越界写入:该选项对所有权限模式生效;你仍要为 Bash 等高风险工具单独设允许列表,但至少文件编辑类工具不会越界。
- 与 hooks、软指引分工:
CLAUDE.md是提醒;hooks 可做命令级硬门禁;本开关专门管 Write/Edit/NotebookEdit 的路径范围。三层一起用,比只靠口头约束稳。
常见踩坑
| 现象 | 常见原因 | 处理 | | --- | --- | --- | | 想改子模块旁的兄弟仓被拒 | 启动根不是「共同父目录」 | 迁入 monorepo,或另开会话 | | 改 ~/.xxx 配置被拒 | 全局配置在工作目录外 | 把项目相关配置迁进仓,或手动改全局项 | | 开关开了仍写出仓外 | 实际是 Bash/tee 等,不是 Write/Edit | 收紧 shell 允许列表,复查 hooks | | /config 看不到该项 | 版本偏旧或看错入口 | claude --version 升到含该能力的版本后再查 |
为什么放在新加坡常开的 Mac mini 上
目录外写入拦截要在「真正跑任务的那台机器」上生效。把 Claude Code 固定在新加坡的一台常开整机上,好处很直接:
- 工作目录长期稳定:仓库路径、
settings.json、tmux 会话都在同一环境,不会因为换笔记本而漂移。 - 远程接入不影响边界:你从别处连进来,只要仍在约定仓库根启动,拦截规则一致。
- 无人值守更敢走开:长重构、过夜循环时,代理最多在仓内折腾,不会悄悄改到仓外全局文件。
- 真 macOS 工具链:iOS / macOS 相关命令与开发机一致,长会话更值得把写入边界配清楚。
Zumac.Ai 提供位于新加坡的实体 Mac mini M6,整机独享,支持 SSH 与 UU 远程连接,FileVault 全盘加密,退租时抹机重装。新客户整机租用 ¥999/月起,季付 ¥2,697.30,半年付 6 送 1 为 ¥5,994,年付 12 送 2 为 ¥11,988;已购买客户续费保持原价。新客户首单自审核开通当天起租,续费及老客户新订单自付款当天起租。建议先租一个月,把「仓库根启动 + blockWritesOutsideWorkingDirectories + 目录外/内验收」在同一台机器上跑通。实际延迟取决于你本地的网络线路。
小结
- v2.1.314 起可开启
permissions.blockWritesOutsideWorkingDirectories,让 Write / Edit / NotebookEdit 在所有权限模式下拒绝工作目录外路径。 - 先
cd到仓库根再启动;用/config或settings.json打开开关并新开会话核对。 - 布局上做到一仓一根、配置进仓、实验目录另开会话。
- 用「目录外拒绝、目录内可写、git 无意外」完成验收;Bash 等仍需单独约束。
- 把 Claude Code 固定在常开的新加坡 Mac mini 上,用 SSH 或 UU 远程连接接入,让写入边界成为可复现的默认。
