Иконка ресурса

Хук Claude File Guard (для Claude Desktop/CLI) 1.4

=== 1.4 (2026-10-14) ===

Цель: никаких лишних "Failed" в интерфейсе из-за shell-фильтра.

Исправлено
- Ложные блокировки shell-команд: проверяется только инструкция, которая пишет (разбиение по ; & |
и строкам с учётом кавычек, heredoc и here-string целиком), переменные, заданные в самой команде
($d='...', d=..., set d=...), и переменные окружения ($env:TEMP, %TEMP%) раскрываются. Раньше
запись в scratchpad через $d или "cp *.bat ... && python ... open(scratchpad)" блокировалась.
Если пишущая инструкция использует незаданную переменную, проверяется вся команда, как раньше.

Новое
- Заблокированная команда Bash/PowerShell больше не показывается пользователю как "Failed": она
заменяется выводом причины (код 0, в описании "skipped by File Guard"), Claude получает то же
объяснение. Хуки не умеют отказывать без пометки об ошибке, поэтому так. Desktop Commander - по-прежнему deny.

Тесты
- Команда со скриншота пользователя и похожие случаи; замещающая команда запускается в pwsh и
Git Bash и должна завершиться с кодом 0.

=== 1.3 (2026-10-14) ===

Исправлено
- Изменение оригинала после Read определялось по времени изменения файла, а оно на Windows идёт шагами
~15 мс: запись в тот же тик (форматтер, другой хук, автосохранение IDE) не замечалась, и правка Claude
затирала её. Теперь сверяется SHA-1 содержимого.

Тесты
- Фикстуры - любые файлы unit_test с именем Имя_<кодировка>.<расширение> (cpNNN, utf8, utf8bom,
utf16le/be[bom]): определение кодировки, Read, 30 случайных правок реального содержимого, перезапись.
Добавлен CSharp_utf8bom.cs. Проверка изменения оригинала с тем же размером и временем изменения.

=== 1.2 (2026-10-14) ===

Цель: надёжность. Найдено стресс-тестами (unit_test\stress_test.py) и сквозной проверкой настоящими
инструментами Claude Code.

Исправлено (ошибки были и в 1.0/1.1)
- Полная перезапись (Write) файла не в UTF-8 через путь копии - а именно так Claude обязан делать - теряла CRLF:
файл молча становился LF. Теперь сохраняются переводы строк оригинала.
- Read-only или заблокированный оригинал: правка оставалась только в копии, а Claude об этом не узнавал
(хук завершался с кодом 1). Теперь "CHANGE NOT APPLIED" с причиной, копия откатывается.
- Параллельные Read одного файла (Claude Code выполняет их одновременно) падали с FileExistsError/
FileNotFoundError, а Read мог увидеть неполную копию. Копии и метаданные теперь пишутся атомарно,
одинаковое содержимое не перезаписывается, старые копии удаляются без гонок.
  • Текст в cp1251, начинающийся на "яю" (байты FF FE), принимался за UTF-16 с BOM.
  • Короткий UTF-16 без BOM с эмодзи или символами вида U+xx00 ('Ā', '一') принимался за бинарный файл
(Edit/Write блокировались).
- Копия с потерянными метаданными принималась за обычный файл: правка не доходила до оригинала.
Теперь Edit/Write такой копии запрещены с подсказкой перечитать файл.

Новое
- Определение OEM-кодировки (cp866 на русской Windows) наряду с ANSI (cp1251): по "chcp N" в начале
батника, иначе по правдоподобию слов (в неверной кодировке регистр внутри слов скачет и появляются
символы вроде (R), (C), ¬). OEM выбирается, только если в тексте есть слово от 3 букв, иначе ANSI.
Раньше файлы в cp866 читались как cp1251: Claude видел мусор, новая кириллица записывалась не в той кодировке.
- Повреждённый UTF-8 (почти весь текст в UTF-8, но есть битые байты) больше не перекодируется как ANSI:
Edit/Write блокируются с объяснением.
- Батники: новый .bat/.cmd в UTF-8 всегда без BOM (BOM ломает первую строку в любой консоли), даже при
соседях с BOM, .editorconfig utf-8-bom или символе BOM в начале текста; UTF-16/32 для батников не
используется. Подсказка "chcp <кодовая страница файла> >nul" для любого не-ASCII батника, где её нет
(консоль Claude Code работает в 65001, у пользователя - в 866).
  • Write больше не переносит в файл символ BOM из начала текста, если у файла BOM нет.
  • Shell-фильтр: текст сообщения git commit -m (в т.ч. heredoc и here-string PowerShell) не считается
командой; блокируется New-Item -Value.
- CLAUDE_FILE_GUARD_OEM - переопределение OEM-кодировки (как CLAUDE_FILE_GUARD_ANSI).

Уточнено
- PostToolUseFailure не вызывается для ошибки "String to replace not found" (Claude Code проверяет
Edit до хуков), поэтому правило "правка только по пути копии" остаётся в CLAUDE.md.

Тесты
- Папка unit_test: stress_test.py (~20 000 проверок: фикстуры *_cpNNN.bat с запуском через cmd.exe,
батники, определение кодовых страниц, фаззинг правок во всех кодировках, случайные байты, сбои
записи, параллельные процессы, shell-фильтр) и README.md с ручной сквозной проверкой.

=== 1.1 (2026-10-13) ===

Цель: меньше трудностей у новых сессий Claude при создании файлов.

Новое
- Стиль новых файлов (кодировка, BOM, CRLF/LF) выбирается автоматически по порядку:
.editorconfig -> правило .bat/.cmd (всегда CRLF) и .sh/.bash (всегда LF) -> соседние файлы
с тем же расширением (в папке, а для новой папки в родителе и его подпапках) -> умолчание по расширению
(CRLF для .vbs .reg .sln .vbp .vbg .bas .frm .cls .ctl .rc .inf .iss .nsi).
- Поддержка .editorconfig: end_of_line (lf/crlf) и charset (utf-8, utf-8-bom, utf-16le, utf-16be,
latin1 = системная ANSI, windows-125x); секции с *, ?, [..], {a,b}; root = true.
- Хук сообщает Claude, какой стиль применён к новому файлу и почему; для .bat/.cmd с не-ASCII
добавлена подсказка про "chcp 65001 >nul".
- Событие PostToolUseFailure: если Edit/Write по исходному пути не-UTF-8 файла завершился ошибкой,
Claude получает путь UTF-8 копии (если Claude Code вызывает хук для этой ошибки).
- Сообщение блокировки shell-записи и CLAUDE.snippet.md описывают, как создавать новые файлы
(Write, без "засева" через Copy-Item и без чтения исходника хука).

Исправлено
- Новый не-UTF-8 файл в ещё не существующей папке не создавался: теперь папка создаётся при записи в оригинал.

Установщик
  • Не переписывает settings.json и не делает резервную копию, если записи не изменились.
  • Регистрирует событие PostToolUseFailure.

Тесты
- Новый раздел F (стиль новых файлов, .editorconfig, подсказка при ошибке); всего более 500 проверок.
Назад
Сверху Снизу