@nitra/cursor 12.8.3 → 12.8.5

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 (125) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/bin/n-cursor.js +3 -2
  3. package/package.json +1 -1
  4. package/rules/abie/js/env_dns.mdc +33 -0
  5. package/rules/abie/js/firebase_hosting.mdc +3 -0
  6. package/rules/abie/js/hc_pairing.mdc +23 -0
  7. package/rules/abie/js/ua_http_route.mdc +47 -0
  8. package/rules/abie/js/ua_node_selector.mdc +27 -0
  9. package/rules/abie/main.mdc +53 -0
  10. package/rules/doc-files/js/docs/index.md +15 -15
  11. package/rules/js/docs/index.md +3 -3
  12. package/rules/js/docs/main.md +7 -7
  13. package/rules/js/js/docs/check.md +12 -16
  14. package/rules/js/js/docs/index.md +4 -4
  15. package/rules/js/js/docs/tooling.md +8 -8
  16. package/rules/js/js/docs/utils_imports.md +22 -200
  17. package/rules/npm-module/js/docs/index.md +5 -5
  18. package/rules/npm-module/js/docs/rule_meta.md +13 -13
  19. package/rules/npm-module/js/docs/skill_meta.md +19 -9
  20. package/rules/npm-module/js/rule_meta.mjs +9 -9
  21. package/rules/npm-module/js/skill_meta.mjs +6 -6
  22. package/rules/test/js/docs/index.md +7 -7
  23. package/rules/test/js/docs/stryker_config.md +18 -35
  24. package/rules/test/js/docs/vitest-config-pool-forks.md +20 -12
  25. package/schemas/v8r-catalog.json +4 -4
  26. package/scripts/docs/index.md +16 -16
  27. package/scripts/docs/sync-setup-bun-deps-action.md +14 -14
  28. package/scripts/lib/check-mdc-template-refs.mjs +2 -2
  29. package/scripts/lib/docs/check-mdc-template-refs.md +12 -214
  30. package/scripts/lib/docs/index.md +36 -36
  31. package/scripts/lib/docs/inline-template-links.md +13 -293
  32. package/scripts/lib/docs/mirror-parity.md +18 -157
  33. package/scripts/lib/docs/rule-meta.md +19 -22
  34. package/scripts/lib/docs/run-rule.md +11 -11
  35. package/scripts/lib/docs/skill-meta.md +17 -19
  36. package/scripts/lib/docs/timing-summary.md +7 -7
  37. package/scripts/lib/inline-template-links.mjs +31 -0
  38. package/scripts/lib/mirror-parity.mjs +6 -4
  39. package/scripts/lib/rule-meta.mjs +1 -1
  40. package/scripts/lib/run-rule.mjs +4 -4
  41. package/scripts/lib/skill-meta.mjs +1 -1
  42. package/scripts/utils/docs/index.md +14 -14
  43. package/scripts/utils/docs/resolve-js-root.md +12 -13
  44. package/types/bin/n-cursor.d.ts +1 -1
  45. package/rules/abie/abie.mdc +0 -181
  46. /package/rules/abie/{meta.json → main.json} +0 -0
  47. /package/rules/adr/{meta.json → main.json} +0 -0
  48. /package/rules/adr/{adr.mdc → main.mdc} +0 -0
  49. /package/rules/bun/{meta.json → main.json} +0 -0
  50. /package/rules/bun/{bun.mdc → main.mdc} +0 -0
  51. /package/rules/capacitor/{meta.json → main.json} +0 -0
  52. /package/rules/capacitor/{capacitor.mdc → main.mdc} +0 -0
  53. /package/rules/changelog/{meta.json → main.json} +0 -0
  54. /package/rules/changelog/{changelog.mdc → main.mdc} +0 -0
  55. /package/rules/ci4/{meta.json → main.json} +0 -0
  56. /package/rules/ci4/{ci4.mdc → main.mdc} +0 -0
  57. /package/rules/doc-files/{meta.json → main.json} +0 -0
  58. /package/rules/doc-files/{doc-files.mdc → main.mdc} +0 -0
  59. /package/rules/docker/{meta.json → main.json} +0 -0
  60. /package/rules/docker/{docker.mdc → main.mdc} +0 -0
  61. /package/rules/efes/{meta.json → main.json} +0 -0
  62. /package/rules/efes/{efes.mdc → main.mdc} +0 -0
  63. /package/rules/feedback/{meta.json → main.json} +0 -0
  64. /package/rules/feedback/{feedback.mdc → main.mdc} +0 -0
  65. /package/rules/ga/{meta.json → main.json} +0 -0
  66. /package/rules/ga/{ga.mdc → main.mdc} +0 -0
  67. /package/rules/graphql/{meta.json → main.json} +0 -0
  68. /package/rules/graphql/{graphql.mdc → main.mdc} +0 -0
  69. /package/rules/hasura/{meta.json → main.json} +0 -0
  70. /package/rules/hasura/{hasura.mdc → main.mdc} +0 -0
  71. /package/rules/image-avif/{meta.json → main.json} +0 -0
  72. /package/rules/image-avif/{image-avif.mdc → main.mdc} +0 -0
  73. /package/rules/image-compress/{meta.json → main.json} +0 -0
  74. /package/rules/image-compress/{image-compress.mdc → main.mdc} +0 -0
  75. /package/rules/js/{meta.json → main.json} +0 -0
  76. /package/rules/js/{js.mdc → main.mdc} +0 -0
  77. /package/rules/js-bun-db/{meta.json → main.json} +0 -0
  78. /package/rules/js-bun-db/{js-bun-db.mdc → main.mdc} +0 -0
  79. /package/rules/js-bun-redis/{meta.json → main.json} +0 -0
  80. /package/rules/js-bun-redis/{js-bun-redis.mdc → main.mdc} +0 -0
  81. /package/rules/js-mssql/{meta.json → main.json} +0 -0
  82. /package/rules/js-mssql/{js-mssql.mdc → main.mdc} +0 -0
  83. /package/rules/js-run/{meta.json → main.json} +0 -0
  84. /package/rules/js-run/{js-run.mdc → main.mdc} +0 -0
  85. /package/rules/k8s/{meta.json → main.json} +0 -0
  86. /package/rules/k8s/{k8s.mdc → main.mdc} +0 -0
  87. /package/rules/nginx-default-tpl/{meta.json → main.json} +0 -0
  88. /package/rules/nginx-default-tpl/{nginx-default-tpl.mdc → main.mdc} +0 -0
  89. /package/rules/npm-module/{meta.json → main.json} +0 -0
  90. /package/rules/npm-module/{npm-module.mdc → main.mdc} +0 -0
  91. /package/rules/php/{meta.json → main.json} +0 -0
  92. /package/rules/php/{php.mdc → main.mdc} +0 -0
  93. /package/rules/python/{meta.json → main.json} +0 -0
  94. /package/rules/python/{python.mdc → main.mdc} +0 -0
  95. /package/rules/rego/{meta.json → main.json} +0 -0
  96. /package/rules/rego/{rego.mdc → main.mdc} +0 -0
  97. /package/rules/release/{meta.json → main.json} +0 -0
  98. /package/rules/release/{release.mdc → main.mdc} +0 -0
  99. /package/rules/rust/{meta.json → main.json} +0 -0
  100. /package/rules/rust/{rust.mdc → main.mdc} +0 -0
  101. /package/rules/security/{meta.json → main.json} +0 -0
  102. /package/rules/security/{security.mdc → main.mdc} +0 -0
  103. /package/rules/style/{meta.json → main.json} +0 -0
  104. /package/rules/style/{style.mdc → main.mdc} +0 -0
  105. /package/rules/tauri/{meta.json → main.json} +0 -0
  106. /package/rules/tauri/{tauri.mdc → main.mdc} +0 -0
  107. /package/rules/test/{meta.json → main.json} +0 -0
  108. /package/rules/test/{test.mdc → main.mdc} +0 -0
  109. /package/rules/text/{meta.json → main.json} +0 -0
  110. /package/rules/text/{text.mdc → main.mdc} +0 -0
  111. /package/rules/tool-surface/{meta.json → main.json} +0 -0
  112. /package/rules/tool-surface/{tool-surface.mdc → main.mdc} +0 -0
  113. /package/rules/vue/{meta.json → main.json} +0 -0
  114. /package/rules/vue/{vue.mdc → main.mdc} +0 -0
  115. /package/rules/worktree/{meta.json → main.json} +0 -0
  116. /package/rules/worktree/{worktree.mdc → main.mdc} +0 -0
  117. /package/skills/adr-normalize/{meta.json → main.json} +0 -0
  118. /package/skills/coverage-fix/{meta.json → main.json} +0 -0
  119. /package/skills/doc-aggregate/{meta.json → main.json} +0 -0
  120. /package/skills/doc-files/{meta.json → main.json} +0 -0
  121. /package/skills/lint/{meta.json → main.json} +0 -0
  122. /package/skills/llm-patch/{meta.json → main.json} +0 -0
  123. /package/skills/publish-telegram/{meta.json → main.json} +0 -0
  124. /package/skills/start-check/{meta.json → main.json} +0 -0
  125. /package/skills/taze/{meta.json → main.json} +0 -0
