关于 safe-mode
面向 Claude Code 的技能,为编码会话添加可选防护。谨慎模式会在执行标记为危险的 Bash 命令前请求确认,锁定模式则将 Edit 和 Write 操作限制在指定目录内。
主要功能
- 01对标记的危险命令发出警告
- 02将 Edit 和 Write 限制在指定目录
- 03同时启用谨慎与锁定模式
- 04通过命令清除会话限制
适用场景
- 01在定向重构期间限制文件修改
- 02代码审查时限定可修改文件
- 03为高风险 Shell 命令添加确认提示
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rohitg00/ pro-workflow --skill safe-mode安装后在 Claude Code 中输入/safe-mode确认已加载。
详细介绍
安全模式
在 AI 编码会话期间,为破坏性操作提供三个级别的保护。
**注意:**这些钩子仅限技能范围 — 只有在调用
/safe-mode时才会激活。hooks.json 中的全局permission-request.js钩子会始终对危险命令发出警告。安全模式在此基础上增加了可选择启用的拦截和目录限制。
模式
谨慎模式
/safe-mode cautious
在执行前拦截 Bash 命令。对危险模式发出警告,但不会拦截 — 由用户决定。
标记的模式:
| 模式 | 风险 |
|---|---|
rm -rf / rm -r | 递归删除 |
DROP TABLE / DROP DATABASE | SQL 数据丢失 |
TRUNCATE | SQL 数据销毁 |
git push --force / git push -f | 重写远程历史 |
git reset --hard | 本地历史丢失 |
git clean -f | 删除未跟踪文件 |
git checkout . / git restore . | 丢弃所有更改 |
chmod 777 | 允许所有用户写入的权限 |
将 curl 或 wget 的输出传递给 shell | 管道执行远程内容 |
> /dev/sda / dd if= | 磁盘级操作 |
:(){ :|:& };: | 叉炸弹 |
sudo rm | 提权删除 |
**执行结果:**钩子会返回权限 ask,因此 Claude Code 会显示提示,指出匹配的模式,例如 Safe mode: rm with -r or -f。你可以批准或拒绝该命令。即使在自动模式下也会显示此提示。
锁定模式
/safe-mode lockdown <path>
将 Edit 和 Write 操作限制在单个目录树中。防止意外更改无关代码。
工作原理:
- 设置允许的路径(绝对路径或相对于仓库根目录的路径)
- 每次 Edit/Write 调用都会检查目标文件是否位于允许的路径内
- 路径外的操作会被拦截,并显示说明
LOCKDOWN ACTIVE: Edits restricted to src/api/
Blocked: Edit to src/utils/helpers.ts
Reason: File is outside the lockdown path (src/api/)
To edit files outside the lockdown, run: /safe-mode clear
适用场景:
- 专注重构某个模块,而不触及其他模块
- 在特定目录中修复错误,同时在其他位置运行测试
- 为初级开发者设置防护栏 — 限制影响范围
- 代码审查会话 — 只编辑正在审查的文件
**作用范围:**以项目根目录为依据。设置后会一直生效,直到执行 /safe-mode clear;并且仅在调用过 /safe-mode 的会话中强制执行。
清除
/safe-mode clear
移除当前会话的所有限制。谨慎模式警告和锁定模式限制都会被禁用。
SAFE MODE: All restrictions cleared for this session.
实现方式
调用此技能会注册一个针对 Bash|Edit|Write 的 PreToolUse 钩子,该钩子会运行 scripts/safe-mode-guard.js。技能钩子会在会话剩余时间内保持注册状态。在设置模式之前,防护程序不会执行任何操作。
设置模式
用户运行 /safe-mode <mode> 时,从项目根目录运行防护程序的设置命令:
node "${CLAUDE_PLUGIN_ROOT}/scripts/safe-mode-guard.js" set cautious
node "${CLAUDE_PLUGIN_ROOT}/scripts/safe-mode-guard.js" set lockdown src/api/
node "${CLAUDE_PLUGIN_ROOT}/scripts/safe-mode-guard.js" set clear
然后报告设置命令打印的行。
谨慎模式(Bash)
防护程序会将 tool_input.command 与一组固定的破坏性模式进行匹配:递归或强制执行的 rm、DROP 和 TRUNCATE、强制推送、硬重置、git clean -f、丢弃所有更改、chmod 777、将 curl 或 wget 的输出传递给 shell、磁盘级写入、叉炸弹以及 sudo rm。匹配时会返回 permissionDecision: "ask",并将匹配的模式作为原因。未匹配时则放行。
锁定模式(Edit 和 Write)
防护程序会根据项目根目录解析 tool_input.file_path,跟随符号链接,并检查文件是否位于锁定路径内。路径内的操作会放行。路径外的操作会以状态码 2 退出,从而拦截编辑并告知 Claude 原因。
状态
模式存储在 $TMPDIR/pro-workflow/safe-mode-<hash>.json 中,并以项目根目录为键,因此不同项目不会共用状态:
{ "cautious": true, "lockdownPath": "/Users/dev/project/src/api", "root": "/Users/dev/project" }
set clear 会删除该文件。该文件的生命周期会超出当前会话,因此完成后请清除它;新会话只有在调用 /safe-mode 后才会再次强制执行限制,因为此钩子仅限技能范围。
组合模式
谨慎模式和锁定模式可以同时运行:
/safe-mode cautious
/safe-mode lockdown src/api/
现在你将获得:
- 针对破坏性操作的 Bash 命令警告
- 仅允许对
src/api/执行 Edit/Write 操作的限制
清除操作会移除这两种模式。
适用场景
| 情况 | 模式 |
|---|---|
| 修改与生产环境相关的代码 | 谨慎 |
| 专注重构单个模块 | 锁定 |
| 面对不熟悉的代码库,想谨慎行事 | 谨慎 |
| 结对编程,限制 AI 的范围 | 锁定 |
| 不再需要限制 | 清除 |
反模式
- 需要编辑测试时仍保持锁定模式(更新路径或清除锁定)
- 用安全模式代替 Git 分支(分支保护历史记录,安全模式保护会话)
- 反复忽略谨慎模式的警告(如果总是继续操作,就将其关闭——错误的信心更糟)