@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
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/tauri/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль обробляє JS-запити та взаємодіє з MDC для отримання даних. При запуску через публічну функцію `run` він оркеструє застосування правил, завантажуючи конфігурації з meta.json, застосовуючи білий список та надаючи підсумок. Модуль є read-only і не здійснює записів у ФС/БД.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC.
19
+ 3. Якщо код виконується як окрема утиліта (CLI), запускається оркестрація правила.
20
+ 4. Оркестрація правила виконує завантаження конфігурацій (наприклад, `meta.json`), застосовує білий список та надає підсумок.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: застосовує вимоги до JavaScript, перевіряє політику та посилання на MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -6,7 +6,7 @@ resource: npm/rules/tauri/js/
6
6
 
7
7
  # npm/rules/tauri/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | --------------------------------------------------- | --------- |
11
11
  | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
- | [tooling.mjs](tooling.md) | JS Module |
12
+ | [tooling.mjs](tooling.md) | JS Module |
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -12,12 +12,12 @@ docgen:
12
12
  ## Поведінка
13
13
 
14
14
  1. Запуск правила.
15
- * Передача контексту прогону.
16
- * Виклик `runStandardRule` з використанням шляху до модуля.
17
- * Повернення результату.
15
+ - Передача контексту прогону.
16
+ - Виклик `runStandardRule` з використанням шляху до модуля.
17
+ - Повернення результату.
18
18
  2. Запуск у режимі CLI.
19
- * Виклик `runRuleCli` з використанням шляху до модуля.
20
- * Встановлення коду виходу процесу на результат.
19
+ - Виклик `runRuleCli` з використанням шляху до модуля.
20
+ - Встановлення коду виходу процесу на результат.
21
21
 
22
22
  ## Публічний API
23
23
 
@@ -6,6 +6,7 @@ resource: npm/rules/test/
6
6
 
7
7
  # npm/rules/test
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,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/test/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку, обробляючи JS-запитання, політику та посилання на mdc. При запуску як окрема програма, він зчитує конфігурації з meta.json, застосовує білий список та підсумовує результати після застосування білого списку, визначаючи код виходу процесу. Функція run ініціює цей процес. Модуль є read-only і не пише у ФС/БД. Кешування відбувається у межах прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання `run` застосовує логіку правила, включаючи обробку JS-запитань, політику та посилання на mdc.
19
+ 3. Якщо скрипт виконується як окрема програма (CLI), запускається оркестрація правила.
20
+ 4. Оркестрація правила зчитує конфігурації, включаючи `meta.json`, застосовує білий список та підсумовує результати.
21
+ 5. Результат оркестрації визначає код виходу процесу.
22
+
23
+ ## Публічний API
24
+
25
+ run — виконує основну логіку правила: застосовує перевірки, обробляє JS-залежності та політики, а також посилається на метадані.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Кешує результати в межах одного прогону.
@@ -6,8 +6,8 @@ resource: npm/rules/test/js/data/stryker_config/
6
6
 
