@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,158 +3,25 @@ type: JS Module
3
3
  title: list-rule-ids.mjs
4
4
  resource: npm/scripts/lib/list-rule-ids.mjs
5
5
  docgen:
6
- crc: 5ef1ead5
6
+ crc: d8b3ea73
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Модуль `list-rule-ids.mjs` — невелика бібліотечна утиліта, призначена для перебору директорій-правил у каталозі `npm/rules/` та повернення відсортованого алфавітно списку ідентифікаторів правил, які реально містять виконуваний модуль `fix.mjs`.
11
+ ## Огляд
10
12
 
11
- Логіка модуля побудована навколо архітектурної інваріанти проєкту: після так званої «атомарної міграції» кожне валідне правило **зобов'язане** мати файл `fix.mjs` у власній директорії `rules/<id>/`. Будь-яка піддиректорія без `fix.mjs` вважається або «не-правилом» (службова тека), або заглушкою-чернеткою і ігнорується. Прихованих директорій (імена, що починаються з `.`) також не існує в результаті.
13
+ Перебирає директорії у `rules/` та фільтрує їх, вибираючи лише ті, що містять єдиний канонічний entrypoint (`rules/<id>/main.mjs`), згідно з ADR 2026-06-21. Функція повертає список ідентифікаторів правил, які відповідають цьому канону. Операція є лише для читання файлової системи.
12
14
 
13
- Додатково модуль підтримує опційне точкове фільтрування одним конкретним `id`, що використовується CLI-флагом `--rule abie` для прогону команд у режимі «тільки одне правило».
15
+ ## Поведінка
14
16
 
15
- Модуль повністю асинхронний (використовує `node:fs/promises`), не має зовнішніх npm-залежностей і не виконує жодних побічних ефектів окрім читання директорії та перевірки наявності файлу через `existsSync`.
17
+ 1. Зчитує список усіх каталогів у директорії, що містить правила.
18
+ 2. Фільтрує цей список, залишаючи лише каталоги, які не починаються з крапки.
19
+ 3. Для кожного каталогу перевіряє, чи існує у ньому файл `main.mjs`.
20
+ 4. Фільтрує список, залишаючи лише ті каталоги, які містять файл `main.mjs`.
21
+ 5. Якщо надано фільтр, додатково фільтрує список, залишаючи лише той ID, що збігається з фільтром.
22
+ 6. Сортує отримані ID в алфавітному порядку.
23
+ 7. Повертає відсортований список ID правил.
16
24
 
17
- ## Експорти / API
25
+ ## Гарантії поведінки
18
26
 
