@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
@@ -16,7 +16,7 @@
16
16
  "hooks": [
17
17
  {
18
18
  "type": "command",
19
- "command": "npx --no @nitra/cursor post-tool-use-fix",
19
+ "command": "npx --no @nitra/cursor post-tool-use-check",
20
20
  "timeout": 300
21
21
  }
22
22
  ]
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [12.7.0] - 2026-06-21
4
+
5
+ ### Added
6
+
7
+ - doc-files: orphan-detect і auto-purge — `lint-doc-files` і `fix-doc-files` тепер виявляють і видаляють `docs/<stem>.md` чиї source-файли більше не існують
8
+
9
+ ### Changed
10
+
11
+ - Переміщено логіку linting до `js` та оновив `n-cursor.js
12
+
13
+ ## [12.6.1] - 2026-06-21
14
+
15
+ ### Changed
16
+
17
+ - Оновлено text rule docs і helper-приклади на n-cursor lint text без package.json lint-text wrapper.
18
+
3
19
  ## [12.6.0] - 2026-06-21
4
20
 
5
21
  ### Changed
@@ -5,7 +5,7 @@
5
5
  Файл `npm/bin/n-cursor.js` — це виконуваний скрипт (shebang `#!/usr/bin/env node`), що слугує єдиною точкою входу CLI пакета `@nitra/cursor`. Скрипт виконує дві ролі:
6
6
 
7
7
  1. **Синхронізатор пакетних артефактів у проєкті-споживачі** — без аргументів копіює `.mdc`-правила, скіли, slash-команди, генерує `AGENTS.md`, `CLAUDE.md`, синхронізує `.claude/settings.json`, `.cursor/hooks.json`, composite GitHub Action `setup-bun-deps`, `.pi/skills`, а також `.gitignore` для `.worktrees/`.
8
- 2. **Маршрутизатор підкоманд** — диспатчить `fix`, `check`, `rename-yaml-extensions`, `post-tool-use-fix`, `lint`, `lint-ci`, `lint-ga`, `lint-rego`, `lint-k8s`, `lint-docker`, `lint-text`, `coverage`, `change`, `release`, `skill`, `worktree`, `trace`, `docgen` у відповідні внутрішні модулі пакета.
8
+ 2. **Маршрутизатор підкоманд** — диспатчить `fix`, `check`, `rename-yaml-extensions`, `post-tool-use-fix`, `lint`, `lint-ci`, `lint-doc-files`, `fix-doc-files`, `coverage`, `coverage-fix`, `analyze-escalation`, `taze`, `start-check`, `change`, `release`, `skill`, `worktree`, `trace`, `doc-aggregate`, `adr-normalize-local` у відповідні внутрішні модулі пакета.
9
9
 
10
10
  Скрипт — ES-модуль (`import` синтаксис). Виконує реальні файлові операції в `cwd()` і у каталогах пакету (`BUNDLED_PACKAGE_ROOT`). Усі шляхи відносно поточної робочої директорії проєкту-споживача.
11
11
 
@@ -17,13 +17,8 @@
17
17
  - `npx @nitra/cursor check` — deprecated alias для `fix` (виводить попередження).
18
18
  - `npx @nitra/cursor rename-yaml-extensions` — перейменування `*.yml`/`*.yaml` у k8s/.github (підтримує `--dry-run`, `--root=…`).
19
19
  - `npx @nitra/cursor post-tool-use-fix` — entry point PostToolUse hook Claude Code: читає JSON зі stdin, маршрутизує `tool_input.file_path` у релевантні правила.
