@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,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,15 +12,15 @@ 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
- * Повертає код виходу з процесу.
21
+ - Виконується як автономний скрипт.
22
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
23
+ - Повертає код виходу з процесу.
24
24
 
25
25
  ## Публічний API
26
26
 
@@ -6,6 +6,7 @@ resource: npm/rules/npm-module/
6
6
 
7
7
  # npm/rules/npm-module
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/npm-module/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-запити. При запуску як інструмент командного рядка, метод `run` ініціює повний запуск правила. Цей запуск включає завантаження конфігурацій, що спираються на meta.json, застосування білих списків та підбиття підсумків. Модуль є Read-only, тобто не пише у ФС/БД. Кешування даних відбувається в межах одного прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC-референси.
19
+ 3. Якщо код виконується як окремий інструмент командного рядка, ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: застосовує перевірки, обробляє JS-залежності, застосовує політику та посилання MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -6,9 +6,9 @@ resource: npm/rules/npm-module/js/
6
6
 
7
7
  # npm/rules/npm-module/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ----------------------------------------------- | --------- |
11
11
  | [header_doc_pointer.mjs](header_doc_pointer.md) | JS Module |
12
- | [package_structure.mjs](package_structure.md) | JS Module |
13
- | [rule_meta.mjs](rule_meta.md) | JS Module |
14
- | [skill_meta.mjs](skill_meta.md) | JS Module |
12
+ | [package_structure.mjs](package_structure.md) | JS Module |
13
+ | [rule_meta.mjs](rule_meta.md) | JS Module |
14
+ | [skill_meta.mjs](skill_meta.md) | JS Module |
@@ -3,31 +3,32 @@ type: JS Module
3
3
  title: rule_meta.mjs
4
4
  resource: npm/rules/npm-module/js/rule_meta.mjs
5
5
  docgen:
6
- crc: 8262678c
6
+ crc: 938ccd0a
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Перевіряє наявність директорії npm/rules у вказаному шляху. Ітерує по всіх директоріях у директорії npm/rules. Для кожної директорії виконує перевірку наявності файлу auto.md та валідність полів auto та lint у конфігурації meta.json. Перевіряє наявність файлу js/lint.mjs у каталозі правила. Збирає результати валідації та повертає код виходу репортера.
11
+ ## Огляд
12
+
13
+ Модуль перевіряє конфігурацію правил, розташованих у каталозі `npm/rules`. Він забезпечує наявність обов'язкового файлу `scripts.mdc` для кожного правила. Крім того, він валідує структуру метаданих у `meta.json`, перевіряючи відповідність полів, таких як `auto` та `lint`, визначеним контрактам. У процесі перевірки використовуються маркери повідомлень (scripts.mdc).
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Перевірка наявності директорії npm/rules у вказаному шляху.
15
- 2. Ітерація по всіх директоріях у директорії npm/rules.
16
- 3. Для кожної директорії виконується перевірка правила.
17
- 4. Перевірка наявності файлу auto.md у директорії правила.
18
- 5. Перевірка валідності поля auto у meta.json правила.
19
- 6. Перевірка наявності поля lint у meta.json правила.
20
- 7. Перевірка валідності поля lint у meta.json правила.
21
- 8. Перевірка наявності файлу js/lint.mjs у каталозі правила.
22
- 9. Збір результатів валідації.
23
- 10. Повернення коду виходу репортера.
17
+ 1. Викликати `check` для початку валідації.
18
+ 2. Перевірити наявність каталогу `npm/rules` у корені репозиторію. Якщо каталог відсутній, валідація завершується успішно.
19
+ 3. Для кожного підкаталогу у `npm/rules` (який представляє правило):
20
+ а. Перевірити наявність файлу `auto.md`. Якщо він присутній, реєструється помилка, оскільки метадані тепер знаходяться у `meta.json`.
21
+ б. Перевірити наявність файлу `<id>.mdc` у каталозі правила. Якщо він відсутній, реєструється помилка, оскільки це обов'язковий файл (scripts.mdc).
22
+ в. Зчитати вміст `meta.json` правила. Якщо файл відсутній або невалідний, реєструється помилка, і перевірка цього правила припиняється.
23
+ г. Перевірити поле `auto` у `meta.json`. Якщо поле `auto` присутнє, воно повинно бути валідним (відповідати одному з визначених форматів, або бути відсутнім). Якщо поле `auto` містить невідомий предикат, реєструється помилка.
24
+ ґ. Перевірити поле `lint` у `meta.json`. Якщо поле `lint` присутнє, воно повинно бути валідним (відповідати "per-file" або "full"). Також перевіряється, чи експортує файл `main.mjs` у каталозі правила функцію `lint` відповідно до зазначеного значення `lint`.
25
+ і. Якщо всі перевірки для правила пройшли успішно, реєструється повідомлення про валідність `meta.json`.
26
+ 4. Після обробки всіх правил, повертається код виходу, що відображає загальний статус валідації.
24
27
 
25
28
  ## Публічний API
26
29
 
27
- check — Валідує всі `npm/rules/<id>/meta.json`.
30
+ check — перевіряє відповідність усіх файлів `npm/rules/<id>/meta.json` встановленим критеріям.
28
31
 
29
32
  ## Гарантії поведінки
30
33
 
31
- - Read-only: файл не виконує операцій запису у файлову систему.
32
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
33
- - Не звертається до мережі.
34
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -47,9 +47,7 @@ function moduleJsDoc(source) {
47
47
  * @returns {boolean} true для звичайних source-файлів
48
48
  */
49
49
  function isSourceMjs(fileEntry) {
50
- return (
51
- fileEntry.isFile() && fileEntry.name.endsWith('.mjs') && !fileEntry.name.endsWith('.test.mjs')
52
- )
50
+ return fileEntry.isFile() && fileEntry.name.endsWith('.mjs') && !fileEntry.name.endsWith('.test.mjs')
53
51
  }
54
52
 
55
53
  /**
@@ -1,5 +1,5 @@
1
1
  /** @see ./docs/rule_meta.md */
2
- import { existsSync, readdirSync } from 'node:fs'
2
+ import { existsSync, readdirSync, readFileSync } from 'node:fs'
3
3
  import { join } from 'node:path'
4
4
 
5
5
  import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
@@ -41,8 +41,12 @@ function checkLintField(id, ruleDir, raw, reporter) {
41
41
  reporter.fail(`rules/${id}: meta.json.lint нерозпізнане (очікується "per-file"|"full")`)
42
42
  return false
43
43
  }
44
- if (!existsSync(join(ruleDir, 'js', 'lint.mjs'))) {
45
- reporter.fail(`rules/${id}: lint:"${raw.lint}" але немає js/lint.mjs`)
44
+ const mainPath = join(ruleDir, 'main.mjs')
45
+ const src = existsSync(mainPath) ? readFileSync(mainPath, 'utf8') : ''
46
+ // Канон (ADR 2026-06-21): lint-поверхня — це експорт `lint` із `main.mjs` (інлайн або
47
+ // `export { lint } from './js/…'`), а не окремий `js/lint.mjs`.
48
+ if (!/export\s+(?:async\s+)?function\s+lint\b|export\s*\{[^}]*\blint\b/u.test(src)) {
49
+ reporter.fail(`rules/${id}: lint:"${raw.lint}" але main.mjs не експортує lint`)
46
50
  return false
47
51
  }
48
52
  return true
@@ -63,6 +67,12 @@ function checkRule(id, ruleDir, reporter) {
63
67
  ruleOk = false
64
68
  }
65
69
 
70
+ // Канон (scripts.mdc): {rule}.mdc — ОБОВ'ЯЗКОВИЙ у кожному npm/rules/<id>/.
71
+ if (!existsSync(join(ruleDir, `${id}.mdc`))) {
72
+ reporter.fail(`rules/${id}: відсутній ${id}.mdc — обов'язковий (scripts.mdc)`)
73
+ ruleOk = false
74
+ }
75
+
66
76
  const raw = readRuleMetaRaw(ruleDir)
67
77
  if (!raw) {
68
78
  reporter.fail(`rules/${id}: відсутній або невалідний meta.json`)
@@ -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
+ }
@@ -14,14 +14,14 @@ docgen:
14
14
  ## Поведінка
15
15
 
16
16
  1. Запуск правила.
17
- * Приймає контекст прогону.
18
- * Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
- * Повертає результат прогону.
17
+ - Приймає контекст прогону.
18
+ - Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
+ - Повертає результат прогону.
20
20
 
21
21
  2. Запуск у режимі CLI.
22
- * Виконується при запуску через CLI.
23
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
- * Повертає код виходу.
22
+ - Виконується при запуску через CLI.
23
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ - Повертає код виходу.
25
25
 
26
26
  ## Публічний API
27
27
 
@@ -6,6 +6,7 @@ resource: npm/rules/php/
6
6
 
7
7
  # npm/rules/php
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,33 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/php/main.mjs
5
+ docgen:
6
+ crc: a2c44b0c
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Скрипт виконує перевірку коду відповідно до правила `php.mdc`. Він запускає `composer audit` для перевірки залежностей, а також, якщо встановлені, виконує PHPStan, Psalm, PHP-CS-Fixer (у режимі dry-run) та PHPCS зі стандартом Security. Робота скрипта ґрунтується на конфігурації, визначеній у `composer.json`. Скрипт пропускає запуск інструменту, якщо відповідний виконуваний файл відсутній у `vendor/bin/`. Якщо `composer.json` відсутній у корені, інструменти не запускаються.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку, застосовуючи правила до контексту.
18
+ getPhpcsCodePaths визначає шляхи до каталогів коду для PHPCS, перевіряючи типові директорії (`app`, `src`, `lib`, `public`, `www`) або кореневий каталог.
19
+ runPhpLintSteps виконує послідовність перевірок: `composer audit`, PHP-CS-Fixer (dry-run), phpcs (Security), PHPStan та Psalm, пропускаючи кроки, якщо відповідні інструменти відсутні.
20
+ lint оркеструє виконання кроків PHP-лінтування для всього репозиторію.
21
+
22
+ ## Публічний API
23
+
24
+ run — головна точка входу для виконання правил (перевірка логіки застосування до JS-задач, політик та посилань MDC).
25
+ getPhpcsCodePaths — Визначає шляхи до коду, які має аналізувати PHPCS.
26
+ runPhpLintSteps — Виконує етапи лінтингу, включаючи аудит `composer`, `php-cs-fixer`, `phpstan` та `psalm`.
27
+ lint — Координує фазу лінтингу, виконуючи аудит `composer`, перевірку стилю коду (`php-cs-fixer`) та аналіз статичних аналізаторів (`phpstan`/`psalm`).
28
+
29
+ ## Гарантії поведінки
30
+
31
+ - Read-only: не виконує операцій запису (ФС/БД).
32
+ - Кешує результати в межах одного прогону.
33
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
@@ -6,7 +6,7 @@ resource: npm/rules/php/js/
6
6
 
7
7
  # npm/rules/php/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [lint.mjs](lint.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------------- | --------- |
11
+ | [lint.mjs](lint.md) | JS Module |
12
12
  | [tooling.mjs](tooling.md) | JS Module |
@@ -3,25 +3,25 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/php/js/tooling.mjs
5
5
  docgen:
6
- crc: a3e6a475
7
- score: 95
6
+ crc: 22a05733
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Огляд
11
- Файл перевіряє наявність конфігураційних файлів для визначення залежностей та робочих потоків. Файл використовується для встановлення наявності певних файлів у репозиторії.
11
+ Модуль перевіряє наявність ключових конфігураційних файлів проєкту, а саме `composer.json` та `package.json`. Перевірка здійснюється за допомогою публічної функції `check`. Мета — підтвердити наявність базових файлів, необхідних для роботи проєкту (php.mdc).
12
12
 
13
13
  ## Поведінка
14
14
 
15
- 1. Перевірити наявність composer.json
16
- 2. Перевірити наявність package.json
17
- 3. Перевірити наявність .github/workflows/lint-php.yml
15
+ 1. Перевіряє наявність файлу `composer.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `composer.json` (php.mdc).
16
+ 2. Перевіряє наявність файлу `package.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `package.json` (php.mdc).
17
+ 3. Перевіряє наявність файлу `.github/workflows/lint-php.yml`. Якщо файл відсутній, повідомляє про необхідність створити його згідно з `php.mdc`.
18
+ 4. Повертає код виходу, який вказує на успішне виконання (0) або наявність проблем (1).
18
19
 
19
20
  ## Публічний API
20
21
 
21
- check — Перевіряє відповідність проєкту правилам php.mdc.
22
+ check — перевіряє відповідність проєкту стандартам php.mdc.
22
23
 
23
24
  ## Гарантії поведінки
24
25
 
25
- - Read-only: файл не виконує операцій запису у файлову систему.
26
+ - Read-only: не виконує операцій запису (ФС/БД).
26
27
  - Свідомо пропускає шляхи: `.github`, `.git`.
27
- - Не звертається до мережі.
@@ -12,9 +12,22 @@ import { spawnSync } from 'node:child_process'
12
12
  import { existsSync, statSync } from 'node:fs'
13
13
  import { join, resolve } from 'node:path'
14
14
 
15
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
16
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
17
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
15
+ import { isRunAsCli } from '../../scripts/cli-entry.mjs'
16
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
17
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
18
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
19
+ import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
20
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
21
+
22
+ /**
23
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
24
+ * → policy → mdc-refs); `lint()` нижче — lint-поверхня (composer/phpstan/psalm), імпл інлайн тут.
25
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
26
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
27
+ */
28
+ export function run(ctx) {
29
+ return runStandardRule(import.meta.dirname, ctx)
30
+ }
18
31
 
19
32
  const PHPCS_CODE_DIR_CANDIDATES = ['app', 'src', 'lib', 'public', 'www']
20
33
 
@@ -62,11 +75,11 @@ function runTool(label, abs, args, pass, fail) {
62
75
  }
63
76
 
64
77
  /**
65
- * Запускає `lint-php`.
78
+ * Запускає кроки `lint-php` (composer audit + php-cs-fixer/phpcs/phpstan/psalm).
66
79
  * @param {string} [cwd] корінь репозиторію
67
80
  * @returns {number} 0 — OK, 1 — є помилки
68
81
  */
69
- export function run(cwd = process.cwd()) {
82
+ export function runPhpLintSteps(cwd = process.cwd()) {
70
83
  const reporter = createCheckReporter()
71
84
  const { pass, fail } = reporter
72
85
 
@@ -121,6 +134,19 @@ export function run(cwd = process.cwd()) {
121
134
  return reporter.getExitCode()
122
135
  }
123
136
 
137
+ /**
138
+ * Оркестраторний адаптер `n-cursor lint php` (лінтер-фаза): composer audit + php-cs-fixer
139
+ * (`--dry-run`) + phpstan/psalm через `run` у `runStandardLint` (лок). Read-only — мутацій
140
+ * немає, тож `opts` ігнорується. Структурні php.mdc-перевірки — у конформність-фазі.
141
+ * @param {string[] | undefined} _files ігнорується (whole-repo обхід)
142
+ * @param {string} [cwd] корінь
143
+ * @returns {Promise<number>} exit code
144
+ */
145
+ export function lint(_files, cwd = process.cwd()) {
146
+ return runStandardLint(import.meta.dirname, () => runPhpLintSteps(cwd))
147
+ }
148
+
124
149
  if (isRunAsCli(import.meta.url)) {
125
- process.exitCode = run()
150
+ // Standalone: bun rules/php/main.mjs повний еквівалент `npx @nitra/cursor check php`.
151
+ process.exitCode = await runRuleCli(import.meta.dirname)
126
152
  }
@@ -12,19 +12,19 @@ docgen:
12
12
  ## Поведінка
13
13
 
14
14
  1. Запуск правила.
15
- * Приймає контекст прогону.
16
- * Виконує застосування JS-занепокоєних.
17
- * Застосовує політику.
18
- * Генерує посилання на MDC.
19
- * Повертає результат прогону.
15
+ - Приймає контекст прогону.
16
+ - Виконує застосування JS-занепокоєних.
17
+ - Застосовує політику.
18
+ - Генерує посилання на MDC.
19
+ - Повертає результат прогону.
20
20
 
21
21
  2. Виконання у режимі CLI.
22
- * Виконується як автономний скрипт.
23
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
- * Виконує завантаження конфігурації.
25
- * Виконує перевірку дозволів.
26
- * Виконує підбирання списку.
27
- * Виконує підбирання резюме.
22
+ - Виконується як автономний скрипт.
23
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ - Виконує завантаження конфігурації.
25
+ - Виконує перевірку дозволів.
26
+ - Виконує підбирання списку.
27
+ - Виконує підбирання резюме.
28
28
 
29
29
  ## Публічний API
30
30
 
@@ -6,6 +6,7 @@ resource: npm/rules/python/
6
6
 
7
7
  # npm/rules/python
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,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/python/main.mjs
5
+ docgen:
6
+ crc: 8ceba96a
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Виконує логіку `lint-python` за правилом `python.mdc` для забезпечення якості коду Python. Якщо файл `pyproject.toml` відсутній у корені, виконання завершується з кодом 0. Якщо файл присутній, але `uv` не знайдено у системному шляху, це вважається помилкою, оскільки `uv` є єдиним дозволеним пакет-менеджером (без Poetry). Для роботи необхідно виконати `uv lock --check` для підтвердження актуальності файлу блокування та `uv sync --frozen` для створення середовища, що відповідає `uv.lock` (детальніше про `uv` на https://docs.astral.sh/uv/). Опціональні лінтери запускаються лише за умови їх доступності через `uv run`. Запускаються `ruff` у режимі автоматичного виправлення (`--fix`) та форматування, а також `mypy` для статичного аналізу коду, використовуючи канонічний патерн серіалізації через `runStandardLint`.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку на основі контексту.
18
+ runLintPythonSteps виконує послідовність кроків лінтування Python, включаючи перевірку `pyproject.toml`, виконання `uv lock --check` та `uv sync --frozen`, а також запуск опціональних лінтерів (`ruff`, `mypy`) через `uv run`.
19
+ runLintPython запускає послідовність кроків лінтування Python, використовуючи механізм стандартного лінтування.
20
+ lint оркеструє запуск `runLintPython` для аналізу всього проєкту.
21
+
22
+ ## Публічний API
23
+
24
+ run — Основна точка входу для виконання правил, що включає перевірку логіки застосування (JS-concerns → policy → mdc-refs) та виконання лінтингу.
25
+ runLintPythonSteps — Виконує внутрішні етапи лінтингу для Python без збереження логів.
26
+ runLintPython — Публічний інтерфейс для запуску лінтингу Python, що забезпечує унікальність виконання через блокування та аналіз стану репозиторію.
27
+ lint — Координатор, який ініціює запуск лінтингу Python, делегуючи це `runLintPython`.
28
+
29
+ ## Гарантії поведінки
30
+
31
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -6,8 +6,8 @@ resource: npm/rules/python/js/
6
6
 
7
7
  # npm/rules/python/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------------- | --------- |
11
11
  | [applies.mjs](applies.md) | JS Module |
12
- | [lint.mjs](lint.md) | JS Module |
12
+ | [lint.mjs](lint.md) | JS Module |
13
13
  | [tooling.mjs](tooling.md) | JS Module |
@@ -3,32 +3,32 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/python/js/tooling.mjs
5
5
  docgen:
6
- crc: f4dc22e2
7
- score: 95
6
+ crc: fcabec1d
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Файл виконує перевірку наявності конфігураційних та залежностей у кореневому каталозі репозиторію. Він перевіряє структуру проекту відповідно до вимог, визначених у package.json.
11
+ Модуль перевіряє відповідність структури проєкту вимогам, визначеним у `python.mdc`. Він перевіряє наявність ключових файлів конфігурації, таких як `pyproject.toml`, `uv.lock` та `package.json`, у корені репозиторію. Мета — підтвердити відповідність проєкту встановленим стандартам, зокрема щодо використання `uv` замість Poetry.
12
+
13
+ Поведінка
14
+ Виконує перевірку за допомогою публічної функції `check`. Ігнорує шляхи `.github` та `.git`. Не виконує операцій запису у файлову систему чи бази даних (Read-only). (python.mdc)
11
15
 
12
16
  ## Поведінка
13
17
 
14
- 1. Перевірити наявність `pyproject.toml` у корені репозиторію.
15
- 2. Перевірити наявність `uv.lock` у корені репозиторію.
16
- 3. Якщо `uv.lock` відсутній, повернути код виходу.
17
- 4. Перевірити наявність `poetry.lock` у корені репозиторію.
18
- 5. Якщо `poetry.lock` знайдено, повернути помилку.
19
- 6. Якщо `poetry.lock` відсутній, пропустити.
20
- 7. Перевірити наявність `package.json` у корені репозиторію.
21
- 8. Якщо `package.json` відсутній, повернути помилку.
22
- 9. Перевірити наявність файлу `.github/workflows/lint-python.yml` у корені репозиторію.
23
- 10. Якщо файлу `.github/workflows/lint-python.yml` немає, повернути помилку.
24
- 11. Повернути код виходу.
18
+ 1. Перевіряє відповідність проєкту правилам (python.mdc) у вказаному корені репозиторію.
19
+ 2. Якщо файл `pyproject.toml` відсутній у корені, повертає код виходу, що вказує на відсутність конфігурації.
20
+ 3. Перевіряє наявність файлу `uv.lock`. Якщо він відсутній, повідомляє про необхідність згенерувати його за допомогою `uv lock` (python.mdc).
21
+ 4. Перевіряє відсутність файлів `poetry.lock` та `poetry.toml`. Якщо будь-який із них знайдено, повідомляє про необхідність відмови від Poetry та міграції на `uv` (python.mdc).
22
+ 5. Перевіряє наявність файлу `package.json` у корені. Якщо він відсутній, повідомляє про необхідність його додавання (python.mdc).
23
+ 6. Перевіряє наявність файлу `.github/workflows/lint-python.yml` у корені. Якщо він відсутній, повідомляє про необхідність його створення згідно з документацією (python.mdc).
24
+ 7. Повертає код виходу, що відображає загальний стан перевірки.
25
+ 8. Не перевіряє шляхи, що містять `.github` або `.git`.
25
26
 
26
27
  ## Публічний API
27
28
 
28
- check — Перевіряє відповідність проєкту правилам python.mdc.
29
+ check — перевіряє відповідність проєкту стандартам python.mdc.
29
30
 
30
31
  ## Гарантії поведінки
31
32
 
32
- - Read-only: файл не виконує операцій запису у файлову систему.
33
+ - Read-only: не виконує операцій запису (ФС/БД).
33
34
  - Свідомо пропускає шляхи: `.github`, `.git`.
34
- - Не звертається до мережі.
@@ -24,10 +24,22 @@ import { spawnSync } from 'node:child_process'
24
24
  import { existsSync } from 'node:fs'
25
25
  import { join } from 'node:path'
26
26
 
27
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
28
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
29
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
30
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
27
+ import { isRunAsCli } from '../../scripts/cli-entry.mjs'
28
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
29
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
30
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
31
+ import { 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-поверхня (uv/ruff/mypy), імпл інлайн тут.
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
  * Запускає CLI-крок і репортить результат.
@@ -103,7 +115,8 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
103
115
  const ruffCheck = readOnly ? ['check', '.'] : ['check', '--fix', '.']
104
116
  const ruffFormat = readOnly ? ['format', '--check', '.'] : ['format', '.']
105
117
  if (!runOptionalUvTool('ruff', readOnly ? 'ruff check' : 'ruff check --fix', ruffCheck)) return reporter.getExitCode()
106
- if (!runOptionalUvTool('ruff', readOnly ? 'ruff format --check' : 'ruff format', ruffFormat)) return reporter.getExitCode()
118
+ if (!runOptionalUvTool('ruff', readOnly ? 'ruff format --check' : 'ruff format', ruffFormat))
119
+ return reporter.getExitCode()
107
120
  if (!runOptionalUvTool('mypy', 'mypy', ['.'])) return reporter.getExitCode()
108
121
 
109
122
  return reporter.getExitCode()
@@ -117,6 +130,18 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
117
130
  export const runLintPython = (opts = {}) =>
118
131
  runStandardLint(import.meta.dirname, () => runLintPythonSteps(process.cwd(), opts))
119
132
 
133
+ /**
134
+ * Оркестраторний адаптер `n-cursor lint python`: делегує у `runLintPython`.
135
+ * @param {string[] | undefined} _files ігнорується (whole-project аналіз)
136
+ * @param {string} [_cwd] корінь (CLI бере process.cwd())
137
+ * @param {{ readOnly?: boolean }} [opts] readOnly → ruff без `--fix`, format `--check`
138
+ * @returns {Promise<number>} exit code
139
+ */
140
+ export function lint(_files, _cwd, opts = {}) {
141
+ return runLintPython({ readOnly: opts.readOnly === true })
142
+ }
143
+
120
144
  if (isRunAsCli(import.meta.url)) {
121
- process.exitCode = await runLintPython({ readOnly: process.argv.includes('--read-only') })
145
+ // Standalone: bun rules/python/main.mjs повний еквівалент `npx @nitra/cursor check python`.
146
+ process.exitCode = await runRuleCli(import.meta.dirname)
122
147
  }