@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
@@ -3,42 +3,31 @@ type: JS Module
3
3
  title: docgen-gen.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-gen.mjs
5
5
  docgen:
6
- crc: 7674d2b2
6
+ crc: 059d7d6e
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Огляд
11
- Публічні функції виконують операції з текстом та оцінками. Вони включають виділення коду, вставлення інформації та генерацію документів на основі визначених параметрів.
11
+ ## Огляд
12
12
 
13
- ## Поведінка
14
-
15
- splitProtected
16
- Вибирає та видаляє код-фенс-обгортку з секції
17
-
18
- insertProtected
19
- Вставляє захищений блок Призначення після заголовка Огляд
13
+ Модуль забезпечує повний цикл роботи з документами: відокремлює захищений блок за допомогою `splitProtected`, вставляє його у визначене місце за допомогою `insertProtected`, генерує повний Markdown-документ через `generateDoc` (з використанням `DEFAULT_LOCAL_MODEL`), а також оцінює якість документа за допомогою `scoreDoc`. Кешування застосовується протягом прогону. (abie.mdc)
20
14
 
21
- scoreDoc
22
- Перевіряє вихід проти фактів і повертає оцінку та список проблем
23
-
24
- DEFAULT_LOCAL_MODEL
25
- Повертає дефолтну модель для роботи
15
+ ## Поведінка
26
16
 
27
- generateDoc
28
- Генерує документ з детермінованою оцінкою та метаданими
17
+ splitProtected відокремлює захищений блок Призначення від основного документа.
18
+ insertProtected вставляє захищений блок Призначення у фіксовану позицію після заголовка документа.
19
+ scoreDoc оцінює якість згенерованого документа за заданими критеріями.
20
+ DEFAULT_LOCAL_MODEL визначає модель, яка використовується для генерації документа.
21
+ generateDoc генерує повний Markdown-документ з опису файлу, застосовуючи оцінку та можливий ретрай.
29
22
 
30
23
  ## Публічний API
31
24
 
32
- splitProtected — Відокремлює захищену секцію `## Призначення` (Варіант B). Межа наступний `## ` і `###` не обриває блок. (abie.mdc)
33
- insertProtected — Вставляє захищений блок `## Призначення` одразу після H1 (фіксована позиція). (abie.mdc)
34
- scoreDoc — Stage 2.5 Детермінований скоринг (0 токенів): перевіряє вихід проти фактів. (abie.mdc)
35
- DEFAULT_LOCAL_MODEL — Дефолтна модель: N_CURSOR_DOCGEN_MODEL resolveModel omlx напряму. Останній fallback гарантує локальний виклик без змін середовища (через pi CLI той самий локальний виклик виміряно повільніший на ~46%). (abie.mdc)
36
- generateDoc — Головний API: файл md-дока з det-оцінкою. (abie.mdc)
25
+ splitProtected — Розділяє захищений розділ `## Призначення` (Варіант B), використовуючи наступний заголовок рівня H2 або H3 як межу.
26
+ insertProtected — Розміщує захищений блок `## Призначення` безпосередньо після основного заголовка (H1).
27
+ scoreDoc — Виконує детерміновану оцінку (Stage 2.5), порівнюючи вихідні дані з фактичною інформацією.
28
+ DEFAULT_LOCAL_MODEL — Визначає модель для генерації документа, використовуючи мінімальну локальну модель. Якщо модель не задана, процес зупиняється з помилкою.
29
+ generateDoc — Основна функція, яка перетворює вхідний файл у Markdown-документ з оцінкою достовірності.
37
30
 
38
31
  ## Гарантії поведінки
39
32
 
40
- - Read-only: файл не виконує операцій запису у файлову систему.
41
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
42
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
43
33
  - Кешує результати в межах одного прогону.
44
- - Не звертається до мережі.
@@ -3,26 +3,28 @@ type: JS Module
3
3
  title: docgen-judge-measure.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-judge-measure.mjs
5
5
  docgen:
6
- crc: e6e19732
6
+ crc: 86b3120f
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Файл зчитує список файлів для аналізу, спираючись на конфігурацію `report.json`. Для кожного файлу генерується технічна документація за допомогою локальної моделі. Після генерації документація оцінюється хмарною моделлю. Результати оцінки кешуються у межах прогону, а потім збираються у звіт. Звіт зберігається у `report.json` та виводиться у консоль.
11
+ ## Огляд
12
+
13
+ Модуль обробляє файли, витягуючи їхній зміст для генерації документації. Він порівнює цю документацію з оцінками сильної модільної системи. Під час роботи відбувається кешування у межах прогону. Модуль збирає метрики якості згенерованої документації та зберігає фінальний звіт у `report.json`, який спирається на конфігурації, визначені в `report.json`.
12
14
 
