@nitra/cursor 5.3.4 → 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 (151) 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 +11 -0
  4. package/bin/n-cursor.js +43 -22
  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-ignore.mjs +2 -1
  22. package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
  23. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  24. package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
  25. package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
  26. package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +1 -1
  27. package/{skills → rules}/doc-files/js/docs/docgen-gen.md +1 -1
  28. package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
  29. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  30. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  31. package/rules/doc-files/js/docs/lint.md +36 -0
  32. package/rules/doc-files/js/docs/units-js.md +31 -0
  33. package/rules/doc-files/js/docs/units-rs.md +35 -0
  34. package/rules/doc-files/js/docs/units.md +30 -0
  35. package/rules/doc-files/js/lint.mjs +96 -0
  36. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  37. package/rules/doc-files/lint/docs/lint.md +37 -0
  38. package/rules/doc-files/lint/lint.mjs +105 -0
  39. package/rules/doc-files/meta.json +1 -0
  40. package/rules/docker/docs/fix.md +21 -161
  41. package/rules/efes/docs/fix.md +23 -194
  42. package/rules/feedback/docs/fix.md +10 -8
  43. package/rules/ga/docs/fix.md +10 -5
  44. package/rules/graphql/docs/fix.md +23 -119
  45. package/rules/hasura/docs/fix.md +19 -5
  46. package/rules/hasura/js/docs/internal_urls.md +34 -307
  47. package/rules/image-avif/docs/fix.md +16 -127
  48. package/rules/image-compress/docs/fix.md +20 -141
  49. package/rules/image-compress/js/docs/package_setup.md +22 -182
  50. package/rules/js-bun-db/docs/fix.md +23 -139
  51. package/rules/js-bun-db/js/docs/safety.md +33 -221
  52. package/rules/js-bun-redis/docs/fix.md +25 -114
  53. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  54. package/rules/js-lint/docs/fix.md +30 -108
  55. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  56. package/rules/js-lint/js/docs/lint.md +22 -238
  57. package/rules/js-lint/js/docs/tooling.md +34 -331
  58. package/rules/js-lint-ci/docs/fix.md +16 -149
  59. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  60. package/rules/js-mssql/docs/fix.md +18 -123
  61. package/rules/js-mssql/js/docs/deps.md +28 -251
  62. package/rules/js-run/docs/fix.md +23 -138
  63. package/rules/js-run/js/docs/runtime.md +24 -378
  64. package/rules/k8s/docs/fix.md +18 -123
  65. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  66. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  67. package/rules/npm-module/docs/fix.md +27 -89
  68. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  69. package/rules/npm-module/js/docs/package_structure.md +36 -258
  70. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  71. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  72. package/rules/php/docs/fix.md +21 -98
  73. package/rules/php/js/docs/tooling.md +20 -143
  74. package/rules/python/docs/fix.md +25 -157
  75. package/rules/python/js/docs/applies.md +20 -98
  76. package/rules/python/js/docs/tooling.md +27 -144
  77. package/rules/rego/docs/fix.md +24 -112
  78. package/rules/rego/js/docs/applies.md +20 -164
  79. package/rules/rego/js/docs/lint.md +15 -110
  80. package/rules/release/docs/fix.md +16 -114
  81. package/rules/rust/docs/fix.md +24 -119
  82. package/rules/rust/js/docs/applies.md +20 -129
  83. package/rules/security/docs/fix.md +21 -78
  84. package/rules/security/js/docs/sample_secret.md +23 -182
  85. package/rules/security/js/docs/trufflehog.md +19 -128
  86. package/rules/style-lint/docs/fix.md +16 -150
  87. package/rules/style-lint/js/docs/lint.md +21 -172
  88. package/rules/style-lint/js/docs/tooling.md +19 -184
  89. package/rules/tauri/docs/fix.md +26 -152
  90. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  91. package/rules/tauri/js/docs/tooling.md +20 -217
  92. package/rules/test/docs/fix.md +19 -127
  93. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  95. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  96. package/rules/test/js/docs/location.md +24 -126
  97. package/rules/test/js/docs/no-process-chdir.md +20 -151
  98. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  99. package/rules/test/js/docs/stryker_config.md +48 -148
  100. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  101. package/rules/text/docs/fix.md +25 -113
  102. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  103. package/rules/text/js/docs/formatting.md +60 -251
  104. package/rules/text/js/docs/lint.md +17 -114
  105. package/rules/vue/docs/fix.md +25 -118
  106. package/rules/vue/js/docs/packages.md +25 -323
  107. package/rules/worktree/docs/fix.md +31 -150
  108. package/scripts/coverage-classify/docs/index.md +23 -209
  109. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  110. package/scripts/dispatcher/docs/trace.md +35 -0
  111. package/scripts/docs/auto-rules.md +37 -361
  112. package/scripts/docs/lint-cli.md +12 -13
  113. package/scripts/docs/post-tool-use-fix.md +16 -15
  114. package/scripts/docs/skills-cli.md +26 -23
  115. package/scripts/docs/sync-claude-config.md +94 -34
  116. package/scripts/docs/worktree-cli.md +11 -34
  117. package/scripts/lib/docs/assert-project-root.md +14 -16
  118. package/scripts/lib/docs/changed-files.md +24 -139
  119. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  120. package/scripts/lib/docs/rule-predicates.md +20 -17
  121. package/scripts/lib/docs/run-rule-cli.md +14 -18
  122. package/scripts/lib/docs/run-rule.md +13 -20
  123. package/scripts/lib/docs/run-standard-rule.md +12 -15
  124. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  125. package/scripts/lib/rule-predicates.mjs +1 -1
  126. package/scripts/sync-claude-config.mjs +4 -1
  127. package/scripts/utils/docs/with-lock.md +19 -12
  128. package/scripts/utils/with-lock.mjs +4 -2
  129. package/skills/doc-aggregate/SKILL.md +2 -2
  130. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  131. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  132. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  133. package/skills/doc-files/.changes/260612-0031.md +5 -0
  134. package/skills/doc-files/.changes/260612-0036.md +5 -0
  135. package/skills/doc-files/.changes/260612-0114.md +5 -0
  136. package/skills/doc-files/SKILL.md +6 -6
  137. package/skills/fix/js/docs/llm-worker.md +17 -15
  138. package/skills/fix/js/docs/orchestrator.md +30 -23
  139. package/skills/fix/js/docs/t0.md +26 -16
  140. package/skills/start-check/js/docs/check.md +26 -22
  141. package/skills/taze/js/docs/diff.md +44 -20
  142. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  143. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  144. package/skills/doc-files/js/docs/units-rs.md +0 -35
  145. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  146. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  147. /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
  148. /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
  149. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  150. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  151. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -1,154 +1,39 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/adr/fix.mjs
