Canny CLI
Хуки для Claude Code и Codex CLI ведут журнал действий агента и не принимают «готово» без пройденной проверки.
- 132 ★ репозитория
- Последний коммит
Расширенный доступ
Почему такой уровень
- Хуки встраиваются в каждый вызов инструментов агента и могут запретить или переписать команду.
- С ключом TypeSafe фрагменты правок и последнее сообщение агента уходят во внешний API.
Установка
- Работает в
Ручная установка
git clone https://github.com/qkal/canny.git ~/.canny/srcКлон лежит в `~/.canny/src`, собирать нечего: скомпилированный CLI закоммичен.
Доступ и проверки
Как мы проверяемРасширенный доступИнструмент запускает код или ходит в сеть, а внешние данные только читает.
- Хуки встраиваются в каждый вызов инструментов агента и могут запретить или переписать команду.
- С ключом TypeSafe фрагменты правок и последнее сообщение агента уходят во внешний API.
Это чужой код. Посмотрите файлы в репозитории перед установкой.
Что делает
Canny — слой контроля над ИИ-агентами для кода. Он подключается к Claude Code и Codex CLI через хуки и пишет журнал фактов сессии: какие файлы изменены, какие команды запущены и с каким кодом выхода завершились. Когда агент пытается закончить работу, а после последней правки кода не прошла ни одна проверка (тесты, сборка, линтер, тип-чек), Canny отклоняет завершение и называет файлы и последнюю команду. Дополнительные проверки по шаблонам: хук запрещает запись секретов (ключи AWS, GitHub, Stripe, OpenAI, Anthropic, приватные ключи), просит подтверждение при удалении тестов и добавлении `.skip`, переписывает `npm test | tail` под `set -o pipefail` и останавливает четвертый повтор упавшей команды. Решения принимает код без сети. Необязательная модель Jev от TypeSafe при заданном `TYPESAFE_API_KEY` добавляет заметки и может только смягчить правило.
Для кого. Разработчикам, которые отдают Claude Code или Codex длинные задачи и хотят видеть запущенные тесты, а не только слово «готово».
Подходит, если
- Агент пишет «готово», не запустив тесты, и вы узнаете об этом только после сессии.
- Файл с ключом API, записанный агентом, не должен попасть в коммит.
- Упавшие тесты удаляют или помечают `.skip` вместо исправления кода.
- После сессии нужно разобрать журнал: `canny replay` заново выводит вердикты по записанным фактам.
Не подходит, если
- Работа идет в другом агенте: хуки написаны под формат событий Claude Code и Codex CLI.
- На машине нет Node.js 22 или новее.
- Задача без кода и тестов: гейт завершения срабатывает только после правок кода.
Пример запроса к агенту
Добавь функцию в math.js и не заканчивай, пока проверки проекта не пройдут.Ограничения
Canny не опубликован в npm: репозиторий клонируют в `~/.canny/src` и запускают `node ~/.canny/src/dist/cli.js init`. Нужны git и Node.js 22 или новее. Журнал хранит командные строки, коды выхода и пути правленых файлов, поэтому секрет в аргументе команды попадет в журнал. При заданном `TYPESAFE_API_KEY` фрагменты правок до 4000 знаков и последнее сообщение агента уходят в API TypeSafe и кэшируются в `~/.canny/jev/`. Поля `verify`, `ignore`, `rules` и `allow` в `.canny.json` действуют только после `canny trust`, но агент с доступом к оболочке способен выполнить эту команду сам. Распознаются типовые записи файлов из оболочки, а `find -exec rm` или `python -c` Canny не видит.
Как отключить. Выполните `node ~/.canny/src/dist/cli.js remove` в корне проекта (или с `--global`). Каталог `~/.canny` с журналами удалите отдельно.
Частые вопросы
Как поставить Canny?
Вставьте промпт из раздела установки README в Claude Code или Codex внутри нужного проекта. Агент клонирует репозиторий в `~/.canny/src` и выполнит `init`. Вручную: `git clone https://github.com/qkal/canny.git ~/.canny/src`, затем `node ~/.canny/src/dist/cli.js init`.
Что Canny блокирует, а что только подсказывает?
Блокируют завершение без пройденной проверки, запись секретов и четвертый повтор одной упавшей команды. На удаление тестов Claude Code показывает запрос подтверждения, Codex отказывает. Ответы Jev остаются заметками для агента.
Нужен ли ключ TypeSafe?
Нет. Без `TYPESAFE_API_KEY` журнал, гейт завершения и проверки по шаблонам работают так же, а наружу ничего не уходит.
Как понять, что хуки включились?
Выполните `echo canny-check`, затем `node ~/.canny/src/dist/cli.js status`. Если в выводе есть сессия хотя бы с одним событием, хуки работают.
Какие агенты поддерживаются?
Claude Code и Codex CLI. `init` пишет хуки для найденных агентов, а флаги `--claude` и `--codex` выбирают одного.
Обсуждение
Вопросов и отзывов пока нет.
Похожие
CLI-инструментыПроверяет diff и переписку с агентом: ловит ошибки в коде и расхождения между вашей просьбой и тем, что агент сделал. CLI, скилл и GitHub Action
OpenQodex проверяет ваши изменения перед пушем: сначала сканеры без модели, затем отдельный процесс Claude Code или Codex разбирает находки по вашему входу
Шаблон проекта Playwright на TypeScript с правилами и 17 скиллами, чтобы Claude Code, Codex и Cursor писали тесты по стандарту
1c-codex-skills: Claude поручает тесты и ревью 1С Codex CLI
1c-codex-skills
Четыре скилла для Claude Code: тестирование 1С через Codex и 1c-testpilot, ревью кода, выгрузка и загрузка через ibcmd
Поправки, которые вы даете агенту, становятся файлами-правилами в репозитории и проверяются локально и в CI одной командой.
CLI Vercel для проверки кодинг-агентов на вашем фреймворке: запускает Claude Code, Codex и другие, считает долю успешных задач
Коротко о README
README открывается примером живого запуска: Claude Code записал файл через heredoc, ничего не запустил и объявил работу законченной. На повторе того же запроса Canny отклонил завершение. Дальше описаны три хука, таблица проверок, порядок гейта завершения, настройка `.canny.json` и отличия Claude Code от Codex.