跳到正文
claudemods

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
显示位置
面板、输入框上方

在 Claude Code 中安装:

/plugin install blast-radius --marketplace hamzafer/claude-code-mods
全部安装方式 ↓

这个插件能做什么?

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. 1.在 Claude Code 中一行安装

    /plugin install blast-radius --marketplace hamzafer/claude-code-mods

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add hamzafer/claude-code-mods
    claude plugin install blast-radius@claude-code-mods

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 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,就原样运行命令。
危险命令拦截 在 Claude Code 中运行精选

危险命令拦截

在 rm -rf /、强推 main、DROP TABLE、curl | sh 等破坏性 Bash 命令执行前将其拒绝。

  • 弹出通知
  • 拦截工具调用
  • 修改界面

已在 v2.1.310 实测

提示框上方的 Git 分支 在 Claude Code 中运行精选

提示框上方的 Git 分支

在 Claude Code 输入框上方用一行横条显示当前 git 分支、已修改文件数和领先/落后状态。

  • 输入框上方
  • 执行命令
  • 拦截工具调用
  • 修改界面

已在 v2.1.310 实测

更多 安全防护、Git 与 GitHub。