@nitra/cursor 5.3.4 → 6.0.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 (173) hide show
  1. package/.claude-template/settings.template.json +2 -2
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
  3. package/CHANGELOG.md +21 -0
  4. package/bin/n-cursor.js +47 -24
  5. package/lib/docs/models.md +29 -18
  6. package/lib/docs/omlx-trace.md +51 -0
  7. package/lib/docs/omlx.md +31 -15
  8. package/lib/omlx.mjs +2 -5
  9. package/package.json +1 -1
  10. package/rules/abie/docs/fix.md +17 -11
  11. package/rules/adr/docs/fix.md +25 -140
  12. package/rules/bun/docs/fix.md +18 -151
  13. package/rules/capacitor/docs/fix.md +16 -13
  14. package/rules/capacitor/js/docs/platforms.md +31 -43
  15. package/rules/changelog/docs/fix.md +25 -169
  16. package/rules/ci4/docs/fix.md +11 -14
  17. package/rules/doc-files/doc-files.mdc +60 -0
  18. package/rules/doc-files/docs/fix.md +31 -0
  19. package/rules/doc-files/fix.mjs +19 -0
  20. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  21. package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +18 -5
  22. package/{skills → rules}/doc-files/js/docgen-gen.mjs +46 -5
  23. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  24. package/{skills → rules}/doc-files/js/docgen-scan.mjs +11 -3
  25. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  26. package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
  27. package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
  28. package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +2 -2
  29. package/{skills → rules}/doc-files/js/docs/docgen-gen.md +2 -2
  30. package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
  31. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  32. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  33. package/rules/doc-files/js/docs/lint.md +36 -0
  34. package/rules/doc-files/js/docs/units-js.md +31 -0
  35. package/rules/doc-files/js/docs/units-rs.md +35 -0
  36. package/rules/doc-files/js/docs/units.md +30 -0
  37. package/rules/doc-files/js/lint.mjs +96 -0
  38. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  39. package/rules/doc-files/lint/docs/lint.md +37 -0
  40. package/rules/doc-files/lint/lint.mjs +105 -0
  41. package/rules/doc-files/meta.json +1 -0
  42. package/rules/docker/docs/fix.md +21 -161
  43. package/rules/efes/docs/fix.md +23 -194
  44. package/rules/feedback/docs/fix.md +10 -8
  45. package/rules/ga/docs/fix.md +10 -5
  46. package/rules/ga/meta.json +1 -1
  47. package/rules/graphql/docs/fix.md +23 -119
  48. package/rules/hasura/docs/fix.md +19 -5
  49. package/rules/hasura/js/docs/internal_urls.md +34 -307
  50. package/rules/image-avif/docs/fix.md +16 -127
  51. package/rules/image-compress/docs/fix.md +20 -141
  52. package/rules/image-compress/js/docs/package_setup.md +22 -182
  53. package/rules/js-bun-db/docs/fix.md +23 -139
  54. package/rules/js-bun-db/js/docs/safety.md +33 -221
  55. package/rules/js-bun-redis/docs/fix.md +25 -114
  56. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  57. package/rules/js-lint/docs/fix.md +30 -108
  58. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  59. package/rules/js-lint/js/docs/lint.md +22 -238
  60. package/rules/js-lint/js/docs/tooling.md +34 -331
  61. package/rules/js-lint/js/lint.mjs +19 -12
  62. package/rules/js-lint/js-lint.mdc +1 -1
  63. package/rules/js-lint/meta.json +1 -1
  64. package/rules/js-lint-ci/docs/fix.md +16 -149
  65. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  66. package/rules/js-lint-ci/js-lint-ci.mdc +1 -1
  67. package/rules/js-lint-ci/meta.json +1 -1
  68. package/rules/js-mssql/docs/fix.md +18 -123
  69. package/rules/js-mssql/js/docs/deps.md +28 -251
  70. package/rules/js-run/docs/fix.md +23 -138
  71. package/rules/js-run/js/docs/runtime.md +24 -378
  72. package/rules/k8s/docs/fix.md +18 -123
  73. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  74. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  75. package/rules/npm-module/docs/fix.md +27 -89
  76. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  77. package/rules/npm-module/js/docs/package_structure.md +36 -258
  78. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  79. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  80. package/rules/npm-module/js/rule_meta.mjs +3 -3
  81. package/rules/php/docs/fix.md +21 -98
  82. package/rules/php/js/docs/tooling.md +20 -143
  83. package/rules/python/docs/fix.md +25 -157
  84. package/rules/python/js/docs/applies.md +20 -98
  85. package/rules/python/js/docs/tooling.md +27 -144
  86. package/rules/rego/docs/fix.md +24 -112
  87. package/rules/rego/js/docs/applies.md +20 -164
  88. package/rules/rego/js/docs/lint.md +15 -110
  89. package/rules/rego/meta.json +1 -1
  90. package/rules/release/docs/fix.md +16 -114
  91. package/rules/rust/docs/fix.md +24 -119
  92. package/rules/rust/js/docs/applies.md +20 -129
  93. package/rules/security/docs/fix.md +21 -78
  94. package/rules/security/js/docs/sample_secret.md +23 -182
  95. package/rules/security/js/docs/trufflehog.md +19 -128
  96. package/rules/security/meta.json +1 -1
  97. package/rules/style-lint/docs/fix.md +16 -150
  98. package/rules/style-lint/js/docs/lint.md +21 -172
  99. package/rules/style-lint/js/docs/tooling.md +19 -184
  100. package/rules/style-lint/js/lint.mjs +4 -3
  101. package/rules/style-lint/meta.json +1 -1
  102. package/rules/tauri/docs/fix.md +26 -152
  103. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  104. package/rules/tauri/js/docs/tooling.md +20 -217
  105. package/rules/test/docs/fix.md +19 -127
  106. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  107. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  108. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  109. package/rules/test/js/docs/location.md +24 -126
  110. package/rules/test/js/docs/no-process-chdir.md +20 -151
  111. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  112. package/rules/test/js/docs/stryker_config.md +48 -148
  113. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  114. package/rules/text/docs/fix.md +25 -113
  115. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  116. package/rules/text/js/docs/formatting.md +60 -251
  117. package/rules/text/js/docs/lint.md +17 -114
  118. package/rules/text/js/lint.mjs +5 -3
  119. package/rules/text/lint/docs/lint.md +1 -1
  120. package/rules/text/lint/docs/run-dotenv-linter.md +1 -1
  121. package/rules/text/lint/docs/run-shellcheck.md +1 -1
  122. package/rules/text/lint/lint.mjs +13 -9
  123. package/rules/text/lint/run-dotenv-linter.mjs +13 -10
  124. package/rules/text/lint/run-shellcheck.mjs +10 -6
  125. package/rules/text/meta.json +1 -1
  126. package/rules/vue/docs/fix.md +25 -118
  127. package/rules/vue/js/docs/packages.md +25 -323
  128. package/rules/worktree/docs/fix.md +31 -150
  129. package/scripts/coverage-classify/docs/index.md +23 -209
  130. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  131. package/scripts/dispatcher/docs/trace.md +35 -0
  132. package/scripts/docs/auto-rules.md +37 -361
  133. package/scripts/docs/lint-cli.md +12 -13
  134. package/scripts/docs/post-tool-use-fix.md +16 -15
  135. package/scripts/docs/skills-cli.md +26 -23
  136. package/scripts/docs/sync-claude-config.md +94 -34
  137. package/scripts/docs/worktree-cli.md +11 -34
  138. package/scripts/lib/docs/assert-project-root.md +14 -16
  139. package/scripts/lib/docs/changed-files.md +24 -139
  140. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  141. package/scripts/lib/docs/rule-meta.md +1 -1
  142. package/scripts/lib/docs/rule-predicates.md +20 -17
  143. package/scripts/lib/docs/run-rule-cli.md +14 -18
  144. package/scripts/lib/docs/run-rule.md +13 -20
  145. package/scripts/lib/docs/run-standard-rule.md +12 -15
  146. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  147. package/scripts/lib/rule-meta.mjs +10 -6
  148. package/scripts/lib/rule-predicates.mjs +1 -1
  149. package/scripts/lint-cli.mjs +28 -20
  150. package/scripts/sync-claude-config.mjs +4 -1
  151. package/scripts/utils/docs/with-lock.md +19 -12
  152. package/scripts/utils/with-lock.mjs +4 -2
  153. package/skills/doc-aggregate/SKILL.md +2 -2
  154. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  155. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  156. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  157. package/skills/doc-files/.changes/260612-0031.md +5 -0
  158. package/skills/doc-files/.changes/260612-0036.md +5 -0
  159. package/skills/doc-files/.changes/260612-0114.md +5 -0
  160. package/skills/doc-files/SKILL.md +6 -6
  161. package/skills/fix/js/docs/llm-worker.md +17 -15
  162. package/skills/fix/js/docs/orchestrator.md +30 -23
  163. package/skills/fix/js/docs/t0.md +26 -16
  164. package/skills/start-check/js/docs/check.md +26 -22
  165. package/skills/taze/js/docs/diff.md +44 -20
  166. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  167. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  168. package/skills/doc-files/js/docs/units-rs.md +0 -35
  169. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  170. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  171. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  172. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  173. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -0,0 +1,105 @@
