@nitra/cursor 11.4.0 → 12.0.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 (358) hide show
  1. package/.claude-template/hooks/normalize-decisions.sh +34 -3
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +3 -5
  3. package/CHANGELOG.md +12 -0
  4. package/bin/n-cursor.js +2 -8
  5. package/docs/index.md +12 -0
  6. package/docs/stryker.config.md +3 -5
  7. package/docs/vitest.config.md +3 -5
  8. package/lib/docs/index.md +14 -0
  9. package/lib/docs/llm.md +4 -6
  10. package/lib/docs/models.md +3 -5
  11. package/lib/docs/omlx-trace.md +3 -5
  12. package/lib/docs/omlx.md +4 -6
  13. package/package.json +2 -1
  14. package/rules/abie/docs/fix.md +3 -5
  15. package/rules/abie/docs/index.md +11 -0
  16. package/rules/abie/js/docs/applies.md +3 -5
  17. package/rules/abie/js/docs/env_dns.md +3 -5
  18. package/rules/abie/js/docs/firebase_hosting.md +3 -5
  19. package/rules/abie/js/docs/hc_pairing.md +3 -5
  20. package/rules/abie/js/docs/index.md +16 -0
  21. package/rules/abie/js/docs/ua_http_route.md +3 -5
  22. package/rules/abie/js/docs/ua_node_selector.md +3 -5
  23. package/rules/abie/lib/docs/enabled.md +3 -5
  24. package/rules/abie/lib/docs/env-dns.md +3 -5
  25. package/rules/abie/lib/docs/hc-yaml.md +3 -5
  26. package/rules/abie/lib/docs/http-route.md +3 -5
  27. package/rules/abie/lib/docs/index.md +18 -0
  28. package/rules/abie/lib/docs/k8s-tree.md +3 -5
  29. package/rules/abie/lib/docs/kustomization-patches.md +3 -5
  30. package/rules/abie/lib/docs/overlay-paths.md +3 -5
  31. package/rules/abie/lib/docs/yaml.md +3 -5
  32. package/rules/adr/adr.mdc +2 -2
  33. package/rules/adr/docs/fix.md +3 -5
  34. package/rules/adr/docs/index.md +11 -0
  35. package/rules/adr/js/docs/hooks.md +3 -5
  36. package/rules/adr/js/docs/index.md +11 -0
  37. package/rules/bun/docs/fix.md +3 -5
  38. package/rules/bun/docs/index.md +11 -0
  39. package/rules/bun/js/docs/index.md +11 -0
  40. package/rules/bun/js/docs/layout.md +3 -5
  41. package/rules/capacitor/docs/fix.md +3 -5
  42. package/rules/capacitor/docs/index.md +11 -0
  43. package/rules/capacitor/js/docs/index.md +11 -0
  44. package/rules/capacitor/js/docs/platforms.md +3 -5
  45. package/rules/changelog/docs/fix.md +3 -5
  46. package/rules/changelog/docs/index.md +11 -0
  47. package/rules/changelog/js/docs/consistency.md +3 -5
  48. package/rules/changelog/js/docs/index.md +11 -0
  49. package/rules/changelog/lib/docs/index.md +11 -0
  50. package/rules/changelog/lib/docs/package-manifest.md +3 -5
  51. package/rules/ci4/docs/fix.md +3 -5
  52. package/rules/ci4/docs/index.md +11 -0
  53. package/rules/ci4/js/docs/index.md +11 -0
  54. package/rules/ci4/js/docs/marksman_config.md +3 -5
  55. package/rules/doc-files/docs/fix.md +3 -5
  56. package/rules/doc-files/docs/index.md +11 -0
  57. package/rules/doc-files/js/docgen-crc.mjs +50 -14
  58. package/rules/doc-files/js/docgen-files-batch.mjs +73 -2
  59. package/rules/doc-files/js/docs/docgen-crc.md +4 -6
  60. package/rules/doc-files/js/docs/docgen-extract-anchors.md +3 -5
  61. package/rules/doc-files/js/docs/docgen-extract.md +3 -5
  62. package/rules/doc-files/js/docs/docgen-files-batch.md +4 -6
  63. package/rules/doc-files/js/docs/docgen-gen.md +4 -6
  64. package/rules/doc-files/js/docs/docgen-ignore.md +3 -5
  65. package/rules/doc-files/js/docs/docgen-judge-measure.md +3 -5
  66. package/rules/doc-files/js/docs/docgen-judge.md +3 -5
  67. package/rules/doc-files/js/docs/docgen-prompts.md +3 -5
  68. package/rules/doc-files/js/docs/docgen-scan.md +4 -6
  69. package/rules/doc-files/js/docs/index.md +24 -0
  70. package/rules/doc-files/js/docs/lint.md +4 -6
  71. package/rules/doc-files/js/docs/units-js.md +3 -5
  72. package/rules/doc-files/js/docs/units-rs.md +3 -5
  73. package/rules/doc-files/js/docs/units.md +3 -5
  74. package/rules/doc-files/lint/docs/index.md +11 -0
  75. package/rules/doc-files/lint/docs/lint.md +3 -5
  76. package/rules/docker/docs/fix.md +3 -5
  77. package/rules/docker/docs/index.md +11 -0
  78. package/rules/docker/js/docs/index.md +11 -0
  79. package/rules/docker/js/docs/lint.md +3 -5
  80. package/rules/docker/lib/docs/docker-hadolint.md +3 -5
  81. package/rules/docker/lib/docs/docker-mirror.md +3 -5
  82. package/rules/docker/lib/docs/docker-native-addon.md +3 -5
  83. package/rules/docker/lib/docs/docker-nginx-user.md +3 -5
  84. package/rules/docker/lib/docs/index.md +14 -0
  85. package/rules/docker/lint/docs/index.md +11 -0
  86. package/rules/docker/lint/docs/lint.md +3 -5
  87. package/rules/efes/docs/fix.md +3 -5
  88. package/rules/efes/docs/index.md +11 -0
  89. package/rules/feedback/docs/fix.md +3 -5
  90. package/rules/feedback/docs/index.md +11 -0
  91. package/rules/ga/docs/fix.md +3 -5
  92. package/rules/ga/docs/index.md +11 -0
  93. package/rules/ga/js/docs/index.md +12 -0
  94. package/rules/ga/js/docs/lint.md +3 -5
  95. package/rules/ga/js/docs/workflows.md +3 -5
  96. package/rules/ga/lint/docs/index.md +11 -0
  97. package/rules/ga/lint/docs/lint.md +3 -5
  98. package/rules/graphql/docs/fix.md +3 -5
  99. package/rules/graphql/docs/index.md +11 -0
  100. package/rules/graphql/js/docs/index.md +11 -0
  101. package/rules/graphql/js/docs/tooling.md +3 -5
  102. package/rules/graphql/lib/docs/graphql-gql-scan.md +3 -5
  103. package/rules/graphql/lib/docs/index.md +11 -0
  104. package/rules/hasura/docs/fix.md +3 -5
  105. package/rules/hasura/docs/index.md +11 -0
  106. package/rules/hasura/js/docs/index.md +11 -0
  107. package/rules/hasura/js/docs/internal_urls.md +3 -5
  108. package/rules/image-avif/docs/fix.md +3 -5
  109. package/rules/image-avif/docs/index.md +11 -0
  110. package/rules/image-avif/js/docs/avif_generation.md +3 -5
  111. package/rules/image-avif/js/docs/index.md +11 -0
  112. package/rules/image-compress/docs/fix.md +3 -5
  113. package/rules/image-compress/docs/index.md +11 -0
  114. package/rules/image-compress/js/docs/index.md +11 -0
  115. package/rules/image-compress/js/docs/package_setup.md +3 -5
  116. package/rules/js-bun-db/docs/fix.md +3 -5
  117. package/rules/js-bun-db/docs/index.md +11 -0
  118. package/rules/js-bun-db/js/docs/index.md +11 -0
  119. package/rules/js-bun-db/js/docs/safety.md +3 -5
  120. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +3 -5
  121. package/rules/js-bun-db/lib/docs/index.md +11 -0
  122. package/rules/js-bun-redis/docs/fix.md +3 -5
  123. package/rules/js-bun-redis/docs/index.md +11 -0
  124. package/rules/js-bun-redis/js/docs/imports.md +3 -5
  125. package/rules/js-bun-redis/js/docs/index.md +11 -0
  126. package/rules/js-bun-redis/lib/docs/index.md +11 -0
  127. package/rules/js-bun-redis/lib/docs/redis-imports.md +3 -5
  128. package/rules/js-lint/docs/fix.md +3 -5
  129. package/rules/js-lint/docs/index.md +11 -0
  130. package/rules/js-lint/js/docs/index.md +14 -0
  131. package/rules/js-lint/js/docs/lint-findings.md +3 -5
  132. package/rules/js-lint/js/docs/lint.md +3 -5
  133. package/rules/js-lint/js/docs/tooling.md +3 -5
  134. package/rules/js-lint/js/docs/utils_imports.md +3 -5
  135. package/rules/js-lint-ci/docs/fix.md +3 -5
  136. package/rules/js-lint-ci/docs/index.md +11 -0
  137. package/rules/js-lint-ci/js/docs/index.md +11 -0
  138. package/rules/js-lint-ci/js/docs/lint.md +3 -5
  139. package/rules/js-mssql/docs/fix.md +3 -5
  140. package/rules/js-mssql/docs/index.md +11 -0
  141. package/rules/js-mssql/js/docs/deps.md +3 -5
  142. package/rules/js-mssql/js/docs/index.md +11 -0
  143. package/rules/js-mssql/lib/docs/index.md +11 -0
  144. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +3 -5
  145. package/rules/js-run/docs/fix.md +3 -5
  146. package/rules/js-run/docs/index.md +11 -0
  147. package/rules/js-run/js/docs/index.md +11 -0
  148. package/rules/js-run/js/docs/runtime.md +3 -5
  149. package/rules/js-run/lib/docs/bunyan-imports.md +3 -5
  150. package/rules/js-run/lib/docs/check-env-scan.md +3 -5
  151. package/rules/js-run/lib/docs/conn-file-rules.md +3 -5
  152. package/rules/js-run/lib/docs/conn-imports-scan.md +3 -5
  153. package/rules/js-run/lib/docs/index.md +16 -0
  154. package/rules/js-run/lib/docs/promise-settimeout-scan.md +3 -5
  155. package/rules/js-run/lib/docs/temporal-scan.md +3 -5
  156. package/rules/k8s/docs/fix.md +3 -5
  157. package/rules/k8s/docs/index.md +11 -0
  158. package/rules/k8s/k8s.mdc +10 -0
  159. package/rules/k8s/lint/docs/index.md +11 -0
  160. package/rules/k8s/lint/docs/lint.md +3 -5
  161. package/rules/k8s/policy/manifest/manifest.rego +46 -0
  162. package/rules/lint/docs/fix.md +3 -5
  163. package/rules/lint/docs/index.md +11 -0
  164. package/rules/lint/js/docs/index.md +11 -0
  165. package/rules/lint/js/docs/orchestrate.md +4 -6
  166. package/rules/nginx-default-tpl/docs/fix.md +3 -5
  167. package/rules/nginx-default-tpl/docs/index.md +11 -0
  168. package/rules/nginx-default-tpl/js/docs/index.md +11 -0
  169. package/rules/nginx-default-tpl/js/docs/template.md +3 -5
  170. package/rules/npm-module/docs/fix.md +3 -5
  171. package/rules/npm-module/docs/index.md +11 -0
  172. package/rules/npm-module/js/docs/header_doc_pointer.md +3 -5
  173. package/rules/npm-module/js/docs/index.md +14 -0
  174. package/rules/npm-module/js/docs/package_structure.md +3 -5
  175. package/rules/npm-module/js/docs/rule_meta.md +3 -5
  176. package/rules/npm-module/js/docs/skill_meta.md +3 -5
  177. package/rules/php/docs/fix.md +3 -5
  178. package/rules/php/docs/index.md +11 -0
  179. package/rules/php/js/docs/index.md +11 -0
  180. package/rules/php/js/docs/tooling.md +3 -5
  181. package/rules/php/lint/docs/index.md +11 -0
  182. package/rules/php/lint/docs/lint.md +3 -5
  183. package/rules/python/docs/fix.md +3 -5
  184. package/rules/python/docs/index.md +11 -0
  185. package/rules/python/js/docs/applies.md +3 -5
  186. package/rules/python/js/docs/index.md +12 -0
  187. package/rules/python/js/docs/tooling.md +3 -5
  188. package/rules/python/lint/docs/index.md +11 -0
  189. package/rules/python/lint/docs/lint.md +3 -5
  190. package/rules/rego/docs/fix.md +3 -5
  191. package/rules/rego/docs/index.md +11 -0
  192. package/rules/rego/js/docs/applies.md +3 -5
  193. package/rules/rego/js/docs/index.md +12 -0
  194. package/rules/rego/js/docs/lint.md +3 -5
  195. package/rules/rego/lint/docs/index.md +11 -0
  196. package/rules/rego/lint/docs/lint.md +3 -5
  197. package/rules/release/docs/change.md +3 -5
  198. package/rules/release/docs/fix.md +3 -5
  199. package/rules/release/docs/index.md +13 -0
  200. package/rules/release/docs/release.md +4 -6
  201. package/rules/release/lib/docs/aggregate.md +3 -5
  202. package/rules/release/lib/docs/change-file.md +3 -3
  203. package/rules/release/lib/docs/fallback.md +3 -5
  204. package/rules/release/lib/docs/index.md +13 -0
  205. package/rules/release/release.mjs +40 -1
  206. package/rules/rust/docs/fix.md +3 -5
  207. package/rules/rust/docs/index.md +11 -0
  208. package/rules/rust/js/docs/applies.md +3 -5
  209. package/rules/rust/js/docs/index.md +11 -0
  210. package/rules/rust/lib/docs/has-cargo-toml.md +3 -5
  211. package/rules/rust/lib/docs/index.md +11 -0
  212. package/rules/security/docs/fix.md +3 -5
  213. package/rules/security/docs/index.md +11 -0
  214. package/rules/security/js/docs/index.md +13 -0
  215. package/rules/security/js/docs/lint.md +3 -5
  216. package/rules/security/js/docs/sample_secret.md +3 -5
  217. package/rules/security/js/docs/trufflehog.md +3 -5
  218. package/rules/style-lint/docs/fix.md +3 -5
  219. package/rules/style-lint/docs/index.md +11 -0
  220. package/rules/style-lint/js/docs/index.md +12 -0
  221. package/rules/style-lint/js/docs/lint.md +3 -5
  222. package/rules/style-lint/js/docs/tooling.md +3 -5
  223. package/rules/tauri/docs/fix.md +3 -5
  224. package/rules/tauri/docs/index.md +11 -0
  225. package/rules/tauri/js/docs/cargo_mutants_config.md +3 -5
  226. package/rules/tauri/js/docs/index.md +12 -0
  227. package/rules/tauri/js/docs/tooling.md +3 -5
  228. package/rules/test/docs/fix.md +3 -5
  229. package/rules/test/docs/index.md +11 -0
  230. package/rules/test/js/data/stryker_config/docs/index.md +13 -0
  231. package/rules/test/js/data/stryker_config/docs/stryker-vue-macros-ignorer.md +3 -5
  232. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +3 -5
  233. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +3 -5
  234. package/rules/test/js/data/vitest_config/docs/index.md +11 -0
  235. package/rules/test/js/data/vitest_config/docs/vitest.config.baseline.md +3 -5
  236. package/rules/test/js/docs/cargo_mutants_config.md +3 -5
  237. package/rules/test/js/docs/index.md +16 -0
  238. package/rules/test/js/docs/location.md +3 -5
  239. package/rules/test/js/docs/no-process-chdir.md +3 -5
  240. package/rules/test/js/docs/no-relative-fs-path.md +3 -5
  241. package/rules/test/js/docs/stryker_config.md +3 -5
  242. package/rules/test/js/docs/vitest-config-pool-forks.md +3 -5
  243. package/rules/text/docs/fix.md +3 -5
  244. package/rules/text/docs/index.md +11 -0
  245. package/rules/text/js/docs/forbidden-prettier.md +3 -5
  246. package/rules/text/js/docs/formatting.md +4 -6
  247. package/rules/text/js/docs/index.md +13 -0
  248. package/rules/text/js/docs/lint.md +4 -6
  249. package/rules/text/lint/docs/cspell-fix.md +4 -6
  250. package/rules/text/lint/docs/index.md +15 -0
  251. package/rules/text/lint/docs/lint.md +4 -6
  252. package/rules/text/lint/docs/run-dotenv-linter.md +3 -5
  253. package/rules/text/lint/docs/run-shellcheck.md +3 -5
  254. package/rules/text/lint/docs/run-v8r.md +3 -5
  255. package/rules/vue/docs/fix.md +3 -5
  256. package/rules/vue/docs/index.md +11 -0
  257. package/rules/vue/js/docs/index.md +11 -0
  258. package/rules/vue/js/docs/packages.md +3 -5
  259. package/rules/vue/lib/docs/index.md +11 -0
  260. package/rules/vue/lib/docs/vue-forbidden-imports.md +3 -5
  261. package/rules/vue/vue.mdc +19 -1
  262. package/rules/worktree/docs/fix.md +3 -5
  263. package/rules/worktree/docs/index.md +11 -0
  264. package/rules/worktree/worktree.mdc +8 -8
  265. package/scripts/coverage-classify/docs/apply.md +3 -5
  266. package/scripts/coverage-classify/docs/cache.md +3 -5
  267. package/scripts/coverage-classify/docs/index.md +9 -27
  268. package/scripts/coverage-classify/docs/prompt.md +3 -5
  269. package/scripts/coverage-classify/docs/verdict-schema.md +3 -5
  270. package/scripts/dispatcher/docs/index.md +11 -0
  271. package/scripts/dispatcher/docs/trace.md +3 -5
  272. package/scripts/docs/auto-rules.md +3 -5
  273. package/scripts/docs/auto-skills.md +3 -5
  274. package/scripts/docs/build-agents-commands.md +3 -5
  275. package/scripts/docs/cli-entry.md +3 -5
  276. package/scripts/docs/coverage-fix-extract.md +3 -5
  277. package/scripts/docs/coverage-fix.md +3 -5
  278. package/scripts/docs/ensure-nitra-cursor-dev-dependencies.md +3 -5
  279. package/scripts/docs/index.md +24 -0
  280. package/scripts/docs/post-tool-use-fix.md +4 -6
  281. package/scripts/docs/rename-yaml-extensions.md +3 -5
  282. package/scripts/docs/skills-cli.md +3 -5
  283. package/scripts/docs/sync-claude-config.md +3 -5
  284. package/scripts/docs/sync-setup-bun-deps-action.md +3 -5
  285. package/scripts/docs/upgrade-nitra-cursor-and-install.md +3 -5
  286. package/scripts/docs/worktree-cli.md +3 -5
  287. package/scripts/lib/adr/docs/index.md +12 -0
  288. package/scripts/lib/adr/docs/normalize-cli.md +3 -5
  289. package/scripts/lib/adr/docs/normalize-pipeline.md +4 -6
  290. package/scripts/lib/adr/normalize-pipeline.mjs +140 -46
  291. package/scripts/lib/docs/assert-project-root.md +3 -5
  292. package/scripts/lib/docs/changed-files.md +3 -5
  293. package/scripts/lib/docs/check-mdc-template-refs.md +3 -5
  294. package/scripts/lib/docs/check-reporter.md +3 -5
  295. package/scripts/lib/docs/diff-added-lines.md +3 -5
  296. package/scripts/lib/docs/discover-check-rules-from-cursor.md +3 -5
  297. package/scripts/lib/docs/discover-checkable-rules.md +3 -5
  298. package/scripts/lib/docs/ensure-tool.md +3 -5
  299. package/scripts/lib/docs/generated-markdown.md +3 -5
  300. package/scripts/lib/docs/gha-workflow.md +3 -5
  301. package/scripts/lib/docs/index.md +44 -0
  302. package/scripts/lib/docs/inline-template-links.md +3 -5
  303. package/scripts/lib/docs/list-project-rules-mdc.md +3 -5
  304. package/scripts/lib/docs/list-rule-ids.md +3 -5
  305. package/scripts/lib/docs/load-cursor-config.md +3 -5
  306. package/scripts/lib/docs/mirror-parity.md +3 -3
  307. package/scripts/lib/docs/read-n-cursor-config-lite.md +3 -5
  308. package/scripts/lib/docs/resolve-target-files.md +3 -5
  309. package/scripts/lib/docs/root-notice.md +3 -5
  310. package/scripts/lib/docs/rule-meta-helpers.md +3 -5
  311. package/scripts/lib/docs/rule-meta.md +3 -5
  312. package/scripts/lib/docs/rule-predicates.md +3 -5
  313. package/scripts/lib/docs/run-conftest-batch.md +3 -5
  314. package/scripts/lib/docs/run-lint-step.md +3 -5
  315. package/scripts/lib/docs/run-rule-cli.md +3 -5
  316. package/scripts/lib/docs/run-rule.md +3 -5
  317. package/scripts/lib/docs/run-standard-lint.md +3 -5
  318. package/scripts/lib/docs/run-standard-rule.md +3 -5
  319. package/scripts/lib/docs/skill-meta.md +3 -5
  320. package/scripts/lib/docs/sync-gitignore-worktree.md +3 -5
  321. package/scripts/lib/docs/template.md +3 -5
  322. package/scripts/lib/docs/timing-summary.md +3 -5
  323. package/scripts/lib/docs/workspaces.md +3 -5
  324. package/scripts/lib/docs/worktree-notice.md +3 -5
  325. package/scripts/lib/docs/worktree.md +3 -5
  326. package/scripts/lib/fix/docs/index.md +16 -0
  327. package/scripts/lib/fix/docs/llm-fix-apply.md +3 -5
  328. package/scripts/lib/fix/docs/llm-lint-fix.md +3 -5
  329. package/scripts/lib/fix/docs/llm-worker.md +3 -5
  330. package/scripts/lib/fix/docs/orchestrator.md +3 -5
  331. package/scripts/lib/fix/docs/run-fix-check.md +3 -5
  332. package/scripts/lib/fix/docs/t0.md +3 -5
  333. package/scripts/lib/worktree-notice.mjs +3 -38
  334. package/scripts/utils/docs/ast-scan-utils.md +3 -5
  335. package/scripts/utils/docs/ensure-gitignore-entries.md +3 -5
  336. package/scripts/utils/docs/find-package-json-paths.md +3 -5
  337. package/scripts/utils/docs/index.md +23 -0
  338. package/scripts/utils/docs/lock-cache-dir.md +3 -5
  339. package/scripts/utils/docs/pass.md +3 -5
  340. package/scripts/utils/docs/resolve-cargo-manifest.md +3 -5
  341. package/scripts/utils/docs/resolve-cmd.md +3 -5
  342. package/scripts/utils/docs/resolve-js-root.md +3 -5
  343. package/scripts/utils/docs/test-helpers.md +3 -5
  344. package/scripts/utils/docs/walk-cache.md +3 -5
  345. package/scripts/utils/docs/walkDir.md +3 -5
  346. package/scripts/utils/docs/with-lock.md +3 -5
  347. package/scripts/utils/docs/worktree-fingerprint.md +3 -5
  348. package/skills/doc-aggregate/js/docs/docgen-ignore.md +3 -5
  349. package/skills/doc-aggregate/js/docs/docgen-scan.md +3 -5
  350. package/skills/doc-aggregate/js/docs/index.md +12 -0
  351. package/skills/start-check/js/docs/check.md +3 -5
  352. package/skills/start-check/js/docs/index.md +11 -0
  353. package/skills/taze/js/docs/diff.md +3 -5
  354. package/skills/taze/js/docs/index.md +11 -0
  355. package/scripts/lib/worktree.mjs +0 -126
  356. package/scripts/worktree-cli.mjs +0 -230
  357. package/skills/worktree/SKILL.md +0 -38
  358. package/skills/worktree/meta.json +0 -1
