@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
@@ -1,152 +1,29 @@
1
- # tooling.mjs — перевірка вимог правила `php.mdc`
1
+ ---
2
+ docgen:
3
+ source: npm/rules/php/js/tooling.mjs
4
+ crc: a3e6a475
5
+ score: 95
6
+ ---
2
7
 
3
- ## Огляд
4
-
5
- Модуль `tooling.mjs` реалізує локальну перевірку відповідності PHP-проєкту вимогам внутрішнього правила `php.mdc`. Це частина системи правил Cursor: під кожне правило існує парний `check`-модуль, що повертає exit-code, придатний для запуску в CI або з CLI.
6
-
7
- Цей конкретний модуль покриває **лише ту частину вимог, яку неможливо (або недоречно) перевірити через Rego/conftest** — а саме факт існування файлів у файловій системі:
8
-
9
- - наявність `composer.json` у корені репозиторію;
10
- - наявність `package.json` у корені (його структуру, зокрема скрипт `lint-php`, перевіряє вже Rego-політика `npm/policy/php/package_json/`);
11
- - наявність файлу GitHub Actions workflow `.github/workflows/lint-php.yml` (його вміст, зокрема крок `run: bun run lint-php`, перевіряє Rego-політика `npm/policy/php/lint_php_yml/`).
12
-
13
- Тобто `tooling.mjs` — це **FS-existence чек**. Структурний аналіз JSON/YAML делегований на `npx @nitra/cursor check` (Rego). Така декомпозиція явно прописана в JSDoc-заголовку файлу.
14
-
15
- Модуль є **ESM** (`.mjs`), не має побічних ефектів на рівні імпорту: уся робота виконується всередині експортованої функції `check()`. Робоча директорія — поточна (`process.cwd()`), оскільки всі шляхи передаються в `existsSync` як відносні.
16
-
17
- ## Експорти / API
18
-
19
- | Експорт | Тип | Призначення |
20
- | --------- | ---------- | ------------------------------------------------------------------ |
21
- | `check()` | `function` | Запускає перевірку правила `php.mdc` у поточній робочій директорії |
22
-
23
- Інших експортів немає (default-експорту немає). Імпорт здійснюється як іменований:
24
-
25
- ```js
26
- import { check } from './tooling.mjs'
27
- ```
28
-
29
- ## Функції
30
-
31
- ### `check()`
32
-
33
- **Сигнатура:**
34
-
35
- ```js
36
- export function check(): number
37
- ```
38
-
39
- **Параметри:** немає.
40
-
41
- **Повертає:** `number` — exit-code:
42
-
43
- - `0` — усі перевірки пройшли (`composer.json`, `package.json` та `.github/workflows/lint-php.yml` існують у поточній директорії);
44
- - `1` — хоча б одна перевірка провалилася (`fail` був викликаний принаймні один раз).
45
-
46
- Конкретне значення exit-code формує об’єкт-репортер через `reporter.getExitCode()` — модуль `tooling.mjs` не визначає логіку підрахунку самостійно, а делегує її в `createCheckReporter()`.
47
-
48
- **Алгоритм (по кроках):**
49
-
50
- 1. Створює локальний репортер: `const reporter = createCheckReporter()`.
51
- 2. Розпаковує методи `pass` і `fail` з репортера: `const { pass, fail } = reporter`.
52
- 3. Перевіряє наявність `composer.json` у CWD:
53
- - якщо файл існує → `pass('composer.json існує')`;
54
- - інакше → `fail('composer.json не знайдено в корені — додай (php.mdc)')`.
55
- 4. Перевіряє наявність `package.json` у CWD:
56
- - якщо файл існує → `pass('package.json є (наявність lint-php перевіряє npx @nitra/cursor fix → php.package_json)')`;
57
- - інакше → `fail('package.json не знайдено в корені — додай (php.mdc)')`.
58
- 5. Перевіряє наявність workflow-файлу `.github/workflows/lint-php.yml`:
59
- - якщо файл існує → `pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor fix → php.lint_php_yml)`)`;
60
- - інакше → `fail(`${wfPath} не існує — створи згідно php.mdc`)`.
61
- 6. Повертає `reporter.getExitCode()`.
62
-
63
- **Side effects:**
64
-
65
- - **Файлова система:** виключно **читання** (`existsSync`). Жодних записів/створень файлів.
66
- - **Stdout/stderr:** опосередковано через `pass`/`fail` репортера. Сам модуль не звертається напряму до `console.log` / `process.stdout`. Конкретний канал, формат і обсяг виводу визначає реалізація `createCheckReporter()`.
67
- - **Process exit:** функція **не викликає** `process.exit()` самостійно — вона лише повертає число. Виклик `process.exit(check())` (або еквівалент) — відповідальність викликаючої сторони.
68
- - **Глобальний стан:** не змінюється.
69
- - **CWD-залежність:** усі шляхи відносні, тому результат залежить від поточної робочої директорії на момент виклику.
8
+ # tooling.mjs
70
9
 
71
- **Помилки/винятки:** функція не використовує `try/catch`. `existsSync` синхронна та не кидає виняток для відсутніх файлів — повертає `false`. Винятки можуть прилетіти лише з імпортованих залежностей (`createCheckReporter`), якщо ті змінять контракт; цей модуль їх не обробляє.
72
-
73
- **Ідемпотентність:** так, виклик не змінює стан системи; повторні виклики дадуть той самий результат за тих самих файлів у CWD.
74
-
75
- ## Залежності
76
-
77
- ### Зовнішні (Node.js builtin)
78
-
79
- - **`node:fs`** → іменований імпорт `existsSync`. Використовується для синхронної перевірки наявності файлу/директорії за вказаним шляхом. Імпортується саме через префікс `node:` (явна вказівка на builtin-модуль).
80
-
81
- ### Внутрішні (відносні)
82
-
83
- - **`../../../scripts/lib/check-reporter.mjs`** → іменований імпорт `createCheckReporter`. Фабрика репортера для check-модулів. Очікуваний контракт (виведений із використання в цьому файлі):
84
- - повертає об’єкт із методами `pass(message: string): void` та `fail(message: string): void`;
85
- - має метод `getExitCode(): number`, який повертає `0` за відсутності провалів і `1` (або інше ненульове) за наявності хоча б одного `fail`.
86
-
87
- Шлях `../../../scripts/lib/check-reporter.mjs` відраховується від розташування файлу `npm/rules/php/js/tooling.mjs` й веде до `npm/scripts/lib/check-reporter.mjs`.
88
-
89
- ### Зв’язки з правилами та політиками (контекст екосистеми)
90
-
91
- Модуль явно посилається на сусідні артефакти, які виконують споріднену перевірку (вони **не** імпортуються кодом, але є частиною повного контракту правила `php.mdc`):
92
-
93
- - `npm/policy/php/package_json/` — Rego-політика, що перевіряє наявність скрипта `lint-php` у `package.json`;
94
- - `npm/policy/php/lint_php_yml/` — Rego-політика, що перевіряє крок `run: bun run lint-php` у workflow `lint-php.yml`;
95
- - запускається разом із цим модулем через CLI `npx @nitra/cursor check`.
96
-
97
- ## Потік виконання / Використання
98
-
99
- ### Очікуваний контекст запуску
100
-
101
- Файл є **check-модулем правила `php.mdc`** і інтегрується в систему `@nitra/cursor`. Виклик відбувається з кореня PHP-проєкту, де очікуються:
102
-
103
- - `composer.json` у корені;
104
- - `package.json` у корені (зі скриптом `lint-php`);
105
- - `.github/workflows/lint-php.yml` із кроком, який виконує `bun run lint-php`.
106
-
107
- ### Типовий програмний виклик
108
-
109
- ```js
110
- import { check } from './npm/rules/php/js/tooling.mjs'
111
-
112
- const code = check()
113
- process.exit(code)
114
- ```
115
-
116
- ### Сценарій 1 — усе на місці
117
-
118
- CWD містить `composer.json`, `package.json` і `.github/workflows/lint-php.yml`. Репортер отримує три `pass`-повідомлення, жодного `fail`. `check()` повертає `0`.
119
-
120
- ### Сценарій 2 — немає одного з файлів
121
-
122
- Наприклад, відсутній `.github/workflows/lint-php.yml`. Репортер отримує два `pass` і один `fail` із вказівкою «`.github/workflows/lint-php.yml` не існує — створи згідно php.mdc». `check()` повертає `1`.
10
+ ## Огляд
123
11
 
124
- ### Сценарій 3 — порожня директорія
12
+ Огляд
13
+ Файл перевіряє наявність конфігураційних файлів для визначення залежностей та робочих потоків. Файл використовується для встановлення наявності певних файлів у репозиторії.
125
14
 
126
- Жоден із трьох файлів не існує. Репортер отримує три `fail` (із підказками щодо `php.mdc`), `check()` повертає `1`. Усі три перевірки виконуються незалежно — функція не виходить на першому ж провалі, тому користувач бачить **повний** список проблем за один прогін.
15
+ ## Поведінка
127
16
 
128
- ### Обмеження
17
+ 1. Перевірити наявність composer.json
18
+ 2. Перевірити наявність package.json
19
+ 3. Перевірити наявність .github/workflows/lint-php.yml
129
20
 
130
- - Перевіряється **лише існування** файлів — не їхній уміст. Аналіз структури `package.json` / `lint-php.yml` належить Rego-політикам, які запускаються окремо (`npx @nitra/cursor check`).
131
- - Не перевіряється, що `composer.json` — валідний JSON або містить обов’язкові поля.
132
- - Не перевіряється наявність директорії `vendor/`, версії PHP чи що-небудь, пов’язане з виконанням Composer.
133
- - Усі шляхи відносні до `process.cwd()`. Виклик з іншої директорії дасть інший результат.
21
+ ## Публічний API
134
22
 
135
- ### Місце в архітектурі правил
23
+ check Перевіряє відповідність проєкту правилам php.mdc.
136
24
 
137
- ```
138
- npm/
139
- ├── rules/
140
- │ └── php/
141
- │ └── js/
142
- │ └── tooling.mjs ← цей файл (FS-existence checks)
143
- ├── policy/
144
- │ └── php/
145
- │ ├── package_json/ ← Rego: lint-php у package.json
146
- │ └── lint_php_yml/ ← Rego: крок bun run lint-php у workflow
147
- └── scripts/
148
- └── lib/
149
- └── check-reporter.mjs ← фабрика репортера (createCheckReporter)
150
- ```
25
+ ## Гарантії поведінки
151
26
 
152
- Така структура відображає принцип розділення: JS-модулі правил роблять рівно те, що **не покривається** Rego/conftest (зазвичай — операції з файловою системою, виклики зовнішніх CLI, динамічні перевірки), а декларативні перевірки виносяться в Rego-політики.
27
+ - Read-only: файл не виконує операцій запису у файлову систему.
28
+ - Свідомо пропускає шляхи: `.github`, `.git`.
29
+ - Не звертається до мережі.
@@ -1,172 +1,40 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/python/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # fix.mjs — entry-point правила `python`
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `npm/rules/python/fix.mjs` це **точка входу** для правила з ідентифікатором `python` пакету `@nitra/cursor`. Він виконує дві ролі одночасно:
12
+ Виконує застосування JS-занепокоєних на вхідному контексті, застосовує визначену політику, генерує посилання на MDC та повертає результат прогону
12
13
 
13
- 1. **Library mode** — експортує функцію `run(ctx)`, яку CLI-оркестратор `npx @nitra/cursor fix` або інші правила можуть викликати програмно через `import { run } from './fix.mjs'`.
14
- 2. **Standalone mode** — коли файл запускається безпосередньо (`bun npm/rules/python/fix.mjs`), він самостійно ініціалізує CLI-шар (завантаження конфіга, whitelist цілей, summary-звіт) і завершує процес із коректним exit-code для CI/IDE.
14
+ ## Поведінка
15
15
 
16
- Сам файл нічого не перевіряє і не править — він лише делегує всю роботу стандартному раннеру `runStandardRule`, який за угодою обходить підпапки правила (`applies`, `js`, `policy`, `mdc-refs` тощо) у фіксованому порядку. Конкретні перевірки правила `python` живуть у сусідніх теках (`./js/`, `./lint/`, `./policy/`) і у файлі-описі `./python.mdc`.
16
+ 1. Запуск правила.
17
+ * Приймає контекст прогону.
18
+ * Виконує застосування JS-занепокоєних.
19
+ * Застосовує політику.
20
+ * Генерує посилання на MDC.
21
+ * Повертає результат прогону.
17
22
 
18
- Файл є мінімальним shim-ом і свідомо тримається коротким — уся логіка винесена в спільні бібліотеки `scripts/lib/`, щоб усі правила пакету мали однаковий контракт запуску.
23
+ 2. Виконання у режимі CLI.
24
+ * Виконується як автономний скрипт.
25
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
26
+ * Виконує завантаження конфігурації.
27
+ * Виконує перевірку дозволів.
28
+ * Виконує підбирання списку.
29
+ * Виконує підбирання резюме.
19
30
 
20
- ## Експорти / API
31
+ ## Публічний API
21
32
 
22
- | Експорт | Тип | Призначення |
23
- | ------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
24
- | `run` | named export, `function` | Library API правила `python`. Викликається CLI-оркестратором або іншим кодом для прогону правила в межах вже існуючого контексту. |
33
+ run запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
34
+ Library mode викликається CLI orchestration через `import + run`.
25
35
 
26
- Default-експорту немає. Експорт `run` має сталу сигнатуру через JSDoc-тип `RuleContext`, імпортований із `../../scripts/lib/run-standard-rule.mjs`.
36
+ ## Гарантії поведінки
27
37
 
28
- Окрім експорту, файл містить **side-effect блок** для standalone-режиму — він не експортується, але виконується при безпосередньому запуску модуля.
29
-
30
- ## Функції
31
-
32
- ### `run(ctx)`
33
-
34
- Public-функція правила, делегатор до `runStandardRule`.
35
-
36
- **Сигнатура**
37
-
38
- ```js
39
- /**
40
- *
41
- */
42
- export function run(ctx) {
43
- return runStandardRule(import.meta.dirname, ctx)
44
- }
45
- ```
46
-
47
- **Параметри**
48
-
49
- - `ctx` _(optional)_ — об'єкт типу `RuleContext` (визначений у `../../scripts/lib/run-standard-rule.mjs`). Несе спільний для одного прогону стан: зокрема `walkCache` (закешований обхід дерева файлів, щоб не пере-сканувати робочу копію між правилами) та інші поля, які додає оркестратор. Якщо параметр опущений — `runStandardRule` створить дефолтний контекст самостійно.
50
-
51
- **Повертає**
52
-
53
- - `Promise<number>` — exit-code прогону:
54
- - `0` — порушень не знайдено (правило пройшло),
55
- - `1` — знайдено хоча б одне порушення.
56
-
57
- Хоча тіло функції `return runStandardRule(...)` синхронне, сам `runStandardRule` повертає `Promise`, тому викликач має `await`-ити результат.
58
-
59
- **Side effects**
60
-
61
- Безпосередньо у `run` побічних ефектів немає — усі вони виконуються всередині `runStandardRule`:
62
-
63
- - читання файлів проекту (через `walkCache`/файлову систему),
64
- - запуск підправил (applies/JS-concerns/policy/mdc-refs),
65
- - запис у `stdout`/`stderr` діагностики (summary вмикається лише в standalone-режимі через `runRuleCli`).
66
-
67
- Сам `run` **не викликає** `process.exit` — це обов'язок зовнішнього оркестратора. Це принципово, бо `run` має бути безпечним для виклику з іншого правила або тесту.
68
-
69
- ### Standalone-блок (anonymous side-effect)
70
-
71
- ```js
72
- if (isRunAsCli(import.meta.url)) {
73
- // eslint-disable-next-line n/no-process-exit
74
- process.exit(await runRuleCli(import.meta.dirname))
75
- }
76
- ```
77
-
78
- Не функція, а top-level async-блок (використовує `await` на рівні модуля, що валідно для ES-модулів).
79
-
80
- **Як працює**
81
-
82
- 1. `isRunAsCli(import.meta.url)` — повертає `true`, тільки якщо модуль є entry-point процесу (`bun rules/python/fix.mjs`, а не імпорт). При імпорті з іншого модуля гілка не виконується.
83
- 2. `runRuleCli(import.meta.dirname)` — повний CLI-цикл одного правила: завантажує конфіг проекту, формує whitelist цілей, прогоняє `run` (через `runStandardRule`), друкує summary.
84
- 3. `process.exit(<exit-code>)` — терміново завершує процес кодом, який повернув `runRuleCli`. Дві ESLint-директиви (`n/no-process-exit`, `unicorn/no-process-exit`) явно дозволяють виклик `process.exit` саме тут, бо standalone entry-point повинен повернути код процесу для CI/IDE-інтеграції.
85
-
86
- **Side effects**
87
-
88
- - Завершує Node/Bun-процес (`process.exit`).
89
- - Усе, що робить `runRuleCli` (читання конфіга, файлові обходи, лог summary).
90
-
91
- ## Залежності
92
-
93
- Усі залежності — внутрішні модулі того ж пакету (`@nitra/cursor`):
94
-
95
- | Модуль | Імпортовані символи | Роль |
96
- | ----------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
97
- | `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | Детектор standalone-запуску й повний CLI-цикл одного правила (config + whitelist + summary). |
98
- | `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule` | Стандартний раннер правила: обходить підпапки `applies → js → policy → mdc-refs` у фіксованому порядку й агрегує exit-code. Також експортує тип `RuleContext` (використовується в JSDoc). |
99
-
100
- Зовнішніх npm-залежностей у файлі немає. Файл покладається лише на ES-модульні runtime-API:
101
-
102
- - `import.meta.dirname` — абсолютний шлях до теки модуля (`.../npm/rules/python/`). Передається як «корінь правила» в обидва раннери, щоб вони знали, де шукати підпапки.
103
- - `import.meta.url` — URL модуля (`file://...`), потрібен `isRunAsCli`, щоб порівняти з `process.argv[1]`.
104
- - `process.exit` — глобальний Node/Bun API.
105
- - Top-level `await` — стандарт ESM.
106
-
107
- ## Потік виконання / Використання
108
-
109
- ### Сценарій 1. Виклик з оркестратора (library mode)
110
-
111
- Коли користувач запускає `npx @nitra/cursor fix python` (або просто `npx @nitra/cursor fix`, де `python` потрапляє у whitelist), CLI-оркестратор пакету:
112
-
113
- 1. Імпортує `run` із цього файлу: `const { run } = await import('.../npm/rules/python/fix.mjs')`.
114
- 2. Створює спільний `RuleContext` (зокрема `walkCache`).
115
- 3. Викликає `await run(ctx)` і збирає exit-code.
116
-
117
- У цьому сценарії `if (isRunAsCli(...))` повертає `false`, бо модуль імпортовано — standalone-блок не виконується, `process.exit` не викликається.
118
-
119
- ### Сценарій 2. Прямий запуск (standalone mode)
120
-
121
- ```bash
122
- bun npm/rules/python/fix.mjs
123
- # або еквівалент:
124
- npx @nitra/cursor fix python
125
- ```
126
-
127
- 1. Модуль виконується як entry-point — `isRunAsCli(import.meta.url)` → `true`.
128
- 2. Викликається `runRuleCli(import.meta.dirname)`:
129
- - завантажує конфіг проекту,
130
- - формує whitelist цілей,
131
- - усередині сам викликає `run(ctx)` (через `runStandardRule`),
132
- - друкує summary-звіт.
133
- 3. `process.exit` із отриманим exit-code (`0` або `1`) — придатно для CI (`bun npm/rules/python/fix.mjs && echo OK`).
134
-
135
- ### Внутрішній порядок підправил
136
-
137
- Згідно з JSDoc до `run`, `runStandardRule` запускає послідовність:
138
-
139
- 1. **applies** — фільтр «чи правило взагалі застосовне до проекту» (читає метадані `meta.json` / контекст).
140
- 2. **JS-concerns** — JS-перевірки (у цьому правилі живуть у `./js/`).
141
- 3. **policy** — політики (у цьому правилі — `./policy/`).
142
- 4. **mdc-refs** — перевірка посилань усередині `python.mdc`.
143
-
144
- Будь-яке порушення на будь-якому етапі підвищує exit-code до `1`, але всі етапи прогоняються — щоб користувач бачив повний список порушень за один прохід, а не виправляв їх по одному.
145
-
146
- ### Чому дві ролі в одному файлі
147
-
148
- Це угода всього пакету `@nitra/cursor`: кожне правило має один `fix.mjs`, який:
149
-
150
- - легко імпортувати з іншого правила/коду (named export `run`),
151
- - легко запустити вручну для діагностики конкретного правила (`bun rules/<id>/fix.mjs`),
152
- - однаково поводиться під CLI-оркестратором і в standalone.
153
-
154
- Сусідні правила (наприклад, `npm/rules/n-bun/fix.mjs`, `npm/rules/n-adr/fix.mjs`) мають той самий шаблон — це дає змогу мати один універсальний loader і не дублювати CLI-код у кожному правилі.
155
-
156
- ## Rebuild Test
157
-
158
- Контрольний перелік, за яким можна відтворити файл «з нуля», маючи лише цю документацію:
159
-
160
- 1. Файл — ES-модуль (`.mjs`), без default-експорту, із одним named export `run`.
161
- 2. Імпорти (у такому порядку):
162
- - `isRunAsCli` та `runRuleCli` з `../../scripts/lib/run-rule-cli.mjs`,
163
- - `runStandardRule` з `../../scripts/lib/run-standard-rule.mjs`.
164
- 3. Функція `run(ctx)`:
165
- - `export function run(ctx)`,
166
- - тіло: `return runStandardRule(import.meta.dirname, ctx)`,
167
- - JSDoc із описом «applies → JS-concerns → policy → mdc-refs», згадкою про library mode, `@param {RuleContext} [ctx]` і `@returns {Promise<number>}` (0 — OK, 1 — порушення).
168
- 4. Standalone-блок:
169
- - `if (isRunAsCli(import.meta.url)) { ... }`,
170
- - усередині: `process.exit(await runRuleCli(import.meta.dirname))`,
171
- - над `process.exit` — коментар-пояснення дволикої ролі fix.mjs та `eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` із причиною.
172
- 5. Файл не містить жодної додаткової логіки — усі перевірки правила живуть у сусідніх теках (`./js/`, `./lint/`, `./policy/`) та `./python.mdc`.
38
+ - Read-only: файл не виконує операцій запису у файлову систему.
39
+ - Кешує результати в межах одного прогону.
40
+ - Не звертається до мережі.
@@ -1,108 +1,30 @@
1
- # `applies.mjs` — applies-гейт правила `python`
1
+ ---
2
+ docgen:
3
+ source: npm/rules/python/js/applies.mjs
4
+ crc: ed79bd71
5
+ score: 100
6
+ ---
2
7
 
3
- ## Огляд
4
-
5
- Модуль `applies.mjs` реалізує **applies-гейт** для правила `python` (`python.mdc`) у системі правил `n-cursor`. Його єдина роль — відповісти на питання: «чи варто застосовувати правило `python.mdc` до поточного репозиторію?».
6
-
7
- Критерій застосовності — наявність файлу `pyproject.toml` у корені репозиторію. Якщо файл відсутній, CLI `n-cursor` пропускає всі concerns цього правила (як JS-перевірки, так і policy-перевірки Rego). Це усуває хибне спрацювання rego-правила `python/package_json`, яке вимагало б наявність npm-скрипта `scripts.lint-python` навіть у репозиторіях, що не пов'язані з Python.
8
-
9
- Сам JS-файл не виконує жодних інших FS-перевірок: усі подальші перевірки (`uv.lock`, `package.json`, `lint-python.yml`, заборона Poetry тощо) розміщені окремо у `tooling.mjs`. Окрім гейта `applies()`, файл містить тонкий стаб `check()`, який друкує context-pass через стандартний reporter.
10
-
11
- ## Експорти / API
12
-
13
- Модуль експортує дві named-функції (ESM):
14
-
15
- | Експорт | Тип / сигнатура | Призначення |
16
- | --------- | ------------------------------------ | --------------------------------------------------------------------- |
17
- | `applies` | `(cwd?: string) => Promise<boolean>` | Гейт застосовності правила: `true`, якщо в корені є `pyproject.toml`. |
18
- | `check` | `() => number` | Друкує context-pass через `check-reporter`, повертає exit-code (`0`). |
19
-
20
- Default-export відсутній.
21
-
22
- ## Функції
23
-
24
- ### `applies(cwd = process.cwd())`
25
-
26
- Гейт застосовності правила `python.mdc` для конкретного репозиторію.
27
-
28
- - **Сигнатура:** `export function applies(cwd?: string): Promise<boolean>`
29
- - **Параметри:**
30
- - `cwd` _(string, опційний)_ — абсолютний (або відносний) шлях до кореня репозиторію, у якому виконується перевірка. За замовчуванням — результат `process.cwd()`. У звичайному прогоні CLI це робочий каталог, з якого запущено команду.
31
- - **Повертає:** `Promise<boolean>`
32
- - `true` — у `cwd` існує файл `pyproject.toml`, правило `python.mdc` слід застосовувати (CLI запустить решту concerns).
33
- - `false` — `pyproject.toml` відсутній, правило треба повністю пропустити.
34
- - **Алгоритм:**
35
- 1. Будує абсолютний шлях `join(cwd, 'pyproject.toml')`.
36
- 2. Викликає синхронну `existsSync()` з `node:fs`.
37
- 3. Загортає синхронний boolean у `Promise.resolve(...)`, щоб відповідати очікуваному CLI-контракту `Promise<boolean>`.
38
- - **Side effects:** немає — лише читання метаданих файлової системи (`stat`-like виклик). Файл не відкривається й не читається; запис не виконується; глобальний стан не змінюється.
39
- - **Помилки:** функція не очікує винятків; `existsSync` сам по собі не кидає для відсутніх шляхів — повертає `false`. Промісована обгортка зберігає таку ж поведінку.
40
-
41
- ### `check()`
8
+ # applies.mjs
42
9
 