7
7
  # npm/rules/test/js/data/stryker_config
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [stryker-vue-macros-ignorer.mjs](stryker-vue-macros-ignorer.md) | JS Module |
12
- | [stryker.config.baseline.mjs](stryker.config.baseline.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------------------- | --------- |
11
+ | [stryker-vue-macros-ignorer.mjs](stryker-vue-macros-ignorer.md) | JS Module |
12
+ | [stryker.config.baseline.mjs](stryker.config.baseline.md) | JS Module |
13
13
  | [stryker.config.vue.baseline.mjs](stryker.config.vue.baseline.md) | JS Module |
@@ -6,6 +6,6 @@ resource: npm/rules/test/js/data/vitest_config/
6
6
 
7
7
  # npm/rules/test/js/data/vitest_config
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------------------------------------------ | --------- |
11
11
  | [vitest.config.baseline.js](vitest.config.baseline.md) | JS Module |
@@ -6,11 +6,11 @@ resource: npm/rules/test/js/
6
6
 
7
7
  # npm/rules/test/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
- | [location.mjs](location.md) | JS Module |
13
- | [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
14
- | [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
15
- | [stryker_config.mjs](stryker_config.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------------- | --------- |
11
+ | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
+ | [location.mjs](location.md) | JS Module |
13
+ | [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
14
+ | [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
15
+ | [stryker_config.mjs](stryker_config.md) | JS Module |
16
16
  | [vitest-config-pool-forks.mjs](vitest-config-pool-forks.md) | JS Module |
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -12,18 +12,18 @@ docgen:
12
12
  ## Поведінка
13
13
 
14
14
  1. Запуск правила.
15
- * Приймає контекст прогону.
16
- * Виконує застосування JS-занепокоєних.
17
- * Застосовує політику.
18
- * Генерує посилання MDC.
19
- * Повертає результат прогону.
15
+ - Приймає контекст прогону.
16
+ - Виконує застосування JS-занепокоєних.
17
+ - Застосовує політику.
18
+ - Генерує посилання MDC.
19
+ - Повертає результат прогону.
20
20
  2. Виконання у режимі CLI.
21
- * Виконується як автономний скрипт.
22
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
23
- * Виконує завантаження конфігурації.
24
- * Виконує перевірку дозволених записів.
25
- * Генерує зведену інформацію.
26
- * Визначає код виходу процесу.
21
+ - Виконується як автономний скрипт.
22
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
23
+ - Виконує завантаження конфігурації.
24
+ - Виконує перевірку дозволених записів.
25
+ - Генерує зведену інформацію.
26
+ - Визначає код виходу процесу.
27
27
 
28
28
  ## Публічний API
29
29
 
@@ -6,6 +6,7 @@ resource: npm/rules/text/
6
6
 
7
7
  # npm/rules/text
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,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/text/main.mjs
5
+ docgen:
6
+ crc: deba6201
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ CLI-обгортка над канонічним `lint-text` (text.mdc) забезпечує послідовний пайплайн перевірок для текстових файлів. Вона автоматично встановлює необхідні інструменти (`shellcheck`, `dotenv-linter`) через `ensureTool` (brew/scoop/GitHub Release per-platform) та перевіряє наявність `patch` для авто-фіксу. Пайплайн послідовно виконує: перевірку правопису (`cspell` з `@nitra/cspell-dict`), синтаксичну перевірку скриптів (`shellcheck` з авто-фіксом), перевірку конфігураційних файлів (`dotenv-linter` з авто-фіксом), форматування Markdown (`markdownlint-cli2` з авто-фіксом) та валідацію схем (`v8r`). Перший ненульовий код, отриманий у ланцюжку, повертається як код виходу, припиняючи подальші кроки. Функціональність експортується як `runLintTextCli` та викликається через `n-cursor lint text` (оркестраторний адаптер `lint`). Конфігурації, на які спирається код: meta.json.
14
+
15
+ ## Поведінка
16
+
17
+ run: Викликається як check-поверхня, виконуючи стандартне правило.
18
+ runLintTextCli: Виконує повний ланцюжок перевірок для тексту: `cspell`, `shellcheck`, `dotenv-linter`, `markdownlint-cli2` та валідацію схем через `v8r`. Автоматично встановлює `shellcheck` та `dotenv-linter` при першому прогоні. Повертає код першого кроку, що не пройшов.
19
+ lint: Делегує виконання повного ланцюжка перевірок тексту через `runLintTextCli`, дозволяючи вказати режим лише детектування без авто-фіксу.
20
+
21
+ ## Публічний API
22
+
23
+ run — Точка входу правила, що виконує перевірку логіки (JS-занепокложення → політика → посилання text.mdc).
24
+ runLintTextCli — Публічна команда для CLI, яка серіалізує завдання лінтування з блокуванням та усуває дублікати на основі стану репозиторію.
25
+ lint — Адаптер, що керує запуском лінтування тексту через `n-cursor lint text`, делегуючи роботу `runLintTextCli`.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -143,12 +143,17 @@ export function runCspellText(cwd = process.cwd(), readOnly = false, llmFix = fa
143
143
  const words = unknownWords(first.out)
144
144
  const batch = words.slice(0, MAX_CLASSIFY_WORDS)
145
145
  if (words.length > MAX_CLASSIFY_WORDS) {
146
- process.stdout.write(`ℹ️ cspell: класифікація перших ${MAX_CLASSIFY_WORDS}/${words.length} слів (решта — наступний прогін)\n`)
146
+ process.stdout.write(
147
+ `ℹ️ cspell: класифікація перших ${MAX_CLASSIFY_WORDS}/${words.length} слів (решта — наступний прогін)\n`
148
+ )
147
149
  }
148
150
 
149
151
  let text
150
152
  try {
151
- text = callLlm([{ role: 'user', content: classifyPrompt(batch) }], model, { caller: 'cspell-classify', maxTokens: 4000 })
153
+ text = callLlm([{ role: 'user', content: classifyPrompt(batch) }], model, {
154
+ caller: 'cspell-classify',
155
+ maxTokens: 4000
156
+ })
152
157
  } catch (error) {
153
158
  process.stdout.write(`⚠️ cspell: omlx-класифікація впала (${error.message}) — без авто-словника\n`)
154
159
  process.stdout.write(first.out)
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: cspell-fix.mjs
4
+ resource: npm/rules/text/js/cspell-fix.mjs
5
+ docgen:
6
+ crc: 7b40e8f9
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Виявляє невідомі слова у тексті у ланцюжку lint-text із omlx-класифікацією (спека docs/specs/2026-06-15-opportunistic-llm-fix-tier.md), використовуючи конфігурації .cspell.json та meta.json. Класифікує знахідки за схемою omlx-класифікація, дописуючи валідні терміни до словника .cspell.json. Ймовірні одруки залишаються списком на рев'ю, оскільки fix-режим не переписує файли. Завершує процес повторною перевіркою, щоб визначити, чи залишилися нерозкласифіковані або ймовірні одруки. Перехоплює помилки (fail-safe), не кидаючи винятків назовні.
14
+
15
+ ## Поведінка
16
+
17
+ unknownWords витягує унікальні невідомі слова з виводу cspell.
18
+ appendWordsToDict додає класифіковані валідні слова до файлу .cspell.json, оновлюючи його словник.
19
+ runCspellText запускає cspell для виявлення невідомих слів, а при увімкненні omlx-класифікації класифікує їх та дописує валідні слова у словник, після чого повторно перевіряє наявність помилок.
20
+
21
+ ## Публічний API
22
+
23
+ unknownWords — Збирає унікальні слова, які не були знайдені у словнику cspell.
24
+ appendWordsToDict — Додає зібрані слова до файлу `.cspell.json#words` у відсортованому та унікальному вигляді для перегляду у Git.
25
+ runCspellText — Виконує перевірку тексту за допомогою cspell, класифікуючи слова та оновлюючи словник за новою схемою.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
30
+ - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
@@ -3,61 +3,28 @@ type: JS Module
3
3
  title: formatting.mjs
4
4
  resource: npm/rules/text/js/formatting.mjs
5
5
  docgen:
6
- crc: 67b016e2
6
+ crc: 34048813
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Перевіряє наявність файлів з конфігурацій. Код використовує дані з конфігів з extensions.json, settings.json, target.json, .oxfmtrc.json, .cspell.json та package.json для виконання операцій.
11
+ Модуль перевіряє відповідність конфігураційних файлів та скриптів встановленим вимогам. Він перевіряє наявність конфігураційних файлів, на які спираються `package.json`, `extensions.json`, `target.json`, `.oxfmtrc.json` та `.cspell.json`. Модуль використовує функцію `check` для валідації налаштувань.
11
12
 
12
13
  ## Поведінка
13
14
 
14
- 1. Перевірити наявність файлів з конфігурацій
15
- 2. Перевірити наявність файлів з конфігурацій
16
- 3. Перевірити наявність файлів з конфігурацій
17
- 4. Перевірити наявність файлів з конфігурацій
18
- 5. Перевірити наявність файлів з конфігурацій
19
- 6. Перевірити наявність файлів з конфігурацій
20
- 7. Перевірити наявність файлів з конфігурацій
21
- 8. Перевірити наявність файлів з конфігурацій
22
- 9. Перевірити наявність файлів з конфігурацій
23
- 10. Перевірити наявність файлів з конфігурацій
24
- 11. Перевірити наявність файлів з конфігурацій
25
- 12. Перевірити наявність файлів з конфігурацій
26
- 13. Перевірити наявність файлів з конфігурацій
27
- 14. Перевірити наявність файлів з конфігурацій
28
- 15. Перевірити наявність файлів з конфігурацій
29
- 16. Перевірити наявність файлів з конфігурацій
30
- 17. Перевірити наявність файлів з конфігурацій
31
- 18. Перевірити наявність файлів з конфігурацій
32
- 19. Перевірити наявність файлів з конфігурацій
33
- 20. Перевірити наявність файлів з конфігурації
34
- 21. Перевірити наявність файлів з конфігурації
35
- 22. Перевірити наявність файлів з конфігурації
36
- 23. Перевірити наявність файлів з конфігурації
37
- 24. Перевірити наявність файлів з конфігурації
38
- 25. Перевірити наявність файлів з конфігурації
39
- 26. Перевірити наявність файлів з конфігурації
40
- 27. Перевірити наявність файлів з конфігурації
41
- 28. Перевірити наявність файлів з конфігурації
42
- 29. Перевірити наявність файлів з конфігурації
43
- 30. Перевірити наявність файлів з конфігурації
44
- 31. Перевірити наявність файлів з конфігурації
45
- 32. Перевірити наявність файлів з конфігурації
46
- 33. Перевірити наявність файлів з конфігурації
47
- 34. Перевірити наявність файлів з конфігурації
48
- 35. Перевірити наявність файлів з конфігурації
49
- 36. Перевірити наявність файлів з конфігурації
50
- 37. Перевірити наявність файлів з конфігурації
51
- 38. Перевірити наявність файлів з конфігурації
52
- 39. Перевірити наявність файлів з конфігурації
53
- 40. Перевірити наявність файлів з конфігурації
15
+ 1. Викликається функція check.
16
+ 2. Ініціалізується механізм збору результатів перевірки.
17
+ 3. Виконується перевірка файлу .v8rignore на відповідність вимогам.
18
+ 4. Виконується перевірка наявності текстових конфігураційних файлів: .oxfmtrc.json, .cspell.json, .markdownlint-cli2.jsonc, .vscode/extensions.json, .vscode/settings.json.
19
+ 5. Перевіряється абзац про український апостроф у файлах n-text.mdc або npm/mdc/text.mdc, якщо вони існують.
20
+ 6. Виконується перевірка CI-workflow у файлі .github/workflows/lint-text.yml на наявність кроку `n-cursor lint text --read-only`.
21
+ 7. Повертається код виходу, що відображає загальний статус перевірки.
54
22
 
55
23
  ## Публічний API
56
24
 
57
- check — перевіряє відповідність проєкту правилам text.mdc (text.mdc).
25
+ check — порівнює структуру проєкту з вимогами text.mdc.
58
26
 
59
27
  ## Гарантії поведінки
60
28
 
61
- - Read-only: файл не виконує операцій запису у файлову систему.
29
+ - Read-only: не виконує операцій запису (ФС/БД).
62
30
  - Свідомо пропускає шляхи: `.github`, `.git`.
63
- - Не звертається до мережі.
@@ -6,8 +6,12 @@ resource: npm/rules/text/js/
6
6
 
7
7
  # npm/rules/text/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ----------------------------------------------- | --------- |
11
+ | [cspell-fix.mjs](cspell-fix.md) | JS Module |
11
12
  | [forbidden-prettier.mjs](forbidden-prettier.md) | JS Module |
12
- | [formatting.mjs](formatting.md) | JS Module |
13
- | [lint.mjs](lint.md) | JS Module |
13
+ | [formatting.mjs](formatting.md) | JS Module |
14
+ | [lint.mjs](lint.md) | JS Module |
15
+ | [run-dotenv-linter.mjs](run-dotenv-linter.md) | JS Module |
16
+ | [run-shellcheck.mjs](run-shellcheck.md) | JS Module |
17
+ | [run-v8r.mjs](run-v8r.md) | JS Module |
@@ -0,0 +1,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: run-dotenv-linter.mjs
4
+ resource: npm/rules/text/js/run-dotenv-linter.mjs
5
+ docgen:
6
+ crc: 4719ac66
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль запускає `dotenv-linter` для валідації конфігураційних файлів `.env*` відповідно до стандартів (наприклад, `LowercaseKey`). Процес включає два етапи: спочатку автоматичне виправлення порушень за допомогою `dotenv-linter fix`, а потім фінальну перевірку за допомогою `dotenv-linter check`. Інструмент очікується у системному PATH і не включається у залежності проєкту. Він рекурсивно шукає файли, виключаючи `node_modules` та `.envrc`. Якщо `dotenv-linter` відсутній, виводиться інструкція щодо його встановлення (наприклад, `brew install dotenv-linter`) та повертається код помилки. Усі деталі роботи можна знайти за посиланням https://git.io/JLbXn.
14
+
15
+ ## Поведінка
16
+
17
+ 1. `runDotenvLinter` перевіряє наявність інструменту `dotenv-linter` у системному шляху. Якщо інструмент відсутній, виводиться підказка для його встановлення (наприклад, `brew install dotenv-linter` для macOS або завантаження за адресою https://git.io/JLbXn для Linux) та повертається код виходу 1.
18
+ 2. Якщо інструмент знайдено, будується список виключених шляхів для сканування, включаючи `node_modules` та `.envrc`.
19
+ 3. Якщо режим роботи не є лише перевіркою (readOnly дорівнює `false`), виконується перший запуск `dotenv-linter` з опцією авто-фіксу. Цей запуск застосовує всі можливі виправлення до `.env*`-файлів, ігноруючи `.bak`-файли.
20
+ 4. Після застосування авто-фіксу, виконується фінальний запуск `dotenv-linter` з опцією перевірки.
21
+ 5. Якщо фінальна перевірка повертає ненульовий код виходу, це означає, що залишилися порушення, і повертається код виходу 1.
22
+ 6. Якщо фінальна перевірка повертає код виходу 0, операція успішна, і повертається код виходу 0.
23
+
24
+ ## Публічний API
25
+
26
+ runDotenvLinter — запускає dotenv-linter з автоматичним виправленням та фінальною перевіркою конфігураційних файлів.
27
+
28
+ ## Гарантії поведінки
29
+
30
+ - Read-only: не виконує операцій запису (ФС/БД).
31
+ - Свідомо пропускає шляхи: `node_modules`.
@@ -0,0 +1,28 @@
1
+ ---
2
+ type: JS Module
3
+ title: run-shellcheck.mjs
4
+ resource: npm/rules/text/js/run-shellcheck.mjs
5
+ docgen:
6
+ crc: 6b2daaa8
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Скрипт забезпечує відповідність shell-скриптів стандартам, виконуючи дві послідовні дії: спочатку застосовує автоматичні виправлення для проблем, виявлених `shellcheck` за допомогою формату виводу `diff` та команди `patch -p1` у корені проєкту; потім проводить фінальну перевірку всіх зібраних файлів. Скрипт збирає всі відстежувані shell-скрипти у робочому дереві, ігноруючи директорії `node_modules`. Якщо скриптів не знайдено, процес завершується з кодом 0. Якщо `shellcheck` або `patch` відсутні у PATH, скрипт завершується з кодом 1, надаючи підказки для їх встановлення. Після циклу автовиправлень будь-яке попередження чи помилка від `shellcheck` призводить до ненульового коду виходу.
14
+
15
+ ## Поведінка
16
+
17
+ listShellScriptPaths повертає відсортований масив відносних шляхів до shell-скриптів у проєкті, виключаючи директорії `node_modules`.
18
+ runShellcheckText запускає shellcheck: спочатку намагається автоматично виправити знайдені проблеми за допомогою `diff` та `patch`, а потім виконує фінальну перевірку всіх зібраних файлів.
19
+
20
+ ## Публічний API
21
+
22
+ listShellScriptPaths — надає список шляхів до скриптів оболонки для перевірки.
23
+ runShellcheckText — виконує перевірку коду за допомогою shellcheck з автоматичним виправленням.
24
+
25
+ ## Гарантії поведінки
26
+
27
+ - Read-only: не виконує операцій запису (ФС/БД).
28
+ - Свідомо пропускає шляхи: `node_modules`.
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: run-v8r.mjs
4
+ resource: npm/rules/text/js/run-v8r.mjs
5
+ docgen:
6
+ crc: caf707a8
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Скрипт виконує єдиний виклик `v8r` для перевірки відповідності всіх файлів, які підтримує `v8r` (json, json5, yaml, yml, toml), визначеним контрактам. Це замінює необхідність у кількох окремих викликах `v8r`. Скрипт автоматично використовує каталог схем `@nitra/cursor`, який визначається у `v8r-catalog.json`. Якщо не надано додаткових аргументів, він шукає файли за типовими шаблонами у дереві проєкту. Механізм гарантує, що перевірка всіх розширень відбувається, навіть якщо один із глобів не знаходить файлів, оскільки він обходить проблему падіння `v8r` з кодом 98.
14
+
15
+ ## Поведінка
16
+
17
+ DEFAULT_V8R_GLOBS — надає стандартний список патернів для пошуку файлів JSON, JSON5, YAML, YML та TOML.
18
+ V8R_CATALOG_PATH — визначає абсолютний шлях до каталогу схем `v8r-catalog.json` у корені пакета `@nitra/cursor`.
19
+ runV8rWithGlobs — послідовно запускає перевірку кожного наданого патерну за допомогою `v8r`, використовуючи `v8r-catalog.json` як конфігурацію схем. Повертає код завершення, відображаючи вивід лише при виявленні помилки.
20
+
21
+ ## Публічний API
22
+
23
+ - DEFAULT_V8R_GLOBS — Містить стандартні шаблони для пошуку файлів, які обробляє v8r.
24
+ - V8R_CATALOG_PATH — Вказує на розташування файлу `v8r-catalog.json` у корені пакета.
25
+ - runV8rWithGlobs — Виконує послідовні запуски v8r для файлів, знайдених за шаблонами, повертаючи код завершення.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -13,21 +13,33 @@
13
13
  * з неінформативним повідомленням. ensureTool збирає всі відсутні бінарники до першого кроку.
14
14
  *
15
15
  * Перший ненульовий код з ланцюжка повертається як код виходу; наступні кроки не запускаються.
16
- * Експортовано як `runLintTextCli` — використовується з `bin/n-cursor.js` як підкоманда `lint-text`.
16
+ * Експортовано як `runLintTextCli` — викликається через `n-cursor lint text` (оркестраторний адаптер `lint()` делегує сюди); окремої bin-підкоманди `lint-text` немає.
17
17
  *
18
18
  * Канон патерну `lint-*` (серіалізація через `runStandardLint`, без прямого `withLock`) —
19
19
  * `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд».
20
20
  */
21
21
  import { platform } from 'node:process'
22
22
 
23
- import { runLintStep } from '../../../scripts/lib/run-lint-step.mjs'
24
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
25
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
26
- import { ensureTool } from '../../../scripts/lib/ensure-tool.mjs'
27
- import { runCspellText } from './cspell-fix.mjs'
28
- import { runDotenvLinter } from './run-dotenv-linter.mjs'
29
- import { runShellcheckText } from './run-shellcheck.mjs'
30
- import { runV8rWithGlobs } from './run-v8r.mjs'
23
+ import { runLintStep } from '../../scripts/lib/run-lint-step.mjs'
24
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
25
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
26
+ import { ensureTool } from '../../scripts/lib/ensure-tool.mjs'
27
+ import { runCspellText } from './js/cspell-fix.mjs'
28
+ import { runDotenvLinter } from './js/run-dotenv-linter.mjs'
29
+ import { runShellcheckText } from './js/run-shellcheck.mjs'
30
+ import { runV8rWithGlobs } from './js/run-v8r.mjs'
31
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
32
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
33
+
34
+ /**
35
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
36
+ * → policy → mdc-refs); `lint()` нижче — lint-поверхня (markdownlint/cspell/shellcheck/…), імпл інлайн тут.
37
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
38
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
39
+ */
40
+ export function run(ctx) {
41
+ return runStandardRule(import.meta.dirname, ctx)
42
+ }
31
43
 
32
44
  /**
33
45
  * Опис залежності preflight-ом.
@@ -120,7 +132,9 @@ function runLintTextSteps(readOnly = false, llmFix = false) {
120
132
  const dotenvCode = runDotenvLinter(process.cwd(), readOnly)
121
133
  if (dotenvCode !== 0) return dotenvCode
122
134
 
123
- const mdArgs = readOnly ? ['markdownlint-cli2', '**/*.md', '**/*.mdc'] : ['markdownlint-cli2', '--fix', '**/*.md', '**/*.mdc']
135
+ const mdArgs = readOnly
136
+ ? ['markdownlint-cli2', '**/*.md', '**/*.mdc']
137
+ : ['markdownlint-cli2', '--fix', '**/*.md', '**/*.mdc']
124
138
  const markdownlintCode = runLintStep('markdownlint', 'bunx', mdArgs)
125
139
  if (markdownlintCode !== 0) return markdownlintCode
126
140
 
@@ -136,3 +150,20 @@ function runLintTextSteps(readOnly = false, llmFix = false) {
136
150
  */
137
151
  export const runLintTextCli = (opts = {}) =>
138
152
  runStandardLint(import.meta.dirname, () => runLintTextSteps(opts.readOnly === true, opts.llmFix === true))
153
+
154
+ /**
155
+ * Оркестраторний адаптер `n-cursor lint text`: делегує у `runLintTextCli`.
156
+ * @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
157
+ * @param {string} [_cwd] корінь (ігнорується — CLI працює від process.cwd())
158
+ * @param {{ readOnly?: boolean, llmFix?: boolean }} [opts] readOnly → детект без авто-фіксу;
159
+ * llmFix → opt-in omlx-класифікація cspell
160
+ * @returns {Promise<number>} exit code
161
+ */
162
+ export function lint(_files, _cwd, opts = {}) {
163
+ return runLintTextCli({ readOnly: opts.readOnly === true, llmFix: opts.llmFix === true })
164
+ }
165
+
166
+ if (isRunAsCli(import.meta.url)) {
167
+ // Standalone: bun rules/text/main.mjs — повний еквівалент `npx @nitra/cursor check text`.
168
+ process.exitCode = await runRuleCli(import.meta.dirname)
169
+ }
@@ -6,6 +6,7 @@ resource: npm/rules/tool-surface/
6
6
 
7
7
  # npm/rules/tool-surface
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 |