4
- crc: b46c541a
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # `npm/rules/adr/fix.mjs`
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `fix.mjs` це **entry-point правила `adr`** у складі пакета `@nitra/cursor`. Він виконує дві ролі одночасно й тримає мінімум власної логіки, делегуючи всю роботу до загальних бібліотечних функцій оркестрації правил:
12
+ Виконує обробку JS-занепокоєних та політики на наданому контексті прогону. Генерація посилання MDC та повернення результату прогону.
12
13
 
13
- 1. **Library mode (бібліотечний режим).** Експортує функцію `run(ctx)`, яку викликає зовнішній оркестратор `@nitra/cursor` (наприклад, команда `npx @nitra/cursor fix adr` або агрегований прогін усіх правил). У цьому режимі правило виконує стандартну послідовність кроків `applies → JS-concerns → policy → mdc-refs` через `runStandardRule`, а контекст (наприклад, спільний `walkCache` для обходу файлів) передається ззовні.
14
- 2. **Standalone mode (самостійний запуск).** Якщо файл запущено напряму як CLI (наприклад, `bun npm/rules/adr/fix.mjs`), він повністю емулює виклик `npx @nitra/cursor fix adr`: завантажує конфіг, застосовує whitelist, виводить summary і повертає процесу exit-code 0/1 для CI/IDE.
14
+ ## Поведінка
15
15
 
16
- Файл сам по собі **не містить** ні логіки перевірки правила ADR, ні визначень policy/mdc-refs — він лише підключає механіку, спільну для всіх правил у директорії `npm/rules/*/fix.mjs`. Власне поведінка правила `adr` визначається сусідніми файлами в каталозі `npm/rules/adr/` (наприклад, `check-adr.mjs`, `.mdc`-файл, конфіг правила), які `runStandardRule` підхоплює за конвенцією на основі `import.meta.dirname`.
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання MDC.
21
+ * Повертає результат прогону.
22
+ 2. Виконання у режимі CLI.
23
+ * Виконується як автономний скрипт.
24
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
25
+ * Виконує завантаження конфігурації.
26
+ * Виконує перевірку дозволених елементів.
27
+ * Генерує зведену інформацію.
28
+ * Визначає код виходу процесу.
17
29
 
18
- ## Експорти / API
30
+ ## Публічний API
19
31
 
20
- Файл публікує один іменований експорт:
32
+ run запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
33
+ Library mode — викликається CLI orchestration через `import + run`.
21
34
 
22
- | Експорт | Тип / сигнатура | Призначення |
23
- | --- | --- | --- |
24
- | `run` | `(ctx?: RuleContext) => Promise<number>` | Запуск правила `adr` у library-режимі через `runStandardRule`. Повертає 0 (OK) або 1 (порушення). |
35
+ ## Гарантії поведінки
25
36
 