20
- - `npx @nitra/cursor lint` — оркестратор `lint-*` / `oxfmt` ланцюжка з вимірюванням таймінгу (fail-fast).
21
- - `npx @nitra/cursor lint-ci` — те саме, але режим CI.
22
- - `npx @nitra/cursor lint-ga` — канонічний `lint-ga` (shellcheck preflight → `bunx github-actionlint` → `uvx zizmor --offline --collect=workflows .`).
23
- - `npx @nitra/cursor lint-rego` — канонічний `lint-rego` (`opa check --strict` → `regal lint` → опційно `conftest verify`).
24
- - `npx @nitra/cursor lint-k8s` — канонічний `lint-k8s` (`kubeconform` + `kubescape`).
25
- - `npx @nitra/cursor lint-docker` — канонічний `lint-docker` (`hadolint`).
26
- - `npx @nitra/cursor lint-text` — канонічний `lint-text` (`cspell` → `shellcheck` з auto-fix → `markdownlint-cli2 --fix` → `v8r`).
20
+ - `npx @nitra/cursor lint` — data-driven оркестратор lint+конформності: `--full` (весь репо, включно з `full`-правилами), `--read-only` (CI, нуль мутацій); без прапорів — per-file дельта vs origin.
21
+ - `npx @nitra/cursor lint-ci` — те саме у CI-режимі.
27
22
  - `npx @nitra/cursor coverage [--fix] [--changed]` — оркестратор покриття та мутаційного тестування.
28
23
  - `npx @nitra/cursor change` — створення change-файлу.
29
24
  - `npx @nitra/cursor release` — реліз-команда.
@@ -60,7 +55,6 @@
60
55
  - `discoverCheckRulesFromCursorRules` зі `scripts/lib/discover-check-rules-from-cursor.mjs`
61
56
  - `listRuleIds` зі `scripts/lib/list-rule-ids.mjs`
62
57
  - `ensureNitraCursorInRootDevDependencies` зі `scripts/ensure-nitra-cursor-dev-dependencies.mjs`
63
- - `runLintDocker`, `runLintGaCli`, `runLintK8s`, `runLintRego`, `runLintTextCli` — з `rules/*/lint/lint.mjs`
64
58
  - `syncClaudeConfig` зі `scripts/sync-claude-config.mjs`
65
59
  - `syncGitignoreWorktree` зі `scripts/lib/sync-gitignore-worktree.mjs`
66
60
  - `upgradeNitraCursorToLatestAndBunInstall` зі `scripts/upgrade-nitra-cursor-and-install.mjs`
@@ -465,13 +459,8 @@ try {
465
459
  - `'check'` → друкує deprecated-попередження й виконує `runFixCommand(args)`.
466
460
  - `'rename-yaml-extensions'` → `runRenameYamlExtensionsCli(args)`; якщо повернений код `!== 0`, `process.exitCode = 1`.
467
461
  - `'post-tool-use-fix'` → `runPostToolUseFixCli()` (PostToolUse hook Claude Code, читає stdin); `process.exitCode` = повернений код.
468
- - `'lint'` → `runLint({ ci: false })`.
462
+ - `'lint'` → `runLint({ full, readOnly, rules })` (прапори `--full`, `--read-only`; позиційні аргументи — фільтр правил конформності).
469
463
  - `'lint-ci'` → `runLint({ ci: true })`.
470
- - `'lint-ga'` → `runLintGaCli()` (`await` обовʼязковий — `check-ga` async).
471
- - `'lint-rego'` → `runLintRego()`.
472
- - `'lint-k8s'` → `runLintK8s()`.
473
- - `'lint-docker'` → `runLintDocker()`.
474
- - `'lint-text'` → `runLintTextCli()`.
475
464
  - `'coverage'` → динамічний import `../rules/test/coverage/coverage.mjs`, виклик `runCoverageCli({ fix: args.includes('--fix'), changed: args.includes('--changed') })`.
476
465
  - `'change'` → динамічний import `../rules/release/change.mjs` → `runChangeCli(args)`.
477
466
  - `'release'` → динамічний import `../rules/release/release.mjs` → `runReleaseCli(args)`.
@@ -516,11 +505,6 @@ try {
516
505
  - `../scripts/lib/discover-check-rules-from-cursor.mjs` — `discoverCheckRulesFromCursorRules`.
517
506
  - `../scripts/lib/list-rule-ids.mjs` — `listRuleIds`.
518
507
  - `../scripts/ensure-nitra-cursor-dev-dependencies.mjs` — `ensureNitraCursorInRootDevDependencies`.
519
- - `../rules/docker/lint/lint.mjs` — `runLintDocker`.
520
- - `../rules/ga/lint/lint.mjs` — `runLintGaCli`.
521
- - `../rules/k8s/lint/lint.mjs` — `runLintK8s`.
522
- - `../rules/rego/lint/lint.mjs` — `runLintRego`.
523
- - `../rules/text/lint/lint.mjs` — `runLintTextCli`.
524
508
  - `../scripts/sync-claude-config.mjs` — `syncClaudeConfig`.
525
509
  - `../scripts/lib/sync-gitignore-worktree.mjs` — `syncGitignoreWorktree`.
526
510
  - `../scripts/upgrade-nitra-cursor-and-install.mjs` — `upgradeNitraCursorToLatestAndBunInstall`.
package/bin/n-cursor.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * `npx \@nitra/cursor` — завантажити cursor-правила (синк); якщо в корені вже є `.n-cursor.json`,
8
8
  * спочатку зчитується конфіг і за потреби дописується `$schema`
9
9
  * `npx \@nitra/cursor rename-yaml-extensions` — k8s `*.yml` → `*.yaml`, `.github` `*.yaml` → `*.yml` (опції: `--dry-run`, `--root=…`; див. bin/rename-yaml-extensions.mjs)
10
- * `npx \@nitra/cursor post-tool-use-fix` — точка входу PostToolUse hook Claude Code: читає stdin JSON,
10
+ * `npx \@nitra/cursor post-tool-use-check` — точка входу PostToolUse hook Claude Code: читає stdin JSON,
11
11
  * дістає `tool_input.file_path`, маршрутизує його у відповідні правила
12
12
  * (`*.mjs` → `js-lint`, `*.vue` → `js-lint style-lint vue` тощо) і викликає
13
13
  * `fix` лише з ними. Прописується автоматично в `.claude/settings.json`.
@@ -16,14 +16,6 @@
16
16
  * весь репо (`per-file` ∪ `full`); `--read-only` = без мутацій/LLM (CI); позиційні
17
17
  * (не-флаг) аргументи — фільтр правил конформності (мапить колишній `fix <rule>`).
18
18
  * CI = `lint --read-only --full` (весь репо, нуль мутацій/LLM).
19
- * `npx \@nitra/cursor lint-ga` — канонічний lint-ga (ga.mdc): preflight на `shellcheck` →
20
- * `bunx github-actionlint` → `uvx zizmor --offline --collect=workflows .`
21
- * `npx \@nitra/cursor lint-rego` — канонічний lint-rego (conftest.mdc + rego.mdc):
22
- * preflight на `opa`/`regal` → `opa check --strict` → `regal lint` → опц. `conftest verify`
23
- * `npx \@nitra/cursor lint-k8s` — канонічний lint-k8s (k8s.mdc): `kubeconform` + `kubescape` по `…/k8s/*.yaml`
24
- * `npx \@nitra/cursor lint-docker` — канонічний lint-docker (docker.mdc): `hadolint` по `Dockerfile`/`*.Dockerfile`
25
- * `npx \@nitra/cursor lint-text` — канонічний lint-text (text.mdc): `cspell` → `shellcheck` (з auto-fix) →
26
- * `markdownlint-cli2 --fix` → `v8r` (json/json5/yaml/yml/toml)
27
19
  * `npx \@nitra/cursor lint-doc-files` — детермінований детектор застарілості файлових док (`stale`: `missing`|`crc-mismatch`); правило doc-files (ignore-glob у `npm/rules/doc-files/js/docgen-ignore.mjs`; тека `docs/` поряд із джерелом). Режими: повний (exit 1), `--json` (exit 0), `--missing-only`, `--hook`/`--git` (hook-протокол, exit 2), `--degraded`
28
20
  * `npx \@nitra/cursor fix-doc-files` — JS-оркестрована генерація файлових док (роутинг local/cloud) зі штампом CRC (`--limit`/`--from`/`--overwrite`); `--stamp` — детерміноване перештампування CRC без LLM
29
21
  * `npx \@nitra/cursor doc-aggregate modules` — JSON-лістинг логічних модулів (межі за `package.json`) для Tier 2 скілу doc-aggregate
@@ -94,22 +86,17 @@ import { detectAutoSkills } from '../scripts/auto-skills.mjs'
94
86
  import { readSkillMetaRaw } from '../scripts/lib/skill-meta.mjs'
95
87
  import { injectWorktreeNotice } from '../scripts/lib/worktree-notice.mjs'
96
88
  import { injectRootNotice } from '../scripts/lib/root-notice.mjs'
97
- import { runPostToolUseFixCli } from '../scripts/post-tool-use-fix.mjs'
89
+ import { runPostToolUseCheckCli } from '../scripts/post-tool-use-check.mjs'
98
90
  import { listProjectRulesMdcFiles } from '../scripts/lib/list-project-rules-mdc.mjs'
99
91
  import { ensureNitraCursorInRootDevDependencies } from '../scripts/ensure-nitra-cursor-dev-dependencies.mjs'
100
92
  import { assertCwdIsProjectRoot } from '../scripts/lib/assert-project-root.mjs'
101
- import { runLintDocker } from '../rules/docker/lint/lint.mjs'
102
- import { runLintGaCli } from '../rules/ga/lint/lint.mjs'
103
- import { runLintK8s } from '../rules/k8s/lint/lint.mjs'
104
- import { runLintRego } from '../rules/rego/lint/lint.mjs'
105
- import { runLintTextCli } from '../rules/text/lint/lint.mjs'
106
93
  import { syncClaudeConfig } from '../scripts/sync-claude-config.mjs'
107
94
  import { syncGitignoreWorktree } from '../scripts/lib/sync-gitignore-worktree.mjs'
108
95
  import { upgradeNitraCursorToLatestAndBunInstall } from '../scripts/upgrade-nitra-cursor-and-install.mjs'
109
96
  import { runRenameYamlExtensionsCli } from './rename-yaml-extensions.mjs'
110
97
  import { runSkillsCli } from '../scripts/skills-cli.mjs'
111
98
  import { syncSetupBunDepsAction } from '../scripts/sync-setup-bun-deps-action.mjs'
112
- import { runLint } from '../rules/lint/js/orchestrate.mjs'
99
+ import { runLint } from '../scripts/lib/run-lint.mjs'
113
100
 
114
101
  const PACKAGE_NAME = '@nitra/cursor'
115
102
  const CONFIG_FILE = '.n-cursor.json'
@@ -1527,10 +1514,10 @@ try {
1527
1514
 
1528
1515
  break
1529
1516
  }
1530
- case 'post-tool-use-fix': {
1517
+ case 'post-tool-use-check': {
1531
1518
  // Викликається з .claude/settings.json як PostToolUse hook Claude Code.
1532
1519
  // Маршрутизує змінений файл у релевантні правила і прокидає `fix` лише з ними.
1533
- const code = await runPostToolUseFixCli()
1520
+ const code = await runPostToolUseCheckCli()
1534
1521
  process.exitCode = code
1535
1522
 
1536
1523
  break
@@ -1548,39 +1535,6 @@ try {
1548
1535
 
1549
1536
  break
1550
1537
  }
1551
- case 'lint-ga': {
1552
- // Канонічний lint-ga з preflight на shellcheck → actionlint → zizmor → check-ga (ga.mdc).
1553
- // Останній крок (check-ga) async — тому await обов'язковий, інакше process.exitCode буде Promise.
1554
- process.exitCode = await runLintGaCli()
1555
-
1556
- break
1557
- }
1558
- case 'lint-rego': {
1559
- // Канонічний lint-rego: preflight opa/regal → opa check --strict → regal lint → conftest verify (опц.).
1560
- process.exitCode = await runLintRego()
1561
-
1562
- break
1563
- }
1564
- case 'lint-k8s': {
1565
- // Канонічний lint-k8s: kubeconform + kubescape по знайдених деревах `…/k8s/*.yaml`.
1566
- process.exitCode = await runLintK8s()
1567
-
1568
- break
1569
- }
1570
- case 'lint-docker': {
1571
- // Канонічний lint-docker: hadolint по Dockerfile та *.Dockerfile (docker.mdc).
1572
- process.exitCode = await runLintDocker()
1573
-
1574
- break
1575
- }
1576
- case 'lint-text': {
1577
- // Канонічний lint-text: cspell → shellcheck → dotenv → markdownlint → v8r (text.mdc).
1578
- // `--read-only` (CI): без авто-фіксу (markdownlint/shellcheck/dotenv) — нуль мутацій.
1579
- // `llmFix:true` — text llmFix-capable, тож standalone lint-text робить omlx-класифікацію cspell.
1580
- process.exitCode = await runLintTextCli({ readOnly: args.includes('--read-only'), llmFix: true })
1581
-
1582
- break
1583
- }
1584
1538
  case 'coverage': {
1585
1539
  // n-cursor coverage — оркестратор покриття + мутаційного тестування з discovery
1586
1540
  // провайдерів через .n-cursor.json#rules (test.mdc). --changed звужує scope до
@@ -1655,7 +1609,7 @@ try {
1655
1609
  // n-cursor lint-doc-files — детермінований детектор застарілості файлових док
1656
1610
  // (missing ∪ crc-mismatch). Режими: (повний) exit 1, --json exit 0, --missing-only,
1657
1611
  // --hook/--git/--degraded — hook-протокол (exit 2/0). Деталі — doc-files.mdc.
1658
- const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
1612
+ const { runLintDocFilesCli } = await import('../rules/doc-files/main.mjs')
1659
1613
  process.exitCode = await runLintDocFilesCli(args)
1660
1614
 
1661
1615
  break
@@ -1706,7 +1660,7 @@ try {
1706
1660
  default: {
1707
1661
  console.error(`❌ Невідома команда: ${command}`)
1708
1662
  console.error(
1709
- ` Очікується: (без аргументів) синхронізація правил, rename-yaml-extensions, post-tool-use-fix, adr-normalize-local, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, lint-doc-files, fix-doc-files, coverage, coverage-fix, analyze-escalation, taze, start-check, change, release, skill, trace, doc-aggregate`
1663
+ ` Очікується: (без аргументів) синхронізація правил, rename-yaml-extensions, post-tool-use-check, adr-normalize-local, lint (включно зі scope: lint ga|rego|k8s|docker|text), lint-doc-files, fix-doc-files, coverage, coverage-fix, analyze-escalation, taze, start-check, change, release, skill, trace, doc-aggregate`
1710
1664
  )
1711
1665
  process.exitCode = 1
1712
1666
  }
@@ -3,39 +3,31 @@ type: JS Module
3
3
  title: stryker.config.mjs
4
4
  resource: npm/stryker.config.mjs
5
5
  docgen:
6
- crc: b8c7377b
6
+ crc: 2f4ed270
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Цей файл містить дані про користувачів системи. Він використовується для зберігання інформації, необхідної для аутентифікації та авторизації користувачів, а також для управління їхніми правами доступу. Файл забезпечує централізоване місце для зберігання даних про користувачів, що спрощує управління обліковими записами.
11
+ ## Огляд
12
+
13
+ Цей файл конфігурує процес тестування та мутаційного аналізу, використовуючи Vitest як тестовий раннер. Він визначає, які файли підлягають мутації (у `scripts`, `rules`, `bin`) та які виключаються, спираючись на `mutation.json`. Конфігурація налаштовує Stryker для запуску лише тестів, що покривають мутовані рядки. Також конфігурація використовує `incremental.json` для збереження даних між запусками.
10
14
 
11
15
  ## Поведінка
12
16
 
13
- 1. Створює директорію `reports/stryker/.tmp` для тимчасових результатів тестування.
14
- 2. Запускає тести, використовуючи `vitest`, для кожного мутантного сценарію.
15
- 3. Використовує стратегію `perTest` для покриття лише тих тестів, які змінюються внаслідок мутації.
16
- 4. Аналізує результати тестування та генерує JSON-файл `mutation.json` з інформацією про покриття коду.
17
- 5. Зберігає результати тестування в файлі `incremental.json` для відновлення після збоїв та прискорення подальших проходів.
18
- 6. Мутує наступні файли: `scripts/**/*.mjs`, `rules/**/*.mjs`, `bin/**/*.{js,mjs}`.
19
- 7. Виключає з мутації директорії `**/tests**`, `**/__fixtures__/**`, `**/fixtures/**`, `**/data/**`, `**/template/**`, `**/templates/**` та `bin/`.
20
- 8. Виключає з мутації файл `rules/test/js/data/stryker_config/stryker-vue-macros-ignorer.mjs`.
21
- 9. Використовує формати JSON та текстовий формат для виведення результатів тестування.
17
+ 1. Визначає тестовий раннер як Vitest.
18
+ 2. Вказує конфігураційний файл для Vitest.
19
+ 3. Налаштовує аналіз покриття так, що Stryker запускає лише тести, що покривають мутовану лінію.
20
+ 4. Встановлює тимчасову директорію для звітів Stryker.
21
+ 5. Визначає репортери для виводу результатів у форматі JSON та звичайному тексті.
22
+ 6. Вказує ім'я файлу для JSON-звіту.
23
+ 7. Вмикає функціонал збереження результатів між запусками, використовуючи файл `incremental.json`.
24
+ 8. Визначає список файлів, які підлягають мутації:
25
+ * Файли у директорії `scripts`.
26
+ * Файли у директорії `rules`.
27
+ * Файли у директорії `bin`.
28
+ 9. Виключає з мутації файли у директоріях `tests`, `__fixtures__`, `fixtures`, `data`, `template`, `templates`.
29
+ 10. Виключає з мутації файли у директорії `data`, крім файлу `stryker-vue-macros-ignorer.mjs` у директорії `rules/test/js/data/stryker_config/`.
22
30
 
23
31
  ## Гарантії поведінки
24
32
 
25
- - Зміна значення неможлива.
26
- - Зміна значення не впливає на інші частини коду.
27
- - Зміна значення не призводить до помилок.
28
- - Зміна значення не впливає на стан системи.
29
- - Зміна значення не впливає на інші поточні операції.
30
- - Зміна значення не впливає на будь-які дані, які можуть бути використані в майбутньому.
31
- - Зміна значення не впливає на будь-які зовнішні системи.
32
- - Зміна значення не призводить до непередбачуваної поведінки.
33
- - Зміна значення не впливає на будь-які дані, які можуть бути використані в майбутньому.
34
- - Зміна значення не впливає на будь-які зовнішні системи.
35
- - Зміна значення не призводить до непередбачуваної поведінки.
36
- - Зміна значення не впливає на будь-які дані, які можуть бути використані в майбутньому.
37
- - Зміна значення не впливає на будь-які зовнішні системи.
38
- - Зміна значення не призводить до непередбачуваної поведінки.
39
- - Зміна значення не впливає на будь-які дані, які можуть бути використані в майбутньому.
40
- - Зміна значення не впливає на будь-які зовнішні системи.
41
- - Зміна
33
+ - (специфічних машинно-виведених гарантій немає)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "12.6.0",
3
+ "version": "12.7.0",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -9,3 +9,4 @@ resource: npm/rules/abie/
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/abie/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-запитів, посилаючись на MDC-ресурси відповідно до конфігурації `meta.json`. При запуску як окремий інструмент (CLI) він виконує повний цикл обробки, завантажує конфігурації та формує підсумковий звіт. Модуль є Read-only, тобто не здійснює записів у файлову систему чи бази даних. Кешування даних відбувається у межах одного прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC-ресурси, використовуючи конфігурацію з `meta.json`.
19
+ 3. Якщо код виконується як окремий інструмент (CLI), викликається логіка для повного виконання правила.
20
+ 4. Виконання в режимі CLI забезпечує завантаження конфігурацій та підсумок.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: застосовує перевірки JS-зацікавлень, політики та посилання на MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -2,7 +2,9 @@ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
2
  import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
3
 
4
4
  /**
5
- * Запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` check-поверхня: applies
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
6
8
  * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
9
  * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
10
  * @returns {Promise<number>} 0 — OK, 1 — порушення
@@ -12,7 +14,7 @@ export function run(ctx) {
12
14
  }
13
15
 
14
16
  if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
17
19
  process.exitCode = await runRuleCli(import.meta.dirname)
18
20
  }
@@ -9,3 +9,4 @@ resource: npm/rules/adr/
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/adr/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-запити та звертаючись до MDC. При запуску як окремий інструмент, він ініціює повний цикл правил, включаючи завантаження конфігурацій з meta.json. Модуль має лише читачний доступ до файлової системи та баз даних. Під час виконання він використовує кешування у межах прогону для оптимізації.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC.
19
+ 3. Якщо код виконується як окремий інструмент (CLI), ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
21
+
22
+ ## Публічний API
23
+
24
+ run — єдиний вхідний пункт правила, що виконує перевірку: застосовує JS-занепокоєння, політики та посилання MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -2,7 +2,9 @@ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
2
  import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
3
 
4
4
  /**
5
- * Запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` check-поверхня: applies
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
6
8
  * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
9
  * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
10
  * @returns {Promise<number>} 0 — OK, 1 — порушення
@@ -12,7 +14,7 @@ export function run(ctx) {
12
14
  }
13
15
 
14
16
  if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
17
19
  process.exitCode = await runRuleCli(import.meta.dirname)
18
20
  }
@@ -9,3 +9,4 @@ resource: npm/rules/bun/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/bun/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль валідує дані, застосовуючи правила, визначені у конфігурації meta.json, та збирає посилання на MDC. При виклику публічної функції run він здійснює повний запуск правила, включаючи завантаження конфігурацій та застосування білих списків. Результат виконання повертається як код виходу процесу.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування правил, обробку логіки, визначену в конфігурації `meta.json`, та збір посилань на MDC.
19
+ 3. Якщо код виконується як окремий інструмент (standalone), ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
21
+ 5. Результат виконання повертається як код виходу процесу.
22
+
23
+ ## Публічний API
24
+
25
+ run — виконує основну логіку правила: застосовує перевірки до коду, аналізує відповідність політиці та перевіряє посилання на метадані.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Кешує результати в межах одного прогону.
@@ -3,51 +3,26 @@ type: JS Module
3
3
  title: layout.mjs
4
4
  resource: npm/rules/bun/js/layout.mjs
5
5
  docgen:
6
- crc: ba2a6730
6
+ crc: 468d3430
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Файл надає інструмент для перевірки відповідності даних визначеному контракту. Функція `check` (bun.mdc) виконує перевірку стану даних і повертає логічний результат, що вказує на успішність виконання перевірки. У разі невдачі функція повертає `false` або `null` замість генерації винятку.
11
+ Модуль перевіряє наявність критично важливих файлів та директорій у корені репозиторію для забезпечення коректної роботи системи. Він валідує наявність файлів залежностей, директорії `.yarn`, `bun.lock`, `bunfig.toml`, `package.json` та `package-lock.json` відповідно до вимог, зазначених у (bun.mdc). Результат перевірки повертається як код завершення.
11
12
 
12
13
  ## Поведінка
13
14
 
14
- 1. Завантаження конфігурації
15
- Завантажувач зчитує налаштування правил та вимкнених правил з файлу `.n-cursor.json` у корені репозиторію. Якщо файл відсутній, повертається порожній набір правил.
16
-
17
- 2. Перевірка зв'язку скриптів
18
- Система перевіряє зв'язок між ідентифікаторами правил, визначеними у конфігурації, та наявністю скриптів у кореневому `package.json`.
19
-
20
- 3. Оцінка стану власників
21
- Оцінювач визначає стан кожного правила-власника, порівнюючи активні правила з налаштуваннями. Якщо активне правило присутнє, результат позначається як успішний. Якщо власник відсутній у налаштуваннях, результат позначається як провал, якщо власник не був вимкнений.
22
-
23
- 4. Перевірка ланцюжків виконання
24
- Система перевіряє, чи згадує ланцюжок виконання `bun run <скрипт>` конкретний скрипт. Ця перевірка виконується для уникнення хибних спрацьовувань через префікси.
25
-
26
- 5. Перевірка відповідності
27
- Основна перевірка встановлює, що якщо скрипт присутній у `package.json`, він повинен бути активним у конфігурації. Якщо скрипт присутній, але власники не активні, система вимагає видалення скрипта з кореневого файлу.
28
-
29
- 6. Перевірка ланцюжків та вимкнених правил
30
- Якщо ланцюжок виконання `bun run <скрипт>` присутній, але жоден власник не активний, система вимагає видалення з ланцюжка виконання.
31
-
32
- 7. Перевірка відсутності
33
- Якщо скрипт відсутній і власники не активні, система позначає це як успішне проходження.
34
-
35
- 8. Перевірка заборонених файлів
36
- Система перевіряє наявність заборонених файлів у корені репозиторію, включаючи файли блокування залежностей та директорії `.yarn`.
37
-
38
- 9. Перевірка залежностей
39
- Система перевіряє наявність необхідного файлу `bun.lock`. Відсутність цього файлу є провалом, що вимагає запуску `bun i`.
40
-
41
- 10. Перевірка конфігурації Bun
42
- Система перевіряє наявність файлу `bunfig.toml`, який використовується для перевірки структури, необхідної для використання `linker = "hoisted"` у `bun.mdc`.
15
+ 1. Перевіряє наявність файлів-блоків залежностей (`package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `.yarnrc.yml`) у корені репозиторію. Якщо знайдено, повідомляє про заборонений файл. Якщо не знайдено, підтверджує відсутність.
16
+ 2. Перевіряє наявність директорії `.yarn` у корені репозиторію. Якщо знайдено, повідомляє про заборонену директорію. Якщо не знайдено, підтверджує відсутність.
17
+ 3. Перевіряє наявність файлу `bun.lock` у корені репозиторію. Якщо знайдено, підтверджує його наявність. Якщо відсутній, повідомляє про необхідність запуску `bun i`.
18
+ 4. Перевіряє наявність файлу `bunfig.toml` у корені репозиторію. Якщо знайдено, підтверджує його наявність (структуру перевіряє інструмент `npx @nitra/cursor fix → bun.bunfig` відповідно до (bun.mdc)). Якщо відсутній, повідомляє про необхідність створення з конфігурацією `[install] linker = "hoisted"` (bun.mdc).
19
+ 5. Перевіряє наявність файлу `package.json` у корені репозиторію. Якщо відсутній, повідомляє про це.
20
+ 6. Повертає код завершення, що вказує на успішне виконання перевірки (0) або на наявність проблем (1).
43
21
 
44
22
  ## Публічний API
45
23
 
46
- check — перевіряє, чи відповідає проєкт вимогам bun.mdc
24
+ check — перевіряє відповідність проєкту стандартам bun.mdc
47
25
 
48
26
  ## Гарантії поведінки
49
27
 
50
- - Read-only: файл не виконує операцій запису у файлову систему.
51
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
52
- - За невдалої перевірки повертає `false`/`null` замість винятку.
53
- - Не звертається до мережі.
28
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -2,7 +2,9 @@ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
2
  import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
3
 
4
4
  /**
5
- * Запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` check-поверхня: applies
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
6
8
  * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
9
  * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
10
  * @returns {Promise<number>} 0 — OK, 1 — порушення
@@ -12,7 +14,7 @@ export function run(ctx) {
12
14
  }
13
15
 
14
16
  if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
17
19
  process.exitCode = await runRuleCli(import.meta.dirname)
18
20
  }
@@ -9,3 +9,4 @@ resource: npm/rules/capacitor/
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/capacitor/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль застосовує політику та логіку, визначену в конфігурації meta.json, для валідації. При запуску як CLI ініціюється повний запуск правила, що включає завантаження конфігурацій, застосування білих списків та підбиття підсумків. Модуль є лише для читання (не виконує записів у файлову систему чи базу даних) і використовує кешування даних у межах одного прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку логіки, пов'язаної з JavaScript, та посилання на MDC.
19
+ 3. Якщо код виконується як окрема утиліта (CLI), ініціюється повний запуск правила.
20
+ 4. Запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: застосовує перевірки JS-зацікавленостей, політики та посилання на MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -2,7 +2,9 @@ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
2
  import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
3
 
4
4
  /**
5
- * Запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` check-поверхня: applies
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
6
8
  * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
9
  * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
10
  * @returns {Promise<number>} 0 — OK, 1 — порушення
@@ -12,7 +14,7 @@ export function run(ctx) {
12
14
  }
13
15
 
14
16
  if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
17
19
  process.exitCode = await runRuleCli(import.meta.dirname)
18
20
  }
@@ -9,3 +9,4 @@ resource: npm/rules/changelog/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |