@nitra/cursor 12.6.1 → 12.8.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 (372) hide show
  1. package/.claude-template/settings.template.json +1 -1
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +2 -2
  3. package/CHANGELOG.md +25 -5
  4. package/bin/docs/n-cursor.md +4 -20
  5. package/bin/n-cursor.js +8 -54
  6. package/docs/index.md +3 -3
  7. package/docs/stryker.config.md +20 -28
  8. package/lib/docs/index.md +5 -5
  9. package/lib/docs/llm.md +4 -4
  10. package/package.json +2 -2
  11. package/rules/abie/docs/fix.md +8 -8
  12. package/rules/abie/docs/index.md +4 -3
  13. package/rules/abie/docs/main.md +29 -0
  14. package/rules/abie/js/docs/index.md +6 -6
  15. package/rules/abie/lib/docs/index.md +9 -9
  16. package/rules/abie/{fix.mjs → main.mjs} +5 -3
  17. package/rules/adr/docs/index.md +1 -0
  18. package/rules/adr/docs/main.md +29 -0
  19. package/rules/adr/{fix.mjs → main.mjs} +5 -3
  20. package/rules/bun/docs/fix.md +5 -5
  21. package/rules/bun/docs/index.md +4 -3
  22. package/rules/bun/docs/main.md +30 -0
  23. package/rules/bun/js/docs/index.md +2 -2
  24. package/rules/bun/js/docs/layout.md +11 -36
  25. package/rules/bun/{fix.mjs → main.mjs} +5 -3
  26. package/rules/capacitor/docs/fix.md +10 -10
  27. package/rules/capacitor/docs/index.md +4 -3
  28. package/rules/capacitor/docs/main.md +29 -0
  29. package/rules/capacitor/js/docs/index.md +2 -2
  30. package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
  31. package/rules/changelog/docs/fix.md +11 -11
  32. package/rules/changelog/docs/index.md +4 -3
  33. package/rules/changelog/docs/main.md +27 -0
  34. package/rules/changelog/js/docs/consistency.md +12 -12
  35. package/rules/changelog/js/docs/index.md +2 -2
  36. package/rules/changelog/lib/docs/index.md +2 -2
  37. package/rules/changelog/main.mjs +20 -0
  38. package/rules/ci4/docs/fix.md +4 -4
  39. package/rules/ci4/docs/index.md +4 -3
  40. package/rules/ci4/docs/main.md +30 -0
  41. package/rules/ci4/js/docs/index.md +2 -2
  42. package/rules/ci4/main.mjs +20 -0
  43. package/rules/doc-files/docs/index.md +4 -3
  44. package/rules/doc-files/docs/main.md +31 -0
  45. package/rules/doc-files/js/docgen-crc.mjs +2 -8
  46. package/rules/doc-files/js/docgen-extract.mjs +5 -3
  47. package/rules/doc-files/js/docgen-files-batch.mjs +63 -4
  48. package/rules/doc-files/js/docgen-gen.mjs +11 -3
  49. package/rules/doc-files/js/docgen-judge-measure.mjs +67 -18
  50. package/rules/doc-files/js/docgen-judge.mjs +8 -1
  51. package/rules/doc-files/js/docgen-scan.mjs +99 -11
  52. package/rules/doc-files/js/docs/docgen-crc.md +25 -14
  53. package/rules/doc-files/js/docs/docgen-extract.md +15 -13
  54. package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
  55. package/rules/doc-files/js/docs/docgen-gen.md +15 -26
  56. package/rules/doc-files/js/docs/docgen-judge-measure.md +14 -12
  57. package/rules/doc-files/js/docs/docgen-scan.md +34 -34
  58. package/rules/doc-files/js/docs/index.md +16 -15
  59. package/rules/doc-files/js/docs/run-lint.md +27 -0
  60. package/rules/doc-files/{lint/lint.mjs → js/run-lint.mjs} +23 -9
  61. package/rules/doc-files/{js/lint.mjs → main.mjs} +60 -10
  62. package/rules/docker/docs/fix.md +6 -6
  63. package/rules/docker/docs/index.md +4 -3
  64. package/rules/docker/docs/main.md +28 -0
  65. package/rules/docker/js/docs/index.md +2 -2
  66. package/rules/docker/js/docs/lint.md +26 -54
  67. package/rules/docker/js/lint.mjs +11 -0
  68. package/rules/docker/lib/docker-hadolint.mjs +1 -1
  69. package/rules/docker/lib/docs/docker-hadolint.md +16 -173
  70. package/rules/docker/lib/docs/index.md +5 -5
  71. package/rules/docker/main.mjs +20 -0
  72. package/rules/efes/docs/fix.md +8 -8
  73. package/rules/efes/docs/index.md +4 -3
  74. package/rules/efes/docs/main.md +29 -0
  75. package/rules/efes/main.mjs +20 -0
  76. package/rules/feedback/docs/fix.md +5 -5
  77. package/rules/feedback/docs/index.md +4 -3
  78. package/rules/feedback/docs/main.md +30 -0
  79. package/rules/feedback/main.mjs +20 -0
  80. package/rules/ga/docs/fix.md +5 -5
  81. package/rules/ga/docs/index.md +4 -3
  82. package/rules/ga/docs/main.md +29 -0
  83. package/rules/ga/js/docs/index.md +3 -3
  84. package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
  85. package/rules/graphql/docs/fix.md +8 -8
  86. package/rules/graphql/docs/index.md +4 -3
  87. package/rules/graphql/docs/main.md +36 -0
  88. package/rules/graphql/js/docs/index.md +2 -2
  89. package/rules/graphql/lib/docs/index.md +2 -2
  90. package/rules/graphql/main.mjs +20 -0
  91. package/rules/hasura/docs/fix.md +11 -11
  92. package/rules/hasura/docs/index.md +4 -3
  93. package/rules/hasura/docs/main.md +30 -0
  94. package/rules/hasura/js/docs/index.md +2 -2
  95. package/rules/hasura/main.mjs +20 -0
  96. package/rules/image-avif/docs/fix.md +3 -3
  97. package/rules/image-avif/docs/index.md +4 -3
  98. package/rules/image-avif/docs/main.md +30 -0
  99. package/rules/image-avif/js/docs/avif_generation.md +20 -233
  100. package/rules/image-avif/js/docs/index.md +2 -2
  101. package/rules/image-avif/main.mjs +20 -0
  102. package/rules/image-compress/docs/fix.md +2 -2
  103. package/rules/image-compress/docs/index.md +4 -3
  104. package/rules/image-compress/docs/main.md +29 -0
  105. package/rules/image-compress/js/docs/index.md +3 -3
  106. package/rules/image-compress/js/docs/package_setup.md +12 -11
  107. package/rules/image-compress/{js/lint.mjs → main.mjs} +21 -5
  108. package/rules/js-bun-db/docs/fix.md +5 -5
  109. package/rules/js-bun-db/docs/index.md +4 -3
  110. package/rules/js-bun-db/docs/main.md +30 -0
  111. package/rules/js-bun-db/js/docs/index.md +2 -2
  112. package/rules/js-bun-db/lib/docs/index.md +2 -2
  113. package/rules/js-bun-db/main.mjs +20 -0
  114. package/rules/js-bun-redis/docs/fix.md +6 -6
  115. package/rules/js-bun-redis/docs/index.md +4 -3
  116. package/rules/js-bun-redis/docs/main.md +29 -0
  117. package/rules/js-bun-redis/js/docs/index.md +2 -2
  118. package/rules/js-bun-redis/lib/docs/index.md +2 -2
  119. package/rules/js-bun-redis/main.mjs +20 -0
  120. package/rules/js-lint/docs/fix.md +9 -9
  121. package/rules/js-lint/docs/index.md +4 -3
  122. package/rules/js-lint/docs/main.md +29 -0
  123. package/rules/js-lint/js/check.mjs +268 -0
  124. package/rules/js-lint/js/docs/check.md +39 -0
  125. package/rules/js-lint/js/docs/index.md +4 -4
  126. package/rules/js-lint/js/docs/tooling.md +12 -32
  127. package/rules/js-lint/js/tooling.mjs +1 -265
  128. package/rules/js-lint/{js/lint.mjs → main.mjs} +19 -2
  129. package/rules/js-lint-ci/docs/fix.md +3 -3
  130. package/rules/js-lint-ci/docs/index.md +4 -3
  131. package/rules/js-lint-ci/docs/main.md +27 -0
  132. package/rules/js-lint-ci/js/docs/index.md +2 -2
  133. package/rules/js-lint-ci/main.mjs +33 -0
  134. package/rules/js-mssql/docs/fix.md +5 -5
  135. package/rules/js-mssql/docs/index.md +4 -3
  136. package/rules/js-mssql/docs/main.md +30 -0
  137. package/rules/js-mssql/js/docs/index.md +2 -2
  138. package/rules/js-mssql/lib/docs/index.md +2 -2
  139. package/rules/js-mssql/main.mjs +20 -0
  140. package/rules/js-run/docs/fix.md +8 -8
  141. package/rules/js-run/docs/index.md +4 -3
  142. package/rules/js-run/docs/main.md +30 -0
  143. package/rules/js-run/js/docs/index.md +2 -2
  144. package/rules/js-run/lib/docs/index.md +7 -7
  145. package/rules/js-run/main.mjs +20 -0
  146. package/rules/k8s/docs/fix.md +4 -4
  147. package/rules/k8s/docs/index.md +4 -3
  148. package/rules/k8s/docs/main.md +40 -0
  149. package/rules/k8s/js/docs/index.md +12 -0
  150. package/rules/k8s/{lint/lint.mjs → main.mjs} +32 -10
  151. package/rules/nginx-default-tpl/docs/fix.md +7 -7
  152. package/rules/nginx-default-tpl/docs/index.md +4 -3
  153. package/rules/nginx-default-tpl/docs/main.md +30 -0
  154. package/rules/nginx-default-tpl/js/docs/index.md +2 -2
  155. package/rules/nginx-default-tpl/js/docs/template.md +2 -2
  156. package/rules/nginx-default-tpl/main.mjs +20 -0
  157. package/rules/npm-module/docs/fix.md +8 -8
  158. package/rules/npm-module/docs/index.md +4 -3
  159. package/rules/npm-module/docs/main.md +29 -0
  160. package/rules/npm-module/js/docs/index.md +5 -5
  161. package/rules/npm-module/js/docs/rule_meta.md +17 -16
  162. package/rules/npm-module/js/header_doc_pointer.mjs +1 -3
  163. package/rules/npm-module/js/rule_meta.mjs +13 -3
  164. package/rules/npm-module/main.mjs +20 -0
  165. package/rules/php/docs/fix.md +6 -6
  166. package/rules/php/docs/index.md +4 -3
  167. package/rules/php/docs/main.md +33 -0
  168. package/rules/php/js/docs/index.md +3 -3
  169. package/rules/php/js/docs/tooling.md +10 -10
  170. package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
  171. package/rules/python/docs/fix.md +11 -11
  172. package/rules/python/docs/index.md +4 -3
  173. package/rules/python/docs/main.md +31 -0
  174. package/rules/python/js/docs/index.md +3 -3
  175. package/rules/python/js/docs/tooling.md +17 -17
  176. package/rules/python/{lint/lint.mjs → main.mjs} +31 -6
  177. package/rules/rego/docs/fix.md +5 -5
  178. package/rules/rego/docs/index.md +4 -3
  179. package/rules/rego/docs/main.md +37 -0
  180. package/rules/rego/js/docs/index.md +3 -3
  181. package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
  182. package/rules/release/docs/index.md +5 -4
  183. package/rules/release/docs/main.md +29 -0
  184. package/rules/release/docs/release.md +0 -3
  185. package/rules/release/lib/docs/index.md +4 -4
  186. package/rules/release/release.mdc +10 -0
  187. package/rules/rust/docs/fix.md +4 -4
  188. package/rules/rust/docs/index.md +4 -3
  189. package/rules/rust/docs/main.md +27 -0
  190. package/rules/rust/js/docs/index.md +3 -3
  191. package/rules/rust/lib/docs/index.md +2 -2
  192. package/rules/rust/{js/lint.mjs → main.mjs} +27 -4
  193. package/rules/security/docs/fix.md +6 -6
  194. package/rules/security/docs/index.md +4 -3
  195. package/rules/security/docs/main.md +28 -0
  196. package/rules/security/js/docs/index.md +4 -4
  197. package/rules/security/main.mjs +45 -0
  198. package/rules/style-lint/docs/fix.md +3 -3
  199. package/rules/style-lint/docs/index.md +4 -3
  200. package/rules/style-lint/docs/main.md +29 -0
  201. package/rules/style-lint/js/docs/index.md +3 -3
  202. package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
  203. package/rules/tauri/docs/fix.md +11 -11
  204. package/rules/tauri/docs/index.md +4 -3
  205. package/rules/tauri/docs/main.md +29 -0
  206. package/rules/tauri/js/docs/index.md +3 -3
  207. package/rules/tauri/main.mjs +20 -0
  208. package/rules/test/docs/fix.md +5 -5
  209. package/rules/test/docs/index.md +4 -3
  210. package/rules/test/docs/main.md +30 -0
  211. package/rules/test/js/data/stryker_config/docs/index.md +4 -4
  212. package/rules/test/js/data/vitest_config/docs/index.md +2 -2
  213. package/rules/test/js/docs/index.md +7 -7
  214. package/rules/test/main.mjs +20 -0
  215. package/rules/text/docs/fix.md +11 -11
  216. package/rules/text/docs/index.md +4 -3
  217. package/rules/text/docs/main.md +29 -0
  218. package/rules/text/{lint → js}/cspell-fix.mjs +7 -2
  219. package/rules/text/js/docs/cspell-fix.md +30 -0
  220. package/rules/text/js/docs/formatting.md +12 -45
  221. package/rules/text/js/docs/index.md +8 -4
  222. package/rules/text/js/docs/run-dotenv-linter.md +31 -0
  223. package/rules/text/js/docs/run-shellcheck.md +28 -0
  224. package/rules/text/js/docs/run-v8r.md +29 -0
  225. package/rules/text/{lint/lint.mjs → main.mjs} +41 -10
  226. package/rules/tool-surface/docs/index.md +4 -3
  227. package/rules/tool-surface/docs/main.md +29 -0
  228. package/rules/tool-surface/main.mjs +20 -0
  229. package/rules/tool-surface/meta.json +6 -1
  230. package/rules/vue/docs/fix.md +6 -6
  231. package/rules/vue/docs/index.md +4 -3
  232. package/rules/vue/docs/main.md +29 -0
  233. package/rules/vue/js/docs/index.md +2 -2
  234. package/rules/vue/lib/docs/index.md +2 -2
  235. package/rules/vue/main.mjs +20 -0
  236. package/rules/worktree/docs/fix.md +11 -11
  237. package/rules/worktree/docs/index.md +4 -3
  238. package/rules/worktree/docs/main.md +28 -0
  239. package/rules/worktree/main.mjs +20 -0
  240. package/scripts/coverage-classify/docs/index.md +6 -6
  241. package/scripts/dispatcher/docs/index.md +2 -2
  242. package/scripts/docs/index.md +16 -15
  243. package/scripts/docs/post-tool-use-check.md +29 -0
  244. package/scripts/docs/sync-claude-config.md +64 -92
  245. package/scripts/lib/adr/docs/normalize-cli.md +0 -3
  246. package/scripts/lib/adr/docs/normalize-pipeline.md +0 -3
  247. package/scripts/lib/docs/gha-workflow.md +25 -317
  248. package/scripts/lib/docs/index.md +36 -35
  249. package/scripts/lib/docs/list-project-rules-mdc.md +5 -4
  250. package/scripts/lib/docs/list-rule-ids.md +15 -148
  251. package/scripts/lib/docs/read-n-cursor-config-lite.md +12 -16
  252. package/scripts/lib/docs/run-lint-step.md +13 -13
  253. package/scripts/lib/docs/run-lint.md +30 -0
  254. package/scripts/lib/docs/run-rule-cli.md +14 -10
  255. package/scripts/lib/docs/run-standard-lint.md +29 -10
  256. package/scripts/lib/docs/run-standard-rule.md +12 -11
  257. package/scripts/lib/docs/timing-summary.md +11 -12
  258. package/scripts/lib/docs/worktree-notice.md +0 -3
  259. package/scripts/lib/fix/analyze-escalation.mjs +4 -1
  260. package/scripts/lib/fix/docs/index.md +11 -10
  261. package/scripts/lib/fix/docs/orchestrator.md +23 -18
  262. package/scripts/lib/fix/docs/run-conformance-check.md +33 -0
  263. package/scripts/lib/fix/docs/run-fix-check.md +3 -3
  264. package/scripts/lib/fix/docs/t0.md +10 -9
  265. package/scripts/lib/fix/orchestrator.mjs +31 -8
  266. package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
  267. package/scripts/lib/fix/t0.mjs +6 -3
  268. package/scripts/lib/list-project-rules-mdc.mjs +1 -1
  269. package/scripts/lib/list-rule-ids.mjs +12 -3
  270. package/scripts/lib/read-n-cursor-config-lite.mjs +2 -2
  271. package/{rules/lint/js/orchestrate.mjs → scripts/lib/run-lint.mjs} +42 -22
  272. package/scripts/lib/run-rule-cli.mjs +4 -4
  273. package/scripts/lib/run-standard-lint.mjs +19 -6
  274. package/scripts/lib/run-standard-rule.mjs +4 -4
  275. package/scripts/lib/timing-summary.mjs +1 -1
  276. package/scripts/{post-tool-use-fix.mjs → post-tool-use-check.mjs} +9 -9
  277. package/scripts/sync-claude-config.mjs +2 -2
  278. package/scripts/utils/docs/index.md +14 -14
  279. package/skills/doc-aggregate/js/docs/index.md +3 -3
  280. package/skills/doc-files/.changes/260612-0002.md +1 -0
  281. package/skills/doc-files/.changes/260612-0006.md +1 -0
  282. package/skills/doc-files/.changes/260612-0008.md +1 -0
  283. package/skills/doc-files/.changes/260612-0012.md +1 -0
  284. package/skills/doc-files/.changes/260612-0031.md +1 -0
  285. package/skills/doc-files/.changes/260612-0036.md +1 -0
  286. package/skills/doc-files/.changes/260612-0114.md +1 -0
  287. package/skills/start-check/js/docs/index.md +2 -2
  288. package/skills/taze/js/docs/index.md +2 -2
  289. package/types/bin/n-cursor.d.ts +1 -1
  290. package/rules/changelog/fix.mjs +0 -18
  291. package/rules/ci4/fix.mjs +0 -18
  292. package/rules/doc-files/fix.mjs +0 -19
  293. package/rules/doc-files/js/docs/lint.md +0 -34
  294. package/rules/doc-files/lint/docs/index.md +0 -11
  295. package/rules/doc-files/lint/docs/lint.md +0 -35
  296. package/rules/docker/fix.mjs +0 -18
  297. package/rules/docker/lint/docs/index.md +0 -11
  298. package/rules/docker/lint/docs/lint.md +0 -200
  299. package/rules/docker/lint/lint.mjs +0 -95
  300. package/rules/efes/fix.mjs +0 -18
  301. package/rules/feedback/fix.mjs +0 -18
  302. package/rules/ga/fix.mjs +0 -18
  303. package/rules/ga/js/docs/lint.md +0 -20
  304. package/rules/ga/js/lint.mjs +0 -12
  305. package/rules/ga/lint/docs/index.md +0 -11
  306. package/rules/ga/lint/docs/lint.md +0 -31
  307. package/rules/graphql/fix.mjs +0 -18
  308. package/rules/hasura/fix.mjs +0 -18
  309. package/rules/image-avif/fix.mjs +0 -18
  310. package/rules/image-compress/fix.mjs +0 -18
  311. package/rules/image-compress/js/docs/lint.md +0 -24
  312. package/rules/js-bun-db/fix.mjs +0 -18
  313. package/rules/js-bun-redis/fix.mjs +0 -18
  314. package/rules/js-lint/fix.mjs +0 -18
  315. package/rules/js-lint/js/docs/lint.md +0 -32
  316. package/rules/js-lint-ci/fix.mjs +0 -18
  317. package/rules/js-lint-ci/js/docs/lint.md +0 -22
  318. package/rules/js-lint-ci/js/lint.mjs +0 -15
  319. package/rules/js-mssql/fix.mjs +0 -18
  320. package/rules/js-run/fix.mjs +0 -18
  321. package/rules/k8s/fix.mjs +0 -18
  322. package/rules/k8s/js/lint.mjs +0 -14
  323. package/rules/k8s/lint/docs/index.md +0 -11
  324. package/rules/k8s/lint/docs/lint.md +0 -413
  325. package/rules/lint/docs/fix.md +0 -25
  326. package/rules/lint/docs/index.md +0 -11
  327. package/rules/lint/fix.mjs +0 -18
  328. package/rules/lint/js/docs/index.md +0 -11
  329. package/rules/lint/js/docs/orchestrate.md +0 -31
  330. package/rules/lint/meta.json +0 -1
  331. package/rules/nginx-default-tpl/fix.mjs +0 -18
  332. package/rules/npm-module/fix.mjs +0 -18
  333. package/rules/php/fix.mjs +0 -18
  334. package/rules/php/js/docs/lint.md +0 -20
  335. package/rules/php/js/lint.mjs +0 -15
  336. package/rules/php/lint/docs/index.md +0 -11
  337. package/rules/php/lint/docs/lint.md +0 -219
  338. package/rules/python/fix.mjs +0 -18
  339. package/rules/python/js/docs/lint.md +0 -21
  340. package/rules/python/js/lint.mjs +0 -14
  341. package/rules/python/lint/docs/index.md +0 -11
  342. package/rules/python/lint/docs/lint.md +0 -29
  343. package/rules/rego/fix.mjs +0 -18
  344. package/rules/rego/js/docs/lint.md +0 -21
  345. package/rules/rego/js/lint.mjs +0 -12
  346. package/rules/rego/lint/docs/index.md +0 -11
  347. package/rules/rego/lint/docs/lint.md +0 -208
  348. package/rules/rust/fix.mjs +0 -18
  349. package/rules/rust/js/docs/lint.md +0 -21
  350. package/rules/security/fix.mjs +0 -18
  351. package/rules/security/js/docs/lint.md +0 -175
  352. package/rules/security/js/lint.mjs +0 -26
  353. package/rules/style-lint/fix.mjs +0 -18
  354. package/rules/style-lint/js/docs/lint.md +0 -31
  355. package/rules/tauri/fix.mjs +0 -18
  356. package/rules/test/fix.mjs +0 -18
  357. package/rules/text/fix.mjs +0 -18
  358. package/rules/text/js/docs/lint.md +0 -23
  359. package/rules/text/js/lint.mjs +0 -15
  360. package/rules/text/lint/docs/cspell-fix.md +0 -32
  361. package/rules/text/lint/docs/index.md +0 -15
  362. package/rules/text/lint/docs/lint.md +0 -36
  363. package/rules/text/lint/docs/run-dotenv-linter.md +0 -161
  364. package/rules/text/lint/docs/run-shellcheck.md +0 -216
  365. package/rules/text/lint/docs/run-v8r.md +0 -201
  366. package/rules/tool-surface/fix.mjs +0 -18
  367. package/rules/vue/fix.mjs +0 -18
  368. package/rules/worktree/fix.mjs +0 -18
  369. /package/rules/release/{fix.mjs → main.mjs} +0 -0
  370. /package/rules/text/{lint → js}/run-dotenv-linter.mjs +0 -0
  371. /package/rules/text/{lint → js}/run-shellcheck.mjs +0 -0
  372. /package/rules/text/{lint → js}/run-v8r.mjs +0 -0
@@ -30,8 +30,8 @@ import { existsSync } from 'node:fs'
30
30
  import { chmod, mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises'
31
31
  import { join } from 'node:path'
32
32
 
33
- /** Маркер PostToolUse fix-hook'а (`npx --no \@nitra/cursor post-tool-use-fix`). */
34
- export const MANAGED_HOOK_COMMAND_MARKER = '@nitra/cursor post-tool-use-fix'
33
+ /** Маркер PostToolUse fix-hook'а (`npx --no \@nitra/cursor post-tool-use-check`). */
34
+ export const MANAGED_HOOK_COMMAND_MARKER = '@nitra/cursor post-tool-use-check'
35
35
  /** Маркер doc-files staleness-hook'ів (PostToolUse `--hook` і Stop-гейт `--git`). */
36
36
  export const DOC_FILES_HOOK_COMMAND_MARKER = '@nitra/cursor lint-doc-files'
37
37
  /** Legacy-маркер старих doc-files hook'ів (`doc-files check`) — cleanup при ресинку наявних інсталяцій. */
@@ -6,18 +6,18 @@ resource: npm/scripts/utils/
6
6
 
7
7
  # npm/scripts/utils
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [ast-scan-utils.mjs](ast-scan-utils.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------------- | --------- |
11
+ | [ast-scan-utils.mjs](ast-scan-utils.md) | JS Module |
12
12
  | [ensure-gitignore-entries.mjs](ensure-gitignore-entries.md) | JS Module |
13
- | [find-package-json-paths.mjs](find-package-json-paths.md) | JS Module |
14
- | [lock-cache-dir.mjs](lock-cache-dir.md) | JS Module |
15
- | [pass.mjs](pass.md) | JS Module |
16
- | [resolve-cargo-manifest.mjs](resolve-cargo-manifest.md) | JS Module |
17
- | [resolve-cmd.mjs](resolve-cmd.md) | JS Module |
18
- | [resolve-js-root.mjs](resolve-js-root.md) | JS Module |
19
- | [test-helpers.mjs](test-helpers.md) | JS Module |
20
- | [walk-cache.mjs](walk-cache.md) | JS Module |
21
- | [walkDir.mjs](walkDir.md) | JS Module |
22
- | [with-lock.mjs](with-lock.md) | JS Module |
23
- | [worktree-fingerprint.mjs](worktree-fingerprint.md) | JS Module |
13
+ | [find-package-json-paths.mjs](find-package-json-paths.md) | JS Module |
14
+ | [lock-cache-dir.mjs](lock-cache-dir.md) | JS Module |
15
+ | [pass.mjs](pass.md) | JS Module |
16
+ | [resolve-cargo-manifest.mjs](resolve-cargo-manifest.md) | JS Module |
17
+ | [resolve-cmd.mjs](resolve-cmd.md) | JS Module |
18
+ | [resolve-js-root.mjs](resolve-js-root.md) | JS Module |
19
+ | [test-helpers.mjs](test-helpers.md) | JS Module |
20
+ | [walk-cache.mjs](walk-cache.md) | JS Module |
21
+ | [walkDir.mjs](walkDir.md) | JS Module |
22
+ | [with-lock.mjs](with-lock.md) | JS Module |
23
+ | [worktree-fingerprint.mjs](worktree-fingerprint.md) | JS Module |
@@ -6,7 +6,7 @@ resource: npm/skills/doc-aggregate/js/
6
6
 
7
7
  # npm/skills/doc-aggregate/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------------------------- | --------- |
11
11
  | [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
12
- | [docgen-scan.mjs](docgen-scan.md) | JS Module |
12
+ | [docgen-scan.mjs](docgen-scan.md) | JS Module |
@@ -2,4 +2,5 @@
2
2
  bump: minor
3
3
  section: Added
4
4
  ---
5
+
5
6
  doc-files: підтримка Rust (.rs) — SOURCE_EXTENSIONS, target/-ignore, extractFactsRust, units-rs
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Fixed
4
4
  ---
5
+
5
6
  мовно-нейтральний текст returnsFalsyOnFail (false/null/Err); units-rs: тести + docs
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Added
4
4
  ---
5
+
5
6
  Rust .rs: тести units-rs, doc units-rs.md, мовно-нейтральний текст гарантії returnsFalsyOnFail
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Added
4
4
  ---
5
+
5
6
  Rust (.rs): тести extractFactsRust у docgen-extract.test.mjs — exports, tauri::command, struct/enum, markers, header, desc
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Changed
4
4
  ---
5
+
5
6
  стале-доки після Rust: оновлено CRC для docgen-prompts, docgen-scan, units-rs; додано units-js.md; тести extractFacts(.rs)
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Added
4
4
  ---
5
+
5
6
  docs: units.md (docgen для units.mjs — фасад Rust/JS)
@@ -2,4 +2,5 @@
2
2
  bump: patch
3
3
  section: Added
4
4
  ---
5
+
5
6
  doc-files: регенерація всіх stale doc-файлів; manifests.mjs (303KB) → docgen-ignore
@@ -6,6 +6,6 @@ resource: npm/skills/start-check/js/
6
6
 
7
7
  # npm/skills/start-check/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | --------------------- | --------- |
11
11
  | [check.mjs](check.md) | JS Module |
@@ -6,6 +6,6 @@ resource: npm/skills/taze/js/
6
6
 
7
7
  # npm/skills/taze/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
11
  | [diff.mjs](diff.md) | JS Module |
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export {}
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
package/rules/ci4/fix.mjs DELETED
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,19 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило doc-files: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Структурні concerns (наявність workflow lint-doc-files.yml, скрипт у package.json) закриває
7
- * policy-канал; контентні порушення (відсутні/застарілі доки) — поза `n-cursor fix`, їх закриває
8
- * `fix-doc-files` (генерація). Library mode: викликається через `import + run(ctx)`.
9
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
10
- * @returns {Promise<number>} 0 — OK, 1 — порушення
11
- */
12
- export function run(ctx) {
13
- return runStandardRule(import.meta.dirname, ctx)
14
- }
15
-
16
- if (isRunAsCli(import.meta.url)) {
17
- // Standalone: bun rules/doc-files/fix.mjs — еквівалент `npx @nitra/cursor fix doc-files`.
18
- process.exitCode = await runRuleCli(import.meta.dirname)
19
- }
@@ -1,34 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/doc-files/js/lint.mjs
5
- docgen:
6
- crc: ca055f8f
7
- score: 100
8
- ---
9
-
10
- Адаптер правила doc-files до агрегатора `n-cursor lint`. Дає агрегатору відповідь на одне
11
- питання: чи має кожен дотичний кодовий файл актуальну файлову документацію поряд із собою.
12
-
13
- ## Поведінка
14
-
15
- У quick-фазі отримує список змінених файлів і зводить його до набору джерел для перевірки в
16
- **обидва** боки: змінене джерело перевіряється проти своєї доки, а змінена або видалена дока
17
- (`<dir>/docs/<stem>.md`) повертається до відповідного джерела з тим самим іменем у каталозі над
18
- `docs/`. У ci-фазі (списку немає) обходить усе дерево.
19
-
20
- Порушенням вважається відсутня дока (`missing`) або розбіжність контрольної суми джерела з тією,
21
- що записана у frontmatter доки (`crc-mismatch`). Документ із низькою якістю, але свіжою сумою —
22
- не порушення.
23
-
24
- ## Публічний API
25
-
26
- `lint` — перевіряє документацію для переданого набору змінених файлів (або всього репозиторію,
27
- якщо набір не задано); повертає код виходу `1`, якщо є застарілі чи відсутні доки, інакше `0`.
28
- Список проблемних файлів друкується у stderr із підказкою регенерувати.
29
-
30
- ## Гарантії поведінки
31
-
32
- - Детермінованість: жодного виклику мовної моделі, рішення лише за контрольною сумою.
33
- - Реверс-мапінг доки до джерела перебирає лише кодові розширення і повертає наявний файл-кандидат.
34
- - Порожній набір змінених файлів дає код `0` без обходу дерева.
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/doc-files/lint
4
- resource: npm/rules/doc-files/lint/
5
- ---
6
-
7
- # npm/rules/doc-files/lint
8
-
9
- | Файл | Тип |
10
- |---|---|
11
- | [lint.mjs](lint.md) | JS Module |
@@ -1,35 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/doc-files/lint/lint.mjs
5
- docgen:
6
- crc: a30dd81f
7
- score: 100
8
- ---
9
-
10
- CLI-команда `lint-doc-files` — детермінований детектор застарілості файлових док. Працює без
11
- мовної моделі скрізь: локально, в hook'ах і в CI.
12
-
13
- ## Поведінка
14
-
15
- Без прапорців або з переліком шляхів робить повний чи точковий детект і повертає код `1`, якщо є
16
- застарілі/відсутні доки. `--missing-only` звужує до самих відсутніх. `--json` друкує машинний
17
- лістинг усіх кандидатів зі станом і завершується кодом `0`. Режими `--hook`, `--git` і
18
- `--degraded` делегуються детектору hook-протоколу (PostToolUse за одним файлом зі stdin, Stop-гейт
19
- за зміненими у задачі джерелами з порогом, інформаційний звіт про доки нижчої якості).
20
-
21
- Повний прогін серіалізується спільним локом під ключем, виведеним зі шляху каталогу, тож паралельні
22
- запуски не накладаються; hook-форми навмисно виконуються без локу заради завжди-свіжого вердикту.
23
-
24
- ## Публічний API
25
-
26
- `runLintDocFilesCli` — точка входу команди: маршрутизує між делегатом hook-протоколу, JSON-лістингом
27
- і повним/точковим детектом; повертає код виходу.
28
- `runLintDocFilesSteps` — сама робота повного чи точкового детекту, придатна для прямого виклику з
29
- тестів без локу; повертає `1` за наявності застарілих док, інакше `0`.
30
-
31
- ## Гарантії поведінки
32
-
33
- - Неіснуючий корінь дає зрозумілу помилку і код `1`.
34
- - Повний прогін — код `1` (конвенція `lint-*`); hook/git — код `2` (blocking feedback для Claude Code).
35
- - Жодних викликів мовної моделі.
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/docker/lint
4
- resource: npm/rules/docker/lint/
5
- ---
6
-
7
- # npm/rules/docker/lint
8
-
9
- | Файл | Тип |
10
- |---|---|
11
- | [lint.mjs](lint.md) | JS Module |
@@ -1,200 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/docker/lint/lint.mjs
5
- docgen:
6
- crc: 98a98d10
7
- ---
8
-
9
- Модуль `npm/rules/docker/lint/lint.mjs` реалізує підкоманду `lint-docker` інструмента `n-cursor`. Її задача — знайти у дереві репозиторію канонічні Dockerfile-и та пропустити їх через `hadolint`, фіксуючи результат у форматі звіту `check-reporter` і виставляючи числовий код виходу.
10
-
11
- Особливості, що визначають поведінку:
12
-
13
- - Перевіряються **лише** файли з іменем, що рівне `Dockerfile` (регістр не важливий) та файли, ім’я яких закінчується на суфікс `.dockerfile` (наприклад, `app.Dockerfile`, `worker.dockerfile`). Файли виду `Dockerfile.dev`, `Containerfile` й інші варіанти, які бере `check-docker`, тут навмисно **не** обробляються.
14
- - Обхід дерева виконується тим самим `walkDir`, що й у `check-docker`, з тими самими пропусками каталогів (на основі `.cursorignore`/конфігу Cursor).
15
- - Виклик `hadolint` йде через `lintDockerfileWithHadolint` із `../lib/docker-hadolint.mjs` — інструмент шукається у `PATH` або запускається в Docker (`docker run`).
16
- - Серіалізація важкої CLI-команди (тільки один паралельний прогін на репозиторій і дедуплікація за станом git-дерева) виконана через `runStandardLint` — це канонічний патерн для `lint-*` команд згідно з `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд». Прямий `withLock` тут не використовується.
17
- - Запуск файла напряму через Node (`node lint.mjs`) працює як CLI: модуль ставить `process.exitCode` у код, повернений `runLintDocker`.
18
-
19
- ## Експорти / API
20
-
21
- | Експорт | Вид | Призначення |
22
- | ------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------- |
23
- | `isLintDockerfileName` | `function` | Перевіряє basename файла: чи входить він до набору `lint-docker`. |
24
- | `findLintDockerfilePaths` | `async function` | Збирає відсортований список абсолютних шляхів придатних для `lint-docker` файлів. |
25
- | `runLintDocker` | `() => Promise<number>` | Публічна CLI-форма команди `lint-docker`: серіалізований прогон з кешуванням за станом дерева. |
26
-
27
- Внутрішня (не експортована) функція:
28
-
29
- - `runLintDockerSteps()` — самі кроки lint-у без обгортки локу й дедупу. Викликається `runStandardLint`.
30
-
31
- CLI-режим (`if (isRunAsCli(import.meta.url))`) при прямому запуску файла ставить `process.exitCode = await runLintDocker()`.
32
-
33
- ## Функції
34
-
35
- ### `isLintDockerfileName(name)`
36
-
37
- ```js
38
- export function isLintDockerfileName(name): boolean
39
- ```
40
-
41
- - **Параметри:**
42
- - `name: string` — basename шляху (тобто лише ім’я файла, без каталогів).
43
- - **Повертає:** `boolean` — `true`, якщо файл підходить під набір `lint-docker`, інакше `false`.
44
- - **Логіка:**
45
- 1. Зводить ім’я до нижнього регістру (`n`).
46
- 2. Якщо `n === 'dockerfile'` — повертає `true`.
47
- 3. Інакше повертає `true`, лише якщо `n` закінчується на `.dockerfile` **і** довжина `n` строго більша за довжину суфікса `.dockerfile`. Завдяки цій додатковій умові саме `.dockerfile` (без префікса) — не валідний кейс.
48
- - **Side effects:** немає.
49
- - **Приклади:**
50
- - `isLintDockerfileName('Dockerfile')` → `true`
51
- - `isLintDockerfileName('dockerfile')` → `true`
52
- - `isLintDockerfileName('app.Dockerfile')` → `true`
53
- - `isLintDockerfileName('worker.dockerfile')` → `true`
54
- - `isLintDockerfileName('.dockerfile')` → `false`
55
- - `isLintDockerfileName('Dockerfile.dev')` → `false`
56
- - `isLintDockerfileName('Containerfile')` → `false`
57
-
58
- ### `findLintDockerfilePaths(root, ignorePaths = [])`
59
-
60
- ```js
61
- export async function findLintDockerfilePaths(root, ignorePaths = []): Promise<string[]>
62
- ```
63
-
64
- - **Параметри:**
65
- - `root: string` — корінь обходу (зазвичай корінь репозиторію).
66
- - `ignorePaths?: string[]` — абсолютні шляхи каталогів, повністю виключених з обходу (за замовчуванням пустий масив).
67
- - **Повертає:** `Promise<string[]>` — масив абсолютних шляхів придатних файлів, відсортований за `String.prototype.localeCompare` через `Array.prototype.toSorted` (не мутує проміжний масив).
68
- - **Логіка:**
69
- 1. Створює локальний акумулятор `out`.
70
- 2. Викликає `walkDir(root, visit, ignorePaths)`, де `visit(p)` додає `p` до `out`, якщо `isLintDockerfileName(basename(p))` істинне.
71
- 3. Повертає `out.toSorted((a, b) => a.localeCompare(b))`.
72
- - **Side effects:** виконує асинхронний обхід файлової системи через `walkDir`. Не пише нічого на диск і нічого не виводить у stdout/stderr.
73
-
74
- ### `runLintDockerSteps()` _(internal)_
75
-
76
- ```js
77
- async function runLintDockerSteps(): Promise<number>
78
- ```
79
-
80
- - **Параметри:** немає.
81
- - **Повертає:** `Promise<number>` — `reporter.getExitCode()`: `0`, якщо помилок не зафіксовано, `1`, якщо хоча б один `fail`.
82
- - **Логіка:**
83
- 1. Створює репортер: `const reporter = createCheckReporter(); const { pass, fail } = reporter`.
84
- 2. Бере `root = process.cwd()`.
85
- 3. Завантажує `ignorePaths` через `await loadCursorIgnorePaths(root)`.
86
- 4. Шукає кандидатів: `files = await findLintDockerfilePaths(root, ignorePaths)`.
87
- 5. Якщо `files.length === 0` — викликає `pass('lint-docker: немає Dockerfile / *.Dockerfile — hadolint пропущено')` і повертає `reporter.getExitCode()`.
88
- 6. Інакше повідомляє `pass(\`lint-docker: файлів для hadolint: ${files.length}\`)`.
89
- 7. Для кожного абсолютного шляху `abs`:
90
- - Обчислює відносний шлях `rel = posixRel(root, abs) || basename(abs)` — якщо `posixRel` повернула порожній рядок, береться лише basename.
91
- - Викликає `const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)` (синхронний виклик, як видно з відсутності `await`).
92
- - Об’єднує `stdout + stderr`, тримує (`trim()`) у `tail`.
93
- - Якщо `ok` — `pass(\`${rel} (${via})\`)`.
94
- - Якщо ні — формує `detail = tail ? \`:\n${tail}\` : ''` і викликає `fail(\`${rel} (${via})${detail}\`)`.
95
- 8. Повертає `reporter.getExitCode()`.
96
- - **Side effects:**
97
- - Читає поточну робочу директорію (`process.cwd()`).
98
- - Читає файлову систему репозиторію через `walkDir`/`loadCursorIgnorePaths`.
99
- - Запускає зовнішній процес `hadolint` (через `PATH` або через `docker run`) для кожного знайденого Dockerfile.
100
- - Пише повідомлення у консоль/звіт через `pass`/`fail` репортера.
101
-
102
- ### `runLintDocker`
103
-
104
- ```js
105
- export const runLintDocker = (): Promise<number> =>
106
- runStandardLint(import.meta.dirname, runLintDockerSteps)
107
- ```
108
-
109
- - **Параметри:** немає.
110
- - **Повертає:** `Promise<number>` — фінальний код виходу команди.
111
- - **Логіка:** делегує виконання у `runStandardLint`, передаючи:
112
- - `import.meta.dirname` — каталог цього модуля (`npm/rules/docker/lint`); `runStandardLint` використовує його як ідентифікатор/корінь для серіалізації та для дедуплікації запусків за станом git-дерева;
113
- - `runLintDockerSteps` — асинхронну функцію з фактичними кроками lint-у.
114
- - **Side effects:** усі побічні ефекти `runStandardLint` (взяття локу `lint-docker`, перевірка попереднього стану git, можливе пропускання запуску при ідентичному стані тощо) + усі ефекти `runLintDockerSteps`.
115
-
116
- ### CLI-ентрі
117
-
118
- ```js
119
- if (isRunAsCli(import.meta.url)) {
120
- process.exitCode = await runLintDocker()
121
- }
122
- ```
123
-
124
- - **Поведінка:** при прямому запуску модуля як Node-скрипта (`node npm/rules/docker/lint/lint.mjs` або у вигляді ESM bin) встановлює `process.exitCode` у значення, повернене `runLintDocker()`. Імпорт як модуля з іншого файла не активує цю гілку.
125
- - **Side effects:** мутує `process.exitCode`.
126
-
127
- ## Залежності
128
-
129
- ### Зовнішні (Node API)
130
-
131
- - `node:path` — використовується лише `basename` для виділення імені файла зі шляху.
132
-
133
- ### Внутрішні модулі репозиторію
134
-
135
- | Імпорт | Що з нього береться | Роль у цьому модулі |
136
- | --------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------- |
137
- | `../../../scripts/cli-entry.mjs` | `isRunAsCli` | Визначення, чи модуль запущено як CLI напряму. |
138
- | `../lib/docker-hadolint.mjs` | `lintDockerfileWithHadolint`, `posixRel` | Власне виклик `hadolint` (через PATH або `docker run`) і обчислення POSIX-відносного шляху. |
139
- | `../../../scripts/lib/check-reporter.mjs` | `createCheckReporter` | Створення репортера з методами `pass`/`fail` і фінальним `getExitCode`. |
140
- | `../../../scripts/lib/load-cursor-config.mjs` | `loadCursorIgnorePaths` | Завантаження списку каталогів, які потрібно ігнорувати під час обходу. |
141
- | `../../../scripts/utils/walkDir.mjs` | `walkDir` | Асинхронний обхід дерева файлів з підтримкою списку ігнорувань. |
142
- | `../../../scripts/lib/run-standard-lint.mjs` | `runStandardLint` | Канонічна обгортка `lint-*`-команд: лок, дедуп за станом git-дерева, уніфікований запуск. |
143
-
144
- ### Зовнішні CLI/інструменти, що викликаються опосередковано
145
-
146
- - `hadolint` — або з `PATH`, або через `docker run` (визначається в `lintDockerfileWithHadolint`).
147
- - Опосередковано — `git` (для обчислення стану дерева всередині `runStandardLint`), `docker` (якщо `hadolint` запускається в контейнері).
148
-
149
- ## Потік виконання / Використання
150
-
151
- ### Послідовність дій при `n-cursor lint docker`
152
-
153
- 1. `bin/n-cursor.js` диспатчить правило `docker` на `npm/rules/docker/js/lint.mjs`, яке використовує `runLintDocker` із цього модуля.
154
- 2. `runLintDocker` → `runStandardLint(import.meta.dirname, runLintDockerSteps)`:
155
- - бере серіалізаційний лок на ім’я `lint-docker`;
156
- - перевіряє стан git-дерева; якщо стан збігається з попереднім успішним прогоном — крок може бути пропущено (дедуп);
157
- - інакше викликає `runLintDockerSteps`.
158
- 3. `runLintDockerSteps`:
159
- - читає `cwd`;
160
- - завантажує `ignorePaths`;
161
- - обходить дерево і збирає Dockerfile-кандидатів (тільки `Dockerfile` і `*.Dockerfile`/`*.dockerfile`);
162
- - якщо нічого не знайдено — фіксує `pass` про пропуск і виходить;
163
- - інакше повідомляє кількість файлів і по кожному викликає `lintDockerfileWithHadolint`;
164
- - кожен результат маркується як `pass` або `fail` (з прикладеним хвостом `stdout`+`stderr`).
165
- 4. Підсумковий `reporter.getExitCode()` повертається у `runStandardLint`, а той — у `runLintDocker`.
166
- 5. При прямому запуску файла Node — код виходу пишеться у `process.exitCode`.
167
-
168
- ### Як це використовується ззовні
169
-
170
- - **CLI:** `n-cursor lint docker` — основний сценарій.
171
- - **Програмно з інших скриптів:**
172
-
173
- ```js
174
- import { runLintDocker } from 'npm/rules/docker/lint/lint.mjs'
175
-
176
- const code = await runLintDocker() // 0 — OK, 1 — є зауваження/помилки
177
- ```
178
-
179
- - **Тести/допоміжний код:**
180
-
181
- ```js
182
- import { isLintDockerfileName, findLintDockerfilePaths } from 'npm/rules/docker/lint/lint.mjs'
183
-
184
- isLintDockerfileName('Dockerfile') // true
185
- isLintDockerfileName('app.Dockerfile') // true
186
- isLintDockerfileName('Dockerfile.dev') // false
187
-
188
- const files = await findLintDockerfilePaths(process.cwd(), [])
189
- ```
190
-
191
- ### Контракт коду виходу
192
-
193
- - `0` — або не знайдено Dockerfile-ів, або всі знайдені пройшли `hadolint`.
194
- - `1` — хоча б один файл не пройшов `hadolint` (або зафіксована інша помилка через `fail`).
195
-
196
- ### Відмінності від `check-docker`
197
-
198
- - `check-docker` працює з ширшим набором імен (зокрема `Dockerfile.*`, `Containerfile` тощо).
199
- - `lint-docker` свідомо звужений до канонічного `Dockerfile` та суфікса `.dockerfile`, що відповідає правилу `docker.mdc` для самого hadolint-кроку.
200
- - Серіалізація `lint-docker` — через `runStandardLint`, а не через прямий `withLock`, як того вимагає `scripts.mdc`.
@@ -1,95 +0,0 @@
1
- /**
2
- * run-docker (скрипт lint-docker): hadolint лише для файлів з іменем Dockerfile та суфіксом .dockerfile (див. docker.mdc).
3
- *
4
- * Обхід дерева як у check-docker (walkDir, ті самі пропуски каталогів). На відміну від
5
- * check docker, не обробляються Dockerfile.*, Containerfile тощо — лише канонічне ім’я
6
- * Dockerfile та варіанти виду app.Dockerfile (регістр суфікса не важливий).
7
- *
8
- * Виклик hadolint — через ../js/lint/docker-hadolint.mjs (PATH або docker run).
9
- *
10
- * Канон патерну `lint-*` (серіалізація через `runStandardLint`, без прямого `withLock`) —
11
- * `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд».
12
- */
13
- import { basename } from 'node:path'
14
-
15
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
16
- import { lintDockerfileWithHadolint, posixRel } from '../lib/docker-hadolint.mjs'
17
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
18
- import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
19
- import { walkDir } from '../../../scripts/utils/walkDir.mjs'
20
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
21
-
22
- /**
23
- * Чи входить файл до набору lint-docker: Dockerfile або *.Dockerfile (*.dockerfile).
24
- * @param {string} name basename шляху
25
- * @returns {boolean} true, якщо ім’я підходить під lint-docker
26
- */
27
- export function isLintDockerfileName(name) {
28
- const n = name.toLowerCase()
29
- if (n === 'dockerfile') return true
30
- return n.endsWith('.dockerfile') && n.length > '.dockerfile'.length
31
- }
32
-
33
- /**
34
- * Збирає абсолютні шляхи для lint-docker.
35
- * @param {string} root корінь репозиторію
36
- * @param {string[]} [ignorePaths] абсолютні шляхи каталогів, повністю виключених з обходу
37
- * @returns {Promise<string[]>} відсортовані абсолютні шляхи
38
- */
39
- export async function findLintDockerfilePaths(root, ignorePaths = []) {
40
- /** @type {string[]} */
41
- const out = []
42
- await walkDir(
43
- root,
44
- p => {
45
- if (isLintDockerfileName(basename(p))) out.push(p)
46
- },
47
- ignorePaths
48
- )
49
- return out.toSorted((a, b) => a.localeCompare(b))
50
- }
51
-
52
- /**
53
- * Внутрішні кроки `lint-docker` без локу: hadolint по Dockerfile та *.Dockerfile.
54
- * @returns {Promise<number>} 0 — OK, 1 — зауваження або помилка
55
- */
56
- async function runLintDockerSteps() {
57
- const reporter = createCheckReporter()
58
- const { pass, fail } = reporter
59
-
60
- const root = process.cwd()
61
- const ignorePaths = await loadCursorIgnorePaths(root)
62
- const files = await findLintDockerfilePaths(root, ignorePaths)
63
-
64
- if (files.length === 0) {
65
- pass('lint-docker: немає Dockerfile / *.Dockerfile — hadolint пропущено')
66
- return reporter.getExitCode()
67
- }
68
-
69
- pass(`lint-docker: файлів для hadolint: ${files.length}`)
70
-
71
- for (const abs of files) {
72
- const rel = posixRel(root, abs) || basename(abs)
73
- const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)
74
- const tail = (stdout + stderr).trim()
75
- if (ok) {
76
- pass(`${rel} (${via})`)
77
- } else {
78
- const detail = tail ? `:\n${tail}` : ''
79
- fail(`${rel} (${via})${detail}`)
80
- }
81
- }
82
-
83
- return reporter.getExitCode()
84
- }
85
-
86
- /**
87
- * Публічна CLI-форма: серіалізує через `withLock('lint-docker')` + дедуп за станом git-дерева.
88
- * Експортовано як `runLintDocker` — використовується з `bin/n-cursor.js` як підкоманда `lint-docker`.
89
- * @returns {Promise<number>} код виходу
90
- */
91
- export const runLintDocker = () => runStandardLint(import.meta.dirname, runLintDockerSteps)
92
-
93
- if (isRunAsCli(import.meta.url)) {
94
- process.exitCode = await runLintDocker()
95
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }