@7n/rules 1.43.0 → 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.
- package/CHANGELOG.md +21 -0
- package/docs/vitest.config.md +14 -19
- package/package.json +1 -1
- package/rules/abie/lib/docs/index.md +0 -2
- package/rules/abie/lib/http-route.mjs +1 -0
- package/rules/abie/lib/yaml.mjs +2 -0
- package/rules/ci4/marksman_config/docs/index.md +10 -0
- package/rules/ci4/marksman_config/main.mjs +2 -0
- package/rules/doc-files/docgen-prompts/docs/index.md +9 -0
- package/rules/doc-files/docgen-prompts/main.mjs +5 -0
- package/rules/hasura/internal_urls/docs/index.md +0 -2
- package/rules/hasura/internal_urls/docs/main.md +27 -15
- package/rules/hasura/internal_urls/main.mjs +1 -0
- package/rules/image-avif/avif_generation/docs/index.md +10 -0
- package/rules/image-avif/avif_generation/main.mjs +2 -0
- package/rules/rego/vscode_settings/docs/fix-vscode_settings.md +12 -10
- package/rules/rego/vscode_settings/fix-vscode_settings.mjs +5 -0
- package/rules/tauri/cargo_mutants_config/docs/index.md +0 -2
- package/rules/tauri/cargo_mutants_config/docs/main.md +38 -12
- package/rules/tauri/cargo_mutants_config/main.mjs +5 -1
- package/rules/tauri/core_test_isolation/docs/main.md +19 -16
- package/rules/tauri/core_test_isolation/main.mjs +3 -1
- package/rules/tauri/linux_deps/docs/main.md +25 -18
- package/rules/tauri/linux_deps/main.mjs +2 -1
- package/rules/tauri/release/docs/main.md +20 -12
- package/rules/tauri/release/main.mjs +2 -0
- package/rules/tauri/updater/docs/main.md +31 -14
- package/rules/tauri/updater/main.mjs +4 -0
- package/rules/test/coverage/concern.json +9 -0
- package/rules/test/coverage/fix-worker.mjs +111 -0
- package/rules/test/coverage/lib/classify/apply.mjs +67 -0
- package/rules/test/coverage/lib/classify/cache.mjs +77 -0
- package/rules/test/coverage/lib/classify/docs/apply.md +28 -0
- package/rules/test/coverage/lib/classify/docs/cache.md +34 -0
- package/rules/test/coverage/lib/classify/docs/index.md +37 -0
- package/rules/test/coverage/lib/classify/docs/prompt.md +30 -0
- package/rules/test/coverage/lib/classify/docs/verdict-schema.md +30 -0
- package/rules/test/coverage/lib/classify/index.mjs +140 -0
- package/rules/test/coverage/lib/classify/prompt.mjs +136 -0
- package/rules/test/coverage/lib/classify/verdict-schema.mjs +163 -0
- package/rules/test/coverage/lib/llm.mjs +100 -0
- package/rules/test/coverage/main.mjs +161 -0
- package/rules/test/main.json +1 -0
- package/rules/test/main.mdc +140 -0
- package/rules/test/package_json/concern.json +11 -0
- package/rules/test/package_json/package_json.mdc +18 -0
- package/rules/test/package_json/package_json.rego +25 -0
- package/rules/test/package_json/template/package.json.contains.json +6 -0
- package/rules/text/oxfmtrc/fix-oxfmtrc.mjs +5 -0
- package/rules/text/vscode_settings/fix-vscode_settings.mjs +5 -0
- package/rules/worktree/vscode_settings/docs/fix-vscode_settings.md +10 -7
- package/rules/worktree/vscode_settings/fix-vscode_settings.mjs +5 -0
- package/rules/worktree/zed_settings/fix-zed_settings.mjs +5 -0
- package/schemas/n-rules.json +37 -0
- package/scripts/lib/adr/docs/index.md +0 -2
- package/scripts/lib/adr/docs/normalize-pipeline.md +44 -28
- package/scripts/lib/adr/normalize-pipeline.mjs +11 -0
- package/scripts/lib/docs/inline-template-links.md +17 -8
- package/scripts/lib/docs/plugin-api.md +1 -1
- package/scripts/lib/inline-template-links.mjs +5 -0
- package/scripts/lib/lint-surface/docs/run-detectors.md +25 -22
- package/scripts/lib/lint-surface/docs/tier-sampling-experiment.md +30 -14
- package/scripts/lib/lint-surface/run-detectors.mjs +1 -1
- package/scripts/lib/lint-surface/tier-sampling-experiment.mjs +1 -0
- package/scripts/lib/plugin-api.mjs +46 -0
- package/scripts/utils/docs/walkDir.md +26 -15
- package/scripts/utils/docs/worktree-fingerprint.md +16 -15
- package/scripts/utils/walkDir.mjs +9 -5
- package/scripts/utils/worktree-fingerprint.mjs +5 -0
- package/skills/storybook/SKILL.md +4 -4
- package/skills/taze/js/migration-cache.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
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
|
+
|
|
18
|
+
## [1.43.1] - 2026-07-22
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- Storybook (правило `storybook`): виправлення хвилі 2a за результатами живого пілота app-скафолда на `gt`. (1) `.storybook/main.js` app-варіанту більше НЕ знімає `vite-plugin-pages` у `viteFinal` — знімання ламало `storybook build` глобально через непідтримуваний `<route lang="yaml">`-блок (`scaffold/template/app-main.js`, `APP_MAIN_JS_MARKERS`). (2) Storybook vitest-проєкт app-пакетів отримує ВЛАСНІ `quasar()`/`AutoImport()`/`Pages()`-плагіни замість успадкованого урізаного unit-конфіга (нові `vitest-config/template/app-storybook-project-entry.js` і `vitest.config.app.baseline.mjs`, type-aware вибір у `fix-vitest-config.mjs`, нові маркер-перевірки в `main.mjs`/`adopt/main.mjs`). (3) `storybook/hygiene` (undeclared-import і sass-variables) тепер перевіряє лише `type: 'library'` пакети — на app-пакетах давав хибні спрацювання на Vite `resolve.alias`-специфікаторах і на свідомо відсутньому `sassVariables`-маркері app-`main.js`. (4) Додано канонічний шаблон `.storybook/vitest.setup.js` (стандартний `@storybook/addon-vitest`-boilerplate) — генерується/перевіряється `scaffold`-концерном для обох типів пакета. (5) `npm/schemas/n-rules.json`: додано `storybook.detectApps`/`storybook.optOut` до кореневої схеми — без цього `additionalProperties: false` відкидав ці вже задокументовані поля `.n-rules.json` як невідомі.
|
|
23
|
+
|
|
3
24
|
## [1.43.0] - 2026-07-22
|
|
4
25
|
|
|
5
26
|
### Added
|
package/docs/vitest.config.md
CHANGED
|
@@ -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:
|
|
7
|
-
model:
|
|
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
|
-
Файл
|
|
15
|
+
Файл задає кореневе vitest-середовище для `@7n/rules`, щоб тестове оточення було ізольоване від локальної машини й службових trace-джерел. Він ігнорує `node_modules`, а також sandbox-копії Stryker і git-worktree чекаутів, щоб прогін тестів не захоплював зайві дерева проєкту. Також він відсікає вплив git trace2 і LLM-трейсу під час запусків, де це може спотворити результати.
|
|
16
16
|
|
|
17
17
|
## Поведінка
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
-
|
|
34
|
-
- Свідомо пропускає шляхи:
|
|
35
|
-
|
|
36
|
-
Виключаються також git-worktree чекаути (`.worktrees/**`, `.claude/worktrees/**`) — повні копії репо, чиї тести дублюють основні.
|
|
30
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
|
31
|
+
- Свідомо пропускає шляхи: `node_modules`.
|
package/package.json
CHANGED
|
@@ -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
|
|
package/rules/abie/lib/yaml.mjs
CHANGED
|
@@ -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
|
/**
|
|
@@ -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:
|
|
7
|
-
model:
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
Файл
|
|
16
|
+
Файл обмежує правило lint лише nitra/abie репозиторіями й перевіряє, що `HASURA_GRAPHQL_ENDPOINT` в env-файлах вказує на очікуваний внутрішній Hasura endpoint. Він потрібен, щоб знаходити розсинхронізацію між env-конфігурацією та очікуваним endpoint-контрактом, свідомо не перевіряючи `base/` і нерелевантні репозиторії. Для перевірки файл звертається до мережі; помилки перехоплює fail-safe, не кидає винятків назовні і в окремих збійних сценаріях повертає `null` або інше порожнє значення замість винятку.
|
|
16
17
|
|
|
17
18
|
## Поведінка
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
-
|
|
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:
|
|
7
|
-
model: openai-codex/gpt-5.
|
|
8
|
-
tier: cloud-
|
|
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
|
-
|
|
15
|
+
`patterns` описує fix-правило для `.vscode/settings.json`, яке приводить файл до канону через deep-merge шаблону правила. Це потрібно, щоб застосувати налаштування канону й водночас не зачепити локальні налаштування користувача.
|
|
17
16
|
|
|
18
17
|
## Поведінка
|
|
19
18
|
|
|
20
|
-
1. `patterns`
|
|
21
|
-
2.
|
|
22
|
-
3.
|
|
23
|
-
|
|
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
|
-
-
|
|
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:
|
|
7
|
-
model:
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
/**
|
|
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:
|
|
7
|
-
model:
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
-
|
|
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
|
-
/**
|
|
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). */
|