@@ -1,14 +1,12 @@
1
1
  ---
2
+ type: JS Module
3
+ title: sync-claude-config.mjs
4
+ resource: npm/scripts/sync-claude-config.mjs
2
5
  docgen:
3
- source: npm/scripts/sync-claude-config.mjs
4
6
  crc: ad7b8440
5
7
  score: 95
6
8
  ---
7
9
 
8
- # sync-claude-config.mjs
9
-
10
- ## Огляд
11
-
12
10
  Файл синхронізує конфігурацію Claude Code (`.claude/settings.json`), slash-команди з темплейту та Cursor hooks (`.cursor/hooks.json`) у поточний проєкт з використанням темплейтів пакету `npm/.claude-template/`. Він виконує злиття користувацьких полів, дозволів та хуків з різних джерел. Синхронізуються та видаляються залежні скрипти та фрагменти конфігурації.
13
11
 
14
12
  ## Поведінка
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: sync-setup-bun-deps-action.mjs
4
+ resource: npm/scripts/sync-setup-bun-deps-action.mjs
2
5
  docgen:
3
- source: npm/scripts/sync-setup-bun-deps-action.mjs
4
6
  crc: 098d7209
5
7
  ---
6
8
 
7
- # sync-setup-bun-deps-action.mjs
8
-
9
- ## Огляд
10
-
11
9
  Файл містить конфігурацію GitHub Action `setup-bun-deps`, яка автоматично встановлює залежності проєкту Bun. Він використовується workflow для підготовки середовища проєкту, забезпечуючи узгодженість та спрощуючи виконання тестів та інших завдань, що потребують Bun. Це дозволяє workflow, що використовує `actions/checkout@v6`, безпосередньо використовувати action, не потребуючи додаткової конфігурації.
12
10
 
13
11
  ## Поведінка
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: upgrade-nitra-cursor-and-install.mjs
4
+ resource: npm/scripts/upgrade-nitra-cursor-and-install.mjs
2
5
  docgen:
3
- source: npm/scripts/upgrade-nitra-cursor-and-install.mjs
4
6
  crc: b0742ab3
5
7
  ---
6
8
 
7
- # upgrade-nitra-cursor-and-install.mjs
8
-
9
- ## Огляд
10
-
11
9
  Файл автоматично синхронізує правила командного інтерфейсу (CLI) з останньою версією `@nitra/cursor` з npm registry. Це забезпечує, що локальна версія `@nitra/cursor` завжди актуальна, а також інсталює необхідні залежності за допомогою `bun i`. Він використовується для підтримки узгодженості між локальним проєктом та офіційним репозиторієм npm.
12
10
 
13
11
  ## Поведінка
@@ -1,14 +1,12 @@
1
1
  ---
2
+ type: JS Module
3
+ title: worktree-cli.mjs
4
+ resource: npm/scripts/worktree-cli.mjs
2
5
  docgen:
3
- source: npm/scripts/worktree-cli.mjs
4
6
  crc: 4fb54376
5
7
  score: 100
6
8
  ---
7
9
 
8
- # worktree-cli.mjs
9
-
10
- ## Огляд
11
-
12
10
  Файл є CLI-оркестратором `worktree-tool` для керування конвенцією `.worktrees/`. Він забезпечує виконання Git-операцій для додавання, видалення, перегляду та прибирання робочих просторів.