43
- Тонкий стаб, що друкує єдиний context-pass і завершується успіхом. Фактичні порушення (на кшталт відсутності `lint-python`-job у CI, заборони Poetry тощо) перевіряють інші concerns правила, тож тут жодних реальних перевірок немає.
44
-
45
- - **Сигнатура:** `export function check(): number`
46
- - **Параметри:** немає.
47
- - **Повертає:** `number` — exit-code, отриманий з `reporter.getExitCode()`. Оскільки викликається лише `reporter.pass(...)`, код завжди `0` (немає фейлів).
48
- - **Алгоритм:**
49
- 1. Створює інстанс reporter-а через `createCheckReporter()`.
50
- 2. Викликає `reporter.pass('pyproject.toml знайдено в корені — застосовую python.mdc')`, що друкує позитивний рядок у стандартному форматі n-cursor reporter-а.
51
- 3. Повертає `reporter.getExitCode()`.
52
- - **Side effects:** пише в `stdout` (через reporter). Не виконує FS-операцій, не змінює стану процесу, не кидає винятків.
53
- - **Передумова:** функцію має сенс викликати лише після того, як `applies()` повернула `true` (інакше повідомлення про «знайдено» було б оманливим). CLI `n-cursor` забезпечує цей контракт.
54
-
55
- ## Залежності
56
-
57
- ### Зовнішні (стандартна бібліотека Node.js)
58
-
59
- - `node:fs`
60
- - `existsSync(path)` — синхронна перевірка існування шляху. Використовується для виявлення `pyproject.toml`.
61
- - `node:path`
62
- - `join(...segments)` — нормалізована побудова шляху, незалежна від OS-роздільника.
63
-
64
- ### Внутрішні (репозиторій)
65
-
66
- - `../../../scripts/lib/check-reporter.mjs`
67
- - `createCheckReporter()` — фабрика стандартного reporter-а для `check.mjs`-скриптів правил. Очікувані методи: `pass(message)` (друк позитивного рядка) та `getExitCode()` (повертає накопичений exit-код, `0` для успіху).
68
- - Відносний шлях вказує на спільну бібліотеку скриптів правил у тому ж `npm/`-пакеті (`npm/scripts/lib/check-reporter.mjs` відносно файлу `npm/rules/python/js/applies.mjs`).
69
-
70
- Інших залежностей (зокрема — TOML-парсера, інших правил, `tooling.mjs`) у цьому файлі немає.
71
-
72
- ## Потік виконання / Використання
73
-
74
- ### Місце в архітектурі правил
75
-
76
- У системі правил `n-cursor` кожне правило (наприклад, `python.mdc`) описується трьома шарами:
77
-
78
- 1. **`*.mdc`** — людинозрозумілий опис правила, без алгоритму перевірки.
79
- 2. **`js/applies.mjs`** — гейт застосовності правила до конкретного репозиторію (поточний файл).
80
- 3. **`js/<concern>.mjs`** і Rego-policy — фактичні перевірки (`tooling.mjs`, `package_json.rego` тощо).
10
+ ## Огляд
81
11
 
