@nitra/cursor 12.8.9 → 12.10.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 (274) hide show
  1. package/.claude-template/settings.template.json +1 -23
  2. package/CHANGELOG.md +14 -1
  3. package/bin/n-cursor.js +21 -48
  4. package/docs/stryker.config.md +0 -2
  5. package/lib/docs/llm.md +16 -21
  6. package/lib/docs/omlx.md +20 -25
  7. package/lib/llm.mjs +25 -7
  8. package/lib/omlx.mjs +10 -3
  9. package/package.json +5 -5
  10. package/rules/abie/docs/index.md +0 -1
  11. package/rules/abie/docs/main.md +0 -2
  12. package/rules/abie/lib/docs/http-route.md +9 -12
  13. package/rules/abie/lib/http-route.mjs +3 -0
  14. package/rules/abie/main.mdc +0 -22
  15. package/rules/abie/policy/health_check_policy/health_check_policy.mdc +3 -1
  16. package/rules/abie/policy/health_check_policy/health_check_policy.rego +27 -0
  17. package/rules/adr/docs/index.md +0 -1
  18. package/rules/adr/docs/main.md +0 -2
  19. package/rules/adr/js/madr_format.mdc +13 -1
  20. package/rules/adr/main.mdc +0 -9
  21. package/rules/bun/docs/index.md +0 -1
  22. package/rules/bun/docs/main.md +0 -2
  23. package/rules/bun/main.mdc +1 -15
  24. package/rules/bun/policy/package_json/package_json.rego +12 -0
  25. package/rules/capacitor/docs/index.md +0 -1
  26. package/rules/capacitor/docs/main.md +0 -2
  27. package/rules/capacitor/main.mdc +0 -6
  28. package/rules/changelog/docs/index.md +0 -1
  29. package/rules/changelog/docs/main.md +0 -2
  30. package/rules/changelog/js/agent-workflow.mdc +1 -1
  31. package/rules/changelog/js/consistency.mjs +3 -3
  32. package/rules/changelog/js/docs/consistency.md +18 -23
  33. package/rules/changelog/main.mdc +0 -5
  34. package/rules/ci4/docs/index.md +0 -1
  35. package/rules/ci4/docs/main.md +0 -2
  36. package/rules/ci4/main.mdc +0 -5
  37. package/rules/doc-files/docs/index.md +0 -1
  38. package/rules/doc-files/docs/main.md +7 -11
  39. package/rules/doc-files/js/docs/docgen-crc.md +0 -2
  40. package/rules/doc-files/js/docs/docgen-extract.md +0 -2
  41. package/rules/doc-files/js/docs/docgen-files-batch.md +0 -2
  42. package/rules/doc-files/js/docs/docgen-gen.md +0 -2
  43. package/rules/doc-files/js/docs/docgen-judge-measure.md +0 -2
  44. package/rules/doc-files/js/docs/docgen-judge.md +0 -2
  45. package/rules/doc-files/js/docs/docgen-scan.md +0 -2
  46. package/rules/doc-files/js/docs/run-lint.md +0 -2
  47. package/rules/doc-files/main.mjs +2 -3
  48. package/rules/docker/docs/index.md +0 -1
  49. package/rules/docker/docs/main.md +0 -2
  50. package/rules/docker/js/docs/lint.md +0 -2
  51. package/rules/docker/lib/docs/docker-hadolint.md +0 -2
  52. package/rules/docker/main.mdc +1 -21
  53. package/rules/efes/docs/index.md +0 -1
  54. package/rules/efes/docs/main.md +0 -2
  55. package/rules/efes/main.mdc +0 -1
  56. package/rules/feedback/docs/index.md +0 -1
  57. package/rules/feedback/docs/main.md +0 -2
  58. package/rules/ga/docs/index.md +0 -1
  59. package/rules/ga/docs/main.md +0 -2
  60. package/rules/ga/js/docs/index.md +0 -1
  61. package/rules/ga/main.mdc +1 -31
  62. package/rules/graphql/docs/index.md +0 -1
  63. package/rules/graphql/docs/main.md +0 -2
  64. package/rules/graphql/main.mdc +0 -5
  65. package/rules/hasura/docs/index.md +0 -1
  66. package/rules/hasura/docs/main.md +0 -2
  67. package/rules/hasura/js/docs/index.md +1 -0
  68. package/rules/hasura/js/docs/migrations.md +28 -0
  69. package/rules/hasura/js/migrations.mjs +47 -0
  70. package/rules/hasura/main.mdc +1 -11
  71. package/rules/image-avif/docs/index.md +0 -1
  72. package/rules/image-avif/docs/main.md +0 -2
  73. package/rules/image-avif/main.mdc +1 -9
  74. package/rules/image-compress/docs/index.md +0 -1
  75. package/rules/image-compress/docs/main.md +0 -2
  76. package/rules/image-compress/js/docs/index.md +0 -1
  77. package/rules/image-compress/main.mdc +1 -9
  78. package/rules/js/docs/index.md +0 -1
  79. package/rules/js/docs/main.md +0 -2
  80. package/rules/js/js/dep-policy.mjs +91 -0
  81. package/rules/js/js/docs/check.md +0 -2
  82. package/rules/js/js/docs/dep-policy.md +34 -0
  83. package/rules/js/js/docs/index.md +5 -4
  84. package/rules/js/js/docs/tooling.md +0 -2
  85. package/rules/js/js/docs/utils_imports.md +0 -2
  86. package/rules/js/main.mdc +0 -31
  87. package/rules/js/policy/package_json/package_json.rego +16 -0
  88. package/rules/js-bun-db/docs/index.md +0 -1
  89. package/rules/js-bun-db/docs/main.md +0 -2
  90. package/rules/js-bun-db/js/docs/safety.md +18 -23
  91. package/rules/js-bun-db/js/safety.mjs +31 -3
  92. package/rules/js-bun-db/lib/bun-sql-scan.mjs +123 -0
  93. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +37 -331
  94. package/rules/js-bun-db/main.mdc +1 -23
  95. package/rules/js-bun-redis/docs/index.md +0 -1
  96. package/rules/js-bun-redis/docs/main.md +0 -2
  97. package/rules/js-bun-redis/main.mdc +0 -5
  98. package/rules/js-mssql/docs/index.md +0 -1
  99. package/rules/js-mssql/docs/main.md +0 -2
  100. package/rules/js-mssql/main.mdc +0 -12
  101. package/rules/js-run/docs/index.md +0 -1
  102. package/rules/js-run/docs/main.md +0 -2
  103. package/rules/js-run/js/docs/runtime.md +15 -13
  104. package/rules/js-run/js/runtime.mjs +48 -4
  105. package/rules/js-run/main.mdc +0 -25
  106. package/rules/k8s/docs/index.md +0 -1
  107. package/rules/k8s/docs/main.md +0 -2
  108. package/rules/k8s/main.mdc +0 -45
  109. package/rules/nginx-default-tpl/docs/index.md +0 -1
  110. package/rules/nginx-default-tpl/docs/main.md +0 -2
  111. package/rules/nginx-default-tpl/main.mdc +0 -13
  112. package/rules/npm-module/docs/index.md +0 -1
  113. package/rules/npm-module/docs/main.md +0 -2
  114. package/rules/npm-module/js/docs/header_doc_pointer.md +0 -2
  115. package/rules/npm-module/js/docs/rule_meta.md +0 -2
  116. package/rules/npm-module/js/docs/skill_meta.md +0 -2
  117. package/rules/npm-module/main.mdc +1 -15
  118. package/rules/php/docs/index.md +0 -1
  119. package/rules/php/docs/main.md +0 -2
  120. package/rules/php/js/docs/index.md +0 -1
  121. package/rules/php/main.mdc +1 -9
  122. package/rules/python/docs/index.md +0 -1
  123. package/rules/python/docs/main.md +0 -2
  124. package/rules/python/js/docs/index.md +0 -1
  125. package/rules/python/main.mdc +1 -13
  126. package/rules/rego/docs/index.md +0 -1
  127. package/rules/rego/docs/main.md +0 -2
  128. package/rules/rego/js/docs/index.md +1 -1
  129. package/rules/rego/js/docs/tooling.md +26 -0
  130. package/rules/rego/js/tooling.mdc +14 -0
  131. package/rules/rego/js/tooling.mjs +24 -0
  132. package/rules/rego/main.mdc +0 -9
  133. package/rules/rego/policy/package_json/package_json.mdc +12 -0
  134. package/rules/rego/policy/package_json/package_json.rego +21 -0
  135. package/rules/rego/policy/package_json/target.json +4 -0
  136. package/rules/release/docs/index.md +0 -1
  137. package/rules/release/docs/main.md +0 -2
  138. package/rules/release/main.mdc +2 -2
  139. package/rules/rust/docs/index.md +0 -1
  140. package/rules/rust/docs/main.md +0 -2
  141. package/rules/rust/js/docs/index.md +0 -1
  142. package/rules/rust/main.mdc +1 -11
  143. package/rules/rust/policy/lint_rust_yml/lint_rust_yml.rego +24 -0
  144. package/rules/rust/policy/package_json/package_json.mdc +12 -0
  145. package/rules/rust/policy/package_json/package_json.rego +20 -0
  146. package/rules/rust/policy/package_json/target.json +4 -0
  147. package/rules/security/docs/index.md +0 -1
  148. package/rules/security/docs/main.md +0 -2
  149. package/rules/security/js/docs/index.md +0 -1
  150. package/rules/security/main.mdc +0 -13
  151. package/rules/style/docs/index.md +0 -1
  152. package/rules/style/docs/main.md +0 -2
  153. package/rules/style/js/docs/index.md +0 -1
  154. package/rules/style/js/docs/tooling.md +12 -10
  155. package/rules/style/js/tooling.mjs +8 -2
  156. package/rules/style/main.mdc +1 -23
  157. package/rules/style/policy/lint_style_yml/lint_style_yml.rego +5 -0
  158. package/rules/tauri/docs/index.md +0 -1
  159. package/rules/tauri/docs/main.md +0 -2
  160. package/rules/tauri/main.mdc +1 -11
  161. package/rules/test/docs/index.md +0 -1
  162. package/rules/test/docs/main.md +0 -2
  163. package/rules/test/js/docs/index.md +2 -0
  164. package/rules/test/js/docs/no-console-store-restore.md +30 -0
  165. package/rules/test/js/docs/sandbox-aware-test.md +30 -0
  166. package/rules/test/js/docs/stryker_config.md +0 -2
  167. package/rules/test/js/docs/vitest-config-pool-forks.md +0 -2
  168. package/rules/test/js/no-console-store-restore.mjs +88 -0
  169. package/rules/test/js/sandbox-aware-test.mjs +89 -0
  170. package/rules/test/main.mdc +1 -21
  171. package/rules/text/docs/index.md +0 -1
  172. package/rules/text/docs/main.md +0 -2
  173. package/rules/text/js/docs/cspell-fix.md +0 -2
  174. package/rules/text/js/docs/run-dotenv-linter.md +0 -2
  175. package/rules/text/js/docs/run-shellcheck.md +0 -2
  176. package/rules/text/js/docs/run-v8r.md +0 -2
  177. package/rules/text/main.mdc +0 -33
  178. package/rules/tool-surface/docs/index.md +0 -1
  179. package/rules/tool-surface/docs/main.md +0 -2
  180. package/rules/vue/docs/index.md +0 -1
  181. package/rules/vue/docs/main.md +0 -2
  182. package/rules/vue/main.mdc +0 -22
  183. package/rules/worktree/docs/index.md +0 -1
  184. package/rules/worktree/docs/main.md +0 -2
  185. package/scripts/docs/auto-rules.md +0 -2
  186. package/scripts/docs/auto-skills.md +0 -2
  187. package/scripts/docs/hook.md +30 -0
  188. package/scripts/docs/index.md +1 -2
  189. package/scripts/docs/post-tool-use-check.md +0 -2
  190. package/scripts/docs/sync-claude-config.md +1 -3
  191. package/scripts/docs/sync-setup-bun-deps-action.md +0 -2
  192. package/scripts/hook.mjs +71 -0
  193. package/scripts/lib/docs/check-mdc-template-refs.md +0 -2
  194. package/scripts/lib/docs/index.md +35 -36
  195. package/scripts/lib/docs/inline-template-links.md +6 -8
  196. package/scripts/lib/docs/list-project-rules-mdc.md +0 -2
  197. package/scripts/lib/docs/list-rule-ids.md +0 -2
  198. package/scripts/lib/docs/mirror-parity.md +8 -10
  199. package/scripts/lib/docs/read-n-cursor-config-lite.md +0 -2
  200. package/scripts/lib/docs/rule-meta.md +0 -2
  201. package/scripts/lib/docs/run-lint.md +9 -10
  202. package/scripts/lib/docs/run-rule-cli.md +0 -2
  203. package/scripts/lib/docs/run-rule.md +7 -9
  204. package/scripts/lib/docs/run-standard-lint.md +0 -2
  205. package/scripts/lib/docs/run-standard-rule.md +0 -2
  206. package/scripts/lib/docs/skill-meta.md +0 -2
  207. package/scripts/lib/docs/timing-summary.md +0 -2
  208. package/scripts/lib/docs/worktree-notice.md +0 -2
  209. package/scripts/lib/fix/docs/analyze-escalation.md +0 -2
  210. package/scripts/lib/fix/docs/index.md +10 -10
  211. package/scripts/lib/fix/docs/llm-worker.md +18 -8
  212. package/scripts/lib/fix/docs/orchestrator.md +44 -20
  213. package/scripts/lib/fix/docs/run-conformance-check.md +0 -2
  214. package/scripts/lib/fix/docs/t0.md +0 -2
  215. package/scripts/lib/fix/docs/verbose-block.md +27 -0
  216. package/scripts/lib/fix/llm-worker.mjs +75 -22
  217. package/scripts/lib/fix/orchestrator.mjs +13 -3
  218. package/scripts/lib/fix/verbose-block.mjs +82 -0
  219. package/scripts/lib/inline-template-links.mjs +32 -22
  220. package/scripts/lib/mirror-parity.mjs +2 -2
  221. package/scripts/lib/run-lint.mjs +15 -2
  222. package/scripts/lib/run-rule.mjs +1 -2
  223. package/scripts/sync-claude-config.mjs +7 -4
  224. package/scripts/utils/docs/resolve-js-root.md +0 -2
  225. package/skills/adr-normalize/SKILL.md +1 -0
  226. package/skills/coverage-fix/SKILL.md +1 -0
  227. package/skills/doc-aggregate/SKILL.md +1 -0
  228. package/skills/doc-files/SKILL.md +10 -24
  229. package/skills/lint/SKILL.md +24 -19
  230. package/skills/llm-patch/SKILL.md +5 -4
  231. package/skills/publish-telegram/SKILL.md +1 -0
  232. package/skills/start-check/SKILL.md +1 -0
  233. package/skills/taze/SKILL.md +3 -2
  234. package/types/bin/n-cursor.d.ts +1 -1
  235. package/rules/abie/docs/fix.md +0 -37
  236. package/rules/adr/docs/fix.md +0 -37
  237. package/rules/bun/docs/fix.md +0 -30
  238. package/rules/capacitor/docs/fix.md +0 -36
  239. package/rules/changelog/docs/fix.md +0 -37
  240. package/rules/ci4/docs/fix.md +0 -32
  241. package/rules/doc-files/docs/fix.md +0 -29
  242. package/rules/docker/docs/fix.md +0 -35
  243. package/rules/efes/docs/fix.md +0 -37
  244. package/rules/feedback/docs/fix.md +0 -30
  245. package/rules/ga/docs/fix.md +0 -30
  246. package/rules/graphql/docs/fix.md +0 -37
  247. package/rules/hasura/docs/fix.md +0 -39
  248. package/rules/image-avif/docs/fix.md +0 -28
  249. package/rules/image-compress/docs/fix.md +0 -27
  250. package/rules/js/docs/fix.md +0 -37
  251. package/rules/js-bun-db/docs/fix.md +0 -30
  252. package/rules/js-bun-redis/docs/fix.md +0 -32
  253. package/rules/js-mssql/docs/fix.md +0 -30
  254. package/rules/js-run/docs/fix.md +0 -36
  255. package/rules/k8s/docs/fix.md +0 -31
  256. package/rules/nginx-default-tpl/docs/fix.md +0 -35
  257. package/rules/npm-module/docs/fix.md +0 -34
  258. package/rules/php/docs/fix.md +0 -35
  259. package/rules/python/docs/fix.md +0 -38
  260. package/rules/rego/docs/fix.md +0 -31
  261. package/rules/release/docs/fix.md +0 -28
  262. package/rules/rust/docs/fix.md +0 -32
  263. package/rules/security/docs/fix.md +0 -33
  264. package/rules/style/docs/fix.md +0 -28
  265. package/rules/tauri/docs/fix.md +0 -39
  266. package/rules/test/docs/fix.md +0 -31
  267. package/rules/text/docs/fix.md +0 -37
  268. package/rules/tool-surface/docs/fix.md +0 -32
  269. package/rules/vue/docs/fix.md +0 -32
  270. package/rules/worktree/docs/fix.md +0 -40
  271. package/scripts/docs/post-tool-use-fix.md +0 -32
  272. package/scripts/docs/worktree-cli.md +0 -27
  273. package/scripts/lib/docs/worktree.md +0 -42
  274. package/scripts/lib/fix/docs/run-fix-check.md +0 -33
@@ -6,40 +6,7 @@ version: '1.30'
6
6
 
7
7
  Правило охоплює весь текстовий стек проєкту: форматування (oxfmt), перевірку правопису (cspell), shell-скрипти (shellcheck), `.env`-файли (dotenv-linter), Markdown (markdownlint-cli2), JSON/YAML/TOML-схеми (v8r) та CI-workflow.
8
8
 
9
- [text-vscode](./js/vscode.mdc)
10
-
11
- [text-oxfmt](./js/oxfmt.mdc)
12
-
13
- [text-forbidden-prettier](./js/forbidden-prettier.mdc)
14
-
15
- [text-cspell](./js/cspell.mdc)
16
-
17
- [text-markdownlint](./js/markdownlint.mdc)
18
-
19
- [text-shellcheck](./js/shellcheck.mdc)
20
-
21
- [text-dotenv-linter](./js/dotenv-linter.mdc)
22
-
23
- [text-v8r](./js/v8r.mdc)
24
-
25
- [text-package-json](./js/package-json.mdc)
26
-
27
- [text-ci-lint-text](./js/ci-lint-text.mdc)
28
-
29
9
  ## Швидкий gate через conftest
30
10
 
31
11
  Rego-пакети, що перевіряються через conftest (auto-discovered за `target.json` поряд із `.rego`):