19
- Файл експортує одну іменовану функцію:
20
-
21
- | Експорт | Тип | Призначення |
22
- | ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------- |
23
- | `listRuleIds` | `async function` | Повертає `Promise<string[]>` зі списком id правил, відфільтрованим за наявністю `fix.mjs` і опційним рівнянням до конкретного id. |
24
-
25
- Експорту за замовчуванням немає.
26
-
27
- ## Функції
28
-
29
- ### `listRuleIds(bundledRulesDir, filter)`
30
-
31
- #### Сигнатура
32
-
33
- ```js
34
- export async function listRuleIds(bundledRulesDir, filter)
35
- ```
36
-
37
- JSDoc-типи:
38
-
39
- ```
40
- @param {string} bundledRulesDir — абсолютний шлях до `npm/rules/`
41
- @param {string} [filter] — id одного правила (через `--rule abie`)
42
- @returns {Promise<string[]>} — відсортовані алфавітно id
43
- ```
44
-
45
- #### Параметри
46
-
47
- - **`bundledRulesDir`** (`string`, обовʼязковий) — абсолютний шлях до кореневої теки правил, найчастіше `npm/rules/` (наприклад, `/path/to/repo/npm/rules`). Передбачається, що шлях існує і є директорією; модуль не валідує його окремо — будь-яка помилка з `fs.readdir` пробрасується далі промісом.
48
- - **`filter`** (`string | undefined`, опційний) — точна назва правила, до якої потрібно звузити список. Якщо параметр не передано (`undefined`), повертаються всі знайдені id. Якщо передано, у результат потрапляють лише ті id, що _точно_ рівні `filter`. Часткові збіги, регулярні вирази або кейс-незалежність не підтримуються.
49
-
50
- #### Повертає
51
-
52
- `Promise<string[]>` — масив рядків-ідентифікаторів правил, відсортованих алфавітно за допомогою `Array.prototype.toSorted` із компаратором `a.localeCompare(b)`. Сортування _стабільне_ для оригінального методу і коректне для Unicode-локалей.
53
-
54
- Можливі сценарії результату:
55
-
56
- - Порожній масив `[]` — якщо в `bundledRulesDir` немає жодної директорії з `fix.mjs`, або якщо `filter` не збігається з жодним наявним id.
57
- - Масив з одного елемента — типово при заданому `filter`.
58
- - Повний відсортований список усіх правил — у випадку відсутності `filter`.
59
-
60
- #### Алгоритм / послідовність кроків
61
-
62
- 1. Викликається `readdir(bundledRulesDir, { withFileTypes: true })` — отримуємо масив `Dirent`-обʼєктів (а не просто рядків імен), що дає змогу одразу перевіряти тип запису без додаткових `stat`-викликів.
63
- 2. Залишаються лише записи, для яких одночасно:
64
- - `e.isDirectory()` — це саме директорія;
65
- - `!e.name.startsWith('.')` — імʼя не починається з крапки (відсікаються приховані теки на кшталт `.git`, `.cache`, тощо).
66
- 3. Записи перетворюються на голі імена (`.map(e => e.name)`).
67
- 4. Фільтрація на наявність `fix.mjs` — для кожного `id` синхронно перевіряється `existsSync(join(bundledRulesDir, id, 'fix.mjs'))`. Директорії без цього файлу відсіюються як «not-a-rule або заглушка».
68
- 5. Фільтрація за `filter` — якщо параметр визначений, залишаються лише id, рівні `filter`; інакше пропускаються всі.
69
- 6. Сортування `toSorted((a, b) => a.localeCompare(b))` — повертає новий масив без мутації проміжного.
70
-
71
- #### Side effects
72
-
73
- - **Дискові читання**: `readdir` (асинхронний обхід директорії) та `existsSync` (синхронні перевірки наявності файлу для кожного кандидата). Винятки I/O пробрасуються відхиленим промісом.
74
- - **Жодних записів, мережевих викликів, мутацій глобального стану, логування** — функція є read-only і чистою щодо побічних ефектів окрім згаданих читань ФС.
75
- - Використання `existsSync` у циклі — це _синхронні_ виклики всередині асинхронної функції; вони виконуються послідовно, але без `await`. Для типового розміру каталогу `npm/rules/` (десятки правил) це непомітна вартість.
76
-
77
- #### Гранітні випадки
78
-
79
- - Якщо `bundledRulesDir` не існує — `readdir` відхиляє проміс з `ENOENT`.
80
- - Якщо в директорії є символічні посилання — поведінка залежить від того, що повертає `Dirent.isDirectory()`; ця функція покладається на штатну семантику Node.js.
81
- - Якщо `filter` переданий як порожній рядок `''` — він _не_ є `undefined`, тому фільтр буде застосовано (`id === ''`), і результат майже напевно буде порожнім.
82
- - Файл `fix.mjs` як директорія: малоймовірний випадок, але `existsSync` поверне `true` для будь-якого існуючого запису з цим імʼям; модуль не розрізняє файл і теку.
83
-
84
- ## Залежності
85
-
86
- ### Вбудовані модулі Node.js
87
-
88
- | Модуль | Імпортований символ | Використання |
89
- | ------------------ | ------------------- | ------------------------------------------------------------ |
90
- | `node:fs` | `existsSync` | Синхронна перевірка наявності `fix.mjs` у кожному кандидаті. |
91
- | `node:fs/promises` | `readdir` | Асинхронний обхід `bundledRulesDir` з `withFileTypes: true`. |
92
- | `node:path` | `join` | Безпечне зʼєднання сегментів шляху до `fix.mjs`. |
93
-
94
- ### Зовнішні npm-залежності
95
-
96
- Немає.
97
-
98
- ### Внутрішні залежності
99
-
100
- Файл не імпортує жодних інших модулів проєкту. Сам по собі він використовується як бібліотечна функція з інших скриптів у `npm/scripts/` (CLI-обгортки, які приймають флаг `--rule`).
101
-
102
- ## Потік виконання / Використання
103
-
104
- ### Контекст у проєкті
105
-
106
- `listRuleIds` — це фундамент будь-якого скрипту, який «робить щось для кожного правила»: лінт, авто-фікс, генерація звіту, перевірка покриття, нормалізація ADR тощо. Замість того щоб кожному скрипту самостійно перелічувати теки в `npm/rules/`, всі вони викликають цю функцію та отримують однаковий, відсортований, відфільтрований список — це гарантує детермінованість порядку обробки правил.
107
-
108
- Архітектурно файл підкріплює інваріант «`fix.mjs` обовʼязковий»: будь-яка тека без нього автоматично невидима для всіх споживачів. Це дає змогу тримати у `rules/` допоміжні підтеки (наприклад, шаблони, шаред-файли) без ризику, що вони будуть оброблені як правило.
109
-
110
- ### Приклад використання
111
-
112
- ```js
113
- import { listRuleIds } from './lib/list-rule-ids.mjs'
114
- import { resolve } from 'node:path'
115
-
116
- const bundledRulesDir = resolve(import.meta.dirname, '../../rules')
117
-
118
- // 1. Всі правила.
119
- const all = await listRuleIds(bundledRulesDir)
120
- // → ['abie', 'changelog', 'feedback', ...]
121
-
122
- // 2. Тільки одне правило (з CLI-флагу --rule abie).
123
- const ruleFlag = process.argv.includes('--rule') ? process.argv[process.argv.indexOf('--rule') + 1] : undefined
124
-
125
- const subset = await listRuleIds(bundledRulesDir, ruleFlag)
126
- // → ['abie'] якщо ruleFlag === 'abie' і таке правило існує
127
- // → [] якщо ruleFlag не відповідає жодному правилу
128
- ```
129
-
130
- ### Інтеграція з CLI
131
-
132
- Типовий патерн виклику в скриптах проєкту:
133
-
134
- 1. Скрипт парсить `process.argv` (часто через `mri`/`minimist` або вручну), отримує опційний `--rule <id>`.
135
- 2. Викликає `listRuleIds(rulesDir, ruleFromArgv)` і чекає на результат.
136
- 3. Ітерується по отриманому масиву і виконує цільову дію (fix/check/коверідж) для кожного id.
137
-
138
- ### Послідовність виконання при виклику
139
-
140
- ```
141
- listRuleIds(dir, filter)
142
-
143
- ├─ readdir(dir, withFileTypes:true) ── async ──▶ [Dirent...]
144
-
145
- ├─ .filter(isDirectory && !startsWith('.'))
146
- ├─ .map(e => e.name)
147
- ├─ .filter(existsSync(<id>/fix.mjs)) ◀── sync I/O loop
148
- ├─ .filter(filter === undefined || id === filter)
149
- ├─ .toSorted(localeCompare)
150
-
151
-
152
- Promise<string[]> (відсортовані id)
153
- ```
154
-
155
- ### Очікувані помилки
156
-
157
- - `ENOENT` / `ENOTDIR` від `readdir` — якщо переданий `bundledRulesDir` неіснуючий або не є директорією. Викликач має або переконатися в коректності шляху перед викликом, або обгорнути виклик у `try/catch`.
158
- - `EACCES` — якщо немає прав на читання теки.
159
-
160
- Усі інші помилки (відсутність окремого `fix.mjs`, відсутність відповідності `filter`) семантично не є помилками — вони лише звужують повернений масив.
27
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -3,30 +3,26 @@ type: JS Module
3
3
  title: read-n-cursor-config-lite.mjs