82
- CLI `n-cursor` під час прогону правил викликає `applies()` для кожного правила перед тим, як запускати решту concerns. Якщо `applies()` повертає `false`, **усі** перевірки правила (JS і policy) пропускаються. Це й розв'язує проблему хибних спрацювань rego-правила `python/package_json` у не-Python репозиторіях.
12
+ Файл перевіряє наявність файлу pyproject.toml у корені репозиторію.
83
13
 
84
- ### Послідовність викликів (happy path)
14
+ ## Поведінка
85
15
 
86
- 1. Користувач запускає `n-cursor check` (або еквівалент) у корені репо.
87
- 2. CLI обходить набір правил, серед яких `python`.
88
- 3. CLI імпортує `npm/rules/python/js/applies.mjs` і викликає `applies(process.cwd())`.
89
- 4. Якщо `pyproject.toml` присутній — CLI продовжує: запускає `check()` (друк context-pass) та інші concerns правила (`tooling.mjs`, Rego-policy).
90
- 5. Якщо `pyproject.toml` відсутній — CLI повністю пропускає `python` для цього прогону. `check()` у такому разі не викликається.
16
+ applies
17
+ Перевіряє наявність pyproject.toml в корені репозиторію
91
18
 
92
- ### Приклад прямого використання (без CLI)
19
+ check
20
+ Друкує повідомлення про знахідку pyproject.toml для застосування python.mdc
93
21
 
94
- ```js
95
- import { applies, check } from './applies.mjs'
22
+ ## Публічний API
96
23
 
97
- if (await applies(process.cwd())) {
98
- const code = check()
99
- process.exitCode = code
100
- }
101
- ```
24
+ applies формує намір файлу
25
+ check виводить короткий контекст-прохід
102
26
 
103
- ### Інваріанти й контракти
27
+ ## Гарантії поведінки
104
28
 
105
- - `applies(cwd)` ніколи не модифікує файлову систему.
106
- - `applies(cwd)` повертає Promise навіть попри синхронну реалізацію — для уніфікованого CLI-контракту з іншими applies-гейтами.
107
- - `check()` не дублює перевірку `pyproject.toml`: вона вже відбулась у `applies()`. Якщо `check()` викликається без попереднього `applies()`, повідомлення «pyproject.toml знайдено в корені» може ввести в оману, але exit-code від цього не залежить.
108
- - Файл свідомо не імпортує `tooling.mjs` чи інші concerns — кожен concern завантажується CLI окремо.
29
+ - Read-only: файл не виконує операцій запису у файлову систему.
30
+ - Не звертається до мережі.