32
12
 
33
- [text-policy-cspell](./policy/cspell/cspell.mdc)
34
-
35
- [text-policy-lint_text](./policy/lint_text/lint_text.mdc)
36
-
37
- [text-policy-markdownlint](./policy/markdownlint/markdownlint.mdc)
38
-
39
- [text-policy-oxfmtrc](./policy/oxfmtrc/oxfmtrc.mdc)
40
-
41
- [text-policy-package_json](./policy/package_json/package_json.mdc)
42
-
43
- [text-policy-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
44
-
45
- [text-policy-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -8,5 +8,4 @@ resource: npm/rules/tool-surface/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує валідацію контенту, застосовуючи правила, визначені в конфігурації, що зчитується з meta.json. Він обробляє запити, пов'язані з JavaScript, та взаємодіє з MDC. При запуску як CLI, він ініціалізує та виконує повний цикл перевірки, надаючи фінальний звіт.
14
12
 
15
13
  ## Поведінка
@@ -8,5 +8,4 @@ resource: npm/rules/vue/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує перевірку, застосовуючи політику та обробляючи логіку JavaScript. Він забезпечує повний запуск правила, завантажуючи конфігурації, такі як meta.json, застосовуючи білі списки та підбиваючи підсумки. При запуску як окрема утиліта командного рядка, виконується повний цикл перевірки через публічну функцію run. Модуль є Read-only і кешує дані у межах прогону.
14
12
 
15
13
  ## Поведінка
@@ -9,32 +9,10 @@ alwaysApply: false
9
9
 
10
10
  Правило охоплює стандарти написання Vue 3 SFC з Composition API, конфігурацію Vite-проєкту, UI-бібліотеки, заборонені патерни та вимоги до тестування.
11
11
 
12
- [vue-composition-api](./js/composition-api.mdc)
13
-
14
- [vue-quasar-ui](./js/quasar-ui.mdc)
15
-
16
- [vue-structure](./js/structure.mdc)
17
-
18
- [vue-vite-config](./js/vite-config.mdc)
19
-
20
- [vue-vite-env](./js/vite-env.mdc)
21
-
22
- [vue-vue-imports](./js/vue-imports.mdc)
23
-
24
- [vue-node-imports](./js/node-imports.mdc)
25
-
26
- [vue-testing](./js/testing.mdc)
27
-
28
- [vue-nheader-layout](./js/nheader-layout.mdc)
29
-
30
- [vue-tfm-translations](./js/tfm-translations.mdc)
31
-
32
12
  ## Швидкий gate через conftest
33
13
 
34
14
  Rego-перевірки (запускаються через `npx @nitra/cursor fix vue`):
35
15
 
36
- [vue-package_json](./policy/package_json/package_json.mdc)
37
-
38
16
  ## Перевірка
39
17
 
40
18
  `npx @nitra/cursor fix vue` — перевіряє залежності, `vite.config`, наявність **`src/vite-env.d.ts`** з `/// <reference types="vite/client" />` та **`jsconfig.json`** у корені Vue-пакета; обходить джерела Vue-пакета (`.vue`, `.ts`, `.js` тощо) на заборонені value-імпорти з модуля `vue` (дозволені лише type-only та side-effect `import 'vue'`) і додатково сканує `.vue` SFC на імпорти Node-нативних модулів (`node:*` префікс або bare-ім'я вбудованого модуля Node — `fs`, `path`, `timers/promises` тощо). Імпорти аналізуються через **oxc-parser** (`module.staticImports`); для `.vue` вміст `<script>` витягується з SFC, далі той самий парсер (логіка в `npm/rules/vue/js/packages/vue-forbidden-imports.mjs`).
@@ -8,5 +8,4 @@ resource: npm/rules/worktree/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує перевірку, застосовуючи політики, визначені в meta.json. Він обробляє JS-запити та звертається до MDC-ресурсів. Модуль є Read-only, тобто не здійснює записів у файлову систему чи бази даних. При запуску як окрема утиліта командного рядка, він виконує правила, використовуючи публічну функцію run. Дані кешуються у межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Автоматично визначає правила та скіли для конфігурації `.n-cursor.json`, скануючи мета-дані з `npm/rules/<id>/main.json` та аналізуючи структуру проєкту, зокрема `package.json`. Система виводить `AUTO_RULE_ORDER` (алфавітно) та `AUTO_RULE_DEPENDENCIES` для кожного правила. Для кожного правила обчислюється специфікація активації (`specMatches`), яка може бути безумовною (`always`), заснованою на шаблонах файлів (`glob`), або предикатною. Процес враховує винятки (`disable-rules`) та виконує транзитивне розгортання залежностей. Збираються контент-факти (GQL, bun-sql, hasura) для точного застосування правил. Також відбувається автоматичне виявлення скілів з `./auto-skills.mjs`, після чого всі виявлені правила та скіли зливаються у конфіг, враховуючи міграцію ID.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Визначає, які скіли мають автоматично активуватися, скануючи `npm/skills/` та аналізуючи `main.json` кожного скілу. Логіка активації базується на конфігурації скілу: скіл може активуватися завжди (`auto: "завжди"`), якщо всі перелічені правила виявлені (`auto: ["rule", …]`), або бути opt-in, якщо поле `auto` відсутнє у `main.json`. Це забезпечує, що визначення автоматичної активації скілів є детермінованим, оскільки `main.json` є джерелом правди. Результати сканування використовуються для встановлення `AUTO_SKILL_ORDER` та `AUTO_SKILL_RULE_DEPENDENCIES`, що впливає на роботу з `.n-cursor.json`.
14
12
 
15
13
  ## Поведінка
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: hook.mjs
4
+ resource: npm/scripts/hook.mjs
5
+ docgen:
6
+ crc: 602cd023
7
+ model: claude-sonnet-4-6
8
+ score: 100
9
+ ---
10
+
11
+ Точка входу для хуків Claude Code. У режимі `--post-tool-use` зчитує `file_path` зі stdin JSON (PostToolUse hook), запускає lint для цього файлу та перевіряє актуальність файлової документації (`doc-files`). У режимі `--stop` визначає змінені файли (`git diff HEAD` + untracked) і запускає lint по всьому робочому дереву. Повертає exit-код у hook-протоколі (ненуль → 2).
12
+
13
+ ## Поведінка
14
+
15
+ `runHookCli` виконує відповідну логіку залежно від переданого режиму:
16
+
17
+ - **`--post-tool-use`**: читає stdin JSON → витягує `tool_input.file_path` → запускає `runLint` для цього файлу (read-only, усі per-file правила включно з `doc-files`) → повертає 2 при порушеннях.
18
+ - **`--stop`**: визначає всі змінені файли через `collectChangedFiles` → запускає `runLint` (read-only) → повертає 2 при порушеннях.
19
+
20
+ Якщо `file_path` відсутній у stdin або stdin порожній — завершується з кодом 0 (нема що перевіряти).
21
+
22
+ ## Публічний API
23
+
24
+ - `extractFilePath(json)` — витягує `tool_input.file_path` зі stdin JSON Claude Code PostToolUse hook; повертає `null` якщо JSON відсутній або поле не знайдено.
25
+ - `runHookCli(argv)` — CLI-точка входу для `n-cursor hook`; повертає Promise<number> (0 — чисто, 1 — невідомий режим, 2 — є порушення).
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Не кидає винятків назовні: помилки stdin та parse-помилки повертають null/0.
@@ -15,11 +15,10 @@ resource: npm/scripts/
15
15
  | [coverage-fix-extract.mjs](coverage-fix-extract.md) | JS Module |
16
16
  | [coverage-fix.mjs](coverage-fix.md) | JS Module |
17
17
  | [ensure-nitra-cursor-dev-dependencies.mjs](ensure-nitra-cursor-dev-dependencies.md) | JS Module |
18
+ | [hook.mjs](hook.md) | JS Module |
18
19
  | [post-tool-use-check.mjs](post-tool-use-check.md) | JS Module |
19
- | [post-tool-use-fix.mjs](post-tool-use-fix.md) | JS Module |
20
20
  | [rename-yaml-extensions.mjs](rename-yaml-extensions.md) | JS Module |
21
21
  | [skills-cli.mjs](skills-cli.md) | JS Module |
22
22
  | [sync-claude-config.mjs](sync-claude-config.md) | JS Module |
23
23
  | [sync-setup-bun-deps-action.mjs](sync-setup-bun-deps-action.md) | JS Module |
24
24
  | [upgrade-nitra-cursor-and-install.mjs](upgrade-nitra-cursor-and-install.md) | JS Module |
25
- | [worktree-cli.mjs](worktree-cli.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Цей модуль є PostToolUse hook, який виконує read-only детект конформності всіх активованих правил після кожного редагування файлу (`Edit` / `Write` / `MultiEdit`). Він отримує шлях до файлу з вхідного JSON. Якщо файл відсутній, модуль завершує роботу з кодом 0. Інакше, він запускає детект конформності по всіх правилах, не виконуючи жодних мутацій чи викликів LLM. Код виходу 1 інформує про наявність порушень конформності, хоча PostToolUse не блокує поточний обмін.
14
12
 
15
13
  ## Поведінка
@@ -3,13 +3,11 @@ type: JS Module
3
3
  title: sync-claude-config.mjs
4
4
  resource: npm/scripts/sync-claude-config.mjs
5
5
  docgen:
6
- crc: 88f4080d
6
+ crc: 553933fa
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 85
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Синхронізує конфігурацію Claude Code (`.claude/settings.json`, slash-команди з `commands/` темплейту, ADR Stop-hook) та Cursor hooks (`.cursor/hooks.json`) у поточний проєкт із темплейтів пакету `npm/.claude-template/`. Здійснює злиття конфігурацій: користувацькі поля зберігаються у `.claude/settings.json`, а дозволи (`permissions.allow`) зливаються через union. Керовані хуки, ідентифіковані командою-маркером `MANAGED_HOOK_COMMAND_MARKERS`, перезаписуються. Копіює ADR Stop-hook (`.claude/hooks/capture-decisions.sh`) та ADR normalize Stop-hook (`.claude/hooks/normalize-decisions.sh`) залежно від налаштувань у `.n-cursor.json`. Також зливає фрагмент `.gitignore` з канонічного шаблону, додаючи необхідні записи для ADR.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Копіює composite GitHub Action `setup-bun-deps` з каталогу `github-actions/setup-bun-deps/` у корені tarball пакету `@nitra/cursor` у цільовий репозиторій за шлях `.github/actions/setup-bun-deps/action.yml`. Це забезпечує можливість для workflow з правил `ga`, `js` або `text` викликати цей action для налаштування залежностей Bun одразу після виконання `actions/checkout@v6`.
14
12
 
15
13
  ## Поведінка
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Thin hook entrypoint для Claude Code hooks: зчитує контекст (stdin / git),
3
+ * делегує в `runLint({ readOnly: true })`, перекодовує exit-код у hook-протокол (1 → 2).
4
+ *
5
+ * Режими:
6
+ * --post-tool-use PostToolUse: file_path зі stdin JSON Claude Code.
7
+ * --stop Stop: робоче дерево vs HEAD (`git diff HEAD` + untracked).
8
+ */
9
+ import { once } from 'node:events'
10
+ import { cwd as processCwd } from 'node:process'
11
+
12
+ import { runLint } from './lib/run-lint.mjs'
13
+ import { collectChangedFiles } from './lib/changed-files.mjs'
14
+
15
+ /**
16
+ * @returns {Promise<string>} вміст stdin або '' на TTY
17
+ */
18
+ async function readStdin() {
19
+ if (process.stdin.isTTY) return ''
20
+ process.stdin.setEncoding('utf8')
21
+ const chunks = []
22
+ process.stdin.on('data', c => chunks.push(c))
23
+ try {
24
+ await once(process.stdin, 'end')
25
+ } catch {
26
+ // error на stdin — повертаємо що встигли
27
+ }
28
+ return chunks.join('')
29
+ }
30
+
31
+ /**
32
+ * Дістає `tool_input.file_path` зі stdin JSON Claude Code PostToolUse hook.
33
+ * @param {string} json сирий stdin
34
+ * @returns {string|null}
35
+ */
36
+ export function extractFilePath(json) {
37
+ if (!json) return null
38
+ try {
39
+ const fp = JSON.parse(json)?.tool_input?.file_path
40
+ return typeof fp === 'string' && fp !== '' ? fp : null
41
+ } catch {
42
+ return null
43
+ }
44
+ }
45
+
46
+ /**
47
+ * CLI для `n-cursor hook`.
48
+ * @param {string[]} argv аргументи після 'hook'
49
+ * @returns {Promise<number>} exit-код (0 — чисто; 2 — є порушення hook-протокол)
50
+ */
51
+ export async function runHookCli(argv) {
52
+ const cwd = processCwd()
53
+ const postToolUse = argv.includes('--post-tool-use')
54
+ const stop = argv.includes('--stop')
55
+
56
+ if (!postToolUse && !stop) {
57
+ process.stderr.write('hook: потрібен --post-tool-use або --stop\n')
58
+ return 1
59
+ }
60
+
61
+ if (postToolUse) {
62
+ const fp = extractFilePath(await readStdin())
63
+ if (!fp) return 0
64
+ const code = await runLint({ files: [fp], readOnly: true, cwd })
65
+ return code !== 0 ? 2 : 0
66
+ }
67
+
68
+ const files = collectChangedFiles(cwd)
69
+ const code = await runLint({ files, readOnly: true, cwd })
70
+ return code !== 0 ? 2 : 0
71
+ }
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Визначає список файлів шаблонів, що знаходяться у каталогах `fix` та `policy`, які не є цільовими посиланнями у файлі `<id>.mdc` як markdown link targets. Це дозволяє ідентифікувати ресурси шаблонів, які не були згадані в контексті правила.
14
12
 
15
13
  ## Поведінка
@@ -6,40 +6,39 @@ resource: npm/scripts/lib/
6
6
 
7
7
  # npm/scripts/lib
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [assert-project-root.mjs](assert-project-root.md) | JS Module |
12
- | [changed-files.mjs](changed-files.md) | JS Module |
13
- | [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
14
- | [check-reporter.mjs](check-reporter.md) | JS Module |
15
- | [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
9
+ | Файл | Тип |
10
+ | --------------------------------------------------------------------------- | --------- |
11
+ | [assert-project-root.mjs](assert-project-root.md) | JS Module |
12
+ | [changed-files.mjs](changed-files.md) | JS Module |
13
+ | [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
14
+ | [check-reporter.mjs](check-reporter.md) | JS Module |
15
+ | [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
16
16
  | [discover-check-rules-from-cursor.mjs](discover-check-rules-from-cursor.md) | JS Module |
17
- | [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
18
- | [ensure-tool.mjs](ensure-tool.md) | JS Module |
19
- | [generated-markdown.mjs](generated-markdown.md) | JS Module |
20
- | [gha-workflow.mjs](gha-workflow.md) | JS Module |
21
- | [inline-template-links.mjs](inline-template-links.md) | JS Module |
22
- | [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
23
- | [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
24
- | [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
25
- | [mirror-parity.mjs](mirror-parity.md) | JS Module |
26
- | [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
27
- | [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
28
- | [root-notice.mjs](root-notice.md) | JS Module |
29
- | [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
30
- | [rule-meta.mjs](rule-meta.md) | JS Module |
31
- | [rule-predicates.mjs](rule-predicates.md) | JS Module |
32
- | [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
33
- | [run-lint-step.mjs](run-lint-step.md) | JS Module |
34
- | [run-lint.mjs](run-lint.md) | JS Module |
35
- | [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
36
- | [run-rule.mjs](run-rule.md) | JS Module |
37
- | [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
38
- | [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
39
- | [skill-meta.mjs](skill-meta.md) | JS Module |
40
- | [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
41
- | [template.mjs](template.md) | JS Module |
42
- | [timing-summary.mjs](timing-summary.md) | JS Module |
43
- | [workspaces.mjs](workspaces.md) | JS Module |
44
- | [worktree-notice.mjs](worktree-notice.md) | JS Module |
45
- | [worktree.mjs](worktree.md) | JS Module |
17
+ | [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
18
+ | [ensure-tool.mjs](ensure-tool.md) | JS Module |
19
+ | [generated-markdown.mjs](generated-markdown.md) | JS Module |
20
+ | [gha-workflow.mjs](gha-workflow.md) | JS Module |
21
+ | [inline-template-links.mjs](inline-template-links.md) | JS Module |
22
+ | [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
23
+ | [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
24
+ | [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
25
+ | [mirror-parity.mjs](mirror-parity.md) | JS Module |
26
+ | [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
27
+ | [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
28
+ | [root-notice.mjs](root-notice.md) | JS Module |
29
+ | [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
30
+ | [rule-meta.mjs](rule-meta.md) | JS Module |
31
+ | [rule-predicates.mjs](rule-predicates.md) | JS Module |
32
+ | [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
33
+ | [run-lint-step.mjs](run-lint-step.md) | JS Module |
34
+ | [run-lint.mjs](run-lint.md) | JS Module |
35
+ | [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
36
+ | [run-rule.mjs](run-rule.md) | JS Module |
37
+ | [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
38
+ | [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
39
+ | [skill-meta.mjs](skill-meta.md) | JS Module |
40
+ | [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
41
+ | [template.mjs](template.md) | JS Module |
42
+ | [timing-summary.mjs](timing-summary.md) | JS Module |
43
+ | [workspaces.mjs](workspaces.md) | JS Module |
44
+ | [worktree-notice.mjs](worktree-notice.md) | JS Module |
@@ -3,24 +3,22 @@ type: JS Module
3
3
  title: inline-template-links.mjs
4
4
  resource: npm/scripts/lib/inline-template-links.mjs
5
5
  docgen:
6
- crc: b659349c
6
+ crc: e1bed533
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
- Цей модуль реалізує механізми вбудовування контенту в текстові документи, використовуючи конфігурації з `package.json.snippet.json` та `package.json`. Він замінює посилання в тексті на вміст файлів-шаблонів, розташованих у каталозі правил, а також на вміст файлів з розширенням .mdc, які не є шаблонами. Функції дозволяють вставляти посилання на шаблони (`inlineTemplateLinks`) та включати вміст Markdown (`inlineMarkdownIncludes`).
11
+ Модуль інтегрує зовнішній контент у текстовий вивід, використовуючи конфігурації з `package.json.snippet.json` та `package.json`. Він замінює посилання на шаблони в тексті на їхній вміст за допомогою `inlineTemplateLinks` та доповнює текст вмістом усіх знайдених файлів `.mdc` з директорій `js/` та `policy/<concern>/` за допомогою `appendDiscoveredMdcFiles`.
14
12
 
15
13
  ## Поведінка
16
14
 
17
- inlineTemplateLinks замінює посилання в тексті на вбудовані блоки з вмістом файлів, що містять шаблони, якщо ці файли знаходяться в каталозі правил.
18
- inlineMarkdownIncludes замінює посилання в тексті на вміст файлів з розширенням .mdc, якщо ці файли не є шаблонами.
15
+ inlineTemplateLinks замінює посилання на шаблони в тексті на вбудовані блоки з вмістом відповідних файлів.
16
+ appendDiscoveredMdcFiles додає вміст усіх знайдених файлів \*.mdc з директорій js/ та policy/<concern>/ до наданого тексту.
19
17
 
20
18
  ## Публічний API
21
19
 
22
- inlineTemplateLinks — Замінює посилання у Markdown, що містять `/template/`, на вбудовані блокові конструкції, зчитуючи вміст з вказаного файлу. Викидає помилку, якщо цільове посилання не знайдено.
23
- inlineMarkdownIncludesЗамінює посилання у Markdown, що закінчуються на `.mdc` не є шляхом `/template/`), на сирий вміст відповідного файлу Markdown. Викидає помилку, якщо цільове посилання не знайдено.
20
+ inlineTemplateLinks — Замінює посилання у Markdown, що містять `/template/`, на вбудовані блоки, зчитуючи вміст з вказаного файлу. Викидає помилку, якщо цільове посилання не знайдено.
21
+ appendDiscoveredMdcFilesДодає всі знайдені файли з розширенням `.mdc` з підкаталогів `js/` та `policy/<concern>/`. Спочатку додаються файли з `js/` (у алфавітному порядку), а потім файли з підкаталогів `policy/` алфавітному порядку за назвою `concern`, а потім за назвою файлу).
24
22
 
25
23
  ## Гарантії поведінки
26
24
 
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Цей модуль визначає шлях до `.mdc`-файлів правил у проєкті-споживачі, що зберігаються у директорії, вказаній константою CURSOR_RULES_DIR. Він надає відсортований список імен цих файлів. Це винесення логіки з `bin/n-cursor.js` забезпечує розділення відповідальності між інструментом командного рядка та функцією перевірки конформності.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Перебирає директорії у `rules/` та фільтрує їх, вибираючи лише ті, що містять єдиний канонічний entrypoint (`rules/<id>/main.mjs`), згідно з ADR 2026-06-21. Функція повертає список ідентифікаторів правил, які відповідають цьому канону. Операція є лише для читання файлової системи.
14
12
 
15
13
  ## Поведінка
@@ -3,31 +3,29 @@ type: JS Module
3
3
  title: mirror-parity.mjs
4
4
  resource: npm/scripts/lib/mirror-parity.mjs
5
5
  docgen:
6
- crc: 093ff2bb
6
+ crc: 91a0c9f2
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
- Модуль забезпечує паритет дзеркал правил, порівнюючи вміст `.cursor/rules/n-<id>.mdc` з канонічним вмістом `npm/rules/<id>/<id>.mdc`. Він визначає, які дзеркала відстежувати, формує очікуваний вміст цих дзеркал після застосування шаблонів (трансформу, що застосовує `readBundledRuleContent` $\rightarrow$ `inlineTemplateLinks`), та виявляє дрейф, що виникає, коли канонічний `.mdc` змінюється без регенерації дзеркала.
11
+ Модуль реалізує механізм перевірки паралельності (parity) дзеркал правил. Він визначає список дзеркал, створює очікуваний вміст для кожного дзеркала, трансформуючи канонічний файл `npm/rules/<id>/<id>.mdc` з inlined-шаблонами — тим самим трансформом, що застосовує синк (`readBundledRuleContent` → `inlineTemplateLinks`). Механізм виявляє дрейф, коли фактичний вміст дзеркала `.cursor/rules/n-<id>.mdc` відрізняється від очікуваного, що виникає при зміні канонічного `.mdc` без регенерації дзеркала.
14
12
 
15
13
  ## Поведінка
16
14
 
17
15
  listManagedMirrors
18
- Визначає список керованих дзеркал правил, що мають канонічне джерело у `npm/rules`.
16
+ Визначає список керованих дзеркал правил, які мають канонічне джерело в `npm/rules`.
19
17
 
20
18
  expectedMirrorContent
21
- Формує очікуваний вміст дзеркала, застосовуючи трансформації до канонічного файлу.
19
+ Створює очікуваний вміст дзеркала, трансформуючи канонічний файл з вбудованими шаблонами.
22
20
 
23
21
  findMirrorDrift
24
- Виявляє ідентифікатори дзеркал, чий фактичний вміст відрізняється від очікуваного.
22
+ Виявляє ідентифікатори дзеркал, чий фактичний вміст відрізняється від очікуваного вмісту, отриманого з канону.
25
23
 
26
24
  ## Публічний API
27
25
 
28
- listManagedMirrors — перераховує керовані дзеркала, які мають визначене основне джерело.
29
- expectedMirrorContent — визначає бажаний вміст дзеркала, використовуючи шаблонне заміщення даних.
30
- findMirrorDrift — знаходить ідентифікатори дзеркал, чий фактичний вміст відрізняється від очікуваного.
26
+ listManagedMirrors — перераховує лише ті дзеркала, які мають визначене основне джерело (канон).
27
+ expectedMirrorContent — визначає, як має виглядати вміст дзеркала, використовуючи канонічну версію з вбудованими шаблонами.
28
+ findMirrorDrift — виявляє ідентифікатори дзеркал, чий фактичний вміст відрізняється від очікуваного.
31
29
 
32
30
  ## Гарантії поведінки
33
31
 
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль надає легкий, лише для читання, інтерфейс для парсингу конфігурації `.n-cursor.json`. Він призначений для ізольованих, окремих викликів `check.mjs`. Модуль визначає стан кожного правила, ґрунтуючись на вмісті `.n-cursor.json`. Якщо файл відсутній, правило вважається активним (поведінка "open by default"). Якщо файл присутній, стан правила залежить від списків `rules` та `disableRules` у конфігурації. Модуль повертає об'єкт, що містить списки активних та вимкнених правил.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Парсер метаданих правил з `npm/rules/<id>/main.json` інтерпретує специфікації активації (`auto`) та області дії (`lint`). Він нормалізує логіку, визначену у `main.json.auto`, яка може бути константою `RULE_ALWAYS="завжди"`, списком залежностей, об'єктом з шаблоном `glob`, або предикатом. Код лише зчитує дані та не виконує операцій з файловою системою чи базами даних. При виникненні помилок він перехоплює їх, повертаючи безпечне значення замість винятків.
14
12
 
15
13
  ## Поведінка
@@ -3,27 +3,26 @@ type: JS Module
3
3
  title: run-lint.mjs
4
4
  resource: npm/scripts/lib/run-lint.mjs
5
5
  docgen:
6
- crc: 7d8f3637
6
+ crc: f574f097
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
- Модуль ініціалізує та керує процесом лінтування коду. Він визначає набір правил лінтування, спираючись на конфігурацію, описану в `meta.json`, та прапорець `full`, використовуючи активні правила з `.n-cursor.json`. Після визначення правил, він запускає лінтер-оркестрацію для виконання лінтування по всьому репозиторію або в режимі дельти. Модуль підтримує автоматичне форматування коду за допомогою `oxfmt`.
11
+ Модуль керує процесом лінтування коду. Він визначає набір активних правил лінтування, використовуючи конфігурації з `meta.json` та `.n-cursor.json`. Модуль надає можливість вибрати ці правила за допомогою `selectLintRules` та ініціювати запуск перевірки коду за допомогою `runLint`.
14
12
 
15
13
  ## Поведінка
16
14
 
17
- selectLintRules вибирає і відсортовує ідентифікатори правил для лінтування на основі їхньої конфігурації лінту та прапорця `full`, враховуючи активні правила з `.n-cursor.json`.
18
- runLint запускає лінтер-оркестрацію, виконуючи лінтування в режимі дельти або по всьому репозиторію, залежно від прапорця `full`, і може виконувати форматування за допомогою `oxfmt` у режимі фіксації.
15
+ selectLintRules визначає, які правила лінтуються на основі їхньої конфігурації та активності в `.n-cursor.json`, повертаючи відсортований список ID.
16
+ runLint запускає лінтер-оркестрацію залежно від наданих опцій: виконує прогін для конкретних правил, перевіряє лише змінені файли, виконує повний прогін репозиторію або форматування.
19
17
 
20
18
  ## Публічний API
21
19
 
22
- selectLintRules — вибирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
20
+ selectLintRules — вибирає ідентифікатори правил для контексту в алфавітному порядку.
23
21
  runLint — ініціює процес лінтування.
24
- full — сканує весь репозиторій, порівнюючи його з базовою версією.
25
- readOnly — лише виявляє проблеми без внесення змін, порівнюючи з базовою версією.
26
- rules — виконує повне сканування лише для заданого набору правил.
22
+ full — аналізує весь репозиторій, порівнюючи поточний стан із початковим.
23
+ readOnly — лише виявляє проблеми, не вносячи змін.
24
+ rules — виконує повний прогін лише для заданого набору правил у вказаному контексті.
25
+ files — виконує перевірку лише для перелічених файлів у режимі хука.
27
26
 
28
27
  ## Гарантії поведінки
29
28
 
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 95
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Standalone CLI runner для одного правила. Викликається з `rules/<id>/check.mjs` у блоці `if (import.meta.main)`, що робить його повним еквівалентом `bun rules/<id>/check.mjs` або `npx @nitra/cursor fix <id>`. Цей запуск є свідомим (debug / override) і виконується без whitelist-гейту. Ініціалізує кеш для проходження файлової системи та виконує стандартну перевірку, друкуючи summary результату та повертаючи aggregated exit-code.
14
12
 
15
13
  ## Поведінка
@@ -3,25 +3,23 @@ type: JS Module
3
3
  title: run-rule.mjs
4
4
  resource: npm/scripts/lib/run-rule.mjs
5
5
  docgen:
6
- crc: 7d0585e1
6
+ crc: c9b164c7
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 90
8
+ score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
- Файл оркеструє виконання одного правила під CLI `fix`. Він послідовно застосовує гейт `applies` з `js/applies.mjs` для визначення придатності правила. Якщо гейт повертає `false`, правило не застосовується. Далі виконуються JS-концерни та Policy-концерни в алфавітному порядку. Резолвер `resolveTargetFiles` ділить кеш між концернами. Кожен concern створює власний репортер, а їхні exit-коди OR-уються в єдиний контракт, що забезпечує 0/1 результат для правила. Оркестратор спирається на конфігурації `target.json` та `.n-cursor.json`.
11
+ Файл оркеструє виконання одного правила під CLI `fix`. Він послідовно застосовує `applies`-гейт, а потім виконує JS-концерни та Policy-концерни. Резолвер ділить кеш між концернами, а кожен concern має власний механізм звітності, що об'єднується в єдиний exit-код правила. Процес спирається на конфігураційні файли, зокрема `target.json` та `.n-cursor.json`.
14
12
 
15
13
  ## Поведінка
16
14
 
17
- runTemplateSubsetConcern виконує перевірку концерну, де канон визначається сніпетом у `target.json`, звіряючи його з актуальними файлами-таргетами.
15
+ runTemplateSubsetConcern виконує перевірку концерну, де канон визначено у `target.json` як `template`, звіряючи вміст файлів-таргетів з шаблоном, визначеним у відповідному каталозі.
18
16
 
19
- runRule оркеструє виконання одного правила, послідовно застосовуючи applies-гейт, виконуючи JS-концерни та запускаючи policy-концерни, а також перевіряючи відсутність markdown-посилань.
17
+ runRule оркеструє виконання одного правила, послідовно застосовуючи `applies`-гейт, виконуючи JS-концерни, запускаючи policy-концерни та перевіряючи відсутність markdown-посилань у `main.mdc`.
20
18
 
21
19
  ## Публічний API
22
20
 
23
- runTemplateSubsetConcern — Порівнює фактичний файл із канонічним шаблоном (з `target.json`) для перевірки, чи всі обов'язкові елементи присутні, дозволяючи додаткові.
24
- runRule — Виконує окреме правило, яке проходить через перевірки застосовності, JavaScript-концерни та політики.
21
+ runTemplateSubsetConcern — Порівнює фактичний файл з канонічним шаблоном (`target.json:"check":"template"`), визначаючи, чи всі обов'язкові елементи з шаблону присутні у файлі.
22
+ runRule — Виконує окреме правило, перевіряючи його відповідність через гейт, JavaScript-концерни та політики.
25
23
 
26
24
  ## Гарантії поведінки
27
25
 
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Спільна точка входу для канонічних `lint-<rule>` підкоманд `@nitra/cursor`. Файл серіалізує та дедуплікує запуски лінту через `withLock`. `ruleId` визначається зі шляху незалежно від глибини виклику (наприклад, `rules/<id>`). Це дозволяє уніфікувати крос-cutting концерни. Інтеграція з боку правила виглядає так:
14
12
 
15
13
  - import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'