@7n/rules 1.43.1 → 1.44.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.
Files changed (71) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/docs/vitest.config.md +14 -19
  3. package/package.json +1 -1
  4. package/rules/abie/lib/docs/index.md +0 -2
  5. package/rules/abie/lib/http-route.mjs +1 -0
  6. package/rules/abie/lib/yaml.mjs +2 -0
  7. package/rules/ci4/marksman_config/docs/index.md +10 -0
  8. package/rules/ci4/marksman_config/main.mjs +2 -0
  9. package/rules/doc-files/docgen-prompts/docs/index.md +9 -0
  10. package/rules/doc-files/docgen-prompts/main.mjs +5 -0
  11. package/rules/hasura/internal_urls/docs/index.md +0 -2
  12. package/rules/hasura/internal_urls/docs/main.md +27 -15
  13. package/rules/hasura/internal_urls/main.mjs +1 -0
  14. package/rules/image-avif/avif_generation/docs/index.md +10 -0
  15. package/rules/image-avif/avif_generation/main.mjs +2 -0
  16. package/rules/rego/vscode_settings/docs/fix-vscode_settings.md +12 -10
  17. package/rules/rego/vscode_settings/fix-vscode_settings.mjs +5 -0
  18. package/rules/tauri/cargo_mutants_config/docs/index.md +0 -2
  19. package/rules/tauri/cargo_mutants_config/docs/main.md +38 -12
  20. package/rules/tauri/cargo_mutants_config/main.mjs +5 -1
  21. package/rules/tauri/core_test_isolation/docs/main.md +19 -16
  22. package/rules/tauri/core_test_isolation/main.mjs +3 -1
  23. package/rules/tauri/linux_deps/docs/main.md +25 -18
  24. package/rules/tauri/linux_deps/main.mjs +2 -1
  25. package/rules/tauri/release/docs/main.md +20 -12
  26. package/rules/tauri/release/main.mjs +2 -0
  27. package/rules/tauri/updater/docs/main.md +31 -14
  28. package/rules/tauri/updater/main.mjs +4 -0
  29. package/rules/test/coverage/concern.json +9 -0
  30. package/rules/test/coverage/fix-worker.mjs +111 -0
  31. package/rules/test/coverage/lib/classify/apply.mjs +67 -0
  32. package/rules/test/coverage/lib/classify/cache.mjs +77 -0
  33. package/rules/test/coverage/lib/classify/docs/apply.md +28 -0
  34. package/rules/test/coverage/lib/classify/docs/cache.md +34 -0
  35. package/rules/test/coverage/lib/classify/docs/index.md +37 -0
  36. package/rules/test/coverage/lib/classify/docs/prompt.md +30 -0
  37. package/rules/test/coverage/lib/classify/docs/verdict-schema.md +30 -0
  38. package/rules/test/coverage/lib/classify/index.mjs +140 -0
  39. package/rules/test/coverage/lib/classify/prompt.mjs +136 -0
  40. package/rules/test/coverage/lib/classify/verdict-schema.mjs +163 -0
  41. package/rules/test/coverage/lib/llm.mjs +100 -0
  42. package/rules/test/coverage/main.mjs +161 -0
  43. package/rules/test/main.json +1 -0
  44. package/rules/test/main.mdc +140 -0
  45. package/rules/test/package_json/concern.json +11 -0
  46. package/rules/test/package_json/package_json.mdc +18 -0
  47. package/rules/test/package_json/package_json.rego +25 -0
  48. package/rules/test/package_json/template/package.json.contains.json +6 -0
  49. package/rules/text/oxfmtrc/fix-oxfmtrc.mjs +5 -0
  50. package/rules/text/vscode_settings/fix-vscode_settings.mjs +5 -0
  51. package/rules/worktree/vscode_settings/docs/fix-vscode_settings.md +10 -7
  52. package/rules/worktree/vscode_settings/fix-vscode_settings.mjs +5 -0
  53. package/rules/worktree/zed_settings/fix-zed_settings.mjs +5 -0
  54. package/schemas/n-rules.json +18 -1
  55. package/scripts/lib/adr/docs/index.md +0 -2
  56. package/scripts/lib/adr/docs/normalize-pipeline.md +44 -28
  57. package/scripts/lib/adr/normalize-pipeline.mjs +11 -0
  58. package/scripts/lib/docs/inline-template-links.md +17 -8
  59. package/scripts/lib/docs/plugin-api.md +1 -1
  60. package/scripts/lib/inline-template-links.mjs +5 -0
  61. package/scripts/lib/lint-surface/docs/run-detectors.md +25 -22
  62. package/scripts/lib/lint-surface/docs/tier-sampling-experiment.md +30 -14
  63. package/scripts/lib/lint-surface/run-detectors.mjs +1 -1
  64. package/scripts/lib/lint-surface/tier-sampling-experiment.mjs +1 -0
  65. package/scripts/lib/plugin-api.mjs +46 -0
  66. package/scripts/utils/docs/walkDir.md +26 -15
  67. package/scripts/utils/docs/worktree-fingerprint.md +16 -15
  68. package/scripts/utils/walkDir.mjs +9 -5
  69. package/scripts/utils/worktree-fingerprint.mjs +5 -0
  70. package/skills/storybook/SKILL.md +4 -4
  71. package/skills/taze/js/migration-cache.mjs +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.44.0] - 2026-07-22
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
+
3
18
  ## [1.43.1] - 2026-07-22
4
19
 
5
20
  ### Fixed
@@ -3,34 +3,29 @@ type: JS Module
3
3
  title: vitest.config.js
4
4
  resource: npm/vitest.config.js
5
5
  docgen:
6
- crc: 2c54e477
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
6
+ crc: 4c85652a
7
+ model: openai-codex/gpt-5.4-mini
8
+ tier: cloud-min
8
9
  score: 100
9
- issues: judge:inaccurate:0.99
10
10
  judgeModel: openai-codex/gpt-5.4-mini
11
11
  ---
12
12
 
13
13
  ## Огляд
14
14
 
15
- Файл відповідає за налаштування середовища для виконання тестів. Він ідентифікує та обробляє файли з розширенням .test.{js,mjs} у корені та у піддиректоріях tests/. Для забезпечення ізоляції тестів використовується механізм фокусування процесів ('forks'). У процесі виконання збирається покриття коду у форматах lcov та text-summary. Середовище налаштовано так, щоб ігнорувати такі шляхи як .git та node_modules.
15
+ Файл задає кореневе vitest-середовище для `@7n/rules`, щоб тестове оточення було ізольоване від локальної машини й службових trace-джерел. Він ігнорує `node_modules`, а також sandbox-копії Stryker і git-worktree чекаутів, щоб прогін тестів не захоплював зайві дерева проєкту. Також він відсікає вплив git trace2 і LLM-трейсу під час запусків, де це може спотворити результати.
16
16
 
17
17
  ## Поведінка
18
18
 
19
- Поведінка:
20
-
21
- 1. Визначає обсяг тестів, що підлягають валідації, охоплюючи файли з розширенням .test.{js,mjs} як у кореневій директорії, так і у піддиректоріях tests/.
22
- 2. Ігнорує каталоги node_modules та dist при виконанні тестів.
23
- 3. Виключає каталоги, що містять звіти Stryker, для запобігання фейлам, спричинених запуском поза кореневим репозиторієм.
24
- 4. Налаштовує середовище виконання тестів на 'node'.
25
- 5. Примусово вимикає переслідування подій Git через встановлення змінної середовища GIT_TRACE2_EVENT в значення '0', щоб запобігти блокуванням I/O під час паралельних Git-операцій.
26
- 6. Відводить глобальний LLM wire-trace у тимчасовий файл через змінну середовища N_LLM_TRACE_PATH: тести fix-pipeline ганяють реальний startChain/writeTrace з @7n/llm-lib/trace, і без override кожен прогін дописував би фейкові chain-записи у справжній ~/.n-rules/llm-trace.jsonl, засмічуючи аналітику myllm і chains-report. Тест із власним trace-файлом перевизначає змінну локально.
27
- 7. Встановлює максимальний час виконання тесту (testTimeout) у 20000 мілісекунд для забезпечення запасу часу при виконанні складних тестів, залежних від I/O.
28
- 7. Використовує pool 'forks' для ізоляції процесів між тестовими файлами, як додатковий механізм безпеки.
29
- 8. Збирає покриття коду за допомогою провайдера v8 та виводить звіти у форматах lcov та text-summary.
19
+ 1. Вмикає тестове середовище для кореня пакета `@7n/rules`, щоб локальні налаштування машини не впливали на результат прогону.
20
+ 2. Підхоплює тести з двох основних розкладок: поруч із кодом і в top-level `tests/`.
21
+ 3. Ігнорує службові копії та дублікати тестового дерева, зокрема `node_modules`, `dist`, `reports/stryker`, `.worktrees` і `.claude/worktrees`, щоб не запускати ті самі сценарії повторно й не підхоплювати sandbox-чекаути.
22
+ 4. Вимикає git Trace2 для тестових процесів, щоб локальний AI/git-трейс не створював затримки й таймаути під час git-важких перевірок.
23
+ 5. Перенаправляє LLM wire-trace у тимчасову директорію, щоб тестові прогони не засмічували робочий trace-файл користувача.
24
+ 6. Дає тестам запас часу на повільніші git-операції та локальну I/O-латентність, не маскуючи справжні зависання.
25
+ 7. Запускає тести в окремих процесах, щоб ізоляція між файлами зберігалася навіть у разі випадкового спільного стану.
26
+ 8. Збирає coverage у форматах `lcov` і `text-summary` для подальшого аналізу результатів.
30
27
 
31
28
  ## Гарантії поведінки
32
29
 
33
- - Read-only: не виконує операцій запису (ФС/БД).
34
- - Свідомо пропускає шляхи: `.git`, `node_modules`.
35
-
36
- Виключаються також git-worktree чекаути (`.worktrees/**`, `.claude/worktrees/**`) — повні копії репо, чиї тести дублюють основні.
30
+ - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
31
+ - Свідомо пропускає шляхи: `node_modules`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.43.1",
3
+ "version": "1.44.0",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",
@@ -4,8 +4,6 @@ title: npm/rules/abie/lib
4
4
  resource: npm/rules/abie/lib/
5
5
  ---
6
6
 
7
- # npm/rules/abie/lib
8
-
9
7
  | Файл | Тип |
10
8
  | ----------------------------------------------------- | --------- |
