Blast Radius:Claude Code rm -rf 预览,先看危险命令会改动什么
在 Claude Code 运行 rm -r、强制推送或数据库迁移之前先拦下,列出会受影响的文件或提交,等你确认。
权限
- 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
- 实测版本
- v2.1.291
- 最近实测
- 需要
- Claude Code ≥ 2.1.287
- 显示位置
- 面板、输入框上方
这个插件能做什么?
Blast Radius 是一款提供 Claude Code rm -rf 预览的社区插件,作者是 Hamza Zafar(hamzafer),出自他的 claude-code-mods 合集。当 Claude 准备通过 Bash 工具运行一条有风险的 shell 命令时,插件会先把它拦下,展示它会改动什么,然后等你按下 Cancel 或 Proceed。
有三类命令会被拦下。递归的 rm 会得到一份将被删除的文件列表及其总大小,例如 delete 42 files (1.3 MB)。~ 和 $HOME 会被展开;如果路径中含有其他 shell 变量、命令替换或 ~user,则显示 "can't preview",而不是去猜测。git push --force 会列出将会丢失的远程提交和将被推送的本地提交,以最近一次 fetch 为准。数据库迁移(prisma、supabase、drizzle-kit、knex、sequelize、rails、alembic、typeorm)无法预览,因此插件会列出名称看起来像迁移或 schema 的未提交文件。
报告会在侧边窗格中打开;如果终端太窄放不下窗格,则显示在输入框上方的横条中。默认聚焦在 Cancel 上(快捷键 c);Proceed 是 y。倒计时显示为 auto-cancels in 42 s,60 秒内没有回应就会取消命令。无论哪种情况,Claude 都会得到一个理由,因此无人值守的会话会继续进行,而不是卡住。同一时间只拦下一条命令;第二条命令会排队等候,轮到它时再获得完整的倒计时。
我们的 危险命令拦截 会直接拒绝一组固定的破坏性模式,相比之下,Blast Radius 是一种"拿事实来问我"的防护:它从不阻止你批准的命令,而且覆盖普通的 rm -r,而不仅仅是灾难性的目标。两者可以一起使用。作者的 README 要求 Claude Code 2.1.287 或更高版本。
演示
录屏中,我们在演示项目里创建一个临时的 dist 文件夹,里面有三个小文件,然后让 Claude 运行 rm -r dist。Blast Radius 在命令执行前将其拦下,显示它会删除的内容(3 个文件、12 KB,逐一列出路径),并附带 Cancel 和 Proceed 按钮以及自动取消倒计时。我们按下了 Cancel,所以什么都没有被删除。
安装
使用安装区块中的任意一种方式;它们都直接从作者自己的插件市场安装。插件一加载,防护就会生效。
$ install blast-radius
需要 Claude Code ≥ 2.1.287
从作者自己的 marketplace 安装: hamzafer/claude-code-mods
1.在 Claude Code 中一行安装
/plugin install blast-radius --marketplace hamzafer/claude-code-mods粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。
2.从终端安装
claude plugin marketplace add hamzafer/claude-code-mods claude plugin install blast-radius@claude-code-mods然后在所有已打开的会话中运行 /reload-plugins。
3.免安装试用
git clone https://github.com/hamzafer/claude-code-mods claude --plugin-dir ./claude-code-mods/mods/blast-radius仅在当前会话中加载该插件,不会写入你的设置。
工作原理
插件为 Bash 挂接 tool.call。纯函数 classify 按 &&、||、; 和换行拆分命令,查找三类有风险的命令。如果都不匹配,调用会通过 next(e) 直接放行。以下是 hooks/register.tsx 中针对递归删除的预览:
// Unquoted $t expands globs, and nothing else, without running the command.
const script =
'shopt -s nullglob; for t in "$@"; do for p in $t; do [ -e "$p" ] || continue; ' +
'echo "S $(du -sk "$p" | cut -f1)"; find "$p" -type f | head -n 5000 | sed "s/^/F /"; done; done'
const r = await $.process.run(['bash', '-c', script, 'blast-radius', ...targets], init)目标以参数形式传入,而不是拼接进脚本,列表最多 5000 个文件。测量完成后,插件把被拦下的命令存入一个 $.state 原子,用 $.ui.open 打开 blast-radius 窗格,并每四分之一秒轮询一次,检查是否有按钮被按下、是否到达截止时间或调用是否被中止。Proceed 返回 next(e),所以命令会完全按原样运行。Cancel 或超时则返回 { deny: ... },消息中附带预览摘要。在这一切之前,会先检查 $.session.surfaces():如果没有屏幕,调用会被立即拒绝。
自定义
只有一个选项 timeoutSeconds(默认 60,最小 0),用于设置被拦下的命令在取消前等待多久;0 表示一直等待并隐藏倒计时。可以在 /config 中该插件名称下修改,也可以在 settings.json 的 pluginConfigs 中修改。迁移工具列表是 register.tsx 顶部的 MIGRATION 正则表达式,MAX_LISTED(200)限制报告最多显示多少行。
权限与安全
在运行之前,我们读过了插件可以执行的每一个文件:hooks/hooks.json、hooks/register.tsx、类型声明以及测试。没有 package.json、安装脚本或打包后的代码。
之所以会出现拦截工具调用,是因为插件会把关 Bash 调用:它可以拦下并拒绝调用,但从不改写命令。之所以会出现执行命令,是因为调用了 $.process.run。它运行的程序都是只读的:带有上面 du/find 脚本的 bash -c,针对强制推送的两次 git log --oneline,针对迁移的 git status --porcelain,以及轮询循环中的 sleep 0.25。每次预览调用都有 10 秒超时;注意,对非常大的目标运行 du 和 find 可能会一直耗到超时。它会读取 HOME 环境变量来展开 ~。修改界面对应的是窗格和横条。
它不写文件、不使用网络,也不调用模型。claude plugin validate 没有报告任何错误或警告,作者的 17 个测试在 Claude Code 2.1.291 上全部通过。请把它当作多看一眼的保障,而不是沙箱:把 rm 藏在变量或其他程序背后的命令不会被识别出来。
- 执行命令
- 可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 拦截工具调用
- 能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 修改界面
- 在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
兼容性与故障排除
已在 macOS 上使用 Claude Code 2.1.291 检查(validate 和测试)。如果有风险的命令没有被拦下:
claude --version为 2.1.287 或更高版本,并且插件在/plugin中处于启用状态。- 该命令属于那三类之一。不带
-r的普通rm file.txt不会被拦下。 - 强制推送的预览以最近一次 fetch 时的上游为基准统计提交;运行
git fetch可以得到最新列表。 - 在
claude -p和其他没有屏幕的会话中,被拦下的命令会立即被拒绝,而不是显示出来。
常见问题
- Blast Radius 会拦下哪些命令?
- 递归的 rm(rm -r、rm -rf、rm --recursive,在 sudo 之后也算),带 -f、--force、--force-with-lease 或 +refspec 的 git push,以及来自 prisma、supabase、drizzle-kit、knex、sequelize、rails、alembic 和 typeorm 的迁移命令。复合命令的每一部分都会被检查。
- 预览时会运行那条危险命令吗?
- 不会。对于 rm,它在一个只展开通配符的 bash 脚本中对目标运行 du 和 find。对于强制推送,它以最近一次 fetch 时的上游为基准运行两条 git log 命令。对于迁移,它运行 git status。每一项都有 10 秒超时。
- 如果没人回应会怎样?
- 60 秒后命令会被取消,同时告诉 Claude 这条命令本来会做什么,并且不要自行重试。设置 timeoutSeconds 可以改变等待时间,设为 0 则一直等待。
- claude -p 或无界面运行时呢?
- 没有连接屏幕时没人能按按钮,因此被拦下的命令会立即被拒绝,拒绝理由中会附带预览内容。
- 它和 危险命令拦截(cm-block-dangerous-commands)有什么区别?
- 危险命令拦截 会直接拒绝匹配的命令并弹出通知。Blast Radius 则是询问你,展示会被删除或覆盖的内容,如果你按下 Proceed,就原样运行命令。
# 相关插件
精选
精选更多 安全防护、Git 与 GitHub。