13
11
 
14
12
  ## Поведінка
@@ -0,0 +1,12 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/scripts/lib/adr
4
+ resource: npm/scripts/lib/adr/
5
+ ---
6
+
7
+ # npm/scripts/lib/adr
8
+
9
+ | Файл | Тип |
10
+ |---|---|
11
+ | [normalize-cli.mjs](normalize-cli.md) | JS Module |
12
+ | [normalize-pipeline.mjs](normalize-pipeline.md) | JS Module |
@@ -1,15 +1,13 @@
1
1
  ---
2
+ type: JS Module
3
+ title: normalize-cli.mjs
4
+ resource: npm/scripts/lib/adr/normalize-cli.mjs
2
5
  docgen:
3
- source: normalize-cli.mjs
4
6
  crc: ce2f13af
5
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
6
8
  score: 90
7
9
  ---
8
10
 
9
- # normalize-cli.mjs
10
-
11
- ## Огляд
12
-
13
11
  Цей файл є CLI-обгорткою для локального ADR-нормалізатора (`n-cursor adr-normalize-local`). Він використовується скриптом `.claude/hooks/normalize-decisions.sh` як локальний бекенд для обробки батчу чернеток та списку чистих ADR. Обгортка зчитує шляхи до чернеток та параметри з аргументів командного рядка та змінних середовища, а потім проганяє `normalizePipeline`. Результатом роботи є вивід JSON-контракту з операціями у stdout, який парситься зовнішнім скриптом. Прогрес відображається у stderr.
14
12
 
15
13
  ## Поведінка
@@ -1,15 +1,13 @@
1
1
  ---
2
+ type: JS Module
3
+ title: normalize-pipeline.mjs
4
+ resource: npm/scripts/lib/adr/normalize-pipeline.mjs
2
5
  docgen:
