@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,230 +0,0 @@
1
- /**
2
- * CLI-оркестратор worktree-tool `n-cursor worktree` (виконавець конвенції `.worktrees/`).
3
- *
4
- * Підкоманди:
5
- * add <branch> "<опис>" — git worktree add .worktrees/<sanit> -b <branch> (від HEAD) + .md-опис + нагадування про незакомічені зміни
6
- * remove <branch> [--force] — прибрати checkout + .md (гілку лишає)
7
- * list — git worktree list + вміст .md-описів
8
- * prune — git worktree prune + видалити осиротілі .md
9
- *
10
- * Чисті функції (санітизація, шляхи, текст опису, осиротілі) — у `lib/worktree.mjs`.
11
- * Тут лише git-виклики, запис файлів, парсинг argv і звіт.
12
- */
13
- import { spawnSync } from 'node:child_process'
14
- import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
15
- import { join } from 'node:path'
16
- import { cwd as processCwd } from 'node:process'
17
-
18
- import {
19
- buildDescription,
20
- buildDirtyNotice,
21
- findOrphanDescFiles,
22
- firstFreeBranch,
23
- worktreePaths
24
- } from './lib/worktree.mjs'
25
-
26
- const USAGE = [
27
- 'Usage:',
28
- ' npx @nitra/cursor worktree add <branch> "<опис>"',
29
- ' npx @nitra/cursor worktree remove <branch> [--force]',
30
- ' npx @nitra/cursor worktree list',
31
- ' npx @nitra/cursor worktree prune'
32
- ].join('\n')
33
-
34
- /**
35
- * Запускає git, повертає { status, stdout, stderr }.
36
- * @param {string[]} args аргументи git
37
- * @param {string} cwd робочий каталог
38
- * @returns {{ status: number, stdout: string, stderr: string }} результат
39
- */
40
- function git(args, cwd) {
41
- const r = spawnSync('git', args, { cwd, encoding: 'utf8' })
42
- return { status: r.status ?? 1, stdout: r.stdout ?? '', stderr: r.stderr ?? '' }
43
- }
44
-
45
- /**
46
- * Поточна дата YYYY-MM-DD (ін'єкція через ctx.now для тестів).
47
- * @param {() => Date} now фабрика дати
48
- * @returns {string} дата у форматі YYYY-MM-DD
49
- */
50
- function today(now) {
51
- return now().toISOString().slice(0, 10)
52
- }
53
-
54
- /**
55
- * Реєстровані worktree-checkout (абсолютні шляхи) з `git worktree list --porcelain`.
56
- * @param {string} cwd корінь репо
57
- * @returns {string[]} абсолютні шляхи checkout
58
- */
59
- function listRegisteredCheckouts(cwd) {
60
- return git(['worktree', 'list', '--porcelain'], cwd)
61
- .stdout.split('\n')
62
- .filter(line => line.startsWith('worktree '))
63
- .map(line => line.slice('worktree '.length).trim())
64
- }
65
-
66
- /**
67
- * Абсолютні шляхи `.worktrees/*.md`.
68
- * @param {string} cwd корінь репо
69
- * @returns {string[]} шляхи файлів-описів
70
- */
71
- function listDescFiles(cwd) {
72
- const dir = join(cwd, '.worktrees')
73
- if (!existsSync(dir)) return []
74
- return readdirSync(dir)
75
- .filter(n => n.endsWith('.md'))
76
- .map(n => join(dir, n))
77
- }
78
-
79
- /**
80
- * add: створити worktree від HEAD + .md-опис.
81
- * @param {string[]} rest [branch, ...descParts]
82
- * @param {{ cwd: string, log: (line: string) => void, logError: (line: string) => void, now: () => Date }} ctx контекст
83
- * @returns {number} exit code
84
- */
85
- function cmdAdd(rest, ctx) {
86
- const [branch, ...descParts] = rest
87
- const task = descParts.join(' ').trim()
88
- if (!branch) {
89
- ctx.logError('worktree add: потрібне імʼя гілки')
90
- ctx.logError(USAGE)
91
- return 1
92
- }
93
- if (!task) {
94
- ctx.logError('worktree add: опис обовʼязковий — `worktree add <branch> "<опис>"`')
95
- return 1
96
- }
97
- // Зайнята, якщо вже є git-гілка з такою назвою або checkout-каталог `.worktrees/<sanit>`.
98
- const isTaken = name => {
99
- if (git(['show-ref', '--verify', '--quiet', `refs/heads/${name}`], ctx.cwd).status === 0) return true
100
- try {
101
- return existsSync(worktreePaths(ctx.cwd, name).checkout)
102
- } catch {
103
- return false // невалідна для шляху назва — впаде нижче на worktreePaths(chosen) з людинозрозумілим текстом
104
- }
105
- }
106
- let chosen
107
- let paths
108
- try {
109
- chosen = firstFreeBranch(branch, isTaken)
110
- paths = worktreePaths(ctx.cwd, chosen)
111
- } catch (error) {
112
- ctx.logError(error.message)
113
- return 1
114
- }
115
- if (chosen !== branch) {
116
- ctx.log(`ℹ️ гілка/worktree "${branch}" уже існує — обрано вільну назву "${chosen}"`)
117
- }
118
- // Знімаємо статус ДО створення worktree: інакше щойно створений checkout/опис у `.worktrees/`
119
- // потрапили б у `git status` (коли `.worktrees/` не в .gitignore) і дали б хибне нагадування.
120
- const dirty = buildDirtyNotice(git(['status', '--porcelain'], ctx.cwd).stdout)
121
- const added = git(['worktree', 'add', paths.checkout, '-b', chosen], ctx.cwd)
122
- if (added.status !== 0) {
123
- ctx.logError(`worktree add не вдався: ${added.stderr.trim()}`)
124
- return 1
125
- }
126
- const baseCommit = git(['rev-parse', '--short', 'HEAD'], ctx.cwd).stdout.trim()
127
- const md = buildDescription({ branch: chosen, task, baseCommit, date: today(ctx.now) })
128
- writeFileSync(paths.descFile, md, 'utf8')
129
- ctx.log(`✅ worktree: ${paths.checkout}`)
130
- ctx.log(` опис: ${paths.descFile}`)
131
- if (dirty) ctx.log(dirty) // нагадування про незакомічені зміни основного дерева (зняте ДО add)
132
- return 0
133
- }
134
-
135
- /**
136
- * remove: прибрати checkout + .md (гілку лишає).
137
- * @param {string[]} rest [branch, ...flags]
138
- * @param {{ cwd: string, log: (line: string) => void, logError: (line: string) => void }} ctx контекст
139
- * @returns {number} exit code
140
- */
141
- function cmdRemove(rest, ctx) {
142
- const branch = rest.find(a => !a.startsWith('--'))
143
- const force = rest.includes('--force')
144
- if (!branch) {
145
- ctx.logError('worktree remove: потрібне імʼя гілки')
146
- return 1
147
- }
148
- let paths
149
- try {
150
- paths = worktreePaths(ctx.cwd, branch)
151
- } catch (error) {
152
- ctx.logError(error.message)
153
- return 1
154
- }
155
- const args = ['worktree', 'remove', paths.checkout]
156
- if (force) args.push('--force')
157
- const removed = git(args, ctx.cwd)
158
- if (removed.status !== 0) {
159
- ctx.logError(`worktree remove не вдався: ${removed.stderr.trim()} (спробуй --force, якщо дерево брудне)`)
160
- return 1
161
- }
162
- if (existsSync(paths.descFile)) rmSync(paths.descFile, { force: true })
163
- // Окремих sibling runtime-файлів більше немає, тож cleanup обмежений checkout і описом.
164
- ctx.log(`✅ прибрано: ${paths.checkout} (гілку ${branch} лишено)`)
165
- return 0
166
- }
167
-
168
- /**
169
- * list: git worktree list + вміст .md-описів.
170
- * @param {{ cwd: string, log: (line: string) => void }} ctx контекст
171
- * @returns {number} exit code
172
- */
173
- function cmdList(ctx) {
174
- ctx.log(git(['worktree', 'list'], ctx.cwd).stdout.trimEnd())
175
- for (const md of listDescFiles(ctx.cwd)) {
176
- ctx.log(`\n--- ${md} ---`)
177
- ctx.log(readFileSync(md, 'utf8').trimEnd())
178
- }
179
- return 0
180
- }
181
-
182
- /**
183
- * prune: git worktree prune + видалити осиротілі .md.
184
- * @param {{ cwd: string, log: (line: string) => void }} ctx контекст
185
- * @returns {number} exit code
186
- */
187
- function cmdPrune(ctx) {
188
- git(['worktree', 'prune'], ctx.cwd)
189
- const orphans = findOrphanDescFiles(listDescFiles(ctx.cwd), listRegisteredCheckouts(ctx.cwd))
190
- for (const md of orphans) {
191
- rmSync(md, { force: true })
192
- ctx.log(`🧹 видалено осиротілий опис: ${md}`)
193
- }
194
- ctx.log(`prune завершено (осиротілих описів: ${orphans.length})`)
195
- return 0
196
- }
197
-
198
- /**
199
- * Точка входу підкоманди worktree.
200
- * @param {string[]} argv аргументи після `worktree`
201
- * @param {{ cwd?: string, log?: (line: string) => void, logError?: (line: string) => void, now?: () => Date }} [options] ін'єкція для тестів
202
- * @returns {Promise<number>} exit code
203
- */
204
- export function runWorktreeCli(argv, options = {}) {
205
- const ctx = {
206
- cwd: options.cwd ?? processCwd(),
207
- log: options.log ?? (line => console.log(line)),
208
- logError: options.logError ?? (line => console.error(line)),
209
- now: options.now ?? (() => new Date())
210
- }
211
- const [sub, ...rest] = argv
212
- switch (sub) {
213
- case 'add': {
214
- return Promise.resolve(cmdAdd(rest, ctx))
215
- }
216
- case 'remove': {
217
- return Promise.resolve(cmdRemove(rest, ctx))
218
- }
219
- case 'list': {
220
- return Promise.resolve(cmdList(ctx))
221
- }
222
- case 'prune': {
223
- return Promise.resolve(cmdPrune(ctx))
224
- }
225
- default: {
226
- ctx.logError(USAGE)
227
- return Promise.resolve(1)
228
- }
229
- }
230
- }
@@ -1,38 +0,0 @@
1
- ---
2
- name: worktree
3
- description: >-
4
- Створення та керування git-worktree через n-cursor worktree CLI: ізольований
5
- workspace у .worktrees/<branch>/ з інвентарним файлом-описом
6
- ---
7
-
8
- # worktree — ізольований workspace через CLI
9
-
10
- Для роботи в окремому git-worktree використовуй CLI `n-cursor worktree` — він
11
- однаковий у Claude і Cursor, кладе worktree у `.worktrees/` (gitignored) і сам
12
- створює інвентарний файл-опис поруч.
13
-
14
- ## Команди
15
-
16
- - Створити (опис **обовʼязковий**):
17
- `npx @nitra/cursor worktree add <branch> "<навіщо цей worktree>"`
18
- - Список активних з описами:
19
- `npx @nitra/cursor worktree list`
20
- - Прибрати (гілку лишає; `--force` для брудного дерева):
21
- `npx @nitra/cursor worktree remove <branch> [--force]`
22
- - Прибрати осиротілі описи / метадані:
23
- `npx @nitra/cursor worktree prune`
24
-
25
- ## Приклад
26
-
27
- ```bash
28
- npx @nitra/cursor worktree add feat/skill-meta "реалізація Spec A: meta.json"
29
- cd .worktrees/feat-skill-meta
30
- # … робота в ізоляції …
31
- cd -
32
- npx @nitra/cursor worktree remove feat/skill-meta
33
- ```
34
-
35
- Слеш у гілці перетворюється на дефіс для пласкої структури: `feat/skill-meta`
36
- → `.worktrees/feat-skill-meta/`. Git-гілка лишається `feat/skill-meta`.
37
-
38
- Конвенція й заборони (де НЕ створювати worktree) — `.cursor/rules/n-worktree.mdc`.
@@ -1 +0,0 @@
1
- { "auto": "завжди", "worktree": false, "requireRoot": false }