@nitra/cursor 12.6.0 → 12.7.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 (269) hide show
  1. package/.claude-template/settings.template.json +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/bin/docs/n-cursor.md +4 -20
  4. package/bin/n-cursor.js +7 -53
  5. package/docs/stryker.config.md +20 -28
  6. package/package.json +1 -1
  7. package/rules/abie/docs/index.md +1 -0
  8. package/rules/abie/docs/main.md +29 -0
  9. package/rules/abie/{fix.mjs → main.mjs} +5 -3
  10. package/rules/adr/docs/index.md +1 -0
  11. package/rules/adr/docs/main.md +29 -0
  12. package/rules/adr/{fix.mjs → main.mjs} +5 -3
  13. package/rules/bun/docs/index.md +1 -0
  14. package/rules/bun/docs/main.md +30 -0
  15. package/rules/bun/js/docs/layout.md +11 -36
  16. package/rules/bun/{fix.mjs → main.mjs} +5 -3
  17. package/rules/capacitor/docs/index.md +1 -0
  18. package/rules/capacitor/docs/main.md +29 -0
  19. package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
  20. package/rules/changelog/docs/index.md +1 -0
  21. package/rules/changelog/docs/main.md +27 -0
  22. package/rules/changelog/main.mjs +20 -0
  23. package/rules/ci4/docs/index.md +1 -0
  24. package/rules/ci4/docs/main.md +30 -0
  25. package/rules/ci4/main.mjs +20 -0
  26. package/rules/doc-files/docs/index.md +1 -0
  27. package/rules/doc-files/docs/main.md +31 -0
  28. package/rules/doc-files/js/docgen-files-batch.mjs +47 -3
  29. package/rules/doc-files/js/docgen-scan.mjs +89 -9
  30. package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
  31. package/rules/doc-files/js/docs/docgen-scan.md +34 -34
  32. package/rules/doc-files/js/docs/index.md +1 -0
  33. package/rules/doc-files/js/docs/run-lint.md +27 -0
  34. package/rules/doc-files/{lint/lint.mjs → js/run-lint.mjs} +23 -9
  35. package/rules/doc-files/{js/lint.mjs → main.mjs} +60 -10
  36. package/rules/docker/docs/index.md +1 -0
  37. package/rules/docker/docs/main.md +28 -0
  38. package/rules/docker/js/docs/lint.md +26 -54
  39. package/rules/docker/js/lint.mjs +11 -0
  40. package/rules/docker/lib/docker-hadolint.mjs +1 -1
  41. package/rules/docker/lib/docs/docker-hadolint.md +16 -173
  42. package/rules/docker/main.mjs +20 -0
  43. package/rules/efes/docs/index.md +1 -0
  44. package/rules/efes/docs/main.md +29 -0
  45. package/rules/efes/main.mjs +20 -0
  46. package/rules/feedback/docs/index.md +1 -0
  47. package/rules/feedback/docs/main.md +30 -0
  48. package/rules/feedback/main.mjs +20 -0
  49. package/rules/ga/docs/index.md +1 -0
  50. package/rules/ga/docs/main.md +29 -0
  51. package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
  52. package/rules/graphql/docs/index.md +1 -0
  53. package/rules/graphql/docs/main.md +36 -0
  54. package/rules/graphql/main.mjs +20 -0
  55. package/rules/hasura/docs/index.md +1 -0
  56. package/rules/hasura/docs/main.md +30 -0
  57. package/rules/hasura/main.mjs +20 -0
  58. package/rules/image-avif/docs/index.md +1 -0
  59. package/rules/image-avif/docs/main.md +30 -0
  60. package/rules/image-avif/js/docs/avif_generation.md +20 -233
  61. package/rules/image-avif/main.mjs +20 -0
  62. package/rules/image-compress/docs/index.md +1 -0
  63. package/rules/image-compress/docs/main.md +29 -0
  64. package/rules/image-compress/js/docs/package_setup.md +12 -11
  65. package/rules/image-compress/{js/lint.mjs → main.mjs} +21 -5
  66. package/rules/js-bun-db/docs/index.md +1 -0
  67. package/rules/js-bun-db/docs/main.md +30 -0
  68. package/rules/js-bun-db/main.mjs +20 -0
  69. package/rules/js-bun-redis/docs/index.md +1 -0
  70. package/rules/js-bun-redis/docs/main.md +29 -0
  71. package/rules/js-bun-redis/main.mjs +20 -0
  72. package/rules/js-lint/docs/index.md +1 -0
  73. package/rules/js-lint/docs/main.md +29 -0
  74. package/rules/js-lint/js/check.mjs +268 -0
  75. package/rules/js-lint/js/docs/check.md +39 -0
  76. package/rules/js-lint/js/docs/index.md +1 -1
  77. package/rules/js-lint/js/docs/tooling.md +12 -32
  78. package/rules/js-lint/js/tooling.mjs +1 -265
  79. package/rules/js-lint/{js/lint.mjs → main.mjs} +19 -2
  80. package/rules/js-lint-ci/docs/index.md +1 -0
  81. package/rules/js-lint-ci/docs/main.md +27 -0
  82. package/rules/js-lint-ci/main.mjs +33 -0
  83. package/rules/js-mssql/docs/index.md +1 -0
  84. package/rules/js-mssql/docs/main.md +30 -0
  85. package/rules/js-mssql/main.mjs +20 -0
  86. package/rules/js-run/docs/index.md +1 -0
  87. package/rules/js-run/docs/main.md +30 -0
  88. package/rules/js-run/main.mjs +20 -0
  89. package/rules/k8s/docs/index.md +1 -0
  90. package/rules/k8s/docs/main.md +40 -0
  91. package/rules/k8s/js/docs/index.md +12 -0
  92. package/rules/k8s/{lint/lint.mjs → main.mjs} +32 -10
  93. package/rules/nginx-default-tpl/docs/index.md +1 -0
  94. package/rules/nginx-default-tpl/docs/main.md +30 -0
  95. package/rules/nginx-default-tpl/main.mjs +20 -0
  96. package/rules/npm-module/docs/index.md +1 -0
  97. package/rules/npm-module/docs/main.md +29 -0
  98. package/rules/npm-module/js/docs/rule_meta.md +17 -16
  99. package/rules/npm-module/js/rule_meta.mjs +13 -3
  100. package/rules/npm-module/main.mjs +20 -0
  101. package/rules/php/docs/index.md +1 -0
  102. package/rules/php/docs/main.md +33 -0
  103. package/rules/php/js/docs/tooling.md +10 -10
  104. package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
  105. package/rules/python/docs/index.md +1 -0
  106. package/rules/python/docs/main.md +31 -0
  107. package/rules/python/js/docs/tooling.md +17 -17
  108. package/rules/python/{lint/lint.mjs → main.mjs} +29 -5
  109. package/rules/rego/docs/index.md +1 -0
  110. package/rules/rego/docs/main.md +37 -0
  111. package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
  112. package/rules/release/docs/index.md +1 -0
  113. package/rules/release/docs/main.md +29 -0
  114. package/rules/release/docs/release.md +0 -3
  115. package/rules/release/release.mdc +10 -0
  116. package/rules/rust/docs/index.md +1 -0
  117. package/rules/rust/docs/main.md +27 -0
  118. package/rules/rust/{js/lint.mjs → main.mjs} +20 -3
  119. package/rules/security/docs/index.md +1 -0
  120. package/rules/security/docs/main.md +28 -0
  121. package/rules/security/main.mjs +45 -0
  122. package/rules/style-lint/docs/index.md +1 -0
  123. package/rules/style-lint/docs/main.md +29 -0
  124. package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
  125. package/rules/tauri/docs/index.md +1 -0
  126. package/rules/tauri/docs/main.md +29 -0
  127. package/rules/tauri/main.mjs +20 -0
  128. package/rules/test/docs/index.md +1 -0
  129. package/rules/test/docs/main.md +30 -0
  130. package/rules/test/main.mjs +20 -0
  131. package/rules/text/docs/index.md +1 -0
  132. package/rules/text/docs/main.md +29 -0
  133. package/rules/text/js/docs/cspell-fix.md +30 -0
  134. package/rules/text/js/docs/formatting.md +12 -45
  135. package/rules/text/js/docs/index.md +4 -0
  136. package/rules/text/js/docs/run-dotenv-linter.md +31 -0
  137. package/rules/text/js/docs/run-shellcheck.md +28 -0
  138. package/rules/text/js/docs/run-v8r.md +29 -0
  139. package/rules/text/{lint/lint.mjs → main.mjs} +38 -9
  140. package/rules/text/text.mdc +5 -14
  141. package/rules/tool-surface/docs/index.md +1 -0
  142. package/rules/tool-surface/docs/main.md +29 -0
  143. package/rules/tool-surface/main.mjs +20 -0
  144. package/rules/vue/docs/index.md +1 -0
  145. package/rules/vue/docs/main.md +29 -0
  146. package/rules/vue/main.mjs +20 -0
  147. package/rules/worktree/docs/index.md +1 -0
  148. package/rules/worktree/docs/main.md +28 -0
  149. package/rules/worktree/main.mjs +20 -0
  150. package/scripts/docs/index.md +1 -0
  151. package/scripts/docs/post-tool-use-check.md +29 -0
  152. package/scripts/docs/sync-claude-config.md +64 -92
  153. package/scripts/lib/adr/docs/normalize-cli.md +0 -3
  154. package/scripts/lib/adr/docs/normalize-pipeline.md +0 -3
  155. package/scripts/lib/docs/gha-workflow.md +25 -317
  156. package/scripts/lib/docs/index.md +1 -0
  157. package/scripts/lib/docs/list-project-rules-mdc.md +5 -4
  158. package/scripts/lib/docs/list-rule-ids.md +15 -148
  159. package/scripts/lib/docs/read-n-cursor-config-lite.md +12 -16
  160. package/scripts/lib/docs/run-lint-step.md +13 -13
  161. package/scripts/lib/docs/run-lint.md +30 -0
  162. package/scripts/lib/docs/run-rule-cli.md +14 -10
  163. package/scripts/lib/docs/run-standard-lint.md +27 -10
  164. package/scripts/lib/docs/run-standard-rule.md +12 -11
  165. package/scripts/lib/docs/timing-summary.md +11 -12
  166. package/scripts/lib/docs/worktree-notice.md +0 -3
  167. package/scripts/lib/fix/docs/index.md +1 -0
  168. package/scripts/lib/fix/docs/orchestrator.md +23 -18
  169. package/scripts/lib/fix/docs/run-conformance-check.md +32 -0
  170. package/scripts/lib/fix/docs/t0.md +10 -9
  171. package/scripts/lib/fix/orchestrator.mjs +5 -5
  172. package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
  173. package/scripts/lib/fix/t0.mjs +3 -3
  174. package/scripts/lib/gha-workflow.mjs +1 -1
  175. package/scripts/lib/list-project-rules-mdc.mjs +1 -1
  176. package/scripts/lib/list-rule-ids.mjs +12 -3
  177. package/scripts/lib/read-n-cursor-config-lite.mjs +2 -2
  178. package/scripts/lib/run-lint-step.mjs +1 -1
  179. package/{rules/lint/js/orchestrate.mjs → scripts/lib/run-lint.mjs} +42 -20
  180. package/scripts/lib/run-rule-cli.mjs +4 -4
  181. package/scripts/lib/run-standard-lint.mjs +19 -6
  182. package/scripts/lib/run-standard-rule.mjs +4 -4
  183. package/scripts/lib/timing-summary.mjs +1 -1
  184. package/scripts/{post-tool-use-fix.mjs → post-tool-use-check.mjs} +9 -9
  185. package/scripts/sync-claude-config.mjs +2 -2
  186. package/rules/changelog/fix.mjs +0 -18
  187. package/rules/ci4/fix.mjs +0 -18
  188. package/rules/doc-files/fix.mjs +0 -19
  189. package/rules/doc-files/js/docs/lint.md +0 -34
  190. package/rules/doc-files/lint/docs/index.md +0 -11
  191. package/rules/doc-files/lint/docs/lint.md +0 -35
  192. package/rules/docker/fix.mjs +0 -18
  193. package/rules/docker/lint/docs/index.md +0 -11
  194. package/rules/docker/lint/docs/lint.md +0 -200
  195. package/rules/docker/lint/lint.mjs +0 -95
  196. package/rules/efes/fix.mjs +0 -18
  197. package/rules/feedback/fix.mjs +0 -18
  198. package/rules/ga/fix.mjs +0 -18
  199. package/rules/ga/js/docs/lint.md +0 -20
  200. package/rules/ga/js/lint.mjs +0 -12
  201. package/rules/ga/lint/docs/index.md +0 -11
  202. package/rules/ga/lint/docs/lint.md +0 -31
  203. package/rules/graphql/fix.mjs +0 -18
  204. package/rules/hasura/fix.mjs +0 -18
  205. package/rules/image-avif/fix.mjs +0 -18
  206. package/rules/image-compress/fix.mjs +0 -18
  207. package/rules/image-compress/js/docs/lint.md +0 -24
  208. package/rules/js-bun-db/fix.mjs +0 -18
  209. package/rules/js-bun-redis/fix.mjs +0 -18
  210. package/rules/js-lint/fix.mjs +0 -18
  211. package/rules/js-lint/js/docs/lint.md +0 -32
  212. package/rules/js-lint-ci/fix.mjs +0 -18
  213. package/rules/js-lint-ci/js/docs/lint.md +0 -22
  214. package/rules/js-lint-ci/js/lint.mjs +0 -15
  215. package/rules/js-mssql/fix.mjs +0 -18
  216. package/rules/js-run/fix.mjs +0 -18
  217. package/rules/k8s/fix.mjs +0 -18
  218. package/rules/k8s/js/lint.mjs +0 -14
  219. package/rules/k8s/lint/docs/index.md +0 -11
  220. package/rules/k8s/lint/docs/lint.md +0 -413
  221. package/rules/lint/docs/fix.md +0 -25
  222. package/rules/lint/docs/index.md +0 -11
  223. package/rules/lint/fix.mjs +0 -18
  224. package/rules/lint/js/docs/index.md +0 -11
  225. package/rules/lint/js/docs/orchestrate.md +0 -31
  226. package/rules/lint/meta.json +0 -1
  227. package/rules/nginx-default-tpl/fix.mjs +0 -18
  228. package/rules/npm-module/fix.mjs +0 -18
  229. package/rules/php/fix.mjs +0 -18
  230. package/rules/php/js/docs/lint.md +0 -20
  231. package/rules/php/js/lint.mjs +0 -15
  232. package/rules/php/lint/docs/index.md +0 -11
  233. package/rules/php/lint/docs/lint.md +0 -219
  234. package/rules/python/fix.mjs +0 -18
  235. package/rules/python/js/docs/lint.md +0 -21
  236. package/rules/python/js/lint.mjs +0 -14
  237. package/rules/python/lint/docs/index.md +0 -11
  238. package/rules/python/lint/docs/lint.md +0 -29
  239. package/rules/rego/fix.mjs +0 -18
  240. package/rules/rego/js/docs/lint.md +0 -21
  241. package/rules/rego/js/lint.mjs +0 -12
  242. package/rules/rego/lint/docs/index.md +0 -11
  243. package/rules/rego/lint/docs/lint.md +0 -208
  244. package/rules/rust/fix.mjs +0 -18
  245. package/rules/rust/js/docs/lint.md +0 -21
  246. package/rules/security/fix.mjs +0 -18
  247. package/rules/security/js/docs/lint.md +0 -175
  248. package/rules/security/js/lint.mjs +0 -26
  249. package/rules/style-lint/fix.mjs +0 -18
  250. package/rules/style-lint/js/docs/lint.md +0 -31
  251. package/rules/tauri/fix.mjs +0 -18
  252. package/rules/test/fix.mjs +0 -18
  253. package/rules/text/fix.mjs +0 -18
  254. package/rules/text/js/docs/lint.md +0 -23
  255. package/rules/text/js/lint.mjs +0 -15
  256. package/rules/text/lint/docs/cspell-fix.md +0 -32
  257. package/rules/text/lint/docs/index.md +0 -15
  258. package/rules/text/lint/docs/lint.md +0 -36
  259. package/rules/text/lint/docs/run-dotenv-linter.md +0 -161
  260. package/rules/text/lint/docs/run-shellcheck.md +0 -216
  261. package/rules/text/lint/docs/run-v8r.md +0 -201
  262. package/rules/tool-surface/fix.mjs +0 -18
  263. package/rules/vue/fix.mjs +0 -18
  264. package/rules/worktree/fix.mjs +0 -18
  265. /package/rules/release/{fix.mjs → main.mjs} +0 -0
  266. /package/rules/text/{lint → js}/cspell-fix.mjs +0 -0
  267. /package/rules/text/{lint → js}/run-dotenv-linter.mjs +0 -0
  268. /package/rules/text/{lint → js}/run-shellcheck.mjs +0 -0
  269. /package/rules/text/{lint → js}/run-v8r.mjs +0 -0
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/nginx-default-tpl/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль перевіряє задане правило, використовуючи конфігурації, які визначаються у meta.json. При запуску через публічну функцію `run` відбувається оркестрація виконання. Процес включає застосування логіки, що використовує кешування результатів у межах одного прогону. Результат виконання визначає код виходу.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки правила.
18
+ 2. Виконання `run` застосовує логіку правила, включаючи обробку JS-запитань, політику та посилання на MDC.
19
+ 3. Якщо скрипт виконується як окрема програма (CLI), відбувається запуск оркестрації правила.
20
+ 4. Оркестрація правила виконує завантаження конфігурацій, застосовує вайтлістинг та підсумовує результати.
21
+ 5. Результат виконання визначає код виходу процесу.
22
+
23
+ ## Публічний API
24
+
25
+ run — виконує основну логіку правила, включаючи перевірку відповідності JS-зацікавленостей та політикам, а також посилання на MDC.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Кешує результати в межах одного прогону.
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -9,3 +9,4 @@ resource: npm/rules/npm-module/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/npm-module/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку, застосовуючи політику, обробляючи JS-запити. При запуску як інструмент командного рядка, метод `run` ініціює повний запуск правила. Цей запуск включає завантаження конфігурацій, що спираються на meta.json, застосування білих списків та підбиття підсумків. Модуль є Read-only, тобто не пише у ФС/БД. Кешування даних відбувається в межах одного прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC-референси.
19
+ 3. Якщо код виконується як окремий інструмент командного рядка, ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: застосовує перевірки, обробляє JS-залежності, застосовує політику та посилання MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -3,31 +3,32 @@ type: JS Module
3
3
  title: rule_meta.mjs