4
4
  resource: npm/scripts/lib/read-n-cursor-config-lite.mjs
5
5
  docgen:
6
- crc: a5fb0592
6
+ crc: a38ac2f4
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Цей файл читає файл `.n-cursor.json`, що містить список правил для конфігурації. Він повертає цей список, щоб `fix.mjs` міг використовувати правила для визначення конфігурації. Це забезпечує базове читання конфігурації правил для запуску `fix.mjs` з командного рядка.
11
+ ## Огляд
10
12
 
11
- ## Поведінка
13
+ Модуль надає легкий, лише для читання, інтерфейс для парсингу конфігурації `.n-cursor.json`. Він призначений для ізольованих, окремих викликів `check.mjs`. Модуль визначає стан кожного правила, ґрунтуючись на вмісті `.n-cursor.json`. Якщо файл відсутній, правило вважається активним (поведінка "open by default"). Якщо файл присутній, стан правила залежить від списків `rules` та `disableRules` у конфігурації. Модуль повертає об'єкт, що містить списки активних та вимкнених правил.
12
14
 
13
- **readNCursorConfigLite**
14
- Зчитує конфігурацію з файлу `.n-cursor.json`. Повертає об'єкт з інформацією про правила та вимкнені правила. Якщо файл відсутній, повертає конфігурацію з порожнім масивом правил.
15
+ ## Поведінка
15
16
 
16
- **isRuleEnabled**
17
- Перевіряє, чи правило з активним статусом згідно з конфігурацією. Повертає `true`, якщо файл відсутній, правило вимкнено в `disable-rules` або присутнє в `rules`. Повертає `false` в іншому випадку.
17
+ Поведінка
18
+ readNCursorConfigLite читає конфігураційний файл .n-cursor.json у вказаному каталозі, повертаючи стан його існування та списки дозволених і вимкнених правил.
19
+ isRuleEnabled визначає, чи має бути виконане правило, виходячи зі стану конфігураційного файлу та ID правила.
18
20
 
19
21
  ## Публічний API
20
22
 
21
- - readNCursorConfigLite — Завантажує конфігурацію курсора.
22
- - isRuleEnabled — Перевіряє статус активності правила.
23
+ readNCursorConfigLite — зчитує базові налаштування курсора з конфігурації.
24
+ isRuleEnabled — визначає, чи діє певне правило на основі конфігурації. Якщо конфігурація відсутня, правило вважається активним за замовчуванням. Якщо правило явно вимкнено, воно не діє. Якщо правило визначено у списку правил, воно діє. В іншому випадку, правило не діє.
23
25
 
24
26
  ## Гарантії поведінки
25
27
 
26
- - Якщо файл `.n-cursor.json` відсутній, вважається, що всі правила включені.
27
- - Якщо файл `.n-cursor.json` існує, але поле `rules` порожнє, вважається, що всі правила включені.
28
- - Якщо файл `.n-cursor.json` існує і має поле `rules`, але поле `rules` порожнє, вважається, що всі правила включені.
29
- - Якщо правило вказане в полі `disable-rules`, воно вимкнено.
30
- - Повертає `false` якщо файл `.n-cursor.json` відсутній або недійсний.
31
- - Повертає `null` якщо не вдалося прочитати файл `.n-cursor.json`.
32
- - Не використовує кешування.
28
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -3,27 +3,27 @@ type: JS Module
3
3
  title: run-lint-step.mjs
4
4
  resource: npm/scripts/lib/run-lint-step.mjs
5
5
  docgen:
6
- crc: 5932fa98
6
+ crc: f37a61b9
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Цей файл забезпечує спільний хелпер для запуску окремих кроків у ланцюжку linting, що використовується CLI-обгортками. Він імітує прямий виклик команд у shell, логуючи команди та перенаправляючи stdout/stderr на користувацькі stream-и. Це дозволяє уникнути дублювання обгорток у різних `rules/<id>/js/lint.mjs` файлах.
11
+ Спільний хелпер для CLI-обгорток `lint-<rule>`. Він запускає один крок ланцюжка з логуванням команди та прокидає stdout/stderr на користувацькі stream (`stdio: 'inherit'`). Це дозволяє rule-адаптерам `n-cursor lint <rule>` уникнути дублювання логіки обгортки у файлах `rules/<id>/js/lint.mjs`. Функція не виконує операцій з файловою системою чи базою даних.
10
12
 
11
13
  ## Поведінка
12
14
 
13
- 1. Записує в лог повідомлення про початок виконання кроку ланцюжка з описом команди та її аргументів.
14
- 2. Визначає шлях до виконуваного файлу команди на основі її імені.
15
- 3. Якщо шлях не знайдено в системному PATH, записує повідомлення про помилку та повертає код 127.
16
- 4. Запускає визначену команду з заданими аргументами, передаючи стандартний потік введення/виведення (stdio) потокам користувача.
17
- 5. Якщо команда завершилася з помилкою, записує повідомлення про помилку та повертає код 1.
18
- 6. Якщо команда завершилася успішно, повертає код виходу дочірнього процесу, який дорівнює 0, якщо все добре, або 1, якщо виникла помилка.
15
+ 1. Викликається `runLintStep` для запуску одного кроку ланцюжка лінтування.
16
+ 2. Виводиться у консоль повідомлення про запуск команди з вказаним заголовком.
17
+ 3. Визначається повний шлях до команди.
18
+ 4. Якщо повний шлях до команди не знайдено в PATH, виводиться повідомлення про помилку, і функція повертає код 127.
19
+ 5. Запускається дочірній процес з успадкованими потоками виводу та помилки.
20
+ 6. Якщо виникає помилка при запуску процесу, виводиться повідомлення про помилку, і функція повертає код 1.
21
+ 7. Якщо процес успішно запущено, функція повертає код виходу дочірнього процесу.
19
22
 
20
23
  ## Публічний API
21
24
 
22
- runLintStep — запускає процес linting та перевіряє його успішність.
25
+ runLintStep — запускає один етап перевірки коду, знаходячи відповідну команду в системному шляху та виконуючи її з передаченим вхідно-вихідним потоком.
23
26
 
24
27
  ## Гарантії поведінки
25
28
 
26
- - Запускає один крок ланцюжка linting.
27
- - Перенаправляє stdout та stderr на користувацькі stream-и (stdio: 'inherit').
28
- - Не використовує кешування.
29
- - Не має внутрішніх приватних імен.
29
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: run-lint.mjs
4
+ resource: npm/scripts/lib/run-lint.mjs
5
+ docgen:
6
+ crc: dd80d058
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль керує вибором та виконанням правил лінтування. Він визначає набір правил для лінтування, спираючись на конфігурації `meta.json` та `.n-cursor.json`. Публічна функція `selectLintRules` вибирає та сортує ці правила на основі їхньої лінт-поверхні. Публічна функція `runLint` ініціює виконання визначеного набору правил, перевіряючи змінені файли або весь репозиторій.
14
+
15
+ ## Поведінка
16
+
17
+ selectLintRules вибирає і алфавітно сортує ідентифікатори правил для лінтування на основі їхньої лінт-поверхні та наявності в активних конфігураціях.
18
+ runLint запускає лінт-оркестрацію, виконуючи перевірку змінених файлів або повний прогін репозиторію, залежно від наданих опцій.
19
+
20
+ ## Публічний API
21
+
22
+ selectLintRules — обирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
23
+ runLint — ініціює процес лінтування.
24
+ full — сканує весь репозиторій, порівнюючи його з початковим станом.
25
+ readOnly — лише виявляє проблеми без внесення змін.
26
+ rules — виконує повне сканування репозиторію, застосовуючи лише вказаний набір правил.
27
+
28
+ ## Гарантії поведінки
29
+
30
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -3,22 +3,26 @@ type: JS Module
3
3
  title: run-rule-cli.mjs
4
4
  resource: npm/scripts/lib/run-rule-cli.mjs
5
5
  docgen:
6
- crc: 264e7ab0
7
- score: 100
6
+ crc: 1251c4d0
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 95
8
9
  ---
9
10
 
10
- Файл є автономним CLI-запускачем для одного правила. Він друкує звіт про перевірку та повертає агрегований код виходу. Whitelist-гейту тут немає: гейтинг активних правил живе виключно у `resolveCheckRuleIds` (селекція за `.n-cursor.json`), а прямий запуск файлу правила — свідома debug/override-дія, тож виконується беззастережно.
11
+ ## Огляд
12
+
13
+ Standalone CLI runner для одного правила. Викликається з `rules/<id>/check.mjs` у блоці `if (import.meta.main)`, що робить його повним еквівалентом `bun rules/<id>/check.mjs` або `npx @nitra/cursor fix <id>`. Цей запуск є свідомим (debug / override) і виконується без whitelist-гейту. Ініціалізує кеш для проходження файлової системи та виконує стандартну перевірку, друкуючи summary результату та повертаючи aggregated exit-code.
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Викликається для запуску правила.
15
- 2. Друкує повідомлення про перевірку правила.
16
- 3. Використовує кеш для перевірки.
17
- 4. Викликає функцію для виконання стандартного правила з кешем.
18
- 5. Повертає агрегований код виходу.
17
+ 1. Викликається для виконання одного правила у режимі командного рядка.
18
+ 2. Визначається ідентифікатор правила на основі шляху до директорії правила.
19
+ 3. Виводиться повідомлення про початок перевірки для цього правила.
20
+ 4. Ініціалізується кеш для проходження файлової системи.
21
+ 5. Виконується стандартна перевірка для правила, використовуючи ініціалізований кеш.
22
+ 6. Виводиться підсумок результату перевірки.
23
+ 7. Повертається код виходу, що відображає успішність або наявність порушень.
19
24
 
20
25
  ## Гарантії поведінки
21
26
 
22
- - Read-only: файл не виконує операцій запису у файлову систему.
27
+ - Read-only: не виконує операцій запису (ФС/БД).
23
28
  - Кешує результати в межах одного прогону.
24
- - Не звертається до мережі.
@@ -3,24 +3,43 @@ type: JS Module
3
3
  title: run-standard-lint.mjs
4
4
  resource: npm/scripts/lib/run-standard-lint.mjs
5
5
  docgen:
6
- crc: e7e3f0ae
6
+ crc: 2b275963
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
7
9
  ---
8
10
 
9
- Файл забезпечує централізовану точку запуску для підкоманд `lint-<rule>` у `@nitra/cursor`. Він серіалізує та дедублює запуски, використовуючи `withLock`, щоб гарантувати узгодженість та ефективність. Це дозволяє легко інтегрувати нові правила та обробляти крос-cutting концерни, не вносячи змін у окремі файли правил.
11
+ ## Огляд
12
+
13
+ Спільна точка входу для канонічних `lint-<rule>` підкоманд `@nitra/cursor`. Файл серіалізує та дедуплікує запуски лінту через `withLock`. `ruleId` визначається зі шляху незалежно від глибини виклику (наприклад, `rules/<id>`). Це дозволяє уніфікувати крос-cutting концерни. Інтеграція з боку правила виглядає так:
14
+
15
+ - import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
16
+ -
17
+ - async function runLintFooSteps { ... }
18
+ -
19
+ - export function lint { return runStandardLint }
10
20
 
11
21
  ## Поведінка
12
22
 
13
- runLintFooCli: Запускає лінт для правила, використовуючи `runStandardLint`.
14
- runStandardLint: Серіалізує та дедуплікує запуск лінту, використовуючи блокування. Визначає ідентифікатор правила з шляху.
23
+ lint: Викликає стандартизований лінт, використовуючи шлях каталогу правила для визначення його ідентифікатора.
24
+ runStandardLint: Серіалізує та дедуплікує запуск лінту для заданого правила, використовуючи ідентифікатор, виведений зі шляху каталогу правила.
15
25
 
16
26
  ## Публічний API
17
27
 
18
- - runLintFooCli Перевіряє код на відповідність стандартам Foo CLI.
19
- - runStandardLint — Перевіряє код на відповідність загальним стандартам кодування.
28
+ lintє спільною точкою входу для канонічних `lint-<rule>` підкоманд `@nitra/cursor`. Він ініціює серіалізацію та дедуплікацію запусків лінтингу для вказаних файлів, забезпечуючи централізоване управління крос-cutting концернами.
29
+
30
+ runStandardLint — виконує стандартний лінтинг у директорії, приймаючи контекст директорії та функцію, що описує кроки лінтингу.
31
+
32
+ Приклад інтеграції:
33
+
34
+ ```js
35
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
36
+
37
+ async function runLintFooSteps { ... }
38
+
39
+ export function lint { return runStandardLint }
40
+ ```
20
41
 
21
42
  ## Гарантії поведінки
22
43
 
23
- - Приймає `ruleId` з шляху файлу.
24
- - Створює блокування з іменем `lint-<ruleId>`.
25
- - Використовує попередньо збережені результати для уникнення повторного виконання.
26
- - Повертає результат виконання.
44
+ - Read-only: не виконує операцій запису (ФС/БД).
45
+ - Кешує результати в межах одного прогону.
@@ -3,23 +3,24 @@ type: JS Module
3
3
  title: run-standard-rule.mjs
4
4
  resource: npm/scripts/lib/run-standard-rule.mjs
5
5
  docgen:
6
- crc: c1ae8f0e
7
- score: 90
6
+ crc: 0c3b2e60
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 70
8
9
  ---
9
10
 
10
- Файл інкапсулює оркестрацію виконання правил. Він забезпечує запуск правила через визначений шлях, ізолюючи його виконання у блоці `withLock` для уникнення паралельних запусків.
11
+ ## Огляд
12
+
13
+ Файл надає публічний API для оркестрації правил, який викликається з `rules/<id>/check.mjs`. Він інкапсулює логіку пошуку єдиного правила (`discoverOneRule`) та його виконання (`runRule`). Виконання обертається у `withLock` для дедуплікації паралельних запусків того самого правила на основі стану git-дерева. Локальна логіка в правилах заборонена; розширення поведінки відбувається через `ctx`-опції. Це централізована точка для запуску стандартних правил з кешуванням у межах одного прогону.
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Отримання шляху до правила
15
- 2. Визначення ідентифікатора правила
16
- 3. Охоплення виконання у блоці блокування
17
- 4. Пошук правила
18
- 5. Отримання кешу проходу
19
- 6. Запуск виконання правила
17
+ 1. Викликати `runStandardRule` для певного правила.
18
+ 2. Забезпечити унікальну блокування для виконання цього правила, використовуючи його ID.
19
+ 3. Виявити єдине правило, пов'язане з наданим шляхом.
20
+ 4. Отримати або створити кеш для прогону.
21
+ 5. Виконати правило, використовуючи виявлене правило, шлях до пакету та кеш прогону.
20
22
 
21
23
  ## Гарантії поведінки
22
24
 
23
- - Read-only: файл не виконує операцій запису у файлову систему.
25
+ - Read-only: не виконує операцій запису (ФС/БД).
24
26
  - Кешує результати в межах одного прогону.
25
- - Не звертається до мережі.
@@ -3,26 +3,25 @@ type: JS Module
3
3
  title: timing-summary.mjs
4
4
  resource: npm/scripts/lib/timing-summary.mjs
5
5
  docgen:
6
- crc: f21a9b91
6
+ crc: ee74c1cd
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Цей файл генерує табличне резюме часу виконання для команд `fix` та `lint`, які використовуються в orchestrator. Він підсумовує час виконання окремих правил та скриптів linting, надаючи інформацію для аналізу продуктивності. Результат представлений у вигляді рядка, який можна вивести для відображення користувачеві.
11
+ ## Огляд
12
+
13
+ Формує таблицю-резюме часу виконання для оркестратора `fix` або `lint`. Таблиця використовується після прогону всіх правил перевірки (`runFixCommand` у `bin/n-cursor.js`) або після прогону скриптів лінтингу (`runLintCli` у `scripts/lib/run-lint-cli.mjs`), які визначаються у `package.json`. Звіт містить деталі часу виконання для кожного елемента у форматі `<ціла>.<десята>s`, а маркер `❌` на рядку вказує на невдачу (`ok === false`).
10
14
 
11
15
  ## Поведінка
12
16
 
13
- formatDurationMs: Перетворює мілісекунди на рядок у форматі `<ціла>.<десята>s`.
14
- formatTimingSummary: Формує таблицю-резюме часу виконання з масиву записів, виводячи їх у текстовому форматі.
17
+ formatDurationMs перетворює тривалість у мілісекундах у рядок формату `<ціла>.<десята>s`.
18
+ formatTimingSummary генерує багаторядковий текст таблиці-резюме часу виконання на основі наданого заголовка та списку записів про час.
15
19
 
16
20
  ## Публічний API
17
21
 
18
- - formatDurationMs Форматує значення тривалості в форматі `<сек>.<десята>с`. Округлення виконується вниз (floor), щоб забезпечити консистентність результатів незалежно від платформи.
19
- - formatTimingSummary Створює багаторядковий текст у форматі таблиці-резюме для виведення в консоль (stdout).
22
+ formatDurationMs: Перетворює мілісекунди на формат `<sec>.<десята>s`, використовуючи округлення вниз.
23
+ formatTimingSummary: Генерує багаторядковий вивід у форматі таблиці-резюме для стандартного виводу.
20
24
 
21
25
  ## Гарантії поведінки
22
26
 
23
- Якщо `ok` дорівнює `false`, повертає `null`.
24
- ❌ Якщо час виконання перевищує 5 секунд, повертає `null`.
25
- Повертає рядок, що містить таблицю з часом виконання.
26
- Час виконання виражається у форматі `<ціла>.<десята>s`.
27
- Повертає рядок з символом `\n` в кінці.
28
- Не використовує кешування.
27
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -6,11 +6,8 @@ docgen:
6
6
  crc: 1f7d5e0d
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
- judgeModel: openai-codex/gpt-5.4-mini
10
9
  ---
11
10
 
12
- ## Огляд
13
-
14
11
  Цей файл вшиває worktree-інструкцію у синкнутий `SKILL.md` (рішення D2 зі spec). Коли `meta.json.worktree === true`, скіл вставляє/замінює ідемпотентний ре-синкнутий блок, що містить маркери WORKTREE_START та WORKTREE_END, забезпечуючи виконання скілу в окремому git-worktree та запобігаючи паралелізації. Функція `injectWorktreeNotice` керує наявністю або відсутністю цього блоку в `SKILL.md` на основі конфігурації.
15
12
 
16
13
  ## Поведінка
