@7n/rules 1.0.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 (1219) hide show
  1. package/.claude-template/hooks/capture-decisions.sh +355 -0
  2. package/.claude-template/hooks/lib/tooling-only.sh +77 -0
  3. package/.claude-template/hooks/normalize-decisions.sh +574 -0
  4. package/.claude-template/settings.template.json +26 -0
  5. package/.pi-template/extensions/n-rules-adr/docs/index.md +28 -0
  6. package/.pi-template/extensions/n-rules-adr/index.ts +105 -0
  7. package/.pi-template/extensions/n-rules-adr/tsconfig.json +17 -0
  8. package/AGENTS.template.md +53 -0
  9. package/CHANGELOG.md +4277 -0
  10. package/README.md +189 -0
  11. package/bin/docs/n-rules.md +612 -0
  12. package/bin/docs/rename-yaml-extensions.md +207 -0
  13. package/bin/n-rules.js +1709 -0
  14. package/bin/rename-yaml-extensions.mjs +42 -0
  15. package/docs/index.md +12 -0
  16. package/docs/stryker.config.md +31 -0
  17. package/docs/vitest.config.md +36 -0
  18. package/github-actions/release/action.yml +9 -0
  19. package/github-actions/setup-bun-deps/action.yml +27 -0
  20. package/package.json +87 -0
  21. package/rules/abie/base_deployment_preem/base_deployment_preem.mdc +22 -0
  22. package/rules/abie/base_deployment_preem/base_deployment_preem.rego +54 -0
  23. package/rules/abie/base_deployment_preem/concern.json +8 -0
  24. package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
  25. package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.rego +81 -0
  26. package/rules/abie/clean_merged_ignore_branches/concern.json +8 -0
  27. package/rules/abie/clean_merged_ignore_branches/template/clean-merged-branch.yml.snippet.yml +9 -0
  28. package/rules/abie/docs/index.md +11 -0
  29. package/rules/abie/env_dns/concern.json +4 -0
  30. package/rules/abie/env_dns/docs/main.md +32 -0
  31. package/rules/abie/env_dns/env_dns.mdc +33 -0
  32. package/rules/abie/env_dns/main.mjs +47 -0
  33. package/rules/abie/firebase_hosting/concern.json +4 -0
  34. package/rules/abie/firebase_hosting/docs/main.md +41 -0
  35. package/rules/abie/firebase_hosting/firebase_hosting.mdc +3 -0
  36. package/rules/abie/firebase_hosting/main.mjs +46 -0
  37. package/rules/abie/hc_pairing/concern.json +4 -0
  38. package/rules/abie/hc_pairing/docs/main.md +34 -0
  39. package/rules/abie/hc_pairing/hc_pairing.mdc +23 -0
  40. package/rules/abie/hc_pairing/main.mjs +52 -0
  41. package/rules/abie/health_check_policy/concern.json +8 -0
  42. package/rules/abie/health_check_policy/health_check_policy.mdc +19 -0
  43. package/rules/abie/health_check_policy/health_check_policy.rego +172 -0
  44. package/rules/abie/http_route_base/concern.json +8 -0
  45. package/rules/abie/http_route_base/http_route_base.mdc +9 -0
  46. package/rules/abie/http_route_base/http_route_base.rego +45 -0
  47. package/rules/abie/lib/docs/enabled.md +38 -0
  48. package/rules/abie/lib/docs/env-dns.md +31 -0
  49. package/rules/abie/lib/docs/hc-yaml.md +33 -0
  50. package/rules/abie/lib/docs/http-route.md +31 -0
  51. package/rules/abie/lib/docs/index.md +18 -0
  52. package/rules/abie/lib/docs/k8s-tree.md +44 -0
  53. package/rules/abie/lib/docs/kustomization-patches.md +37 -0
  54. package/rules/abie/lib/docs/overlay-paths.md +42 -0
  55. package/rules/abie/lib/docs/yaml.md +33 -0
  56. package/rules/abie/lib/enabled.mjs +37 -0
  57. package/rules/abie/lib/env-dns.mjs +81 -0
  58. package/rules/abie/lib/hc-yaml.mjs +27 -0
  59. package/rules/abie/lib/http-route.mjs +100 -0
  60. package/rules/abie/lib/k8s-tree.mjs +110 -0
  61. package/rules/abie/lib/kustomization-patches.mjs +211 -0
  62. package/rules/abie/lib/overlay-paths.mjs +97 -0
  63. package/rules/abie/lib/yaml.mjs +72 -0
  64. package/rules/abie/main.json +1 -0
  65. package/rules/abie/main.mdc +47 -0
  66. package/rules/abie/package_json_shared/concern.json +11 -0
  67. package/rules/abie/package_json_shared/package_json_shared.mdc +17 -0
  68. package/rules/abie/package_json_shared/package_json_shared.rego +16 -0
  69. package/rules/abie/ua_http_route/concern.json +4 -0
  70. package/rules/abie/ua_http_route/docs/main.md +44 -0
  71. package/rules/abie/ua_http_route/main.mjs +80 -0
  72. package/rules/abie/ua_http_route/ua_http_route.mdc +47 -0
  73. package/rules/abie/ua_node_selector/concern.json +4 -0
  74. package/rules/abie/ua_node_selector/docs/main.md +34 -0
  75. package/rules/abie/ua_node_selector/main.mjs +62 -0
  76. package/rules/abie/ua_node_selector/ua_node_selector.mdc +27 -0
  77. package/rules/adr/docs/index.md +11 -0
  78. package/rules/adr/hooks/concern.json +4 -0
  79. package/rules/adr/hooks/docs/main.md +38 -0
  80. package/rules/adr/hooks/hooks.mdc +32 -0
  81. package/rules/adr/hooks/main.mjs +367 -0
  82. package/rules/adr/main.json +1 -0
  83. package/rules/adr/main.mdc +93 -0
  84. package/rules/adr/settings_json/concern.json +9 -0
  85. package/rules/adr/settings_json/settings_json.mdc +7 -0
  86. package/rules/adr/settings_json/settings_json.rego +37 -0
  87. package/rules/adr/settings_local_json/concern.json +9 -0
  88. package/rules/adr/settings_local_json/settings_local_json.mdc +7 -0
  89. package/rules/adr/settings_local_json/settings_local_json.rego +40 -0
  90. package/rules/bun/bunfig/bunfig.mdc +12 -0
  91. package/rules/bun/bunfig/bunfig.rego +29 -0
  92. package/rules/bun/bunfig/concern.json +9 -0
  93. package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +2 -0
  94. package/rules/bun/docs/index.md +11 -0
  95. package/rules/bun/layout/concern.json +16 -0
  96. package/rules/bun/layout/docs/fix-layout.md +29 -0
  97. package/rules/bun/layout/docs/main.md +34 -0
  98. package/rules/bun/layout/fix-layout.mjs +63 -0
  99. package/rules/bun/layout/layout.mdc +60 -0
  100. package/rules/bun/layout/main.mjs +53 -0
  101. package/rules/bun/licensee/concern.json +7 -0
  102. package/rules/bun/licensee/docs/fix-licensee.md +28 -0
  103. package/rules/bun/licensee/docs/index.md +12 -0
  104. package/rules/bun/licensee/docs/main.md +37 -0
  105. package/rules/bun/licensee/fix-licensee.mjs +32 -0
  106. package/rules/bun/licensee/main.mjs +44 -0
  107. package/rules/bun/main.json +1 -0
  108. package/rules/bun/main.mdc +11 -0
  109. package/rules/bun/package_json/concern.json +9 -0
  110. package/rules/bun/package_json/docs/fix-package_json.md +28 -0
  111. package/rules/bun/package_json/docs/index.md +9 -0
  112. package/rules/bun/package_json/fix-package_json.mjs +311 -0
  113. package/rules/bun/package_json/package_json.mdc +14 -0
  114. package/rules/bun/package_json/package_json.rego +64 -0
  115. package/rules/bun/package_json/template/package.json.deny.json +4 -0
  116. package/rules/capacitor/docs/index.md +11 -0
  117. package/rules/capacitor/main.json +1 -0
  118. package/rules/capacitor/main.mdc +12 -0
  119. package/rules/capacitor/package_json/concern.json +9 -0
  120. package/rules/capacitor/package_json/package_json.mdc +9 -0
  121. package/rules/capacitor/package_json/package_json.rego +45 -0
  122. package/rules/capacitor/platforms/concern.json +4 -0
  123. package/rules/capacitor/platforms/docs/main.md +41 -0
  124. package/rules/capacitor/platforms/main.mjs +486 -0
  125. package/rules/changelog/consistency/concern.json +4 -0
  126. package/rules/changelog/consistency/docs/fix-consistency.md +31 -0
  127. package/rules/changelog/consistency/docs/main.md +41 -0
  128. package/rules/changelog/consistency/fix-consistency.mjs +71 -0
  129. package/rules/changelog/consistency/main.mjs +820 -0
  130. package/rules/changelog/docs/index.md +11 -0
  131. package/rules/changelog/lib/docs/index.md +11 -0
  132. package/rules/changelog/lib/docs/package-manifest.md +214 -0
  133. package/rules/changelog/lib/package-manifest.mjs +158 -0
  134. package/rules/changelog/main.json +1 -0
  135. package/rules/changelog/main.mdc +7 -0
  136. package/rules/changelog/presence/concern.json +7 -0
  137. package/rules/changelog/presence/docs/main.md +44 -0
  138. package/rules/changelog/presence/main.mjs +87 -0
  139. package/rules/ci4/docs/index.md +11 -0
  140. package/rules/ci4/main.json +1 -0
  141. package/rules/ci4/main.mdc +375 -0
  142. package/rules/ci4/marksman_config/concern.json +5 -0
  143. package/rules/ci4/marksman_config/data/marksman_config/marksman.baseline.toml +27 -0
  144. package/rules/ci4/marksman_config/docs/fix-marksman_config.md +27 -0
  145. package/rules/ci4/marksman_config/docs/main.md +30 -0
  146. package/rules/ci4/marksman_config/fix-marksman_config.mjs +24 -0
  147. package/rules/ci4/marksman_config/main.mjs +38 -0
  148. package/rules/ci4/marksman_config/marksman_config.mdc +31 -0
  149. package/rules/ci4/vscode_extensions/concern.json +9 -0
  150. package/rules/ci4/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  151. package/rules/ci4/vscode_extensions/docs/index.md +11 -0
  152. package/rules/ci4/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  153. package/rules/ci4/vscode_extensions/template/extensions.json.snippet.json +3 -0
  154. package/rules/ci4/vscode_extensions/vscode_extensions.mdc +9 -0
  155. package/rules/ci4/vscode_extensions/vscode_extensions.rego +12 -0
  156. package/rules/doc-files/check/concern.json +7 -0
  157. package/rules/doc-files/check/docs/fix-check.md +28 -0
  158. package/rules/doc-files/check/docs/fix-worker.md +28 -0
  159. package/rules/doc-files/check/docs/main.md +32 -0
  160. package/rules/doc-files/check/fix-check.mjs +45 -0
  161. package/rules/doc-files/check/fix-worker.mjs +56 -0
  162. package/rules/doc-files/check/main.mjs +99 -0
  163. package/rules/doc-files/docgen-crc/concern.json +3 -0
  164. package/rules/doc-files/docgen-crc/docs/main.md +46 -0
  165. package/rules/doc-files/docgen-crc/main.mjs +207 -0
  166. package/rules/doc-files/docgen-extract/concern.json +3 -0
  167. package/rules/doc-files/docgen-extract/docs/main.md +38 -0
  168. package/rules/doc-files/docgen-extract/main.mjs +471 -0
  169. package/rules/doc-files/docgen-extract-anchors/concern.json +3 -0
  170. package/rules/doc-files/docgen-extract-anchors/docs/main.md +49 -0
  171. package/rules/doc-files/docgen-extract-anchors/main.mjs +115 -0
  172. package/rules/doc-files/docgen-files-batch/concern.json +3 -0
  173. package/rules/doc-files/docgen-files-batch/docs/main.md +38 -0
  174. package/rules/doc-files/docgen-files-batch/main.mjs +517 -0
  175. package/rules/doc-files/docgen-fix-worker/concern.json +3 -0
  176. package/rules/doc-files/docgen-gen/concern.json +3 -0
  177. package/rules/doc-files/docgen-gen/docs/main.md +40 -0
  178. package/rules/doc-files/docgen-gen/main.mjs +582 -0
  179. package/rules/doc-files/docgen-ignore/concern.json +3 -0
  180. package/rules/doc-files/docgen-ignore/docs/main.md +33 -0
  181. package/rules/doc-files/docgen-ignore/main.mjs +54 -0
  182. package/rules/doc-files/docgen-judge/concern.json +3 -0
  183. package/rules/doc-files/docgen-judge/docs/main.md +43 -0
  184. package/rules/doc-files/docgen-judge/main.mjs +116 -0
  185. package/rules/doc-files/docgen-prompts/concern.json +3 -0
  186. package/rules/doc-files/docgen-prompts/docs/main.md +48 -0
  187. package/rules/doc-files/docgen-prompts/main.mjs +222 -0
  188. package/rules/doc-files/docgen-scan/concern.json +3 -0
  189. package/rules/doc-files/docgen-scan/docs/main.md +52 -0
  190. package/rules/doc-files/docgen-scan/main.mjs +231 -0
  191. package/rules/doc-files/docs/index.md +11 -0
  192. package/rules/doc-files/main.json +1 -0
  193. package/rules/doc-files/main.mdc +49 -0
  194. package/rules/doc-files/units/concern.json +3 -0
  195. package/rules/doc-files/units/docs/main.md +32 -0
  196. package/rules/doc-files/units/main.mjs +20 -0
  197. package/rules/doc-files/units-js/concern.json +3 -0
  198. package/rules/doc-files/units-js/docs/main.md +32 -0
  199. package/rules/doc-files/units-js/main.mjs +141 -0
  200. package/rules/doc-files/units-rs/concern.json +3 -0
  201. package/rules/doc-files/units-rs/docs/main.md +36 -0
  202. package/rules/doc-files/units-rs/main.mjs +311 -0
  203. package/rules/docker/docs/index.md +11 -0
  204. package/rules/docker/lib/docker-hadolint.mjs +60 -0
  205. package/rules/docker/lib/docker-mirror.mjs +148 -0
  206. package/rules/docker/lib/docker-native-addon.mjs +93 -0
  207. package/rules/docker/lib/docker-nginx-user.mjs +122 -0
  208. package/rules/docker/lib/docs/docker-hadolint.md +29 -0
  209. package/rules/docker/lib/docs/docker-mirror.md +251 -0
  210. package/rules/docker/lib/docs/docker-native-addon.md +174 -0
  211. package/rules/docker/lib/docs/docker-nginx-user.md +223 -0
  212. package/rules/docker/lib/docs/index.md +14 -0
  213. package/rules/docker/lint/concern.json +7 -0
  214. package/rules/docker/lint/docs/main.md +47 -0
  215. package/rules/docker/lint/main.mjs +360 -0
  216. package/rules/docker/lint_docker_yml/concern.json +9 -0
  217. package/rules/docker/lint_docker_yml/lint_docker_yml.mdc +14 -0
  218. package/rules/docker/lint_docker_yml/lint_docker_yml.rego +79 -0
  219. package/rules/docker/lint_docker_yml/template/lint-docker.yml.snippet.yml +41 -0
  220. package/rules/docker/main.json +1 -0
  221. package/rules/docker/main.mdc +14 -0
  222. package/rules/efes/docs/index.md +11 -0
  223. package/rules/efes/main.json +1 -0
  224. package/rules/efes/main.mdc +21 -0
  225. package/rules/efes/package_json_shared/concern.json +11 -0
  226. package/rules/efes/package_json_shared/package_json_shared.mdc +33 -0
  227. package/rules/efes/package_json_shared/package_json_shared.rego +16 -0
  228. package/rules/feedback/docs/index.md +11 -0
  229. package/rules/feedback/main.json +1 -0
  230. package/rules/feedback/main.mdc +63 -0
  231. package/rules/ga/clean_ga_workflows/clean_ga_workflows.mdc +20 -0
  232. package/rules/ga/clean_ga_workflows/clean_ga_workflows.rego +112 -0
  233. package/rules/ga/clean_ga_workflows/concern.json +10 -0
  234. package/rules/ga/clean_ga_workflows/template/clean-ga-workflows.yml.snippet.yml +26 -0
  235. package/rules/ga/clean_merged_branch/clean_merged_branch.mdc +24 -0
  236. package/rules/ga/clean_merged_branch/clean_merged_branch.rego +163 -0
  237. package/rules/ga/clean_merged_branch/concern.json +10 -0
  238. package/rules/ga/clean_merged_branch/template/clean-merged-branch.yml.snippet.yml +37 -0
  239. package/rules/ga/docs/index.md +11 -0
  240. package/rules/ga/git_ai/concern.json +11 -0
  241. package/rules/ga/git_ai/git_ai.mdc +19 -0
  242. package/rules/ga/git_ai/git_ai.rego +76 -0
  243. package/rules/ga/git_ai/template/git-ai.yml.snippet.yml +30 -0
  244. package/rules/ga/lint_ga/concern.json +10 -0
  245. package/rules/ga/lint_ga/lint_ga.mdc +21 -0
  246. package/rules/ga/lint_ga/lint_ga.rego +132 -0
  247. package/rules/ga/lint_ga/template/lint-ga.yml.snippet.yml +41 -0
  248. package/rules/ga/main.json +1 -0
  249. package/rules/ga/main.mdc +17 -0
  250. package/rules/ga/vscode_extensions/concern.json +11 -0
  251. package/rules/ga/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  252. package/rules/ga/vscode_extensions/docs/index.md +11 -0
  253. package/rules/ga/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  254. package/rules/ga/vscode_extensions/template/extensions.json.snippet.json +1 -0
  255. package/rules/ga/vscode_extensions/vscode_extensions.mdc +9 -0
  256. package/rules/ga/vscode_extensions/vscode_extensions.rego +18 -0
  257. package/rules/ga/vscode_settings/concern.json +11 -0
  258. package/rules/ga/vscode_settings/template/settings.json.snippet.json +1 -0
  259. package/rules/ga/vscode_settings/vscode_settings.mdc +9 -0
  260. package/rules/ga/vscode_settings/vscode_settings.rego +22 -0
  261. package/rules/ga/workflow_common/concern.json +9 -0
  262. package/rules/ga/workflow_common/template/uses-min-versions.snippet.json +4 -0
  263. package/rules/ga/workflow_common/workflow_common.mdc +18 -0
  264. package/rules/ga/workflow_common/workflow_common.rego +288 -0
  265. package/rules/ga/workflows/concern.json +8 -0
  266. package/rules/ga/workflows/docs/fix-workflows.md +37 -0
  267. package/rules/ga/workflows/docs/main.md +38 -0
  268. package/rules/ga/workflows/fix-workflows.mjs +212 -0
  269. package/rules/ga/workflows/main.mjs +433 -0
  270. package/rules/ga/workflows/workflows.mdc +33 -0
  271. package/rules/ga/zizmor_yml/concern.json +11 -0
  272. package/rules/ga/zizmor_yml/template/zizmor.yml.snippet.yml +5 -0
  273. package/rules/ga/zizmor_yml/zizmor_yml.mdc +9 -0
  274. package/rules/ga/zizmor_yml/zizmor_yml.rego +27 -0
  275. package/rules/graphql/docs/index.md +11 -0
  276. package/rules/graphql/lib/docs/graphql-gql-scan.md +226 -0
  277. package/rules/graphql/lib/docs/index.md +11 -0
  278. package/rules/graphql/lib/graphql-gql-scan.mjs +146 -0
  279. package/rules/graphql/main.json +1 -0
  280. package/rules/graphql/main.mdc +8 -0
  281. package/rules/graphql/tooling/concern.json +8 -0
  282. package/rules/graphql/tooling/docs/main.md +36 -0
  283. package/rules/graphql/tooling/main.mjs +129 -0
  284. package/rules/graphql/tooling/tooling.mdc +13 -0
  285. package/rules/graphql/vscode_extensions/concern.json +9 -0
  286. package/rules/graphql/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
  287. package/rules/graphql/vscode_extensions/docs/index.md +11 -0
  288. package/rules/graphql/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  289. package/rules/graphql/vscode_extensions/vscode_extensions.mdc +9 -0
  290. package/rules/graphql/vscode_extensions/vscode_extensions.rego +20 -0
  291. package/rules/hasura/docs/index.md +11 -0
  292. package/rules/hasura/internal_urls/concern.json +5 -0
  293. package/rules/hasura/internal_urls/docs/fix-internal_urls.md +26 -0
  294. package/rules/hasura/internal_urls/docs/index.md +12 -0
  295. package/rules/hasura/internal_urls/docs/main.md +36 -0
  296. package/rules/hasura/internal_urls/fix-internal_urls.mjs +66 -0
  297. package/rules/hasura/internal_urls/internal_urls.mdc +27 -0
  298. package/rules/hasura/internal_urls/main.mjs +233 -0
  299. package/rules/hasura/main.json +1 -0
  300. package/rules/hasura/main.mdc +8 -0
  301. package/rules/hasura/migrations/concern.json +4 -0
  302. package/rules/hasura/migrations/docs/fix-migrations.md +25 -0
  303. package/rules/hasura/migrations/docs/index.md +12 -0
  304. package/rules/hasura/migrations/docs/main.md +35 -0
  305. package/rules/hasura/migrations/fix-migrations.mjs +35 -0
  306. package/rules/hasura/migrations/main.mjs +53 -0
  307. package/rules/hasura/migrations/migrations.mdc +13 -0
  308. package/rules/hasura/svc_hl/concern.json +8 -0
  309. package/rules/hasura/svc_hl/svc_hl.mdc +15 -0
  310. package/rules/hasura/svc_hl/svc_hl.rego +50 -0
  311. package/rules/image-avif/avif_generation/avif_generation.mdc +26 -0
  312. package/rules/image-avif/avif_generation/concern.json +4 -0
  313. package/rules/image-avif/avif_generation/docs/fix-avif_generation.md +27 -0
  314. package/rules/image-avif/avif_generation/docs/main.md +36 -0
  315. package/rules/image-avif/avif_generation/fix-avif_generation.mjs +80 -0
  316. package/rules/image-avif/avif_generation/main.mjs +411 -0
  317. package/rules/image-avif/docs/index.md +11 -0
  318. package/rules/image-avif/main.json +1 -0
  319. package/rules/image-avif/main.mdc +8 -0
  320. package/rules/image-avif/package_json/concern.json +9 -0
  321. package/rules/image-avif/package_json/package_json.mdc +18 -0
  322. package/rules/image-avif/package_json/package_json.rego +47 -0
  323. package/rules/image-avif/package_json/template/package.json.deny.json +5 -0
  324. package/rules/image-compress/check/concern.json +7 -0
  325. package/rules/image-compress/check/docs/fix-check.md +34 -0
  326. package/rules/image-compress/check/docs/index.md +10 -0
  327. package/rules/image-compress/check/docs/main.md +31 -0
  328. package/rules/image-compress/check/fix-check.mjs +74 -0
  329. package/rules/image-compress/check/main.mjs +64 -0
  330. package/rules/image-compress/docs/index.md +11 -0
  331. package/rules/image-compress/main.json +1 -0
  332. package/rules/image-compress/main.mdc +10 -0
  333. package/rules/image-compress/package_json/concern.json +9 -0
  334. package/rules/image-compress/package_json/package_json.mdc +13 -0
  335. package/rules/image-compress/package_json/package_json.rego +21 -0
  336. package/rules/image-compress/package_json/template/package.json.deny.json +8 -0
  337. package/rules/image-compress/package_setup/concern.json +4 -0
  338. package/rules/image-compress/package_setup/docs/main.md +34 -0
  339. package/rules/image-compress/package_setup/main.mjs +98 -0
  340. package/rules/image-compress/package_setup/package_setup.mdc +13 -0
  341. package/rules/js/check/concern.json +19 -0
  342. package/rules/js/check/docs/eslint-config.md +56 -0
  343. package/rules/js/check/docs/fix-check.md +31 -0
  344. package/rules/js/check/docs/index.md +13 -0
  345. package/rules/js/check/docs/main.md +45 -0
  346. package/rules/js/check/eslint-config.mjs +262 -0
  347. package/rules/js/check/fix-check.mjs +39 -0
  348. package/rules/js/check/main.mjs +312 -0
  349. package/rules/js/dep-policy/concern.json +4 -0
  350. package/rules/js/dep-policy/dep-policy.mdc +36 -0
  351. package/rules/js/dep-policy/docs/main.md +35 -0
  352. package/rules/js/dep-policy/main.mjs +99 -0
  353. package/rules/js/docs/index.md +11 -0
  354. package/rules/js/eslint/concern.json +7 -0
  355. package/rules/js/eslint/docs/fix-eslint.md +32 -0
  356. package/rules/js/eslint/docs/main.md +33 -0
  357. package/rules/js/eslint/fix-eslint.mjs +77 -0
  358. package/rules/js/eslint/main.mjs +99 -0
  359. package/rules/js/jscpd_config/concern.json +11 -0
  360. package/rules/js/jscpd_config/jscpd_config.mdc +14 -0
  361. package/rules/js/jscpd_config/jscpd_config.rego +44 -0
  362. package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +7 -0
  363. package/rules/js/jscpd_duplicates/concern.json +7 -0
  364. package/rules/js/jscpd_duplicates/docs/main.md +29 -0
  365. package/rules/js/jscpd_duplicates/main.mjs +70 -0
  366. package/rules/js/knip/concern.json +6 -0
  367. package/rules/js/knip/docs/main.md +32 -0
  368. package/rules/js/knip/main.mjs +68 -0
  369. package/rules/js/lint-findings/concern.json +3 -0
  370. package/rules/js/lint-findings/docs/main.md +41 -0
  371. package/rules/js/lint-findings/main.mjs +125 -0
  372. package/rules/js/lint_js_yml/concern.json +9 -0
  373. package/rules/js/lint_js_yml/lint_js_yml.mdc +14 -0
  374. package/rules/js/lint_js_yml/lint_js_yml.rego +117 -0
  375. package/rules/js/lint_js_yml/template/lint-js.yml.snippet.yml +40 -0
  376. package/rules/js/main.json +1 -0
  377. package/rules/js/main.mdc +19 -0
  378. package/rules/js/package_json/concern.json +9 -0
  379. package/rules/js/package_json/package_json.mdc +15 -0
  380. package/rules/js/package_json/package_json.rego +142 -0
  381. package/rules/js/package_json/template/package.json.snippet.json +6 -0
  382. package/rules/js/tooling/concern.json +3 -0
  383. package/rules/js/tooling/data/tooling/knip-canonical.json +29 -0
  384. package/rules/js/tooling/data/tooling/oxlint-canonical.json +400 -0
  385. package/rules/js/tooling/docs/main.md +31 -0
  386. package/rules/js/tooling/main.mjs +149 -0
  387. package/rules/js/utils_imports/concern.json +4 -0
  388. package/rules/js/utils_imports/docs/main.md +50 -0
  389. package/rules/js/utils_imports/main.mjs +185 -0
  390. package/rules/js/vscode_extensions/concern.json +11 -0
  391. package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  392. package/rules/js/vscode_extensions/docs/index.md +11 -0
  393. package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  394. package/rules/js/vscode_extensions/template/extensions.json.snippet.json +3 -0
  395. package/rules/js/vscode_extensions/vscode_extensions.mdc +11 -0
  396. package/rules/js/vscode_extensions/vscode_extensions.rego +12 -0
  397. package/rules/js-bun-db/docs/index.md +11 -0
  398. package/rules/js-bun-db/lib/bun-sql-scan.mjs +1055 -0
  399. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +63 -0
  400. package/rules/js-bun-db/lib/docs/index.md +11 -0
  401. package/rules/js-bun-db/main.json +1 -0
  402. package/rules/js-bun-db/main.mdc +8 -0
  403. package/rules/js-bun-db/package_json/concern.json +9 -0
  404. package/rules/js-bun-db/package_json/package_json.mdc +17 -0
  405. package/rules/js-bun-db/package_json/package_json.rego +15 -0
  406. package/rules/js-bun-db/package_json/template/package.json.deny.json +6 -0
  407. package/rules/js-bun-db/safety/concern.json +4 -0
  408. package/rules/js-bun-db/safety/docs/main.md +34 -0
  409. package/rules/js-bun-db/safety/main.mjs +430 -0
  410. package/rules/js-bun-redis/docs/index.md +11 -0
  411. package/rules/js-bun-redis/imports/concern.json +4 -0
  412. package/rules/js-bun-redis/imports/docs/main.md +36 -0
  413. package/rules/js-bun-redis/imports/imports.mdc +47 -0
  414. package/rules/js-bun-redis/imports/main.mjs +88 -0
  415. package/rules/js-bun-redis/lib/docs/index.md +11 -0
  416. package/rules/js-bun-redis/lib/docs/redis-imports.md +227 -0
  417. package/rules/js-bun-redis/lib/redis-imports.mjs +130 -0
  418. package/rules/js-bun-redis/main.json +1 -0
  419. package/rules/js-bun-redis/main.mdc +8 -0
  420. package/rules/js-bun-redis/package_json/concern.json +9 -0
  421. package/rules/js-bun-redis/package_json/package_json.mdc +11 -0
  422. package/rules/js-bun-redis/package_json/package_json.rego +15 -0
  423. package/rules/js-bun-redis/package_json/template/package.json.deny.json +12 -0
  424. package/rules/js-mssql/deps/concern.json +4 -0
  425. package/rules/js-mssql/deps/docs/main.md +33 -0
  426. package/rules/js-mssql/deps/main.mjs +297 -0
  427. package/rules/js-mssql/docs/index.md +11 -0
  428. package/rules/js-mssql/lib/docs/index.md +11 -0
  429. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +380 -0
  430. package/rules/js-mssql/lib/mssql-pool-scan.mjs +610 -0
  431. package/rules/js-mssql/main.json +1 -0
  432. package/rules/js-mssql/main.mdc +14 -0
  433. package/rules/js-mssql/package_json/concern.json +9 -0
  434. package/rules/js-mssql/package_json/package_json.mdc +9 -0
  435. package/rules/js-mssql/package_json/package_json.rego +57 -0
  436. package/rules/js-run/configmap/concern.json +9 -0
  437. package/rules/js-run/configmap/configmap.mdc +31 -0
  438. package/rules/js-run/configmap/configmap.rego +21 -0
  439. package/rules/js-run/configmap/template/configmap.yaml.contains.yml +4 -0
  440. package/rules/js-run/docs/index.md +11 -0
  441. package/rules/js-run/jsconfig/concern.json +9 -0
  442. package/rules/js-run/jsconfig/docs/fix-jsconfig.md +29 -0
  443. package/rules/js-run/jsconfig/docs/index.md +9 -0
  444. package/rules/js-run/jsconfig/fix-jsconfig.mjs +119 -0
  445. package/rules/js-run/jsconfig/jsconfig.mdc +25 -0
  446. package/rules/js-run/jsconfig/jsconfig.rego +59 -0
  447. package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +10 -0
  448. package/rules/js-run/lib/bunyan-imports.mjs +98 -0
  449. package/rules/js-run/lib/check-env-scan.mjs +338 -0
  450. package/rules/js-run/lib/conn-file-rules.mjs +214 -0
  451. package/rules/js-run/lib/conn-imports-scan.mjs +154 -0
  452. package/rules/js-run/lib/docs/bunyan-imports.md +121 -0
  453. package/rules/js-run/lib/docs/check-env-scan.md +438 -0
  454. package/rules/js-run/lib/docs/conn-file-rules.md +304 -0
  455. package/rules/js-run/lib/docs/conn-imports-scan.md +208 -0
  456. package/rules/js-run/lib/docs/index.md +16 -0
  457. package/rules/js-run/lib/docs/promise-settimeout-scan.md +334 -0
  458. package/rules/js-run/lib/docs/temporal-scan.md +29 -0
  459. package/rules/js-run/lib/promise-settimeout-scan.mjs +128 -0
  460. package/rules/js-run/lib/temporal-scan.mjs +52 -0
  461. package/rules/js-run/main.json +1 -0
  462. package/rules/js-run/main.mdc +16 -0
  463. package/rules/js-run/package_json/concern.json +9 -0
  464. package/rules/js-run/package_json/package_json.mdc +38 -0
  465. package/rules/js-run/package_json/package_json.rego +37 -0
  466. package/rules/js-run/package_json/template/package.json.deny.json +22 -0
  467. package/rules/js-run/runtime/concern.json +12 -0
  468. package/rules/js-run/runtime/docs/fix-runtime.md +27 -0
  469. package/rules/js-run/runtime/docs/main.md +35 -0
  470. package/rules/js-run/runtime/fix-runtime.mjs +46 -0
  471. package/rules/js-run/runtime/main.mjs +494 -0
  472. package/rules/js-run/runtime/runtime.mdc +14 -0
  473. package/rules/k8s/base_kustomization/base_kustomization.mdc +12 -0
  474. package/rules/k8s/base_kustomization/base_kustomization.rego +77 -0
  475. package/rules/k8s/base_kustomization/concern.json +8 -0
  476. package/rules/k8s/base_manifest/base_manifest.mdc +14 -0
  477. package/rules/k8s/base_manifest/base_manifest.rego +154 -0
  478. package/rules/k8s/base_manifest/concern.json +8 -0
  479. package/rules/k8s/docs/index.md +11 -0
  480. package/rules/k8s/gateway/concern.json +8 -0
  481. package/rules/k8s/gateway/gateway.mdc +31 -0
  482. package/rules/k8s/gateway/gateway.rego +151 -0
  483. package/rules/k8s/hasura_configmap/concern.json +8 -0
  484. package/rules/k8s/hasura_configmap/hasura_configmap.mdc +20 -0
  485. package/rules/k8s/hasura_configmap/hasura_configmap.rego +129 -0
  486. package/rules/k8s/hasura_httproute/concern.json +8 -0
  487. package/rules/k8s/hasura_httproute/hasura_httproute.mdc +16 -0
  488. package/rules/k8s/hasura_httproute/hasura_httproute.rego +298 -0
  489. package/rules/k8s/hpa_pdb/concern.json +8 -0
  490. package/rules/k8s/hpa_pdb/hpa_pdb.mdc +25 -0
  491. package/rules/k8s/hpa_pdb/hpa_pdb.rego +139 -0
  492. package/rules/k8s/kubeconform/concern.json +7 -0
  493. package/rules/k8s/kubeconform/docs/main.md +32 -0
  494. package/rules/k8s/kubeconform/main.mjs +39 -0
  495. package/rules/k8s/kustomization/concern.json +8 -0
  496. package/rules/k8s/kustomization/kustomization.mdc +20 -0
  497. package/rules/k8s/kustomization/kustomization.rego +220 -0
  498. package/rules/k8s/lint_k8s_yml/concern.json +9 -0
  499. package/rules/k8s/lint_k8s_yml/lint_k8s_yml.rego +57 -0
  500. package/rules/k8s/lint_k8s_yml/template/lint-k8s.yml.snippet.yml +43 -0
  501. package/rules/k8s/main.json +1 -0
  502. package/rules/k8s/main.mdc +22 -0
  503. package/rules/k8s/manifest/concern.json +8 -0
  504. package/rules/k8s/manifest/manifest.mdc +17 -0
  505. package/rules/k8s/manifest/manifest.rego +328 -0
  506. package/rules/k8s/manifests/concern.json +6 -0
  507. package/rules/k8s/manifests/docs/fix-manifests.md +47 -0
  508. package/rules/k8s/manifests/fix-manifests.mjs +217 -0
  509. package/rules/k8s/manifests/main.mjs +6838 -0
  510. package/rules/k8s/network_policy/concern.json +8 -0
  511. package/rules/k8s/network_policy/network_policy.mdc +22 -0
  512. package/rules/k8s/network_policy/network_policy.rego +151 -0
  513. package/rules/k8s/network_policy/template/deployment.snippet.yaml +61 -0
  514. package/rules/k8s/network_policy/template/stateful-set.snippet.yaml +69 -0
  515. package/rules/k8s/svc_hl_yaml/concern.json +8 -0
  516. package/rules/k8s/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
  517. package/rules/k8s/svc_hl_yaml/svc_hl_yaml.rego +51 -0
  518. package/rules/k8s/svc_yaml/concern.json +8 -0
  519. package/rules/k8s/svc_yaml/svc_yaml.mdc +12 -0
  520. package/rules/k8s/svc_yaml/svc_yaml.rego +31 -0
  521. package/rules/nginx-default-tpl/docs/index.md +11 -0
  522. package/rules/nginx-default-tpl/main.json +1 -0
  523. package/rules/nginx-default-tpl/main.mdc +8 -0
  524. package/rules/nginx-default-tpl/template/concern.json +17 -0
  525. package/rules/nginx-default-tpl/template/docs/fix-template.md +26 -0
  526. package/rules/nginx-default-tpl/template/docs/main.md +42 -0
  527. package/rules/nginx-default-tpl/template/fix-template.mjs +67 -0
  528. package/rules/nginx-default-tpl/template/main.mjs +505 -0
  529. package/rules/nginx-default-tpl/vscode_extensions/concern.json +9 -0
  530. package/rules/nginx-default-tpl/vscode_extensions/vscode_extensions.mdc +11 -0
  531. package/rules/nginx-default-tpl/vscode_extensions/vscode_extensions.rego +16 -0
  532. package/rules/nginx-default-tpl/vscode_settings/concern.json +9 -0
  533. package/rules/nginx-default-tpl/vscode_settings/vscode_settings.mdc +15 -0
  534. package/rules/nginx-default-tpl/vscode_settings/vscode_settings.rego +36 -0
  535. package/rules/npm-module/docs/index.md +11 -0
  536. package/rules/npm-module/emit_types_config/concern.json +9 -0
  537. package/rules/npm-module/emit_types_config/emit_types_config.mdc +43 -0
  538. package/rules/npm-module/emit_types_config/emit_types_config.rego +28 -0
  539. package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +9 -0
  540. package/rules/npm-module/header_doc_pointer/concern.json +5 -0
  541. package/rules/npm-module/header_doc_pointer/docs/main.md +40 -0
  542. package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +18 -0
  543. package/rules/npm-module/header_doc_pointer/main.mjs +131 -0
  544. package/rules/npm-module/main.json +1 -0
  545. package/rules/npm-module/main.mdc +38 -0
  546. package/rules/npm-module/npm_package_json/concern.json +9 -0
  547. package/rules/npm-module/npm_package_json/npm_package_json.mdc +57 -0
  548. package/rules/npm-module/npm_package_json/npm_package_json.rego +73 -0
  549. package/rules/npm-module/npm_package_json/template/package.json.snippet.json +1 -0
  550. package/rules/npm-module/npm_publish_yml/concern.json +10 -0
  551. package/rules/npm-module/npm_publish_yml/template/npm-publish.yml.snippet.yml +49 -0
  552. package/rules/npm-module/package_structure/concern.json +5 -0
  553. package/rules/npm-module/package_structure/docs/main.md +37 -0
  554. package/rules/npm-module/package_structure/main.mjs +515 -0
  555. package/rules/npm-module/package_structure/package_structure.mdc +63 -0
  556. package/rules/npm-module/root_package_json/concern.json +9 -0
  557. package/rules/npm-module/root_package_json/root_package_json.mdc +41 -0
  558. package/rules/npm-module/root_package_json/root_package_json.rego +28 -0
  559. package/rules/npm-module/root_package_json/template/package.json.snippet.json +1 -0
  560. package/rules/npm-module/rule_meta/concern.json +8 -0
  561. package/rules/npm-module/rule_meta/docs/main.md +35 -0
  562. package/rules/npm-module/rule_meta/main.mjs +119 -0
  563. package/rules/npm-module/rule_meta/rule_meta.mdc +11 -0
  564. package/rules/npm-module/skill_meta/concern.json +5 -0
  565. package/rules/npm-module/skill_meta/docs/main.md +149 -0
  566. package/rules/npm-module/skill_meta/main.mjs +91 -0
  567. package/rules/npm-module/skill_meta/skill_meta.mdc +11 -0
  568. package/rules/php/cs_fixer/concern.json +7 -0
  569. package/rules/php/cs_fixer/docs/main.md +34 -0
  570. package/rules/php/cs_fixer/main.mjs +52 -0
  571. package/rules/php/docs/index.md +11 -0
  572. package/rules/php/lint_php_yml/concern.json +9 -0
  573. package/rules/php/lint_php_yml/lint_php_yml.mdc +23 -0
  574. package/rules/php/lint_php_yml/lint_php_yml.rego +34 -0
  575. package/rules/php/lint_php_yml/template/lint-php.yml.snippet.yml +47 -0
  576. package/rules/php/main.json +1 -0
  577. package/rules/php/main.mdc +8 -0
  578. package/rules/php/phpcs/concern.json +7 -0
  579. package/rules/php/phpcs/docs/main.md +31 -0
  580. package/rules/php/phpcs/main.mjs +71 -0
  581. package/rules/php/project/concern.json +6 -0
  582. package/rules/php/project/docs/main.md +36 -0
  583. package/rules/php/project/main.mjs +88 -0
  584. package/rules/php/tooling/concern.json +5 -0
  585. package/rules/php/tooling/docs/main.md +33 -0
  586. package/rules/php/tooling/main.mjs +35 -0
  587. package/rules/php/tooling/tooling.mdc +66 -0
  588. package/rules/python/applies/concern.json +4 -0
  589. package/rules/python/applies/docs/main.md +29 -0
  590. package/rules/python/applies/main.mjs +24 -0
  591. package/rules/python/docs/index.md +11 -0
  592. package/rules/python/lib/docs/index.md +9 -0
  593. package/rules/python/lib/docs/uv-run.md +32 -0
  594. package/rules/python/lib/uv-run.mjs +48 -0
  595. package/rules/python/lint_python_yml/concern.json +9 -0
  596. package/rules/python/lint_python_yml/lint_python_yml.mdc +12 -0
  597. package/rules/python/lint_python_yml/lint_python_yml.rego +68 -0
  598. package/rules/python/lint_python_yml/template/lint-python.yml.snippet.yml +41 -0
  599. package/rules/python/main.json +1 -0
  600. package/rules/python/main.mdc +8 -0
  601. package/rules/python/mypy/concern.json +7 -0
  602. package/rules/python/mypy/docs/main.md +32 -0
  603. package/rules/python/mypy/main.mjs +36 -0
  604. package/rules/python/project/concern.json +6 -0
  605. package/rules/python/project/docs/main.md +43 -0
  606. package/rules/python/project/main.mjs +115 -0
  607. package/rules/python/pyproject_toml/concern.json +9 -0
  608. package/rules/python/pyproject_toml/pyproject_toml.mdc +13 -0
  609. package/rules/python/pyproject_toml/pyproject_toml.rego +53 -0
  610. package/rules/python/pyproject_toml/template/pyproject.toml.deny.toml +2 -0
  611. package/rules/python/pyproject_toml/template/pyproject.toml.snippet.toml +12 -0
  612. package/rules/python/ruff/concern.json +7 -0
  613. package/rules/python/ruff/docs/fix-ruff.md +34 -0
  614. package/rules/python/ruff/docs/main.md +35 -0
  615. package/rules/python/ruff/fix-ruff.mjs +63 -0
  616. package/rules/python/ruff/main.mjs +52 -0
  617. package/rules/python/tooling/concern.json +15 -0
  618. package/rules/python/tooling/docs/index.md +11 -0
  619. package/rules/python/tooling/docs/main.md +35 -0
  620. package/rules/python/tooling/main.mjs +50 -0
  621. package/rules/python/tooling/tooling.mdc +23 -0
  622. package/rules/rego/conftest_verify/concern.json +6 -0
  623. package/rules/rego/conftest_verify/docs/main.md +31 -0
  624. package/rules/rego/conftest_verify/main.mjs +55 -0
  625. package/rules/rego/docs/index.md +11 -0
  626. package/rules/rego/lib/docs/index.md +9 -0
  627. package/rules/rego/lib/docs/run-external-tool.md +36 -0
  628. package/rules/rego/lib/run-external-tool.mjs +53 -0
  629. package/rules/rego/main.json +1 -0
  630. package/rules/rego/main.mdc +20 -0
  631. package/rules/rego/opa_check/concern.json +7 -0
  632. package/rules/rego/opa_check/docs/main.md +32 -0
  633. package/rules/rego/opa_check/main.mjs +34 -0
  634. package/rules/rego/package_json/concern.json +10 -0
  635. package/rules/rego/package_json/package_json.mdc +12 -0
  636. package/rules/rego/package_json/package_json.rego +21 -0
  637. package/rules/rego/regal/concern.json +7 -0
  638. package/rules/rego/regal/docs/index.md +11 -0
  639. package/rules/rego/regal/docs/main.md +32 -0
  640. package/rules/rego/regal/main.mjs +34 -0
  641. package/rules/rego/tooling/concern.json +5 -0
  642. package/rules/rego/tooling/docs/index.md +11 -0
  643. package/rules/rego/tooling/docs/main.md +31 -0
  644. package/rules/rego/tooling/main.mjs +25 -0
  645. package/rules/rego/tooling/tooling.mdc +14 -0
  646. package/rules/rego/vscode_extensions/concern.json +11 -0
  647. package/rules/rego/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
  648. package/rules/rego/vscode_extensions/docs/index.md +11 -0
  649. package/rules/rego/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  650. package/rules/rego/vscode_extensions/template/extensions.json.snippet.json +1 -0
  651. package/rules/rego/vscode_extensions/vscode_extensions.mdc +11 -0
  652. package/rules/rego/vscode_extensions/vscode_extensions.rego +15 -0
  653. package/rules/rego/vscode_settings/concern.json +11 -0
  654. package/rules/rego/vscode_settings/template/settings.json.snippet.json +6 -0
  655. package/rules/rego/vscode_settings/vscode_settings.mdc +19 -0
  656. package/rules/rego/vscode_settings/vscode_settings.rego +30 -0
  657. package/rules/release/change.mjs +88 -0
  658. package/rules/release/docs/change.md +189 -0
  659. package/rules/release/docs/index.md +13 -0
  660. package/rules/release/docs/release.md +25 -0
  661. package/rules/release/lib/aggregate.mjs +82 -0
  662. package/rules/release/lib/change-file.mjs +116 -0
  663. package/rules/release/lib/docs/aggregate.md +250 -0
  664. package/rules/release/lib/docs/change-file.md +206 -0
  665. package/rules/release/lib/docs/fallback.md +207 -0
  666. package/rules/release/lib/docs/index.md +13 -0
  667. package/rules/release/lib/fallback.mjs +48 -0
  668. package/rules/release/main.json +1 -0
  669. package/rules/release/main.mdc +10 -0
  670. package/rules/release/release.mjs +220 -0
  671. package/rules/rust/applies/concern.json +4 -0
  672. package/rules/rust/applies/docs/index.md +11 -0
  673. package/rules/rust/applies/docs/main.md +30 -0
  674. package/rules/rust/applies/main.mjs +28 -0
  675. package/rules/rust/check/concern.json +7 -0
  676. package/rules/rust/check/docs/fix-check.md +30 -0
  677. package/rules/rust/check/docs/index.md +11 -0
  678. package/rules/rust/check/docs/main.md +37 -0
  679. package/rules/rust/check/fix-check.mjs +79 -0
  680. package/rules/rust/check/main.mjs +81 -0
  681. package/rules/rust/coverage/coverage.mdc +28 -0
  682. package/rules/rust/docs/index.md +11 -0
  683. package/rules/rust/lib/docs/has-cargo-toml.md +134 -0
  684. package/rules/rust/lib/docs/index.md +11 -0
  685. package/rules/rust/lib/has-cargo-toml.mjs +37 -0
  686. package/rules/rust/lint_rust_yml/concern.json +11 -0
  687. package/rules/rust/lint_rust_yml/lint_rust_yml.mdc +17 -0
  688. package/rules/rust/lint_rust_yml/lint_rust_yml.rego +79 -0
  689. package/rules/rust/lint_rust_yml/template/lint-rust.yml.snippet.yml +44 -0
  690. package/rules/rust/main.json +1 -0
  691. package/rules/rust/main.mdc +8 -0
  692. package/rules/rust/package_json/concern.json +10 -0
  693. package/rules/rust/package_json/package_json.mdc +12 -0
  694. package/rules/rust/package_json/package_json.rego +20 -0
  695. package/rules/rust/toolchain_cache/concern.json +5 -0
  696. package/rules/rust/toolchain_cache/docs/fix-toolchain_cache.md +35 -0
  697. package/rules/rust/toolchain_cache/docs/index.md +12 -0
  698. package/rules/rust/toolchain_cache/docs/main.md +57 -0
  699. package/rules/rust/toolchain_cache/fix-toolchain_cache.mjs +117 -0
  700. package/rules/rust/toolchain_cache/main.mjs +177 -0
  701. package/rules/rust/toolchain_cache/toolchain_cache.mdc +23 -0
  702. package/rules/rust/vscode_extensions/concern.json +11 -0
  703. package/rules/rust/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  704. package/rules/rust/vscode_extensions/docs/index.md +11 -0
  705. package/rules/rust/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  706. package/rules/rust/vscode_extensions/template/extensions.json.snippet.json +1 -0
  707. package/rules/rust/vscode_extensions/vscode_extensions.mdc +9 -0
  708. package/rules/rust/vscode_extensions/vscode_extensions.rego +15 -0
  709. package/rules/security/docs/index.md +11 -0
  710. package/rules/security/lint_security_yml/concern.json +11 -0
  711. package/rules/security/lint_security_yml/lint_security_yml.mdc +7 -0
  712. package/rules/security/lint_security_yml/lint_security_yml.rego +33 -0
  713. package/rules/security/lint_security_yml/template/lint-security.yml.snippet.yml +31 -0
  714. package/rules/security/main.json +1 -0
  715. package/rules/security/main.mdc +15 -0
  716. package/rules/security/package_json/concern.json +9 -0
  717. package/rules/security/package_json/package_json.mdc +7 -0
  718. package/rules/security/package_json/package_json.rego +19 -0
  719. package/rules/security/package_json/template/package.json.deny.json +4 -0
  720. package/rules/security/sample_secret/concern.json +11 -0
  721. package/rules/security/sample_secret/docs/index.md +11 -0
  722. package/rules/security/sample_secret/docs/main.md +29 -0
  723. package/rules/security/sample_secret/main.mjs +80 -0
  724. package/rules/security/sample_secret/sample_secret.mdc +20 -0
  725. package/rules/security/scan/concern.json +6 -0
  726. package/rules/security/scan/docs/index.md +11 -0
  727. package/rules/security/scan/docs/main.md +32 -0
  728. package/rules/security/scan/main.mjs +48 -0
  729. package/rules/security/todo.MD +27 -0
  730. package/rules/security/trufflehog/concern.json +4 -0
  731. package/rules/security/trufflehog/docs/index.md +11 -0
  732. package/rules/security/trufflehog/docs/main.md +28 -0
  733. package/rules/security/trufflehog/main.mjs +45 -0
  734. package/rules/security/trufflehog/templates/trufflehog/.trufflehog-exclude.snippet.txt +6 -0
  735. package/rules/security/trufflehog/trufflehog.mdc +21 -0
  736. package/rules/style/docs/index.md +11 -0
  737. package/rules/style/lint/concern.json +7 -0
  738. package/rules/style/lint/docs/fix-lint.md +29 -0
  739. package/rules/style/lint/docs/index.md +11 -0
  740. package/rules/style/lint/docs/main.md +29 -0
  741. package/rules/style/lint/fix-lint.mjs +66 -0
  742. package/rules/style/lint/main.mjs +68 -0
  743. package/rules/style/lint_style_yml/concern.json +9 -0
  744. package/rules/style/lint_style_yml/lint_style_yml.mdc +13 -0
  745. package/rules/style/lint_style_yml/lint_style_yml.rego +38 -0
  746. package/rules/style/lint_style_yml/template/lint-style.yml.snippet.yml +39 -0
  747. package/rules/style/main.json +1 -0
  748. package/rules/style/main.mdc +13 -0
  749. package/rules/style/package_json/concern.json +9 -0
  750. package/rules/style/package_json/package_json.mdc +18 -0
  751. package/rules/style/package_json/package_json.rego +31 -0
  752. package/rules/style/package_json/template/package.json.snippet.json +5 -0
  753. package/rules/style/tooling/concern.json +14 -0
  754. package/rules/style/tooling/docs/fix-tooling.md +29 -0
  755. package/rules/style/tooling/docs/index.md +12 -0
  756. package/rules/style/tooling/docs/main.md +34 -0
  757. package/rules/style/tooling/fix-tooling.mjs +58 -0
  758. package/rules/style/tooling/main.mjs +78 -0
  759. package/rules/style/tooling/tooling.mdc +85 -0
  760. package/rules/style/vscode_extensions/concern.json +9 -0
  761. package/rules/style/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  762. package/rules/style/vscode_extensions/docs/index.md +11 -0
  763. package/rules/style/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  764. package/rules/style/vscode_extensions/template/extensions.json.snippet.json +1 -0
  765. package/rules/style/vscode_extensions/vscode_extensions.mdc +13 -0
  766. package/rules/style/vscode_extensions/vscode_extensions.rego +13 -0
  767. package/rules/style/vscode_settings/concern.json +9 -0
  768. package/rules/style/vscode_settings/template/settings.json.snippet.json +5 -0
  769. package/rules/style/vscode_settings/vscode_settings.mdc +19 -0
  770. package/rules/style/vscode_settings/vscode_settings.rego +15 -0
  771. package/rules/tauri/cargo_mutants_config/cargo_mutants_config.mdc +39 -0
  772. package/rules/tauri/cargo_mutants_config/concern.json +5 -0
  773. package/rules/tauri/cargo_mutants_config/docs/fix-cargo_mutants_config.md +30 -0
  774. package/rules/tauri/cargo_mutants_config/docs/index.md +12 -0
  775. package/rules/tauri/cargo_mutants_config/docs/main.md +30 -0
  776. package/rules/tauri/cargo_mutants_config/fix-cargo_mutants_config.mjs +53 -0
  777. package/rules/tauri/cargo_mutants_config/main.mjs +148 -0
  778. package/rules/tauri/core_test_isolation/concern.json +5 -0
  779. package/rules/tauri/core_test_isolation/core_test_isolation.mdc +43 -0
  780. package/rules/tauri/core_test_isolation/docs/index.md +9 -0
  781. package/rules/tauri/core_test_isolation/docs/main.md +36 -0
  782. package/rules/tauri/core_test_isolation/main.mjs +166 -0
  783. package/rules/tauri/docs/index.md +11 -0
  784. package/rules/tauri/linux_deps/concern.json +8 -0
  785. package/rules/tauri/linux_deps/docs/fix-linux_deps.md +29 -0
  786. package/rules/tauri/linux_deps/docs/index.md +10 -0
  787. package/rules/tauri/linux_deps/docs/main.md +36 -0
  788. package/rules/tauri/linux_deps/fix-linux_deps.mjs +89 -0
  789. package/rules/tauri/linux_deps/linux_deps.mdc +18 -0
  790. package/rules/tauri/linux_deps/main.mjs +100 -0
  791. package/rules/tauri/main.json +1 -0
  792. package/rules/tauri/main.mdc +86 -0
  793. package/rules/tauri/release/concern.json +8 -0
  794. package/rules/tauri/release/docs/fix-release.md +28 -0
  795. package/rules/tauri/release/docs/index.md +10 -0
  796. package/rules/tauri/release/docs/main.md +32 -0
  797. package/rules/tauri/release/fix-release.mjs +353 -0
  798. package/rules/tauri/release/main.mjs +315 -0
  799. package/rules/tauri/release/release.mdc +104 -0
  800. package/rules/tauri/tooling/concern.json +8 -0
  801. package/rules/tauri/tooling/docs/index.md +11 -0
  802. package/rules/tauri/tooling/docs/main.md +34 -0
  803. package/rules/tauri/tooling/main.mjs +94 -0
  804. package/rules/tauri/tooling/tooling.mdc +27 -0
  805. package/rules/tauri/updater/concern.json +14 -0
  806. package/rules/tauri/updater/docs/fix-updater.md +33 -0
  807. package/rules/tauri/updater/docs/index.md +10 -0
  808. package/rules/tauri/updater/docs/main.md +32 -0
  809. package/rules/tauri/updater/fix-updater.mjs +322 -0
  810. package/rules/tauri/updater/main.mjs +403 -0
  811. package/rules/tauri/updater/updater.mdc +90 -0
  812. package/rules/tauri/vscode_extensions/concern.json +9 -0
  813. package/rules/tauri/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
  814. package/rules/tauri/vscode_extensions/docs/index.md +11 -0
  815. package/rules/tauri/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  816. package/rules/tauri/vscode_extensions/vscode_extensions.mdc +23 -0
  817. package/rules/tauri/vscode_extensions/vscode_extensions.rego +26 -0
  818. package/rules/test/cargo_mutants_config/cargo_mutants_config.mdc +18 -0
  819. package/rules/test/cargo_mutants_config/concern.json +8 -0
  820. package/rules/test/cargo_mutants_config/data/cargo_mutants_config/mutants.toml.baseline +7 -0
  821. package/rules/test/cargo_mutants_config/docs/fix-cargo_mutants_config.md +31 -0
  822. package/rules/test/cargo_mutants_config/docs/index.md +12 -0
  823. package/rules/test/cargo_mutants_config/docs/main.md +36 -0
  824. package/rules/test/cargo_mutants_config/fix-cargo_mutants_config.mjs +49 -0
  825. package/rules/test/cargo_mutants_config/main.mjs +62 -0
  826. package/rules/test/docs/index.md +11 -0
  827. package/rules/test/location/concern.json +8 -0
  828. package/rules/test/location/docs/index.md +11 -0
  829. package/rules/test/location/docs/main.md +36 -0
  830. package/rules/test/location/location.mdc +52 -0
  831. package/rules/test/location/main.mjs +70 -0
  832. package/rules/test/main.json +1 -0
  833. package/rules/test/main.mdc +26 -0
  834. package/rules/test/no-bun-test-import/concern.json +7 -0
  835. package/rules/test/no-bun-test-import/docs/fix-no-bun-test-import.md +31 -0
  836. package/rules/test/no-bun-test-import/docs/index.md +10 -0
  837. package/rules/test/no-bun-test-import/docs/main.md +36 -0
  838. package/rules/test/no-bun-test-import/fix-no-bun-test-import.mjs +51 -0
  839. package/rules/test/no-bun-test-import/main.mjs +105 -0
  840. package/rules/test/no-bun-test-import/no-bun-test-import.mdc +9 -0
  841. package/rules/test/no-console-store-restore/concern.json +7 -0
  842. package/rules/test/no-console-store-restore/docs/index.md +11 -0
  843. package/rules/test/no-console-store-restore/docs/main.md +44 -0
  844. package/rules/test/no-console-store-restore/main.mjs +88 -0
  845. package/rules/test/no-console-store-restore/no-console-store-restore.mdc +11 -0
  846. package/rules/test/no-process-chdir/concern.json +7 -0
  847. package/rules/test/no-process-chdir/docs/index.md +11 -0
  848. package/rules/test/no-process-chdir/docs/main.md +32 -0
  849. package/rules/test/no-process-chdir/main.mjs +40 -0
  850. package/rules/test/no-process-chdir/no-process-chdir.mdc +15 -0
  851. package/rules/test/no-relative-fs-path/concern.json +7 -0
  852. package/rules/test/no-relative-fs-path/docs/index.md +11 -0
  853. package/rules/test/no-relative-fs-path/docs/main.md +34 -0
  854. package/rules/test/no-relative-fs-path/main.mjs +239 -0
  855. package/rules/test/no-relative-fs-path/no-relative-fs-path.mdc +22 -0
  856. package/rules/test/package_json/concern.json +11 -0
  857. package/rules/test/package_json/package_json.mdc +18 -0
  858. package/rules/test/package_json/package_json.rego +25 -0
  859. package/rules/test/package_json/template/package.json.contains.json +6 -0
  860. package/rules/test/sandbox-aware-test/concern.json +7 -0
  861. package/rules/test/sandbox-aware-test/docs/index.md +11 -0
  862. package/rules/test/sandbox-aware-test/docs/main.md +55 -0
  863. package/rules/test/sandbox-aware-test/main.mjs +89 -0
  864. package/rules/test/sandbox-aware-test/sandbox-aware-test.mdc +28 -0
  865. package/rules/test/stryker_config/concern.json +8 -0
  866. package/rules/test/stryker_config/data/stryker_config/docs/index.md +13 -0
  867. package/rules/test/stryker_config/data/stryker_config/docs/stryker-vue-macros-ignorer.md +31 -0
  868. package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.baseline.md +31 -0
  869. package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.vue.baseline.md +35 -0
  870. package/rules/test/stryker_config/data/stryker_config/stryker-vue-macros-ignorer.mjs +48 -0
  871. package/rules/test/stryker_config/data/stryker_config/stryker.config.baseline.mjs +18 -0
  872. package/rules/test/stryker_config/data/stryker_config/stryker.config.vue.baseline.mjs +23 -0
  873. package/rules/test/stryker_config/data/vitest_config/docs/index.md +11 -0
  874. package/rules/test/stryker_config/data/vitest_config/docs/vitest.config.baseline.md +35 -0
  875. package/rules/test/stryker_config/data/vitest_config/vitest.config.baseline.js +22 -0
  876. package/rules/test/stryker_config/docs/fix-stryker_config.md +42 -0
  877. package/rules/test/stryker_config/docs/index.md +12 -0
  878. package/rules/test/stryker_config/docs/main.md +38 -0
  879. package/rules/test/stryker_config/fix-stryker_config.mjs +76 -0
  880. package/rules/test/stryker_config/main.mjs +504 -0
  881. package/rules/test/stryker_config/stryker_config.mdc +26 -0
  882. package/rules/test/vitest-config-pool-forks/concern.json +7 -0
  883. package/rules/test/vitest-config-pool-forks/docs/index.md +11 -0
  884. package/rules/test/vitest-config-pool-forks/docs/main.md +42 -0
  885. package/rules/test/vitest-config-pool-forks/main.mjs +41 -0
  886. package/rules/test/vitest-config-pool-forks/vitest-config-pool-forks.mdc +34 -0
  887. package/rules/text/cspell/concern.json +9 -0
  888. package/rules/text/cspell/cspell.mdc +41 -0
  889. package/rules/text/cspell/cspell.rego +71 -0
  890. package/rules/text/cspell/docs/fix-cspell.md +36 -0
  891. package/rules/text/cspell/docs/index.md +11 -0
  892. package/rules/text/cspell/fix-cspell.mjs +115 -0
  893. package/rules/text/cspell/template/.cspell.json.contains.json +3 -0
  894. package/rules/text/cspell/template/.cspell.json.deny.json +5 -0
  895. package/rules/text/cspell/template/.cspell.json.snippet.json +15 -0
  896. package/rules/text/cspell-fix/concern.json +7 -0
  897. package/rules/text/cspell-fix/docs/fix-worker.md +38 -0
  898. package/rules/text/cspell-fix/docs/index.md +12 -0
  899. package/rules/text/cspell-fix/docs/main.md +32 -0
  900. package/rules/text/cspell-fix/fix-worker.mjs +73 -0
  901. package/rules/text/cspell-fix/main.mjs +185 -0
  902. package/rules/text/docs/index.md +11 -0
  903. package/rules/text/forbidden-prettier/concern.json +7 -0
  904. package/rules/text/forbidden-prettier/docs/index.md +11 -0
  905. package/rules/text/forbidden-prettier/docs/main.md +38 -0
  906. package/rules/text/forbidden-prettier/forbidden-prettier.mdc +14 -0
  907. package/rules/text/forbidden-prettier/main.mjs +56 -0
  908. package/rules/text/formatting/concern.json +17 -0
  909. package/rules/text/formatting/docs/index.md +11 -0
  910. package/rules/text/formatting/docs/main.md +39 -0
  911. package/rules/text/formatting/main.mjs +149 -0
  912. package/rules/text/lint_text/concern.json +8 -0
  913. package/rules/text/lint_text/lint_text.mdc +19 -0
  914. package/rules/text/lint_text/lint_text.rego +104 -0
  915. package/rules/text/lint_text/template/lint-text.yml.snippet.yml +61 -0
  916. package/rules/text/main.json +1 -0
  917. package/rules/text/main.mdc +23 -0
  918. package/rules/text/markdownlint/concern.json +12 -0
  919. package/rules/text/markdownlint/docs/fix-markdownlint.md +38 -0
  920. package/rules/text/markdownlint/docs/index.md +12 -0
  921. package/rules/text/markdownlint/docs/main.md +40 -0
  922. package/rules/text/markdownlint/fix-markdownlint.mjs +64 -0
  923. package/rules/text/markdownlint/main.mjs +55 -0
  924. package/rules/text/markdownlint/markdownlint.mdc +40 -0
  925. package/rules/text/markdownlint/markdownlint.rego +57 -0
  926. package/rules/text/markdownlint/template/.markdownlint-cli2.jsonc.snippet.jsonc +11 -0
  927. package/rules/text/oxfmt/concern.json +7 -0
  928. package/rules/text/oxfmt/docs/fix-oxfmt.md +28 -0
  929. package/rules/text/oxfmt/docs/main.md +27 -0
  930. package/rules/text/oxfmt/fix-oxfmt.mjs +52 -0
  931. package/rules/text/oxfmt/main.mjs +48 -0
  932. package/rules/text/oxfmt/oxfmt.mdc +11 -0
  933. package/rules/text/oxfmtrc/concern.json +9 -0
  934. package/rules/text/oxfmtrc/oxfmtrc.mdc +11 -0
  935. package/rules/text/oxfmtrc/oxfmtrc.rego +55 -0
  936. package/rules/text/oxfmtrc/template/.oxfmtrc.json.snippet.json +8 -0
  937. package/rules/text/package_json/concern.json +9 -0
  938. package/rules/text/package_json/package_json.mdc +35 -0
  939. package/rules/text/package_json/package_json.rego +66 -0
  940. package/rules/text/package_json/template/package.json.deny.json +15 -0
  941. package/rules/text/run-dotenv-linter/concern.json +7 -0
  942. package/rules/text/run-dotenv-linter/docs/fix-run-dotenv-linter.md +43 -0
  943. package/rules/text/run-dotenv-linter/docs/index.md +12 -0
  944. package/rules/text/run-dotenv-linter/docs/main.md +35 -0
  945. package/rules/text/run-dotenv-linter/fix-run-dotenv-linter.mjs +64 -0
  946. package/rules/text/run-dotenv-linter/main.mjs +122 -0
  947. package/rules/text/run-shellcheck/concern.json +7 -0
  948. package/rules/text/run-shellcheck/docs/fix-run-shellcheck.md +40 -0
  949. package/rules/text/run-shellcheck/docs/index.md +12 -0
  950. package/rules/text/run-shellcheck/docs/main.md +31 -0
  951. package/rules/text/run-shellcheck/fix-run-shellcheck.mjs +44 -0
  952. package/rules/text/run-shellcheck/main.mjs +245 -0
  953. package/rules/text/run-v8r/concern.json +7 -0
  954. package/rules/text/run-v8r/docs/index.md +11 -0
  955. package/rules/text/run-v8r/docs/main.md +40 -0
  956. package/rules/text/run-v8r/main.mjs +266 -0
  957. package/rules/text/vscode_extensions/concern.json +9 -0
  958. package/rules/text/vscode_extensions/docs/fix-vscode_extensions.md +36 -0
  959. package/rules/text/vscode_extensions/docs/index.md +11 -0
  960. package/rules/text/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  961. package/rules/text/vscode_extensions/template/extensions.json.snippet.json +3 -0
  962. package/rules/text/vscode_extensions/vscode_extensions.mdc +13 -0
  963. package/rules/text/vscode_extensions/vscode_extensions.rego +12 -0
  964. package/rules/text/vscode_settings/concern.json +9 -0
  965. package/rules/text/vscode_settings/template/settings.json.snippet.json +9 -0
  966. package/rules/text/vscode_settings/vscode_settings.mdc +13 -0
  967. package/rules/text/vscode_settings/vscode_settings.rego +34 -0
  968. package/rules/tool-surface/docs/index.md +11 -0
  969. package/rules/tool-surface/main.json +6 -0
  970. package/rules/tool-surface/main.mdc +72 -0
  971. package/rules/vue/docs/index.md +11 -0
  972. package/rules/vue/lib/docs/index.md +11 -0
  973. package/rules/vue/lib/docs/vue-forbidden-imports.md +265 -0
  974. package/rules/vue/lib/vue-forbidden-imports.mjs +264 -0
  975. package/rules/vue/main.json +1 -0
  976. package/rules/vue/main.mdc +18 -0
  977. package/rules/vue/package_json/concern.json +9 -0
  978. package/rules/vue/package_json/package_json.mdc +30 -0
  979. package/rules/vue/package_json/package_json.rego +140 -0
  980. package/rules/vue/packages/concern.json +6 -0
  981. package/rules/vue/packages/docs/index.md +11 -0
  982. package/rules/vue/packages/docs/main.md +35 -0
  983. package/rules/vue/packages/main.mjs +575 -0
  984. package/rules/worktree/docs/index.md +11 -0
  985. package/rules/worktree/main.json +1 -0
  986. package/rules/worktree/main.mdc +100 -0
  987. package/rules/worktree/vscode_settings/concern.json +10 -0
  988. package/rules/worktree/vscode_settings/template/settings.json.snippet.json +8 -0
  989. package/rules/worktree/zed_settings/concern.json +10 -0
  990. package/rules/worktree/zed_settings/template/settings.json.snippet.json +12 -0
  991. package/schemas/any.json +4 -0
  992. package/schemas/concern.json +108 -0
  993. package/schemas/layers-config.json +38 -0
  994. package/schemas/n-rules.json +65 -0
  995. package/schemas/rule-meta.json +39 -0
  996. package/schemas/skill-meta.json +30 -0
  997. package/schemas/target.json +63 -0
  998. package/schemas/v8r-catalog.json +179 -0
  999. package/schemas/vendor/bunfig.json +616 -0
  1000. package/schemas/vendor/cargo-mutants-config.json +158 -0
  1001. package/schemas/vendor/cargo.json +9438 -0
  1002. package/schemas/vendor/claude-code-settings.json +2742 -0
  1003. package/schemas/vendor/codex-hooks.json +148 -0
  1004. package/schemas/vendor/cspell.json +2427 -0
  1005. package/schemas/vendor/github-action.json +695 -0
  1006. package/schemas/vendor/github-workflow.json +2193 -0
  1007. package/schemas/vendor/jsconfig.json +1252 -0
  1008. package/schemas/vendor/jscpd.json +405 -0
  1009. package/schemas/vendor/knip.json +915 -0
  1010. package/schemas/vendor/mcp.json +26 -0
  1011. package/schemas/vendor/mt-config.json +85 -0
  1012. package/schemas/vendor/oxfmtrc.json +810 -0
  1013. package/schemas/vendor/oxlintrc.json +18690 -0
  1014. package/schemas/vendor/package.json +23798 -0
  1015. package/schemas/vendor/prettierrc.json +433 -0
  1016. package/schemas/vendor/quikrun.json +195 -0
  1017. package/schemas/vendor/schema-catalog.json +62 -0
  1018. package/schemas/vendor/tsconfig.json +1535 -0
  1019. package/schemas/vendor/zizmor.json +489 -0
  1020. package/scripts/auto-rules.mjs +444 -0
  1021. package/scripts/auto-skills.mjs +95 -0
  1022. package/scripts/build-agents-commands.mjs +91 -0
  1023. package/scripts/cli-entry.mjs +34 -0
  1024. package/scripts/dispatcher/docs/index.md +11 -0
  1025. package/scripts/docs/auto-rules.md +34 -0
  1026. package/scripts/docs/auto-skills.md +30 -0
  1027. package/scripts/docs/build-agents-commands.md +37 -0
  1028. package/scripts/docs/cli-entry.md +36 -0
  1029. package/scripts/docs/ensure-n-rules-dev-dependencies.md +40 -0
  1030. package/scripts/docs/hook.md +30 -0
  1031. package/scripts/docs/index.md +22 -0
  1032. package/scripts/docs/post-tool-use-check.md +27 -0
  1033. package/scripts/docs/rename-yaml-extensions.md +40 -0
  1034. package/scripts/docs/skills-cli.md +35 -0
  1035. package/scripts/docs/smoke-check-imports.md +31 -0
  1036. package/scripts/docs/sync-claude-config.md +84 -0
  1037. package/scripts/docs/sync-setup-bun-deps-action.md +28 -0
  1038. package/scripts/docs/update-blue-oak.md +28 -0
  1039. package/scripts/docs/upgrade-n-rules-and-install.md +36 -0
  1040. package/scripts/ensure-n-rules-dev-dependencies.mjs +217 -0
  1041. package/scripts/hook.mjs +100 -0
  1042. package/scripts/lib/adr/docs/index.md +12 -0
  1043. package/scripts/lib/adr/docs/normalize-cli.md +36 -0
  1044. package/scripts/lib/adr/docs/normalize-pipeline.md +45 -0
  1045. package/scripts/lib/adr/normalize-cli.mjs +74 -0
  1046. package/scripts/lib/adr/normalize-pipeline.mjs +701 -0
  1047. package/scripts/lib/assert-project-root.mjs +77 -0
  1048. package/scripts/lib/blue-oak.mjs +41 -0
  1049. package/scripts/lib/changed-files.mjs +83 -0
  1050. package/scripts/lib/check-reporter.mjs +27 -0
  1051. package/scripts/lib/collect-test-files.mjs +48 -0
  1052. package/scripts/lib/concern-meta.mjs +140 -0
  1053. package/scripts/lib/diff-added-lines.mjs +86 -0
  1054. package/scripts/lib/discover-check-rules-from-cursor.mjs +40 -0
  1055. package/scripts/lib/discover-checkable-rules.mjs +49 -0
  1056. package/scripts/lib/docs/assert-project-root.md +30 -0
  1057. package/scripts/lib/docs/blue-oak.md +29 -0
  1058. package/scripts/lib/docs/changed-files.md +32 -0
  1059. package/scripts/lib/docs/check-reporter.md +179 -0
  1060. package/scripts/lib/docs/collect-test-files.md +32 -0
  1061. package/scripts/lib/docs/concern-meta.md +34 -0
  1062. package/scripts/lib/docs/diff-added-lines.md +38 -0
  1063. package/scripts/lib/docs/discover-check-rules-from-cursor.md +29 -0
  1064. package/scripts/lib/docs/discover-checkable-rules.md +25 -0
  1065. package/scripts/lib/docs/ensure-tool.md +258 -0
  1066. package/scripts/lib/docs/generated-markdown.md +279 -0
  1067. package/scripts/lib/docs/gha-workflow.md +38 -0
  1068. package/scripts/lib/docs/index.md +40 -0
  1069. package/scripts/lib/docs/inline-template-links.md +25 -0
  1070. package/scripts/lib/docs/list-project-rules-mdc.md +27 -0
  1071. package/scripts/lib/docs/list-rule-ids.md +25 -0
  1072. package/scripts/lib/docs/load-cursor-config.md +154 -0
  1073. package/scripts/lib/docs/mirror-parity.md +32 -0
  1074. package/scripts/lib/docs/read-n-rules-config-lite.md +26 -0
  1075. package/scripts/lib/docs/resolve-target-files.md +38 -0
  1076. package/scripts/lib/docs/root-notice.md +29 -0
  1077. package/scripts/lib/docs/rule-meta-helpers.md +38 -0
  1078. package/scripts/lib/docs/rule-meta.md +29 -0
  1079. package/scripts/lib/docs/rule-predicates.md +31 -0
  1080. package/scripts/lib/docs/run-conftest-batch.md +30 -0
  1081. package/scripts/lib/docs/run-lint-step.md +29 -0
  1082. package/scripts/lib/docs/run-standard-lint.md +43 -0
  1083. package/scripts/lib/docs/skill-meta.md +62 -0
  1084. package/scripts/lib/docs/sync-gitignore-worktree.md +26 -0
  1085. package/scripts/lib/docs/template.md +44 -0
  1086. package/scripts/lib/docs/timing-summary.md +25 -0
  1087. package/scripts/lib/docs/workspaces.md +34 -0
  1088. package/scripts/lib/docs/worktree-notice.md +27 -0
  1089. package/scripts/lib/ensure-tool.mjs +352 -0
  1090. package/scripts/lib/fix/docs/index.md +11 -0
  1091. package/scripts/lib/fix/docs/vscode-ext-add.md +33 -0
  1092. package/scripts/lib/fix/vscode-ext-add.mjs +53 -0
  1093. package/scripts/lib/generated-markdown.mjs +71 -0
  1094. package/scripts/lib/gha-workflow.mjs +220 -0
  1095. package/scripts/lib/inline-template-links.mjs +108 -0
  1096. package/scripts/lib/lint-surface/codegen-opa-wrapper.mjs +30 -0
  1097. package/scripts/lib/lint-surface/collateral-veto.mjs +55 -0
  1098. package/scripts/lib/lint-surface/default-worker.mjs +67 -0
  1099. package/scripts/lib/lint-surface/detect.mjs +169 -0
  1100. package/scripts/lib/lint-surface/docs/codegen-opa-wrapper.md +30 -0
  1101. package/scripts/lib/lint-surface/docs/collateral-veto.md +28 -0
  1102. package/scripts/lib/lint-surface/docs/default-worker.md +32 -0
  1103. package/scripts/lib/lint-surface/docs/detect.md +38 -0
  1104. package/scripts/lib/lint-surface/docs/index.md +27 -0
  1105. package/scripts/lib/lint-surface/docs/ladder.md +33 -0
  1106. package/scripts/lib/lint-surface/docs/lint-lock.md +47 -0
  1107. package/scripts/lib/lint-surface/docs/mt-run-node.md +37 -0
  1108. package/scripts/lib/lint-surface/docs/mt-tail.md +41 -0
  1109. package/scripts/lib/lint-surface/docs/policy-lint-adapter.md +44 -0
  1110. package/scripts/lib/lint-surface/docs/policy-test-step.md +43 -0
  1111. package/scripts/lib/lint-surface/docs/progress.md +28 -0
  1112. package/scripts/lib/lint-surface/docs/render.md +29 -0
  1113. package/scripts/lib/lint-surface/docs/run-detectors.md +32 -0
  1114. package/scripts/lib/lint-surface/docs/run-fix.md +33 -0
  1115. package/scripts/lib/lint-surface/docs/snapshot.md +30 -0
  1116. package/scripts/lib/lint-surface/docs/tier-sampling-bench.md +40 -0
  1117. package/scripts/lib/lint-surface/docs/tier-sampling-experiment.md +35 -0
  1118. package/scripts/lib/lint-surface/docs/types.md +27 -0
  1119. package/scripts/lib/lint-surface/docs/violation-reporter.md +32 -0
  1120. package/scripts/lib/lint-surface/ladder.mjs +92 -0
  1121. package/scripts/lib/lint-surface/lint-lock.mjs +247 -0
  1122. package/scripts/lib/lint-surface/mt-run-node.mjs +206 -0
  1123. package/scripts/lib/lint-surface/mt-tail.mjs +0 -0
  1124. package/scripts/lib/lint-surface/policy-lint-adapter.mjs +101 -0
  1125. package/scripts/lib/lint-surface/policy-test-step.mjs +149 -0
  1126. package/scripts/lib/lint-surface/progress.mjs +198 -0
  1127. package/scripts/lib/lint-surface/render.mjs +50 -0
  1128. package/scripts/lib/lint-surface/run-detectors.mjs +314 -0
  1129. package/scripts/lib/lint-surface/run-fix.mjs +732 -0
  1130. package/scripts/lib/lint-surface/snapshot.mjs +83 -0
  1131. package/scripts/lib/lint-surface/tier-sampling-bench.mjs +457 -0
  1132. package/scripts/lib/lint-surface/tier-sampling-experiment.mjs +289 -0
  1133. package/scripts/lib/lint-surface/types.mjs +150 -0
  1134. package/scripts/lib/lint-surface/violation-reporter.mjs +46 -0
  1135. package/scripts/lib/list-project-rules-mdc.mjs +22 -0
  1136. package/scripts/lib/list-rule-ids.mjs +32 -0
  1137. package/scripts/lib/load-cursor-config.mjs +58 -0
  1138. package/scripts/lib/mirror-parity.mjs +62 -0
  1139. package/scripts/lib/read-n-rules-config-lite.mjs +63 -0
  1140. package/scripts/lib/resolve-target-files.mjs +103 -0
  1141. package/scripts/lib/root-notice.mjs +67 -0
  1142. package/scripts/lib/rule-meta-helpers.mjs +103 -0
  1143. package/scripts/lib/rule-meta.mjs +66 -0
  1144. package/scripts/lib/rule-predicates.mjs +114 -0
  1145. package/scripts/lib/run-conftest-batch.mjs +124 -0
  1146. package/scripts/lib/run-lint-step.mjs +38 -0
  1147. package/scripts/lib/run-standard-lint.mjs +50 -0
  1148. package/scripts/lib/skill-meta.mjs +90 -0
  1149. package/scripts/lib/sync-gitignore-worktree.mjs +27 -0
  1150. package/scripts/lib/template.mjs +315 -0
  1151. package/scripts/lib/timing-summary.mjs +63 -0
  1152. package/scripts/lib/workspaces.mjs +109 -0
  1153. package/scripts/lib/worktree-notice.mjs +183 -0
  1154. package/scripts/post-tool-use-check.mjs +82 -0
  1155. package/scripts/rename-yaml-extensions.mjs +170 -0
  1156. package/scripts/skills-cli.mjs +262 -0
  1157. package/scripts/smoke-check-imports.mjs +66 -0
  1158. package/scripts/sync-claude-config.mjs +692 -0
  1159. package/scripts/sync-setup-bun-deps-action.mjs +36 -0
  1160. package/scripts/update-blue-oak.mjs +50 -0
  1161. package/scripts/upgrade-n-rules-and-install.mjs +264 -0
  1162. package/scripts/utils/apply-to-files.mjs +36 -0
  1163. package/scripts/utils/ast-extract.mjs +149 -0
  1164. package/scripts/utils/ast-scan-utils.mjs +206 -0
  1165. package/scripts/utils/docs/apply-to-files.md +38 -0
  1166. package/scripts/utils/docs/ast-extract.md +30 -0
  1167. package/scripts/utils/docs/ast-scan-utils.md +54 -0
  1168. package/scripts/utils/docs/ensure-gitignore-entries.md +32 -0
  1169. package/scripts/utils/docs/find-package-json-paths.md +30 -0
  1170. package/scripts/utils/docs/index.md +23 -0
  1171. package/scripts/utils/docs/lock-cache-dir.md +29 -0
  1172. package/scripts/utils/docs/pass.md +29 -0
  1173. package/scripts/utils/docs/resolve-cargo-manifest.md +27 -0
  1174. package/scripts/utils/docs/resolve-cmd.md +33 -0
  1175. package/scripts/utils/docs/resolve-js-root.md +26 -0
  1176. package/scripts/utils/docs/test-helpers.md +30 -0
  1177. package/scripts/utils/docs/walk-cache.md +31 -0
  1178. package/scripts/utils/docs/walkDir.md +31 -0
  1179. package/scripts/utils/docs/with-lock.md +30 -0
  1180. package/scripts/utils/docs/worktree-fingerprint.md +31 -0
  1181. package/scripts/utils/ensure-gitignore-entries.mjs +30 -0
  1182. package/scripts/utils/find-package-json-paths.mjs +30 -0
  1183. package/scripts/utils/lock-cache-dir.mjs +37 -0
  1184. package/scripts/utils/pass.mjs +9 -0
  1185. package/scripts/utils/resolve-cargo-manifest.mjs +62 -0
  1186. package/scripts/utils/resolve-cmd.mjs +25 -0
  1187. package/scripts/utils/resolve-js-root.mjs +61 -0
  1188. package/scripts/utils/walk-cache.mjs +24 -0
  1189. package/scripts/utils/walkDir.mjs +55 -0
  1190. package/scripts/utils/with-lock.mjs +190 -0
  1191. package/scripts/utils/worktree-fingerprint.mjs +33 -0
  1192. package/skills/adr-normalize/SKILL.md +73 -0
  1193. package/skills/adr-normalize/main.json +1 -0
  1194. package/skills/brainstorming/SKILL.md +165 -0
  1195. package/skills/brainstorming/main.json +1 -0
  1196. package/skills/doc-aggregate/SKILL.md +121 -0
  1197. package/skills/doc-aggregate/js/docs/index.md +11 -0
  1198. package/skills/doc-aggregate/main.json +1 -0
  1199. package/skills/doc-files/.changes/260612-0002.md +6 -0
  1200. package/skills/doc-files/.changes/260612-0006.md +6 -0
  1201. package/skills/doc-files/.changes/260612-0008.md +6 -0
  1202. package/skills/doc-files/.changes/260612-0012.md +6 -0
  1203. package/skills/doc-files/.changes/260612-0031.md +6 -0
  1204. package/skills/doc-files/.changes/260612-0036.md +6 -0
  1205. package/skills/doc-files/.changes/260612-0114.md +6 -0
  1206. package/skills/doc-files/SKILL.md +86 -0
  1207. package/skills/doc-files/main.json +1 -0
  1208. package/skills/lint/SKILL.md +121 -0
  1209. package/skills/lint/main.json +1 -0
  1210. package/skills/llm-patch/SKILL.md +260 -0
  1211. package/skills/llm-patch/main.json +1 -0
  1212. package/skills/publish-telegram/SKILL.md +93 -0
  1213. package/skills/publish-telegram/main.json +1 -0
  1214. package/skills/taze/SKILL.md +114 -0
  1215. package/skills/taze/js/diff.mjs +140 -0
  1216. package/skills/taze/js/docs/diff.md +55 -0
  1217. package/skills/taze/js/docs/index.md +11 -0
  1218. package/skills/taze/main.json +1 -0
  1219. package/types/bin/n-rules.d.ts +2 -0