13
15
  ## Поведінка
14
16
 
15
- 1. Зчитує список файлів для аналізу з командного рядка.
17
+ 1. Зчитує список файлів для аналізу з аргументів командного рядка.
16
18
  2. Для кожного файлу зчитує його вміст.
17
- 3. Генерує документацію для файлу, використовуючи локальну модель. Результат кешується за хешем вмісту джерела.
18
- 4. Якщо генерація документації неможлива або не пройшла встановлений поріг якості, фіксує це як помилку або непідтримуваний файл.
19
- 5. Якщо документація пройшла поріг якості, вона передається для оцінки.
20
- 6. Оцінює згенеровану документацію за допомогою потужної хмарної моделі. Результат оцінки кешується за хешем вмісту джерела та документації.
21
- 7. Якщо оцінка неможлива, фіксує помилку оцінки.
22
- 8. Збирає результати для всіх файлів.
23
- 9. Обчислює звіт, включаючи загальну кількість файлів, кількість успішно згенерованих та оцінених, а також відсоток хибнопозитивних результатів (false-positive rate).
24
- 10. Зберігає повний звіт у файл `report.json` у каталозі кешу.
25
- 11. Виводить консольний звіт з ключовими показниками.
19
+ 3. Генерує документацію для файлу, використовуючи кеш за вмістом джерела.
20
+ 4. Якщо документація згенерована, перевіряє її якість за встановленим порогом.
21
+ 5. Якщо якість документації відповідає порогу, передає вміст джерела та згенеровану документацію для оцінки сильною моделлю.
22
+ 6. Оцінювач повертає вердикт (точний, загальний, неточний) з обґрунтуванням.
23
+ 7. Зберігає результати для кожного файлу.
24
+ 8. Агрегує результати: підраховує загальну кількість файлів, успішно згенерованих, пройшли перевірку, а також розподіл вердиктів серед тих, що пройшли перевірку.
25
+ 9. Формує звіт, який включає конфігурацію, підрахунки та відсотки помилкових спрацьовувань.
26
+ 10. Зберігає фінальний звіт у файл `report.json` у каталозі кешу.
27
+ 11. Виводить консольний звіт про результати вимірювання.
26
28
 
27
29
  ## Гарантії поведінки
28
30
 
@@ -3,50 +3,50 @@ type: JS Module
3
3
  title: docgen-scan.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-scan.mjs
5
5
  docgen:
6
- crc: 4c17838f
6
+ crc: f01465d8
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- isSourceFile перевіряє, чи є файл кодовим джерелом.
11
- docPathForSource обчислює шлях md-документа для кодового файлу.
12
- isDocCandidate перевіряє, чи підлягає файл документуванню.
13
- describeFile описує кодовий файл, включаючи шлях доки та стан застарілості.
14
- scanForDocFiles рекурсивно обходить дерево, повертаючи кандидати з інформацією про старілість.
15
- resolveRoot парсить аргументи, щоб визначити абсолютний корінь.
16
- runDocFilesScanCli сканує дерево і друкує JSON-масив усіх кодових файлів зі станом застарілості.
17
- runDocFilesCheckCli детектує застарілість для хук'ів, гейтів або інших режимів, повертаючи код виходу.
11
+ ## Огляд
12
+
13
+ Модуль аналізує кодову базу та пов'язану з нею документацію. Він визначає, які файли є джерелами за допомогою `isSourceFile` та знаходить відповідні шляхи документації за допомогою `docPathForSource`. Модуль перевіряє, чи не залишилися без зв'язку (сиротами) документи, використовуючи `scanOrphanedDocs`, та сканує файли документації за допомогою `scanForDocFiles`. Для роботи з кореневими каталогами використовується `resolveRoot`. Усі операції виконуються з механізмом перехоплення помилок (fail-safe), при цьому при певних збоях повертається `null` замість викидання винятків.
18
14
 
19
15
  ## Поведінка
20
16
 