@@ -231,7 +231,10 @@ function buildSynthesisPrompt(partials) {
231
231
  */
232
232
  function safeCall(call, prompt, model) {
233
233
  try {
234
- const text = call([{ role: 'user', content: prompt }], model, { timeoutMs: ANALYZE_TIMEOUT_MS, caller: 'fix-analyze' })
234
+ const text = call([{ role: 'user', content: prompt }], model, {
235
+ timeoutMs: ANALYZE_TIMEOUT_MS,
236
+ caller: 'fix-analyze'
237
+ })
235
238
  return text || null
236
239
  } catch {
237
240
  return null
@@ -6,13 +6,14 @@ resource: npm/scripts/lib/fix/
6
6
 
7
7
  # npm/scripts/lib/fix
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [analyze-escalation.mjs](analyze-escalation.md) | JS Module |
12
- | [escalation-log.mjs](escalation-log.md) | JS Module |
13
- | [llm-fix-apply.mjs](llm-fix-apply.md) | JS Module |
14
- | [llm-lint-fix.mjs](llm-lint-fix.md) | JS Module |
15
- | [llm-worker.mjs](llm-worker.md) | JS Module |
16
- | [orchestrator.mjs](orchestrator.md) | JS Module |
17
- | [run-fix-check.mjs](run-fix-check.md) | JS Module |
18
- | [t0.mjs](t0.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------- | --------- |
11
+ | [analyze-escalation.mjs](analyze-escalation.md) | JS Module |
12
+ | [escalation-log.mjs](escalation-log.md) | JS Module |
13
+ | [llm-fix-apply.mjs](llm-fix-apply.md) | JS Module |
14
+ | [llm-lint-fix.mjs](llm-lint-fix.md) | JS Module |
15
+ | [llm-worker.mjs](llm-worker.md) | JS Module |
16
+ | [orchestrator.mjs](orchestrator.md) | JS Module |
17
+ | [run-conformance-check.mjs](run-conformance-check.md) | JS Module |
18
+ | [run-fix-check.mjs](run-fix-check.md) | JS Module |
19
+ | [t0.mjs](t0.md) | JS Module |
@@ -3,34 +3,39 @@ type: JS Module
3
3
  title: orchestrator.mjs
4
4
  resource: npm/scripts/lib/fix/orchestrator.mjs
5
5
  docgen:
6
- crc: d327ab6d
6
+ crc: fbc91330
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Модуль керує процесом валідації та виправлення конформності правил. Він перевіряє правила, застосовує детермінований механізм (T0), а нерозв'язані порушення проводить по **драбині ескалації моделей**: локальна min-модель → той самий локальний тир із feedback → хмарна min → хмарна avg. Кожен крок драбини логується для подальшого аналізу. Функція `runOrchestratorCli` запускає процес.
11
+ ## Огляд
12
+
13
+ Модуль керує процесом вирішення порушень за допомогою багаторівневої системи ескалації. Він збирає послідовність рівнів моделей, починаючи з локальних і закінчуючи хмарними. Модуль парсить параметри запуску за допомогою `parseOrchestratorArgs` та виконує повний цикл фіксації, застосовуючи детермінований фікс. Для невирішених проблем застосовується ескалація правил через `escalateRule`, а фінальний запуск оркестратора здійснюється через `runOrchestratorCli`, який використовує структуру, побудовану за допомогою `buildLadder`.
12
14
 
13
15
  ## Поведінка
14
16
 
15
- 1. `runOrchestratorCli` виконує початкову перевірку правил. Якщо порушень немає успіх.
16
- 2. Один прохід детермінованого фіксу (T0) зменшує набір порушень без LLM.
17
- 3. `buildLadder` будує драбину з доступних тирів (`N_LOCAL_MIN_MODEL`, `N_CLOUD_MIN_MODEL`, `N_CLOUD_AVG_MODEL`); незадані тири відсіюються. Якщо драбина порожня — процес завершується з ознакою нерозв'язаних порушень.
18
- 4. `escalateRule` проводить кожне правило по драбині до першого зеленого re-check:
19
- - рунг `local-min` — перший прохід без feedback;
20
- - рунг `local-min-retry` — той самий локальний тир, але з feedback попереднього рунга (попередні зміни + залишковий violation);
21
- - рунги `cloud-min` / `cloud-avg` — хмарні моделі (через pi), теж із feedback.
22
- Кожен рунг має per-tier `timeoutMs`: локальні **fail-fast** (`N_LOCAL_FIX_TIMEOUT_MS`, дефолт 45s — не палити стіну 120s на повільному локальному inference), хмарні — повний (`N_CLOUD_FIX_TIMEOUT_MS`, дефолт 120s).
23
- 5. Достроковий вихід драбини: systemic-помилка локального тиру пропускає рунги тієї ж моделі; відсутній API-ключ на хмарному обриває драбину; хмарний транспортний збій (pi таймаут/spawn) обриває драбину, щоб не палити avg-бюджет на ту саму стіну; вичерпаний avg-кеп пропускає avg-рунг (із записом у лог).
24
- 6. Після обробки всіх правил — фінальна перевірка. Усі чисті → успіх; інакше — ознака нерозв'язаних.
17
+ buildLadder будує послідовність тирів ескалації для вирішення порушень, від локальних мінімальних моделей до хмарних середніх моделей.
18
+ escalateRule проводить один прохід по послідовності тирів, намагаючись вирішити порушення, і повертає статус вирішення та використаний бюджет хмарних викликів.
19
+ parseOrchestratorArgs парсить аргументи командного рядка для визначення максимального бюджету хмарних викликів та фільтра правил.
20
+ runOrchestratorCli виконує повний цикл фіксації: перевіряє правила, застосовує детермінований фікс (T0-auto), а потім використовує LLM-драбину ескалації для невирішених порушень.
25
21
 
26
22
  ## Публічний API
27
23
 
28
- - `buildLadder({ localMin, cloudMin, cloudAvg })` будує драбину рунгів із наявних тирів.
29
- - `escalateRule(rule, cwd, deps)` — проводить одне правило по драбині; повертає `{ resolved, avgUsed }`. Залежності (`worker`, `check`, `clock`) інжектовні для тестів.
30
- - `parseOrchestratorArgs(args)` парсить `--max-avg N` (кеп на хмарні avg-виклики) і фільтр правил.
31
- - `runOrchestratorCli(args, cwd)` точка входу; повертає `0` (усе чисто) або `1` (нерозв'язані).
24
+ buildLadder Створює послідовність моделей для ескалації, виходячи з доступних рівнів.
25
+
26
+ local-minЗапускає первинний прохід з найменшою локальною моделлю.
27
+ local-min-retryПовторює локальний прохід, використовуючи відгук від попереднього кроку.
28
+ cloud-min — Запускає прохід з найменшою хмарною моделлю, використовуючи відгук.
29
+ cloud-avg — Запускає прохід з середньою хмарною моделлю, використовуючи відгук та обмеження середнього.
30
+
31
+ escalateRule — Виконує одне правило по драбині ескалації до першого успішного перевірки.
32
+ Кожен рунг — Запускає роботу моделі з урахуванням попереднього відгуку, перевіряє правило, фіксує результат у лозі.
33
+ Достроковий вихід — Зупиняє процес при певних умовах (відсутність ключа, пропуск моделі на системному рівні) або при досягненні ліміту середнього.
34
+
35
+ parseOrchestratorArgs — Витягує максимальне значення середнього та збирає список правил для фільтрації з командного рядка.
36
+
37
+ runOrchestratorCli — Запускає основний процес оркестрації, обробляючи аргументи та виконуючи ескалацію правил.
32
38
 
33
39
  ## Гарантії поведінки
34
40
 
35
- - Кожен рунг драбини дописується в escalation-лог (`escalation-log.mjs`): модель, чи виклик удався, чи правило стало зеленим, залишковий violation і само-аналіз моделі.
36
- - Звертається до мережі лише на хмарних рунгах драбини (через pi).
41
+ - Read-only: не виконує операцій запису (ФС/БД).