dcg — защита от разрушительных команд AI-агентов
📂 Исходный код на GitHubВысокопроизводительный хук для AI-агентов (Claude Code, Codex, Gemini CLI, Copilot, Cursor и др.), блокирующий опасные команды до их выполнения. 50+ пакетов правил: git, файловая система, базы данных, Kubernetes, облачные провайдеры. Написан на Rust.
AI-агенты иногда запускают катастрофические команды. Вы говорите «поправь конфиг», а получаете rm -rf ./src. Часы несохранённой работы исчезают за секунду. dcg (Destructive Command Guard) решает эту проблему — перехватывает команды до выполнения и блокирует опасные, с задержкой меньше миллисекунды.
Что блокирует
Из коробки, без конфигурации, dcg защищает от самого страшного:
core.git—git reset --hard,git push --force,git stash dropи другие операции, уничтожающие незакоммиченные изменения (всегда активен, отключить нельзя)core.filesystem—rm -rfза пределами временных директорий (всегда активен)system.disk—mkfs,ddна устройства,fdisk,parted, LVM-удаление (активен по умолчанию)
На Windows автоматически добавляются пакеты windows.filesystem (блокировка del /s, rd /s, Remove-Item -Recurse -Force) и windows.system (защита от vssadmin delete shadows, diskpart, Format-Volume).
Как выглядит блокировка
$ git reset --hard HEAD~5
════════════════════════════════════════════════════════════════
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.
════════════════════════════════════════════════════════════════
Понятное объяснение + предложение безопасной альтернативы. Без паники, без загадочных сообщений.
50+ пакетов правил
Все пакеты кроме core.* и system.disk подключаются опционально через ~/.config/dcg/config.toml:
[packs]
enabled = [
"database.postgresql",
"database.redis",
"kubernetes.kubectl",
"containers.docker",
"cloud.aws",
"infrastructure.terraform",
"cicd.github_actions",
"secrets.vault",
]
Одной строкой можно подключить семейство — например, "kubernetes" активирует все подпакеты (kubectl, helm, kustomize).
Полный каталог пакетов:
| Категория | Примеры |
|---|---|
| Базы данных | PostgreSQL, MySQL, MongoDB, Redis, SQLite, Supabase |
| Контейнеры | Docker, Docker Compose, Podman |
| Kubernetes | kubectl, Helm, Kustomize |
| Облака | AWS, Azure, GCP |
| Инфраструктура | Terraform, Pulumi, Ansible, Atmos |
| CI/CD | GitHub Actions, GitLab CI, CircleCI, Jenkins |
| Секреты | Vault, AWS Secrets Manager, 1Password, Doppler |
| Хранилища | S3, GCS, MinIO, Azure Blob |
| Бэкапы | Borg, Restic, rclone, Velero |
| Платформы | GitHub CLI, GitLab, Railway, Modal, Kamal |
| Мониторинг | Datadog, New Relic, Prometheus, Splunk, PagerDuty |
| DNS | Cloudflare, Route53, nsupdate |
| Поиск | Elasticsearch, OpenSearch, Algolia, Meilisearch |
| Платежи | Stripe, Braintree, Square |
| Почта | Mailgun, SendGrid, Postmark, SES |
| Балансировщики | ELB/ALB/NLB, HAProxy, nginx, Traefik |
| Очереди | Kafka, RabbitMQ, NATS, SQS/SNS |
| CDN | Cloudflare Workers, CloudFront, Fastly |
| API-шлюзы | Apigee, AWS API Gateway, Kong |
| Windows | Файловая система, диск, реестр, PowerShell |
Умное определение контекста
dcg не просто ищет подстроки. Он различает данные и команду:
grep "rm -rf"— это поиск текста, пропускаетсяrm -rf /— это выполнение команды, блокируется
Аналогично: echo "DROP TABLE" пройдёт, psql -c "DROP TABLE" — нет.
Сканирование heredoc и inline-скриптов
dcg анализирует содержимое heredoc-блоков и inline-команд:
# Будет заблокировано — dcg увидит os.remove() внутри python -c
python -c "import os; os.remove('/important/file')"
# Тоже — рекурсивно извлечёт внутреннюю команду из bash -c
bash -c "git reset --hard HEAD~1"
Трёхуровневая архитектура: триггер (быстрый regex, <100μs) → извлечение (<1ms) → AST-анализ (<5ms). На каждом уровне возможен ранний выход — команды без подозрительных паттернов пропускаются мгновенно.
Агент-специфичные профили
dcg автоматически определяет, какой AI-агент его вызывает, и применяет соответствующие настройки:
[agents.claude-code]
trust_level = "high"
additional_allowlist = ["npm run build", "cargo test"]
disabled_packs = ["kubernetes"]
[agents.unknown]
trust_level = "low"
extra_packs = ["paranoid"]
disabled_allowlist = true
Можно дать Claude Code больше свободы (расширенный allowlist, отключение Kubernetes-защиты), а незнакомым агентам — усиленный режим с полным отключением allowlist-обходов.
Поддерживаемые агенты
dcg работает с десятком AI-инструментов:
| Агент | Статус |
|---|---|
| Claude Code | Полная интеграция через ~/.claude/settings.json |
| Codex CLI 0.125.0+ | Нативный PreToolUse-хук в ~/.codex/hooks.json |
| Gemini CLI | Автоматическая настройка |
| GitHub Copilot CLI | Пользовательский хук через ~/.copilot/hooks/ |
| VS Code Copilot Chat | Через совместимость с Claude-хуками |
| Cursor | ~/.cursor/hooks.json |
| Hermes Agent | Через ~/.hermes/config.yaml |
| Grok (xAI) | Нативные хуки в ~/.grok/hooks/ |
| Antigravity CLI | Через ~/.gemini/config/hooks.json |
| OpenCode | Через community-плагин |
| Aider | Только git-хуки |
| Continue | Только обнаружение |
Установка
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/destructive_command_guard/main/install.sh?$(date +%s)" | bash -s -- --easy-mode
Скрипт сам определяет платформу, скачивает бинарник, проверяет SHA256-контрольную сумму и настраивает хуки для всех найденных агентов. Для Windows — PowerShell-установщик.
Философия fail-open
Если dcg не может безопасно проанализировать команду (таймаут, ошибка парсинга, превышение лимитов) — он пропускает её, а не блокирует. Лучше пропустить одно опасное действие, чем сломать рабочий процесс ложной блокировкой.
Для высокобезопасных сред можно включить fail-closed режим:
[general]
fail_closed = true
Обход защиты
Когда действительно нужно выполнить заблокированную команду:
DCG_BYPASS=1 <команда>— разовый обходdcg allow-once <код>— одноразовое разрешение по коду из сообщенияdcg allowlist add core.git:reset-hard -r "причина"— постоянное правилоdcg explain "команда"— понять, почему команда блокируется
Кастомные пакеты
Можно создавать собственные пакеты правил в YAML для внутренних инструментов:
[packs]
custom_paths = [
"~/.config/dcg/packs/*.yaml",
".dcg/packs/*.yaml",
]
Валидация: dcg pack validate mypack.yaml.
Технические детали
- Язык: Rust (nightly, Edition 2024)
- Производительность: SIMD-ускоренная фильтрация, sub-millisecond latency
- Конфигурация: TOML, многоуровневая (системный → пользовательский → проектный → env-переменные)
- Вывод: rich-терминал для людей на stderr, machine-readable JSON для агентов на stdout
- Режимы: scan (CI/pre-commit), explain, doctor, simulate, test
- Лицензия: MIT
Итог
dcg — это пара строк в конфиге, которые однажды спасут вас от rm -rf не в той директории или git reset --hard не на той ветке. Установка за 30 секунд, накладные расходы незаметны, а спокойствия добавляет значительно. Обязательный инструмент для всех, кто работает с AI-агентами в терминале.