@nitra/cursor 5.3.3 → 5.4.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 (157) 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 +17 -0
  4. package/bin/n-cursor.js +43 -22
  5. package/lib/docs/llm.md +23 -12
  6. package/lib/docs/models.md +29 -18
  7. package/lib/docs/omlx-trace.md +51 -0
  8. package/lib/docs/omlx.md +31 -15
  9. package/lib/omlx.mjs +2 -5
  10. package/package.json +1 -1
  11. package/rules/abie/docs/fix.md +17 -11
  12. package/rules/adr/docs/fix.md +25 -140
  13. package/rules/bun/docs/fix.md +18 -151
  14. package/rules/capacitor/docs/fix.md +16 -13
  15. package/rules/capacitor/js/docs/platforms.md +31 -43
  16. package/rules/changelog/docs/fix.md +25 -169
  17. package/rules/ci4/docs/fix.md +11 -14
  18. package/rules/doc-files/doc-files.mdc +60 -0
  19. package/rules/doc-files/docs/fix.md +31 -0
  20. package/rules/doc-files/fix.mjs +19 -0
  21. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  22. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  23. package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
  24. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  25. package/rules/doc-files/js/docs/docgen-extract-anchors.md +45 -0
  26. package/rules/doc-files/js/docs/docgen-extract.md +39 -0
  27. package/rules/doc-files/js/docs/docgen-files-batch.md +35 -0
  28. package/rules/doc-files/js/docs/docgen-gen.md +46 -0
  29. package/rules/doc-files/js/docs/docgen-ignore.md +37 -0
  30. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  31. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  32. package/rules/doc-files/js/docs/lint.md +36 -0
  33. package/rules/doc-files/js/docs/units-js.md +31 -0
  34. package/rules/doc-files/js/docs/units-rs.md +35 -0
  35. package/rules/doc-files/js/docs/units.md +30 -0
  36. package/rules/doc-files/js/lint.mjs +96 -0
  37. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  38. package/rules/doc-files/lint/docs/lint.md +37 -0
  39. package/rules/doc-files/lint/lint.mjs +105 -0
  40. package/rules/doc-files/meta.json +1 -0
  41. package/rules/docker/docs/fix.md +21 -161
  42. package/rules/efes/docs/fix.md +23 -194
  43. package/rules/feedback/docs/fix.md +10 -8
  44. package/rules/ga/docs/fix.md +10 -5
  45. package/rules/graphql/docs/fix.md +23 -119
  46. package/rules/hasura/docs/fix.md +19 -5
  47. package/rules/hasura/js/docs/internal_urls.md +34 -307
  48. package/rules/image-avif/docs/fix.md +16 -127
  49. package/rules/image-compress/docs/fix.md +20 -141
  50. package/rules/image-compress/js/docs/package_setup.md +22 -182
  51. package/rules/js-bun-db/docs/fix.md +23 -139
  52. package/rules/js-bun-db/js/docs/safety.md +33 -221
  53. package/rules/js-bun-redis/docs/fix.md +25 -114
  54. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  55. package/rules/js-lint/docs/fix.md +30 -108
  56. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  57. package/rules/js-lint/js/docs/lint.md +22 -238
  58. package/rules/js-lint/js/docs/tooling.md +34 -331
  59. package/rules/js-lint-ci/docs/fix.md +16 -149
  60. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  61. package/rules/js-mssql/docs/fix.md +18 -123
  62. package/rules/js-mssql/js/docs/deps.md +28 -251
  63. package/rules/js-run/docs/fix.md +23 -138
  64. package/rules/js-run/js/docs/runtime.md +24 -378
  65. package/rules/k8s/docs/fix.md +18 -123
  66. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  67. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  68. package/rules/npm-module/docs/fix.md +27 -89
  69. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  70. package/rules/npm-module/js/docs/package_structure.md +36 -258
  71. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  72. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  73. package/rules/php/docs/fix.md +21 -98
  74. package/rules/php/js/docs/tooling.md +20 -143
  75. package/rules/python/docs/fix.md +25 -157
  76. package/rules/python/js/docs/applies.md +20 -98
  77. package/rules/python/js/docs/tooling.md +27 -144
  78. package/rules/rego/docs/fix.md +24 -112
  79. package/rules/rego/js/docs/applies.md +20 -164
  80. package/rules/rego/js/docs/lint.md +15 -110
  81. package/rules/release/docs/fix.md +16 -114
  82. package/rules/rust/docs/fix.md +24 -119
  83. package/rules/rust/js/docs/applies.md +20 -129
  84. package/rules/security/docs/fix.md +21 -78
  85. package/rules/security/js/docs/sample_secret.md +23 -182
  86. package/rules/security/js/docs/trufflehog.md +19 -128
  87. package/rules/style-lint/docs/fix.md +16 -150
  88. package/rules/style-lint/js/docs/lint.md +21 -172
  89. package/rules/style-lint/js/docs/tooling.md +19 -184
  90. package/rules/tauri/docs/fix.md +26 -152
  91. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  92. package/rules/tauri/js/docs/tooling.md +20 -217
  93. package/rules/test/docs/fix.md +19 -127
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  95. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  96. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  97. package/rules/test/js/docs/location.md +24 -126
  98. package/rules/test/js/docs/no-process-chdir.md +20 -151
  99. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  100. package/rules/test/js/docs/stryker_config.md +48 -148
  101. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  102. package/rules/text/docs/fix.md +25 -113
  103. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  104. package/rules/text/js/docs/formatting.md +60 -251
  105. package/rules/text/js/docs/lint.md +17 -114
  106. package/rules/vue/docs/fix.md +25 -118
  107. package/rules/vue/js/docs/packages.md +25 -323
  108. package/rules/worktree/docs/fix.md +31 -150
  109. package/scripts/coverage-classify/docs/index.md +23 -209
  110. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  111. package/scripts/dispatcher/docs/trace.md +35 -0
  112. package/scripts/docs/auto-rules.md +37 -361
  113. package/scripts/docs/lint-cli.md +12 -13
  114. package/scripts/docs/post-tool-use-fix.md +16 -15
  115. package/scripts/docs/skills-cli.md +26 -23
  116. package/scripts/docs/sync-claude-config.md +94 -34
  117. package/scripts/docs/worktree-cli.md +11 -34
  118. package/scripts/lib/docs/assert-project-root.md +14 -16
  119. package/scripts/lib/docs/changed-files.md +24 -139
  120. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  121. package/scripts/lib/docs/rule-predicates.md +20 -17
  122. package/scripts/lib/docs/run-rule-cli.md +14 -18
  123. package/scripts/lib/docs/run-rule.md +13 -20
  124. package/scripts/lib/docs/run-standard-rule.md +12 -15
  125. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  126. package/scripts/lib/rule-predicates.mjs +1 -1
  127. package/scripts/sync-claude-config.mjs +4 -1
  128. package/scripts/utils/docs/with-lock.md +19 -12
  129. package/scripts/utils/with-lock.mjs +4 -2
  130. package/skills/doc-aggregate/SKILL.md +2 -2
  131. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  132. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  133. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  134. package/skills/doc-files/.changes/260612-0012.md +5 -0
  135. package/skills/doc-files/.changes/260612-0031.md +5 -0
  136. package/skills/doc-files/.changes/260612-0036.md +5 -0
  137. package/skills/doc-files/.changes/260612-0114.md +5 -0
  138. package/skills/doc-files/SKILL.md +6 -6
  139. package/skills/fix/js/docs/llm-worker.md +17 -15
  140. package/skills/fix/js/docs/orchestrator.md +30 -23
  141. package/skills/fix/js/docs/t0.md +26 -16
  142. package/skills/start-check/js/docs/check.md +26 -22
  143. package/skills/taze/js/docs/diff.md +44 -20
  144. package/skills/doc-files/js/docs/docgen-extract-anchors.md +0 -27
  145. package/skills/doc-files/js/docs/docgen-extract.md +0 -29
  146. package/skills/doc-files/js/docs/docgen-files-batch.md +0 -25
  147. package/skills/doc-files/js/docs/docgen-gen.md +0 -30
  148. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  149. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  150. package/skills/doc-files/js/docs/units-rs.md +0 -35
  151. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  152. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  153. /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
  154. /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
  155. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  156. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  157. /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": "quick" }
@@ -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