1
+ /**
2
+ * CLI-обгортка канонічного `lint-doc-files` (doc-files.mdc): детермінований детектор
3
+ * застарілості файлових док (`<dir>/docs/<stem>.md`) — 0 викликів LLM, працює будь-де.
4
+ *
5
+ * Режими (мапа команд у doc-files.mdc / спеці 2026-06-12):
6
+ * - (без прапорців) / `[paths…]` — повний або точковий детект; **exit 1**, якщо є stale.
7
+ * - `--missing-only` — звужує до `missing` (без `crc-mismatch`); exit 1.
8
+ * - `--json` — JSON-лістинг усіх кандидатів зі станом (= старий `scan`); exit 0.
9
+ * - `--hook` / `--git` / `--degraded` — делегат у `runDocFilesCheckCli` (hook-протокол: exit 2/0).
10
+ *
11
+ * Серіалізація: повний прогін — через `runStandardLint` (ключ `lint-doc-files`,
12
+ * виводиться зі шляху каталогу). Hook/git/degraded форми — **без локу** (швидкі точкові
13
+ * перевірки в hook-протоколі потребують завжди-свіжого вердикту) — канон scripts.mdc.
14
+ */
15
+ import { existsSync, statSync } from 'node:fs'
16
+ import { join, relative, resolve, sep, isAbsolute } from 'node:path'
17
+
18
+ import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
19
+ import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
20
+ import {
21
+ describeFile,
22
+ isDocCandidate,
23
+ resolveRoot,
24
+ runDocFilesCheckCli,
25
+ runDocFilesScanCli,
26
+ scanForDocFiles
27
+ } from '../js/docgen-scan.mjs'
28
+
29
+ /**
30
+ * Нормалізує шлях-кандидат до posix-шляху від кореня (null поза деревом).
31
+ * @param {string} root абсолютний корінь
32
+ * @param {string} candidate шлях-кандидат
33
+ * @returns {string|null} posix-шлях від кореня або null
34
+ */
35
+ function toRelSource(root, candidate) {
36
+ const rel = relative(root, resolve(root, candidate))
37
+ if (rel.startsWith('..') || isAbsolute(rel)) return null
38
+ return rel.split(sep).join('/')
39
+ }
40
+
41
+ /**
42
+ * Витягує позиційні шляхи з argv (не прапорці й не значення `--root`).
43
+ * @param {string[]} argv аргументи
44
+ * @returns {string[]} позиційні шляхи
45
+ */
46
+ function positionalPaths(argv) {
47
+ const rootIdx = argv.indexOf('--root')
48
+ const skip = rootIdx !== -1 ? rootIdx + 1 : -1
49
+ return argv.filter((a, i) => !a.startsWith('--') && i !== skip)
50
+ }
51
+
52
+ /**
53
+ * Реальна робота повного / точкового детекту. Exit 1 — є stale, 0 — все свіже.
54
+ * @param {string[]} argv аргументи після назви команди
55
+ * @returns {number} exit-код
56
+ */
57
+ export function runLintDocFilesSteps(argv) {
58
+ const root = resolveRoot(argv)
59
+ if (!existsSync(root) || !statSync(root).isDirectory()) {
60
+ console.error(`lint-doc-files: корінь не існує або не є директорією: ${root}`)
61
+ return 1
62
+ }
63
+ const missingOnly = argv.includes('--missing-only')
64
+ const paths = positionalPaths(argv)
65
+
66
+ const described = paths.length
67
+ ? paths
68
+ .map(p => toRelSource(root, p))
69
+ .filter(rel => rel && isDocCandidate(root, rel) && existsSync(join(root, rel)))
70
+ .map(rel => describeFile(root, /** @type {string} */ (rel)))
71
+ : scanForDocFiles(root)
72
+
73
+ let stale = described.filter(f => f.stale)
74
+ if (missingOnly) stale = stale.filter(f => f.reason === 'missing')
75
+
76
+ if (stale.length === 0) {
77
+ console.log('✓ doc-files: усі файлові доки актуальні.')
78
+ return 0
79
+ }
80
+ const list = stale.map(f => ` - ${f.sourcePath} (${f.reason})`).join('\n')
81
+ console.error(
82
+ `✗ doc-files: документація застаріла/відсутня для ${stale.length} файл(ів):\n${list}\n→ перегенеруй: npx @nitra/cursor fix-doc-files`
83
+ )
84
+ return 1
85
+ }
86
+
87
+ /**
88
+ * Публічна CLI-форма `lint-doc-files`. Hook/git/degraded — делегат без локу; `--json` —
89
+ * scan; решта — повний/точковий детект під `runStandardLint` (ключ `lint-doc-files`).
90
+ * @param {string[]} [argv] аргументи після назви команди
91
+ * @returns {Promise<number>} exit-код
92
+ */
93
+ export function runLintDocFilesCli(argv = process.argv.slice(3)) {
94
+ if (argv.includes('--hook') || argv.includes('--git') || argv.includes('--degraded')) {
95
+ return runDocFilesCheckCli(argv)
96
+ }
97
+ if (argv.includes('--json')) {
98
+ return Promise.resolve(runDocFilesScanCli(argv))
99
+ }
100
+ return runStandardLint(import.meta.dirname, () => runLintDocFilesSteps(argv))
101
+ }
102
+
103
+ if (isRunAsCli(import.meta.url)) {
104
+ process.exitCode = await runLintDocFilesCli(process.argv.slice(2))
105
+ }
@@ -0,0 +1 @@
1
+ { "auto": "завжди", "lint": "per-file" }
@@ -1,177 +1,37 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/docker/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # fix.mjs — entry-point правила `docker` (fix-режим)
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `npm/rules/docker/fix.mjs` — це тонкий **entry-point** правила `docker` у пакеті `@nitra/cursor` для режиму `fix` (автоматичне виправлення порушень). Він не містить власної логіки перевірки чи виправлень: уся реальна робота делегується у спільні бібліотечні функції з `npm/scripts/lib/`.
12
+ Запуск правила приймає контекст прогону, застосовує JS-занепокоєні до політики до mdc-refs та повертає результат.
12
13
 
