dcg (Destructive Command Guard)
<div align="center">
<img src="https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/HEAD/illustration.webp" alt="파괴적 명령어 방지 시스템 - 실수로 인한 삭제로부터 코드를 보호합니다">
</div>
<div align="center">
Coverage
License: custom
</div>
실행되기 전에 파괴적인 명령어(destructive commands)를 차단하는 고성능 훅으로, Claude Code, Codex CLI, Gemini CLI, Copilot CLI, VS Code Copilot Chat, Cursor, Hermes Agent, Grok (xAI), Posit Assistant, Oh My Pi, Factory Droid의 Execute 도구 및 관련 도구 전반에 걸쳐 실수로 인한 삭제로부터 사용자의 작업을 보호합니다.
지원 대상: Claude Code, Codex CLI 0.125.0+, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Cursor IDE, Hermes Agent, Posit Assistant (Positron/RStudio 확장, 독립형 서버 및 pa 터미널 클라이언트), Grok (xAI) (네이티브 ~/.grok/hooks/와 Claude 호환성 레이어), Antigravity CLI (agy) (dcg install --agy를 통한 네이티브 ~/.gemini/config/hooks.json), OpenCode (dcg install --opencode를 통한 네이티브 tool.execute.before 플러그인 — docs/opencode-integration.md 참조), Oh My Pi (omp) (dcg install --omp를 통한 네이티브 tool_call 확장), Crush (dcg install --crush를 통한 crush.json의 네이티브 hooks.PreToolUse 항목 — docs/crush-integration.md 참조)
Reasonix (설정 파일 settings.json의 네이티브 hooks.PreToolUse 엔트리 — dcg install --reasonix를 통해 확인 가능, docs/reasonix-integration.md 참조), Muse Code (사용자 설정 파일 ~/.config/muse/settings.json의 네이티브 hooks.PreToolUse 매처 그룹 — dcg install --muse를 통해 확인 가능, docs/muse-integration.md 참조), Amp (설치 명령어 dcg install --amp를 통한 네이티브 tool.call 플러그인 — docs/amp-integration.md 참조), Pi (확장 레시피(extension recipe)를 통해 이용 가능, docs/pi-integration.md 참조), Aider (제한적 — git hooks만 지원), Continue (탐지 기능만 지원)<br><div align="center"><h3 id="quick-install-verified-release">빠른 설치</h3><h3 id="quick-install-verified-release">Quick Install</h3></div>
Factory Droid의 Execute 도구는 dcg install --droid를 통해 지원됩니다. 커버리지 및 스크립트 모드 제한 사항을 참조하세요.
Linux, macOS 또는 WSL에 검증된 릴리스 설치하기. 이 복사 가능한 레시피는 실행 전 고정된(pinned) 설치 프로그램을 인증하며, 일반 모드(normal), 쉬운 모드(easy-mode), 시스템 전체 설치를 지원합니다.
<p><em class="">Linux, macOS 및 WSL을 통해 작동합니다. 플랫폼을 자동 감지하여 적절한 바이너리를 다운로드하고 Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat (VS Code의 Claude-hook 호환성을 통해), Cursor IDE, Hermes Agent, Posit Assistant, Oh My Pi, Grok (xAI)를 포함한 지원되는 에이전트 훅을 구성합니다. (Grok의 경우 네이티브 `~/.grok/hooks/dcg.json` 파일 또는 자동으로 감지되는 Claude 호환성 계층을 통해 <code class="">dcg install --grok</code> 명령어로 설치할 수 있습니다.) 네이티브 Windows 환경에서는 아래 PowerShell 설치 프로그램을 사용하세요.</em></p>
<h4 id="windows-native-powershell">Windows (네이티브, PowerShell)</h4>
PowerShell을 사용하여 검증된 릴리스 설치.
이 스크립트는 실행 전에 설치 프로그램에 지정된 SHA256 및 Minisign 서명을 확인하며, 네이티브 바이너리에도 Minisign 검증을 요구합니다.
<p><em>네이티브 <code>dcg.exe</code>를 설치하고, 쉬운 모드(easy mode)로 dcg를 사용자 <code>PATH</code>에 추가하며, 자체 테스트를 실행하고, Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, Cursor IDE, Hermes Agent, Posit Assistant, Oh My Pi용으로 감지된 에이전트 훅을 구성합니다. Copilot은 모든 작업 공간(workspace)이 보호되도록 사용자 수준의 <code>%COPILOT_HOME%\hooks</code> (또는 <code>%USERPROFILE%\.copilot\hooks</code>)에 구성됩니다. Windows에서는 <code>windows.filesystem</code> 및 <code>windows.system</code> 패키지가 기본적으로 활성화되어 있으므로, <code>del /s</code>, <code>rd /s</code>, <code>Remove-Item -Recurse</code> (<-Force를 사용하든 안 하든), <code>format</code>, 그리고 <code>vssadmin delete shadows</code>가 기본적으로 차단됩니다.</em></p>
요약 (TL;DR)
문제점: AI 코딩 에이전트(Claude, Codex, Gemini, Copilot 등)는 가끔 git reset --hard, rm -rf ./src, 또는 DROP TABLE users와 같은 치명적인 명령을 실행하여 몇 시간 분량의 커밋되지 않은 작업을 순식간에 파괴합니다.
해결책: dcg는 높은 성능의 훅(hook)으로, 파괴적인 명령이 실행되기 전에 가로채어 명확한 설명과 더 안전한 대안을 제시하며 차단합니다.
왜 dcg를 사용해야 하나요?
| 기능 | 내용 |
|---|
| 제로-설정 보호 (Zero-Config Protection) | 위험한 git/파일 시스템 명령을 기본적으로 차단합니다. |
| ... | |
간단한 예시
$ git reset --hard HEAD~5
...
보호 기능 활성화하기
에이전트별 프로필
dcg는 호출하는 AI 코딩 에이전트를 자동으로 감지하고 해당 에이전트별 설정을 적용할 수 있습니다. trust_level 필드는 JSON 출력 및 로그에 기록되는 **권고 레이블(advisory label)**이며, 규칙 평가를 직접적으로 변경하지 않습니다. 행동상의 차이는 다른 프로필 필드에서 발생합니다:
| 옵션 | 효과 |
|---|
disabled_packs | 평가에서 규칙 패키지 제거 |
| ... | |
[agents.claude-code]
trust_level = "high"
...
extra_packs/disabled_packs는 [packs] enabled/disabled와 동일한 패키지 및 카테고리 ID를 사용합니다. "database"와 같은 **카테고리 ID(category ID)**는 모든 database.* 하위 패키지로 확장됩니다. dcg packs 또는 docs/packs/README.md에 나열된 ID를 사용하십시오. "paranoid"는 패키지가 아니라 졸업 모드(graduation mode)이므로, 더 엄격한 git 규칙을 위해서는 실제 strict_git 패키지를 활성화하십시오.
지원되는 에이전트, 신뢰 수준 및 구성 옵션에 대한 전체 문서는 docs/agents.md를 참조하십시오.
Codex 지원
dcg는 이제 Codex CLI를 단순히 Claude 형태의 호환성 경로가 아닌, 일급(first-class) 훅 대상(hook target)으로 취급합니다. 설치 프로그램은 PATH에서 codex를 감지하거나 기존의 ~/.codex/ 디렉토리를 발견하면 Codex CLI 0.125.0 이상을 자동으로 구성합니다.
| Codex 동작 | dcg 처리 |
|---|
| 훅 구성(Hook config) | PreToolUse Bash 훅을 ~/.codex/hooks.json에 병합합니다. |
| ... | |
Codex의 훅 입력은 의도적으로 Claude Code와 유사하지만, Codex는 훅 출력에서 알 수 없는 필드를 거부합니다. dcg는 비어있지 않은 turn_id 필드에서 Codex 페이로드(payload)를 감지하고, 차단된 명령이 실패한 훅으로 보고되는 대신 차단된 것으로 보고되도록 Codex의 문서화된 거부 필드만 방출합니다. 프로토콜 세부 정보, 수동 조사 및 문제 해결에 대한 내용은 docs/codex-integration.md를 참조하십시오. | |
출처 및 작성자
이 프로젝트는 Jeffrey Emanuel이 시작한 파이썬 스크립트였습니다. 그는 AI 코딩 에이전트가 엄청나게 유용하지만, 때때로 몇 시간 분량의 커밋되지 않은 작업을 파괴하는 치명적인 명령을 실행한다는 점을 인식했습니다. 초기 구현은 실행 전에 위험한 git 및 파일 시스템 명령을 가로채는 간단하지만 효과적인 훅(hook)이었습니다.
- Jeffrey Emanuel - 원 개념 및 파이썬 구현 (source); 모듈식 팩 시스템(50개 이상의 보안 팩), heredoc/인라인 스크립트 스캔, 3단계 아키텍처, 컨텍스트 분류, 허용 목록(allowlists), 스캔 모드 및 이중 정규 표현식 엔진으로 Rust 버전을 대폭 확장했습니다.
- Darin Gordon - 성능 최적화를 거친 초기 Rust 포트
Darin이 구현한 초기 Rust 포트는 SIMD 가속 필터링 및 지연 컴파일된 정규 표현식 패턴을 통해 마이크로초(sub-millisecond) 단위의 실행 속도를 추가하면서, 원래 파이썬 구현과의 패턴 호환성을 유지했습니다. 이후 Jeffrey는 위에서 설명한 기능을 추가하기 위해 Rust 코드베이스를 대폭 확장했습니다.
비상구(Escape Hatch) / 우회 (Bypass)
만약 dcg가 실제로 실행해야 하는 것을 차단하는 경우:
| 방법 | 범위 | 사용법 |
|---|
| Env var bypass | 단일 명령어 | DCG_BYPASS=1 <명령어> |
| ... | ... | ... |
DCG_BYPASS=1은 해당 호출에 대한 모든 보호 기능을 비활성화합니다. 이를 아껴 사용하고, 반복적으로 필요한 경우에는 허용 목록을 선호하십시오. | | |
모듈식 팩 시스템 (Modular Pack System)
dcg는 카테고리별로 파괴적인 명령어 패턴을 정리하기 위해 모듈식 "팩(pack)" 시스템을 사용합니다. 팩은 설정 파일에서 활성화하거나 비활성화할 수 있습니다.
카테고리 ID는 하위 패크(sub-packs)로 확장됩니다. enabled에 일반 카테고리를 나열하면 그 아래의 모든 패크가 활성화됩니다: enabled = ["database"]는 database.postgresql, database.mysql 및 해당 카테고리의 나머지 부분을 활성화합니다. 여전히 disabled = ["database.redis"]를 사용하여 단일 하위 패크를 비활성화할 수 있습니다. 동일한 확장은 agent-profile의 extra_packs / disabled_packs에도 적용됩니다. 항상 dcg packs / docs/packs/README.md에서 실제 패크 또는 카테고리 ID를 사용하십시오 — "paranoid"와 같은 이름은 패크가 아니라 졸업 모드입니다.
- 전체 패크 ID 인덱스:
docs/packs/README.md
- 표준 설명 및 패턴 개수:
dcg packs --verbose
기본 활성화됨 (설정 파일 없음)
설정 파일이 없을 경우, dcg는 가장 치명적이고 복구 불가능한 실수로부터 보호하는 패크만 활성화합니다:
core.filesystem - 위험한 재귀적 rm 작업 및 문자 그대로의 임시 하위 디렉터리 외부에서의 동등한 파일 시스템 파괴 (항상 활성화됨; 평가에서 제거할 수 없음)
core.git - 커밋되지 않은 작업을 손실시키거나, 히스토리를 다시 쓰거나, 스태시를 파괴하는 파괴적인 git 명령어 (항상 활성화됨; 평가에서 제거할 수 없음)
system.disk - mkfs, dd-to-device, fdisk, parted, mdadm, lvm 제거, wipefs (기본적으로 켜짐; disabled = ["system.disk"]로 선택 해제 가능)
"제거할 수 없음"은 "완화할 수 없음"과 같지 않습니다. core.* 패크는 항상 평가되므로, disabled = ["core.filesystem"]는 무시됩니다 — 하지만 dcg가 일치하는 항목에 어떻게 처리하는지는 정책이며, 그 정책은 사용자에게 달려 있습니다.
critical 규칙을 완화하려면 개별 규칙 항목이 필요합니다. 광범위한 warn 또는 log — 이것이 [policy.packs]로 작성되든 [policy] default_mode로 작성되든 —은 심각도가 critical인 모든 규칙에 대해 자동으로 deny로 상향 조정되며, dcg는 설정이 무시되었음을 보고하지 않습니다. core.filesystem과 core.git이 막기 위해 존재하는 대부분의 것은 정확히 그 심각도이므로, 광범위한 형식만으로는 보이는 것처럼 작동하지 않을 것입니다:
높은/중간 규칙만 완화합니다. core.filesystem:rm-rf-root-home이 중요하기 때문에 rm -rf ~/work는 여전히 강력하게 거부됩니다.
[policy.packs]
...
warn은 명령을 실행하고 결정을 기록하며, log도 조용히 동일하게 수행하고 기록합니다. ask는 후크 프로토콜이 지원하는 경우 운영자 검토를 요청합니다. 의존하기 전에 규칙이 실제로 어떤 모드로 해결되었는지 확인하려면 dcg explain --format json '<command>'를 사용하고 mode를 읽으십시오. 제약 조건에 대한 내용은 Configuration을, 심각도 계층 구조(severity ladder)는 Graduated Response를 참조하십시오.
네이티브 Windows에서는 기본적으로 두 개의 추가 패키지가 활성화되어 있어 초기 설치 시 구성 없이도 치명적인 네이티브 Windows 작업을 차단합니다. 또한 후크는 도구 레이블 또는 인식된 Windows 명령어 구문을 통해 Cmd 또는 PowerShell로 식별되는 요청에 대해 Linux/macOS에서도 이 두 패키지를 활성화합니다.