@7n/rules 1.44.0 → 1.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/docs/stryker.config.md +13 -16
- package/package.json +1 -1
- package/rules/abie/lib/docs/http-route.md +13 -11
- package/rules/abie/lib/docs/yaml.md +27 -15
- package/rules/ci4/marksman_config/docs/main.md +12 -12
- package/rules/doc-files/docgen-prompts/docs/main.md +52 -23
- package/rules/image-avif/avif_generation/docs/main.md +28 -16
- package/rules/test/coverage/lib/classify/prompt.mjs +1 -0
- package/rules/test/coverage/lib/classify/verdict-schema.mjs +1 -0
- package/rules/test/coverage/lib/lcov.mjs +54 -0
- package/rules/text/oxfmtrc/docs/fix-oxfmtrc.md +12 -9
- package/rules/text/vscode_settings/docs/fix-vscode_settings.md +14 -10
- package/rules/worktree/zed_settings/docs/fix-zed_settings.md +12 -7
- package/scripts/lib/auto-worktree.mjs +9 -3
- package/scripts/lib/docs/auto-worktree.md +50 -12
- package/scripts/lib/docs/worktree-notice.md +65 -10
- package/scripts/lib/worktree-notice.mjs +5 -3
- package/skills/taze/js/docs/migration-cache.md +33 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.45.0] - 2026-07-23
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- концерн coverage правила test: гейт покриття/мутаційки як lint-детектор (--no-fix = CI-гейт), CoverageProvider порт у plugin-api (spec 2026-07-22 absorb-7n-test)
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
|
|
12
|
+
- doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
|
|
13
|
+
- doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
|
|
14
|
+
- doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
|
|
15
|
+
- doc_comments rollout: header/export JSDoc у конфігах demo
|
|
16
|
+
- doc_comments rollout: header-JSDoc у vitest.config
|
|
17
|
+
|
|
18
|
+
## [1.44.1] - 2026-07-23
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- worktree-only скіли (n-lint/n-taze/n-adr-normalize): preflight і ensureRunningInWorktree визнають .claude/worktrees/ (harness Claude Code) як вже ізольований worktree — не пропонують створювати вкладене .worktrees/ дерево
|
|
23
|
+
|
|
3
24
|
## [1.44.0] - 2026-07-22
|
|
4
25
|
|
|
5
26
|
### Added
|
package/docs/stryker.config.md
CHANGED
|
@@ -3,28 +3,25 @@ type: JS Module
|
|
|
3
3
|
title: stryker.config.mjs
|
|
4
4
|
resource: npm/stryker.config.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
6
|
+
crc: cb7d2219
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
8
9
|
score: 100
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
9
11
|
---
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Файл описує конфігурацію Stryker для `@7n/rules`, щоб запускати `vitest-runner` з `perTest`-покриттям на production-коді в `scripts/`, `rules/` і `bin/`, не зачіпаючи фікстури та baseline-шаблони.
|
|
12
16
|
|
|
13
17
|
## Поведінка
|
|
14
18
|
|
|
15
|
-
1.
|
|
16
|
-
2.
|
|
17
|
-
3.
|
|
18
|
-
4.
|
|
19
|
-
5.
|
|
20
|
-
6.
|
|
21
|
-
7. Вмикає функціонал збереження результатів між запусками, використовуючи файл `incremental.json`.
|
|
22
|
-
8. Визначає список файлів, які підлягають мутації:
|
|
23
|
-
- Файли у директорії `scripts`.
|
|
24
|
-
- Файли у директорії `rules`.
|
|
25
|
-
- Файли у директорії `bin`.
|
|
26
|
-
9. Виключає з мутації файли у директоріях `tests`, `__fixtures__`, `fixtures`, `data`, `template`, `templates`.
|
|
27
|
-
10. Виключає з мутації файли у директорії `data`, крім файлу `stryker-vue-macros-ignorer.mjs` у директорії `rules/test/js/data/stryker_config/`.
|
|
19
|
+
1. Запускає мутаційне тестування коду `@7n/rules` через `vitest-runner`, щоб оцінити, як добре тести виявляють зміни в production-логіці.
|
|
20
|
+
2. Перевіряє лише лінії, які реально зачіпаються тестами, щоб зосередити аналіз на корисному сигналі, а не на повному повторному прогоні всього набору.
|
|
21
|
+
3. Зберігає службові артефакти звіту в `reports/stryker/`, зокрема `mutation.json`, щоб результат можна було переглядати й обробляти далі.
|
|
22
|
+
4. Підтримує інкрементальний режим через `incremental.json`, щоб повторні запуски відновлювали попередній стан мутаційної оцінки.
|
|
23
|
+
5. Мутує основний production-код у `scripts/`, `rules/` і `bin/`, а каталоги `**/data/**` і `**/template/**` та `**/templates/**` не включає.
|
|
24
|
+
6. Окремо включає `rules/test/js/data/stryker_config/stryker-vue-macros-ignorer.mjs`.
|
|
28
25
|
|
|
29
26
|
## Гарантії поведінки
|
|
30
27
|
|
package/package.json
CHANGED
|
@@ -3,29 +3,31 @@ type: JS Module
|
|
|
3
3
|
title: http-route.mjs
|
|
4
4
|
resource: npm/rules/abie/lib/http-route.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
8
|
-
tier:
|
|
6
|
+
crc: d88f96a3
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.98
|
|
11
10
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Огляд
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
`analyzeAbieSharedBackendRefsInPackageK8s` рахує `backendRefs` у base-маніфестах пакета, що вказують на спільні cross-namespace `-hl` сервіси з набору `ABIE_SHARED_CROSS_NS_BACKEND_NAMES`, і не враховує overlay `ua`. Це дає `ua_http_route` змогу синхронізувати кількість namespace patch-ів в overlay із фактичною кількістю base-reference до shared backend.
|
|
17
16
|
|
|
18
17
|
## Поведінка
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
analyzeAbieSharedBackendRefsInPackageK8s
|
|
19
|
+
ABIE_SHARED_CROSS_NS_BACKEND_NAMES задає спільний перелік cross-namespace `-hl` сервісів, на який орієнтується вся перевірка; цей набір використовується як єдине джерело істини для того, що вважається shared backend.
|
|
20
|
+
|
|
21
|
+
analyzeAbieSharedBackendRefsInPackageK8s проходить по YAML-маніфестах пакета в base-шарі, свідомо оминаючи overlay `ua`, і збирає лише ті HTTPRoute-документи, які реально посилаються на спільні сервіси. Для кожного такого посилання воно підсумовує кількість `backendRefs` і накопичує порушення, якщо shared backend вказано не через `namespace: dev` або без очікуваного `port: 8080` згідно з (abie.mdc).
|
|
22
|
+
|
|
23
|
+
Результат роботи повертається як агрегована статистика для подальшої синхронізації кількості namespace-patch-ів в overlay із фактичною кількістю base-reference; помилки повертаються окремим списком, щоб викликальний концерн міг показати саме ті місця, де базовий HTTPRoute виходить за правилами shared cross-namespace доступу.
|
|
23
24
|
|
|
24
25
|
## Публічний API
|
|
25
26
|
|
|
26
|
-
ABIE_SHARED_CROSS_NS_BACKEND_NAMES —
|
|
27
|
-
analyzeAbieSharedBackendRefsInPackageK8s —
|
|
27
|
+
- ABIE_SHARED_CROSS_NS_BACKEND_NAMES — Імена спільних headless-сервісів, на які HTTPRoute-и пакетів посилаються крізь namespace.
|
|
28
|
+
- analyzeAbieSharedBackendRefsInPackageK8s — Збирає по yaml-файлах пакета (поза overlay ua) кількість shared-`-hl` `backendRefs`
|
|
29
|
+
і базові помилки (без `namespace: dev`).
|
|
28
30
|
|
|
29
31
|
## Гарантії поведінки
|
|
30
32
|
|
|
31
|
-
-
|
|
33
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -3,31 +3,43 @@ type: JS Module
|
|
|
3
3
|
title: yaml.mjs
|
|
4
4
|
resource: npm/rules/abie/lib/yaml.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: b15223d7
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
|
+
score: 100
|
|
10
|
+
issues: judge-refine:kept-original,judge:inaccurate:0.97
|
|
11
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
7
12
|
---
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
## Огляд
|
|
15
|
+
|
|
16
|
+
Спільні YAML-хелпери для abie-перевірок: `stripBom` прибирає BOM на початку тексту, `MODELINE_RE` розпізнає службовий рядок `# yaml-language-server: $schema=`, а `LINE_SPLIT_RE` ділить вміст на рядки. `readAndParseYamlDocs` читає YAML як набір документів, `isDeploymentDoc` відокремлює документи потрібного типу, а `silentFail` дає fail-safe поведінку: за непридатного вмісту або помилки повертається порожнє значення замість винятку.
|
|
10
17
|
|
|
11
18
|
## Поведінка
|
|
12
19
|
|
|
13
|
-
|
|
20
|
+
MODELINE_RE і LINE_SPLIT_RE задають спільні правила нормалізації вхідного YAML: перший виявляє службовий modeline на початку файлу, другий уніфікує розбиття тексту на рядки незалежно від переносу.
|
|
21
|
+
|
|
22
|
+
stripBom прибирає початковий BOM перед подальшою обробкою, щоб наступні кроки працювали з чистим вмістом без артефактів кодування.
|
|
14
23
|
|
|
15
|
-
|
|
16
|
-
2. Прибирає BOM на початку вмісту, якщо він є.
|
|
17
|
-
3. Якщо перший рядок — це YAML-language-server modeline (`# yaml-language-server: $schema=...`), пропускає його перед розбором; решта вмісту парситься без нього. Інакше парситься весь вміст.
|
|
18
|
-
4. Розбирає всі YAML-документи у файлі (мультидокументні файли з `---` підтримуються). При помилці розбору викликає обробник помилок із повідомленням і повертає `null`; інакше повертає масив розібраних документів.
|
|
24
|
+
readAndParseYamlDocs є основним потоком: читає файл, нормалізує вміст через stripBom, відсікає modeline, якщо він є першим рядком, і лише тоді передає результат у YAML-парсинг. Успішний результат повертається далі як набір YAML-документів, а будь-яка проблема читання або парсингу перетворюється на повідомлення через failFn і завершується без винятку назовні.
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
silentFail використовується як нейтральний обробник помилок для сценаріїв, де зіпсований або непридатний YAML не має зупиняти перевірку; у такому режимі помилка свідомо приглушується, а контроль залишається у викликача.
|
|
21
27
|
|
|
22
|
-
|
|
28
|
+
isDeploymentDoc відокремлює лише документи потрібного виду для подальших перевірок, щоб решта YAML не проходила через специфічну логіку abie-здач.
|
|
23
29
|
|
|
24
|
-
##
|
|
30
|
+
## Публічний API
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
- MODELINE_RE — Розпізнає modeline `yaml-language-server` з `$schema=` у першому рядку файлу; захоплює URL схеми.
|
|
33
|
+
- LINE_SPLIT_RE — Поділ вмісту на рядки незалежно від стилю переносу (LF чи CRLF).
|
|
34
|
+
- stripBom — Прибирає BOM на початку файлу.
|
|
35
|
+
- isDeploymentDoc — Чи YAML-документ — це `kind: Deployment`.
|
|
36
|
+
- silentFail — No-op fail-handler для функцій, що мовчки повертають null/[] при помилці парсингу.
|
|
37
|
+
- readAndParseYamlDocs — Зчитує і парсить YAML-документи з файлу. BOM і modeline (перший рядок `$schema`)
|
|
38
|
+
автоматично прибираються перед `parseAllDocuments`. При помилці читання/парсингу
|
|
39
|
+
викликає `failFn` і повертає `null`.
|
|
27
40
|
|
|
28
41
|
## Гарантії поведінки
|
|
29
42
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- Предикат розпізнавання `Deployment` безпечний для будь-якого вводу: повертає `false` для `null`, масивів і не-об'єктів, ніколи не кидає винятків.
|
|
43
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
44
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
45
|
+
- За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
|
|
@@ -3,28 +3,28 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/ci4/marksman_config/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 259b7df5
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
tier: local-min-retry
|
|
8
9
|
score: 100
|
|
9
|
-
issues: judge:
|
|
10
|
+
issues: judge:error
|
|
10
11
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
12
|
---
|
|
12
13
|
|
|
13
14
|
## Огляд
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Це файловий модуль відповідає за забезпечення певної функціональної області системи. Він виконує аналіз даних у межах визначених логічних кордонів. У своїй поведінці він обов'язково включає маркери повідомлень згідно з `ci4.mdc`.
|
|
16
|
+
Файл виконує перевірку конфігураційних даних у робочому каталозі. Він вимагає наявності канонічного конфігу, визначеного константою MARKSMAN_BASELINE_PATH, для коректної роботи системи, і при його відсутності вказує на необхідність відновлення пакета правил. Крім того, визначається цільовий файл MARKSMAN_TARGET_FILENAME, і ця функція повідомляє про його успішне знаходження або про необхідність ініціалізації. Доступна функція lint виконує перевірку відповідно до визначених конфігурацій.
|
|
18
17
|
|
|
19
18
|
## Поведінка
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
При запуску `lint` системи перевіряє наявність файлу `MARKSMAN_BASELINE_PATH`, який є канонічним конфігом, що постачається з пакетом правил; якщо він відсутній, система повідомляє про помилку, що вказує на необхідність перевстановлення пакета `@7n/rules`. Потім система шукає у робочому каталозі файл, визначений у `MARKSMAN_TARGET_FILENAME` (`.marksman.toml`); якщо він знайдений, система повідомляє про успіх. Якщо ж файл відсутній, система повідомляє про необхідність копіювання канонічного baseline-конфігу, посилаючись на правило (ci4.mdc).
|
|
21
|
+
|
|
22
|
+
## Публічний API
|
|
23
|
+
|
|
24
|
+
- MARKSMAN_BASELINE_PATH — Абсолютний шлях до канонічного baseline-конфігу marksman, що постачається разом із пакетом правил.
|
|
25
|
+
- MARKSMAN_TARGET_FILENAME — Імʼя конфіг-файлу marksman, який має лежати в корені репозиторію.
|
|
26
|
+
- lint — Перевіряє наявність `.marksman.toml` у корені; сигналить копіювання canonical baseline.
|
|
27
27
|
|
|
28
28
|
## Гарантії поведінки
|
|
29
29
|
|
|
30
|
-
-
|
|
30
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -3,46 +3,75 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/doc-files/docgen-prompts/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
6
|
+
crc: 8cb3a892
|
|
7
|
+
model: openai-codex/gpt-5.5
|
|
8
|
+
tier: cloud-avg
|
|
8
9
|
score: 100
|
|
9
|
-
issues: judge:inaccurate:0.99
|
|
10
|
+
issues: judge-refine:kept-original,judge:inaccurate:0.99
|
|
10
11
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
12
|
---
|
|
12
13
|
|
|
13
14
|
## Огляд
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
Файл формує промпти й детерміновані фрагменти для генерації поведінкової документації: `STYLE` задає спільний тон, `sectionMessages`, `overviewMessages`, `criticMessages`, `refineMessages`, `oneShotMessages` і `judgeRefineMessages` готують повідомлення для різних етапів, `isApiGap`, `renderApiLine` та `apiGapMessages` висвітлюють прогалини API, а `guaranteesFromMarkers` і `buildUnitDigest` стискають контекст до контрольованого обсягу `UNIT_DIGEST_TOKENS`. Файл існує як текстовий шар оркестратора документації, щоб підтримувати лаконічний стиль, узгоджувати очікування між етапами генерації та зменшувати ризик вигаданих тверджень. У межах одного прогону використовує кешування для повторного використання вже підготовлених результатів.
|
|
16
17
|
|
|
17
18
|
## Поведінка
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
STYLE задає спільні правила тону й форми для промптів, щоб усі згенеровані секції лишалися лаконічними, поведінковими та без технічного шуму.
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
Ти технічний письменник. Пишеш лаконічну ПОВЕДІНКОВУ документацію до коду українською, чистим Markdown.
|
|
23
|
-
Пиши ЩО і НАВІЩО, не ЯК. Без вступів і висновків. Не обгортай у ```-блок.
|
|
24
|
-
Заборонено: сигнатури, типи, параметри функцій; перелік stdlib-модулів; опис regex чи внутрішніх приватних імен.
|
|
22
|
+
Основний потік генерації розділяє документацію на незалежні кроки. sectionMessages формує запит лише для секції «Поведінка» з мінімальним контекстом: фактами про файл, релевантними анкорами, захищеним «Призначенням» і, за потреби, стислим представленням коду. Після отримання готової «Поведінки» overviewMessages створює «Огляд» уже з неї, а не напряму з коду, щоб підсумок спирався на підтверджений опис поведінки.
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
````
|
|
24
|
+
Публічний API обробляється гібридно без зайвого LLM-переписування. isApiGap визначає, які експорти не мають змістовного опису. Для покритих описом експортів renderApiLine повертає дослівний рядок документації, зберігаючи авторський текст. Для прогалин apiGapMessages формує окремий вузький запит тільки по відсутніх описах, щоб модель не торкалася вже надійних JSDoc-фрагментів.
|
|
28
25
|
|
|
29
|
-
|
|
26
|
+
Якість машинних секцій підсилюється окремим циклом перевірки. criticMessages готує запит до критика, який має знайти конкретні дефекти або підтвердити їх відсутність. refineMessages використовує ці зауваження для переписування чорнетки без зміни призначення секції. judgeRefineMessages виконує точкове доопрацювання документа за причиною від судді, коли потрібно виправити конкретне хибне твердження замість просто позначити результат як погіршений.
|
|
27
|
+
|
|
28
|
+
guaranteesFromMarkers створює «Гарантії поведінки» детерміновано з маркерів факт-листа, без LLM-запиту. Це відокремлює формальні гарантії від вільного тексту й зменшує ризик вигаданих тверджень.
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
oneShotMessages лишається базовим одноетапним сценарієм для порівняння з секційним потоком. UNIT_DIGEST_TOKENS задає межу компактного представлення великих файлів, а buildUnitDigest перетворює набір юнітів на стислий дайджест, щоб промпт зберігав фокус на структурі й поведінці замість перевантаження сирим кодом.
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
Файл не виконує власних записів у файлову систему чи базу даних: результати всіх публічних функцій повертаються як текстові секції, рядки або масиви повідомлень для подальшої обробки зовнішнім оркестратором. Кешування використовується лише в межах поточного прогону.
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
## Публічний API
|
|
36
35
|
|
|
37
|
-
STYLE —
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
- STYLE — Спільний system-стиль для всіх docgen-промптів: вимагає лаконічну поведінкову
|
|
37
|
+
українську документацію, забороняє сигнатури/типи й мета-фрази перед відповіддю
|
|
38
|
+
(профілактика «озвучування завдання» малими моделями).
|
|
39
|
+
- sectionMessages — Секційні набори messages з МІНІМАЛЬНИМ контекстом під кожну секцію.
|
|
40
|
+
Код потрапляє лише в `behavior`; «Огляд» генерується окремо ОСТАННІМ
|
|
41
|
+
(`overviewMessages`) з уже написаної Поведінки — тут його немає. «Публічний
|
|
42
|
+
API» сюди більше не входить (Stage 1/3, гібрид doc-files ADR 260719-2155):
|
|
43
|
+
покриті JSDoc-описом експорти рендеряться дослівно без LLM (`renderApiLine`),
|
|
44
|
+
LLM викликається лише на прогалини (`apiGapMessages`) — див. `isApiGap`.
|
|
45
|
+
- isApiGap — Stage 2 (gap-детект, 0 токенів): чи є опис експорту прогалиною — відсутній
|
|
46
|
+
або JSDoc-заглушка без сенсу.
|
|
47
|
+
- renderApiLine — Stage 1 (скриптовий рендер, 0 токенів, 0 галюцинацій): дослівний рядок
|
|
48
|
+
«Публічного API» з покритого JSDoc-описом експорту — без перефразування LLM.
|
|
49
|
+
- apiGapMessages — Stage 3: messages ЛИШЕ для експортів-прогалин (без desc) — вужчий промпт,
|
|
50
|
+
ніж попередній «переписати весь список своїми словами» (жодного контакту з
|
|
51
|
+
уже покритими JSDoc експортами, 0 ризику спотворити авторський текст).
|
|
52
|
+
- overviewMessages — R3 — «Огляд» ОСТАННІМ: узагальнення вже написаної Поведінки, а не здогад із
|
|
53
|
+
голого факт-листа. Лікує generic/хибний Огляд на складних файлах.
|
|
54
|
+
Анкор-блок сюди НЕ підставляється (№8, бенч gemma-4): секції — окремі
|
|
55
|
+
LLM-виклики, і коли анкори бачили обидва, кожен чесно вставляв «рівно один
|
|
56
|
+
раз» → у документі виходило двічі (незграбні «посилаючись на…» в Огляді).
|
|
57
|
+
Анкори живуть лише в Behavior-промпті; скорер R5 перевіряє документ цілком.
|
|
58
|
+
- criticMessages — E2-step 1 — критик. Перевіряє чорнетку секції на конкретні дефекти.
|
|
59
|
+
Повертає messages для LLM-запиту: вихід має бути СПИСКОМ issues або словом NONE.
|
|
60
|
+
- refineMessages — E2-step 2 — refine. Переписує чорнетку, виправляючи перелічені issues.
|
|
61
|
+
- guaranteesFromMarkers — E3 — детермінований шаблон секції «Гарантії поведінки» з facts.markers.
|
|
62
|
+
НЕ використовує LLM: 0 запитів, 0 галюцинацій, 0 generic-фраз.
|
|
63
|
+
- oneShotMessages — One-shot messages (база для порівняння).
|
|
64
|
+
- UNIT_DIGEST_TOKENS — Поріг (у токенах, ~4 байти/токен), після якого сирий src замінюється юніт-дайджестом.
|
|
65
|
+
- buildUnitDigest — №5 (бенч gemma-4): стислий юніт-дайджест великого файлу замість сирого src у
|
|
66
|
+
Behavior-промпті. На ~6k токенів сирцю мала модель втрачає фокус (водянисті
|
|
67
|
+
формулювання); дайджест подає структуру — імʼя, JSDoc, call-graph, тіло лише
|
|
68
|
+
для непокритих JSDoc юнітів (перші рядки) — і тримає промпт компактним.
|
|
69
|
+
- judgeRefineMessages — №6 — judge-refine: один локальний refine-прохід за конкретними зауваженнями
|
|
70
|
+
LLM-судді (замість лише маркування degraded). Суддя вже сформулював, ЩО саме
|
|
71
|
+
хибне (`reason`) — мала модель добре виправляє точкові твердження, коли їй
|
|
72
|
+
сказано, які саме.
|
|
44
73
|
|
|
45
74
|
## Гарантії поведінки
|
|
46
75
|
|
|
47
|
-
-
|
|
76
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
48
77
|
- Кешує результати в межах одного прогону.
|
|
@@ -3,33 +3,45 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/image-avif/avif_generation/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
crc: 7e73761a
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
|
+
score: 85
|
|
10
|
+
issues: internal-name:walkDir,anchor-miss:(image-avif.mdc),judge-refine:kept-original,judge:inaccurate:0.98
|
|
10
11
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
12
|
---
|
|
12
13
|
|
|
13
14
|
## Огляд
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
Цей модуль відповідає за ініціалізацію та виконання процесу конвертації растрових зображень у проєкті на AVIF-двійники, як описано у `package.json`. Публічна функція `main` запускає сканування всіх пакетів монорепозиторію, що призводить до заміни посилань у файлах Vue та HTML на оптимізовані версії. Крім того, він очищає від неіспользуних AVIF-файлів, використовуючи кешування даних протягом одного прогону.
|
|
16
|
+
scanAvif — read-only детектор AVIF для `.vue` і `.html`: він знаходить raster-посилання і класифікує їх як `avif-needs-rewrite`, `avif-missing` або `avif-orphan`. `AVIF_NEEDS_REWRITE`, `AVIF_MISSING`, `AVIF_ORPHAN`, `MINIFY_PACKAGE_NAME`, `CLEANUP_EXTRA_IGNORE_DIR_NAMES` — публічні константи для цих перевірок і спільних правил сканування. `lint --no-fix` лише звітує і не мутує tree, а переписування посилань, AVIF-генерацію та прибирання сиріт виконує окремий T0-fix `fix-avif_generation.mjs`. Cache працює в межах одного прогону.
|
|
17
17
|
|
|
18
18
|
## Поведінка
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
`scanAvif` запускає спільний read-only потік для detector-а й T0-fix: спершу перевіряє, чи є в репозиторії хоч одне raster-посилання, придатне для AVIF-етапу, далі збирає зв’язки між `.vue`/`.html`, `.avif` і package.json, а потім формує результати для лінту без жодної мутації дерева. Якщо raster-посилань немає, весь етап пропускається; якщо в workspace немає workspaces або `.vue`-файлів, AVIF-правило для проєкту теж не активується.
|
|
21
|
+
|
|
22
|
+
`MINIFY_PACKAGE_NAME` позначає пакет, через який читається opt-out у `package.json`: коли пакет вимикає AVIF-перевірку, його шаблони не беруть участі в перевірці посилань, а його `.avif` не можна автоматично вважати сиротами. Це захищає файли, що можуть використовуватись через alias, runtime-обчислення або зовнішні посилання, які статичний скан тут не бачить.
|
|
23
|
+
|
|
24
|
+
`CLEANUP_EXTRA_IGNORE_DIR_NAMES` додає спільні виключення для обходу, щоб `scanAvif` і `lint` не зачіпали каталоги, які не мають впливати на AVIF-діагностику.
|
|
25
|
+
|
|
26
|
+
`AVIF_NEEDS_REWRITE` використовується для випадків, коли raster-посилання вже має доступний `.avif`-двійник, але посилання ще не переписане на нього; `AVIF_MISSING` — коли потрібного `.avif`-двійника немає; `AVIF_ORPHAN` — коли `.avif` лишився без живих посилань у відсканованих шаблонах.
|
|
27
|
+
|
|
28
|
+
`lint` лише звітує ці три стани як violations і не виконує генерацію AVIF, переписування посилань чи видалення сиріт; ці дії лишаються за окремим T0-fix. Маркери повідомлень прив’язані до `image-avif.mdc`, а сам detector спирається на `package.json` як джерело opt-out-конфігурації.
|
|
29
29
|
|
|
30
30
|
## Публічний API
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
- AVIF_NEEDS_REWRITE — Стабільні reasons.
|
|
33
|
+
- AVIF_MISSING — Стабільний reason: для растрового зображення відсутній згенерований AVIF-двійник.
|
|
34
|
+
- AVIF_ORPHAN — Стабільний reason: AVIF-файл лишився без растрового джерела — кандидат на cleanup.
|
|
35
|
+
- MINIFY_PACKAGE_NAME — Імʼя CLI-пакета, який генерує AVIF (використовує T0-fix).
|
|
36
|
+
- CLEANUP_EXTRA_IGNORE_DIR_NAMES — Імена каталогів, які cleanup НЕ зачіпає, бо це артефакти збірки/нативні
|
|
37
|
+
платформи — `.avif` всередині — це продукт попереднього `bun run build`/Capacitor sync,
|
|
38
|
+
а не кандидати на видалення. `walkDir` уже скіпає `node_modules`, `.git`, `dist`,
|
|
39
|
+
`coverage`, `.turbo`, `.next` — додатково для cleanup ігноруємо ще ці.
|
|
40
|
+
- scanAvif — Чистий read-only скан усього AVIF-етапу (без npx, без запису, без unlink). Спільний
|
|
41
|
+
для detector-а (→ violations) і T0-fix (виконує генерацію, потім rescan + write/unlink).
|
|
42
|
+
- lint — Read-only detector AVIF-етапу: ЗВІТУЄ потрібні rewrite-и (`avif-needs-rewrite`),
|
|
43
|
+
відсутні `.avif`-двійники (`avif-missing`) і `.avif`-сироти (`avif-orphan`).
|
|
44
|
+
Не валідує image-compress cache/dependency policy — це окреме правило.
|
|
33
45
|
|
|
34
46
|
## Гарантії поведінки
|
|
35
47
|
|
|
@@ -10,6 +10,7 @@ import { basename, dirname, join } from 'node:path'
|
|
|
10
10
|
const CONTEXT_LINES = 10
|
|
11
11
|
const TEST_FILE_MAX_LINES = 2000
|
|
12
12
|
|
|
13
|
+
/** Системний промпт класифікатора survived-мутантів (5 verdict-категорій). */
|
|
13
14
|
export const SYSTEM_PROMPT = `You are a mutation testing classifier.
|
|
14
15
|
|
|
15
16
|
For each survived Stryker mutant, classify it into exactly one verdict:
|
|
@@ -16,6 +16,7 @@ import { z } from 'zod'
|
|
|
16
16
|
const REASON_SOFT_MAX = 500
|
|
17
17
|
const SUGGESTED_TEST_SOFT_MAX = 300
|
|
18
18
|
|
|
19
|
+
/** Zod-схема verdict-обʼєкта класифікатора (verdict/confidence/reason/suggestedTest). */
|
|
19
20
|
export const VerdictSchema = z.object({
|
|
20
21
|
verdict: z.enum(['worth-testing', 'equivalent', 'defensive', 'glue', 'wrapper']),
|
|
21
22
|
confidence: z.number().min(0).max(1),
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Мовно-агностичний парсинг lcov (спільна lib концерну coverage): агреговані
|
|
3
|
+
* totals (рядки/функції) і per-file розбивка. Живе в core — провайдери всіх
|
|
4
|
+
* мов (vitest lcov, cargo llvm-cov) імпортують звідси, без дублювання парсера
|
|
5
|
+
* у плагінах. SF-шляхи рібейзяться відносно кореня на боці викликача.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Агрегує LF/LH/FNF/FNH по всіх записах lcov.
|
|
10
|
+
* @param {string} text вміст lcov-файлу
|
|
11
|
+
* @returns {{lines:{covered:number,total:number}, functions:{covered:number,total:number}}} totals
|
|
12
|
+
*/
|
|
13
|
+
export function parseLcovTotals(text) {
|
|
14
|
+
const acc = { lines: { covered: 0, total: 0 }, functions: { covered: 0, total: 0 } }
|
|
15
|
+
for (const line of text.split('\n')) {
|
|
16
|
+
if (line.startsWith('LF:')) acc.lines.total += Number(line.slice(3))
|
|
17
|
+
else if (line.startsWith('LH:')) acc.lines.covered += Number(line.slice(3))
|
|
18
|
+
else if (line.startsWith('FNF:')) acc.functions.total += Number(line.slice(4))
|
|
19
|
+
else if (line.startsWith('FNH:')) acc.functions.covered += Number(line.slice(4))
|
|
20
|
+
}
|
|
21
|
+
return acc
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Per-file рядкове покриття з lcov (`SF:`/`LF:`/`LH:`; шляхи — як у файлі).
|
|
26
|
+
* @param {string} text вміст lcov-файлу
|
|
27
|
+
* @returns {Array<{file: string, pct: number, linesFound: number, linesCovered: number}>} рядки по файлах
|
|
28
|
+
*/
|
|
29
|
+
export function parseLcovPerFile(text) {
|
|
30
|
+
const files = []
|
|
31
|
+
let currentFile = null
|
|
32
|
+
let lf = 0
|
|
33
|
+
let lh = 0
|
|
34
|
+
for (const line of text.split('\n')) {
|
|
35
|
+
if (line.startsWith('SF:')) {
|
|
36
|
+
currentFile = line.slice(3).trim()
|
|
37
|
+
lf = 0
|
|
38
|
+
lh = 0
|
|
39
|
+
} else if (line.startsWith('LF:')) {
|
|
40
|
+
lf = Number(line.slice(3))
|
|
41
|
+
} else if (line.startsWith('LH:')) {
|
|
42
|
+
lh = Number(line.slice(3))
|
|
43
|
+
} else if (line === 'end_of_record' && currentFile) {
|
|
44
|
+
files.push({
|
|
45
|
+
file: currentFile,
|
|
46
|
+
pct: lf === 0 ? 100 : Math.round((lh / lf) * 10000) / 100,
|
|
47
|
+
linesFound: lf,
|
|
48
|
+
linesCovered: lh
|
|
49
|
+
})
|
|
50
|
+
currentFile = null
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return files
|
|
54
|
+
}
|
|
@@ -3,24 +3,27 @@ type: JS Module
|
|
|
3
3
|
title: fix-oxfmtrc.mjs
|
|
4
4
|
resource: npm/rules/text/oxfmtrc/fix-oxfmtrc.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model: openai-codex/gpt-5.
|
|
8
|
-
tier: cloud-
|
|
6
|
+
crc: d2983472
|
|
7
|
+
model: openai-codex/gpt-5.5
|
|
8
|
+
tier: cloud-avg
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.98
|
|
11
10
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Огляд
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Файл визначає T0-fix-сценарій концерну text/oxfmtrc для `.oxfmtrc.json`, який приводить конфіг до канону правила через глибоке об’єднання з шаблоном. `patterns` існує, щоб додавати налаштування з канонічного шаблону й не втрачати наявні локальні ключі конфігу.
|
|
17
16
|
|
|
18
17
|
## Поведінка
|
|
19
18
|
|
|
20
|
-
1. `patterns`
|
|
21
|
-
2.
|
|
22
|
-
3.
|
|
19
|
+
1. `patterns` оголошує один fix-сценарій для приведення `.oxfmtrc.json` до канонічного стану правила.
|
|
20
|
+
2. Сценарій додає або оновлює значення з шаблону правила через глибоке об’єднання, щоб обов’язкові налаштування були присутні.
|
|
21
|
+
3. Наявні локальні ключі конфігу зберігаються, щоб проєктові відмінності не втрачалися під час автоматичного виправлення.
|
|
22
|
+
|
|
23
|
+
## Публічний API
|
|
24
|
+
|
|
25
|
+
- patterns — Fix-патерни концерну: один шаблонний deep-merge у `.oxfmtrc.json`.
|
|
23
26
|
|
|
24
27
|
## Гарантії поведінки
|
|
25
28
|
|
|
26
|
-
-
|
|
29
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -3,25 +3,29 @@ type: JS Module
|
|
|
3
3
|
title: fix-vscode_settings.mjs
|
|
4
4
|
resource: npm/rules/text/vscode_settings/fix-vscode_settings.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model: openai-codex/gpt-5.
|
|
8
|
-
tier: cloud-
|
|
6
|
+
crc: 7208a85f
|
|
7
|
+
model: openai-codex/gpt-5.5
|
|
8
|
+
tier: cloud-avg
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.93
|
|
11
10
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Огляд
|
|
15
14
|
|
|
16
|
-
Файл
|
|
15
|
+
Файл задає автоматичне виправлення для `.vscode/settings.json` у межах концерну `text/vscode_settings`. Він існує, щоб доводити workspace-налаштування до канону через `deep-merge` шаблону правила, зберігаючи локальні користувацькі значення.
|
|
17
16
|
|
|
18
17
|
## Поведінка
|
|
19
18
|
|
|
20
|
-
1. `patterns`
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
1. `patterns` оголошує єдиний fix-патерн для приведення `settings.json` до проєктного канону.
|
|
20
|
+
|
|
21
|
+
2. Патерн застосовує шаблон правила як deep-merge, щоб додати або оновити обов’язкові налаштування без перетирання локальних користувацьких значень.
|
|
22
|
+
|
|
23
|
+
3. Результат призначений для автоматичного виправлення відхилень у VS Code workspace-конфігурації в межах концерну `text/vscode_settings`.
|
|
24
|
+
|
|
25
|
+
## Публічний API
|
|
26
|
+
|
|
27
|
+
- patterns — Fix-патерни концерну: один шаблонний deep-merge у `.vscode/settings.json`.
|
|
24
28
|
|
|
25
29
|
## Гарантії поведінки
|
|
26
30
|
|
|
27
|
-
-
|
|
31
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -3,26 +3,31 @@ type: JS Module
|
|
|
3
3
|
title: fix-zed_settings.mjs
|
|
4
4
|
resource: npm/rules/worktree/zed_settings/fix-zed_settings.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 3cff4486
|
|
7
7
|
model: openai-codex/gpt-5.5
|
|
8
8
|
tier: cloud-avg
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.98
|
|
11
10
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Огляд
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Файл задає fix для `.zed/settings.json`, який приводить робочий конфіг Zed до командного канону через `deep-merge` шаблону правила. Він існує, щоб додавати або виправляти очікувані значення `settings.json`, не перезаписуючи локальні налаштування користувача поза конфліктами з канонічними вимогами.
|
|
16
|
+
|
|
17
|
+
`patterns` є єдиною публічною точкою для оголошення цього правила.
|
|
17
18
|
|
|
18
19
|
## Поведінка
|
|
19
20
|
|
|
20
|
-
1. `patterns`
|
|
21
|
+
1. `patterns` оголошує fix-поведінку для приведення робочого конфіга Zed до командного канону.
|
|
22
|
+
|
|
23
|
+
2. Під час застосування fix оновлює `.zed/settings.json` на основі шаблону правила через злиття налаштувань, щоб додати або виправити очікувані значення з `settings.json`.
|
|
24
|
+
|
|
25
|
+
3. Наявні локальні налаштування користувача зберігаються, якщо вони не конфліктують із канонічними вимогами правила.
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
## Публічний API
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
- patterns — Fix-патерни концерну: один шаблонний deep-merge у `.zed/settings.json`.
|
|
25
30
|
|
|
26
31
|
## Гарантії поведінки
|
|
27
32
|
|
|
28
|
-
-
|
|
33
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -28,7 +28,9 @@ async function defaultConfirm(message) {
|
|
|
28
28
|
* Гарантує, що подальші кроки виконуються в ізольованому worktree
|
|
29
29
|
* (`main.json.worktree: true`-контракт), навіть коли викликач — детермінований
|
|
30
30
|
* JS-код, що не годує SKILL.md жодному LLM-агенту (тож агентський preflight-блок
|
|
31
|
-
* з `worktree-notice.mjs` нікому виконувати). Якщо `cwd` вже під `.worktrees/`
|
|
31
|
+
* з `worktree-notice.mjs` нікому виконувати). Якщо `cwd` вже під `.worktrees/`
|
|
32
|
+
* (репо-конвенція) або `.claude/worktrees/` (worktree харнесу Claude Code,
|
|
33
|
+
* куди `npx \@7n/mt worktree create` класти заборонено — `n-worktree.mdc`) —
|
|
32
34
|
* повертає його без змін. Інакше сам створює `.worktrees/<branch>-<suffix>`
|
|
33
35
|
* (`npx \@7n/mt worktree create`) і ставить залежності (`bun install`).
|
|
34
36
|
*
|
|
@@ -62,8 +64,12 @@ export async function ensureRunningInWorktree(
|
|
|
62
64
|
) {
|
|
63
65
|
const toplevelResult = spawnFn('git', ['rev-parse', '--show-toplevel'], { cwd, encoding: 'utf8' })
|
|
64
66
|
const toplevel = toplevelResult.status === 0 ? toplevelResult.stdout.trim() : ''
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
+
const pathSegments = toplevel.replaceAll('\\', '/').split('/')
|
|
68
|
+
const segments = new Set(pathSegments)
|
|
69
|
+
const isClaudeHarnessWorktree = pathSegments.some(
|
|
70
|
+
(seg, i) => seg === '.claude' && pathSegments[i + 1] === 'worktrees'
|
|
71
|
+
)
|
|
72
|
+
if (segments.has('.worktrees') || isClaudeHarnessWorktree) return { cwd, autoCreated: false, branchArg: null }
|
|
67
73
|
|
|
68
74
|
const branchResult = spawnFn('git', ['branch', '--show-current'], { cwd, encoding: 'utf8' })
|
|
69
75
|
const currentBranch = branchResult.status === 0 ? branchResult.stdout.trim() : ''
|
|
@@ -3,28 +3,66 @@ type: JS Module
|
|
|
3
3
|
title: auto-worktree.mjs
|
|
4
4
|
resource: npm/scripts/lib/auto-worktree.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
6
|
+
crc: 2a9e7bfd
|
|
7
|
+
model: omlx/gemma-4-e2b-it-4bit
|
|
8
|
+
tier: local-min-retry
|
|
9
|
+
score: 90
|
|
11
10
|
---
|
|
12
11
|
|
|
13
12
|
## Огляд
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
Функції забезпечують ізоляцію роботи з кодом у worktree, перенесення змін між робочими середовищами та керування життєвим циклом створеного worktree. ensureRunningInWorktree гарантує роботу в ізольованому середовищі, bringChangesBackToOriginal переносить модифікації з worktree назад до основного репозиторію, використовуючи механізм копіювання, а не git merge, removeAutoCreatedWorktree забезпечує прибирання, видаляючи сам worktree після завершення операції.
|
|
16
15
|
|
|
17
16
|
## Поведінка
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
- `bringChangesBackToOriginal` — переносить зміни з автоствореного worktree назад у вихідне дерево як untracked/незакомічені правки, включно з додаванням, оновленням і видаленням файлів; перейменування переносить лише в нову назву.
|
|
21
|
-
- `removeAutoCreatedWorktree` — прибирає автостворений worktree разом із його ефемерною гілкою після перенесення змін назад, а у разі збою лише повідомляє про ручне прибирання.
|
|
18
|
+
Поведінка: Функції взаємодіють для ізоляції роботи з кодом у worktree, перенесенні змін між робочими середовищами та керування життєвим циклом створюваного worktree. `ensureRunningInWorktree` гарантує роботу в ізольованому середовищі, тоді як `bringChangesBackToOriginal` переносить модифікації з worktree назад до основного репозиторію, використовуючи механізм копіювання, а не git merge. `removeAutoCreatedWorktree` забезпечує прибирання, видаляючи сам worktree, що виконується лише після завершення операції з `bringChangesBackToOriginal`.
|
|
22
19
|
|
|
23
20
|
## Публічний API
|
|
24
21
|
|
|
25
|
-
- ensureRunningInWorktree —
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
- ensureRunningInWorktree — Гарантує, що подальші кроки виконуються в ізольованому worktree
|
|
23
|
+
(`main.json.worktree: true`-контракт), навіть коли викликач — детермінований
|
|
24
|
+
JS-код, що не годує SKILL.md жодному LLM-агенту (тож агентський preflight-блок
|
|
25
|
+
з `worktree-notice.mjs` нікому виконувати). Якщо `cwd` вже під `.worktrees/`
|
|
26
|
+
(репо-конвенція) або `.claude/worktrees/` (worktree харнесу Claude Code,
|
|
27
|
+
куди `npx \@7n/mt worktree create` класти заборонено — `n-worktree.mdc`) —
|
|
28
|
+
повертає його без змін. Інакше сам створює `.worktrees/<branch>-<suffix>`
|
|
29
|
+
(`npx \@7n/mt worktree create`) і ставить залежності (`bun install`).
|
|
30
|
+
|
|
31
|
+
**Гейт на чисте дерево.** Auto-create читає стан і потім переносить зміни
|
|
32
|
+
назад копіюванням файлів (`bringChangesBackToOriginal`) — а не git merge.
|
|
33
|
+
Якщо у вихідному `cwd` вже є незакомічені зміни, вони НЕ потраплять у щойно
|
|
34
|
+
створений worktree (той — checkout HEAD), і перенесення назад мовчки
|
|
35
|
+
затерло б їх версією з worktree. Тому за замовчуванням (`requireCleanTree:
|
|
36
|
+
true`) на брудному дереві auto-create питає в терміналі (`deps.confirm`,
|
|
37
|
+
дефолт — y/N через stdin; поза TTY одразу "ні") дозвіл закомить і
|
|
38
|
+
запушити зараз через `npx \@7n/n push` (сквош усього робочого дерева в один
|
|
39
|
+
коміт + push у origin — сама команда підтвердження не питає, тому питаємо
|
|
40
|
+
ми, ДО виклику). На "ні"/поза TTY — кидає, як і раніше. Викликач, що
|
|
41
|
+
гарантує чистоту дерева сам (наприклад taze — SKILL.md вимагає цього як
|
|
42
|
+
передумову ще ДО виклику), може передати `requireCleanTree: false`, щоб не
|
|
43
|
+
платити за зайву git-команду і не питати підтвердження.
|
|
44
|
+
- bringChangesBackToOriginal — Переносить зміни з автоствореного worktree назад у вихідне дерево як
|
|
45
|
+
**untracked/незакомічені** правки (просте копіювання файлів, без git
|
|
46
|
+
merge/cherry-pick). Джерело істини — `git status --porcelain` у worktree:
|
|
47
|
+
для кожного шляху копіює файл, якщо він існує (модифікація/додавання), або
|
|
48
|
+
видаляє його у вихідному дереві, якщо existsSync каже, що в worktree його
|
|
49
|
+
вже нема (видалення). Перейменування (`old -> new` у porcelain) переносять
|
|
50
|
+
лише нову назву — стара лишається як була, прийнятний компроміс для
|
|
51
|
+
інструментів, що самі файли не перейменовують (ефект можливий лише як
|
|
52
|
+
побічний результат LLM-рефакторингу чи форматера).
|
|
53
|
+
|
|
54
|
+
**Untracked-директорія цілком.** Git схлопує щойно створену untracked
|
|
55
|
+
директорію в один porcelain-рядок із `/` на кінці (якщо в ній нема жодного
|
|
56
|
+
файлу, вже відомого git) — `copyFile` на такий шлях впав би (`EISDIR`/`ENOENT`)
|
|
57
|
+
і обривав би цикл, гублячи все, що йшло по порядку ітерації ДАЛІ. Такий
|
|
58
|
+
рядок (суфікс `/` або реальний каталог на диску) копіюється рекурсивно
|
|
59
|
+
(`copyDirectoryRecursive`) — весь вміст, а не один `copyFile`.
|
|
60
|
+
- removeAutoCreatedWorktree — Прибирає автостворений worktree разом з його ефемерною git-гілкою
|
|
61
|
+
(`npx \@7n/mt worktree remove <branch>`) — викликати лише ПІСЛЯ
|
|
62
|
+
`bringChangesBackToOriginal`, інакше зміни згорять разом з деревом.
|
|
63
|
+
Не кидає при провалі — це прибирання, а не крок, від якого залежить
|
|
64
|
+
результат прогону; провал лише логується, worktree лишається для
|
|
65
|
+
ручного розбору.
|
|
28
66
|
|
|
29
67
|
## Гарантії поведінки
|
|
30
68
|
|
|
@@ -3,25 +3,80 @@ type: JS Module
|
|
|
3
3
|
title: worktree-notice.mjs
|
|
4
4
|
resource: npm/scripts/lib/worktree-notice.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model: omlx/gemma-4-
|
|
6
|
+
crc: 4feb8b6c
|
|
7
|
+
model: omlx/gemma-4-e2b-it-4bit
|
|
8
|
+
tier: local-min-retry
|
|
8
9
|
score: 100
|
|
9
10
|
---
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
## Огляд
|
|
13
|
+
|
|
14
|
+
Цей файл містить інструкції для вбудовування вказівки про використання worktree-гілки в синкнутий текст `SKILL.md`. Він забезпечує ідемпотентне заміщення або видалення цього блоку залежно від значення `main.json.worktree`, забезпечуючи зв'язок з інструкціями щодо роботи з окремими Git-репозиторіями та інструментами для управління залежностями та бінарними викликами.
|
|
15
|
+
|
|
16
|
+
## Behavior
|
|
17
|
+
Транслітерує кирилицю в ASCII для короткого suffix
|
|
18
|
+
@param {string} value вхідний текст
|
|
19
|
+
@returns {string} транслітерований текст
|
|
20
|
+
|
|
21
|
+
### deriveSuffix
|
|
22
|
+
Робить короткий безпечний suffix для worktree-гілки з назви скіла
|
|
23
|
+
@param {string} content вміст `SKILL.md`
|
|
24
|
+
@returns {string} suffix до 10 символів
|
|
25
|
+
викликає: transliterate
|
|
26
|
+
|
|
27
|
+
### buildNoticeBody
|
|
28
|
+
Тіло worktree-інструкції з конкретним суфіксом, щоб агент не питав назву гілки
|
|
29
|
+
@param {string} suffix короткий suffix задачі
|
|
30
|
+
@returns {string} markdown-блок без маркерів
|
|
31
|
+
|
|
32
|
+
### buildBlock
|
|
33
|
+
Канонічний блок worktree-інструкції
|
|
34
|
+
@param {string} content вміст `SKILL.md`
|
|
35
|
+
@returns {string} текст блоку від START до END
|
|
36
|
+
викликає: buildNoticeBody
|
|
37
|
+
|
|
38
|
+
### injectWorktreeNotice
|
|
39
|
+
Вставляє / оновлює / видаляє worktree-блок у вмісті `SKILL.md`
|
|
40
|
+
@param {string} content вміст `SKILL.md`
|
|
41
|
+
@param {boolean} enabled чи має бути блок значення `main.json.worktree`
|
|
42
|
+
@returns {string} оновлений вміст ідемпотентно
|
|
12
43
|
|
|
13
44
|
## Поведінка
|
|
14
45
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
46
|
+
Транслітерує кирилицю в ASCII для короткого suffix
|
|
47
|
+
@param {string} value вхідний текст
|
|
48
|
+
@returns {string} транслітерований текст
|
|
49
|
+
|
|
50
|
+
### deriveSuffix
|
|
51
|
+
Робить короткий безпечний suffix для worktree-гілки з назви скіла
|
|
52
|
+
@param {string} content вміст `SKILL.md`
|
|
53
|
+
@returns {string} suffix до 10 символів
|
|
54
|
+
викликає: transliterate
|
|
55
|
+
|
|
56
|
+
### buildNoticeBody
|
|
57
|
+
Тіло worktree-інструкції з конкретним суфіксом, щоб агент не питав назву гілки
|
|
58
|
+
@param {string} suffix короткий suffix задачі
|
|
59
|
+
@returns {string} markdown-блок без маркерів
|
|
60
|
+
|
|
61
|
+
### buildBlock
|
|
62
|
+
Канонічний блок worktree-інструкції
|
|
63
|
+
@param {string} content вміст `SKILL.md`
|
|
64
|
+
@returns {string} текст блоку від START до END
|
|
65
|
+
викликає: buildNoticeBody, deriveSuffix
|
|
66
|
+
|
|
67
|
+
### injectWorktreeNotice
|
|
68
|
+
Вставляє / оновлює / видаляє worktree-блок у вмісті `SKILL.md`
|
|
69
|
+
@param {string} content вміст `SKILL.md`
|
|
70
|
+
@param {boolean} enabled чи має бути блок значення `main.json.worktree`
|
|
71
|
+
@returns {string} оновлений вміст ідемпотентно
|
|
72
|
+
викликає: buildBlock
|
|
18
73
|
|
|
19
74
|
## Публічний API
|
|
20
75
|
|
|
21
|
-
WORKTREE_START —
|
|
22
|
-
WORKTREE_END —
|
|
23
|
-
injectWorktreeNotice —
|
|
76
|
+
- WORKTREE_START — Маркер початку worktree-блоку (стабільний, не залежить від тексту всередині).
|
|
77
|
+
- WORKTREE_END — Маркер кінця worktree-блоку.
|
|
78
|
+
- injectWorktreeNotice — Вставляє / оновлює / видаляє worktree-блок у вмісті `SKILL.md`.
|
|
24
79
|
|
|
25
80
|
## Гарантії поведінки
|
|
26
81
|
|
|
27
|
-
-
|
|
82
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
@@ -133,7 +133,9 @@ git branch --show-current
|
|
|
133
133
|
|
|
134
134
|
**Root-assert.** Якщо \`pwd\` **не** збігається з виводом \`git rev-parse --show-toplevel\` — ти в **піддиректорії** робочого дерева (worktree-шляхи нижче відносні до кореня репо). Спершу перейди в корінь: \`cd <toplevel>\` (literal-шлях із виводу), і лише тоді продовжуй preflight. Не створюй worktree з піддиректорії — \`cd .worktrees/<…>\` звідти впаде.
|
|
135
135
|
|
|
136
|
-
Якщо \`git rev-parse --show-toplevel\`
|
|
136
|
+
**Вже ізольований — нічого не створюй.** Якщо \`git rev-parse --show-toplevel\` містить сегмент \`.worktrees/<…>\` (репо-конвенція) **або** \`.claude/worktrees/<…>\` (worktree харнесу Claude Code — туди \`npx @7n/mt worktree create\` класти заборонено, \`n-worktree.mdc\`) — ти вже виконуєшся в окремому git-worktree. Preflight пройдено: нічого не створюй, нікого не питай про назву гілки — переходь одразу до Кроку 0.1.
|
|
137
|
+
|
|
138
|
+
Інакше, якщо toplevel не містить жодного з цих сегментів, візьми вивід \`git branch --show-current\` як \`<current-branch>\` і виконай **literal-команди без shell expansion** (без command substitution, variable expansion чи backticks). Наприклад, якщо поточна гілка \`feature/x\`:
|
|
137
139
|
|
|
138
140
|
\`\`\`bash
|
|
139
141
|
npx @7n/mt worktree create "feature/x-${suffix}" "n-${suffix}: worktree-only skill"
|
|
@@ -142,10 +144,10 @@ cd ".worktrees/feature-x-${suffix}"
|
|
|
142
144
|
|
|
143
145
|
Тобто branch-argument лишає slash як у git-гілці, а шлях для \`cd\` бере sanitized форму: slash → \`-\`.
|
|
144
146
|
|
|
145
|
-
**Крок 0.1 — bootstrap
|
|
147
|
+
**Крок 0.1 — bootstrap (якщо в дереві ще нема \`node_modules\`).** Свіжостворений worktree (Крок 0) точно без \`node_modules\`; вже ізольований harness-worktree може мати їх або ні — постав локально, тоді \`npx @7n/rules <cmd>\` бере локальну копію без походу в реєстр:
|
|
146
148
|
|
|
147
149
|
\`\`\`bash
|
|
148
|
-
bun install
|
|
150
|
+
test -d node_modules || bun install
|
|
149
151
|
\`\`\``
|
|
150
152
|
}
|
|
151
153
|
|
|
@@ -3,35 +3,51 @@ type: JS Module
|
|
|
3
3
|
title: migration-cache.mjs
|
|
4
4
|
resource: npm/skills/taze/js/migration-cache.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model: openai-codex/gpt-5.
|
|
8
|
-
tier: cloud-
|
|
6
|
+
crc: c9ebf692
|
|
7
|
+
model: openai-codex/gpt-5.5
|
|
8
|
+
tier: cloud-avg
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.98
|
|
11
10
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Огляд
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Файл підтримує дисковий кеш нотаток про міграції пакетів між версіями для повторного використання між прогонами й репозиторіями, щоб повторне звернення до тих самих даних не виконувало зайву роботу. `DEFAULT_CACHE_DIR`, `migrationCacheKey`, `readMigrationCache`, `writeMigrationCache` і `withKnownMigrationNotes` задають спільні точки доступу до цього кешу.
|
|
16
|
+
|
|
17
|
+
Якщо кеш недоступний, запис непридатний або операція читання кешу не може бути виконана, обробка продовжується без винятків назовні й за потреби повертає порожнє значення замість збою.
|
|
17
18
|
|
|
18
19
|
## Поведінка
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
DEFAULT_CACHE_DIR задає спільне місце зберігання результатів аналізу міграцій для всіх репозиторіїв на машині. Кеш не прив’язаний до поточного проєкту, тому повторне оновлення того самого пакета між тими самими версіями може повторно використати вже підготовлені нотатки.
|
|
22
|
+
|
|
23
|
+
migrationCacheKey формує стабільний безпечний ключ для пари пакет-версії. Цей ключ використовують readMigrationCache і writeMigrationCache, щоб звертатися до одного й того самого запису незалежно від репозиторію чи worktree.
|
|
24
|
+
|
|
25
|
+
writeMigrationCache зберігає підсумок ізольованого LLM-аналізу міграції. Дані потрапляють у спільний кеш і стають доступними для наступних прогонів із тим самим ключем.
|
|
26
|
+
|
|
27
|
+
readMigrationCache на початку наступного прогону шукає готовий запис у спільному кеші. Якщо запис відсутній або непридатний для читання, кеш вважається недоступною оптимізацією й повертається порожній результат замість помилки; основний процес міграції має продовжитися без кешованих нотаток.
|
|
28
|
+
|
|
29
|
+
Коли readMigrationCache знаходить запис, withKnownMigrationNotes додає його підсумок до базового промпта. Результат спрямовує runner не повторювати вже виконане CHANGELOG/diff-дослідження, а одразу перевіряти використання API в поточному проєкті та застосовувати релевантні зміни.
|
|
25
30
|
|
|
26
31
|
## Публічний API
|
|
27
32
|
|
|
28
|
-
- DEFAULT_CACHE_DIR —
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
+
- DEFAULT_CACHE_DIR — Каталог за замовчуванням для кешу міграцій — спільний для всіх репо на цій
|
|
34
|
+
машині (не прив'язаний до конкретного worktree/репо), бо ключ кешу — сам
|
|
35
|
+
пакет+діапазон версій, а не проєкт.
|
|
36
|
+
- migrationCacheKey — Санітизує `(pkg, from, to)` у безпечне імʼя файлу — крос-репо ключ кешу.
|
|
37
|
+
Той самий `(pkg, from, to)` у різних репо/воркспейсах дає той самий ключ.
|
|
38
|
+
- readMigrationCache — Читає кешований запис міграції для `(pkg, from, to)`, якщо інший
|
|
39
|
+
repo/worktree на цій машині вже проганяв через LLM ту саму пару версій.
|
|
40
|
+
Відсутній/побитий файл — `null` (мовчки, не провал прогону: кеш —
|
|
41
|
+
оптимізація, а не залежність, від якої залежить коректність).
|
|
42
|
+
- writeMigrationCache — Зберігає результат ізольованого LLM-виклику для `(pkg, from, to)` — щоб
|
|
43
|
+
наступний репо з тим самим bump-ом на цій машині не повторював
|
|
44
|
+
CHANGELOG-дослідження з нуля (див. `readMigrationCache`).
|
|
45
|
+
- withKnownMigrationNotes — Дописує до промпта `provider.promptFor(entry)` підсумок відомої міграції,
|
|
46
|
+
якщо кеш її знайшов — каже runner-у пропустити крок 1 (CHANGELOG/diff-
|
|
47
|
+
дослідження) і одразу шукати використання в поточному проєкті.
|
|
33
48
|
|
|
34
49
|
## Гарантії поведінки
|
|
35
50
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
51
|
+
- Перехоплює помилки операцій кешу, для яких кеш є необовʼязковою оптимізацією, і не пропускає їх назовні.
|
|
52
|
+
- За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
|
|
53
|
+
- Кешує результати на диску для повторного використання між прогонами й репозиторіями.
|