11
9
  | [enabled.mjs](enabled.md) | JS Module |
@@ -9,6 +9,7 @@ import { relative } from 'node:path'
9
9
  import { isK8sYamlInAbiePackageExcludingUaOverlay } from './overlay-paths.mjs'
10
10
  import { readAndParseYamlDocs, silentFail } from './yaml.mjs'
11
11
 
12
+ /** Імена спільних headless-сервісів, на які HTTPRoute-и пакетів посилаються крізь namespace. */
12
13
  export const ABIE_SHARED_CROSS_NS_BACKEND_NAMES = Object.freeze(['auth-run-hl', 'file-link-hl'])
13
14
  const ABIE_SHARED_CROSS_NS_BACKEND_SET = new Set(ABIE_SHARED_CROSS_NS_BACKEND_NAMES)
14
15
 
@@ -6,7 +6,9 @@ import { readFile } from 'node:fs/promises'
6
6
 
7
7
  import { parseAllDocuments } from 'yaml'
8
8
 
9
+ /** Розпізнає modeline `yaml-language-server` з `$schema=` у першому рядку файлу; захоплює URL схеми. */
9
10
  export const MODELINE_RE = /^#\s*yaml-language-server:\s*\$schema=(\S+)\s*$/
11
+ /** Поділ вмісту на рядки незалежно від стилю переносу (LF чи CRLF). */
10
12
  export const LINE_SPLIT_RE = /\r?\n/u
11
13
 
12
14
  /**
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/ci4/marksman_config
4
+ resource: npm/rules/ci4/marksman_config/
5
+ ---
6
+
7
+ | Файл | Тип |
8
+ | ------------------------------------------------- | --------- |
9
+ | [fix-marksman_config.mjs](fix-marksman_config.md) | JS Module |
10
+ | [main.mjs](main.md) | JS Module |
@@ -6,7 +6,9 @@ import { fileURLToPath } from 'node:url'
6
6
  import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
7
7
 
8
8
  const HERE = dirname(fileURLToPath(import.meta.url))
9
+ /** Абсолютний шлях до канонічного baseline-конфігу marksman, що постачається разом із пакетом правил. */
9
10
  export const MARKSMAN_BASELINE_PATH = join(HERE, 'data', 'marksman_config', 'marksman.baseline.toml')
11
+ /** Імʼя конфіг-файлу marksman, який має лежати в корені репозиторію. */
10
12
  export const MARKSMAN_TARGET_FILENAME = '.marksman.toml'
11
13
 