@@ -3,210 +3,32 @@ type: JS Module
3
3
  title: utils_imports.mjs
4
4
  resource: npm/rules/js/js/utils_imports.mjs
5
5
  docgen:
6
- crc: 7eaeaf96
6
+ crc: 3fc9bf1b
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Модуль `npm/rules/js/js/utils_imports.mjs` реалізує одну з перевірок правила `js.mdc`: жоден файл усередині будь-якого каталогу з ім'ям `utils/` не має імпортувати щось за межами цього самого каталогу через відносні шляхи з префіксом `..`.
11
+ ## Огляд
10
12
 
11
- Філософія перевірки:
13
+ Модуль сканує монорепозиторій для пошуку каталогів `utils` та аналізу їхнього вмісту. Аналіз файлів JS/TS у цих каталогах здійснюється на відповідність шаблону забороненого відносного імпорту, що базується на конфігурації, визначеній у `.n-cursor.json`. При виявленні порушень, система генерує повідомлення, позначене як (js.mdc).
12
14
 
13
- - Каталог `utils/` за конвенцією тримає **generic helpers** — функції без бізнес-логіки, без знання про домен, без залежностей від конфігів конкретного проєкту.
14
- - Якщо файлу треба сусідній модуль (наприклад, `lib/foo.mjs` чи cross-rule helper) — він мусить переїхати у `lib/`, а не отримувати доступ через `../lib/foo.mjs`.
15
- - Дозволені імпорт-джерела: `./X`, `./sub/X` (свій каталог чи глибше), bare-package (`oxc-parser`, `@scope/pkg`), Node-builtin (`node:fs`, `fs`).
16
- - Заборонено будь-який `..`-шлях (`../X`, `../../X`, ...).
15
+ ## Поведінка
17
16
 
18
- Перевірка проходить по всьому monorepo: знаходить package-roots, у кожному рекурсивно шукає каталоги `utils/`, з кожного збирає не-тестові джерела (без `tests/` і `__fixtures__/`), парсить їх через `oxc-parser`, витягає всі імпорти (статичні, динамічні, `require(...)`) і логує fail-репорт для кожного імпорту з `..`-префіксом.
17
+ 1. Визначає кореневий каталог для аналізу.
18
+ 2. Зчитує шляхи, які слід ігнорувати, на основі конфігурації .n-cursor.json.
19
+ 3. Знаходить усі каталоги з назвою `utils` у межах кореневих каталогів пакетів монорепозиторію, ігноруючи типові артефакти (наприклад, node_modules, .git, dist).
20
+ 4. Якщо знайдено жодних каталогів `utils`, перевірка вважається успішною і завершується.
21
+ 5. Для кожного знайденого каталогу `utils` збирає всі джерела файлів, які відповідають шаблону JS/TS, виключаючи тестові файли та файли у каталогах `tests/` чи `__fixtures__/`.
22
+ 6. Для кожного зібраного файлу:
23
+ а. Зчитує вміст файлу.
24
+ б. Витягує всі рядкові імпорти (статичні, динамічні, `require`) з коду.
25
+ в. Перевіряє кожен витягнутий імпорт на відповідність шаблону забороненого відносного імпорту.
26
+ г. Якщо імпорт є забороненим, фіксує порушення, вказуючи повний шлях до файлу та сам імпорт.
27
+ 7. Після перевірки всіх файлів, якщо порушень не знайдено, перевірка вважається успішною (js.mdc).
28
+ 8. Повертає код завершення, що відображає успіх або виявлені порушення (js.mdc).
19
29
 