3
- source: normalize-pipeline.mjs
4
- crc: 6619ff48
6
+ crc: 6eb6ba69
5
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
6
8
  score: 100
7
9
  ---
8
10
 
9
- # normalize-pipeline.mjs
10
-
11
- ## Огляд
12
-
13
11
  Файл реалізує локально-орієнтований конвеєр для нормалізації чернеток ADR. Він використовує LLM лише для вузьких, верифікованих бінарних суджень. Конвеєр працює у послідовних стадіях: JS виконує пошук кандидатів-ребер на основі лексичної схожості, LLM оцінює ці ребра (Stage 1: `same/different`) та драфти (Stage 1b: `standalone/trivial`), JS кластеризує підтверджені ребра (використовуючи `union-find`), LLM реформатує анотера (Stage 2: `gen-MADR`), а LLM генерує доповнення для злиття (Stage 3: `gen-merge`). Глобальний стан (кластери, слаги, покриття) зберігається в JS. Конвеєр повертає операції у форматі `operations[]`, сумісного з контрактом `apply-ops`.
14
12
 
15
13
  ## Поведінка
@@ -3,20 +3,22 @@
3
3
  * LLM відповідає лише на вузькі verifiable-питання). Альтернатива single-shot-у
4
4
  * normalize-decisions.sh, заточена під малу локальну модель (omlx/gemma-4b).
5
5
  *
6
- * Принцип: модель НІКОЛИ не приймає глобальних рішень і не повертає великих
7
- * структур. Глобальний стан (кластери, слаги, покриття) тримає JS. Модель:
6
+ * Принцип: модель НІКОЛИ не приймає глобальних рішень, не повертає великих
7
+ * структур і НЕ форматує. Глобальний стан (кластери, слаги, покриття) та весь
8
+ * MADR-каркас (заголовок, Status/Date, назви секцій, fallback-фрази, шаблон
9
+ * "Chosen option…") тримає JS. Модель повертає лише вузький, verifiable зміст:
8
10
  * - судить пару записів бінарно «те саме рішення? так/ні» (Stage 1),
9
11
  * - для ізольованого драфта каже standalone/trivial (Stage 1b),
10
- * - реформатить один драфт у чистий MADR (Stage 2),
11
- * - пише short merge-additions (Stage 3).
12
+ * - витягує зміст секцій одного драфта як JSON (Stage 2) — каркас будує JS,
13
+ * - пише short merge-additions без заголовка (Stage 3) — «## Update <date>» додає JS.
12
14
  *
13
15
  * Стадії:
14
16
  * 0. retrieval (JS) — лексична схожість → кандидати-ребра draft↔draft / draft↔clean
15
17
  * 1. edge-judge (LLM) — бінарне same/different по кожному ребру (self-consistency)
16
18
  * 1b. kind-judge(LLM) — standalone vs trivial для драфтів без ребер
17
19
  * ── cluster (JS) — union-find по підтверджених ребрах, вибір anchor, призначення op
18
- * 2. gen-MADR (LLM) — reformat anchor/standaloneчистий MADR + validation gate
19
- * 3. gen-merge (LLM) — additions для merge-драфтів
20
+ * 2. gen-MADR LLM витягує секції-JSONassembleMadr() (JS) збирає канон → validation gate
21
+ * 3. gen-merge LLM пише additions-прозу JS додає «## Update <date>»-заголовок
20
22
  * ── assemble (JS) — operations[] у форматі, сумісному з apply-ops
21
23
  *
22
24
  * Повертає той самий operations[]-контракт, що й single-shot — apply-логіка спільна.
@@ -38,6 +40,7 @@ const RE_SLUG_NONWORD = /[^a-zа-яіїєґ0-9]+/gi
38
40
  const RE_LEAD_HYPHEN = /^-+/
39
41
  const RE_TRAIL_HYPHEN = /-+$/
40
42
  const RE_UPDATE_HEAD = /^##\s+Update/
43
+ const RE_UPDATE_HEAD_LINE = /^##\s+Update[^\n]*\n+/
41
44
  const RE_DECISION_SECTION = /##\s*Decision Outcome\s*([\s\S]{0,500})/i
42
45
  const RE_NO_DECISION = /(не\s+обрано|не\s+прийнят|рішення\s+не\s+прийн|не\s+зроблен|no\s+decision|undecided)/i
43
46
  const RE_FENCE_LEAD = /^\s*```/
@@ -300,79 +303,170 @@ export function validateMadr(content) {
300
303
  const errors = []
301
304
  if (!content || content.length < 80) errors.push('too short')
302
305
  if (RE_FENCE_LEAD.test(content) || RE_FENCE_TRAIL.test(content.trim())) errors.push('code-fence wrapper')
303
- if (RE_FRONTMATTER.test(content.split('\n').slice(0, 3).join('\n'))) errors.push('has YAML frontmatter')
306
+ // OKF conformance: must have YAML frontmatter with type: ADR (not draft session: fields)
307
+ const fmMatch = /^---\n([\s\S]*?)\n---/.exec(content)
308
+ if (!fmMatch || !/^type:\s*ADR\s*$/m.test(fmMatch[1])) errors.push('missing OKF type: ADR frontmatter')
304
309
  if (RE_SESSION.test(content)) errors.push('leaked session: field')
305
- if (!RE_H1.test(content)) errors.push('missing # title')
306
310
  if (!RE_STATUS.test(content)) errors.push('missing Status')
307
311
  if (!RE_DATE.test(content)) errors.push('missing/!ISO Date')
308
312
  for (const h of MADR_HEADINGS) if (!content.includes(h)) errors.push(`missing heading ${h}`)
309
313
  return { ok: errors.length === 0, errors }
310
314
  }
311
315
 
312
- const GEN_SYS = `Ти нормалізуєш чернетку ADR у чистий фінальний MADR 4.0.0. Чернетка вже містить секції — твоя задача ОЧИСТИТИ й привести до канону, НЕ вигадуючи нового.
313
-
314
- Поверни ЛИШЕ markdown файлу (починається з "# "), без code-fence, без передмови, без YAML frontmatter.
315
-
316
- Структура РІВНО така:
317
- # <Заголовок українською>
316
+ // Інверсія форматування: модель НЕ генерує markdown-каркас MADR (заголовок,
317
+ // Status/Date, назви секцій, fallback-фрази, шаблон "Chosen option…") — усе це
318
+ // детерміновано, тому його будує JS у assembleMadr(). Модель повертає ЛИШЕ
319
+ // контент секцій як вузький JSON — те, що справді треба "витягти" з чернетки.
320
+ // Контракт: модель віддає ЛИШЕ зміст секцій (значення полів — markdown-проза зі
321
+ // збереженим inline-кодом). Каркас (заголовок, Status/Date, назви секцій ##,
322
+ // fallback-фрази, шаблон "Chosen option…") будує assembleMadr() детерміновано —
323
+ // тому модель НЕ пише жодних ## і не торкається заголовка/дати/статусу.
324
+ const GEN_SYS = `Ти витягуєш зміст архітектурного рішення з чернетки ADR у JSON. Нічого не вигадуй — бери лише те, що є в чернетці.
325
+
326
+ {
327
+ "context": "<2-4 речення: проблема й контекст рішення>",
328
+ "options": ["<розглянутий варіант>", "..."],
329
+ "chosen": "<обраний варіант, коротко>",
330
+ "rationale": "<чому обрано саме його>",
331
+ "good": ["<позитивний наслідок>", "..."],
332
+ "bad": ["<негативний наслідок>", "..."],
333
+ "more": "<файли/команди/API; можна кілька рядків і bullets>"
334
+ }
318
335
 
319
- **Status:** Accepted
320
- **Date:** <YYYY-MM-DD з поля captured чернетки, перші 10 символів>
336
+ ВАЖЛИВО про значення полів:
337
+ - Зберігай inline-форматування: backticks навколо \`шляхів\`, \`назв.функцій()\`, \`команд\` — це частина змісту, не прибирай їх.
338
+ - НЕ додавай markdown-ЗАГОЛОВКИ (рядки з ##) і не пиши сам каркас (Status, Date, назви секцій) — лише зміст.
339
+ - Якщо чогось нема в чернетці — порожній рядок "" або порожній масив [].
321
340
 
322
- ## Context and Problem Statement
323
- <...>
341
+ Поверни ЛИШЕ JSON, без code-fence, без передмови.`
324
342
 
325
- ## Considered Options
326
- <bullets; якщо альтернатив не було "Інші варіанти не обговорювалися.">
343
+ const slugify = (title) =>
344
+ title.toLowerCase().replace(RE_SLUG_NONWORD, '-').replace(RE_LEAD_HYPHEN, '').slice(0, 60).replace(RE_TRAIL_HYPHEN, '') || 'adr'
327
345
 
328
- ## Decision Outcome
329
- Chosen option: "<...>", because <...>.
346
+ const RE_FNAME_DATE = /^(\d{2})(\d{2})(\d{2})-/
347
+ const RE_TRAIL_DOT = /\.+\s*$/
330
348
 
331
- ### Consequences
332
- <bullets "Good, because ...", "Bad, because ...">
349
+ /**
350
+ * Детермінована ISO-дата для поля **Date:**. Пріоритет — `captured` frontmatter
351
+ * (перші 10 символів ISO-стемпа); fallback — timestamp-префікс імені файлу
352
+ * (`YYMMDD-…` → `20YY-MM-DD`). Каркас MADR не повинен залежати від LLM навіть тут.
353
+ * @param {string|undefined} captured значення поля captured (ISO-рядок)
354
+ * @param {string} [file] basename чернетки (для fallback-дати)
355
+ * @returns {string} ISO-дата `YYYY-MM-DD` або '' якщо нічого не вдалося витягти
356
+ */
357
+ export function madrDate(captured, file = '') {
358
+ const iso = (captured ?? '').slice(0, 10)
359
+ if (RE_DATE.test(`**Date:** ${iso}`)) return iso
360
+ const m = file.match(RE_FNAME_DATE)
361
+ return m ? `20${m[1]}-${m[2]}-${m[3]}` : ''
362
+ }
333
363
 
334
- ## More Information
335
- <файли, команди, API; якщо нема "Додаткової інформації не зафіксовано.">
364
+ const secStr = (v) => (typeof v === 'string' ? v.trim() : v === null || v === undefined ? '' : String(v).trim())
365
+ const secArr = (v) => (Array.isArray(v) ? v.map(secStr).filter(Boolean) : secStr(v) ? [secStr(v)] : [])
336
366
 
337
- Не вигадуй альтернатив, наслідків чи контексту, яких нема в чернетці. Прибери YAML frontmatter (session/captured/transcript) повністю.`
367
+ /**
368
+ * Нормалізує сирий JSON-вивід gen-моделі у строгу форму секцій. Толерантна до
369
+ * дрібних відхилень малої моделі: рядок замість масиву → масив із одного елемента,
370
+ * число/null → рядок/порожньо, обрізає пробіли й порожні елементи.
371
+ * @param {any} obj розпарсений JSON-обʼєкт від моделі
372
+ * @returns {{context:string, options:string[], chosen:string, rationale:string, good:string[], bad:string[], more:string}} нормалізовані секції
373
+ */
374
+ export function normalizeSections(obj) {
375
+ return {
376
+ context: secStr(obj?.context),
377
+ options: secArr(obj?.options),
378
+ chosen: secStr(obj?.chosen),
379
+ rationale: secStr(obj?.rationale),
380
+ good: secArr(obj?.good),
381
+ bad: secArr(obj?.bad),
382
+ more: secStr(obj?.more)
383
+ }
384
+ }
338
385
 
339
- const slugify = (title) =>
340
- title.toLowerCase().replace(RE_SLUG_NONWORD, '-').replace(RE_LEAD_HYPHEN, '').slice(0, 60).replace(RE_TRAIL_HYPHEN, '') || 'adr'
386
+ /**
387
+ * Детермінована збірка канонічного MADR 4.0.0 з заголовка, дати й секцій-контенту.
388
+ * Увесь каркас (Status, назви секцій, шаблон "Chosen option…", fallback-фрази,
389
+ * bullets) — тут, не в моделі. Заголовок і дата — JS-власність (draftTitle/captured),
390
+ * модель їх не торкається.
391
+ * @param {{title:string, date:string, sections:ReturnType<typeof normalizeSections>}} input заголовок, ISO-дата, нормалізовані секції
392
+ * @returns {string} готовий MADR-markdown
393
+ */
394
+ export function assembleMadr({ title, date, sections: s }) {
395
+ // Знімаємо кінцеву крапку контенту, бо шаблон додає свою (інакше "..").
396
+ const noDot = (x) => x.replace(RE_TRAIL_DOT, '')
397
+ const optBlock = s.options.length ? s.options.map((o) => `* ${o}`).join('\n') : 'Інші варіанти не обговорювалися.'
398
+ const cons = [...s.good.map((g) => `* Good, because ${noDot(g)}.`), ...s.bad.map((b) => `* Bad, because ${noDot(b)}.`)]
399
+ const consBlock = cons.length ? cons.join('\n') : 'Підтверджених наслідків не зафіксовано.'
400
+ const outcome = s.chosen
401
+ ? `Chosen option: "${s.chosen}"${s.rationale ? `, because ${noDot(s.rationale)}` : ''}.`
402
+ : s.rationale ? `${noDot(s.rationale)}.` : 'Рішення зафіксовано у чернетці.'
403
+ return [
404
+ `# ${title}`,
405
+ '',
406
+ '**Status:** Accepted',
407
+ `**Date:** ${date}`,
408
+ '',
409
+ '## Context and Problem Statement',
410
+ s.context || 'Контекст не зафіксовано у чернетці.',
411
+ '',
412
+ '## Considered Options',
413
+ optBlock,
414
+ '',
415
+ '## Decision Outcome',
416
+ outcome,
417
+ '',
418
+ '### Consequences',
419
+ consBlock,
420
+ '',
421
+ '## More Information',
422
+ s.more || 'Додаткової інформації не зафіксовано.',
423
+ ''
424
+ ].join('\n')
425
+ }
341
426
 
342
- function genMadr(title, body, captured, cfg) {
343
- const date = (captured ?? '').slice(0, 10)
344
- const user = `Чернетка "${title}" (captured: ${captured ?? 'невідомо'}):\n\n${body}\n\nПоверни чистий MADR. Date = ${date || 'візьми з captured'}.`
427
+ export function genMadr(title, body, captured, cfg, file = '') {
428
+ const date = madrDate(captured, file)
429
+ const slug = slugify(title)
430
+ const user = `Чернетка "${title}":\n\n${body.slice(0, 4000)}\n\nВитягни зміст рішення у JSON.`
345
431
  const parse = (raw) => {
346
- const content = stripFence(raw)
432
+ const sections = normalizeSections(extractJson(raw))
433
+ if (!sections.context && !sections.chosen && !sections.rationale) throw new Error('empty extraction (no context/decision)')
434
+ const content = assembleMadr({ title, date, sections })
347
435
  const v = validateMadr(content)
348
436
  if (!v.ok) throw new Error(`MADR invalid: ${v.errors.join('; ')}`)
349
437
  return content
350
438
  }
351
439
  try {
352
- const content = callWithCascade([{ role: 'system', content: GEN_SYS }, { role: 'user', content: user }], parse, { label: 'gen', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 3, maxTokens: 4096 })
353
- return { content, slug: slugify(title), valid: true }
440
+ const content = callWithCascade([{ role: 'system', content: GEN_SYS }, { role: 'user', content: user }], parse, { label: 'gen', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 3, maxTokens: 2048 })
441
+ return { content, slug, valid: true }
354
442
  } catch (error) {
355
443
  cfg.stats.madrInvalid++
356
- return { content: null, slug: slugify(title), valid: false, error: error.message }
444
+ return { content: null, slug, valid: false, error: error.message }
357
445
  }
358
446
  }
359
447
 
360
448
  // ─────────────────────────── Stage 3: gen-merge (LLM) ──────────────────────────
361
449
 
362
- const MERGE_SYS = `Ти готуєш короткий блок-доповнення до існуючого ADR. Поверни ЛИШЕ markdown-блок (без code-fence), що починається рядком "## Update <YYYY-MM-DD>", і містить ЛИШЕ новий зміст, якого ще нема в цільовому ADR (уточнення/виправлення/продовження). Стисло. Без передмови.`
450
+ // Каркас merge-блоку («## Update <date>») теж JS-власність. Модель пише ЛИШЕ
451
+ // новий зміст-прозу; заголовок із детермінованою датою додає genMerge.
452
+ const MERGE_SYS = `Ти готуєш короткий додаток до існуючого ADR. Напиши ЛИШЕ новий зміст (проза/bullets), якого ще НЕМА в цільовому ADR — уточнення/виправлення/продовження. Стисло, українською, без заголовків, без code-fence, без передмови.`
363
453
 
364
- function genMerge(title, body, captured, targetTitle, cfg) {
365
- const date = (captured ?? '').slice(0, 10)
366
- const user = `Цільовий ADR: "${targetTitle}".\nЧернетка-доповнення "${title}" (${date}):\n${body.slice(0, 2500)}\n\nДай блок "## Update ${date}" з НОВИМ змістом.`
454
+ function genMerge(title, body, captured, targetTitle, cfg, file = '') {
455
+ const date = madrDate(captured, file)
456
+ const user = `Цільовий ADR: "${targetTitle}".\nЧернетка-доповнення "${title}" (${date}):\n${body.slice(0, 2500)}\n\nЛише новий зміст, без заголовка.`
457
+ const head = `## Update ${date}`
367
458
  const parse = (raw) => {
368
459
  const t = stripFence(raw)
369
- if (!RE_UPDATE_HEAD.test(t)) throw new Error('missing ## Update heading')
370
- return t
460
+ // Захист від моделі, що все одно вписала свій заголовок: знімаємо його, щоб
461
+ // не подвоїти. Канонічний head додаємо детерміновано нижче.
462
+ const cleaned = RE_UPDATE_HEAD.test(t) ? t.replace(RE_UPDATE_HEAD_LINE, '').trim() : t
463
+ if (!cleaned) throw new Error('empty merge additions')
464
+ return `${head}\n\n${cleaned}`
371
465
  }
372
466
  try {
373
467
  return callWithCascade([{ role: 'system', content: MERGE_SYS }, { role: 'user', content: user }], parse, { label: 'merge', allowCloud: cfg.allowCloud, stats: cfg.stats, attempts: 2, maxTokens: 1500 })
374
468
  } catch {
375
- return `## Update ${date}\n\n(доповнення з чернетки "${title}")`
469
+ return `${head}\n\n(доповнення з чернетки "${title}")`
376
470
  }
377
471
  }
378
472
 
@@ -493,7 +587,7 @@ export function normalizePipeline(drafts, cleanList, opts = {}) {
493
587
  const slugByIdx = Array.from({ length: drafts.length }).fill(null)
494
588
  for (let i = 0; i < drafts.length; i++) {
495
589
  if (decision[i].op !== 'rewrite') continue
496
- const g = genMadr(titles[i], drafts[i].body, captured[i], cfg)
590
+ const g = genMadr(titles[i], drafts[i].body, captured[i], cfg, drafts[i].file)
497
591
  slugByIdx[i] = g.slug
498
592
  if (g.valid) {
499
593
  operations.push({ op: 'rewrite', file: drafts[i].file, slug: g.slug, content: g.content })
@@ -509,11 +603,11 @@ export function normalizePipeline(drafts, cleanList, opts = {}) {
509
603
  if (d.op === 'merge-anchor') {
510
604
  const slug = slugByIdx[d.anchorIdx]
511
605
  if (!slug) { log(`merge-anchor ${drafts[i].file}: anchor gen failed → skip`); continue }
512
- const add = genMerge(titles[i], drafts[i].body, captured[i], titles[d.anchorIdx], cfg)
606
+ const add = genMerge(titles[i], drafts[i].body, captured[i], titles[d.anchorIdx], cfg, drafts[i].file)
513
607
  operations.push({ op: 'merge-into', file: drafts[i].file, target: `${slug}.md`, additions: add })
514
608
  } else if (d.op === 'merge-existing') {
515
609
  const cTitle = stripAdrName(d.target)
516
- const add = genMerge(titles[i], drafts[i].body, captured[i], cTitle, cfg)
610
+ const add = genMerge(titles[i], drafts[i].body, captured[i], cTitle, cfg, drafts[i].file)
517
611
  operations.push({ op: 'merge-into', file: drafts[i].file, target: d.target, additions: add })
518
612
  } else if (d.op === 'delete') {
519
613
  operations.push({ op: 'delete', file: drafts[i].file, reason: d.reason })
@@ -1,14 +1,12 @@
1
1
  ---
2
+ type: JS Module
3
+ title: assert-project-root.mjs
4
+ resource: npm/scripts/lib/assert-project-root.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/assert-project-root.mjs
4
6
  crc: adb87c16
5
7
  score: 100
6
8
  ---
7
9
 
8
- # assert-project-root.mjs
9
-
10
- ## Огляд
11
-
12
10
  Файл перевіряє розташування поточного каталогу відносно кореня git-репозиторію. Функції надають доступ до шляху кореня репозиторію та перевірку, чи знаходиться поточний каталог саме в цьому корені. Код спирається на конфіги, визначені у `.n-cursor.json`.
13
11
 
14
12
  ## Поведінка
@@ -1,14 +1,12 @@
1
1
  ---
2
+ type: JS Module
3
+ title: changed-files.mjs
4
+ resource: npm/scripts/lib/changed-files.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/changed-files.mjs
4
6
  crc: 8148d84e
5
7
  score: 100
6
8
  ---
7
9
 
8
- # changed-files.mjs
9
-
10
- ## Огляд
11
-
12
10
  Файл збирає змінені та незакомічені файли з робочого дерева. Визначає базовий комміт для перевірок у межах зміненого діапазону. Збирає змінені та незакомічені файли відносно базового комміту.
13
11
 
14
12
  ## Поведінка
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: check-mdc-template-refs.mjs
4
+ resource: npm/scripts/lib/check-mdc-template-refs.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/check-mdc-template-refs.mjs
4
6
  crc: 17b81322
5
7
  ---
6
8
 
7
- # check-mdc-template-refs.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `check-mdc-template-refs.mjs` — це невелика утиліта, призначена для перевірки цілісності посилань між файлом правила `<id>.mdc` та шаблонами, що лежать у підкаталогах `template/` цього самого правила. Він обходить структуру каталогів правила (`fix/<concern>/template/`, `policy/<concern>/template/`), збирає всі знайдені файли й порівнює їхні відносні шляхи з вмістом основного файлу правила `<id>.mdc`. Результатом є перелік шаблонних файлів, на які у `.mdc` немає жодного markdown-посилання, тобто «осиротілі» (orphaned) шаблони.
12
10
 
13
11
  Типовий контекст застосування: модуль використовується в утилітах перевірки/лінтингу правил репозиторію (`npm/rules/<id>/`), де `.mdc`-файл описує правило людською мовою й має посилатися на свої шаблони. Якщо шаблон існує, але не згаданий у `.mdc`, цей модуль повідомить про нього, щоб супровідник правила або додав посилання, або видалив зайвий шаблон.
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: check-reporter.mjs
4
+ resource: npm/scripts/lib/check-reporter.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/check-reporter.mjs
4
6
  crc: b76ed480
5
7
  ---
6
8
 
7
- # check-reporter.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `check-reporter.mjs` — це невелика спільна (shared) бібліотека-фабрика для check-скриптів (`check-*.mjs`) і для `lint-docker`. Вона надає уніфікований спосіб репортити результати перевірок: успіхи (`pass`) та помилки (`fail`), а також акумулювати фінальний код виходу процесу (`exit code`).
12
10
 
13
11
  Основна ідея: викликаючи фабрику `createCheckReporter()`, споживач отримує об’єкт з трьома методами — `pass`, `fail` і `getExitCode`. Будь-який виклик `fail` переводить внутрішній лічильник у стан помилки (`exitCode = 1`), і подальший `getExitCode()` повертатиме `1`. Якщо `fail` жодного разу не викликали — `getExitCode()` поверне `0`.
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: diff-added-lines.mjs
4
+ resource: npm/scripts/lib/diff-added-lines.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/diff-added-lines.mjs
4
6
  crc: 161edaca
5
7
  ---
6
8
 
7
- # diff-added-lines.mjs
8
-
9
- ## Огляд
10
-
11
9
  Файл визначає, чи є рядок коду новим (introduced) або вже існував у проєкті. Він використовується для класифікації результатів аналізу коду (lint-findings) на основі їхнього розташування відносно версії проєкту. Це допомагає розробникам розуміти, які зміни коду потребують негайної уваги.
12
10
 
13
11
  ## Поведінка
@@ -1,14 +1,12 @@
1
1
  ---
2
+ type: JS Module
3
+ title: discover-check-rules-from-cursor.mjs
4
+ resource: npm/scripts/lib/discover-check-rules-from-cursor.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/discover-check-rules-from-cursor.mjs
4
6
  crc: 9a6916e1
5
7
  score: 100
6
8
  ---
7
9
 
8
- # discover-check-rules-from-cursor.mjs
9
-
10
- ## Огляд
11
-
12
10
  Файл зчитує базові імена файлів `.mdc` у директорії `.cursor/rules/` та генерує список ідентифікаторів правил для `npx @nitra/cursor fix`, використовуючи перевірку через JS-концерн або policy з `target.json`.
13
11
 
14
12
  ## Поведінка
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: discover-checkable-rules.mjs
4
+ resource: npm/scripts/lib/discover-checkable-rules.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/discover-checkable-rules.mjs
4
6
  crc: 39016d17
5
7
  ---
6
8
 
7
- # discover-checkable-rules.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `discover-checkable-rules.mjs` — це discovery-шар для CLI-команди `fix`. Його завдання — швидко просканувати файлову структуру каталогу `npm/rules/` та виявити «прогонні» правила, тобто правила, у яких є щонайменше один JS-концерн або policy-концерн. Правила, які складаються тільки з декларативних артефактів (`.mdc` + `auto.md`) без жодного прогонного концерну, відсіюються.
12
10
 
13
11
  Виокремлюються два типи концернів:
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: ensure-tool.mjs
4
+ resource: npm/scripts/lib/ensure-tool.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/ensure-tool.mjs
4
6
  crc: 230254b3
5
7
  ---
6
8
 
7
- # ensure-tool.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `ensure-tool.mjs` — єдина точка резолву зовнішніх CLI-залежностей пакета `@nitra/cursor`. Він гарантує, що потрібний бінарник (`hk`, `conftest`, `shellcheck`, `actionlint`, `dotenv-linter`, `opa`, `regal`, `hadolint`, `kubeconform`, `kubescape`) доступний у системі, виконуючи послідовний пошук:
12
10
 
13
11
  1. У системному `PATH` (через `resolveCmd`).
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: generated-markdown.mjs
4
+ resource: npm/scripts/lib/generated-markdown.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/generated-markdown.mjs
4
6
  crc: 14b85a57
5
7
  ---
6
8
 
7
- # generated-markdown.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `generated-markdown.mjs` містить набір чистих утиліт для генерації згенерованих маркдаун-файлів (зокрема `AGENTS.md` та `CLAUDE.md`) у межах CLI `n-cursor`. Він виконує дві основні задачі:
12
10
 
13
11
  1. Розгортає Mustache-подібні блоки `{{#section}}…{{/section}}` із простою підстановкою одного поля `{{prop}}` для кожного елемента переданого масиву.
@@ -1,13 +1,11 @@
1
1
  ---
2
+ type: JS Module
3
+ title: gha-workflow.mjs
4
+ resource: npm/scripts/lib/gha-workflow.mjs
2
5
  docgen:
3
- source: npm/scripts/lib/gha-workflow.mjs
4
6
  crc: 266986bf
5
7
  ---
6
8
 
7
- # gha-workflow.mjs
8
-
9
- ## Огляд
10
-
11
9
  Модуль `gha-workflow.mjs` — це набір допоміжних чистих функцій для **структурного аналізу GitHub Actions workflow-файлів** (`.yml`) після їх розбору як YAML.
12
10
 
13
11
  Призначення модуля — замінити крихкий пошук підрядків у сирому тексті workflow-файла на **типобезпечну** перевірку значень `uses:` та `run:` у кроках (`steps`) робіт (`jobs`). Модуль використовується сценаріями перевірки (checkers) проєктних правил:
@@ -0,0 +1,44 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/scripts/lib
4
+ resource: npm/scripts/lib/
5
+ ---
6
+
7
+ # npm/scripts/lib
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 |
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-rule-cli.mjs](run-rule-cli.md) | JS Module |
35
+ | [run-rule.mjs](run-rule.md) | JS Module |
36
+ | [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
37
+ | [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
38
+ | [skill-meta.mjs](skill-meta.md) | JS Module |
39
+ | [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
40
+ | [template.mjs](template.md) | JS Module |
41
+ | [timing-summary.mjs](timing-summary.md) | JS Module |
42
+ | [workspaces.mjs](workspaces.md) | JS Module |
43
+ | [worktree-notice.mjs](worktree-notice.md) | JS Module |
44
+ | [worktree.mjs](worktree.md) | JS Module |