12
14
  /**
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/doc-files/docgen-prompts
4
+ resource: npm/rules/doc-files/docgen-prompts/
5
+ ---
6
+
7
+ | Файл | Тип |
8
+ | ------------------- | --------- |
9
+ | [main.mjs](main.md) | JS Module |
@@ -4,6 +4,11 @@ import { env } from 'node:process'
4
4
 
5
5
  import { anchorsToPrompt } from '../docgen-extract-anchors/main.mjs'
6
6
 
7
+ /**
8
+ * Спільний system-стиль для всіх docgen-промптів: вимагає лаконічну поведінкову
9
+ * українську документацію, забороняє сигнатури/типи й мета-фрази перед відповіддю
10
+ * (профілактика «озвучування завдання» малими моделями).
11
+ */
7
12
  export const STYLE = [
8
13
  'Ти технічний письменник. Пишеш лаконічну ПОВЕДІНКОВУ документацію до коду українською, чистим Markdown.',
9
14
  'Пиши ЩО і НАВІЩО, не ЯК. Без вступів і висновків. Не обгортай у ```-блок.',
@@ -4,8 +4,6 @@ title: npm/rules/hasura/internal_urls
4
4
  resource: npm/rules/hasura/internal_urls/
5
5
  ---
6
6
 
7
- # npm/rules/hasura/internal_urls
8
-
9
7
  | Файл | Тип |
10
8
  | --------------------------------------------- | --------- |
11
9
  | [fix-internal_urls.mjs](fix-internal_urls.md) | JS Module |
@@ -3,34 +3,46 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/hasura/internal_urls/main.mjs
5
5
  docgen:
6
- crc: 7b27e379
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
9
- issues: judge:inaccurate:0.98
6
+ crc: 7e348cf3
7
+ model: openai-codex/gpt-5.5
8
+ tier: cloud-avg
9
+ score: 95
10
+ issues: anchor-miss:(hasura.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
- Файл перевіряє конфігураційні файли `.env` у репозиторіях, що належать до екосистем https://github.com/nitra/ або https://github.com/abinbevefes/. Код спирається на конфігурацію, визначену у package.json. Його функція валідувати відповідність конфігурацій, зокрема, через перевірку внутрішнього Hasura-ендпоінта (parseInternalHasuraEndpoint), щоб забезпечити коректну роботу системи. Звернення до мережі здійснюється для збору необхідної інформації, але всі операції обробляються з механізмами fail-safe, не викидаючи винятків. Для певних помилок функція повертає порожнє значення (наприклад, null) замість винятку, що регулюється у повідомленнях у (hasura.mdc).
16
+ Файл обмежує правило lint лише nitra/abie репозиторіями й перевіряє, що `HASURA_GRAPHQL_ENDPOINT` в env-файлах вказує на очікуваний внутрішній Hasura endpoint. Він потрібен, щоб знаходити розсинхронізацію між env-конфігурацією та очікуваним endpoint-контрактом, свідомо не перевіряючи `base/` і нерелевантні репозиторії. Для перевірки файл звертається до мережі; помилки перехоплює fail-safe, не кидає винятків назовні і в окремих збійних сценаріях повертає `null` або інше порожнє значення замість винятку.
16
17
 
17
18
  ## Поведінка
18
19
 
19
- Поведінка
20
- parseInternalHasuraEndpoint розбирає рядок, щоб визначити внутрішній кластерний URL для Hasura, повертаючи сегменти або провалення, якщо формат некоректний.
21
- isEnvFile визначає, чи є заданий відносний шлях до файлу `.env`, що підлягає перевірці, виключаючи локальні файли розробника.
22
- isNitraOrAbieRepository перевіряє, чи вказує URL репозиторію на проєкти від https://github.com/nitra/ або https://github.com/abinbevefes/ (це стосується конфігів, як package.json).
23
- main виконує повну перевірку файлів `.env` у репозиторії, порівнюючи конфігурації з внутрішніми YAML-документами, якщо репозиторій належить до https://github.com/nitra/ або https://github.com/abinbevefes/, і повідомляє про порушення відповідно до (hasura.mdc).
20
+ `lint` запускає перевірку від кореня репозиторію: спершу читає `package.json`, визначає належність проєкту через `isNitraOrAbieRepository` до nitra/abie за `https://github.com/nitra/` і `https://github.com/abinbevefes/`, а для інших репозиторіїв не створює порушень.
21
+
22
+ Для релевантних проєктів `computeExpectedEndpointSegments` бере очікувані значення з Kubernetes YAML у `hasura/k8s/base`, після чого `lint` обходить дерево `.env`-файлів, свідомо пропускаючи `base/` та службово проігноровані шляхи. `isEnvFile` відсіює локальний `.env`, щоб правило не чіпало персональне середовище розробника.
23
+
24
+ У кожному відібраному env-файлі `HASURA_ENDPOINT_LINE_RE` знаходить рядок з `HASURA_GRAPHQL_ENDPOINT`, а `parseInternalHasuraEndpoint` приймає лише внутрішній HTTP endpoint кластера й повертає сегменти для порівняння з очікуваними значеннями. Якщо змінної немає, файл вважається коректним.
25
+
26
+ Результати сходяться назад у `lint`: успішні перевірки не впливають на звіт, а невідповідності перетворюються на violations із маркером ``. Помилки читання або некоректні допоміжні дані обробляються fail-safe: перевірка не кидає винятки назовні й за потреби працює з порожніми значеннями замість аварійного завершення.
24
27
 
25
28
  ## Публічний API
26
29
 
27
- - parseInternalHasuraEndpointВизначає, чи відповідний рядок формі внутрішнього URL для кластера: дозволяє лише `http://` та домен `*.internal` (наприклад, `abie-ua.internal`), повертаючи розбиті сегменти чи помилку.
28
- - isEnvFileВизначає, чи вказаний шлях до файлу відповідає імені `.env`, що є винятком з правил `hasura.mdc`.
29
- - isNitraOrAbieRepository Визначає, чи вказаний URL репозиторію належить до проектів nitra чи abie, згідно з маркерами `hasura.mdc`.
30
- - main Аналізує файл `hasura.mdc` для поточної директорії.
30
+ - HASURA_ENDPOINT_LINE_REЗнаходить рядок присвоєння `HASURA_GRAPHQL_ENDPOINT` у env-файлі; захоплює значення URL без лапок і коментаря.
31
+ - parseInternalHasuraEndpointРозбір значення `HASURA_GRAPHQL_ENDPOINT` як внутрішнього кластерного URL.
32
+ Дозволяє лише `http://` (TLS усередині кластера зайвий) та DNS-суфікс
33
+ `<cluster>.internal` (GKE/GCP). Поле `cluster` містить ім'я кластера без
34
+ `.internal` (наприклад `abie-ua`).
35
+ - isEnvFile — Чи відносний шлях вказує на `*.env`, який треба перевіряти hasura.mdc.
36
+ Файл рівно `.env` (без імені) — виключення з правила (локальний файл
37
+ розробника, hasura.mdc його не зачіпає), тому повертає false.
38
+ - isNitraOrAbieRepository — Чи URL репозиторію вказує на nitra або abie (за маркерами hasura.mdc).
39
+ - computeExpectedEndpointSegments — Обчислює очікувані `service`/`namespace` з `hasura/k8s/base/{svc-hl,namespace}.yaml`.
40
+ Використовується і детектором, і T0-фіксом (щоб не дублювати YAML-читання).
41
+ - lint — Перевіряє hasura.mdc для поточного робочого каталогу.
31
42
 
32
43
  ## Гарантії поведінки
33
44
 
34
- - Read-only: не виконує операцій запису (ФС/БД).
45
+ - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
35
46
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
36
47
  - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
48
+ - Свідомо пропускає шляхи: `base/`.
@@ -18,6 +18,7 @@ const HASURA_SVC_HL_FILE = `${HASURA_BASE_DIR}/svc-hl.yaml`
18
18
  const HASURA_NAMESPACE_FILE = `${HASURA_BASE_DIR}/namespace.yaml`
19
19
 
20
20
  const ENV_FILE_RE = /\.env$/u
21
+ /** Знаходить рядок присвоєння `HASURA_GRAPHQL_ENDPOINT` у env-файлі; захоплює значення URL без лапок і коментаря. */
21
22
  export const HASURA_ENDPOINT_LINE_RE =
22
23
  /^[ \t]*(?:export[ \t]+)?HASURA_GRAPHQL_ENDPOINT[ \t]*=[ \t]*['"]?([^'"\r\n#]+)/mu
23
24
  // Дозволяємо лише DNS-суфікс кластера `<name>.internal` (GKE/GCP).
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/image-avif/avif_generation
4
+ resource: npm/rules/image-avif/avif_generation/
5
+ ---
6
+
7
+ | Файл | Тип |
8
+ | ------------------------------------------------- | --------- |
9
+ | [fix-avif_generation.mjs](fix-avif_generation.md) | JS Module |
10
+ | [main.mjs](main.md) | JS Module |
@@ -19,7 +19,9 @@ import { getMonorepoPackageRootDirs } from '../../../scripts/lib/workspaces.mjs'
19
19
 
20
20
  /** Стабільні reasons. */
21
21
  export const AVIF_NEEDS_REWRITE = 'avif-needs-rewrite'
22
+ /** Стабільний reason: для растрового зображення відсутній згенерований AVIF-двійник. */
22
23
  export const AVIF_MISSING = 'avif-missing'
24
+ /** Стабільний reason: AVIF-файл лишився без растрового джерела — кандидат на cleanup. */
23
25
  export const AVIF_ORPHAN = 'avif-orphan'
24
26
 
25
27
  /** Імʼя CLI-пакета, який генерує AVIF (використовує T0-fix). */
@@ -3,25 +3,27 @@ type: JS Module
3
3
  title: fix-vscode_settings.mjs
4
4
  resource: npm/rules/rego/vscode_settings/fix-vscode_settings.mjs
5
5
  docgen:
6
- crc: ee88ec44
7
- model: openai-codex/gpt-5.4-mini
8
- tier: cloud-min
6
+ crc: 8007f6a6
7
+ model: openai-codex/gpt-5.5
8
+ tier: cloud-avg
9
9
  score: 100
10
- issues: judge:inaccurate:0.96
11
10
  judgeModel: openai-codex/gpt-5.4-mini
12
11
  ---
13
12
 
14
13
  ## Огляд
15
14
 
16
- Файл визначає `patterns` для приведення settings.json до узгодженого вигляду в проєкті, щоб налаштування редактора залишалися однаковими між середовищами. Він працює лише з цим конфігом, є read-only і не вносить змін у ФС чи БД; застосування результату лишається зовнішньому кроку.
15
+ `patterns` описує fix-правило для `.vscode/settings.json`, яке приводить файл до канону через deep-merge шаблону правила. Це потрібно, щоб застосувати налаштування канону й водночас не зачепити локальні налаштування користувача.
17
16
 
18
17
  ## Поведінка
19
18
 
20
- 1. `patterns` формує набір правил для приведення `.vscode/settings.json` до узгодженого шаблону `rego-vscode_settings-template`.
21
- 2. `patterns` працює лише з конфігурацією редактора, спираючись на `settings.json`, щоб підтримувати однакові налаштування в проєкті.
22
- 3. `patterns` не виконує записів у ФС чи БД; результатом є опис поведінки для застосування змін зовні.
23
- 4. `patterns` охоплює лише вказаний цільовий файл і не заявляє перевірку інших шляхів.
19
+ 1. `patterns` оголошує fix-поведінку для приведення `.vscode/settings.json` до проєктного канону.
20
+ 2. Правило додає або оновлює значення з шаблону, щоб середовище розробки мало узгоджені налаштування для всіх учасників.
21
+ 3. Локальні користувацькі налаштування зберігаються, щоб автоматичне виправлення не перезаписувало індивідуальні параметри, які не конфліктують із каноном.
22
+
23
+ ## Публічний API
24
+
25
+ - patterns — Fix-патерни концерну: один шаблонний deep-merge у `.vscode/settings.json`.
24
26
 
25
27
  ## Гарантії поведінки
26
28
 
27
- - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Файл експортує fix-патерни для `.vscode/settings.json` через шаблонний deep-merge.
@@ -1,5 +1,10 @@
1
+ /**
2
+ * T0-fix концерну rego/vscode_settings: доводить `.vscode/settings.json` до канону
3
+ * deep-merge-ом шаблону правила, не зачіпаючи локальні налаштування користувача.
4
+ */
1
5
  import { createTemplateFixPattern } from '../../../scripts/lib/fix/template-deep-merge.mjs'
2
6
 
7
+ /** Fix-патерни концерну: один шаблонний deep-merge у `.vscode/settings.json`. */
3
8
  export const patterns = [
4
9
  createTemplateFixPattern({ id: 'rego-vscode_settings-template', targetPath: '.vscode/settings.json' })
5
10
  ]
@@ -4,8 +4,6 @@ title: npm/rules/tauri/cargo_mutants_config
4
4
  resource: npm/rules/tauri/cargo_mutants_config/
5
5
  ---
6
6
 
7
- # npm/rules/tauri/cargo_mutants_config
8
-
9
7
  | Файл | Тип |
10
8
  | ----------------------------------------------------------- | --------- |
11
9
  | [fix-cargo_mutants_config.mjs](fix-cargo_mutants_config.md) | JS Module |
@@ -3,27 +3,53 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/tauri/cargo_mutants_config/main.mjs
5
5
  docgen:
6
- crc: ae1727a0
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
6
+ crc: d73828f8
7
+ model: openai-codex/gpt-5.4-mini
8
+ tier: cloud-min
9
+ score: 85
10
+ issues: internal-name:getMonorepoPackageRootDirs,anchor-miss:(tauri.mdc),judge-refine:kept-original,judge:inaccurate:0.99
9
11
  judgeModel: openai-codex/gpt-5.4-mini
10
12
  ---
11
13
 
12
14
  ## Огляд
13
15
 
14
- Ініціалізує процес через функцію `main`, а потім сканує робочу директорію для виявлення всіх каталогів з конфігурацією Tauri (`src-tauri/`). Для кожного знайденого каталогу перевіряє наявність файлу `.cargo/mutants.toml`, забезпечуючи його створення з канонічними налаштуваннями Tauri у разі відсутності. Якщо файл існує, він реєструє та додає відсутні канонічні ключі у конфігураційний файл, зберігаючи при цьому оригінальний вміст, і повідомляє про це через (tauri.mdc).
16
+ Read-only detector: лише звітує про відсутній або неповний `<ws>/src-tauri/.cargo/mutants.toml` і про відсутні канонічні Tauri-ключі. Для створення чи augment baseline використовується окремий T0-fix `fix-cargo_mutants_config.mjs`, а не detector. `lint --no-fix` ніколи не мутує дерево; спільні білдери baseline/append-блоку винесені для T0 через `buildAppended` і `buildBaseline`, а набір еталонних ключів задають `TAURI_CANONICAL_KEYS` і `TAURI_KEY_SNIPPETS`.
15
17
 
16
18
  ## Поведінка
17
19
 
18
- Поведінка:
20
+ findSrcTauriDirs відбирає лише ті workspace-корені, де є `src-tauri/Cargo.toml`, і саме ці каталоги стають входом для подальшої перевірки.
19
21
 
20
- 1. Викликає `main` для ініціалізації процесу.
21
- 2. Визначає всі каталоги, що містять конфігурацію Tauri (`src-tauri/`) у робочому просторі.
22
- 3. Для кожного знайденого каталогу перевіряє наявність файлу `.cargo/mutants.toml`.
23
- 4. Якщо файл відсутній, створює його, заповнюючи канонічними налаштуваннями Tauri. Повідомляє про створення файлу з маркером (tauri.mdc).
24
- 5. Якщо файл присутній, виявляє та реєструє відсутні канонічні ключі в конфігурації.
25
- 6. Якщо знайдені ключі відсутні, додає їх до існуючого файлу, зберігаючи原有 вміст. Повідомляє про додавання ключів з маркером (tauri.mdc).
26
- 7. Якщо ключі присутні, зберігає існуючу конфігурацію без змін.
22
+ lint проходить по знайдених `src-tauri/` каталогах, для кожного звіряє наявність `.cargo/mutants.toml` і зводить результат у read-only звіт без змін у дереві.
23
+
24
+ detectMissingKeys порівнює наявний TOML із TAURI_CANONICAL_KEYS і повертає тільки відсутні канонічні ключі; порядок ключів у відповіді зберігається як у TAURI_CANONICAL_KEYS.
25
+
26
+ MUTANTS_CONFIG_MISSING позначає повністю відсутній конфіг; MUTANTS_KEYS_MISSING наявний файл із неповним набором канонічних ключів.
27
+
28
+ TAURI_CANONICAL_KEYS визначає єдиний еталонний набір top-level ключів, а TAURI_KEY_SNIPPETS зберігає їхні канонічні текстові фрагменти; TAURI_BASELINE_HEADER задає верхівку повного baseline для нового файла.
29
+
30
+ buildBaseline збирає повний canonical `.cargo/mutants.toml` з TAURI_BASELINE_HEADER і всіма фрагментами з TAURI_KEY_SNIPPETS, а buildAppended додає тільки відсутні ключі до вже існуючого вмісту, не чіпаючи решту файла.
31
+
32
+ У звітах і підказках для виправлення використовується маркер ``, щоб пов’язати проблему з canonical Tauri-поведінкою та окремим T0-fix для baseline/augment.
33
+
34
+ ## Публічний API
35
+
36
+ - MUTANTS_CONFIG_MISSING — Стабільний reason: файл mutants-конфігу відсутній узагалі.
37
+ - MUTANTS_KEYS_MISSING — Стабільний reason: mutants-конфіг є, але бракує канонічних Tauri-ключів.
38
+ - TAURI_BASELINE_HEADER — Шапка-коментар канонічного mutants-конфігу Tauri: пояснює, навіщо виключені збірки бінарника й doc-тестів.
39
+ - TAURI_KEY_SNIPPETS — Канонічні TOML-фрагменти по ключах mutants-конфігу — T0-fix дописує відсутній ключ саме цим текстом.
40
+ - TAURI_CANONICAL_KEYS — Перелік канонічних ключів, наявність яких перевіряється у mutants-конфігу Tauri-застосунку.
41
+ - findSrcTauriDirs — Знаходить усі `<ws>/src-tauri/` каталоги з власним `Cargo.toml` у монорепо.
42
+ Обходить workspace-пакети через `getMonorepoPackageRootDirs` (корінь + усі workspaces).
43
+ - detectMissingKeys — Зчитує існуючий `.cargo/mutants.toml` і повертає top-level ключі, яких ще немає.
44
+ - buildAppended — Будує append-блок з відсутніх ключів. Існуючий вміст не торкається.
45
+ - buildBaseline — Будує повний Tauri-canonical baseline (для випадку, коли файла ще немає).
46
+ - lint — запускає перевірку `mutants` для вказаного шляху, збирає результат у форматі, придатному для CI, і повертає помилку, якщо конфігурація або список ключів для перевірки відсутні.
47
+
48
+ `MUTANTS_CONFIG_MISSING="mutants-config-missing"` — означає, що для запуску не знайдено потрібний конфіг `mutants`.
49
+
50
+ `MUTANTS_KEYS_MISSING="mutants-keys-missing"` — означає, що не задано ключі, за якими треба виконати перевірку.
51
+
52
+ Поведінка враховує маркери повідомлень `tauri.mdc`: якщо вони присутні, результат прив’язується до них для подальшого показу в UI.
27
53
 
28
54
  ## Гарантії поведінки
29
55
 
@@ -16,15 +16,18 @@ import { parse as parseToml } from 'smol-toml'
16
16
  import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
17
17
  import { getMonorepoPackageRootDirs } from '../../../scripts/lib/workspaces.mjs'
18
18
 
19
- /** Стабільні reasons: файл відсутній / у файлі бракує канонічних Tauri-ключів. */
19
+ /** Стабільний reason: файл mutants-конфігу відсутній узагалі. */
20
20
  export const MUTANTS_CONFIG_MISSING = 'mutants-config-missing'
21
+ /** Стабільний reason: mutants-конфіг є, але бракує канонічних Tauri-ключів. */
21
22
  export const MUTANTS_KEYS_MISSING = 'mutants-keys-missing'
22
23
 
24
+ /** Шапка-коментар канонічного mutants-конфігу Tauri: пояснює, навіщо виключені збірки бінарника й doc-тестів. */
23
25
  export const TAURI_BASELINE_HEADER = `# .cargo/mutants.toml — Tauri canonical cargo-mutants config (tauri.mdc).
24
26
  # Виключаємо --bins і --doc щоб бінарник Tauri та doc-tests не збиралися повторно
25
27
  # з нуля під кожного мутанта (секунди → хвилини).
26
28
  `
27
29
 
30
+ /** Канонічні TOML-фрагменти по ключах mutants-конфігу — T0-fix дописує відсутній ключ саме цим текстом. */
28
31
  export const TAURI_KEY_SNIPPETS = Object.freeze({
29
32
  additional_cargo_test_args: 'additional_cargo_test_args = ["--lib", "--tests"]\n',
30
33
  exclude_globs: `# Platform bridge / app shell — boundary-файли (тестуються smoke/e2e, не mutation unit).
@@ -46,6 +49,7 @@ exclude_globs = [
46
49
  `
47
50
  })
48
51
 
52
+ /** Перелік канонічних ключів, наявність яких перевіряється у mutants-конфігу Tauri-застосунку. */
49
53
  export const TAURI_CANONICAL_KEYS = Object.freeze(Object.keys(TAURI_KEY_SNIPPETS))
50
54
 
51
55
  /**
@@ -3,34 +3,37 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/tauri/core_test_isolation/main.mjs
5
5
  docgen:
6
- crc: 2fe501fb
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
9
- issues: best-of-2:retry-won,judge:inaccurate:0.98
6
+ crc: 9d56f463
7
+ model: openai-codex/gpt-5.5
8
+ tier: cloud-avg
9
+ score: 95
10
+ issues: anchor-miss:(core_test_isolation.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
- Файл сканує Tauri-проєкти у монорепо, виявляючи порушення ізоляції тестування, пов'язані з LLM-залежностями (позначається константою LLM_DEP_IN_APP_SHELL="llm-dep-in-app-shell") та залежностями від Tauri (позначається константою CORE_CRATE_DEPENDS_ON_TAURI="core-crate-depends-on-tauri"). Мета ідентифікувати структурні проблеми, що ускладнюють швидкий запуск тестів окремих компонентів без повної збірки застосунку, про що свідчить маркер (core_test_isolation.mdc).
16
+ Read-only lint `core_test_isolation.mdc` для Tauri-монорепо виявляє, чи LLM agent/provider-логіка винесена з `src-tauri` в окремий workspace-крейт без залежності на `tauri`. Файл існує, щоб через `lint` репортувати архітектурні порушення `LLM_DEP_IN_APP_SHELL`, `CORE_CRATE_DEPENDS_ON_TAURI` і `MISSING_FAKE_LLM_PROVIDER`, які заважають ізольовано запускати `cargo test -p <crate>` без повної збірки застосунку, і не намагається виправляти їх автоматично.
16
17
 
17
18
  ## Поведінка
18
19
 
19
- LLM_DEP_IN_APP_SHELL Позначає виявлення LLM-залежності всередині основного shell-крейту Tauri, що ускладнює швидкий запуск тестів окремих компонентів.
20
- CORE_CRATE_DEPENDS_ON_TAURI — Позначає виявлення залежності LLM-крейта від Tauri, що змушує проводити повну збірку застосунку при тестуванні.
21
- MISSING_FAKE_LLM_PROVIDER Позначає відсутність фальшивої (mock) реалізації LLM-провайдера у тестуваному крейті, що створює ризик неконтрольованого виконання LLM-логіки.
22
- lint — Сканує Tauri-проєкти у монорепо для виявлення порушень ізоляції тестування, пов'язаних з залежностями LLM та Tauri, звітуючи про проблеми у форматі (core_test_isolation.mdc).
20
+ `lint` read-only проходить Tauri-проєкти в монорепо, знаходить каталоги `src-tauri/` з власним Cargo-маніфестом і перевіряє межу між app-shell та core agent/provider-логікою для LLM. Дані беруться з файлової структури й Cargo-маніфестів, а результатом є lint-звіт без змін у файлах.
21
+
22
+ Перевірка спочатку визначає залежності app-shell крейту: якщо LLM-залежність підключена напряму в `src-tauri`, репортується `LLM_DEP_IN_APP_SHELL="llm-dep-in-app-shell"` — ознака того, що LLM-логіка не винесена з Tauri-шару. Далі для окремого workspace-крейту з LLM-залежністю перевіряється, що він не залежить від `tauri`; порушення позначається як `CORE_CRATE_DEPENDS_ON_TAURI="core-crate-depends-on-tauri"`, бо такий зв’язок ускладнює ізольований `cargo test` без повної збірки застосунку. Окремо очікується fake/mock/stub LLM-провайдер для тестів; його відсутність репортується як `MISSING_FAKE_LLM_PROVIDER="missing-fake-llm-provider"`.
23
+
24
+ Повідомлення прив’язані до правила ``. Перевірка не виконує автофікс, бо безпечно винести крейт, перенести код і налаштувати тестову підміну неможливо механічно без ризику зламати архітектуру.
23
25
 
24
26
  ## Публічний API
25
27
 
26
- * LLM_DEP_IN_APP_SHELL — Надає чіткі причини, чому виникли три класичних порушень, пов'язаних з LLM.
27
- * CORE_CRATE_DEPENDS_ON_TAURI — Фіксує, що основний компонент залежить від Tauri.
28
- * MISSING_FAKE_LLM_PROVIDER — Позначає відсутність замінника для моделі штучного інтелекту.
29
- * lint — Виявляє та виправляє порушення, визначені в системному лінтері.
28
+ - LLM_DEP_IN_APP_SHELL — Стабільний reason: LLM-залежність оголошена в app shell замість core-крейта.
29
+ - CORE_CRATE_DEPENDS_ON_TAURI — Стабільний reason: core-крейт залежить від Tauri — ламає ізоляцію unit-тестів від runtime.
30
+ - MISSING_FAKE_LLM_PROVIDER — Стабільний reason: у тестах core-крейта немає fake-провайдера LLM для роботи без мережі.
31
+ - `lint`виявляє порушення ізоляції core-тестів між LLM, Tauri та fake provider для тестового середовища.
32
+
33
+ Експортовані константи-рядки: `LLM_DEP_IN_APP_SHELL="llm-dep-in-app-shell"` — порушення, коли app shell напряму залежить від LLM; `CORE_CRATE_DEPENDS_ON_TAURI="core-crate-depends-on-tauri"` — порушення, коли core crate прив’язується до Tauri; `MISSING_FAKE_LLM_PROVIDER="missing-fake-llm-provider"` — порушення, коли для тестів немає fake LLM provider.
30
34
 
31
- Поведінка
32
- Цей код використовує маркери повідомлень, що посилаються на `` для забезпечення ізоляції тестування.
35
+ Поведінка: повідомлення позначаються маркером ``, щоб швидко пов’язати діагностику з правилом ізоляції тестів.
33
36
 
34
37
  ## Гарантії поведінки
35
38
 
36
- - Read-only: не виконує операцій запису (ФС/БД).
39
+ - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
@@ -17,9 +17,11 @@ import { createViolationReporter } from '../../../scripts/lib/lint-surface/viola
17
17
  import { findAncestorWorkspaceRoot, resolveWorkspaceMemberDirs } from '../../../scripts/utils/cargo-workspace.mjs'
18
18
  import { getMonorepoPackageRootDirs } from '../../../scripts/lib/workspaces.mjs'
19
19
 
20
- /** Стабільні reasons для трьох типів порушення. */
20
+ /** Стабільний reason: LLM-залежність оголошена в app shell замість core-крейта. */
21
21
  export const LLM_DEP_IN_APP_SHELL = 'llm-dep-in-app-shell'
22
+ /** Стабільний reason: core-крейт залежить від Tauri — ламає ізоляцію unit-тестів від runtime. */
22
23
  export const CORE_CRATE_DEPENDS_ON_TAURI = 'core-crate-depends-on-tauri'
24
+ /** Стабільний reason: у тестах core-крейта немає fake-провайдера LLM для роботи без мережі. */
23
25
  export const MISSING_FAKE_LLM_PROVIDER = 'missing-fake-llm-provider'
24
26
 
25
27
  /** Евристичний allowlist назв LLM SDK-крейтів (без версій/scope). */