@nitra/cursor 5.1.0 → 5.2.1

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 (214) hide show
  1. package/.claude-template/settings.template.json +22 -0
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +15 -9
  3. package/CHANGELOG.md +18 -1
  4. package/bin/n-cursor.js +73 -16
  5. package/docs/stryker.config.md +6 -0
  6. package/docs/vitest.config.md +6 -0
  7. package/lib/docs/llm.md +29 -0
  8. package/lib/docs/models.md +24 -17
  9. package/lib/docs/omlx.md +32 -0
  10. package/lib/llm.mjs +137 -0
  11. package/lib/omlx.mjs +49 -4
  12. package/package.json +1 -1
  13. package/rules/abie/docs/fix.md +6 -0
  14. package/rules/abie/js/docs/applies.md +6 -0
  15. package/rules/abie/js/docs/env_dns.md +25 -22
  16. package/rules/abie/js/docs/firebase_hosting.md +6 -0
  17. package/rules/abie/js/docs/hc_pairing.md +21 -25
  18. package/rules/abie/js/docs/ua_http_route.md +27 -19
  19. package/rules/abie/js/docs/ua_node_selector.md +24 -19
  20. package/rules/abie/lib/docs/enabled.md +13 -7
  21. package/rules/abie/lib/docs/env-dns.md +9 -3
  22. package/rules/abie/lib/docs/hc-yaml.md +6 -0
  23. package/rules/abie/lib/docs/http-route.md +6 -0
  24. package/rules/abie/lib/docs/k8s-tree.md +6 -0
  25. package/rules/abie/lib/docs/kustomization-patches.md +6 -0
  26. package/rules/abie/lib/docs/overlay-paths.md +6 -0
  27. package/rules/abie/lib/docs/yaml.md +6 -0
  28. package/rules/adr/docs/fix.md +6 -0
  29. package/rules/adr/js/docs/hooks.md +29 -244
  30. package/rules/bun/docs/fix.md +6 -0
  31. package/rules/bun/js/docs/layout.md +37 -375
  32. package/rules/capacitor/docs/fix.md +22 -108
  33. package/rules/capacitor/js/docs/platforms.md +62 -268
  34. package/rules/changelog/docs/fix.md +6 -0
  35. package/rules/changelog/js/docs/consistency.md +36 -383
  36. package/rules/changelog/lib/docs/package-manifest.md +6 -0
  37. package/rules/ci4/docs/fix.md +23 -165
  38. package/rules/ci4/js/docs/marksman_config.md +9 -1
  39. package/rules/docker/docs/fix.md +6 -0
  40. package/rules/docker/js/docs/lint.md +55 -239
  41. package/rules/docker/lib/docs/docker-hadolint.md +6 -0
  42. package/rules/docker/lib/docs/docker-mirror.md +6 -0
  43. package/rules/docker/lib/docs/docker-native-addon.md +6 -0
  44. package/rules/docker/lib/docs/docker-nginx-user.md +6 -0
  45. package/rules/docker/lint/docs/lint.md +9 -1
  46. package/rules/efes/docs/fix.md +6 -0
  47. package/rules/feedback/docs/fix.md +21 -131
  48. package/rules/ga/docs/fix.md +14 -12
  49. package/rules/ga/js/docs/lint.md +12 -9
  50. package/rules/ga/js/docs/workflows.md +20 -19
  51. package/rules/ga/lint/docs/lint.md +6 -0
  52. package/rules/graphql/docs/fix.md +6 -0
  53. package/rules/graphql/js/docs/tooling.md +18 -253
  54. package/rules/graphql/lib/docs/graphql-gql-scan.md +6 -0
  55. package/rules/hasura/docs/fix.md +18 -111
  56. package/rules/image-avif/docs/fix.md +6 -0
  57. package/rules/image-avif/js/docs/avif_generation.md +6 -0
  58. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +9 -3
  59. package/rules/js-bun-redis/lib/docs/redis-imports.md +6 -0
  60. package/rules/js-lint/js/docs/utils_imports.md +6 -0
  61. package/rules/js-lint-ci/docs/fix.md +7 -1
  62. package/rules/js-mssql/docs/fix.md +6 -0
  63. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +6 -0
  64. package/rules/js-run/docs/fix.md +6 -0
  65. package/rules/js-run/lib/docs/bunyan-imports.md +6 -0
  66. package/rules/js-run/lib/docs/check-env-scan.md +6 -0
  67. package/rules/js-run/lib/docs/conn-file-rules.md +6 -0
  68. package/rules/js-run/lib/docs/conn-imports-scan.md +6 -0
  69. package/rules/js-run/lib/docs/promise-settimeout-scan.md +6 -0
  70. package/rules/js-run/lib/docs/temporal-scan.md +6 -0
  71. package/rules/k8s/docs/fix.md +6 -0
  72. package/rules/k8s/lint/docs/lint.md +6 -0
  73. package/rules/nginx-default-tpl/docs/fix.md +6 -0
  74. package/rules/npm-module/js/docs/header_doc_pointer.md +7 -0
  75. package/rules/npm-module/js/header_doc_pointer.mjs +2 -8
  76. package/rules/php/docs/fix.md +6 -0
  77. package/rules/php/lint/docs/lint.md +6 -0
  78. package/rules/python/docs/fix.md +6 -0
  79. package/rules/python/lint/docs/lint.md +6 -0
  80. package/rules/rego/lint/docs/lint.md +6 -0
  81. package/rules/release/docs/change.md +6 -0
  82. package/rules/release/docs/fix.md +6 -0
  83. package/rules/release/docs/release.md +6 -0
  84. package/rules/release/lib/docs/aggregate.md +6 -0
  85. package/rules/release/lib/docs/change-file.md +6 -0
  86. package/rules/release/lib/docs/fallback.md +6 -0
  87. package/rules/rust/lib/docs/has-cargo-toml.md +6 -0
  88. package/rules/security/docs/fix.md +7 -1
  89. package/rules/security/js/docs/lint.md +6 -0
  90. package/rules/style-lint/docs/fix.md +6 -0
  91. package/rules/tauri/docs/fix.md +6 -0
  92. package/rules/test/docs/fix.md +6 -0
  93. package/rules/test/js/data/stryker_config/docs/stryker-vue-macros-ignorer.md +6 -0
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +6 -0
  95. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +6 -0
  96. package/rules/test/js/data/vitest_config/docs/vitest.config.baseline.md +6 -0
  97. package/rules/text/docs/fix.md +6 -0
  98. package/rules/text/lint/docs/lint.md +6 -0
  99. package/rules/text/lint/docs/run-dotenv-linter.md +6 -0
  100. package/rules/text/lint/docs/run-shellcheck.md +6 -0
  101. package/rules/text/lint/docs/run-v8r.md +6 -0
  102. package/rules/vue/lib/docs/vue-forbidden-imports.md +6 -0
  103. package/scripts/coverage-classify/cache.mjs +1 -1
  104. package/scripts/coverage-classify/docs/apply.md +6 -0
  105. package/scripts/coverage-classify/docs/cache.md +6 -0
  106. package/scripts/coverage-classify/docs/prompt.md +6 -0
  107. package/scripts/coverage-classify/docs/verdict-schema.md +6 -0
  108. package/scripts/coverage-classify/prompt.mjs +1 -1
  109. package/scripts/coverage-fix-extract.mjs +1 -1
  110. package/scripts/coverage-fix.mjs +2 -1
  111. package/scripts/docs/auto-skills.md +6 -0
  112. package/scripts/docs/build-agents-commands.md +7 -1
  113. package/scripts/docs/cli-entry.md +6 -0
  114. package/scripts/docs/coverage-fix-extract.md +6 -0
  115. package/scripts/docs/coverage-fix.md +6 -0
  116. package/scripts/docs/ensure-nitra-cursor-dev-dependencies.md +6 -0
  117. package/scripts/docs/lint-cli.md +6 -0
  118. package/scripts/docs/post-tool-use-fix.md +6 -0
  119. package/scripts/docs/rename-yaml-extensions.md +6 -0
  120. package/scripts/docs/skills-cli.md +6 -0
  121. package/scripts/docs/sync-setup-bun-deps-action.md +6 -0
  122. package/scripts/docs/upgrade-nitra-cursor-and-install.md +6 -0
  123. package/scripts/docs/worktree-cli.md +6 -0
  124. package/scripts/lib/docs/assert-project-root.md +6 -0
  125. package/scripts/lib/docs/check-mdc-template-refs.md +6 -0
  126. package/scripts/lib/docs/check-reporter.md +6 -0
  127. package/scripts/lib/docs/diff-added-lines.md +6 -0
  128. package/scripts/lib/docs/discover-check-rules-from-cursor.md +6 -0
  129. package/scripts/lib/docs/discover-checkable-rules.md +6 -0
  130. package/scripts/lib/docs/ensure-tool.md +6 -0
  131. package/scripts/lib/docs/generated-markdown.md +6 -0
  132. package/scripts/lib/docs/gha-workflow.md +6 -0
  133. package/scripts/lib/docs/inline-template-links.md +6 -0
  134. package/scripts/lib/docs/list-rule-ids.md +6 -0
  135. package/scripts/lib/docs/load-cursor-config.md +6 -0
  136. package/scripts/lib/docs/mirror-parity.md +6 -0
  137. package/scripts/lib/docs/read-n-cursor-config-lite.md +6 -0
  138. package/scripts/lib/docs/resolve-target-files.md +6 -0
  139. package/scripts/lib/docs/root-notice.md +6 -0
  140. package/scripts/lib/docs/rule-meta-helpers.md +6 -0
  141. package/scripts/lib/docs/rule-meta.md +6 -0
  142. package/scripts/lib/docs/run-conftest-batch.md +6 -0
  143. package/scripts/lib/docs/run-lint-step.md +6 -0
  144. package/scripts/lib/docs/run-rule-cli.md +6 -0
  145. package/scripts/lib/docs/run-rule.md +6 -0
  146. package/scripts/lib/docs/run-standard-lint.md +6 -0
  147. package/scripts/lib/docs/run-standard-rule.md +6 -0
  148. package/scripts/lib/docs/skill-meta.md +6 -0
  149. package/scripts/lib/docs/template.md +6 -0
  150. package/scripts/lib/docs/timing-summary.md +6 -0
  151. package/scripts/lib/docs/workspaces.md +6 -0
  152. package/scripts/lib/docs/worktree-notice.md +6 -0
  153. package/scripts/lib/docs/worktree.md +6 -0
  154. package/scripts/lib/mirror-parity.mjs +1 -1
  155. package/scripts/lib/root-notice.mjs +1 -1
  156. package/scripts/lib/worktree-notice.mjs +5 -5
  157. package/scripts/lib/worktree.mjs +1 -1
  158. package/scripts/sync-claude-config.mjs +3 -0
  159. package/scripts/utils/docs/ast-scan-utils.md +6 -0
  160. package/scripts/utils/docs/ensure-gitignore-entries.md +6 -0
  161. package/scripts/utils/docs/find-package-json-paths.md +6 -0
  162. package/scripts/utils/docs/lock-cache-dir.md +6 -0
  163. package/scripts/utils/docs/pass.md +6 -0
  164. package/scripts/utils/docs/resolve-cargo-manifest.md +6 -0
  165. package/scripts/utils/docs/resolve-cmd.md +6 -0
  166. package/scripts/utils/docs/resolve-js-root.md +6 -0
  167. package/scripts/utils/docs/test-helpers.md +6 -0
  168. package/scripts/utils/docs/walk-cache.md +6 -0
  169. package/scripts/utils/docs/walkDir.md +6 -0
  170. package/scripts/utils/docs/worktree-fingerprint.md +6 -0
  171. package/scripts/utils/resolve-js-root.mjs +1 -1
  172. package/skills/doc-aggregate/SKILL.md +129 -0
  173. package/skills/doc-aggregate/js/docgen-ignore.mjs +9 -0
  174. package/skills/{docgen → doc-aggregate}/js/docgen-scan.mjs +22 -67
  175. package/skills/doc-aggregate/js/docs/docgen-ignore.md +21 -0
  176. package/skills/doc-files/SKILL.md +100 -0
  177. package/skills/doc-files/js/docgen-crc.mjs +164 -0
  178. package/skills/{docgen → doc-files}/js/docgen-extract-anchors.mjs +48 -13
  179. package/skills/{docgen → doc-files}/js/docgen-extract.mjs +39 -10
  180. package/skills/doc-files/js/docgen-files-batch.mjs +181 -0
  181. package/skills/doc-files/js/docgen-gen.mjs +336 -0
  182. package/skills/{docgen → doc-files}/js/docgen-prompts.mjs +65 -50
  183. package/skills/doc-files/js/docgen-scan.mjs +298 -0
  184. package/skills/doc-files/js/docs/docgen-crc.md +32 -0
  185. package/skills/doc-files/js/docs/docgen-extract-anchors.md +27 -0
  186. package/skills/doc-files/js/docs/docgen-extract.md +29 -0
  187. package/skills/doc-files/js/docs/docgen-files-batch.md +25 -0
  188. package/skills/doc-files/js/docs/docgen-gen.md +30 -0
  189. package/skills/doc-files/js/docs/docgen-prompts.md +32 -0
  190. package/skills/doc-files/js/docs/docgen-scan.md +25 -0
  191. package/skills/doc-files/js/units-js.mjs +139 -0
  192. package/skills/doc-files/js/units.mjs +19 -0
  193. package/skills/doc-files/meta.json +1 -0
  194. package/skills/fix/js/docs/llm-worker.md +6 -0
  195. package/skills/fix/js/docs/orchestrator.md +6 -0
  196. package/skills/fix/js/llm-worker.mjs +3 -3
  197. package/skills/fix/js/orchestrator.mjs +1 -1
  198. package/skills/start-check/js/check.mjs +5 -3
  199. package/skills/start-check/js/docs/check.md +6 -0
  200. package/skills/docgen/SKILL.md +0 -224
  201. package/skills/docgen/bench/etalon/firebase_hosting.md +0 -19
  202. package/skills/docgen/bench/etalon/k8s-tree.md +0 -24
  203. package/skills/docgen/bench/etalon/overlay-paths.md +0 -24
  204. package/skills/docgen/js/docgen-batch-omlx.mjs +0 -82
  205. package/skills/docgen/js/docgen-batch.mjs +0 -95
  206. package/skills/docgen/js/docgen-compare-pi-vs-direct.mjs +0 -95
  207. package/skills/docgen/js/docgen-gen.mjs +0 -306
  208. package/skills/docgen/js/docs/docgen-extract.md +0 -28
  209. package/skills/docgen/js/docs/docgen-gen.md +0 -41
  210. package/skills/docgen/js/docs/docgen-ignore.md +0 -24
  211. package/skills/docgen/js/docs/docgen-prompts.md +0 -24
  212. package/skills/docgen/js/docs/docgen-scan.md +0 -48
  213. /package/skills/{docgen → doc-aggregate}/meta.json +0 -0
  214. /package/skills/{docgen → doc-files}/js/docgen-ignore.mjs +0 -0
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/discover-check-rules-from-cursor.mjs
4
+ crc: 5e312e3e
5
+ ---
6
+
1
7
  # discover-check-rules-from-cursor.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/discover-checkable-rules.mjs
4
+ crc: 39016d17
5
+ ---
6
+
1
7
  # discover-checkable-rules.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/ensure-tool.mjs
4
+ crc: 230254b3
5
+ ---
6
+
1
7
  # ensure-tool.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/generated-markdown.mjs
4
+ crc: 14b85a57
5
+ ---
6
+
1
7
  # generated-markdown.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/gha-workflow.mjs
4
+ crc: 266986bf
5
+ ---
6
+
1
7
  # gha-workflow.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/inline-template-links.mjs
4
+ crc: 7726f0ef
5
+ ---
6
+
1
7
  # inline-template-links.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/list-rule-ids.mjs
4
+ crc: 5ef1ead5
5
+ ---
6
+
1
7
  # list-rule-ids.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/load-cursor-config.mjs
4
+ crc: c86a80f4
5
+ ---
6
+
1
7
  # load-cursor-config.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/mirror-parity.mjs
4
+ crc: 15dc336a
5
+ ---
6
+
1
7
  ## Огляд
2
8
 
3
9
  Модуль `mirror-parity.mjs` забезпечує перевірку парності (parity) між «дзеркальними» файлами правил Cursor у `.cursor/rules/n-<id>.mdc` та їх канонічними джерелами у `npm/rules/<id>/<id>.mdc`. Ідея така: репозиторій містить два представлення одного й того ж правила:
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/read-n-cursor-config-lite.mjs
4
+ crc: a5fb0592
5
+ ---
6
+
1
7
  # read-n-cursor-config-lite.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/resolve-target-files.mjs
4
+ crc: a3b361d9
5
+ ---
6
+
1
7
  # resolve-target-files.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/root-notice.mjs
4
+ crc: 5f3ca2bb
5
+ ---
6
+
1
7
  # root-notice.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/rule-meta-helpers.mjs
4
+ crc: a7e1ae1d
5
+ ---
6
+
1
7
  # rule-meta-helpers.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/rule-meta.mjs
4
+ crc: 4475d5ff
5
+ ---
6
+
1
7
  # rule-meta.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-conftest-batch.mjs
4
+ crc: 5ec640a0
5
+ ---
6
+
1
7
  # run-conftest-batch.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-lint-step.mjs
4
+ crc: 5932fa98
5
+ ---
6
+
1
7
  # run-lint-step.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-rule-cli.mjs
4
+ crc: ab1715f2
5
+ ---
6
+
1
7
  # run-rule-cli.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-rule.mjs
4
+ crc: 94f3ac44
5
+ ---
6
+
1
7
  # run-rule.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-standard-lint.mjs
4
+ crc: e7e3f0ae
5
+ ---
6
+
1
7
  # run-standard-lint.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/run-standard-rule.mjs
4
+ crc: aeb5299a
5
+ ---
6
+
1
7
  # run-standard-rule.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/skill-meta.mjs
4
+ crc: 0c638d18
5
+ ---
6
+
1
7
  # skill-meta.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/template.mjs
4
+ crc: 3bc0617f
5
+ ---
6
+
1
7
  # template.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/timing-summary.mjs
4
+ crc: f21a9b91
5
+ ---
6
+
1
7
  # timing-summary.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/workspaces.mjs
4
+ crc: 995c1633
5
+ ---
6
+
1
7
  # workspaces.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/worktree-notice.mjs
4
+ crc: dc4fba22
5
+ ---
6
+
1
7
  # worktree-notice.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/worktree.mjs
4
+ crc: ffcdbca5
5
+ ---
6
+
1
7
  # worktree.mjs
2
8
 
3
9
  ## Огляд
@@ -56,5 +56,5 @@ export async function findMirrorDrift(repoRoot) {
56
56
  const expected = await expectedMirrorContent(m.canonicalPath)
57
57
  if (readFileSync(m.mirrorPath, 'utf8') !== expected) drift.push(m.id)
58
58
  }
59
- return drift.sort()
59
+ return drift.toSorted()
60
60
  }
@@ -19,7 +19,7 @@ export const ROOT_START = '<!-- n-cursor:root:start -->'
19
19
  export const ROOT_END = '<!-- n-cursor:root:end -->'
20
20
 
21
21
  /** Наявний блок разом із сусідніми порожніми рядками (для чистого видалення). */
22
- const BLOCK_RE = /\n*<!-- n-cursor:root:start -->[\s\S]*?<!-- n-cursor:root:end -->\n*/u
22
+ const BLOCK_RE = /\n{0,8}<!-- n-cursor:root:start -->[\s\S]*?<!-- n-cursor:root:end -->\n{0,8}/u
23
23
 
24
24
  /** Закриття YAML-frontmatter на початку файла. */
25
25
  const FRONTMATTER_RE = /^(---\n[\s\S]*?\n---\n)/u
@@ -25,22 +25,22 @@ export const WORKTREE_END = '<!-- n-cursor:worktree:end -->'
25
25
  const FALLBACK_SUFFIX = 'task'
26
26
 
27
27
  /** Наявний блок разом із сусідніми порожніми рядками (для чистого видалення). */
28
- const BLOCK_RE = /\n*<!-- n-cursor:worktree:start -->[\s\S]*?<!-- n-cursor:worktree:end -->\n*/u
28
+ const BLOCK_RE = /\n{0,8}<!-- n-cursor:worktree:start -->[\s\S]*?<!-- n-cursor:worktree:end -->\n{0,8}/u
29
29
 
30
30
  /** Закриття YAML-frontmatter на початку файла. */
31
31
  const FRONTMATTER_RE = /^(---\n[\s\S]*?\n---\n)/u
32
32
 
33
33
  /** Значення `name` з YAML-frontmatter. */
34
- const NAME_RE = /^name:\s*["']?([^"'\n]+)["']?\s*$/mu
34
+ const NAME_RE = /^name:[ \t]{0,8}["']?([^"'\n]+?)["']?[ \t]{0,8}$/mu
35
35
 
36
36
  /** Перший H1 як fallback, якщо frontmatter не містить `name`. */
37
- const H1_RE = /^#\s+(.+)$/mu
37
+ const H1_RE = /^#[ \t]{1,8}(.+)$/mu
38
38
 
39
39
  const N_PREFIX_RE = /^n-/u
40
40
  const COMBINING_DIACRITICS_RE = /[̀-ͯ]/gu
41
41
  const NON_ALPHANUM_RE = /[^a-z0-9]+/gu
42
- const TRAILING_DASHES_RE = /^-+|-+$/gu
43
- const TRAILING_DASH_RE = /-+$/u
42
+ const TRAILING_DASHES_RE = /^-{1,80}|-{1,80}$/gu
43
+ const TRAILING_DASH_RE = /-{1,80}$/u
44
44
  const LEADING_NEWLINES_RE = /^\n+/u
45
45
 
46
46
  const CYRILLIC_TRANSLIT = new Map(
@@ -28,7 +28,7 @@ export function sanitizeBranch(branch) {
28
28
  const sanitized = branch
29
29
  .trim()
30
30
  .replace(UNSAFE_PATH_CHARS_RE, '-')
31
- .replaceAll(/^-+|-+$/gu, '')
31
+ .replaceAll(/^-{1,80}|-{1,80}$/gu, '')
32
32
  if (sanitized === '') {
33
33
  throw new Error(`worktree: імʼя гілки "${branch}" не містить допустимих символів`)
34
34
  }
@@ -32,6 +32,8 @@ import { join } from 'node:path'
32
32
 
33
33
  /** Маркер PostToolUse fix-hook'а (`npx --no \@nitra/cursor post-tool-use-fix`). */
34
34
  export const MANAGED_HOOK_COMMAND_MARKER = '@nitra/cursor post-tool-use-fix'
35
+ /** Маркер doc-files staleness-hook'ів (PostToolUse `--hook` і Stop-гейт `--git`). */
36
+ export const DOC_FILES_HOOK_COMMAND_MARKER = '@nitra/cursor doc-files check'
35
37
  /** Legacy-маркер старого Stop-hook'а — лишаємо для cleanup-у при оновленні існуючих інсталяцій. */
36
38
  export const LEGACY_STOP_HOOK_COMMAND_MARKER = '@nitra/cursor stop-hook'
37
39
  /** Маркер ADR Stop-hook'а — підрядок шляху до bash-скрипта capture-decisions. */
@@ -48,6 +50,7 @@ export const CURSOR_ADR_NORMALIZE_HOOK_COMMAND_MARKER = '.claude/hooks/normalize
48
50
  */
49
51
  export const MANAGED_HOOK_COMMAND_MARKERS = Object.freeze([
50
52
  MANAGED_HOOK_COMMAND_MARKER,
53
+ DOC_FILES_HOOK_COMMAND_MARKER,
51
54
  LEGACY_STOP_HOOK_COMMAND_MARKER,
52
55
  ADR_HOOK_COMMAND_MARKER,
53
56
  ADR_NORMALIZE_HOOK_COMMAND_MARKER
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/ast-scan-utils.mjs
4
+ crc: 0f9b4a21
5
+ ---
6
+
1
7
  # ast-scan-utils.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/ensure-gitignore-entries.mjs
4
+ crc: 35e65c1b
5
+ ---
6
+
1
7
  # ensure-gitignore-entries.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/find-package-json-paths.mjs
4
+ crc: 06c208de
5
+ ---
6
+
1
7
  # find-package-json-paths.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/lock-cache-dir.mjs
4
+ crc: 3b63d4b1
5
+ ---
6
+
1
7
  # lock-cache-dir.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/pass.mjs
4
+ crc: 0f69dfba
5
+ ---
6
+
1
7
  # pass.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/resolve-cargo-manifest.mjs
4
+ crc: af1efa42
5
+ ---
6
+
1
7
  # resolve-cargo-manifest.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/resolve-cmd.mjs
4
+ crc: 31c290fc
5
+ ---
6
+
1
7
  # resolve-cmd.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/resolve-js-root.mjs
4
+ crc: 2c2b9f11
5
+ ---
6
+
1
7
  # resolve-js-root.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/test-helpers.mjs
4
+ crc: 0e4357fe
5
+ ---
6
+
1
7
  # test-helpers.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/walk-cache.mjs
4
+ crc: 82798fa2
5
+ ---
6
+
1
7
  # walk-cache.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/walkDir.mjs
4
+ crc: 5e5fec27
5
+ ---
6
+
1
7
  # walkDir.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/worktree-fingerprint.mjs
4
+ crc: df297382
5
+ ---
6
+
1
7
  # worktree-fingerprint.mjs
2
8
 
3
9
  ## Огляд
@@ -27,7 +27,7 @@ async function expandWorkspacePattern(cwd, pattern) {
27
27
  const wsRel = rel.replace(PACKAGE_JSON_SUFFIX_RE, '')
28
28
  results.push(join(cwd, wsRel))
29
29
  }
30
- return results.sort()
30
+ return results.toSorted()
31
31
  }
32
32
 
33
33
  /**
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: doc-aggregate
3
+ description: >-
4
+ Агрегуюча документація за запитом: module-summary на кожен логічний модуль (docs/ARCHITECTURE.md) і доменні доки бізнес-процесів у кореневій docs/ — синтез поверх готових файлових док (doc-files), батч-диспатч субагентів у worktree
5
+ ---
6
+
7
+ # doc-aggregate — агрегуюча документація (за запитом)
8
+
9
+ ## Мета
10
+
11
+ Синтезувати документацію вищого рівня поверх **готових файлових док** (їх підтримує
12
+ обовʼязковий скіл `doc-files`). Два рівні, строго послідовно:
13
+
14
+ 1. **Tier 2 — module-summary**: `<module_root>/docs/ARCHITECTURE.md`, субагент на модуль.
15
+ 2. **Tier 3 — доменні доки**: `docs/<домен>.md` у кореневій `docs/`, субагент-синтезатор
16
+ виділяє бізнес-домени й пише файл на кожен домен.
17
+
18
+ Агрегат ніколи не випереджає джерело: Tier 3 — лише після завершення всього Tier 2.
19
+ Цей скіл викликається **за запитом** (не обовʼязковий крок задачі).
20
+
21
+ ## ⚠️ Паралелізм
22
+
23
+ Tier 2 — батчами **по 5** субагентів одночасно (кожен пише свій файл, гонок немає).
24
+ Tier 3 — **один** субагент-синтезатор після завершення всього Tier 2.
25
+
26
+ ## Передумова
27
+
28
+ - Доступний `npx @nitra/cursor`.
29
+ - Файлові доки мають бути свіжі. Перевір і за потреби онови перед агрегацією:
30
+
31
+ ```bash
32
+ npx @nitra/cursor doc-files check --git
33
+ ```
34
+
35
+ Якщо багато застарілих — спершу прожени `npx @nitra/cursor doc-files gen`.
36
+
37
+ ## Крок 1: Tier 2 — module-summary
38
+
39
+ Зібрати список модулів:
40
+
41
+ ```bash
42
+ npx @nitra/cursor doc-aggregate modules
43
+ ```
44
+
45
+ Команда друкує JSON-масив (усі шляхи абсолютні):
46
+
47
+ ```json
48
+ [
49
+ {
50
+ "moduleRoot": "/abs/npm/rules/adr",
51
+ "relRoot": "npm/rules/adr",
52
+ "slug": "npm-rules-adr",
53
+ "docPath": "/abs/npm/rules/adr/docs/ARCHITECTURE.md",
54
+ "members": ["npm/rules/adr/index.mjs"],
55
+ "exists": false
56
+ }
57
+ ]
58
+ ```
59
+
60
+ module-summary **завжди регенерується** (це агрегат — поле `exists` ігноруй). Розбий модулі
61
+ на батчі по 5 і диспатч субагентів. Промпт кожного (підстав `relRoot`, `docPath`, `members`):
62
+
63
+ ```
64
+ Напиши module-summary для одного логічного модуля.
65
+
66
+ МОДУЛЬ: <relRoot>
67
+ ЗАПИСАТИ В: <docPath>
68
+ ФАЙЛИ МОДУЛЯ (members): <members>
69
+
70
+ Кроки:
71
+ 1. Прочитай файлові доки членів модуля. <member> — sourcePath відносно кореня проєкту
72
+ (= поточний CWD); його файлова дока — <CWD>/<dir>/docs/<stem>.md. За потреби зазирни
73
+ в самі файли.
74
+ 2. Створи теку для <docPath>, якщо її немає.
75
+ 3. Запиши markdown у <docPath> за тими ж правилами стилю, що й файлова дока
76
+ (українська, чистий Markdown, контекстна незалежність, без HTML).
77
+
78
+ Секції module-summary:
79
+ ## Огляд модуля — призначення модуля <relRoot>, його роль у проєкті.
80
+ ## Ключові файли — список із кліковими посиланнями (відносними до розташування цього
81
+ ARCHITECTURE.md) на члени модуля та їхні файлові доки.
82
+ ## Публічний API — що модуль експортує назовні.
83
+ ## Внутрішній потік — як компоненти модуля взаємодіють.
84
+ ## Підмодулі — вкладені модулі, якщо є.
85
+
86
+ Поверни лише підтвердження, що файл <docPath> записано.
87
+ ```
88
+
89
+ ## Крок 2: Tier 3 — доменні доки
90
+
91
+ Після завершення **всіх** module-summary диспатч **одного** субагента-синтезатора.
92
+ У промпт підстав конкретний перелік шляхів module-summary (`<module_root>/docs/ARCHITECTURE.md`
93
+ кожного модуля з виводу `doc-aggregate modules`), а не інструкцію їх шукати. Промпт:
94
+
95
+ ```
96
+ Синтезуй доменну документацію бізнес-процесів проєкту.
97
+
98
+ ДЖЕРЕЛА (module-summary, читай усі): <перелік шляхів ARCHITECTURE.md, підставлений вище>
99
+
100
+ Кроки:
101
+ 1. Прочитай усі module-summary.
102
+ 2. Виділи бізнес-домени та процеси (можуть перетинати межі модулів). Доменів може бути багато.
103
+ 3. Для КОЖНОГО домену запиши окремий файл docs/<домен>.md у кореневій docs/:
104
+ - назва файлу — короткий kebab-slug домену;
105
+ - не перезаписуй файлові доки кореневих файлів у docs/ (напр. app.md, eslint.config.md):
106
+ якщо слаґ домену збігається з іменем такого файлу — додай суфікс -domain
107
+ (напр. app-domain.md). Інакше пиши docs/<домен>.md як є;
108
+ - опиши бізнес-процес домену з кліковими відносними посиланнями на module-summary, конкретні файли й директорії.
109
+
110
+ Правила стилю — ті ж (українська, чистий Markdown, контекстна незалежність, без HTML).
111
+
112
+ Поверни перелік створених файлів docs/<домен>.md.
113
+ ```
114
+
115
+ ## Крок 3: Підсумок
116
+
117
+ ```
118
+ ✓ doc-aggregate завершено.
119
+ Tier 2 (модулі): <M> module-summary.
120
+ Tier 3 (домени): <D> доменних доків у docs/.
121
+ ```
122
+
123
+ Перелічи файли з помилками (субагент впав або не записав `docPath`), якщо такі є.
124
+ Помилка одного модуля не зупиняє решту.
125
+
126
+ ## Нотатки
127
+
128
+ - Не комітити автоматично — користувач вирішує, коли комітити згенеровану доку.
129
+ - Файлові доки (Tier 1) — окремий обовʼязковий скіл `doc-files`; цей скіл їх не пише, лише агрегує.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Re-export спільного списку ignore-глобів зі скіла doc-files.
3
+ *
4
+ * Канонічне джерело — `npm/skills/doc-files/js/docgen-ignore.mjs`: обидва скіли
5
+ * (file-level доки і агрегати) мусять бачити однакове дерево кодових файлів,
6
+ * інакше агрегат посилатиметься на файли без док (або навпаки). Залежність
7
+ * спрямована doc-aggregate → doc-files за ADR про розбиття docgen.
8
+ */
9
+ export * from '../../doc-files/js/docgen-ignore.mjs'