21
- isSourceFile Обчислює, чи є файл кодовим джерелом.
22
- docPathForSource Обчислює шлях md-документа для кодового файлу.
23
- isDocCandidate Перевіряє, чи підлягає файл документуванню.
24
- describeFile Описує кодовий файл, включаючи шлях доки та стан застарілості.
25
- scanForDocFiles Рекурсивно обходить дерево, повертаючи кандидати з інформацією про старілість.
26
- resolveRoot Парсить аргументи, щоб визначити абсолютний корінь.
27
- runDocFilesScanCli Сканує дерево і друкує JSON-масив усіх кодових файлів зі станом застарілості.
28
- runDocFilesCheckCli Детектує застарілість для хук'ів, гейтів або інших режимів, повертаючи код виходу.
17
+ isSourceFile визначає, чи є ім'я файлу кодовим джерелом для документування.
18
+ docPathForSource обчислює шлях до відповідного MD-документа для заданого кодового файлу.
19
+ isDocCandidate визначає, чи підлягає певний файл документуванню, враховуючи розширення, статус тесту та ігнорування.
20
+ describeFile описує кодовий файл, надаючи його шлях, шлях до документації та стан застарілості.
21
+ scanOrphanedDocs знаходить MD-документи, які посилаються на кодові файли, що більше не існують.
22
+ scanForDocFiles рекурсивно обходить дерево і повертає список кодових файлів із їхнім станом застарілості, відфільтрований за ігноруванням Git.
23
+ resolveRoot парсить аргументи для визначення абсолютного кореня обходу, використовуючи поточну робочу директорію за замовчуванням.
24
+ runDocFilesScanCli сканує дерево і друкує JSON-масив усіх кодових файлів зі станом застарілості.
25
+ runDocFilesCheckCli виконує перевірку застарілості, підтримуючи режими для перевірки одного файлу, Git-гейту або звітів про знижену якість.
29
26
 
30
27
  ## Публічний API
31
28
 
32
- isSourceFile — перевіряє, чи є файл коду для документування.
33
- docPathForSource — обчислює шлях до документа для кодового файлу, розміщуючи його в теці `docs/` поруч із джерелом. Якщо шлях відносний, документ також відносний; якщо абсолютний, документ залишається абсолютним.
34
- isDocCandidate — визначає, чи підлягає кодовий файл документуванню: має правильне розширення, не є тестом, не знаходиться в ігнорованому списку, і не є кореневим системним документуванням.
35
- describeFile — надає опис кодового файлу: шлях до джерела, шлях до документа та стан застарілості за CRC.
36
- scanForDocFilesрекурсивно переглядає дерево від заданого кореня і повертає кодові файли разом зі станом застарілості.
37
- resolveRootпарсить аргумент `--root <dir>` з командного рядка; за замовчуванням використовує поточну робочу директорію.
38
- runDocFilesScanCliсканує дерево і виводить JSON-масив усіх кодових файлів із зазначенням їхнього стану застарілості.
39
- runDocFilesCheckCliвиконує перевірку застарілості для хуків та командного рядка через інструмент `doc-files check`.
40
- Режимице способи виконання:
41
- --hook — бере шлях до файлу з вводу JSON і перевіряє один файл.
42
- --git — перевіряє різницю в Git (`git diff --name-only HEAD`) з урахуванням порогу `--max` (за замовчуванням 50); якщо застарілості більше, не блокує (виходить з кодом 0 з попередженням).
43
- --degradedгенерує інформаційний звіт про документи, які мають оцінку нижче встановленого порогу (виходить з кодом 0).
44
- <paths…>використовується для визначення явних шляхів до джерел.
45
- Exit 2 повертається, якщо знайдено застарілі дані; повертається 0, якщо дані свіжі або пройдено перевищення порогу.
29
+ isSourceFile — визначає, чи є файл кодовим джерелом для створення документації.
30
+ docPathForSource — визначає шлях до відповідного MD-документа, розміщений у теці `docs/` відносно коду.
31
+ isDocCandidate — вирішує, чи повинен кодовий файл бути документований: має правильне розширення, не є тестом, не ігнорується та не є системним документом.
32
+ describeFile — надає опис кодового файлу, включаючи його шлях, шлях до документації та статус застарілості.
33
+ scanOrphanedDocsшукає документи, які посилаються на кодові файли, що більше не існують, перевіряючи лише згенеровані файли.
34
+ scanForDocFilesрекурсивно збирає всі кодові файли з дерева, визначаючи їхній статус застарілості, і відсіюючи ті, що ігноруються через `.gitignore`.
35
+ resolveRootвстановлює кореневу директорію для сканування, використовуючи аргумент командного рядка або поточну робочу директорію.
36
+ runDocFilesScanCliсканує дерево та виводить JSON-масив усіх кодових файлів зі статусом застарілості, дозволяючи фільтрувати лише застарілі або всі файли.
37
+ runDocFilesCheckCliвиконує перевірку застарілості для використання у хуках та командному інтерфейсі.
38
+
39
+ Режими:
40
+ --hookперевіряє один файл, отриманий з JSON через стандартний ввід.
41
+ --gitпорівнює файли у `git diff` та блокує процес, якщо знайдено більше за встановлений поріг застарілих файлів.
42
+ --degradedвиводить звіт про документи з низьким показником якості.
43
+ <paths…> — обробляє лише вказані шляхи-джерела.
44
+
45
+ Вихідний код 2 — вказує на знаходження застарілих файлів (для блокування хука).
46
+ Вихідний код 0 — вказує на відсутність застарілих файлів або проходження перевірки згідно з порогом.
46
47
 
