← 返回日报
🌐 机器翻译 · DeepSeek · GitHub

Dicklesworthstone destructive_command_guard


以下是翻译后的中文内容,已按照要求保留原文结构、代码块、技术术语和专有名词,并输出为 Markdown 格式:

Dicklesworthstone destructive_command_guard

dcg (Destructive Command Guard) 一个高性能的钩子(hook),用于 AI 编码代理(coding agents),在执行破坏性命令之前将其拦截,保护你的工作免受意外删除,支持 Claude Code、Codex CLI、Gemini CLI、Copilot CLI、VS Code Copilot Chat、Cursor、Hermes Agent、Grok (xAI) 及相关工具。

支持的工具: Claude Code、Codex CLI 0.125.0+、Gemini CLI、GitHub Copilot CLI、VS Code Copilot Chat、Cursor IDE、Hermes Agent、Grok (xAI)(原生 ~/.grok/hooks/ 加上 Claude 兼容层)、Antigravity CLI (agy)(通过 dcg install --agy 使用原生 ~/.gemini/config/hooks.json)、OpenCode(通过社区插件)、Pi(通过扩展配方)、Aider(有限支持——仅 git 钩子)、Continue(仅检测)

快速安装

curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh?$(date +%s)" | bash -s -- --easy-mode

适用于 Linux、macOS 和通过 WSL 运行的 Windows。自动检测你的平台,下载正确的二进制文件,并配置支持的代理钩子,包括 Claude Code、Codex CLI、Gemini CLI、GitHub Copilot CLI、VS Code Copilot Chat(通过 VS Code 的 Claude 钩子兼容性)、Cursor IDE、Hermes Agent 和 Grok (xAI)(通过 dcg install --grok 使用原生 ~/.grok/hooks/dcg.json,或通过 Grok 自动识别的 Claude 兼容层)。对于原生 Windows,请使用下面的 PowerShell 安装程序。

Windows(原生,PowerShell)

& ([scriptblock]::Create((irm "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.ps1"))) -EasyMode -Verify

安装原生 dcg.exe,验证强制性的 SHA256 校验和,在 minisign 可用时验证发布版本的长期 minisign 签名,并在 cosign 和受信任的 bundle 均可用时验证 Sigstore/cosign 来源。它将 dcg 添加到你的用户 PATH(-EasyMode),运行自检(-Verify),并为检测到的代理钩子配置 Claude Code、Codex CLI、Gemini CLI、GitHub Copilot CLI、Cursor IDE 和 Hermes Agent。Copilot 在用户级别配置于 %COPILOT_HOME%\hooks(或 %USERPROFILE%\.copilot\hooks)下,因此每个工作区都受到保护。在 Windows 上,windows.filesystemwindows.system 包默认启用,因此 del /srd /sRemove-Item -Recurse -Forceformatvssadmin delete shadows 开箱即被阻止。使用 -Version vX.Y.Z 固定版本;使用 -RequireMinisign 在 sidecar 或验证器不可用时以失败关闭。

TL;DR

问题: AI 编码代理(Claude、Codex、Gemini、Copilot 等)偶尔会运行灾难性命令,如 git reset --hardrm -rf ./srcDROP TABLE users——在几秒钟内摧毁数小时未提交的工作。

解决方案: dcg 是一个高性能钩子,在执行破坏性命令之前将其拦截,并提供清晰的解释和更安全的替代方案。

为什么使用 dcg?

| 特性 | 功能 | |------|------| | 零配置保护 | 开箱即用,阻止危险的 git/文件系统命令 | | 50+ 安全包 | 数据库、Kubernetes、Docker、AWS/GCP/Azure、Terraform 等 | | 亚毫秒级延迟 | SIMD 加速过滤——你几乎感觉不到它的存在 | | Heredoc/内联脚本扫描 | 捕获 python -c "os.remove(...)" 和嵌入式 shell 脚本 | | 智能上下文检测 | 不会阻止 grep "rm -rf"(数据),但会阻止 rm -rf /(执行) | | 丰富的终端输出 | 在 stderr 上显示人类可读的拒绝面板、规则上下文和建议 | | 代理安全流 | 机器可读的钩子输出保留在 stdout,而丰富的 UI 保留在 stderr | | 原生 Codex 支持 | Codex CLI 0.125.0+ 接收最小的 stdout JSON 拒绝信息,当前客户端可靠地强制执行 | | 优雅降级 | 为 CI、管道、哑终端和无颜色环境提供纯文本输出 | | CI 扫描模式 | 预提交钩子和 CI 集成,用于在代码审查中捕获危险命令 | | 故障开放设计 | 永远不会因超时或解析错误而阻塞你的工作流程 | | 解释模式 | dcg explain "command" 精确显示某个命令为何被阻止 |

快速示例

# AI 代理尝试运行:
$ git reset --hard HEAD~5

# dcg 拦截并阻止:
════════════════════════════════════════════════════════════════
BLOCKED dcg
────────────────────────────────────────────────────────────────
Reason: git reset --hard destroys uncommitted changes
Command: git reset --hard HEAD~5
Tip: Consider using ' git stash ' first to save your changes.
════════════════════════════════════════════════════════════════

启用更多保护

# ~/.config/dcg/config.toml
[ packs ]
enabled = [
  " database.postgresql ",  # 阻止 DROP TABLE, TRUNCATE
  " kubernetes.kubectl ",   # 阻止 kubectl delete namespace
  " cloud.aws ",            # 阻止 aws ec2 terminate-instances
  " containers.docker ",    # 阻止 docker system prune
]

代理特定配置文件

dcg 自动检测哪个 AI 编码代理正在调用它,并可以应用代理特定的配置。trust_level 字段是一个建议性标签,记录在 JSON 输出和日志中——它不会直接改变规则评估。行为差异来自其他配置文件字段:

| 选项 | 效果 | |------|------| | disabled_packs | 从评估中移除规则包 | | extra_packs | 向评估中添加规则包 | | additional_allowlist | 添加绕过拒绝规则的命令模式 | | disabled_allowlist | 当为 true 时,忽略所有允许列表条目 |

# 更信任 Claude Code——更宽的允许列表,更少的包
[ agents . claude-code ]
trust_level = " high "
additional_allowlist = [ " npm run build " , " cargo test " ]
disabled_packs = [ " kubernetes " ]

# 限制未知代理——额外规则,不允许列表绕过
[ agents . unknown ]
trust_level = " low "
extra_packs = [ " strict_git " , " database " ]  # 真实的包/类别 ID(参见 `dcg packs`)
disabled_allowlist = true

extra_packs / disabled_packs 使用与 [packs] enabled / disabled 相同的包和类别 ID——像 "database" 这样的类别 ID 会扩展为每个 database.* 子包。使用 dcg packsdocs/packs/README.md 中列出的 ID;"paranoid" 是一个毕业模式,而不是一个包,因此请启用真实的 strict_git 包以获得更严格的 git 规则。参见 docs/agents.md

📖 阅读原文 →