20
- Файл є точкою входу check-runner-а (CI-чи-локальний прогон): експортує одну async-функцію `check()`, яка повертає exit-code.
30
+ ## Гарантії поведінки
21
31
 
22
- ## Експорти / API
23
-
24
- | Експорт | Тип | Призначення |
25
- | ------- | ----------------------- | ----------------------------------------------------------------------------------------------------- |
26
- | `check` | `() => Promise<number>` | named export; запускає перевірку від `process.cwd()` і повертає `0` (OK) або `1` (знайдено порушення) |
27
-
28
- Усе інше — приватні helpers модуля без `export`.
29
-
30
- ## Функції
31
-
32
- ### `isIgnored(dir, ignorePaths)`
33
-
34
- Перевіряє, чи каталог входить у список ignore (точний збіг або префіксне співпадіння).
35
-
36
- - **Сигнатура:** `function isIgnored(dir: string, ignorePaths: string[]): boolean`
37
- - **Параметри:**
38
- - `dir` — абсолютний posix-шлях каталогу.
39
- - `ignorePaths` — масив абсолютних posix-шляхів, отриманих з `.n-cursor.json` через `loadCursorIgnorePaths`.
40
- - **Повертає:** `true`, якщо `dir` дорівнює якомусь елементу `ignorePaths` або починається з нього + `/`; інакше `false`.
41
- - **Side effects:** немає.
42
-
43
- ### `findUtilsDirs(root, ignorePosix)`
44
-
45
- Рекурсивно шукає всі каталоги з ім'ям `utils` під `root`.
46
-
47
- - **Сигнатура:** `async function findUtilsDirs(root: string, ignorePosix: string[]): Promise<string[]>`
48
- - **Параметри:**
49
- - `root` — абсолютний шлях кореня обходу (зазвичай корінь package).
50
- - `ignorePosix` — список абсолютних posix-шляхів, які пропускати.
51
- - **Повертає:** масив абсолютних шляхів знайдених `utils/`-каталогів. Порядок — результат DFS у тому ж порядку, в якому повертає `readdir`.
52
- - **Алгоритм:**
53
- - Вкладена рекурсивна функція `walk(dir)` читає `readdir(dir, { withFileTypes: true })`.
54
- - Помилка `readdir` (наприклад, нема прав чи каталог зник) проглинається через `try/catch` і дає ранній `return`.
55
- - Для кожного запису-каталогу:
56
- - якщо ім'я входить у `SKIP_DIR_NAMES` (`node_modules`, `.git`, `dist`, `coverage`, `.turbo`, `.next`, `__fixtures__`) — скіп;
57
- - повний шлях конвертується у posix і перевіряється через `isIgnored` — скіп якщо так;
58
- - якщо ім'я — рівно `utils`, додається у `found` і **не** заходить глибше (вкладені `utils/utils/` не очікуються; навіть якщо є — внутрішній `utils/` усе одно під самим `utils/` і його файли все одно пройдуть як файли зовнішнього `utils/`);
59
- - інакше — рекурсивно `walk(full)`.
60
- - **Side effects:** filesystem-чтення.
61
-
62
- ### `collectUtilsSources(utilsDir)`
63
-
64
- Збирає всі не-тестові source-файли під `utilsDir`.
65
-
66
- - **Сигнатура:** `async function collectUtilsSources(utilsDir: string): Promise<string[]>`
67
- - **Параметри:** `utilsDir` — абсолютний шлях каталогу `utils/`.
68
- - **Повертає:** масив абсолютних шляхів файлів-джерел.
69
- - **Фільтри:**
70
- - Каталоги `tests/`, `__fixtures__/` і будь-що з `SKIP_DIR_NAMES` — пропускаються (тести легально мають імпорти `../X` до свого модуля).
71
- - Файли мають матчити `JS_SOURCE_RE` (`.mjs`, `.mts`, `.cjs`, `.cts`, `.js`, `.ts`, `.jsx`, `.tsx`).
72
- - Файли, що матчать `TEST_FILE_RE` (`*.test.*`), — виключаються.
73
- - **Алгоритм:** аналогічний DFS через вкладену `walk(dir)` з тим самим проглинанням помилок `readdir`.
74
- - **Side effects:** filesystem-чтення.
75
-
76
- ### `extractImportSources(source, filePath)`
77
-
78
- Витягає всі рядкові імпорт-source з тексту файлу.
79
-
80
- - **Сигнатура:** `function extractImportSources(source: string, filePath: string): string[]`
81
- - **Параметри:**
82
- - `source` — текст файлу (UTF-8).
83
- - `filePath` — шлях до файлу, потрібен для визначення мови парсингу через `langFromPath`.
84
- - **Повертає:** масив рядків — значення source кожного імпорту в тому вигляді, в якому вони записані в коді (`'./foo'`, `'../bar'`, `'oxc-parser'`, ...).
85
- - **Що збирає:**
86
- - **Статичні імпорти** — з `parsed.module.staticImports[*].moduleRequest.value` (oxc-parser API).
87
- - **Динамічні імпорти** (`import('...')`) — через `dynamicImportModule(node)` під час обходу AST.
88
- - **CommonJS `require('...')`** — через `requireCallModule(node)`.
89
- - **Обробка помилок парсингу:** `try/catch` на `parseSync` повертає порожній масив і **не** падає, бо синтаксична помилка — окремий концерн іншої перевірки; ця має запуститись чисто і не блокувати решту.
90
- - **Side effects:** немає (виклик `parseSync` — CPU-only).
91
-
92
- ### `check()` (named export)
93
-
94
- Точка входу. Виконує всю перевірку від поточного робочого каталогу.
95
-
96
- - **Сигнатура:** `export async function check(): Promise<number>`
97
- - **Параметри:** немає; використовує `process.cwd()` як корінь monorepo.
98
- - **Повертає:** `0` — порушень немає; `1` — є хоча б одне (реальний exit-code обчислює `reporter.getExitCode()`).
99
- - **Покроковий алгоритм:**
100
- 1. Створити `reporter` через `createCheckReporter()`.
101
- 2. `root = process.cwd()`.
102
- 3. Завантажити `ignorePaths` з `.n-cursor.json` (`loadCursorIgnorePaths`) і перевести у posix-варіант (`ignorePosix`).
103
- 4. Отримати relative-paths package-roots monorepo через `getMonorepoPackageRootDirs(root)`.
104
- 5. Для кожного package-root знайти всі `utils/`-каталоги (`findUtilsDirs`) і покласти у `Set` (`utilsDirSet`) для де-дуплікації.
105
- 6. Якщо `utils/`-каталогів немає взагалі — `reporter.pass(...)` з повідомленням про пропуск і повернути exit-code.
106
- 7. Інакше пройти кожен `utils/`-каталог:
107
- - зібрати джерела (`collectUtilsSources`);
108
- - для кожного файлу прочитати контент, витягти імпорти (`extractImportSources`);
109
- - кожен import з префіксом `..` — `reporter.fail(...)` з relative-шляхом файлу та порушеним import-source, інкремент `violations`;
110
- - `checkedFiles` рахує всі перевірені файли.
111
- 8. Якщо `violations === 0` — `reporter.pass(...)` зі статистикою (кількість utils-каталогів і файлів).
112
- 9. Повернути `reporter.getExitCode()`.
113
- - **Side effects:**
114
- - filesystem-чтення (рекурсивне сканування + `readFile`);
115
- - запис у `reporter` (виводить рядки у stdout/stderr, залежно від реалізації);
116
- - читає `process.cwd()`.
117
-
118
- ## Залежності
119
-
120
- ### Node-builtin
121
-
122
- - `node:fs/promises` — `readdir`, `readFile`.
123
- - `node:path` — `join`, `relative`, `sep`.
124
-
125
- ### npm-пакет
126
-
127
- - `oxc-parser` — `parseSync` для парсингу JS/TS у AST з достовірною підтримкою сучасних синтаксисів (zero-config).
128
-
129
- ### Внутрішні модулі проєкту
130
-
131
- - `../../../scripts/lib/check-reporter.mjs` → `createCheckReporter` — фабрика репортера; має методи `pass`, `fail`, `getExitCode`. Уніфікований API для всіх check-функцій.
132
- - `../../../scripts/lib/load-cursor-config.mjs` → `loadCursorIgnorePaths` — читає `.n-cursor.json` (чи аналог) і повертає масив абсолютних шляхів, які треба пропустити.
133
- - `../../../scripts/lib/workspaces.mjs` → `getMonorepoPackageRootDirs` — повертає relative-paths коренів пакетів у monorepo (включно з `.`-коренем, якщо це теж пакет).
134
- - `../../../scripts/utils/ast-scan-utils.mjs`:
135
- - `langFromPath(filePath)` — мапить розширення файлу у `lang`-параметр для `oxc-parser`.
136
- - `walkAstWithAncestors(program, ancestors, visitor)` — обхід AST з трекінгом предків.
137
- - `dynamicImportModule(node)` — повертає рядок source для `import('...')`, або `null`.
138
- - `requireCallModule(node)` — повертає рядок source для `require('...')`, або `null`.
139
-
140
- ### Константи модуля
141
-
142
- | Ім'я | Значення | Призначення |
143
- | -------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
144
- | `JS_SOURCE_RE` | `/\.(?:[cm]?[jt]sx?)$/u` | матчить `.mjs`, `.mts`, `.cjs`, `.cts`, `.js`, `.ts`, `.jsx`, `.tsx` |
145
- | `TEST_FILE_RE` | `/\.test\.[cm]?[jt]sx?$/u` | матчить `*.test.{js,ts,...}` для виключення тестів |
146
- | `PARENT_RELATIVE_RE` | `/^\.\.(?:\/ | $)/u` | матчить `..` як цілий сегмент (`..` або `../*`); відсіює false-positive типу `..foo` |
147
- | `SKIP_DIR_NAMES` | `Set(['node_modules', '.git', 'dist', 'coverage', '.turbo', '.next', '__fixtures__'])` | каталоги, які скіпаємо при обходах |
148
-
149
- ## Потік виконання / Використання
150
-
151
- ### Інтеграція в перевірочний рантайм
152
-
153
- Модуль викликається check-runner-ом правила `js.mdc` (зазвичай із `npm/rules/js/js/`). Runner імпортує named export `check` і чекає на її resolved-значення як на process exit-code. Сам файл **не** має top-level executable коду — лише визначення; це дозволяє безпечно імпортувати його у тестах.
154
-
155
- Типовий виклик (псевдокод):
156
-
157
- ```mjs
158
- import { check } from './utils_imports.mjs'
159
-
160
- const exitCode = await check()
161
- process.exit(exitCode)
162
- ```
163
-
164
- ### Сценарій "усе чисто"
165
-
166
- 1. Runner запускається з кореня monorepo.
167
- 2. `check()` знаходить `utils/` каталоги в усіх package-roots.
168
- 3. Для кожного non-test source файлу витягає імпорти.
169
- 4. Жоден імпорт не починається з `..`.
170
- 5. `reporter.pass('utils-каталогів: N, перевірено M файлів — domain-bound імпортів немає (js.mdc)')`.
171
- 6. `getExitCode() → 0`.
172
-
173
- ### Сценарій "є порушення"
174
-
175
- 1. Знайдено файл `packages/foo/utils/helper.mjs`.
176
- 2. У ньому є `import bar from '../lib/bar.mjs'`.
177
- 3. `PARENT_RELATIVE_RE` матчить `../lib/bar.mjs`.
178
- 4. `reporter.fail('packages/foo/utils/helper.mjs: заборонений імпорт \'../lib/bar.mjs\' — utils/-файли мають бути generic (js.mdc)')`.
179
- 5. `violations` інкрементується.
180
- 6. По завершенню `getExitCode() → 1`.
181
-
182
- ### Сценарій "немає utils/"
183
-
184
- 1. У жодному package немає каталогу `utils/`.
185
- 2. `utilsDirSet.size === 0`.
186
- 3. `reporter.pass('utils-каталогів немає — перевірку пропущено (js.mdc)')`.
187
- 4. `getExitCode() → 0`.
188
-
189
- ### Сценарій "файл із синтаксичною помилкою"
190
-
191
- 1. `parseSync` кидає виключення.
192
- 2. `extractImportSources` ловить його у `try/catch` і повертає `[]`.
193
- 3. Цей файл не дає порушень. Проблему синтаксису ловить інша перевірка.
194
-
195
- ### Сценарій "ignore-шлях"
196
-
197
- 1. У `.n-cursor.json` зазначено абсолютний шлях, що покриває певний `utils/`-каталог.
198
- 2. `findUtilsDirs` через `isIgnored` пропускає його ще на стадії обходу — той `utils/` навіть не потрапляє у `utilsDirSet`.
199
-
200
- ### Особливості/edge cases
201
-
202
- - **Тести**: каталог `tests/` усередині `utils/` ігнорується повністю; також ігноруються файли `*.test.{js,ts,...}` будь-де всередині `utils/`. Це свідомо: тести легально імпортують свій модуль через `../X`.
203
- - **`__fixtures__/`**: ігнорується і в `findUtilsDirs`, і в `collectUtilsSources` — фікстури можуть бути будь-якими.
204
- - **Bare-imports** (`oxc-parser`, `node:fs`): не відсіюються спеціально, бо просто не матчать `PARENT_RELATIVE_RE`.
205
- - **Same-dir імпорти** (`./X`): дозволені автоматично з тієї ж причини.
206
- - **POSIX-шляхи для ignore**: під Windows `sep` — `\\`, тому шляхи нормалізуються у `/`-формат перед порівнянням з ignore-конфігом.
207
- - **De-duplication** через `Set`: якщо monorepo-структура повертає однаковий `utils/`-шлях двічі (наприклад, `.`-root і назва вкладеного пакета перетинаються), він обробиться лише раз.
208
- - **Помилки `readdir`** глушаться — недоступний каталог просто пропускається без падіння всієї перевірки.
209
-
210
- ### Залежність від конвенцій правила `js.mdc`
211
-
212
- Файл є технічною реалізацією одного з пунктів правила `js.mdc`. Усі повідомлення `reporter.pass/fail` посилаються на `(js.mdc)`, щоб користувач знав, де читати про сам принцип розділу `utils/` ↔ `lib/`.
32
+ - Read-only: не виконує операцій запису (ФС/БД).
33
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
34
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
@@ -6,9 +6,9 @@ resource: npm/rules/npm-module/js/
6
6
 
7
7
  # npm/rules/npm-module/js
8
8
 
9
- | Файл | Тип |
10
- | ----------------------------------------------- | --------- |
9
+ | Файл | Тип |
10
+ |---|---|
11
11
  | [header_doc_pointer.mjs](header_doc_pointer.md) | JS Module |
12
- | [package_structure.mjs](package_structure.md) | JS Module |
13
- | [rule_meta.mjs](rule_meta.md) | JS Module |
14
- | [skill_meta.mjs](skill_meta.md) | JS Module |
12
+ | [package_structure.mjs](package_structure.md) | JS Module |
13
+ | [rule_meta.mjs](rule_meta.md) | JS Module |
14
+ | [skill_meta.mjs](skill_meta.md) | JS Module |
@@ -3,31 +3,31 @@ type: JS Module
3
3
  title: rule_meta.mjs
4
4
  resource: npm/rules/npm-module/js/rule_meta.mjs
5
5
  docgen:
6
- crc: 938ccd0a
6
+ crc: 84394694
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Модуль перевіряє конфігурацію правил, розташованих у каталозі `npm/rules`. Він забезпечує наявність обов'язкового файлу `scripts.mdc` для кожного правила. Крім того, він валідує структуру метаданих у `meta.json`, перевіряючи відповідність полів, таких як `auto` та `lint`, визначеним контрактам. У процесі перевірки використовуються маркери повідомлень (scripts.mdc).
13
+ Модуль перевіряє конфігурації правил, розташованих у каталозі `npm/rules`. Він гарантує, що кожен підкаталог правила містить необхідні файли, включаючи маркери повідомлень (`scripts.mdc`), та коректно структурований конфігураційний файл, що базується на `main.json` та `meta.json`. Перевірка включає валідацію визначених предикатів та експортованих функцій відповідно до очікуваного контракту.
14
14
 
15
15
  ## Поведінка
16
16
 
17
- 1. Викликати `check` для початку валідації.
18
- 2. Перевірити наявність каталогу `npm/rules` у корені репозиторію. Якщо каталог відсутній, валідація завершується успішно.
19
- 3. Для кожного підкаталогу у `npm/rules` (який представляє правило):
20
- а. Перевірити наявність файлу `auto.md`. Якщо він присутній, реєструється помилка, оскільки метадані тепер знаходяться у `meta.json`.
21
- б. Перевірити наявність файлу `<id>.mdc` у каталозі правила. Якщо він відсутній, реєструється помилка, оскільки це обов'язковий файл (scripts.mdc).
22
- в. Зчитати вміст `meta.json` правила. Якщо файл відсутній або невалідний, реєструється помилка, і перевірка цього правила припиняється.
23
- г. Перевірити поле `auto` у `meta.json`. Якщо поле `auto` присутнє, воно повинно бути валідним (відповідати одному з визначених форматів, або бути відсутнім). Якщо поле `auto` містить невідомий предикат, реєструється помилка.
24
- ґ. Перевірити поле `lint` у `meta.json`. Якщо поле `lint` присутнє, воно повинно бути валідним (відповідати "per-file" або "full"). Також перевіряється, чи експортує файл `main.mjs` у каталозі правила функцію `lint` відповідно до зазначеного значення `lint`.
25
- і. Якщо всі перевірки для правила пройшли успішно, реєструється повідомлення про валідність `meta.json`.
26
- 4. Після обробки всіх правил, повертається код виходу, що відображає загальний статус валідації.
17
+ 1. Перевіряє наявність каталогу `npm/rules` у корені репозиторію. Якщо каталог відсутній, завершує роботу, повідомляючи про відсутність правил для валідації.
18
+ 2. Ітерує по всім підкаталогах у `npm/rules`, ігноруючи приховані каталоги.
19
+ 3. Для кожного каталогу виконує перевірку правила:
20
+ а. Перевіряє відсутність файлу `auto.md`. Якщо знайдено, повідомляє про залишковий файл.
21
+ б. Перевіряє наявність файлу `main.mdc`. Якщо відсутній, повідомляє про відсутність обов'язкового файлу (scripts.mdc).
22
+ в. Зчитує вміст `main.json` каталогу правила. Якщо файл відсутній або невалідний, повідомляє про це та пропускає подальшу валідацію цього правила.
23
+ г. Перевіряє поле `auto` у `main.json`. Якщо поле присутнє, валідує його структуру та перевіряє, чи всі використані предикати визначені.
24
+ ґ. Перевіряє поле `lint` у `main.json`. Якщо поле присутнє, валідує його структуру та перевіряє, чи експортує файл `main.mjs` відповідну функцію `lint`.
25
+ і. Якщо всі перевірки для правила пройдені успішно, повідомляє про валідність `main.json`.
26
+ 4. Після обробки всіх правил повертає код виходу, що відображає загальний статус валідації.
27
27
 
28
28
  ## Публічний API
29
29
 
30
- check — перевіряє відповідність усіх файлів `npm/rules/<id>/meta.json` встановленим критеріям.
30
+ check — перевіряє відповідність усіх `npm/rules/<id>/meta.json` вимогам.
31
31
 
32
32
  ## Гарантії поведінки
33
33
 
@@ -3,24 +3,34 @@ type: JS Module
3
3
  title: skill_meta.mjs
4
4
  resource: npm/rules/npm-module/js/skill_meta.mjs
5
5
  docgen:
6
- crc: a069397b
6
+ crc: d02dd00d
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Перевірка стану конфігурації. Файл перевіряє відповідність між полями worktree та requireRoot. Перевірка спирається на конфіги meta.json.
11
+ ## Огляд
12
+
13
+ Перевіряє структуру та конфігурацію скілів у каталозі `npm/skills`, використовуючи правила, визначені в `meta.json`. Валідує, що кожен скіл не містить файлу `auto.md`. Перевіряє валідність полів `worktree`, `auto` та `requireRoot` у `main.json` кожного скіла.
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Перевірка поля worktree
15
- 2. Перевірка поля auto
16
- 3. Перевірка поля requireRoot
17
- 4. Перевірка суперечності between worktree та requireRoot
17
+ 1. Перевіряє наявність каталогу `npm/skills` у поточному робочому каталозі. Якщо каталог відсутній, операція завершується успішно.
18
+ 2. Ітерує по всіх підкаталогах у `npm/skills`.
19
+ 3. Для кожного підкаталогу виконується перевірка метаданих скіла:
20
+ а. Перевіряється наявність файлу `auto.md` у каталозі скіла. Якщо він присутній, це вважається порушенням.
21
+ б. Зчитується вміст `main.json` скіла. Якщо файл відсутній або невалідний, перевірка для цього скіла припиняється.
22
+ в. Виконується перевірка полів `main.json` скіла:
23
+ i. `worktree` має бути булевим значенням.
24
+ ii. Якщо поле `auto` визначене, його вміст має бути розпізнаним як "завжди" або непорожній масив правил.
25
+ iii. `requireRoot` має бути булевим значенням, якщо визначений.
26
+ iv. Якщо `worktree` встановлено як `true`, а `requireRoot` як `false`, це вважається порушенням.
27
+ г. Якщо всі поля `main.json` валідні, це вважається успішним результатом для скіла.
28
+ 4. Після перевірки всіх скілів повертається код виходу, що відображає загальний статус (0 — успіх, 1 — порушення).
18
29
 
19
30
  ## Публічний API
20
31
 
21
- check — Валідує всі `npm/skills/<id>/meta.json`.
32
+ check — перевіряє відповідність усіх файлів `meta.json` у каталозі `npm/skills/<id>/` заданим критеріям.
22
33
 
23
34
  ## Гарантії поведінки
24
35
 
25
- - Read-only: файл не виконує операцій запису у файлову систему.
26
- - Не звертається до мережі.
36
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -17,11 +17,11 @@ function checkAutoField(id, raw, reporter) {
17
17
  if (raw.auto === undefined) return true
18
18
  const spec = parseRuleAutoSpec(raw.auto)
19
19
  if (spec === null) {
20
- reporter.fail(`rules/${id}: meta.json.auto нерозпізнане (очікується "завжди" / масив / {glob} / {predicate})`)
20
+ reporter.fail(`rules/${id}: main.json.auto нерозпізнане (очікується "завжди" / масив / {glob} / {predicate})`)
21
21
  return false
22
22
  }
23
23
  if ('predicate' in spec && !Object.hasOwn(RULE_PREDICATES, spec.predicate)) {
24
- reporter.fail(`rules/${id}: невідомий predicate "${spec.predicate}" (немає в RULE_PREDICATES)`)
24
+ reporter.fail(`rules/${id}: main.json — невідомий predicate "${spec.predicate}" (немає в RULE_PREDICATES)`)
25
25
  return false
26
26
  }
27
27
  return true
@@ -38,7 +38,7 @@ function checkAutoField(id, raw, reporter) {
38
38
  function checkLintField(id, ruleDir, raw, reporter) {
39
39
  if (raw.lint === undefined) return true
40
40
  if (parseRuleLintSpec(raw.lint) === null) {
41
- reporter.fail(`rules/${id}: meta.json.lint нерозпізнане (очікується "per-file"|"full")`)
41
+ reporter.fail(`rules/${id}: main.json.lint нерозпізнане (очікується "per-file"|"full")`)
42
42
  return false
43
43
  }
44
44
  const mainPath = join(ruleDir, 'main.mjs')
@@ -63,19 +63,19 @@ function checkRule(id, ruleDir, reporter) {
63
63
  let ruleOk = true
64
64
 
65
65
  if (existsSync(join(ruleDir, 'auto.md'))) {
66
- reporter.fail(`rules/${id}: залишковий auto.md — видали (метадані тепер у meta.json)`)
66
+ reporter.fail(`rules/${id}: залишковий auto.md — видали (метадані тепер у main.json)`)
67
67
  ruleOk = false
68
68
  }
69
69
 
70
- // Канон (scripts.mdc): {rule}.mdc — ОБОВ'ЯЗКОВИЙ у кожному npm/rules/<id>/.
71
- if (!existsSync(join(ruleDir, `${id}.mdc`))) {
72
- reporter.fail(`rules/${id}: відсутній ${id}.mdc — обов'язковий (scripts.mdc)`)
70
+ // Канон (scripts.mdc): main.mdc — ОБОВ'ЯЗКОВИЙ у кожному npm/rules/<id>/.
71
+ if (!existsSync(join(ruleDir, 'main.mdc'))) {
72
+ reporter.fail(`rules/${id}: відсутній main.mdc — обов'язковий (scripts.mdc)`)
73
73
  ruleOk = false
74
74
  }
75
75
 
76
76
  const raw = readRuleMetaRaw(ruleDir)
77
77
  if (!raw) {
78
- reporter.fail(`rules/${id}: відсутній або невалідний meta.json`)
78
+ reporter.fail(`rules/${id}: відсутній або невалідний main.json`)
79
79
  return
80
80
  }
81
81
 
@@ -83,7 +83,7 @@ function checkRule(id, ruleDir, reporter) {
83
83
  if (!checkLintField(id, ruleDir, raw, reporter)) ruleOk = false
84
84
 
85
85
  if (ruleOk) {
86
- reporter.pass(`rules/${id}: meta.json валідний`)
86
+ reporter.pass(`rules/${id}: main.json валідний`)
87
87
  }
88
88
  }
89
89
 
@@ -15,15 +15,15 @@ import { parseSkillAutoSpec, readSkillMetaRaw } from '../../../scripts/lib/skill
15
15
  function checkSkillFields(id, raw, reporter) {
16
16
  let ok = true
17
17
  if (typeof raw.worktree !== 'boolean') {
18
- reporter.fail(`skills/${id}: meta.json.worktree має бути boolean`)
18
+ reporter.fail(`skills/${id}: main.json.worktree має бути boolean`)
19
19
  ok = false
20
20
  }
21
21
  if (raw.auto !== undefined && parseSkillAutoSpec(raw.auto) === null) {
22
- reporter.fail(`skills/${id}: meta.json.auto нерозпізнане — очікується "завжди" або непорожній масив правил`)
22
+ reporter.fail(`skills/${id}: main.json.auto нерозпізнане — очікується "завжди" або непорожній масив правил`)
23
23
  ok = false
24
24
  }
25
25
  if (raw.requireRoot !== undefined && typeof raw.requireRoot !== 'boolean') {
26
- reporter.fail(`skills/${id}: meta.json.requireRoot має бути boolean`)
26
+ reporter.fail(`skills/${id}: main.json.requireRoot має бути boolean`)
27
27
  ok = false
28
28
  }
29
29
  if (raw.worktree === true && raw.requireRoot === false) {
@@ -46,20 +46,20 @@ function checkSkill(id, skillDir, reporter) {
46
46
  let skillOk = true
47
47
 
48
48
  if (existsSync(join(skillDir, 'auto.md'))) {
49
- reporter.fail(`skills/${id}: залишковий auto.md — видали (метадані тепер у meta.json)`)
49
+ reporter.fail(`skills/${id}: залишковий auto.md — видали (метадані тепер у main.json)`)
50
50
  skillOk = false
51
51
  }
52
52
 
53
53
  const raw = readSkillMetaRaw(skillDir)
54
54
  if (!raw) {
55
- reporter.fail(`skills/${id}: відсутній або невалідний meta.json (очікується {"auto"?, "worktree": bool})`)
55
+ reporter.fail(`skills/${id}: відсутній або невалідний main.json (очікується {"auto"?, "worktree": bool})`)
56
56
  return
57
57
  }
58
58
 
59
59
  if (!checkSkillFields(id, raw, reporter)) skillOk = false
60
60
 
61
61
  if (skillOk) {
62
- reporter.pass(`skills/${id}: meta.json валідний`)
62
+ reporter.pass(`skills/${id}: main.json валідний`)
63
63
  }
64
64
  }
65
65
 
@@ -6,11 +6,11 @@ resource: npm/rules/test/js/
6
6
 
7
7
  # npm/rules/test/js
8
8
 
9
- | Файл | Тип |
10
- | ----------------------------------------------------------- | --------- |
11
- | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
- | [location.mjs](location.md) | JS Module |
13
- | [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
14
- | [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
15
- | [stryker_config.mjs](stryker_config.md) | JS Module |
9
+ | Файл | Тип |
10
+ |---|---|
11
+ | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
+ | [location.mjs](location.md) | JS Module |
13
+ | [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
14
+ | [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
15
+ | [stryker_config.mjs](stryker_config.md) | JS Module |
16
16
  | [vitest-config-pool-forks.mjs](vitest-config-pool-forks.md) | JS Module |
@@ -3,48 +3,31 @@ type: JS Module
3
3
  title: stryker_config.mjs
4
4
  resource: npm/rules/test/js/stryker_config.mjs
5
5
  docgen:
6
- crc: 7ea109c6
7
- score: 95
6
+ crc: be62c446
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Цей файл виконує перевірку наявності певних файлів та конфігурацій у кореневих пакетах. Код працює з конфігами, визначеними у `mutation.json` та `package.json`, для забезпечення певних станів у системі.
11
+ ## Огляд
12
+
13
+ Модуль перевіряє готовність JavaScript-проєктів до виконання тестів. Він збирає кореневі каталоги проєктів, використовуючи публічну функцію `check` для валідації. Перевірка гарантує наявність необхідних конфігураційних файлів, зокрема `mutation.json` та `package.json`, у кожному знайденому проєкті. Модуль свідомо пропускає каталоги `node_modules`. Він також додає відповідні артефакти тестів до `.gitignore` у коренях проєктів. (test.mdc)
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Перевірити наявність `js` у конфігурації.
15
- 2. Зібрати кореневі пакети.
16
- 3. Перевірити наявність базових конфігурацій.
17
- 4. Перевірити наявність базлайн-файлів.
18
- 5. Для кожного кореневого пакета перевірити наявність `.vue` файлів.
19
- 6. Для кожного кореневого пакета згенерувати ім'я конфігурації.
20
- 7. Для кожного кореневого пакета перевірити наявність необхідних базлайн-файлів.
21
- 8. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
22
- 9. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
23
- 10. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
24
- 11. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
25
- 12. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
26
- 13. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
27
- 14. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
28
- 15. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
29
- 16. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
30
- 17. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
31
- 18. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
32
- 19. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
33
- 20. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
34
- 21. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
35
- 22. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
36
- 23. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
37
- 24. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
38
- 25. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
39
- 26. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
40
- 27. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
41
- 28. Для кожного кореневого пакета перевірити наявність базових базлайн-файлів.
42
- 29. Для кожного кореневого пакета перевірити наявність `stryker.config.mjs`.
43
- 30. Для кожного кореневого пакета перевірити наявність `vitest.config.mjs` або `vitest.config.js`.
17
+ 1. Викликається `check` для ініціалізації процесу перевірки.
18
+ 2. Перевіряється, чи у конфігурації дозволено виконання перевірок для JavaScript. Якщо ні, процес завершується з кодом, що вказує на пропуск.
19
+ 3. Збираються всі кореневі каталоги, що містять JavaScript-проєкти. Якщо жоден не знайдено, процес завершується з повідомленням про помилку (test.mdc).
20
+ 4. Перевіряється наявність усіх канонічних файлів конфігурації (baseline) у системі. Якщо хоча б один відсутній, процес завершується з повідомленням про помилку.
21
+ 5. Для кожного знайденого кореневого каталогу проєкту виконується наступне:
22
+ а. Визначається, чи містить проєкт файли `.vue`.
23
+ б. Створюється або оновлюється файл `stryker.config.mjs` у корені проєкту, копіюючи відповідний канонічний baseline. У цьому файлі замінюється посилання на конфігурацію Vitest на фактичне ім'я конфігурації проєкту.
24
+ в. Якщо проєкт містить файли `.vue` і файл `stryker.config.mjs` вже існував, виконується аугментація цього файлу. Аугментація додає плагін `vue-macros` до конфігурації, якщо він відсутній, зберігаючи при цьому форматування користувача.
25
+ г. Створюється або оновлюється файл `stryker-vue-macros-ignorer.mjs` у корені проєкту.
26
+ д. Створюється або оновлюється файл конфігурації Vitest у корені проєкту, використовуючи відповідний канонічний baseline.
27
+ 6. Виконується гарантування, що файли, що містять артефакти тестів Stryker та покриття (наприклад, `**/reports/stryker/`, `**/coverage/`), додані до `.gitignore` у корені проєкту. Якщо додано нові записи, виводиться повідомлення (test.mdc).
28
+ 7. Процес завершується з кодом, що вказує на успішне виконання або на виявлені порушення.
44
29
 
45
30
  ## Гарантії поведінки
46
31
 
47
32
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
48
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
49
33
  - Свідомо пропускає шляхи: `node_modules`.
50
- - Не звертається до мережі.
@@ -3,27 +3,35 @@ type: JS Module
3
3
  title: vitest-config-pool-forks.mjs
4
4
  resource: npm/rules/test/js/vitest-config-pool-forks.mjs
5
5
  docgen:
6
- crc: bb04a54b
6
+ crc: c8640fd7
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Огляд
11
- Файл виконує перевірку конфігураційного файлу для підтвердження наявності певного параметра. Це робиться для запобігання гонці у process.cwd між паралельними тестовими файлами (test.mdc).
11
+ ## Огляд
12
+
13
+ Визначає шлях до конфігураційного файлу Vitest. Перевіряє, чи встановлено в цьому файлі `pool: 'forks'`. (test.mdc)
14
+
15
+ Поведінка:
16
+
17
+ - Якщо конфігураційний файл не знайдено, завершує роботу з кодом, що вказує на помилку. (test.mdc)
18
+ - Якщо конфігураційний файл знайдено, але в ньому відсутній ключ `pool: 'forks'`, завершує роботу з кодом, що вказує на помилку. (test.mdc)
19
+ - Якщо конфігураційний файл знайдено і містить `pool: 'forks'`, завершує роботу з кодом 0. (test.mdc)
12
20
 
13
21
  ## Поведінка
14
22
 
15
- 1. Знайти файл конфігурації з назвою vitest.config.mjs або vitest.config.js у вказаному шляху.
16
- 2. Якщо файл знайдено, прочитати його вміст.
17
- 3. Перевірити вміст файлу на наявність патерну pool: 'forks'.
18
- 4. Якщо патерн знайдено, повідомити про успішне виконання перевірки.
19
- 5. Якщо патерн відсутній, повідомити про невдачу, вказуючи, що конфігурація повинна містити pool: 'forks' для захисту від гонки у process.cwd між паралельними test files (test.mdc).
20
- 6. Якщо файл конфігурації не знайдено, повідомити, що перевірка пропущено.
23
+ 1. Визначається шлях до файлу конфігурації Vitest, шукаючи спочатку `vitest.config.mjs`, а потім `vitest.config.js` у корені репозиторію.
24
+ 2. Якщо конфігураційний файл відсутній, виконується пропуск перевірки, і повертається код виходу 0.
25
+ 3. Якщо файл знайдено, його вміст зчитується.
26
+ 4. Перевіряється, чи містить вміст конфігураційного файлу рядок, що вказує на встановлення `pool: 'forks'`.
27
+ 5. Якщо рядок знайдено, виконується успішне повідомлення (test.mdc).
28
+ 6. Якщо рядок не знайдено, виконується повідомлення про помилку (test.mdc), що вказує на необхідність додавання `pool: 'forks'` для захисту від гонки в умовах паралельного виконання тестів.
29
+ 7. Функція `check` повертає код виходу, що відображає результат перевірки (0 для успіху/пропуску, 1 для помилки).
21
30
 
22
31
  ## Публічний API
23
32
 
24
- check — перевіряє, чи налаштування `vitest.config.{mjs,js}` використовує `pool: 'forks'`. (test.mdc)
33
+ check — перевіряє наявність конфігурації `pool: 'forks'` у файлі `vitest.config.{mjs,js}`. (test.mdc)
25
34
 
26
35
  ## Гарантії поведінки
27
36
 
28
- - Read-only: файл не виконує операцій запису у файлову систему.
29
- - Не звертається до мережі.
37
+ - Read-only: не виконує операцій запису (ФС/БД).