@@ -0,0 +1,732 @@
1
+ /**
2
+ * Central fix-pipeline unified lint surface (spec 2026-06-29 §Fix Role / §Tier Ladder).
3
+ *
4
+ * Послідовно, per concern:
5
+ * detect → (clean: keep) → T0 (permanent, поза rollback) → snapshot S1 →
6
+ * detect → (clean: keep) → ladder[restore S1 → worker → detect]* → (exhausted: rollback S1)
7
+ *
8
+ * Ролі чесні: detector тільки виявляє; T0 і worker тільки змінюють; success визначає
9
+ * ВИКЛЮЧНО canonical re-detect. Worker не володіє rollback/tier/ladder — лише один attempt.
10
+ * @typedef {import('./types.mjs').LintContext} LintContext
11
+ * @typedef {import('./types.mjs').LintViolation} LintViolation
12
+ * @typedef {import('./types.mjs').FixContext} FixContext
13
+ * @typedef {import('./types.mjs').T0Pattern} T0Pattern
14
+ * @typedef {import('./run-detectors.mjs').PlanItem} PlanItem
15
+ * @typedef {import('./ladder.mjs').Rung} Rung
16
+ */
17
+ import { existsSync } from 'node:fs'
18
+ import { join, relative } from 'node:path'
19
+ import { pathToFileURL } from 'node:url'
20
+
21
+ import { LOCAL_MIN, CLOUD_MIN, CLOUD_AVG, isLocalModel } from '@7n/llm-lib/model-tiers'
22
+ import { startChain } from '@7n/llm-lib/chain'
23
+ import { writeTrace } from '@7n/llm-lib/trace'
24
+ import { withTimeout } from '@7n/llm-lib/with-timeout'
25
+ import { buildDetectPlan } from './run-detectors.mjs'
26
+ import { runConcernDetector, DetectorError } from './detect.mjs'
27
+ import { renderViolations } from './render.mjs'
28
+ import { createSnapshot } from './snapshot.mjs'
29
+ import { findCollateralEdits, realpathBestEffort } from './collateral-veto.mjs'
30
+ import { createProgressReporter } from './progress.mjs'
31
+ import { buildLadder, decideAfterFailure, DEFAULT_MAX_AVG } from './ladder.mjs'
32
+
33
+ /**
34
+ * Стабільний ключ одиниці прогресу для ProgressReporter.
35
+ * @param {PlanItem} item Елемент плану.
36
+ * @returns {string} `rule/concern`
37
+ */
38
+ function progressKey(item) {
39
+ return `${item.entry.ruleId}/${item.entry.concern.name}`
40
+ }
41
+
42
+ /**
43
+ * Завантажує structured T0-патерни concern-а з `fix-<concern>.mjs`.
44
+ * @param {string} concernDir Директорія concern-а, де шукати fix-модуль.
45
+ * @param {string} concernName Ім'я concern-а для формування назви fix-файлу.
46
+ * @returns {Promise<T0Pattern[]>} Масив T0-патернів або порожній, якщо файл відсутній.
47
+ */
48
+ async function loadT0Patterns(concernDir, concernName) {
49
+ const fixPath = join(concernDir, `fix-${concernName}.mjs`)
50
+ if (!existsSync(fixPath)) return []
51
+ try {
52
+ // eslint-disable-next-line no-unsanitized/method
53
+ const mod = await import(pathToFileURL(fixPath).href)
54
+ return Array.isArray(mod.patterns) ? mod.patterns : []
55
+ } catch {
56
+ return []
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Резолвить fix-worker concern-а з `fix-worker.mjs` (експорт `fixWorker`).
62
+ * @param {string} concernDir Директорія concern-а, де шукати fix-worker.mjs.
63
+ * @returns {Promise<import('./types.mjs').FixWorkerFn|null>} Функція-worker або null, якщо відсутня.
64
+ */
65
+ async function loadFixWorker(concernDir) {
66
+ const workerPath = join(concernDir, 'fix-worker.mjs')
67
+ if (!existsSync(workerPath)) return null
68
+ try {
69
+ // eslint-disable-next-line no-unsanitized/method
70
+ const mod = await import(pathToFileURL(workerPath).href)
71
+ return typeof mod.fixWorker === 'function' ? mod.fixWorker : null
72
+ } catch {
73
+ return null
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Застосовує T0-патерни (детерміновано, permanent — поза rollback). `standalone: true`
79
+ * (spec docs/specs/2026-07-02-text-check-per-file-split-design.md §8, Phase 2) обходить
80
+ * `test()`-гейт: патерн сам ідемпотентний і самоаналізуючий (напр. `oxfmt --write`) — не
81
+ * потребує per-violation даних, щоб вирішити, чи запускати `apply()`.
82
+ * @param {T0Pattern[]} patterns Список T0-патернів для перевірки й застосування.
83
+ * @param {LintViolation[]} violations Порушення свого concern-а.
84
+ * @param {LintContext} ctx Контекст лінту (cwd, ruleId, concernId тощо).
85
+ * @param {(s: string) => void} log Логер для повідомлень про застосовані патерни.
86
+ * @returns {Promise<Array<{ id: string, message: string|null, touchedFiles: string[] }>>} Застосовані патерни з їхніми змінами.
87
+ */
88
+ async function applyT0(patterns, violations, ctx, log) {
89
+ const applied = []
90
+ for (const p of patterns) {
91
+ if (!p.standalone && !p.test(violations)) continue
92
+ const res = await p.apply(violations, ctx)
93
+ if (res && Array.isArray(res.touchedFiles)) {
94
+ applied.push({ id: p.id, message: res.message ?? null, touchedFiles: res.touchedFiles })
95
+ if (res.message) log(` ⚙️ T0 ${ctx.ruleId}/${ctx.concernId}: ${res.message}\n`)
96
+ }
97
+ }
98
+ return applied
99
+ }
100
+
101
+ /**
102
+ * Чи всі T0-патерни concern-а позначені `standalone: true` (і їх принаймні один) —
103
+ * такий concern пропускає початковий detect у fix-режимі: `apply()` викликається
104
+ * безумовно (ідемпотентно), а post-T0 re-detect сам стає джерелом правди "чи були
105
+ * порушення" (spec §8, Phase 2). Змішаний набір (частина standalone, частина ні) —
106
+ * НЕ підпадає: бодай один патерн, якому потрібні реальні violations, вимагає
107
+ * початкового detect для всього concern-а.
108
+ * @param {T0Pattern[]} patterns T0-патерни concern-а.
109
+ * @returns {boolean} true — concern можна фіксити без початкового detect.
110
+ */
111
+ function isStandaloneConcern(patterns) {
112
+ return patterns.length > 0 && patterns.every(p => p.standalone === true)
113
+ }
114
+
115
+ /**
116
+ * Re-detect одного concern-а (canonical verdict). Кидає DetectorError → пробрасується.
117
+ * Кожен знімок живить ProgressReporter — тикер «знайдено/виправлено» оновлюється
118
+ * саме тут, після кожного canonical detect.
119
+ * @param {PlanItem} item Елемент плану з entry та переліком файлів.
120
+ * @param {string} cwd Робоча директорія для запуску детектора.
121
+ * @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
122
+ * @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
123
+ * @returns {Promise<LintViolation[]>} Актуальні порушення concern-а після re-detect.
124
+ */
125
+ async function reDetect(item, cwd, progress = null, verbose = false) {
126
+ const ctx = { cwd, ruleId: item.entry.ruleId, concernId: item.entry.concern.name, files: item.files, verbose }
127
+ const res = await runConcernDetector(item.entry.concern, ctx)
128
+ progress?.detectSnapshot(progressKey(item), res.violations.length)
129
+ return res.violations
130
+ }
131
+
132
+ /**
133
+ * Резолвить worker concern-а: override → concern-specific fix-worker.mjs → дефолтний pi-agent.
134
+ * @param {string} concernDir Директорія concern-а.
135
+ * @param {import('./types.mjs').FixWorkerFn|null} [workerOverride] Worker-override для тестів.
136
+ * @returns {Promise<import('./types.mjs').FixWorkerFn|null>} Резолвлений worker або null.
137
+ */
138
+ async function resolveWorker(concernDir, workerOverride) {
139
+ const worker = workerOverride ?? (await loadFixWorker(concernDir))
140
+ if (worker) return worker
141
+ const defaultWorkerMod = await import('./default-worker.mjs')
142
+ return defaultWorkerMod.fixWorker
143
+ }
144
+
145
+ /**
146
+ * Фаза T0: застосовує детерміновані патерни й re-detect. Повертає стан фази.
147
+ * @param {PlanItem} item Елемент плану.
148
+ * @param {LintViolation[]} initialViolations Порушення до T0.
149
+ * @param {T0Pattern[]} patterns T0-патерни concern-а.
150
+ * @param {LintContext} lintCtx Контекст лінту.
151
+ * @param {string} cwd Робоча директорія.
152
+ * @param {(s: string) => void} log Логер.
153
+ * @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
154
+ * @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
155
+ * @returns {Promise<{ closed: boolean, violations: LintViolation[], applied: Array<{ id: string, message: string|null, touchedFiles: string[] }> }>} closed=true якщо concern закрито T0; applied — застосовані патерни з їхніми змінами.
156
+ */
157
+ async function runT0Phase(item, initialViolations, patterns, lintCtx, cwd, log, progress = null, verbose = false) {
158
+ if (patterns.length === 0) return { closed: false, violations: initialViolations, applied: [] }
159
+ progress?.concernStart(progressKey(item), 'T0')
160
+ const applied = await applyT0(patterns, initialViolations, lintCtx, log)
161
+ const afterT0 = await reDetect(item, cwd, progress, verbose)
162
+ if (afterT0.length === 0) {
163
+ log(` ✅ T0: ${lintCtx.ruleId}/${lintCtx.concernId}\n`)
164
+ return { closed: true, violations: afterT0, applied }
165
+ }
166
+ return { closed: false, violations: afterT0, applied }
167
+ }
168
+
169
+ /**
170
+ * @typedef {{ previousModel: string, previousError: string|null }} FixFeedback
171
+ */
172
+
173
+ /**
174
+ * @typedef {{ action: 'break'|'skip-model'|null, violations: LintViolation[], feedback: FixFeedback }} RungOutcome
175
+ */
176
+
177
+ /**
178
+ * Проводить один rung ladder-а: worker → canonical re-detect → rollback при провалі.
179
+ * @param {Rung} rung Поточна сходинка ladder-а.
180
+ * @param {import('./types.mjs').FixWorkerFn} worker Fix-worker concern-а.
181
+ * @param {LintViolation[]} violations Актуальні порушення на вході в rung.
182
+ * @param {FixFeedback|null} feedback Feedback з попереднього rung-а.
183
+ * @param {object} rungDeps Залежності rung-а.
184
+ * @param {PlanItem} rungDeps.item Елемент плану.
185
+ * @param {string} rungDeps.cwd Робоча директорія.
186
+ * @param {ReturnType<typeof createSnapshot>} rungDeps.snapshot Snapshot S1.
187
+ * @param {(s: string) => void} rungDeps.log Логер.
188
+ * @param {import('./progress.mjs').ProgressReporter|null} [rungDeps.progress] Reporter прогресу.
189
+ * @param {boolean} [rungDeps.verbose] Детальний вивід (прокидається у ctx concern-а).
190
+ * @returns {Promise<{ closed: true, touchedFiles: string[] } | { closed: false, outcome: RungOutcome }>} closed=true якщо concern закрито (touchedFiles — зміни worker-а); інакше результат для наступного кроку.
191
+ */
192
+ async function runRung(rung, worker, violations, feedback, rungDeps) {
193
+ const { item, cwd, snapshot, log, progress = null, verbose = false, chain = null } = rungDeps
194
+ const { ruleId } = item.entry
195
+ const concernName = item.entry.concern.name
196
+ progress?.concernStart(progressKey(item), rung.tier)
197
+
198
+ /** @type {FixContext} */
199
+ const fixCtx = {
200
+ cwd,
201
+ ruleId,
202
+ concernId: concernName,
203
+ files: item.files,
204
+ tier: rung.tier,
205
+ model: rung.model,
206
+ timeoutMs: rung.timeoutMs,
207
+ feedback: rung.feedback ? feedback : undefined,
208
+ recordWrite: absPath => snapshot.record(absPath),
209
+ recordDurableWrite: absPath => snapshot.recordDurable(absPath),
210
+ chain,
211
+ // Evidence-гейт рунга (Фаза A1): item-scoped canonical re-detect для verify-петлі
212
+ // всередині worker-а. ДетекторError тут ковтається у {ok:false} — зовнішній
213
+ // canonical re-detect нижче вдарить у той самий детектор і кине штатно.
214
+ verify: async () => {
215
+ let after
216
+ try {
217
+ after = await reDetect(item, cwd, progress, verbose)
218
+ } catch (detectError) {
219
+ return { ok: false, output: `detector error: ${detectError.message}` }
220
+ }
221
+ return { ok: after.length === 0, output: renderViolations(after) }
222
+ },
223
+ // Local-тири повільні — одна додаткова ітерація; cloud тягне дві.
224
+ verifyMax: isLocalModel(rung.model) ? 1 : 2
225
+ }
226
+
227
+ let workerResult = null
228
+ let error = null
229
+ try {
230
+ // Первинний таймаут — у самому worker-і (ctx.timeoutMs → runAgentFix abort-ить
231
+ // сесію). Backstop ×1.25 страхує від worker-а, що ігнорує ctx.timeoutMs
232
+ // (ADR 260620-0556: зависла cloud-SSE без гонки блокувала lint назавжди);
233
+ // запас гарантує, що штатно першим спрацьовує внутрішній abort-шлях.
234
+ workerResult = await withTimeout(worker(violations, fixCtx), Math.round(rung.timeoutMs * 1.25), {
235
+ label: 'fix'
236
+ })
237
+ } catch (workerError) {
238
+ error = workerError.message
239
+ }
240
+
241
+ // Canonical re-detect = джерело правди.
242
+ let after
243
+ try {
244
+ after = await reDetect(item, cwd, progress, verbose)
245
+ } catch (detectError) {
246
+ if (detectError instanceof DetectorError) throw detectError
247
+ throw detectError
248
+ }
249
+
250
+ // Semantic-collateral veto (§12 addendum 2026-07-05): clean-вердикт не приймається,
251
+ // якщо rung ЗМІНИВ наявні файли поза target-set порушення (клас «App.vue: хардкод
252
+ // версії замість getVersion»). Нові файли дозволені (scaffold/доки); порожній
253
+ // target-set (whole-repo концерни без file-атрибуції) → veto незастосовний.
254
+ const targetFiles = [...new Set([...violations.map(v => v.file).filter(Boolean), ...(item.files ?? [])])]
255
+ const collateral = findCollateralEdits({ modifiedExisting: snapshot.modifiedExisting(), targetFiles, cwd })
256
+ // relative — від так само realpath-нормалізованого cwd, інакше symlink-cwd (macOS
257
+ // /var → /private/var) дає `../../…`-шляхи у телеметрії та feedback.
258
+ const rejectedRel = collateral.map(p => relative(realpathBestEffort(cwd), p))
259
+ if (collateral.length > 0) {
260
+ // Телеметрія відхилених правок — той самий глобальний llm-trace, що й fix-виклики.
261
+ writeTrace({
262
+ caller: `fix:${ruleId}/${concernName}:${rung.tier}`,
263
+ backend: 'pi-ai',
264
+ kind: 'collateral-veto',
265
+ rule: ruleId,
266
+ rung: rung.tier,
267
+ model: rung.model,
268
+ cwd,
269
+ rejectedFiles: rejectedRel,
270
+ targetFiles,
271
+ cleanDetect: after.length === 0
272
+ })
273
+ }
274
+ const vetoed = after.length === 0 && !error && collateral.length > 0
275
+ const touchedFiles = workerResult?.touchedFiles ?? []
276
+
277
+ if (after.length === 0 && !error && !vetoed) {
278
+ log(` ✅ ${rung.tier} (${rung.model}): ${ruleId}/${concernName}\n`)
279
+ // Фаза C: успішний agentic-фікс (canonical clean, без veto) → глобальний
280
+ // distillation-стор (§13 pi-migration: корпус oldText→newText для маховика T0).
281
+ // Best-effort і лише за наявності реальних правок (T0/manual-фікси не пишемо).
282
+ const edits = workerResult?.telemetry?.edits
283
+ if (Array.isArray(edits) && edits.length > 0) {
284
+ const { recordFixTelemetry } = await import('@7n/llm-lib/telemetry-store')
285
+ recordFixTelemetry({
286
+ rule: ruleId,
287
+ concern: concernName,
288
+ rung: rung.tier,
289
+ model: rung.model,
290
+ cwd,
291
+ edits,
292
+ verifyAttempts: workerResult?.telemetry?.verifyAttempts?.length ?? 0,
293
+ anchoredEdits: workerResult?.telemetry?.anchoredEdits ?? false
294
+ })
295
+ }
296
+ return { closed: true, touchedFiles }
297
+ }
298
+
299
+ let errorSuffix = ' ❌ досі порушено'
300
+ if (error) errorSuffix = ` ❌ ${error.slice(0, 120)}`
301
+ else if (vetoed) errorSuffix = ` 🚫 collateral-veto: ${rejectedRel.join(', ')}`
302
+ log(` ⚡ ${rung.tier} (${rung.model}): ${ruleId}/${concernName}${errorSuffix}\n`)
303
+
304
+ // Не clean → restore S1 перед наступним rung-ом (degraded не тече далі).
305
+ // Durable-write-и worker-а (recordDurableWrite) rollback НЕ чіпає: кожен такий файл —
306
+ // самодостатній кінцевий стан (doc-files-батч), і прогрес по ньому вже зарахований
307
+ // canonical re-detect-ом вище — наступний rung/прогін продовжує з решти, не з нуля.
308
+ snapshot.rollback()
309
+
310
+ // Мовчазна невдача (worker не кинув виняток, але порушення лишилось) — без цього
311
+ // наступний rung стартує без жодного знання про попередню спробу (buildFixPrompt
312
+ // додає `## Попередня спроба` лише коли previousError truthy).
313
+ let silentFailureNote
314
+ if (vetoed) {
315
+ silentFailureNote =
316
+ `Попередня спроба (${rung.model}) закрила порушення, але змінила наявні файли поза ` +
317
+ `target-set (${rejectedRel.join(', ')}) — усі правки відхилено. ` +
318
+ `Редагуй ЛИШЕ файли порушення: ${targetFiles.join(', ')}.`
319
+ } else if (touchedFiles.length === 0) {
320
+ silentFailureNote = `Попередня спроба (${rung.model}) не внесла жодної зміни у файли; порушення досі активне.`
321
+ } else {
322
+ silentFailureNote =
323
+ `Попередня спроба (${rung.model}) торкнулась файлів (${touchedFiles.join(', ')}), ` +
324
+ 'але порушення досі активне — той самий підхід не спрацював, спробуй інакше.'
325
+ }
326
+
327
+ return {
328
+ closed: false,
329
+ outcome: {
330
+ action: decideAfterFailure(rung, error),
331
+ violations: after.length > 0 ? after : violations,
332
+ feedback: { previousModel: rung.model, previousError: error ?? silentFailureNote }
333
+ }
334
+ }
335
+ }
336
+
337
+ /** Кеп telemetry-списку змінених файлів у extra ланцюжка (повний обсяг — touchedTotal). */
338
+ const TOUCHED_FILES_CAP = 20
339
+
340
+ /**
341
+ * Стислий опис проблеми concern-а для шапки ланцюжка (`extra.problem` фінального
342
+ * chain-запису) — щоб в аналітиці (myllm, chains-report) було видно, ЩО саме
343
+ * вирішував ланцюжок, а не лише rule/concern.
344
+ * @param {LintViolation[]} violations Порушення concern-а.
345
+ * @returns {{ violations: number, reasons: string[], files: string[], sample: string|null }|null} Зведення або null, якщо порушень нема.
346
+ */
347
+ function summarizeProblem(violations) {
348
+ if (!violations?.length) return null
349
+ return {
350
+ violations: violations.length,
351
+ reasons: [...new Set(violations.map(v => v.reason))].slice(0, 5),
352
+ files: [...new Set(violations.map(v => v.file).filter(Boolean))].slice(0, 10),
353
+ sample: violations[0]?.message?.slice(0, 200) ?? null
354
+ }
355
+ }
356
+
357
+ /**
358
+ * Проводить ОДИН concern по pipeline: T0 → S1 → ladder. Повертає чи закрито.
359
+ * @param {PlanItem} item Елемент плану з entry та переліком файлів.
360
+ * @param {LintViolation[]} initialViolations Початкові порушення concern-а до fix.
361
+ * @param {object} deps Залежності pipeline.
362
+ * @param {string} deps.cwd Робоча директорія.
363
+ * @param {Rung[]} deps.ladder Сходинки ladder-а (tier/model послідовність).
364
+ * @param {() => number} deps.avgRemaining Скільки avg-бюджету лишилось.
365
+ * @param {(n: number) => void} deps.spendAvg Списати n одиниць avg-бюджету.
366
+ * @param {import('./types.mjs').FixWorkerFn|null} [deps.workerOverride] Worker-override для тестів.
367
+ * @param {T0Pattern[]} [deps.t0Override] T0-патерни override для тестів.
368
+ * @param {(s: string) => void} deps.log Логер прогресу.
369
+ * @param {import('./progress.mjs').ProgressReporter|null} [deps.progress] Reporter прогресу.
370
+ * @param {boolean} [deps.verbose] Детальний вивід (прокидається у ctx concern-а).
371
+ * @param {typeof startChain} [deps.chainFactory] Фабрика ланцюжка (інжект для тестів).
372
+ * @returns {Promise<boolean>} Чи закрито concern (усі порушення усунено).
373
+ */
374
+ export async function fixConcern(item, initialViolations, deps) {
375
+ const { ruleId } = item.entry
376
+ const concernName = item.entry.concern.name
377
+ // Ланцюжок concern-а охоплює і T0: закриття без жодного LLM-виклику (steps:0,
378
+ // t0Closed) — золотий baseline для метрики дистиляції.
379
+ const chain = (deps.chainFactory ?? startChain)({
380
+ kind: 'fix-concern',
381
+ unit: `${ruleId}/${concernName}`,
382
+ cwd: deps.cwd
383
+ })
384
+ const chainExtra = {
385
+ t0Closed: false,
386
+ stop: null,
387
+ rungs: [],
388
+ rollbacks: 0,
389
+ avgCapSkipped: 0,
390
+ // Шапка ланцюжка в аналітиці: яку проблему вирішували, хто закрив (t0 |
391
+ // tier:model), і до яких змін файлів це привело (permanent T0 + closing rung;
392
+ // rollback-нуті rung-и сюди не потрапляють).
393
+ problem: summarizeProblem(initialViolations),
394
+ resolvedBy: null,
395
+ t0Applied: [],
396
+ touchedFiles: [],
397
+ touchedTotal: 0
398
+ }
399
+ // Абсолютні шляхи змін накопичуються тут і нормалізуються один раз у finally
400
+ // (cwd-relative, дедуп, кеп) — щоб у trace не текли абсолютні шляхи машини.
401
+ const touchedAbs = []
402
+ let closed = false
403
+ try {
404
+ closed = await fixConcernCore(item, initialViolations, deps, chain, chainExtra, touchedAbs)
405
+ return closed
406
+ } finally {
407
+ const base = realpathBestEffort(deps.cwd)
408
+ const rel = [...new Set(touchedAbs.map(p => relative(base, realpathBestEffort(p))))]
409
+ chainExtra.touchedTotal = rel.length
410
+ chainExtra.touchedFiles = rel.slice(0, TOUCHED_FILES_CAP)
411
+ let outcome = 'fail'
412
+ if (closed) outcome = 'success'
413
+ else if (chainExtra.stop) outcome = 'partial'
414
+ chain.end({ outcome, extra: chainExtra })
415
+ }
416
+ }
417
+
418
+ /**
419
+ * Фіксує результат T0-фази в телеметрії ланцюжка: застосовані патерни, їхні
420
+ * зміни (permanent — рахуються навіть якщо concern далі не закрився) і
421
+ * resolvedBy='t0' при закритті.
422
+ * @param {{ closed: boolean, applied: Array<{ id: string, message: string|null, touchedFiles: string[] }> }} t0 Результат runT0Phase.
423
+ * @param {{ t0Closed: boolean, resolvedBy: string|null, t0Applied: object[] }} chainExtra Акумулятор extra.
424
+ * @param {string[]} touchedAbs Акумулятор абсолютних шляхів змін.
425
+ * @returns {void}
426
+ */
427
+ function noteT0Phase(t0, chainExtra, touchedAbs) {
428
+ if (t0.applied.length > 0) {
429
+ chainExtra.t0Applied = t0.applied.map(a => ({ id: a.id, message: a.message }))
430
+ touchedAbs.push(...t0.applied.flatMap(a => a.touchedFiles))
431
+ }
432
+ if (t0.closed) {
433
+ chainExtra.t0Closed = true
434
+ chainExtra.resolvedBy = 't0'
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Тіло fix-pipeline одного concern-а (T0 → S1 → ladder); chain/chainExtra — акумулятори
440
+ * телеметрії ланцюжка (володіє ними fixConcern-обгортка).
441
+ * @param {PlanItem} item Елемент плану.
442
+ * @param {LintViolation[]} initialViolations Початкові порушення.
443
+ * @param {object} deps Залежності pipeline (див. fixConcern).
444
+ * @param {object} chain Chain handle.
445
+ * @param {{ t0Closed: boolean, stop: string|null, rungs: object[], rollbacks: number, avgCapSkipped: number, problem: object|null, resolvedBy: string|null, t0Applied: object[] }} chainExtra Акумулятор extra.
446
+ * @param {string[]} touchedAbs Акумулятор абсолютних шляхів реально збережених змін (T0 + closing rung).
447
+ * @returns {Promise<boolean>} Чи закрито concern.
448
+ */
449
+ async function fixConcernCore(item, initialViolations, deps, chain, chainExtra, touchedAbs) {
450
+ const { cwd, ladder, log, progress = null, verbose = false } = deps
451
+ const { ruleId } = item.entry
452
+ const concernName = item.entry.concern.name
453
+ const concernDir = item.entry.concern.dir
454
+ /** @type {LintContext} */
455
+ const lintCtx = { cwd, ruleId, concernId: concernName, concernDir, files: item.files, verbose }
456
+
457
+ // ── T0 (детермінований, permanent) ──
458
+ const patterns = deps.t0Override ?? (await loadT0Patterns(concernDir, concernName))
459
+ const t0 = await runT0Phase(item, initialViolations, patterns, lintCtx, cwd, log, progress, verbose)
460
+ noteT0Phase(t0, chainExtra, touchedAbs)
461
+ if (t0.closed) return true
462
+ initialViolations = t0.violations
463
+ // Standalone-концерни стартують без початкового detect (problem=null) — перший
464
+ // canonical detect відбувається тут, після T0; фіксуємо його як проблему ланцюжка.
465
+ if (!chainExtra.problem) chainExtra.problem = summarizeProblem(initialViolations)
466
+
467
+ // ── Fixability-гейт ── config/structural concern-и НЕ йдуть у LLM-ladder: їхній фікс
468
+ // детермінований (T0/regen) або ризикований для авто-правки. T0 уже відпрацював вище —
469
+ // якщо не закрив, це сигнал ручного/config-фіксу, а не привід палити tier-и (fail-fast).
470
+ const fixability = item.entry.concern.fixability ?? 'code'
471
+ if (fixability !== 'code') {
472
+ log(` ⏹️ ${ruleId}/${concernName}: fixability=${fixability} — LLM-ladder пропущено (T0/manual)\n`)
473
+ chainExtra.stop = 'fixability'
474
+ return false
475
+ }
476
+
477
+ // ── Worker ladder ── concern-specific fix-worker.mjs, інакше дефолтний pi-agent worker.
478
+ const worker = await resolveWorker(concernDir, deps.workerOverride)
479
+ if (!worker || ladder.length === 0) {
480
+ chainExtra.stop = 'no-worker'
481
+ return false
482
+ }
483
+
484
+ // S1: знімок post-T0. Один tracker акумулює pre-images; rollback цілить у S1.
485
+ const snapshot = createSnapshot()
486
+ let feedback = null
487
+ let violations = initialViolations
488
+ const skipModels = new Set()
489
+
490
+ for (const rung of ladder) {
491
+ if (skipModels.has(rung.model)) continue
492
+ if (rung.isAvg && deps.avgRemaining() <= 0) {
493
+ log(` ⏭️ ${ruleId}/${concernName}: ${rung.tier} пропущено (avg-кеп вичерпано)\n`)
494
+ chainExtra.avgCapSkipped++
495
+ continue
496
+ }
497
+
498
+ const res = await runRung(rung, worker, violations, feedback, {
499
+ item,
500
+ cwd,
501
+ snapshot,
502
+ log,
503
+ progress,
504
+ verbose,
505
+ chain
506
+ })
507
+ if (rung.isAvg) deps.spendAvg(1)
508
+ chainExtra.rungs.push({
509
+ tier: rung.tier,
510
+ model: rung.model,
511
+ error: res.closed ? null : (res.outcome.feedback.previousError ?? '').slice(0, 200)
512
+ })
513
+ if (res.closed) {
514
+ chainExtra.resolvedBy = `${rung.tier}:${rung.model}`
515
+ touchedAbs.push(...res.touchedFiles)
516
+ return true
517
+ }
518
+ chainExtra.rollbacks++
519
+
520
+ violations = res.outcome.violations
521
+ feedback = res.outcome.feedback
522
+ if (res.outcome.action === 'break') break
523
+ if (res.outcome.action === 'skip-model') skipModels.add(rung.model)
524
+ }
525
+
526
+ return false
527
+ }
528
+
529
+ /**
530
+ * Detect-фаза: прогін усіх concern-ів плану. При `DetectorError` — сигнал коду 2.
531
+ * @param {PlanItem[]} plan План прогону.
532
+ * @param {string} cwd Робоча директорія.
533
+ * @param {boolean} verbose Детальний вивід плану.
534
+ * @param {(s: string) => void} log Логер.
535
+ * @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
536
+ * @returns {Promise<{ code: 2 } | { detected: Array<{ item: PlanItem, violations: LintViolation[] }> }>} код 2 при DetectorError або зібрані результати detect.
537
+ */
538
+ async function detectAllForFix(plan, cwd, verbose, log, progress = null) {
539
+ /** @type {Array<{ item: PlanItem, violations: LintViolation[] }>} */
540
+ const detected = []
541
+ for (const item of plan) {
542
+ const ctx = { cwd, ruleId: item.entry.ruleId, concernId: item.entry.concern.name, files: item.files, verbose }
543
+ progress?.concernStart(progressKey(item), 'detect')
544
+ if (verbose) {
545
+ const countStr = item.files === undefined ? 'весь репо' : `${item.files.length} файл(ів)`
546
+ log(` 🔍 ${ctx.ruleId}/${ctx.concernId} [${item.entry.concern.lint.scope}] → ${countStr}\n`)
547
+ }
548
+ try {
549
+ const res = await runConcernDetector(item.entry.concern, ctx)
550
+ progress?.detectSnapshot(progressKey(item), res.violations.length)
551
+ detected.push({ item, violations: res.violations })
552
+ } catch (detectError) {
553
+ if (detectError instanceof DetectorError) {
554
+ log(`💥 ${detectError.message}\n`)
555
+ return { code: 2 }
556
+ }
557
+ throw detectError
558
+ }
559
+ }
560
+ return { detected }
561
+ }
562
+
563
+ /**
564
+ * Фінальний render невирішених порушень (після провального fix-проходу).
565
+ * @param {Array<{ item: PlanItem, violations: LintViolation[] }>} failing Провальні concern-и.
566
+ * @param {string} cwd Робоча директорія.
567
+ * @param {(s: string) => void} log Логер.
568
+ * @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
569
+ * @returns {Promise<void>} нічого не повертає (тільки лог).
570
+ */
571
+ async function renderRemaining(failing, cwd, log, verbose = false) {
572
+ const remaining = []
573
+ for (const { item } of failing) {
574
+ try {
575
+ remaining.push(...(await reDetect(item, cwd, null, verbose)))
576
+ } catch {
577
+ /* DetectorError на фінальному render — ігноруємо, основний verdict уже worst=1 */
578
+ }
579
+ }
580
+ if (remaining.length > 0) log(renderViolations(remaining))
581
+ return remaining
582
+ }
583
+
584
+ /**
585
+ * Фаза B: матеріалізує невиправлений хвіст у вузли MT-графа. Єдиний гейт —
586
+ * **onboarded-репо** (наявність `.mt.json`, перевіряє preflight у materializeTail):
587
+ * не-MT-репо → fail-open skip; MT-репо → хвіст стає графом задач, executor яких —
588
+ * наш pi-harness (`ensureNodeExecutor` конфігурує `node_executor`). Env-прапорець
589
+ * скасовано (rollout-guard більше не потрібен — B2/executor-міст у main). Fail-open
590
+ * на всіх рівнях: lint ніколи не падає через MT.
591
+ * @param {LintViolation[]} remaining Невиправлені порушення (з renderRemaining).
592
+ * @param {string} cwd Робоча директорія.
593
+ * @param {(s: string) => void} log Логер.
594
+ * @returns {Promise<void>} нічого не повертає (side-effect: вузли у mt/).
595
+ */
596
+ async function materializeTailToMt(remaining, cwd, log) {
597
+ if (remaining.length === 0) return
598
+ const { materializeTail } = await import('./mt-tail.mjs')
599
+ try {
600
+ materializeTail({ violations: remaining, cwd, createdAt: new Date().toISOString(), log })
601
+ } catch (error) {
602
+ // Ніколи не валимо lint через MT-матеріалізацію (fail-open навіть на неочікуваному).
603
+ log(` ⏭️ MT-tail помилка (проігноровано): ${error.message}\n`)
604
+ }
605
+ }
606
+
607
+ /**
608
+ * Повний fix-pipeline: detect усе → fix кожен провальний concern → exit code.
609
+ * @param {object} opts Опції запуску pipeline.
610
+ * @param {string} opts.rulesDir Директорія з правилами.
611
+ * @param {string} opts.cwd Робоча директорія.
612
+ * @param {boolean} [opts.full] Прогін по всьому репо замість дельти.
613
+ * @param {string[]} [opts.rules] Перелік ruleId для обмеження прогону.
614
+ * @param {string[]|null} [opts.files] Перелік файлів або null для повного набору.
615
+ * @param {boolean} [opts.verbose] Детальний вивід плану детекції.
616
+ * @param {number} [opts.maxAvg] Ліміт avg-бюджету.
617
+ * @param {(s: string) => void} [opts.log] Логер виводу.
618
+ * @param {boolean} [opts.isTTY] Override TTY-режиму ProgressReporter (тести); типово isTTY stdout.
619
+ * @param {(snap: object) => void} [opts.onProgress] Публікація знімків прогресу назовні (черга lint --full).
620
+ * @param {object} [opts.deps] Інжекти для тестів: { ladder, workerFor, t0For, chainFactory }.
621
+ * @returns {Promise<0|1|2>} Exit code: 0 — чисто, 1 — лишились порушення, 2 — DetectorError.
622
+ */
623
+ export async function runFixPipeline(opts) {
624
+ const { cwd } = opts
625
+ const baseLog = opts.log ?? (s => process.stdout.write(s))
626
+ const verbose = opts.verbose === true
627
+ const deps = opts.deps ?? {}
628
+
629
+ const plan = await buildDetectPlan(opts)
630
+
631
+ // ProgressReporter (канон scripts.mdc «Прогрес довгих lint/fix-прогонів»):
632
+ // бар по концернах + тикер порушень; TTY/не-TTY розгалуження всередині.
633
+ // onUpdate → publisher черги (--full): процеси в черзі бачать живий прогрес.
634
+ const progress = createProgressReporter({
635
+ total: plan.length,
636
+ log: baseLog,
637
+ isTTY: opts.isTTY,
638
+ onUpdate: opts.onProgress
639
+ })
640
+ const log = progress.log
641
+
642
+ // Преloadимо T0-патерни разом із планом — потрібно, щоб класифікувати standalone-концерни
643
+ // (spec docs/specs/2026-07-02-text-check-per-file-split-design.md §8, Phase 2) ДО початкового
644
+ // detect. Той самий preload передається далі в fixConcern як t0Override — без повторного
645
+ // dynamic import().
646
+ const patternsByItem = new Map(
647
+ await Promise.all(
648
+ plan.map(async item => [
649
+ item,
650
+ deps.t0For
651
+ ? (deps.t0For(item.entry) ?? [])
652
+ : await loadT0Patterns(item.entry.concern.dir, item.entry.concern.name)
653
+ ])
654
+ )
655
+ )
656
+ const standaloneItems = plan.filter(item => isStandaloneConcern(patternsByItem.get(item)))
657
+ const normalPlan = plan.filter(item => !standaloneItems.includes(item))
658
+
659
+ // try/finally: stop() гарантовано звільняє TTY-рядок (hideCursor) навіть при
660
+ // DetectorError з глибини fix-циклу; сам stop() ідемпотентний.
661
+ try {
662
+ // ── Detect лише для normal-концернів; standalone апляє одразу (без початкового detect) ──
663
+ const detectResult = await detectAllForFix(normalPlan, cwd, verbose, log, progress)
664
+ if ('code' in detectResult) return detectResult.code
665
+
666
+ const failing = detectResult.detected.filter(d => d.violations.length > 0)
667
+ // Чисті концерни закриваються одразу — бар рухається без очікування fix-фази.
668
+ for (const d of detectResult.detected) {
669
+ if (d.violations.length === 0) progress.concernDone(progressKey(d.item))
670
+ }
671
+ if (failing.length === 0 && standaloneItems.length === 0) return 0
672
+
673
+ const ladder = deps.ladder ?? buildLadder({ localMin: LOCAL_MIN, cloudMin: CLOUD_MIN, cloudAvg: CLOUD_AVG })
674
+ let avgBudget = typeof opts.maxAvg === 'number' ? opts.maxAvg : DEFAULT_MAX_AVG
675
+
676
+ /**
677
+ * @param {PlanItem} item Елемент плану.
678
+ * @param {LintViolation[]} violations Початкові порушення (порожньо для standalone).
679
+ * @returns {Promise<boolean>} Чи закрито concern.
680
+ */
681
+ const runOne = (item, violations) =>
682
+ fixConcern(item, violations, {
683
+ cwd,
684
+ ladder,
685
+ log,
686
+ progress,
687
+ verbose,
688
+ avgRemaining: () => avgBudget,
689
+ spendAvg: n => {
690
+ avgBudget -= n
691
+ },
692
+ workerOverride: deps.workerFor ? deps.workerFor(item.entry) : undefined,
693
+ t0Override: patternsByItem.get(item),
694
+ chainFactory: deps.chainFactory
695
+ })
696
+
697
+ let worst = 0
698
+ const attemptedForRender = []
699
+
700
+ for (const { item, violations } of failing) {
701
+ if (!(await runOne(item, violations))) {
702
+ worst = 1
703
+ attemptedForRender.push({ item })
704
+ }
705
+ progress.concernDone(progressKey(item))
706
+ }
707
+
708
+ for (const item of standaloneItems) {
709
+ if (verbose) {
710
+ const label = `${item.entry.ruleId}/${item.entry.concern.name}`
711
+ log(` 🔍 ${label} [standalone-merge] → apply без початкового detect\n`)
712
+ }
713
+ if (!(await runOne(item, []))) {
714
+ worst = 1
715
+ attemptedForRender.push({ item })
716
+ }
717
+ progress.concernDone(progressKey(item))
718
+ }
719
+
720
+ // Бар звільняє TTY-рядок ДО фінального render-у невирішених порушень.
721
+ progress.stop()
722
+ if (worst === 1) {
723
+ const remaining = await renderRemaining(attemptedForRender, cwd, baseLog, verbose)
724
+ // B1: невиправлений хвіст → вузли MT (за env-гейтом, fail-open).
725
+ await materializeTailToMt(remaining, cwd, baseLog)
726
+ }
727
+
728
+ return worst
729
+ } finally {
730
+ progress.stop()
731
+ }
732
+ }