13
- Файл виконує **дві ролі** одночасно (патерн dual-role module, прийнятий в усіх `rules/<id>/fix.mjs` цього репозиторію):
14
+ Виконання у режимі CLI виконує повний еквівалент команди `npx @nitra/cursor fix <id>`, включаючи завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
14
15
 
15
- 1. **Library role** — експортує іменовану функцію `run(ctx)`, яку викликає CLI-оркестратор `@nitra/cursor` (`bin/cursor.mjs` → `cmd-fix.mjs` / `cmd-fix-all.mjs`). У цьому режимі правило вбудовується в загальний прогін «всіх правил» зі спільним кешем обходу файлів (`walkCache`), агрегованим summary та глобальним whitelist.
16
- 2. **Standalone role** — якщо файл запущений напряму (`bun npm/rules/docker/fix.mjs` або через `import.meta.url` як головний модуль), він виконується як автономний CLI-ентрі: завантажує конфіг, застосовує whitelist, друкує summary та повертає exit-code, повністю еквівалентний `npx @nitra/cursor fix docker`.
16
+ ## Поведінка
17
17
 
18
- Сам алгоритм виправлень розкладений у сусідніх теках цього правила (`js/`, `lint/`, `policy/`) і запускається уніфіковано через `runStandardRule`, яке прокручує чотири стандартні фази:
18
+ 1. Запуск правила.
19
+ * Приймає контекст прогону.
20
+ * Виконує застосування JS-занепокоєних до політики до mdc-refs.
21
+ * Повертає результат.
19
22
 
20
- 1. **applies** перевірка, чи правило взагалі релевантне для поточного workspace.
21
- 2. **JS-concerns** JS-специфічні fix-перевірки (з теки `js/`).
22
- 3. **policy** політики/policy-перевірки правила.
23
- 4. **mdc-refs** узгодження посилань у файлі `docker.mdc` (опис правила для Cursor).
23
+ 2. Виконання у режимі CLI.
24
+ * Викликається через оркестрацію CLI.
25
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
26
+ * Виконує завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
24
27
 