47
48
  ## Гарантії поведінки
48
49
 
49
- - Read-only: файл не виконує операцій запису у файлову систему.
50
+ - Read-only: не виконує операцій запису (ФС/БД).
50
51
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
51
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
52
- - Не звертається до мережі.
52
+ - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
@@ -6,19 +6,20 @@ resource: npm/rules/doc-files/js/
6
6
 
7
7
  # npm/rules/doc-files/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [docgen-crc.mjs](docgen-crc.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------------------------------------------- | --------- |
11
+ | [docgen-crc.mjs](docgen-crc.md) | JS Module |
12
12
  | [docgen-extract-anchors.mjs](docgen-extract-anchors.md) | JS Module |
13
- | [docgen-extract.mjs](docgen-extract.md) | JS Module |
14
- | [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
15
- | [docgen-gen.mjs](docgen-gen.md) | JS Module |
16
- | [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
17
- | [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
18
- | [docgen-judge.mjs](docgen-judge.md) | JS Module |
19
- | [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
20
- | [docgen-scan.mjs](docgen-scan.md) | JS Module |
21
- | [lint.mjs](lint.md) | JS Module |
22
- | [units-js.mjs](units-js.md) | JS Module |
23
- | [units-rs.mjs](units-rs.md) | JS Module |
24
- | [units.mjs](units.md) | JS Module |
13
+ | [docgen-extract.mjs](docgen-extract.md) | JS Module |
14
+ | [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
15
+ | [docgen-gen.mjs](docgen-gen.md) | JS Module |
16
+ | [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
17
+ | [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
18
+ | [docgen-judge.mjs](docgen-judge.md) | JS Module |
19
+ | [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
20
+ | [docgen-scan.mjs](docgen-scan.md) | JS Module |
21
+ | [lint.mjs](lint.md) | JS Module |
22
+ | [run-lint.mjs](run-lint.md) | JS Module |
23
+ | [units-js.mjs](units-js.md) | JS Module |
24
+ | [units-rs.mjs](units-rs.md) | JS Module |
25
+ | [units.mjs](units.md) | JS Module |
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: JS Module
3
+ title: run-lint.mjs
4
+ resource: npm/rules/doc-files/js/run-lint.mjs
5
+ docgen:
6
+ crc: ba329b37
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 80
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Цей модуль надає CLI-обгортку для канонічного `lint-doc-files` (doc-files.mdc): детермінованого детектора застарілості файлових док (`<dir>/docs/<stem>.md`). При відсутності прапорців або при вказанні шляхів (`[paths…]`) виконується повний або точковий детекст застарілості. Якщо знайдено застарілі файли, повертається код виходу 1. Можливі режими: `--missing-only` звужує перевірку до відсутніх файлів. Прапорець `--json` виводить JSON-лістинг усіх кандидатів. Режими `--hook`, `--git` та `--degraded` делегують перевірку через `runDocFilesCheckCli` (hook-протокол: exit 2/0). Повний прогін здійснюється через `runStandardLint` (ключ `lint-doc-files`), тоді як хук/git/degraded форми використовують канон scripts.mdc, не генеруючи логів. Поведінка описується у (doc-files.mdc).
14
+
15
+ ## Поведінка
16
+
17
+ runLintDocFilesSteps виконує повний або точковий детект застарілості файлової документації (doc-files.mdc), повертаючи код виходу 1, якщо знайдено застарілі файли, або 0, якщо всі актуальні.
18
+ runLintDocFilesCli керує викликом лінтера doc-files.mdc: виконує повний/точковий детект, якщо не вказано `--json`, або повертає JSON-лістинг кандидатів, якщо вказано `--json`, або делегує перевірку через протоколи `--hook`, `--git`, `--degraded`.
19
+
20
+ ## Публічний API
21
+
22
+ runLintDocFilesSteps — Виконує повний або точковий пошук неактуальних (stale) файлів документації. Повертає код виходу 1, якщо знайдено неактуальні файли, і 0, якщо всі файли актуальні.
23
+ runLintDocFilesCli — Виконує перевірку файлів документації через інтерфейс командного рядка. У режимах hook/git/degraded виконує делегацію без логування. З опцією `--json` виконує сканування. В інших режимах виконує повний або точковий пошук, використовуючи логіку `runStandardLint` для ключа `lint-doc-files`.
24
+
25
+ ## Гарантії поведінки
26
+
27
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -23,8 +23,9 @@ import {
23
23
  resolveRoot,
24
24
  runDocFilesCheckCli,
25
25
  runDocFilesScanCli,
26
- scanForDocFiles
27
- } from '../js/docgen-scan.mjs'
26
+ scanForDocFiles,
27
+ scanOrphanedDocs
28
+ } from './docgen-scan.mjs'
28
29
 
29
30
  /**
30
31
  * Нормалізує шлях-кандидат до posix-шляху від кореня (null поза деревом).
@@ -73,15 +74,28 @@ export function runLintDocFilesSteps(argv) {
73
74
  let stale = described.filter(f => f.stale)
74
75
  if (missingOnly) stale = stale.filter(f => f.reason === 'missing')
75
76
 
76
- if (stale.length === 0) {
77
+ // Orphan-детект лише при повному скані (без явних шляхів); точковий — не релевантно
78
+ const orphans = paths.length === 0 ? scanOrphanedDocs(root) : []
79
+
80
+ let exitCode = 0
81
+ if (stale.length > 0) {
82
+ const list = stale.map(f => ` - ${f.sourcePath} (${f.reason})`).join('\n')
83
+ console.error(
84
+ `✗ doc-files: документація застаріла/відсутня для ${stale.length} файл(ів):\n${list}\n→ перегенеруй: npx @nitra/cursor fix-doc-files`
85
+ )
86
+ exitCode = 1
87
+ }
88
+ if (orphans.length > 0) {
89
+ const list = orphans.map(f => ` - ${f}`).join('\n')
90
+ console.error(
91
+ `✗ doc-files: сирітських доків (source видалено) ${orphans.length}:\n${list}\n→ очисти: npx @nitra/cursor fix-doc-files`
92
+ )
93
+ exitCode = 1
94
+ }
95
+ if (exitCode === 0) {
77
96
  console.log('✓ doc-files: усі файлові доки актуальні.')
78
- return 0
79
97
  }
80
- const list = stale.map(f => ` - ${f.sourcePath} (${f.reason})`).join('\n')
81
- console.error(
82
- `✗ doc-files: документація застаріла/відсутня для ${stale.length} файл(ів):\n${list}\n→ перегенеруй: npx @nitra/cursor fix-doc-files`
83
- )
84
- return 1
98
+ return exitCode
85
99
  }
86
100
 
87
101
  /**
@@ -2,7 +2,19 @@
2
2
  import { join, dirname, basename, extname } from 'node:path'
3
3
  import { existsSync, readdirSync } from 'node:fs'
4
4
 
5
- import { describeFile, isDocCandidate, isSourceFile, scanForDocFiles } from './docgen-scan.mjs'
5
+ import { describeFile, isDocCandidate, isSourceFile, scanForDocFiles, scanOrphanedDocs } from './js/docgen-scan.mjs'
6
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
7
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
8
+
9
+ /**
10
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
11
+ * → policy → mdc-refs); `lint()` нижче — lint-поверхня (детект застарілих файлових док), імпл інлайн тут.
12
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
13
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
14
+ */
15
+ export function run(ctx) {
16
+ return runStandardRule(import.meta.dirname, ctx)
17
+ }
6
18
 
7
19
  /** Дока живе у `<dir>/docs/<stem>.md`; повертає `<dir>/<stem>` для реверс-мапінгу. */
8
20
  const DOC_MD_RE = /(?:^|\/)docs\/[^/]+\.md$/u
@@ -89,14 +101,52 @@ function collectStale(files, cwd) {
89
101
  */
90
102
  export async function lint(files, cwd = process.cwd(), { readOnly = false, llmFix = false } = {}) {
91
103
  const stale = collectStale(files, cwd)
92
- if (stale.length === 0) return 0
93
- if (readOnly || !llmFix) return reportStale(stale)
104
+ // Orphan-детект тільки при повному скані; при точковому (files визначено) не релевантно
105
+ const orphans = files === undefined ? scanOrphanedDocs(cwd) : []
106
+
107
+ if (stale.length === 0 && orphans.length === 0) return 0
108
+ if (readOnly || !llmFix) {
109
+ if (stale.length > 0) reportStale(stale)
110
+ if (orphans.length > 0) {
111
+ const list = orphans.map(f => ` - ${f}`).join('\n')
112
+ process.stderr.write(
113
+ `✗ doc-files: сирітських доків (source видалено) ${orphans.length}:\n${list}\n→ очисти: npx @nitra/cursor fix-doc-files\n`
114
+ )
115
+ }
116
+ return 1
117
+ }
118
+
119
+ // fix-by-default: opportunistic-генерація stale + purge orphans.
120
+ // omlx недоступний → runGenerationBatch друкує причину й повертає !=0;
121
+ // purgeOrphanedDocs не залежить від LLM і виконується завжди.
122
+ if (stale.length > 0) {
123
+ process.stdout.write(`ℹ️ doc-files: ${stale.length} застарілих — пробую авто-фікс (omlx)…\n`)
124
+ }
125
+ const { runGenerationBatch, purgeOrphanedDocs } = await import('./js/docgen-files-batch.mjs')
126
+ if (stale.length > 0) {
127
+ await runGenerationBatch(stale, cwd, { headline: `📋 doc-files: генерація ${stale.length} файл(ів)` })
128
+ }
129
+ if (orphans.length > 0) {
130
+ const deleted = purgeOrphanedDocs(cwd)
131
+ if (deleted > 0) process.stdout.write(`🗑 doc-files: видалено ${deleted} сирітських доки(ів)\n`)
132
+ }
133
+
134
+ const stillStale = collectStale(files, cwd)
135
+ const stillOrphans = files === undefined ? scanOrphanedDocs(cwd) : []
136
+ if (stillStale.length === 0 && stillOrphans.length === 0) return 0
137
+ if (stillStale.length > 0) reportStale(stillStale)
138
+ if (stillOrphans.length > 0) {
139
+ const list = stillOrphans.map(f => ` - ${f}`).join('\n')
140
+ process.stderr.write(
141
+ `✗ doc-files: сирітських доків (source видалено) ${stillOrphans.length}:\n${list}\n→ очисти: npx @nitra/cursor fix-doc-files\n`
142
+ )
143
+ }
144
+ return 1
145
+ }
146
+
147
+ export { runLintDocFilesCli } from './js/run-lint.mjs'
94
148
 
95
- // fix-by-default: opportunistic-генерація через спільне ядро (preflight omlx →
96
- // батч із circuit-breaker'ом). omlx недоступний runGenerationBatch друкує причину
97
- // й повертає !=0; ми re-detect'имо й через reportStale віддаємо exit 1 (гейт тримається).
98
- process.stdout.write(`ℹ️ doc-files: ${stale.length} застарілих — пробую авто-фікс (omlx)…\n`)
99
- const { runGenerationBatch } = await import('./docgen-files-batch.mjs')
100
- await runGenerationBatch(stale, cwd, { headline: `📋 doc-files: генерація ${stale.length} файл(ів)` })
101
- return reportStale(collectStale(files, cwd))
149
+ if (isRunAsCli(import.meta.url)) {
150
+ // Standalone: bun rules/doc-files/main.mjs повний еквівалент `npx @nitra/cursor check doc-files`.
151
+ process.exitCode = await runRuleCli(import.meta.dirname)
102
152
  }
@@ -14,14 +14,14 @@ docgen:
14
14
  ## Поведінка
15
15
 
16
16
  1. Запуск правила.
17
- * Приймає контекст прогону.
18
- * Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
- * Повертає результат.
17
+ - Приймає контекст прогону.
18
+ - Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
+ - Повертає результат.
20
20
 
21
21
  2. Виконання у режимі CLI.
22
- * Викликається через оркестрацію CLI.
23
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
- * Виконує завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
22
+ - Викликається через оркестрацію CLI.
23
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ - Виконує завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
25
25
 
26
26
  ## Публічний API
27
27
 
@@ -6,6 +6,7 @@ resource: npm/rules/docker/
6
6
 
7
7
  # npm/rules/docker
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [fix.mjs](fix.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
+ | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,28 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/docker/main.mjs
5
+ docgen:
6
+ crc: 10e84989
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку на відповідність логіці JS-зацікавленостей, політикам та посиланням MDC. Запуск правила ініціюється через публічну функцію `run`.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки застосовує логіку, пов'язану з JS-зацікавленостями, політиками та посиланнями MDC.
19
+ 3. Якщо скрипт виконується як окрема утиліта, ініціюється повний запуск правила.
20
+
21
+ ## Публічний API
22
+
23
+ run — виконує послідовність перевірок: застосовує логіку, перевіряє аспекти JavaScript, застосовує політику та посилання MDC.
24
+ lint — виконує перевірку синтаксису та стилю коду, делегуючи складну логіку зовнішньому модулю.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -6,6 +6,6 @@ resource: npm/rules/docker/js/
6
6
 
7
7
  # npm/rules/docker/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
11
  | [lint.mjs](lint.md) | JS Module |
@@ -3,70 +3,42 @@ type: JS Module
3
3
  title: lint.mjs
4
4
  resource: npm/rules/docker/js/lint.mjs
5
5
  docgen:
6
- crc: 495d03ee
6
+ crc: bf935f19
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Модуль забезпечує декомпозицію структури Dockerfile для вилучення даних про багатостадійні збірки та залежності середовища. Функції, такі як `findDockerfilePaths` та `splitDockerfileStages`, використовуються для ідентифікації та розділення стадій збірки. Модуль надає інструменти для отримання підказок про виконання, включаючи визначення багатостадійного режиму (`getMultistageAndRuntimeHint`), компіляційних налаштувань (`getBunCompileHint`), та підказок про використання образу Nginx Alpine Slim (`getNginxAlpineSlimTagHint`). Додатково, він визначає необхідність роботи без прав root (`getNonRootRuntimeHint`). (docker.mdc)
11
+ ## Огляд
11
12
 
12
- ## Поведінка
13
-
14
- isDockerfileName
15
- Перевіряє, чи є вхідний рядок назвою Dockerfile або Containerfile.
16
-
17
- findDockerfilePaths
18
- Збирає абсолютні шляхи до Dockerfile або Containerfile від заданого кореня репозиторію, враховуючи виключені шляхи.
19
-
20
- parseFromStages
21
- Витягує інструкції FROM з вмісту файлу.
22
-
23
- splitDockerfileStages
24
- Розбиває вміст Dockerfile на окремі стадії на основі інструкцій FROM.
25
-
26
- getMultistageAndRuntimeHint
27
- Перевіряє, чи має Dockerfile мінімум дві інструкції FROM і чи є фінальний образ дозволеним runtime-образом (docker.mdc).
13
+ Модуль аналізує файли `Dockerfile` та `Containerfile` у репозиторії, використовуючи `isDockerfileName` та `findDockerfilePaths` для ідентифікації конфігурацій. Він розбиває знайдені файли на етапи за допомогою `parseFromStages` та `splitDockerfileStages`. Модуль перевіряє конфігурацію, використовуючи `check` та `lint`, щоб оцінити відповідність стандартам, враховуючи дані з `package.json`. Він визначає інформацію про багатоетапну збірку, теги образів та права користувача, відповідно до вимог (docker.mdc).
28
14
 
29
- getBunCompileHint
30
- Перевіряє наявність інструкцій `bun install` та відсутності `bun build --compile` для виявлення необхідності компіляції бінарника (docker.mdc).
31
-
32
- getNginxAlpineSlimTagHint
33
- Перевіряє, чи містить інструкція FROM для образу nginx потрібний тег `alpine-slim` (docker.mdc).
34
-
35
- getNonRootRuntimeHint
36
- Перевіряє, чи присутня інструкція USER у фінальній стадії і чи не використовується `root` або `0` для запуску (docker.mdc).
37
-
38
- check
39
- Запускає перевірки Dockerfile через hadolint, включаючи перевірки multistage, компіляції, non-root, тегів nginx та загальну валідацію.
40
-
41
- readNearestDependencies
42
- Читає залежності з найближчого package.json, розташованого у каталогах Dockerfile або вище.
15
+ ## Поведінка
43
16
 
44
- checkDockerfile
45
- Перевіряє індивідуальний Dockerfile/Containerfile на наявність інструкцій, пов'язаних з mirror.gcr.io, multistage, компіляції, non-root, тегів nginx та виконує перевірку через hadolint.
17
+ isDockerfileName визначає, чи є наданий шлях назвою Dockerfile або Containerfile.
18
+ findDockerfilePaths збирає відсортований список абсолютних шляхів до всіх Dockerfile/Containerfile, ігноруючи вказані шляхи каталогів.
19
+ parseFromStages витягує список усіх інструкцій `FROM <image>` з вмісту Dockerfile/Containerfile.
20
+ splitDockerfileStages розбиває вміст Dockerfile/Containerfile на окремі етапи (stages) на основі інструкцій `FROM`.
21
+ getMultistageAndRuntimeHint перевіряє, чи відповідає структура Dockerfile вимогам multistage build та дозволеним образам для фінального runtime (docker.mdc).
22
+ getBunCompileHint перевіряє, чи виконано необхідну компіляцію застосунку у бінарник для bun-проєктів, якщо фінальний образ — alpine (docker.mdc).
23
+ getNginxAlpineSlimTagHint перевіряє, чи використовується тег `alpine-slim` для nginx-образів (docker.mdc).
24
+ getNonRootRuntimeHint перевіряє, чи має фінальний stage інструкцію `USER <non-root>` для забезпечення не превілейованого образу (docker.mdc).
25
+ check перевіряє всі знайдені Dockerfile/Containerfile, виконуючи перевірки на відповідність стандартам, включаючи hadolint (docker.mdc).
26
+ lint оркеструє обхід репозиторію та викликає `check` для всіх знайдених Dockerfile/Containerfile.
46
27
 
47
28
  ## Публічний API
48
29
 
49
- isDockerfileName — перевіряє наявність файлів `Dockerfile` або `Containerfile` у назві.
50
- findDockerfilePaths — збирає повні шляхи до файлів `Dockerfile` або `Containerfile` від поточної робочої директорії.
51
- parseFromStages — витягує всі інструкції `FROM <image>` з вмісту файлів.
52
- splitDockerfileStages — розділяє файл `Dockerfile` на послідовні етапи за інструкціями `FROM`. Повертає порожній масив, якщо інструкції `FROM` відсутні.
53
- getMultistageAndRuntimeHint — перевіряє вимоги до структури Dockerfile:
54
- multistage — вимагає мінімум два етапи `FROM`.
55
- фінальний FROM — перевіряє, чи дозволений образ у `docker.mdc` (alpine, scratch, debian slim, php, python, nginx, openresty, тощо). Для проєктів з нативним .node-аддоном дозволено `mirror.gcr.io/oven/bun:*` (bun-рантайм).
56
- getBunCompileHintперевіряє наявність вимоги "компіляції в бінарник" для bun-проєктів на бекенд-рантаймах.
57
- Тригерперевіряє, чи присутній крок `bun install` або `bun i` у Dockerfile.
58
- Тригерперевіряє, чи фінальний образ `mirror.gcr.io/library/alpine:*` (виключаючи фронтенд nginx/openresty).
59
- getNginxAlpineSlimTagHint — перевіряє, чи містить `FROM` для nginx-образу (`mirror.gcr.io/nginxinc/nginx-unprivileged`) тег `alpine-slim` (`docker.mdc`).
60
- getNonRootRuntimeHint — перевіряє вимогу "non-root" у фінальному runtime-етапі (`docker.mdc`).
61
- Очікування — перевіряє, чи містить build stage інструкцію `bun build --compile`.
62
- Очікування — перевіряє, чи відсутні виклики `bun` у фінальному етапі (залишкові інструменти збірки).
63
- Очікування — перевіряє, чи містить фінальний етап інструкцію `USER <name|uid>`.
64
- Очікування — перевіряє, чи користувач у фінальному етапі не є `root` і не дорівнює `0`.
65
- check — виконує перевірку через hadolint (`docker.mdc`).
30
+ isDockerfileName — визначає, чи є файл `Dockerfile` або `Containerfile` у поточному каталозі.
31
+ findDockerfilePaths — збирає повні шляхи до файлів `Dockerfile` або `Containerfile` від кореня робочого каталогу.
32
+ parseFromStages — витягує всі образи, зазначені в інструкціях `FROM` у файлі.
33
+ splitDockerfileStages — розділяє вміст файлу на окремі етапи згідно з інструкціями `FROM`.
34
+ getMultistageAndRuntimeHint — оцінює відповідність структури файлу: мінімум два етапи `FROM` та відповідність базових образів списку дозволених у `docker.mdc` (з додатковим дозволом для `bun` у випадку нативного `.node-аддону`).
35
+ getBunCompileHintперевіряє, чи вимагає проєкт на базі Bun компіляції в бінарний файл для бекенд-рантайму.
36
+ getNginxAlpineSlimTagHint — перевіряє, чи використовується тег `alpine-slim` для образів Nginx, як зазначено в `docker.mdc`.
37
+ getNonRootRuntimeHintперевіряє, чи встановлено користувача, відмінного від `root` (не `0`), у фінальному етапі виконання, згідно з `docker.mdc`.
38
+ checkвиконує статичний аналіз файлу `Dockerfile`/`Containerfile` за допомогою hadolint (`docker.mdc`).
39
+ lintзапускає стандартний лінтер для Docker-файлів через адаптер `n-cursor lint docker`.
66
40
 
67
41
  ## Гарантії поведінки
68
42
 
69
- - Read-only: файл не виконує операцій запису у файлову систему.
43
+ - Read-only: не виконує операцій запису (ФС/БД).
70
44
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
71
- - За невдалої перевірки повертає `false`/`null` замість винятку.
72
- - Не звертається до мережі.
@@ -1,6 +1,7 @@
1
1
  /** @see ./docs/lint.md */
2
2
  import { readFile } from 'node:fs/promises'
3
3
  import { basename, dirname, join } from 'node:path'
4
+ import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
4
5
 
5
6
  import { getMirrorGcrHint, getFromImageToken } from '../lib/docker-mirror.mjs'
6
7
  import { getNativeAddonDeps, getNativeAddonNoCompileHint } from '../lib/docker-native-addon.mjs'
@@ -369,3 +370,13 @@ async function checkDockerfile(reporter, root, abs) {
369
370
  fail(`${rel} (${via})${detail}`)
370
371
  }
371
372
  }
373
+
374
+ /**
375
+ * Оркестраторний адаптер `n-cursor lint docker`: обгортає `check()` у `runStandardLint` (лок).
376
+ * @param {string[] | undefined} _files ігнорується (whole-repo обхід)
377
+ * @param {string} [cwd] корінь
378
+ * @returns {Promise<number>} exit code
379
+ */
380
+ export function lint(_files, cwd = process.cwd()) {
381
+ return runStandardLint(import.meta.dirname, () => check(cwd))
382
+ }