Match the command word in tea-guard, not the whole string #38
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
hooks/tea-guard.sh:88ищет словоteaрегуляркой по всей строке команды, а непо имени запускаемой программы. Любая команда, у которой это слово попало в
аргумент — заголовок issue, текст коммита, grep-шаблон, — блокируется, хотя
клиент Gitea в ней не участвует.
Spec
none
Steps to reproduce
teaотдельным словом:Expected
Команда выполняется. Это
python3, сеть не используется, логин не нужен —skills/issueпо определению офлайновый слой и про трекер не знает.Actual
Причина в
hooks/tea-guard.sh:88:Условие «это вызов клиента» проверяется по подстроке в сыром тексте команды,
поэтому под него попадают
git commit -m "route it through tea api",grep -rn "tea api" skills/,echo teaи любой--titleсо словомteaвнутри. Обойти можно только переписав формулировку человеческого текста, что и
пришлось сделать: заголовок этой issue не содержит слова
teaотдельным словомименно из-за хука.
Ложное срабатывание безопасно (команда блокируется, а не выполняется под чужим
логином), но оно ломает офлайновые слои, которые к гварду отношения не имеют, и
диагностируется только чтением исходника хука.
Модуль уже импортирует
shlex(hooks/tea-guard.sh:28) и не использует его:разбор строки на токены и проверка первого слова каждого сегмента (
;,&&,||,|) дают точный ответ на вопрос «запускается лиtea».Environment
Claude Code PreToolUse(Bash) hook,
hooks/tea-guard.sh, Python 3.14, macOS.Acceptance criteria
python3 ... issue_new.py --title "... tea ..."выполняется, а неблокируется
git commit -m "..."с словомteaв сообщении выполняетсяtea issues listбез--loginпо-прежнему блокируетсяtea issues list --login "$GITEA_LOGIN"по-прежнему переписывается назакреплённый логин
cd x && tea issues list ...разбирается как вызов клиента
tests/, покрывающий ложное срабатывание и оба случая вышеДубликат #29 — закрываю в его пользу.
Ложное срабатывание гварда поймали три независимых агента на трёх разных
командах; каноническая issue собирает все четыре случая в одни Steps to
reproduce, чтобы тест на регрессию покрыл их разом.
Уникальные вклады этой issue перенесены в #29 целиком:
git commit -m "route it through …"иechoкак случаи наравне с--title;детектора — оно сохранено в Actual как доказательство цены проблемы;
офлайновые слои, которые к гварду отношения не имеют»;
cd x && …,x | …, подстановки;shlexуже импортирован вhooks/tea-guard.sh:28и неиспользуется по назначению.