25
- ID правила (`docker`) визначається автоматично з імені директорії-носія через `import.meta.dirname` — у `fix.mjs` немає жодного хардкоду ID.
28
+ ## Публічний API
26
29
 
27
- ## Експорти / API
30
+ run запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
31
+ Library mode — викликається CLI orchestration через `import + run`.
28
32
 
29
- | Експорт | Тип | Призначення |
30
- | ----------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
31
- | `run(ctx?)` | named export, `function` | Library-API: запустити стандартний fix-pipeline правила `docker`. Повертає `Promise<number>` з exit-кодом (`0` — OK, `1` — порушення/помилка). |
33
+ ## Гарантії поведінки
32
34
 
33
- Інших іменованих або default-експортів файл не має.
34
-
35
- Окрім експорту, модуль містить **top-level side-effect-блок** (поза `run`), який спрацьовує лише коли файл є точкою входу процесу — див. секцію _Потік виконання_.
36
-
37
- ### Сигнатура `run`
38
-
39
- ```js
40
- export function run(ctx)
41
- ```
42
-
43
- - **Параметри:**
44
- - `ctx` _(optional)_ — об’єкт типу `RuleContext` (з `../../scripts/lib/run-standard-rule.mjs`). Передається оркестратором, коли правило запускають у складі загального прогону «всіх правил». Може містити, зокрема, спільний `walkCache` (для уникнення повторного `walk`/`glob` файлів кожним правилом), накопичений summary, прапори дебагу тощо.
45
- - **Повертає:** `Promise<number>` — exit-код прогону: `0` коли правило не знайшло порушень або успішно їх виправило, `1` коли лишились незавершені порушення чи виникла помилка.
46
- - **Side effects:** делегуються у `runStandardRule` — це може бути запис у файли проєкту (auto-fix), читання конфіга/файлів, запис у stdout/stderr (summary, прогрес-логи), а також модифікація переданого `ctx` (наприклад, заповнення `walkCache`).
47
-
48
- ## Функції
49
-
50
- ### `run(ctx)`
51
-
52
- **Сигнатура:** `export function run(ctx) → Promise<number>`
53
-
54
- **Призначення:** library-API правила `docker` для CLI-оркестратора `@nitra/cursor`. Виконує повний fix-pipeline правила: `applies → JS-concerns → policy → mdc-refs`.
55
-
56
- **Параметри:**
57
-
58
- - `ctx` — _(optional, об’єкт)_ контекст прогону, який передає зовнішній оркестратор. Тип описаний у JSDoc-import-посиланні `import('../../scripts/lib/run-standard-rule.mjs').RuleContext`. Може містити:
59
- - `walkCache` — спільний кеш обходу/glob файлів, щоб правила не дублювали I/O;
60
- - інші службові поля (summary-агрегатор, прапори, конфіг), залежно від реалізації `run-standard-rule.mjs`.
61
- - Якщо викликати без аргументу, `runStandardRule` створить свій локальний контекст за замовчуванням.
62
-
63
- **Повертає:** `Promise<number>` — exit-код. За конвенцією репозиторію: `0` — порушень не знайдено / усе виправлено, `1` — лишились порушення або сталася помилка.
64
-
65
- **Side effects:** не виконує жодних побічних ефектів безпосередньо — лише повертає результат виклику `runStandardRule(import.meta.dirname, ctx)`. Усе I/O й auto-fix належить `runStandardRule` (читання файлів проєкту, потенційні модифікації файлів, запис у stdout, мутація `ctx.walkCache`).
66
-
67
- **Ключова деталь:** першим аргументом у `runStandardRule` передається `import.meta.dirname` — абсолютний шлях до теки, в якій лежить цей `fix.mjs`. Звідти `runStandardRule` витягує ID правила (`docker` — остання частина шляху) і завантажує підкомпоненти з `js/`, `lint/`, `policy/`. Завдяки цьому `fix.mjs` цілком універсальний і не містить літерала `"docker"`.
68
-
69
- ## Залежності
70
-
71
- ### Внутрішні (з самого пакета `@nitra/cursor`)
72
-
73
- | Імпорт | Звідки | Призначення |
74
- | ----------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
75
- | `isRunAsCli` | `../../scripts/lib/run-rule-cli.mjs` | Детектор «чи запущено цей файл як головний модуль процесу (CLI)». Зазвичай порівнює `import.meta.url` з `pathToFileURL(process.argv[1])`. |
76
- | `runRuleCli` | `../../scripts/lib/run-rule-cli.mjs` | Standalone-обгортка: завантаження конфігу, застосування whitelist, друк summary, повернення exit-коду. Еквівалент `npx @nitra/cursor fix <id>`. |
77
- | `runStandardRule` | `../../scripts/lib/run-standard-rule.mjs` | Універсальний fix-pipeline правила: послідовно прогоняє фази `applies → JS-concerns → policy → mdc-refs`, читаючи реалізації з підтек правила. |
78
-
79
- Розв’язання шляхів:
80
-
81
- - `../../scripts/lib/...` від `npm/rules/docker/fix.mjs` → `npm/scripts/lib/run-rule-cli.mjs` і `npm/scripts/lib/run-standard-rule.mjs`.
82
-
83
- ### Зовнішні
84
-
85
- Власних `node:`/npm-залежностей файл не імпортує. Опосередковано (через `runStandardRule` і `runRuleCli`) використовуються стандартні модулі для роботи з FS/процесом, але до цього файлу це не належить.
86
-
87
- ### Структурні залежності (runtime-конвенції)
88
-
89
- Хоч `fix.mjs` нічого з них не імпортує статично, для коректної роботи правила в директорії `npm/rules/docker/` мають існувати:
90
-
91
- - `meta.json` — метадані правила (ID, опис, applies-умови);
92
- - `docker.mdc` — Cursor rule-документ, на який звіряються mdc-refs;
93
- - `js/` — JS-специфічні fix-чеки правила (фаза _JS-concerns_);
94
- - `lint/` — lint-перевірки (читаються відповідним check-режимом);
95
- - `policy/` — policy-перевірки (фаза _policy_).
96
-
97
- `runStandardRule` сам шукає й підвантажує ці компоненти за `import.meta.dirname`.
98
-
99
- ## Потік виконання / Використання
100
-
101
- ### Сценарій 1 — Library mode (виклик з оркестратора)
102
-
103
- Так правило запускає `@nitra/cursor` під час команд типу `npx @nitra/cursor fix` (усі правила) або `npx @nitra/cursor fix docker` (одне правило, але через диспетчер):
104
-
105
- 1. Оркестратор робить динамічний `import('npm/rules/docker/fix.mjs')`.
106
- 2. Отримує функцію `run` з експортів.
107
- 3. Підготовлює спільний `ctx` (наприклад, з `walkCache`) і викликає `await run(ctx)`.
108
- 4. `run` повертає управління у `runStandardRule(import.meta.dirname, ctx)`, який:
109
- - визначає ID правила як `basename(import.meta.dirname)` = `docker`;
110
- - читає `meta.json` правила;
111
- - виконує фазу `applies` — пропускає правило, якщо воно нерелевантне;
112
- - запускає JS-concerns → policy → mdc-refs;
113
- - повертає exit-код (`0`/`1`).
114
- 5. Оркестратор додає результат до загального summary й переходить до наступного правила.
115
-
116
- Гілка `if (isRunAsCli(...))` у цьому сценарії **не виконується**, бо файл імпортовано як модуль, а не запущено напряму.
117
-
118
- ### Сценарій 2 — Standalone mode (прямий запуск)
119
-
120
- Використовується розробником або IDE/CI-кроком напряму, без проходу через головний `bin/cursor.mjs`:
121
-
122
- ```bash
123
- bun npm/rules/docker/fix.mjs
124
- # або
125
- node npm/rules/docker/fix.mjs
126
- ```
127
-
128
- 1. Node/Bun виконує файл як модуль-точку входу.
129
- 2. Імпорти на верхньому рівні підтягують `isRunAsCli`, `runRuleCli`, `runStandardRule`.
130
- 3. Експорт `run` реєструється (на випадок, якщо хтось одночасно імпортує цей файл).
131
- 4. Виконується top-level блок:
132
-
133
- ```js
134
- if (isRunAsCli(import.meta.url)) {
135
- process.exit(await runRuleCli(import.meta.dirname))
136
- }
137
- ```
138
-
139
- - `isRunAsCli(import.meta.url)` повертає `true`, бо файл є головним модулем процесу.
140
- - `await runRuleCli(import.meta.dirname)` виконує повноцінний standalone-pipeline: завантаження конфіга, whitelist, виклик внутрішнього аналогу `run` (тобто `runStandardRule`), друк summary.
141
- - `process.exit(<code>)` завершує процес із отриманим exit-кодом, щоб CI / IDE могли правильно інтерпретувати успіх/помилку.
142
-
143
- 5. Коментарі в коді явно фіксують виняток ESLint: `n/no-process-exit` і `unicorn/no-process-exit` свідомо вимкнено саме для цього рядка, бо standalone-ентрі **зобов’язаний** повертати exit-код процесу.
144
-
145
- ### Інваріанти / контракти
146
-
147
- - ID правила завжди дорівнює імені теки, де лежить `fix.mjs` (тут — `docker`). Хардкод відсутній — переміщення в іншу теку автоматично змінить ID, тому файл не можна копіювати без перейменування теки.
148
- - `run` має лишатися **named export** `run` (не default) — оркестратор шукає саме це ім’я.
149
- - Top-level `await runRuleCli(...)` працює завдяки тому, що файл є ES-модулем (`.mjs`) із підтримкою top-level await.
150
- - Гілка `isRunAsCli` повинна лишатися **єдиним** side-effect блоком на верхньому рівні; будь-яка інша робота на модульному рівні зламає library mode.
151
-
152
- ## Rebuild Test
153
-
154
- З цієї документації можна реконструювати файл-еквівалент:
155
-
156
- ```js
157
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
158
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
159
-
160
- /**
161
- * Запускає правило: applies → JS-concerns → policy → mdc-refs.
162
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
163
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx]
164
- * @returns {Promise<number>} 0 — OK, 1 — порушення
165
- */
166
- export function run(ctx) {
167
- return runStandardRule(import.meta.dirname, ctx)
168
- }
169
-
170
- if (isRunAsCli(import.meta.url)) {
171
- // Standalone-ентрі: повний еквівалент `npx @nitra/cursor fix <id>`.
172
- // eslint-disable-next-line n/no-process-exit
173
- process.exit(await runRuleCli(import.meta.dirname))
174
- }
175
- ```
176
-
177
- Семантично та функціонально такий код тотожний оригіналу: дві ролі модуля (library `run` + standalone main), делегування у `runStandardRule`/`runRuleCli`, ID правила визначається через `import.meta.dirname`, exit-код процесу повертається лише у standalone-режимі.
35
+ - Read-only: файл не виконує операцій запису у файлову систему.
36
+ - Кешує результати в межах одного прогону.
37
+ - Не звертається до мережі.
@@ -1,210 +1,39 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/efes/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # `fix.mjs` — entry-point правила `efes`
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `npm/rules/efes/fix.mjs` це **уніфікований entry-point** одного з правил пакету `@nitra/cursor` (правило `efes`, директорія `npm/rules/efes/`). Він виконує дві ролі одночасно:
12
+ Виконує застосування політики JS-занепокоєних та політики на наданому контексті прогону, генеруючи посилання MDC та повертаючи результат.
12
13
 
13
- 1. **Library mode** експортує функцію `run(ctx)`, яку викликає CLI-оркестратор `@nitra/cursor` (через динамічний `import` модуля та виклик `run()` із підготовленим контекстом).
14
- 2. **Standalone mode** — якщо файл запущено напряму (наприклад, `bun npm/rules/efes/fix.mjs`), він виконує повний CLI-цикл правила (завантаження конфігу, whitelist, summary), еквівалентний `npx @nitra/cursor fix efes`, і завершує процес із відповідним exit-кодом для CI/IDE.
14
+ Виконується при запуску через командний рядок, виконуючи повний еквівалент команди `npx @nitra/cursor fix <id>` та повертаючи код виходу.
15
15
 
16
- Сам файл навмисно мінімальний — уся реальна логіка (виконання `applies → JS-concerns → policy → mdc-refs`) делегована у спільну бібліотечну функцію `runStandardRule`, що живе у `npm/scripts/lib/run-standard-rule.mjs`. Тому цей файл слугує лише **тонкою обгорткою (shim)** для одного конкретного правила `efes`, прив’язуючись до власної директорії через `import.meta.dirname`.
16
+ ## Поведінка
17
17
 
18
- Така архітектура — стандартна для всіх правил із сімейства `npm/rules/<id>/fix.mjs`: одне правило = одна директорія = один однаковий `fix.mjs`, який відрізняється від сусідів лише розміщенням (`import.meta.dirname` бере шлях до **цієї** директорії правила).
18
+ 1. Запуск правила.
19
+ * Приймає контекст прогону.
20
+ * Виконує застосування JS-занепокоєних.
21
+ * Застосовує політику.
22
+ * Генерує посилання MDC.
23
+ * Повертає результат прогону.
19
24
 