4
4
  resource: npm/rules/npm-module/js/rule_meta.mjs
5
5
  docgen:
6
- crc: 8262678c
6
+ crc: 938ccd0a
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Перевіряє наявність директорії npm/rules у вказаному шляху. Ітерує по всіх директоріях у директорії npm/rules. Для кожної директорії виконує перевірку наявності файлу auto.md та валідність полів auto та lint у конфігурації meta.json. Перевіряє наявність файлу js/lint.mjs у каталозі правила. Збирає результати валідації та повертає код виходу репортера.
11
+ ## Огляд
12
+
13
+ Модуль перевіряє конфігурацію правил, розташованих у каталозі `npm/rules`. Він забезпечує наявність обов'язкового файлу `scripts.mdc` для кожного правила. Крім того, він валідує структуру метаданих у `meta.json`, перевіряючи відповідність полів, таких як `auto` та `lint`, визначеним контрактам. У процесі перевірки використовуються маркери повідомлень (scripts.mdc).
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Перевірка наявності директорії npm/rules у вказаному шляху.
15
- 2. Ітерація по всіх директоріях у директорії npm/rules.
16
- 3. Для кожної директорії виконується перевірка правила.
17
- 4. Перевірка наявності файлу auto.md у директорії правила.
18
- 5. Перевірка валідності поля auto у meta.json правила.
19
- 6. Перевірка наявності поля lint у meta.json правила.
20
- 7. Перевірка валідності поля lint у meta.json правила.
21
- 8. Перевірка наявності файлу js/lint.mjs у каталозі правила.
22
- 9. Збір результатів валідації.
23
- 10. Повернення коду виходу репортера.
17
+ 1. Викликати `check` для початку валідації.
18
+ 2. Перевірити наявність каталогу `npm/rules` у корені репозиторію. Якщо каталог відсутній, валідація завершується успішно.
19
+ 3. Для кожного підкаталогу у `npm/rules` (який представляє правило):
20
+ а. Перевірити наявність файлу `auto.md`. Якщо він присутній, реєструється помилка, оскільки метадані тепер знаходяться у `meta.json`.
21
+ б. Перевірити наявність файлу `<id>.mdc` у каталозі правила. Якщо він відсутній, реєструється помилка, оскільки це обов'язковий файл (scripts.mdc).
22
+ в. Зчитати вміст `meta.json` правила. Якщо файл відсутній або невалідний, реєструється помилка, і перевірка цього правила припиняється.
23
+ г. Перевірити поле `auto` у `meta.json`. Якщо поле `auto` присутнє, воно повинно бути валідним (відповідати одному з визначених форматів, або бути відсутнім). Якщо поле `auto` містить невідомий предикат, реєструється помилка.
24
+ ґ. Перевірити поле `lint` у `meta.json`. Якщо поле `lint` присутнє, воно повинно бути валідним (відповідати "per-file" або "full"). Також перевіряється, чи експортує файл `main.mjs` у каталозі правила функцію `lint` відповідно до зазначеного значення `lint`.
25
+ і. Якщо всі перевірки для правила пройшли успішно, реєструється повідомлення про валідність `meta.json`.
26
+ 4. Після обробки всіх правил, повертається код виходу, що відображає загальний статус валідації.
24
27
 