26
- Окрім експорту, файл має **top-level side-effect**: блок `if (isRunAsCli(import.meta.url)) { }` виконується одразу при імпорті/запуску модуля та, у разі прямого CLI-запуску, завершує процес викликом `process.exit(...)`. У бібліотечному режимі (`import { run } from '...'`) цей блок не спрацьовує, бо `isRunAsCli` повертає `false`.
27
-
28
- Default-експортів, констант чи класів файл **не** надає.
29
-
30
- ## Функції
31
-
32
- ### `run(ctx)`
33
-
34
- ```js
35
- export function run(ctx) {
36
- return runStandardRule(import.meta.dirname, ctx)
37
- }
38
- ```
39
-
40
- - **Призначення.** Виконати стандартний конвеєр правила `adr`: `applies → JS-concerns → policy → mdc-refs`. Уся механіка делегується бібліотечній функції `runStandardRule`; локальної логіки немає, окрім прокидання директорії правила й контексту.
41
- - **Параметри.**
42
- - `ctx` (необов'язковий) — `RuleContext` із `../../scripts/lib/run-standard-rule.mjs`. Контекст переноситься між викликами різних правил у межах одного запуску оркестратора й може містити, наприклад, кешований обхід файлової системи (`walkCache`), що дозволяє не повторювати дорогі операції для кожного правила. Якщо `ctx` не передано, `runStandardRule` створює власний контекст за замовчуванням.
43
- - **Повертає.** `Promise<number>` — `0`, якщо порушень правила немає; `1`, якщо знайдено хоча б одне порушення. Це **exit-code-сумісний** код, який далі використовується CLI-обгорткою для `process.exit`.
44
- - **Side effects.** У межах самого `run` побічних ефектів **не вводить**; усі ефекти (читання файлів, друк звіту, кешування) виконуються всередині `runStandardRule`. Identифікатор правила визначається неявно через `import.meta.dirname` — тобто директорія, у якій лежить цей `fix.mjs` (`npm/rules/adr`), стає каноном для пошуку всіх supplementary-файлів правила (checks, mdc, конфіг).
45
- - **Помилки.** Власних `try/catch` немає. Якщо `runStandardRule` кидає виняток, він проростає до викликача незмінно. У standalone-режимі винятки обробляються вже не `run`, а `runRuleCli`.
46
-
47
- ### Top-level CLI-блок (не функція, але виконуваний код модуля)
48
-
49
- ```js
50
- if (isRunAsCli(import.meta.url)) {
51
- process.exit(await runRuleCli(import.meta.dirname))
52
- }
53
- ```
54
-
55
- - **Призначення.** Якщо файл запущено як головний модуль (тобто `import.meta.url` відповідає `argv[1]`), активується standalone-режим — еквівалент `npx @nitra/cursor fix adr`.
56
- - **Логіка.**
57
- 1. `isRunAsCli(import.meta.url)` визначає, чи модуль є entry-point процесу (а не імпортовано бібліотечно).
58
- 2. `runRuleCli(import.meta.dirname)` виконує повний CLI-pipeline для правила в цій директорії: завантаження конфігу, застосування whitelist, виклик внутрішнього `run`, друк summary, повернення numeric exit-code.
59
- 3. `process.exit(...)` завершує процес із цим exit-кодом — це потрібно, аби CI/IDE могли інтерпретувати успіх/невдачу.
60
- - **Top-level `await`.** Виклик `await runRuleCli(...)` працює завдяки ESM top-level await (`.mjs`).
61
- - **Pragma-коментар.** Над `process.exit` стоїть `eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` із поясненням: standalone entry-point **повинен** повертати exit-code, тому загальна заборона `process.exit` тут свідомо відключена.
62
- - **Чому два режими в одному файлі.** В коментарі прямо зазначено: "Дві ролі fix.mjs: library (run) + standalone (main)". Це конвенція пакета `@nitra/cursor` — кожне правило має один `fix.mjs`, який можна і `import`-ити, і запускати безпосередньо.
63
-
64
- ## Залежності
65
-
66
- ### Внутрішні (workspace `@nitra/cursor`)
67
-
68
- | Шлях | Імпортовані символи | Роль |
69
- | --- | --- | --- |
70
- | `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | `isRunAsCli` — перевірка, чи модуль є CLI entry-point. `runRuleCli` — повний CLI-pipeline (config + whitelist + summary + exit-code). |
71
- | `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule` | Реалізація стандартного конвеєра правила: `applies → JS-concerns → policy → mdc-refs`. Також звідси походить JSDoc-тип `RuleContext`. |
72
-
73
- Шляхи відносні: з `npm/rules/adr/` два рівні вгору ведуть у `npm/`, далі — `scripts/lib/`.
74
-
75
- ### Зовнішні (npm-пакети)
76
-
77
- Прямих імпортів зовнішніх пакетів файл **не** має. Опосередковано, через бібліотечні модулі, можуть бути задіяні стандартні утиліти Node (`node:fs`, `node:path` тощо) — але це деталь реалізації `runStandardRule` / `runRuleCli`, а не цього файла.
78
-
79
- ### Платформенні вимоги
80
-
81
- - **ESM**. Розширення `.mjs` + використання `import.meta.dirname` і `import.meta.url`.
82
- - **`import.meta.dirname`** — доступне в Node.js ≥ 20.11 та Bun. Без цієї властивості модуль не запрацює.
83
- - **Top-level `await`** — для standalone-блоку.
84
-
85
- ## Потік виконання / Використання
86
-
87
- ### Сценарій 1. Library-режим (виклик із оркестратора)
88
-
89
- ```js
90
- import { run } from '@nitra/cursor/rules/adr/fix.mjs'
91
-
92
- const code = await run({ walkCache /*, … */ })
93
- if (code !== 0) {
94
- // знайдені порушення правила adr
95
- }
96
- ```
97
-
98
- Послідовність кроків усередині `run`:
99
-
100
- 1. `runStandardRule` отримує абсолютний шлях директорії правила (`import.meta.dirname` → `…/npm/rules/adr`).
101
- 2. За конвенціями цієї директорії бібліотека сама знаходить:
102
- - `applies`-фільтр (які файли підпадають під правило),
103
- - JS-concerns-перевірки,
104
- - policy-частину (rego/правила політики, якщо є),
105
- - `mdc-refs` (перевірка посилань на `.mdc`-файли).
106
- 3. Кожен крок виконується послідовно; якщо хоч один знаходить порушення — фінальний exit-code = `1`.
107
- 4. Promise резолвиться числом `0` або `1`.
108
-
109
- Сам файл `fix.mjs` у цьому потоці — **тонка обгортка**: він не приймає рішень і не друкує нічого власноруч.
110
-
111
- ### Сценарій 2. Standalone-режим (запуск напряму)
112
-
113
- ```bash
114
- bun npm/rules/adr/fix.mjs
115
- # або
116
- node npm/rules/adr/fix.mjs
117
- ```
118
-
119
- Послідовність:
120
-
121
- 1. Модуль завантажується, `run` стає експортованим.
122
- 2. Виконується top-level умова `isRunAsCli(import.meta.url)` → `true`.
123
- 3. `runRuleCli(import.meta.dirname)` бере на себе:
124
- - читання конфігу (наприклад, `.cursor`-конфіг або CLI-параметри),
125
- - застосування whitelist (обмеження файлів, які проходять перевірку),
126
- - виклик внутрішньої функції `run` цього ж правила,
127
- - друк підсумкового summary (скільки файлів, скільки порушень),
128
- - повернення exit-code (`0` або `1`).
129
- 4. `process.exit(...)` зупиняє процес із цим кодом — CI/IDE отримують стандартний сигнал успіху/невдачі.
130
-
131
- Цей режим — еквівалент `npx @nitra/cursor fix adr`, але без потреби у глобально встановленому CLI: достатньо мати checkout репозиторію.
132
-
133
- ### Сценарій 3. Імпорт без виконання (рідкісний)
134
-
135
- Якщо файл імпортується умовами, де `import.meta.url !== argv[1]`, спрацьовує лише експорт `run`; CLI-блок мовчазно пропускається. Це і є основою «двох ролей»: ESM-модуль безпечно імпортувати з будь-якого місця без сайд-ефекту запуску процесу.
136
-
137
- ### Контекст у системі правил
138
-
139
- Файл вписується у плаский набір правил `npm/rules/<id>/fix.mjs`. Кожне правило має такий самий каркас, відрізняючись лише іменем директорії (а отже — `import.meta.dirname`) та допоміжними файлами поруч (`check-*.mjs`, `*.mdc` тощо). Логіка спільного pipeline винесена у `scripts/lib/run-standard-rule.mjs` і `scripts/lib/run-rule-cli.mjs`, що робить `fix.mjs` максимально декларативним: він — «адаптер» між директорією правила та оркестратором.
140
-
141
- ## Rebuild Test
142
-
143
- Якщо знищити цей файл і реконструювати з документації вище, відновлювана версія повинна:
144
-
145
- 1. Бути ESM-модулем (`.mjs`).
146
- 2. Імпортувати з `../../scripts/lib/run-rule-cli.mjs` дві іменовані функції: `isRunAsCli` та `runRuleCli`.
147
- 3. Імпортувати з `../../scripts/lib/run-standard-rule.mjs` іменовану функцію `runStandardRule`.
148
- 4. Експортувати функцію `run(ctx)`, яка повертає результат виклику `runStandardRule(import.meta.dirname, ctx)` (без `await`, бо promise повертається як є).
149
- 5. Мати JSDoc-блок до `run` з посиланням на тип `RuleContext` з `run-standard-rule.mjs` та описом `@returns {Promise<number>}` із семантикою `0 — OK, 1 — порушення`.
150
- 6. Містити top-level умову `if (isRunAsCli(import.meta.url))`, всередині якої виконується `process.exit(await runRuleCli(import.meta.dirname))`.
151
- 7. Над `process.exit` мати ESLint-disable-коментар для `n/no-process-exit` та `unicorn/no-process-exit` із поясненням, що standalone entry-point повинен повертати exit-code для CI/IDE.
152
- 8. **Не** містити жодної додаткової логіки правила `adr` всередині — уся механіка делегована бібліотечним функціям.
153
-
154
- Реконструйована версія за цими інваріантами буде функціонально еквівалентною оригіналу.
37
+ - Read-only: файл не виконує операцій запису у файлову систему.
38
+ - Кешує результати в межах одного прогону.
39
+ - Не звертається до мережі.
@@ -1,165 +1,32 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/bun/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # `npm/rules/bun/fix.mjs`
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл є точкою входу для правила `bun` у системі правил `@nitra/cursor`. Він виконує дві ролі одночасно:
12
+ Виконує обробку JS-занепокоєних даних у наданому контексті прогону. Застосовує визначену політику та генерує посилання MDC. Повертає результат прогону.
12
13
 
13
- 1. **Library mode** — експортує функцію `run(ctx)`, яку CLI-оркестрація викликає через динамічний `import(...)`, щоб виконати правило в межах загального батч-прогону всіх правил.
14
- 2. **Standalone mode** — якщо файл запущено напряму через `bun rules/bun/fix.mjs`, він повністю емулює виклик `npx @nitra/cursor fix bun` (з конфіг-завантаженням, whitelist-фільтрацією та фінальним summary) і завершує процес кодом виходу, придатним для CI/IDE.
14
+ ## Поведінка
15
15
 
16
- Власної логіки перевірки/виправлення файл не містить — він делегує роботу стандартному пайплайну правил `runStandardRule`, який послідовно прогонює фази `applies → JS-concerns → policy → mdc-refs` на основі сусідніх файлів правила (`meta.json`, `bun.mdc`, тек `js/`, `policy/`).
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання MDC.
21
+ * Повертає результат прогону.
17
22
 
18
- Цей патерн ідентичний у всіх однотипних правил `npm/rules/<id>/fix.mjs` — фактично це тонкий «диспатчер», який прив’язує конкретне правило (визначене теками-сусідами через `import.meta.dirname`) до загальної інфраструктури запуску.
23
+ ## Публічний API
19
24
 
20
- ## Експорти / API
25
+ run запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
26
+ Library mode — викликається CLI orchestration через `import + run`.
21
27
 
22
- | Експорт | Тип | Опис |
23
- | ------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
24
- | `run` | `function(ctx?: RuleContext): Promise<number>` | Іменований експорт. Точка входу в library-режимі: викликається оркестратором CLI через ESM `import` після динамічного резолву шляху до файлу правила. |
28
+ ## Гарантії поведінки
25
29
 
26
- Default-експорту немає. Окрім `run`, файл має **top-level side-effect**: при виконанні в standalone-режимі (див. нижче) виконує `process.exit(...)` ще до того, як модуль завершить ініціалізацію.
27
-
28
- ## Функції
29
-
30
- ### `run(ctx)`
31
-
32
- ```js
33
- /**
34
- *
35
- */
36
- export function run(ctx) {
37
- return runStandardRule(import.meta.dirname, ctx)
38
- }
39
- ```
40
-
41
- - **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`
42
- - **Параметри:**
43
- - `ctx` — необов’язковий об’єкт контексту прогону, тип `RuleContext` із модуля `../../scripts/lib/run-standard-rule.mjs`. Передається оркестратором, коли кілька правил виконуються в одному батчі та потребують спільного стану (наприклад, `walkCache` — кеш обходу файлової системи, щоб не повторювати `fs.readdir` для тих самих директорій). Якщо `undefined`, `runStandardRule` створює власний контекст за замовчуванням.
44
- - **Повертає:** `Promise<number>` з кодом виходу:
45
- - `0` — правило не знайшло порушень (OK);
46
- - `1` — знайдено порушення (правило завершилося з помилками).
47
- - **Алгоритм:** єдине виконуване твердження — `return runStandardRule(import.meta.dirname, ctx)`. Тут `import.meta.dirname` — абсолютний шлях до теки правила (`npm/rules/bun/`); саме на основі цього шляху `runStandardRule` визначає ідентифікатор правила (остання сегментна назва — `bun`) та підвантажує сусідні артефакти (`meta.json`, `bun.mdc`, скрипти з `js/` та `policy/`).
48
- - **Side effects:**
49
- - Делеговані до `runStandardRule`: читання конфіг-файлу, обхід дерева проєкту згідно з applies-фільтрами, можливі модифікації цільових файлів у фазі JS-concerns / policy, запис лог-повідомлень у stdout.
50
- - Сам `run` не звертається до `process.exit`, не змінює `process.env` і не змінює глобальний стан — повертає чистий `Promise`, який повністю керується викликачем.
51
-
52
- ### Standalone-блок (top-level)
53
-
54
- ```js
55
- if (isRunAsCli(import.meta.url)) {
56
- process.exit(await runRuleCli(import.meta.dirname))
57
- }
58
- ```
59
-
60
- - **Що це:** не функція, а IIFE-подібний top-level guard. Виконується один раз на завантаженні модуля.
61
- - **Умова:** `isRunAsCli(import.meta.url)` повертає `true`, лише коли цей файл стартовано напряму як entry-point (а не імпортовано як модуль із оркестратора). Перевірка зазвичай зводиться до порівняння `import.meta.url` з `pathToFileURL(process.argv[1])`.
62
- - **Дія:** викликає `runRuleCli(import.meta.dirname)`, дочікується резолву та передає результат у `process.exit(...)`. На відміну від `run`, тут запускається повний CLI-pipeline (а не лише стандартне правило): завантаження користувацького конфігу, фільтр whitelist, фінальний summary та форматування виводу.
63
- - **Side effects:**
64
- - Завершує процес Node/Bun із кодом виходу `0` або `1`.
65
- - У файлі присутні директиви `eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` — це свідомий виняток для standalone-точок входу, які повинні повертати exit-code для CI та IDE.
66
- - Використано top-level `await`, тому модуль працює лише в ESM-середовищі з підтримкою TLA (Bun, Node.js 14.8+ у ESM-режимі).
67
-
68
- ## Залежності
69
-
70
- ### Внутрішні (relative imports)
71
-
72
- | Модуль | Імпорти | Призначення |
73
- | ----------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
74
- | `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | Утиліти для standalone-режиму: визначити, чи файл запущено як CLI, та виконати повноцінний CLI-pipeline для одного правила. |
75
- | `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule` | Стандартний рантайм правила: послідовність фаз `applies → JS-concerns → policy → mdc-refs`. Також експортує тип `RuleContext`, на який посилається JSDoc-анотація `run`. |
76
-
77
- ### Зовнішні (npm-пакети, runtime)
78
-
79
- - Зовнішніх npm-залежностей файл не імпортує напряму.
80
- - Опосередковано через `runStandardRule` / `runRuleCli` залучається інфраструктура `@nitra/cursor` (logger, конфіг-парсер, walker файлової системи тощо).
81
-
82
- ### Платформенні залежності
83
-
84
- - ESM (`import`, `import.meta.url`, `import.meta.dirname`).
85
- - Top-level `await` — потрібна Node.js ≥ 14.8 в ESM або Bun.
86
- - `process.exit` — Node/Bun-середовище.
87
-
88
- ### Сусідні артефакти правила (читаються через `import.meta.dirname`)
89
-
90
- Файл сам не імпортує їх явно, але `runStandardRule` / `runRuleCli` підхоплюють з тієї ж теки:
91
-
92
- - `meta.json` — метадані правила (id, applies-патерни, опис тощо).
93
- - `bun.mdc` — людинозрозумілий опис правила у форматі MDC.
94
- - `js/` — JS-concerns (check-/fix-скрипти, що працюють із JS/AST).
95
- - `policy/` — policy-фаза (rego/інші policy-чеки).
96
-
97
- ## Потік виконання / Використання
98
-
99
- ### Сценарій 1: виклик з оркестратора (library mode)
100
-
101
- ```js
102
- import { run } from '@nitra/cursor/rules/bun/fix.mjs'
103
-
104
- const exitCode = await run({ walkCache })
105
- if (exitCode !== 0) {
106
- // правило знайшло порушення
107
- }
108
- ```
109
-
110
- Послідовність:
111
-
112
- 1. Оркестратор резолвить шлях до `fix.mjs` (наприклад, у циклі по `npm/rules/*/fix.mjs`).
113
- 2. Виконує `import(...)` — модуль завантажується, `isRunAsCli(...)` повертає `false`, тому standalone-блок не спрацьовує, `process.exit` не викликається.
114
- 3. Оркестратор отримує іменований експорт `run` і викликає його з підготованим `ctx`.
115
- 4. `run` делегує до `runStandardRule(import.meta.dirname, ctx)`, який:
116
- - читає `meta.json` сусідньої теки;
117
- - проходить фази `applies → JS-concerns → policy → mdc-refs`;
118
- - повертає `0` або `1`.
119
- 5. Оркестратор агрегує коди повернення всіх правил та формує підсумковий exit-code.
120
-
121
- ### Сценарій 2: прямий запуск файлу (standalone mode)
122
-
123
- ```bash
124
- bun npm/rules/bun/fix.mjs
125
- # або
126
- node npm/rules/bun/fix.mjs
127
- ```
128
-
129
- Послідовність:
130
-
131
- 1. Bun/Node стартує модуль як entry-point.
132
- 2. Модуль виконує імпорти `run-rule-cli.mjs` та `run-standard-rule.mjs`.
133
- 3. Створюється експорт `run` (просто зв’язується з функцією).
134
- 4. Перевірка `isRunAsCli(import.meta.url)` повертає `true`.
135
- 5. Виконується `await runRuleCli(import.meta.dirname)` — це **повний** еквівалент `npx @nitra/cursor fix bun`: завантаження конфігу, whitelist-фільтрація, прогон правила, фінальний summary.
136
- 6. Результат (число — exit-code) передається у `process.exit(...)`, процес завершується одразу.
137
-
138
- ### Еквівалентність CLI-команд
139
-
140
- | Спосіб запуску | Внутрішній шлях | Поведінка |
141
- | --------------------------- | --------------------------------------------------------------- | -------------------------------------------------------- |
142
- | `npx @nitra/cursor fix bun` | CLI знаходить правило `bun`, імпортує `run` → `runStandardRule` | Library mode |
143
- | `bun npm/rules/bun/fix.mjs` | Standalone-блок → `runRuleCli` | Standalone mode (повний CLI-pipeline для одного правила) |
144
-
145
- ### Чому дві ролі в одному файлі
146
-
147
- - **Library mode** потрібен для батч-прогону: оркестратор не повинен форкати процес під кожне правило і не повинен дублювати конфіг-завантаження.
148
- - **Standalone mode** потрібен для зручного дебагу одного правила в IDE/CI: достатньо вказати шлях до файлу як entry-point, не запускаючи всю CLI-обгортку.
149
-
150
- Обидві ролі узгоджуються через стандартний `import.meta.dirname` — точку прив’язки до сусідніх артефактів правила.
151
-
152
- ## Rebuild Test
153
-
154
- Якщо файл видалити і відтворити з нуля за цією документацією, мають виконуватись усі наступні твердження:
155
-
156
- 1. Файл містить рівно два імпорти з відносних шляхів: `../../scripts/lib/run-rule-cli.mjs` (іменовані `isRunAsCli`, `runRuleCli`) та `../../scripts/lib/run-standard-rule.mjs` (іменований `runStandardRule`).
157
- 2. Експортується іменована функція `run(ctx)`, яка повертає результат виклику `runStandardRule(import.meta.dirname, ctx)`. `ctx` — необов’язковий параметр.
158
- 3. JSDoc над `run` описує: фази правила (`applies → JS-concerns → policy → mdc-refs`), library-режим (`import + run(ctx)`), тип параметра `RuleContext`, повертає `Promise<number>` з кодами `0`/`1`.
159
- 4. Після експорту функції є top-level guard `if (isRunAsCli(import.meta.url)) { ... }`.
160
- 5. Усередині guard — `process.exit(await runRuleCli(import.meta.dirname))`.
161
- 6. Рядок із `process.exit` має eslint-disable-коментар, що вимикає правила `n/no-process-exit` та `unicorn/no-process-exit` з поясненням, що це standalone entry-point для CI/IDE.
162
- 7. Стандартний коментар поряд із guard пояснює подвійну роль файлу (`library (run) + standalone (main)`) та еквівалентність до `npx @nitra/cursor fix <id>`.
163
- 8. У файлі немає інших експортів, default-експорту, побічних викликів `process.exit` поза guard-блоком та жодних звернень до `process.env`, файлової системи чи мережі — все делеговано в `runStandardRule` / `runRuleCli`.
164
- 9. Файл коректно виконується в Bun і Node.js ≥ 14.8 у ESM-режимі завдяки top-level `await`.
165
- 10. При імпорті як модуль (`import { run } from '.../fix.mjs'`) `process.exit` не викликається — guard повертає `false`.
30
+ - Read-only: файл не виконує операцій запису у файлову систему.
31
+ - Кешує результати в межах одного прогону.
32
+ - Не звертається до мережі.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/capacitor/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
5
  score: 100
6
6
  ---
7
7
 
@@ -9,24 +9,27 @@ docgen:
9
9
 
10
10
  ## Огляд
11
11
 
12
- Модуль ініціює та виконує ключову операцію системи. Він приймає вхідні дані з конфігураційного файлу `config.json` для генерації фінального результату. Файл використовується для запуску процесу та завершення обробки.
12
+ Виконує застосування JS-занепокоєних на вхідний контекст прогону, застосовує визначену політику, генерує посилання MDC та повертає результат
13
13
 
14
14
  ## Поведінка
15
15
 
16
- 1. Запуск перевірки. Викликається функція для виконання правила.
17
-
18
- 2. Виконання правила. Правило застосовується до конфігурації.
19
-
20
- 3. Обробка результату. Функція повертає результат перевірки. Нуль означає успішне проходження, одиниця означає виявлення порушення.
21
-
22
- 4. Режим бібліотеки. Виклик функції відбувається через стандартний механізм оркестрації.
23
-
24
- 5. Режим автономного запуску. Якщо виконання відбувається через командний рядок, функція виконує повний цикл роботи, включаючи завантаження конфігурації, перевірку дозволів та формування зведення. Результат повертається як код виходу для інструментів CI/IDE.
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання MDC.
21
+ * Повертає результат.
22
+ 2. Запуск у режимі CLI.
23
+ * Виконується як повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ * Виконує завантаження конфігурації.
25
+ * Виконує перевірку дозволених записів.
26
+ * Генерує зведену інформацію.
27
+ * Використовує `process.exitCode` для визначення виходу.
25
28
 
26
29
  ## Публічний API
27
30
 
28
- run — Запускає ланцюжок перевірок: applies → JS-concerns → policy → mdc-refs за допомогою runStandardRule.
29
- Library mode — Викликається через CLI оркестрацію за допомогою import + run.
31
+ run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
32
+ Library mode — викликається CLI orchestration через `import + run`.
30
33
 
31
34
  ## Гарантії поведінки
32
35
 
@@ -1,89 +1,77 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/capacitor/js/platforms.mjs
4
- crc: eb8d6293
5
- score: 100
4
+ crc: d102129c
5
+ score: 85
6
6
  ---
7
7
 
8
8
  # platforms.mjs
9
9
 
10
10
  ## Огляд
11
11
 
12
- Модуль інспектує та збирає дані конфігурацій Capacitor для оцінки сумісності версій. Він використовується для перевірки наявності та відповідності версій Capacitor, необхідних для коректної роботи з iOS-проєктами. Функції, такі як `collectCapacitorDataFromAllPackageJson`, забезпечують збір необхідної інформації. Модуль спирається на конфігурації, визначені у файлі `.config.json`. Функція `check` та `isCapacitorRelevantForCheck` застосовуються для визначення релевантності конфігурації. (capacitor.mdc)
12
+ Огляд
13
+
14
+ Цей файл містить інструменти для витягування та перевірки версій Capacitor з залежностей та конфігурацій. Використовується для визначення сумісності версій Capacitor з конфігураціями, а також для збору даних про версії з різних файлів.
13
15
 
14
16
  ## Поведінка
15
17
 
16
18
  capacitorSegmentMinMajor
17
- Витягує мінімальний мажорний номер з частини діапазону npm версій
19
+ Витягує мінімальну мажорну версію з частини діапазону npm версії
18
20
 
19
21
  capacitorVersionRangeMinMajor
20
- Обчислює мінімальний мажорний номер для повного діапазону npm версій з урахуванням `||`
22
+ Витягує мінімальну мажорну версію з повного діапазону npm версії
21
23
 
22
24
  isCapacitorCoreVersionAtLeast8
23
- Перевіряє, чи нижня межа версії Capacitor є більшою або дорівнює заданому мінімуму
25
+ Перевіряє, чи нижня межа версії Capacitor мінімальної версії
24
26
 
25
27
  recordCapacitorFromOnePackageJson
26
- Записує інформацію про залежності Capacitor у накопичувач
28
+ Записує дані Capacitor з об'єкта з залежностей у накопичувач
27
29
 
28
30
  collectCapacitorDataFromAllPackageJson
29
- Рекурсивно шукає та збирає інформацію про залежності Capacitor з усіх `package.json` у репозиторії
31
+ Зчитує дані Capacitor з усіх package.json у дереві
30
32
 
31
33
  hasCapacitorConfigInRoot
32
- Перевіряє наявність конфігураційних файлів Capacitor у корені репозиторію
34
+ Перевіряє наявність конфігурації Capacitor у корені
33
35
 
34
36
  isCapacitorRelevantForCheck
35
- Визначає, чи потрібно застосовувати перевірку Capacitor на основі наявності конфігурації або залежностей
37
+ Визначає, чи потрібно застосовувати перевірку Capacitor
36
38
 
37
39
  walkIosForPodfileSkipPods
38
- Рекурсивно шукає файли `Podfile` у каталозі `ios`, ігноруючи папки `Pods`, `build` та `DerivedData`
40
+ Рекурсивно шукає Podfile у каталозі ios, ігноруючи Pods та build
39
41
 
40
42
  findFirstPodfileUnderIosExcludingPods
41
- Шукає перший знайдений `Podfile` у каталозі `ios`, ухиляючись від кешу CocoaPods
43
+ Знаходить перший Podfile у каталозі ios, усуваючи Pods
42
44
 
43
45
  nitrAObjectAllowsIosCocoaPods
44
- Перевіряє, чи дозволяє об'єкт `nitra` використання `Podfile` на iOS через спеціальні прапори
45
-
46
- extractNitraObjectBodySource
47
- Витягує текст тіла об'єкта `{...}` після маркера `nitra:` у конфігураційному файлі
48
-
49
- nitraObjectBodyStringAllowsCocoaPodsExempt
50
- Перевіряє, чи містить витягнутий текст виняток, який дозволяє пропуск аналізу SPM
51
-
52
- pathJsonShowsNitraCocoapodsExempt
53
- Перевіряє, чи містить об'єкт `nitra` у JSON-файлі виняток, який дозволяє пропуск аналізу SPM
54
-
55
- capacitorConfigTsMjsNitraCocoapodsExempt
56
- Перевіряє, чи містить конфігураційні файли `.ts` або `.mjs` виняток, який дозволяє пропуск аналізу SPM
57
-
58
- isIosCocoaPodsExemptByNitraConfig
59
- Перевіряє, чи дозволяє конфігурація `nitra` використання `Podfile` на iOS
46
+ Перевіряє, чи дозволяє об'єкт nitra використання Podfile
60
47
 
61
48
  check
62
- Виконує повну перевірку конфігурації Capacitor, включаючи перевірку залежностей та налаштувань iOS
49
+ Запускає перевірку відповідності версій Capacitor та конфігурації
63
50
 
64
- Повертає помилку, якщо не знайдено необхідної залежності `@capacitor/core` з версією, сумісною з `MIN_CAPACITOR_MAJOR`
51
+ reportOneCapacitorCoreRange
52
+ Друкує повідомлення про сумісність версії Capacitor з (capacitor.mdc)
65
53
 
66
- Повертає помилку, якщо знайдено `Podfile` на iOS, який не дозволяє використання CocoaPods без винятку `nitra`
54
+ recordCapacitorFromDependencyObject
55
+ Записує дані Capacitor з об'єкта з залежностей у накопичувач
67
56
 
68
57
  ## Публічний API
69
58
 
70
- capacitorSegmentMinMajor — визначає нижню межу для однієї частини діапазону npm.
71
- capacitorVersionRangeMinMajor — визначає мінімальну можливу (нижню) major-версію для повного діапазону npm, включаючи `||`.
72
- isCapacitorCoreVersionAtLeast8 — перевіряє, чи відповідає версія ядру Capacitor мінімальному рівню 8.
73
- recordCapacitorFromOnePackageJson — записує дані Capacitor з одного файлу `package.json`.
74
- collectCapacitorDataFromAllPackageJson — збирає дані Capacitor з усіх `package.json` у дереві, накопичуючи `byPath` та `anyCapacitor`.
59
+ capacitorSegmentMinMajor — визначає найнижчу межу для однієї частини діапазону npm.
60
+ capacitorVersionRangeMinMajor — визначає найнижчу можливу версію major для повного діапазону npm, включаючи `||`.
61
+ isCapacitorCoreVersionAtLeast8 — перевіряє, чи версія Capacitor Core становить мінімум 8.
62
+ recordCapacitorFromOnePackageJson — записує дані Capacitor з одного файлу package.json.
63
+ collectCapacitorDataFromAllPackageJson — зчитує всі package.json з дерева, збирає byPath та anyCapacitor.
75
64
  hasCapacitorConfigInRoot — перевіряє наявність конфігурації Capacitor у кореневому файлі.
76
- isCapacitorRelevantForCheck — визначає, чи слід застосовувати правила, залежно від наявності конфігу або `@capacitor/` у залежностях.
77
- walkIosForPodfileSkipPods — рекурсивно шукає `Podfile` у директорії `ios/`, ігноруючи директорії `Pods` (кеш CocoaPods) та типові build-каталоги.
78
- findFirstPodfileUnderIosExcludingPods — знаходить перший `Podfile` у директорії `ios/`, пропуская директорії `Pods`.
79
- nitrAObjectAllowsIosCocoaPods — перевіряє, чи дозволяє об’єкт `nitra` використовувати `Podfile` (CocoaPods) на iOS (див. (capacitor.mdc); `@nitra/SPM` не аналізується).
80
- check — виконує загальну перевірку.
65
+ isCapacitorRelevantForCheck — визначає, чи слід використовувати правила, залежно від конфігу або `@capacitor/` у залежностях.
66
+ walkIosForPodfileSkipPods — рекурсивно шукає Podfile у ios/, ігноруючи Pods та типові build-каталоги.
67
+ findFirstPodfileUnderIosExcludingPods — знаходить перший Podfile у ios/, виключаючи Pods.
68
+ nitrAObjectAllowsIosCocoaPods — перевіряє, чи дозволяє об'єкт nitra використовувати Podfile на iOS (див. capacitor.mdc та @nitra/).
69
+ check — виконує перевірку.
81
70
 
82
71
  ## Гарантії поведінки
83
72
 
84
73
  - Read-only: файл не виконує операцій запису у файлову систему.
85
74
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
86
- - За невдалої перевірки повертає `false`/`null` замість винятку.
87
- - Кешує результати в межах одного прогону.
75
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
88
76
  - Свідомо пропускає шляхи: `.git`, `node_modules`.
89
77
  - Не звертається до мережі.