20
- ## Експорти / API
25
+ 2. Запуск у режимі CLI.
26
+ * Виконується при запуску через CLI.
27
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
28
+ * Повертає код виходу.
21
29
 
22
- | Експорт | Тип | Призначення |
23
- | ------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
24
- | `run` | `(ctx?: RuleContext) => Promise<number>` | Library API — викликається CLI-оркестратором `@nitra/cursor` для запуску правила в межах одного спільного прогону над монорепо. |
30
+ ## Публічний API
25
31
 
26
- Інших іменованих або дефолтних експортів файл не має. Окрім експорту, файл містить **side-effect блок** (top-level `if (isRunAsCli(...))`), що активується тільки коли файл запущено напряму.
32
+ run запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
33
+ Library mode — викликається CLI orchestration через `import + run`.
27
34
 
28
- ### Сигнатура `run`
35
+ ## Гарантії поведінки
29
36
 
30
- ```js
31
- export function run(ctx)
32
- ```
33
-
34
- - **Параметри**:
35
- - `ctx` _(optional)_ — об’єкт типу `RuleContext`, імпортований із `npm/scripts/lib/run-standard-rule.mjs`. Містить розділяємий між правилами стан прогону: зокрема `walkCache` (кеш обходу файлів монорепо), а також іншу контекстну інформацію, передану CLI-оркестратором. Якщо `ctx` не передано (наприклад, при ad-hoc виклику), `runStandardRule` створює власний внутрішній контекст.
36
- - **Повертає**: `Promise<number>` —
37
- - `0` — правило не знайшло порушень (OK);
38
- - `1` — є щонайменше одне порушення (fail).
39
- - **Сторонні ефекти**:
40
- - Сам `run` нічого не пише в `stdout`/`stderr` напряму, проте делегована функція `runStandardRule` веде логування прогресу, виводить summary порушень і — за потреби — модифікує файли проєкту (`autofix`).
41
- - Може читати файлову систему монорепо (через walk), читати конфіг `@nitra/cursor` та `meta.json` правила.
42
- - Не викликає `process.exit` у library mode — exit-код доручений викликаючій стороні.
43
-
44
- ## Функції
45
-
46
- ### `run(ctx)`
47
-
48
- #### Сигнатура
49
-
50
- ```js
51
- /**
52
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
53
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
54
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
55
- * @returns {Promise<number>} 0 — OK, 1 — порушення
56
- */
57
- export function run(ctx) {
58
- return runStandardRule(import.meta.dirname, ctx)
59
- }
60
- ```
61
-
62
- #### Параметри
63
-
64
- | Ім’я | Тип | Обов’язковий | Опис |
65
- | ----- | -------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
66
- | `ctx` | `RuleContext` (див. `run-standard-rule.mjs`) | ні | Спільний контекст прогону, який оркестратор `@nitra/cursor` створює один раз для всієї пачки правил. Дозволяє ділити дорогий стан (наприклад, `walkCache` — список відсканованих файлів) між правилами без повторного обходу ФС. |
67
-
68
- #### Повертає
69
-
70
- `Promise<number>` — `0` або `1`. Семантика — звичайна для UNIX exit codes:
71
-
72
- - `0` — все добре, правило `efes` не зафіксувало порушень.
73
- - `1` — правило знайшло хоча б одне порушення (CI має впасти).
74
-
75
- #### Логіка
76
-
77
- Функція складається з єдиного рядка — `return runStandardRule(import.meta.dirname, ctx)`. Тобто:
78
-
79
- 1. Беремо абсолютний шлях директорії, у якій лежить **цей** `fix.mjs` (`import.meta.dirname` дає `.../npm/rules/efes`).
80
- 2. Передаємо цей шлях як перший аргумент у `runStandardRule` — щоб бібліотечна функція знала, **яке саме правило** запускає (звідки читати `meta.json`, `efes.mdc`, `policy/*` тощо).
81
- 3. Передаємо отриманий `ctx` (або `undefined`).
82
- 4. Повертаємо отриману `Promise<number>` — без обгортки, без додаткової обробки.
83
-
84
- #### Сторонні ефекти
85
-
86
- Усі побічні ефекти зосереджені всередині `runStandardRule` (читання файлів, walk, виконання checks, можливі autofix-записи). Сам `run` лише проксує виклик.
87
-
88
- ### Top-level CLI-блок (без імені, не функція)
89
-
90
- ```js
91
- if (isRunAsCli(import.meta.url)) {
92
- // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
93
- process.exit(await runRuleCli(import.meta.dirname))
94
- }
95
- ```
96
-
97
- #### Поведінка
98
-
99
- - Виконується **тільки** коли модуль запущено як CLI-точку входу (`bun npm/rules/efes/fix.mjs` або `node ...`). Перевірка `isRunAsCli(import.meta.url)` порівнює URL модуля з `process.argv[1]` (стандартна ідіома для ESM).
100
- - Якщо умова виконалась — асинхронно (через `await` на top-level, що дозволяє ESM) викликає `runRuleCli(import.meta.dirname)`, який реалізує **повний CLI-цикл**:
101
- - завантаження конфігу `@nitra/cursor`;
102
- - застосування whitelist/ignore;
103
- - запуск самого правила (через ту саму `runStandardRule` або еквівалентний механізм);
104
- - друк summary;
105
- - повернення exit-коду.
106
- - Завершує процес через `process.exit(...)` із отриманим кодом (0 або 1).
107
-
108
- #### Чому є коментар `eslint-disable-next-line`
109
-
110
- У проєкті заборонено `process.exit` (`n/no-process-exit`, `unicorn/no-process-exit`) — але standalone entry-point **повинен** повертати exit-код, інакше CI не зрозуміє результат. Виключення оформлене явним коментарем із поясненням («standalone entry-point має повертати exit-code для CI/IDE»), щоб лінт не падав.
111
-
112
- #### Чому є подвійний кінець рядка / два правила в одному disable
113
-
114
- Бо обидва правила (`n/no-process-exit` від `eslint-plugin-n` і `unicorn/no-process-exit` від `eslint-plugin-unicorn`) забороняють те саме незалежно — disable має покривати обидва.
115
-
116
- ## Залежності
117
-
118
- ### Внутрішні (з того ж монорепо)
119
-
120
- | Шлях | Що імпортується | Призначення |
121
- | ----------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
122
- | `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | `isRunAsCli` — детектор «модуль виконано напряму». `runRuleCli` — повний CLI-обгортка для standalone-режиму (config loading, whitelist, summary). |
123
- | `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule`, тип `RuleContext` (через JSDoc) | Бібліотечна реалізація стандартного потоку правила: `applies → JS-concerns → policy → mdc-refs`. |
124
-
125
- Шляхи з `../../` ведуть на `npm/scripts/lib/` (бо файл лежить у `npm/rules/efes/`).
126
-
127
- ### Зовнішні
128
-
129
- Жодних `npm`-залежностей файл не імпортує напряму — усі вони транзитивно підвантажуються через `runStandardRule` / `runRuleCli`.
130
-
131
- ### Файли поруч (через `import.meta.dirname`)
132
-
133
- Бібліотечні функції очікують у директорії правила (`npm/rules/efes/`) певні файли — їх імпортує не `fix.mjs` напряму, а саме `runStandardRule`/`runRuleCli`:
134
-
135
- - `meta.json` — метадані правила (id, applies, policy hints, тощо);
136
- - `efes.mdc` — людиночитаний опис правила (Markdown + frontmatter);
137
- - `policy/` — директорія з policy-чеками правила.
138
-
139
- ## Потік виконання / Використання
140
-
141
- ### Сценарій A — виклик з CLI `@nitra/cursor` (library mode)
142
-
143
- ```text
144
- $ npx @nitra/cursor fix
145
- └─ CLI оркестратор будує список правил і прогонить кожне:
146
- └─ import('npm/rules/efes/fix.mjs')
147
- └─ run(ctx)
148
- └─ runStandardRule('.../npm/rules/efes', ctx)
149
- ├─ читає meta.json + efes.mdc
150
- ├─ застосовує applies-фільтри
151
- ├─ запускає JS-concerns (eslint-подібні чеки)
152
- ├─ запускає policy/* (специфічні чеки правила)
153
- └─ перевіряє mdc-refs (узгодженість документації)
154
- └─ повертає 0 / 1
155
- └─ оркестратор агрегує exit-коди всіх правил
156
- ```
157
-
158
- У цьому сценарії **жодних виходів через `process.exit`** із цього файлу — exit-код повертає оркестратор уже наприкінці всього прогону.
159
-
160
- ### Сценарій B — прямий запуск файлу (standalone mode)
161
-
162
- ```text
163
- $ bun npm/rules/efes/fix.mjs
164
-
165
- 1. ESM завантажує модуль.
166
- 2. На етапі імпорту виконуються top-level statements.
167
- 3. `isRunAsCli(import.meta.url)` -> true.
168
- 4. `await runRuleCli(import.meta.dirname)`:
169
- - повністю емулює `npx @nitra/cursor fix efes`;
170
- - завантажує конфіг проєкту, whitelist;
171
- - запускає правило;
172
- - виводить summary в stdout/stderr.
173
- 5. `process.exit(<code>)` — повертає exit-код shell-у / CI / IDE.
174
- ```
175
-
176
- Це зручно для:
177
-
178
- - швидкого ad-hoc запуску однієї конкретної перевірки під час дебагу правила;
179
- - інтеграції в IDE-таски (наприклад, окремі run configurations VSCode/JetBrains);
180
- - ізольованого прогону в pre-commit hook на одне правило.
181
-
182
- ### Сценарій C — імпорт із тестів
183
-
184
- ```js
185
- import { run } from 'npm/rules/efes/fix.mjs'
186
-
187
- const code = await run() // 0 або 1
188
- ```
189
-
190
- CLI-блок **не запускається** (бо файл не є entry-point процесу), а `run` доступний як звичайна функція. Це дає змогу писати unit/e2e-тести правила без spawn-у дочірнього процесу.
191
-
192
- ### Інваріанти / нюанси
193
-
194
- - `import.meta.dirname` доступний у Node ≥ 20.11 та Bun. Якщо середовище старіше — потрібен fallback через `path.dirname(fileURLToPath(import.meta.url))`. У монорепо `@nitra/cursor` офіційно підтримується Bun-середовище, тому це не проблема.
195
- - Top-level `await` працює тільки в ESM (`.mjs`) — саме тому файл має розширення `.mjs`, а не `.js`.
196
- - Дві ролі файлу (library + standalone) — це усвідомлений патерн «dual entry-point»: ESM-import не запускає CLI-блок, бо `isRunAsCli` повертає `false`.
197
- - Файл навмисно ідентичний по структурі з усіма іншими `npm/rules/<id>/fix.mjs`. Уся специфіка правила `efes` живе в сусідніх файлах (`meta.json`, `efes.mdc`, `policy/`) — у самому `fix.mjs` нічого правило-специфічного немає, окрім розташування.
198
-
199
- ## Rebuild Test
200
-
201
- Уявно «перебудувавши» файл лише за цією документацією, маємо отримати:
202
-
203
- - ESM-модуль `.mjs` із двома імпортами зі спільної бібліотеки `npm/scripts/lib/`:
204
- - `{ isRunAsCli, runRuleCli }` із `../../scripts/lib/run-rule-cli.mjs`;
205
- - `{ runStandardRule }` із `../../scripts/lib/run-standard-rule.mjs`.
206
- - Один іменований експорт `run(ctx)` із JSDoc, що описує параметр `ctx` як `RuleContext` (тип взято через `import('...')` JSDoc-нотацію) і повертає `Promise<number>` (`0` — OK, `1` — порушення). Тіло — один рядок `return runStandardRule(import.meta.dirname, ctx)`.
207
- - Top-level guard `if (isRunAsCli(import.meta.url)) { process.exit(await runRuleCli(import.meta.dirname)) }` із коментарем-disable для двох ESLint-правил (`n/no-process-exit`, `unicorn/no-process-exit`) і поясненням «standalone entry-point має повертати exit-code для CI/IDE».
208
- - Жодних інших declarations, експортів чи побічних ефектів.
209
-
210
- Такий «реконструйований» файл функціонально й текстово збігається з оригіналом `npm/rules/efes/fix.mjs`.
37
+ - Read-only: файл не виконує операцій запису у файлову систему.
38
+ - Кешує результати в межах одного прогону.
39
+ - Не звертається до мережі.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/feedback/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
5
  score: 100
6
6
  ---
7
7
 
@@ -9,19 +9,21 @@ docgen:
9
9
 
10
10
  ## Огляд
11
11
 
12
- Модуль виконує задану перевірку, ініціалізуючи її з локального файлу конфігурації. При запуску як окрема програма, він завантажує конфігурацію, перевіряє білий список та надає звіт про результати виконання. Результат виконання правила повертається як код виходу.
12
+ Виконує обробку JS-занепокоєних на наданому контексті прогону. Застосовує визначену політику та генерує посилання MDC. Повертає результат прогону.
13
13
 
14
14
  ## Поведінка
15
15
 
16
- 1. Викликається функція `run` для виконання правила.
17
- 2. Виконання правила відбувається шляхом ініціалізації стандартного правила з директорії цього файлу.
18
- 3. Якщо код виконується як окрема утиліта (standalone), ініціюється повний запуск правила.
19
- 4. Запуск правила як окремої утиліти включає завантаження конфігурації, перевірку білого списку та підведення підсумків.
20
- 5. Результат цього запуску повертається як код виходу.
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання MDC.
21
+ * Повертає результат прогону.
21
22
 
22
23
  ## Публічний API
23
24
 
24
- run — виконує послідовність перевірок: застосовує правила, аналізує JS-занепокоєння, порівнює з політикою та перевіряє посилання MDC.
25
+ run — запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
26
+ Library mode — викликається CLI orchestration через `import + run`.
25
27
 
26
28
  ## Гарантії поведінки
27
29
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/ga/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
5
  score: 100
6
6
  ---
7
7
 
@@ -9,16 +9,21 @@ docgen:
9
9
 
10
10
  ## Огляд
11
11
 
12
- Модуль відповідає за запуск механізму виконання стандартного правила. Він шукає та застосовує правила, використовуючи поточний каталог як джерело. При запуску як окрема програма, він ініціює виконання команди, необхідної для застосування цього правила.
12
+ Виконує обробку JS-занепокоєних на наданому контексті прогону. Застосовує визначену політику та генерує посилання MDC. Повертає результат прогону.
13
13
 
14
14
  ## Поведінка
15
15
 
16
- 1. Викликає механізм виконання стандартного правила, використовуючи поточний каталог як джерело правил.
17
- 2. Якщо скрипт виконується як окрема програма, запускає оркестрацію командного рядка для виконання правила.
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання MDC.
21
+ * Повертає результат прогону.
18
22
 
19
23
  ## Публічний API
20
24
 
21
- run — виконує послідовність дій: застосовує правила, обробляє JS-занепокоєння, перевіряє політику та посилання MDC.
25
+ run — запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
26
+ Library mode — викликається CLI orchestration через `import + run`.
22
27
 
23
28
  ## Гарантії поведінки
24
29