25
28
  ## Публічний API
26
29
 
27
- check — Валідує всі `npm/rules/<id>/meta.json`.
30
+ check — перевіряє відповідність усіх файлів `npm/rules/<id>/meta.json` встановленим критеріям.
28
31
 
29
32
  ## Гарантії поведінки
30
33
 
31
- - Read-only: файл не виконує операцій запису у файлову систему.
32
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
33
- - Не звертається до мережі.
34
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -1,5 +1,5 @@
1
1
  /** @see ./docs/rule_meta.md */
2
- import { existsSync, readdirSync } from 'node:fs'
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs'
3
3
  import { join } from 'node:path'
4
4
 
5
5
  import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
@@ -41,8 +41,12 @@ function checkLintField(id, ruleDir, raw, reporter) {
41
41
  reporter.fail(`rules/${id}: meta.json.lint нерозпізнане (очікується "per-file"|"full")`)
42
42
  return false
43
43
  }
44
- if (!existsSync(join(ruleDir, 'js', 'lint.mjs'))) {
45
- reporter.fail(`rules/${id}: lint:"${raw.lint}" але немає js/lint.mjs`)
44
+ const mainPath = join(ruleDir, 'main.mjs')
45
+ const src = existsSync(mainPath) ? readFileSync(mainPath, 'utf8') : ''
46
+ // Канон (ADR 2026-06-21): lint-поверхня — це експорт `lint` із `main.mjs` (інлайн або
47
+ // `export { lint } from './js/…'`), а не окремий `js/lint.mjs`.
48
+ if (!/export\s+(?:async\s+)?function\s+lint\b|export\s*\{[^}]*\blint\b/u.test(src)) {
49
+ reporter.fail(`rules/${id}: lint:"${raw.lint}" але main.mjs не експортує lint`)
46
50
  return false
47
51
  }
48
52
  return true
@@ -63,6 +67,12 @@ function checkRule(id, ruleDir, reporter) {
63
67
  ruleOk = false
64
68
  }
65
69
 
70
+ // Канон (scripts.mdc): {rule}.mdc — ОБОВ'ЯЗКОВИЙ у кожному npm/rules/<id>/.
71
+ if (!existsSync(join(ruleDir, `${id}.mdc`))) {
72
+ reporter.fail(`rules/${id}: відсутній ${id}.mdc — обов'язковий (scripts.mdc)`)
73
+ ruleOk = false
74
+ }
75
+
66
76
  const raw = readRuleMetaRaw(ruleDir)
67
77
  if (!raw) {
68
78
  reporter.fail(`rules/${id}: відсутній або невалідний meta.json`)
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -9,3 +9,4 @@ resource: npm/rules/php/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,33 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/php/main.mjs
5
+ docgen:
6
+ crc: a2c44b0c
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Скрипт виконує перевірку коду відповідно до правила `php.mdc`. Він запускає `composer audit` для перевірки залежностей, а також, якщо встановлені, виконує PHPStan, Psalm, PHP-CS-Fixer (у режимі dry-run) та PHPCS зі стандартом Security. Робота скрипта ґрунтується на конфігурації, визначеній у `composer.json`. Скрипт пропускає запуск інструменту, якщо відповідний виконуваний файл відсутній у `vendor/bin/`. Якщо `composer.json` відсутній у корені, інструменти не запускаються.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку, застосовуючи правила до контексту.
18
+ getPhpcsCodePaths визначає шляхи до каталогів коду для PHPCS, перевіряючи типові директорії (`app`, `src`, `lib`, `public`, `www`) або кореневий каталог.
19
+ runPhpLintSteps виконує послідовність перевірок: `composer audit`, PHP-CS-Fixer (dry-run), phpcs (Security), PHPStan та Psalm, пропускаючи кроки, якщо відповідні інструменти відсутні.
20
+ lint оркеструє виконання кроків PHP-лінтування для всього репозиторію.
21
+
22
+ ## Публічний API
23
+
24
+ run — головна точка входу для виконання правил (перевірка логіки застосування до JS-задач, політик та посилань MDC).
25
+ getPhpcsCodePaths — Визначає шляхи до коду, які має аналізувати PHPCS.
26
+ runPhpLintSteps — Виконує етапи лінтингу, включаючи аудит `composer`, `php-cs-fixer`, `phpstan` та `psalm`.
27
+ lint — Координує фазу лінтингу, виконуючи аудит `composer`, перевірку стилю коду (`php-cs-fixer`) та аналіз статичних аналізаторів (`phpstan`/`psalm`).
28
+
29
+ ## Гарантії поведінки
30
+
31
+ - Read-only: не виконує операцій запису (ФС/БД).
32
+ - Кешує результати в межах одного прогону.
33
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
@@ -3,25 +3,25 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/php/js/tooling.mjs
5
5
  docgen:
6
- crc: a3e6a475
7
- score: 95
6
+ crc: 22a05733
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Огляд
11
- Файл перевіряє наявність конфігураційних файлів для визначення залежностей та робочих потоків. Файл використовується для встановлення наявності певних файлів у репозиторії.
11
+ Модуль перевіряє наявність ключових конфігураційних файлів проєкту, а саме `composer.json` та `package.json`. Перевірка здійснюється за допомогою публічної функції `check`. Мета — підтвердити наявність базових файлів, необхідних для роботи проєкту (php.mdc).
12
12
 
13
13
  ## Поведінка
14
14
 
15
- 1. Перевірити наявність composer.json
16
- 2. Перевірити наявність package.json
17
- 3. Перевірити наявність .github/workflows/lint-php.yml
15
+ 1. Перевіряє наявність файлу `composer.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `composer.json` (php.mdc).
16
+ 2. Перевіряє наявність файлу `package.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `package.json` (php.mdc).
17
+ 3. Перевіряє наявність файлу `.github/workflows/lint-php.yml`. Якщо файл відсутній, повідомляє про необхідність створити його згідно з `php.mdc`.
18
+ 4. Повертає код виходу, який вказує на успішне виконання (0) або наявність проблем (1).
18
19
 
19
20
  ## Публічний API
20
21
 
21
- check — Перевіряє відповідність проєкту правилам php.mdc.
22
+ check — перевіряє відповідність проєкту стандартам php.mdc.
22
23
 
23
24
  ## Гарантії поведінки
24
25
 
25
- - Read-only: файл не виконує операцій запису у файлову систему.
26
+ - Read-only: не виконує операцій запису (ФС/БД).
26
27
  - Свідомо пропускає шляхи: `.github`, `.git`.
27
- - Не звертається до мережі.
@@ -12,9 +12,22 @@ import { spawnSync } from 'node:child_process'
12
12
  import { existsSync, statSync } from 'node:fs'
13
13
  import { join, resolve } from 'node:path'
14
14
 
15
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
16
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
17
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
15
+ import { isRunAsCli } from '../../scripts/cli-entry.mjs'
16
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
17
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
18
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
19
+ import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
20
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
21
+
22
+ /**
23
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
24
+ * → policy → mdc-refs); `lint()` нижче — lint-поверхня (composer/phpstan/psalm), імпл інлайн тут.
25
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
26
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
27
+ */
28
+ export function run(ctx) {
29
+ return runStandardRule(import.meta.dirname, ctx)
30
+ }
18
31
 
19
32
  const PHPCS_CODE_DIR_CANDIDATES = ['app', 'src', 'lib', 'public', 'www']
20
33
 
@@ -62,11 +75,11 @@ function runTool(label, abs, args, pass, fail) {
62
75
  }
63
76
 
64
77
  /**
65
- * Запускає `lint-php`.
78
+ * Запускає кроки `lint-php` (composer audit + php-cs-fixer/phpcs/phpstan/psalm).
66
79
  * @param {string} [cwd] корінь репозиторію
67
80
  * @returns {number} 0 — OK, 1 — є помилки
68
81
  */
69
- export function run(cwd = process.cwd()) {
82
+ export function runPhpLintSteps(cwd = process.cwd()) {
70
83
  const reporter = createCheckReporter()
71
84
  const { pass, fail } = reporter
72
85
 
@@ -121,6 +134,19 @@ export function run(cwd = process.cwd()) {
121
134
  return reporter.getExitCode()
122
135
  }
123
136
 
137
+ /**
138
+ * Оркестраторний адаптер `n-cursor lint php` (лінтер-фаза): composer audit + php-cs-fixer
139
+ * (`--dry-run`) + phpstan/psalm через `run` у `runStandardLint` (лок). Read-only — мутацій
140
+ * немає, тож `opts` ігнорується. Структурні php.mdc-перевірки — у конформність-фазі.
141
+ * @param {string[] | undefined} _files ігнорується (whole-repo обхід)
142
+ * @param {string} [cwd] корінь
143
+ * @returns {Promise<number>} exit code
144
+ */
145
+ export function lint(_files, cwd = process.cwd()) {
146
+ return runStandardLint(import.meta.dirname, () => runPhpLintSteps(cwd))
147
+ }
148
+
124
149
  if (isRunAsCli(import.meta.url)) {
125
- process.exitCode = run()
150
+ // Standalone: bun rules/php/main.mjs повний еквівалент `npx @nitra/cursor check php`.
151
+ process.exitCode = await runRuleCli(import.meta.dirname)
126
152
  }
@@ -9,3 +9,4 @@ resource: npm/rules/python/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/python/main.mjs
5
+ docgen:
6
+ crc: 8ceba96a
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Виконує логіку `lint-python` за правилом `python.mdc` для забезпечення якості коду Python. Якщо файл `pyproject.toml` відсутній у корені, виконання завершується з кодом 0. Якщо файл присутній, але `uv` не знайдено у системному шляху, це вважається помилкою, оскільки `uv` є єдиним дозволеним пакет-менеджером (без Poetry). Для роботи необхідно виконати `uv lock --check` для підтвердження актуальності файлу блокування та `uv sync --frozen` для створення середовища, що відповідає `uv.lock` (детальніше про `uv` на https://docs.astral.sh/uv/). Опціональні лінтери запускаються лише за умови їх доступності через `uv run`. Запускаються `ruff` у режимі автоматичного виправлення (`--fix`) та форматування, а також `mypy` для статичного аналізу коду, використовуючи канонічний патерн серіалізації через `runStandardLint`.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку на основі контексту.
18
+ runLintPythonSteps виконує послідовність кроків лінтування Python, включаючи перевірку `pyproject.toml`, виконання `uv lock --check` та `uv sync --frozen`, а також запуск опціональних лінтерів (`ruff`, `mypy`) через `uv run`.
19
+ runLintPython запускає послідовність кроків лінтування Python, використовуючи механізм стандартного лінтування.
20
+ lint оркеструє запуск `runLintPython` для аналізу всього проєкту.
21
+
22
+ ## Публічний API
23
+
24
+ run — Основна точка входу для виконання правил, що включає перевірку логіки застосування (JS-concerns → policy → mdc-refs) та виконання лінтингу.
25
+ runLintPythonSteps — Виконує внутрішні етапи лінтингу для Python без збереження логів.
26
+ runLintPython — Публічний інтерфейс для запуску лінтингу Python, що забезпечує унікальність виконання через блокування та аналіз стану репозиторію.
27
+ lint — Координатор, який ініціює запуск лінтингу Python, делегуючи це `runLintPython`.
28
+
29
+ ## Гарантії поведінки
30
+
31
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -3,32 +3,32 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/python/js/tooling.mjs
5
5
  docgen:
6
- crc: f4dc22e2
7
- score: 95
6
+ crc: fcabec1d
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Файл виконує перевірку наявності конфігураційних та залежностей у кореневому каталозі репозиторію. Він перевіряє структуру проекту відповідно до вимог, визначених у package.json.
11
+ Модуль перевіряє відповідність структури проєкту вимогам, визначеним у `python.mdc`. Він перевіряє наявність ключових файлів конфігурації, таких як `pyproject.toml`, `uv.lock` та `package.json`, у корені репозиторію. Мета — підтвердити відповідність проєкту встановленим стандартам, зокрема щодо використання `uv` замість Poetry.
12
+
13
+ Поведінка
14
+ Виконує перевірку за допомогою публічної функції `check`. Ігнорує шляхи `.github` та `.git`. Не виконує операцій запису у файлову систему чи бази даних (Read-only). (python.mdc)
11
15
 
12
16
  ## Поведінка
13
17
 
14
- 1. Перевірити наявність `pyproject.toml` у корені репозиторію.
15
- 2. Перевірити наявність `uv.lock` у корені репозиторію.
16
- 3. Якщо `uv.lock` відсутній, повернути код виходу.
17
- 4. Перевірити наявність `poetry.lock` у корені репозиторію.
18
- 5. Якщо `poetry.lock` знайдено, повернути помилку.
19
- 6. Якщо `poetry.lock` відсутній, пропустити.
20
- 7. Перевірити наявність `package.json` у корені репозиторію.
21
- 8. Якщо `package.json` відсутній, повернути помилку.
22
- 9. Перевірити наявність файлу `.github/workflows/lint-python.yml` у корені репозиторію.
23
- 10. Якщо файлу `.github/workflows/lint-python.yml` немає, повернути помилку.
24
- 11. Повернути код виходу.
18
+ 1. Перевіряє відповідність проєкту правилам (python.mdc) у вказаному корені репозиторію.
19
+ 2. Якщо файл `pyproject.toml` відсутній у корені, повертає код виходу, що вказує на відсутність конфігурації.
20
+ 3. Перевіряє наявність файлу `uv.lock`. Якщо він відсутній, повідомляє про необхідність згенерувати його за допомогою `uv lock` (python.mdc).
21
+ 4. Перевіряє відсутність файлів `poetry.lock` та `poetry.toml`. Якщо будь-який із них знайдено, повідомляє про необхідність відмови від Poetry та міграції на `uv` (python.mdc).
22
+ 5. Перевіряє наявність файлу `package.json` у корені. Якщо він відсутній, повідомляє про необхідність його додавання (python.mdc).
23
+ 6. Перевіряє наявність файлу `.github/workflows/lint-python.yml` у корені. Якщо він відсутній, повідомляє про необхідність його створення згідно з документацією (python.mdc).
24
+ 7. Повертає код виходу, що відображає загальний стан перевірки.
25
+ 8. Не перевіряє шляхи, що містять `.github` або `.git`.
25
26
 
26
27
  ## Публічний API
27
28
 
28
- check — Перевіряє відповідність проєкту правилам python.mdc.
29
+ check — перевіряє відповідність проєкту стандартам python.mdc.
29
30
 
30
31
  ## Гарантії поведінки
31
32
 
32
- - Read-only: файл не виконує операцій запису у файлову систему.
33
+ - Read-only: не виконує операцій запису (ФС/БД).
33
34
  - Свідомо пропускає шляхи: `.github`, `.git`.
34
- - Не звертається до мережі.
@@ -24,10 +24,22 @@ import { spawnSync } from 'node:child_process'
24
24
  import { existsSync } from 'node:fs'
25
25
  import { join } from 'node:path'
26
26
 
27
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
28
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
29
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
30
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
27
+ import { isRunAsCli } from '../../scripts/cli-entry.mjs'
28
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
29
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
30
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
31
+ import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
32
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
33
+
34
+ /**
35
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
36
+ * → policy → mdc-refs); `lint()` нижче — lint-поверхня (uv/ruff/mypy), імпл інлайн тут.
37
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
38
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
39
+ */
40
+ export function run(ctx) {
41
+ return runStandardRule(import.meta.dirname, ctx)
42
+ }
31
43
 
32
44
  /**
33
45
  * Запускає CLI-крок і репортить результат.
@@ -117,6 +129,18 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
117
129
  export const runLintPython = (opts = {}) =>
118
130
  runStandardLint(import.meta.dirname, () => runLintPythonSteps(process.cwd(), opts))
119
131
 
132
+ /**
133
+ * Оркестраторний адаптер `n-cursor lint python`: делегує у `runLintPython`.
134
+ * @param {string[] | undefined} _files ігнорується (whole-project аналіз)
135
+ * @param {string} [_cwd] корінь (CLI бере process.cwd())
136
+ * @param {{ readOnly?: boolean }} [opts] readOnly → ruff без `--fix`, format `--check`
137
+ * @returns {Promise<number>} exit code
138
+ */
139
+ export function lint(_files, _cwd, opts = {}) {
140
+ return runLintPython({ readOnly: opts.readOnly === true })
141
+ }
142
+
120
143
  if (isRunAsCli(import.meta.url)) {
121
- process.exitCode = await runLintPython({ readOnly: process.argv.includes('--read-only') })
144
+ // Standalone: bun rules/python/main.mjs повний еквівалент `npx @nitra/cursor check python`.
145
+ process.exitCode = await runRuleCli(import.meta.dirname)
122
146
  }
@@ -9,3 +9,4 @@ resource: npm/rules/rego/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,37 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/rego/main.mjs
5
+ docgen:
6
+ crc: e58082a1
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Файл реалізує конвеєр для лінтування Rego-полісів, що знаходяться у каталозі `npm/rules/` (де живуть Rego-полісі пакета `@nitra/cursor`). Конвеєр послідовно виконує три етапи перевірки: строгу компіляцію за допомогою `opa check --strict`, яка виявляє помилки компіляції, незадекларовані змінні та інші проблеми, які ігнорує `regal`; статичне лінтування за допомогою `regal lint` (згідно з https://docs.styra.com/regal), що перевіряє відповідність стилю та ідіоматичності Rego v1; та опціональний запуск юніт-тестів за допомогою `conftest verify` (як описано на https://www.conftest.dev/install/). Резолюція інструментів (`opa`, `regal`) здійснюється через механізм `ensureTool`, що забезпечує їх доступність у середовищі. Усі операції керуються конфігурацією, визначеною у `target.json`.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку політики, застосовуючи логіку, пов'язану з JS-контекстами та посиланнями на MDC.
18
+
19
+ runLintRegoSteps запускає послідовні кроки лінтування Rego-полісі: `opa check --strict`, `regal lint` та опціонально `conftest verify` для файлів-тестів, якщо `conftest` доступний у PATH.
20
+
21
+ runLintRego серіалізує виконання кроків лінтування Rego, забезпечуючи дедуплікацію на основі стану git-дерева.
22
+
23
+ lint делегує виконання повного аналізу Rego-полісі функції runLintRego.
24
+
25
+ ## Публічний API
26
+
27
+ run — Основна точка входу правила, яка застосовує логіку до JS-зацікавлень, політики та посилання на MDC.
28
+
29
+ runLintRegoSteps — Виконує перевірку за допомогою `opa check --strict` та лінтинг за допомогою `regal lint` для визначених цілей. Зупиняє виконання з кодом 1, якщо попередні перевірки не пройшли.
30
+
31
+ runLintRego — Публічний інтерфейс для запуску лінтінгу Rego, що забезпечує дедуплікацію на основі стану репозиторію.
32
+
33
+ lint — Адаптер, що керує запуском лінтінгу Rego, делегуючи це `runLintRego`.
34
+
35
+ ## Гарантії поведінки
36
+
37
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -30,10 +30,22 @@ import { spawnSync } from 'node:child_process'
30
30
  import { existsSync } from 'node:fs'
31
31
  import { resolve } from 'node:path'
32
32
 
33
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
34
- import { ensureTool } from '../../../scripts/lib/ensure-tool.mjs'
35
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
36
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
33
+ import { isRunAsCli } from '../../scripts/cli-entry.mjs'
34
+ import { ensureTool } from '../../scripts/lib/ensure-tool.mjs'
35
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
36
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
37
+ import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
38
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
39
+
40
+ /**
41
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies → JS-concerns
42
+ * → policy → mdc-refs. `lint()` нижче — lint-поверхня (opa/regal/conftest), імпл інлайн тут.
43
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
44
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
45
+ */
46
+ export function run(ctx) {
47
+ return runStandardRule(import.meta.dirname, ctx)
48
+ }
37
49
 
38
50
  /** Шляхи з Rego-полісі (відносно cwd). Існують не всі на ранніх стадіях — фільтруємо нижче. */
39
51
  const LINT_TARGETS = ['npm/rules']
@@ -98,6 +110,16 @@ export function runLintRegoSteps(cwd = process.cwd()) {
98
110
  */
99
111
  export const runLintRego = () => runStandardLint(import.meta.dirname, () => runLintRegoSteps())
100
112
 
113
+ /**
114
+ * Оркестраторний адаптер `n-cursor lint rego`: делегує у `runLintRego`.
115
+ * @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
116
+ * @returns {Promise<number>} exit code
117
+ */
118
+ export function lint(_files) {
119
+ return runLintRego()
120
+ }
121
+
101
122
  if (isRunAsCli(import.meta.url)) {
102
- process.exitCode = await runLintRego()
123
+ // Standalone: bun rules/rego/main.mjs повний еквівалент `npx @nitra/cursor check rego`.
124
+ process.exitCode = await runRuleCli(import.meta.dirname)
103
125
  }
@@ -10,4 +10,5 @@ resource: npm/rules/release/
10
10
  |---|---|
11
11
  | [change.mjs](change.md) | JS Module |
12
12
  | [fix.mjs](fix.md) | JS Module |
13
+ | [main.mjs](main.md) | JS Module |
13
14
  | [release.mjs](release.md) | JS Module |
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/release/main.mjs
5
+ docgen:
6
+ crc: 22936815
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль забезпечує оркестрацію та виконання набору правил. При запуску як CLI ініціює повну оркестрацію правил. Як частина процесу, викликає публічну функцію `run` для виконання стандартного правила у контексті поточної директорії. Результат виконання цього правила визначає код виходу процесу. Модуль не модифікує файлову систему чи бази даних. Результати виконання правил кешуються протягом одного прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Якщо код виконується як CLI, він запускає оркестрацію правил.
18
+ 2. Якщо код виконується як частина процесу, він викликає функцію `run`.
19
+ 3. Функція `run` запускає стандартне правило для директорії, де знаходиться цей файл, використовуючи наданий контекст прогону.
20
+ 4. Результат виконання стандартного правила визначає код виходу процесу.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує послідовність дій: застосовує правила, обробляє JS-занепокоєння, перевіряє політику та посилання MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.