feat(метко-хуки): покрыть frontend .ts/.tsx (комментарий-aware скан JS/TS) #4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
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?
Проблема
Метко-хуки сейчас де-факто не проверяют фронтовые
.ts/.tsx— нарушения (#NNN, session-метки) во фронте проходят молча. Всплыло вsenokosov/baton#688: золотые модули фронта пришлось грепать на метки руками, потому чтоpre-commitих не ловит.Разбор по хукам
no-issue-refs-in-comments— НЕ работает на TStypes: [python]→ хук вообще не запускается на.ts/.tsx.extract_comment()вscripts/check_no_issue_refs_in_comments.pyхардкодит питоновский#-синтаксис (ищет#вне строк). В TS комментарии —//и/* */, а#там не комментарий. Даже снявtypes, текущая логика#123в// см. #123не увидит.no-session-marks-in-code— частично работает, но рискованноtypesне задан → consumer может расширитьfiles:на фронт уже сейчас..pyсканируются только COMMENT/STRING-токены (черезtokenize), а в «прочих файлах» — построчно по всей строке. Для markdown это ок (проза), а для.ts/.tsxпострочный скан пройдётся и по коду → риск ложных срабатываний[A-Z]\d+на идентификаторах/дженериках/литералах. Нужен симметричный с.pyскан только комментариев (и при желании строк).no-broken-repo-paths— уже покрывает TSfixtures/broken_paths/{bad,good,limitation}.ts, описание прямо говорит «в прочих файлах (.ts/.tsx) — построчно». baton уже скоупит этот хук на фронт. Менять не надо — оставляю как ориентир, что path-проверка фронт уже видит.Предлагаемое решение
Научить метко-хуки извлекать комментарии JS/TS и сканировать только их — симметрично с питоновским tokenize-скан'ом:
.ts/.tsx/.js/.jsx: line (//) + block (/* ... */, многострочный), с корректным игнором//и/*внутри строковых литералов (',",`-template). По возможности — и строковые литералы (метка пряталась и в них в.py).no-issue-refs-in-comments: убрать жёсткийtypes: [python], сделать выбор парсера по расширению (py → текущий#-extract; ts/js → новый JS/TS-extract). ЛогикаISSUE_REF_RE/TODO_REпереиспользуется как есть.no-session-marks-in-code: для.ts/.tsxтоже скан только комментариев (а не всей строки), чтобы убрать ложные срабатывания на коде..py/.mdповедение не трогаем.*.ts(good/bad) для обоих хуков + кейсы вfixtures/run_smoke.sh. Сверить, что// TODO(#N)остаётся разрешён, а// см. #123/// этап M2/45падают..pre-commit-hooks.yaml(name/description: «.py + JS/TS») иREADME.md(пример consumer-конфига сfiles: ...\.(ts|tsx)$).Acceptance
no-issue-refs-in-commentsиno-session-marks-in-codeловят метки в//и/* */комментариях.ts/.tsx; код вне комментариев не триггерит.// TODO(#N)и легитимные токены кода (Int32,HTTP_200, дженерики) не дают false-positive..ts+ smoke-кейсы добавлены,bash fixtures/run_smoke.shзелёный..pre-commit-hooks.yaml+README.mdобновлены.После релиза (consumer baton)
baton бампит
revи расширяетfiles:у обоих метко-хуков на^frontend/.*\.(ts|tsx)$, затем чистит всплывшие нарушения. Зафиксировать отдельной baton-issue после тега.Заметки
waiting; верификация — локально черезfixtures/run_smoke.sh(как в PR #2/#3).senokosov/baton#688(комментарий volody про покрытие фронта).Ревизия остатка на текущий
main(v0.13.0). Половина задачи закрыта по дороге в #10 и #12, половина — нет.Сделано:
scripts/comment_scan.py: C-подобный режим (//,/* */) с пофайловой машиной состояний, трекингом строковых и шаблонных литералов и распознаванием regex-литералов JS. Пункты 1 и 2 плана.no-issue-refs-in-commentsжёсткийtypes: [python]потерял и парсер выбирает по расширению;.ts/.tsx/.jsxпокрыты фикстурами (fixtures/issue_refs/*.ts*),// TODO(#N)остаётся легальным.Осталось — пункт 3, ровно он и был про ложняки:
no-session-marks-in-codeв.pyсканирует COMMENT/STRING-токены, а в любом не-.pyфайле идёт построчно по всей строке. Для markdown это верно (проза), для.ts/.tsx— нет: правило[A-Z]\d+пройдётся по коду, и дженерикT1, литералH2,enum Step2дадут FAIL там, где никакой метки нет. Пока хук на фронт не наводят, дыры не видно — но и покрыть фронт им нельзя.Починка теперь дешёвая: взять
c_style_chunksизcomment_scanдля C-подобных расширений, оставив построчный режим markdown'у. Приёмка задачи в этой части не меняется.Закрываю: остаток сделан в #21 (в
main, версия0.17.0).no-session-marks-in-codeв C-подобных файлах разбираетсяc_style_chunksизscripts/comment_scan.py— только комментарии//и/* */, общей машиной состояний сno-issue-refs-in-comments. Построчный скан остался markdown'у,.py— как был..mts/.ctsдобавлены в список C-подобных расширений: без них легальные TS-файлы оставались бы ровно на том скане, от которого уходили.По приёмке задачи: код вне комментариев больше не триггерит (
fixtures/session_marks/good.tsдержит дженерикT1,Map<K1, V2>, литерал"H2"и деление — всё, что построчный скан флагал),// TODO(#N)и легитимные токены чисты, фикстуры и smoke-кейсы добавлены, манифест и README обновлены, пример consumer-конфига расширен наts|tsx.Что осталось за рамками и записано в README: текст JSX не сканируется (это не комментарий и не литерал), метка внутри строкового литерала TS не ловится — асимметрия с
.pyнамеренная, в TS/JS литерал сплошь и рядом несёт разметку ("H2","P1"). Разметочные и стилевые расширения (.css,.vue,.svelte) по-прежнему падают в построчный фолбэк — ведётся в #11.