@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,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: walk-cache.mjs
4
+ resource: npm/scripts/utils/walk-cache.mjs
5
+ docgen:
6
+ crc: 82798fa2
7
+ ---
8
+
9
+ Файл забезпечує спільний кеш результатів обходу файлової системи для всіх операцій перевірки. Він зберігає список файлів, що відповідають заданим шаблонам, щоб уникнути повторних обходів. Це підвищує ефективність процесу перевірки, особливо при великій кількості файлів та шаблонів.
10
+
11
+ ## Поведінка
12
+
13
+ getOrCreateWalkCache: Створює або повертає кеш.
14
+ resetWalkCache: Скидає кеш.
15
+
16
+ ## Публічний API
17
+
18
+ - getOrCreateWalkCache — Створює або повертає cache, ініціалізує його при першому використанні.
19
+ - resetWalkCache — Очищає cache.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Кеш існує лише в межах одного процесу.
24
+ - Кеш скидається при виклику `resetWalkCache`.
25
+ - Кеш зберігає список файлів, отриманий в результаті прогону.
26
+ - Значення кешу – `Promise<string[]>`.
27
+ - Кеш використовується для обробки glob/regex дескрипторів.
28
+ - Кеш не використовується для взаємодії з мережею.
29
+ - Кеш зберігає дані лише протягом одного прогону.
30
+ - Кеш не гарантує наявності файлів, що відповідають дескрипторам.
31
+ - Кеш не гарантує порядку файлів у списку.
@@ -0,0 +1,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: walkDir.mjs
4
+ resource: npm/scripts/utils/walkDir.mjs
5
+ docgen:
6
+ crc: f205f003
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ Публічна функція `walkDir` здійснює рекурсивний пошук файлів у вказаному каталозі. Вона обходить файлову систему, ігноруючи каталоги `.git` та `node_modules`. Знаходячи кожен файл, вона передає його повний шлях у колбек для подальшої обробки. Компонент є read-only, тобто не виконує записів у файлову систему чи бази даних. При роботі з файловою системою він перехоплює помилки, забезпечуючи безпечну роботу без викидання винятків.
12
+
13
+ ## Поведінка
14
+
15
+ 1. Викликається функція walkDir для початку рекурсивного обходу каталогу.
16
+ 2. Система розшифровує вхідний шлях до кореня обходу.
17
+ 3. Система формує додаткові правила ігнорування на основі наданих шляхів.
18
+ 4. Система завжди ігнорує каталоги .git та node_modules.
19
+ 5. Система виконує пошук усіх файлів у каталозі, застосовуючи правила ігнорування, включаючи ті, що визначені в .gitignore.
20
+ 6. У разі виникнення помилки під час пошуку, процес обходу припиняється без генерації винятку.
21
+ 7. Для кожного знайденого файлу система викликає наданий колбек, передаючи йому повний абсолютний шлях до цього файлу.
22
+
23
+ ## Публічний API
24
+
25
+ walkDir — рекурсивно переглядає файли та папки, ігноруючи ті, що вказані у файлі `.gitignore`.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
31
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: with-lock.mjs
4
+ resource: npm/scripts/utils/with-lock.mjs
5
+ docgen:
6
+ crc: 45df57fc
7
+ score: 95
8
+ ---
9
+
10
+ Файл реалізує механізм захисту важких команд через атомарне блокування та унікалізацію результатів. Функції дозволяють перевіряти можливість повторного використання результату з кешу та виконувати команду через серіалізований механізм. Механізм використовує `mkdirSync-based lock` та `sha256-dedup` з TTL.
11
+
12
+ ## Поведінка
13
+
14
+ shouldDedup
15
+ Перевіряє можливість повторного використання результату з кешу.
16
+
17
+ withLock
18
+ Серіалізує важку команду через атомарний lock та dedup.
19
+
20
+ ## Публічний API
21
+
22
+ shouldDedup — Чи можна пропустити повторний прогін за кешованим result.json.
23
+ withLock — Серіалізує важку команду через атомарний lock і dedup за fingerprint.
24
+
25
+ ## Гарантії поведінки
26
+
27
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
28
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
29
+ - Кешує результати в межах одного прогону.
30
+ - Не звертається до мережі.
@@ -0,0 +1,31 @@
1
+ ---
2
+ type: JS Module
3
+ title: worktree-fingerprint.mjs
4
+ resource: npm/scripts/utils/worktree-fingerprint.mjs
5
+ docgen:
6
+ crc: df297382
7
+ ---
8
+
9
+ Файл надає унікальний відбиток робочої директорії. Цей відбиток використовується для ідентифікації та порівняння робочих директорій, забезпечуючи їх унікальність у системі. Він слугує базовим інструментом для відстеження та управління версіями.
10
+
11
+ ## Поведінка
12
+
13
+ 1. Отримує поточний SHA256 хеш коміту, який знаходиться в гілці HEAD.
14
+ 2. Отримує текст зміни між комітом HEAD та робочим каталогом.
15
+ 3. Отримує список не відстежених файлів у робочому каталозі, не включаючи стандартні файли, що ігноруються.
16
+ 4. Для кожного не відстеженого файлу отримує його SHA256 хеш.
17
+ 5. Об'єднує SHA256 хеш коміту, текст зміни та пари "файл:хеш" не відстежених файлів, розділяючи їх новими рядками.
18
+ 6. Обчислює SHA256 хеш отриманого текстового рядка.
19
+ 7. Повертає отриманий SHA256 хеш у форматі 64-значної шестнадцяткової строки.
20
+ 8. Якщо виникає помилка під час виконання будь-якої з операцій, повертає `null`.
21
+
22
+ ## Публічний API
23
+
24
+ worktreeFingerprint — генерує унікальний відбиток поточного стану репозиторію Git.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Функція повертає `true`, якщо відбиток дерева робіт успішно обчислено.
29
+ - Функція повертає `null`, якщо обчислення відбитка дерева робіт не вдалося.
30
+ - Функція не викликає винятків.
31
+ - Функція не використовує кеш.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Idempotent append-only модуль оновлення `.gitignore` у корені проєкту. Перевіряє,
3
+ * чи задані entries уже присутні (точне співпадіння рядка після `trim`); відсутні
4
+ * дописує під header-коментар, не порушуючи решту файлу. Якщо `.gitignore` немає —
5
+ * створюється з заданими entries + header.
6
+ *
7
+ * Викликається з test-концерну `stryker_config` (gitignore Stryker temp dirs).
8
+ */
9
+ import { existsSync } from 'node:fs'
10
+ import { readFile, writeFile } from 'node:fs/promises'
11
+ import { join } from 'node:path'
12
+
13
+ /**
14
+ * @param {string} cwd корінь репо (де знаходиться `.gitignore`)
15
+ * @param {string[]} entries патерни для .gitignore (порядок збережено)
16
+ * @param {string} sectionLabel header-коментар над секцією (без `#`-префікса)
17
+ * @returns {Promise<{added: string[]}>} перелік патернів, що були дописані
18
+ */
19
+ export async function ensureGitignoreEntries(cwd, entries, sectionLabel) {
20
+ const gitignorePath = join(cwd, '.gitignore')
21
+ const existing = existsSync(gitignorePath) ? await readFile(gitignorePath, 'utf8') : ''
22
+ const existingLines = new Set(existing.split('\n').map(line => line.trim()))
23
+ const missing = entries.filter(entry => !existingLines.has(entry))
24
+ if (missing.length === 0) return { added: [] }
25
+
26
+ const prefix = existing.length === 0 || existing.endsWith('\n') ? '' : '\n'
27
+ const block = `${prefix}\n# ${sectionLabel}\n${missing.join('\n')}\n`
28
+ await writeFile(gitignorePath, existing + block)
29
+ return { added: missing }
30
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Спільна утиліта для check-скриптів: збирає всі `package.json` у дереві (крім пропущених
3
+ * каталогів у `walkDir`), сортує за відносним шляхом. Винесена з check-js-bun-db / check-js-mssql,
4
+ * щоб уникнути дублювання (jscpd).
5
+ */
6
+ import { relative, sep } from 'node:path'
7
+
8
+ import { walkDir } from './walkDir.mjs'
9
+
10
+ /**
11
+ * Знаходить всі `package.json` у репозиторії (крім пропущених директорій у walkDir).
12
+ * @param {string} repoRoot абсолютний шлях до кореня репозиторію
13
+ * @param {string[]} ignorePaths абсолютні шляхи каталогів, повністю виключених з обходу
14
+ * @returns {Promise<string[]>} абсолютні шляхи, відсортовані за відносним шляхом
15
+ */
16
+ export async function findAllPackageJsonPaths(repoRoot, ignorePaths) {
17
+ /** @type {string[]} */
18
+ const paths = []
19
+ await walkDir(
20
+ repoRoot,
21
+ absPath => {
22
+ if (absPath.endsWith(`${sep}package.json`)) {
23
+ paths.push(absPath)
24
+ }
25
+ },
26
+ ignorePaths
27
+ )
28
+ paths.sort((a, b) => relative(repoRoot, a).localeCompare(relative(repoRoot, b)))
29
+ return paths
30
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Обчислення директорії стану `withLock` (lock + dedup), СПІЛЬНОЇ для всіх git-worktree.
3
+ *
4
+ * Лок-стан (`lock/owner.json`, `result.json`) має бути один на головний checkout
5
+ * і всі linked-worktree. Інакше важкі команди (eslint/oxlint/jscpd, conftest,
6
+ * hadolint, per-rule fix), запущені в різних worktree, НЕ серіалізуються —
7
+ * кожен worktree має власний `node_modules/.cache/`, локи одне одного не бачать,
8
+ * і паралельний eslint перевантажує CPU/диск на macOS.
9
+ *
10
+ * `git rev-parse --git-common-dir` повертає той самий `.git` головного репо з
11
+ * будь-якого worktree, тож стан кладемо під `<git-common-dir>/n-rules/<key>`
12
+ * (всередині `.git` — спільне, ніколи не трекається, переживає `bun i`).
13
+ * Поза git-репо (git недоступний / каталог не репо) — fallback на per-checkout
14
+ * `node_modules/.cache/n-rules/<key>`, як було історично.
15
+ */
16
+ import { spawnSync } from 'node:child_process'
17
+ import { join, resolve } from 'node:path'
18
+
19
+ /**
20
+ * @param {string} key ключ локу (`lint-ga`, `fix-bun`, …)
21
+ * @param {{cwd?:string, spawn?:typeof import('child_process').spawnSync}} [opts] робоча директорія та sync-виклик git (ін'єкція для тестів)
22
+ * @returns {string} абсолютний шлях до директорії стану локу для цього ключа
23
+ */
24
+ export function resolveLockCacheDir(key, opts = {}) {
25
+ const cwd = opts.cwd ?? process.cwd()
26
+ const spawn = opts.spawn ?? spawnSync
27
+
28
+ const r = spawn('git', ['rev-parse', '--git-common-dir'], { cwd, encoding: 'utf8' })
29
+ const commonDir = r.status === 0 && !r.error ? r.stdout.trim() : ''
30
+
31
+ if (commonDir === '') {
32
+ return join(cwd, 'node_modules/.cache/n-rules', key)
33
+ }
34
+ // commonDir буває відносним (`.git` з кореня) або абсолютним (linked-worktree):
35
+ // resolve проти cwd дає однаковий абсолютний `<main>/.git` в обох випадках.
36
+ return join(resolve(cwd, commonDir), 'n-rules', key)
37
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Допоміжна функція для скриптів перевірки.
3
+ *
4
+ * Друкує в консоль рядок успіху з галочкою (✅).
5
+ * @param {string} msg текст повідомлення
6
+ */
7
+ export function pass(msg) {
8
+ console.log(` ✅ ${msg}`)
9
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Резолвить шлях до Cargo.toml у проєкті: cwd/Cargo.toml або в одному з
3
+ * workspace-підкаталогів (з підтримкою Tauri-патерну `<workspace>/src-tauri/`).
4
+ * Спільна утиліта для coverage-провайдера rust і test-концерну cargo_mutants_config.
5
+ * Повертає null (а не throw) щоб callsite-и могли gracefully skip-пропустити.
6
+ */
7
+ import { existsSync } from 'node:fs'
8
+ import { readFile } from 'node:fs/promises'
9
+ import { join } from 'node:path'
10
+
11
+ /**
12
+ * @param {string} cwd корінь проєкту
13
+ * @returns {Promise<string|null>} абсолютний шлях до Cargo.toml або null
14
+ */
15
+ export async function resolveCargoManifest(cwd) {
16
+ const rootManifest = join(cwd, 'Cargo.toml')
17
+ if (existsSync(rootManifest)) return rootManifest
18
+
19
+ const rootPkgPath = join(cwd, 'package.json')
20
+ if (existsSync(rootPkgPath)) {
21
+ const rootPkg = JSON.parse(await readFile(rootPkgPath, 'utf8'))
22
+ const workspaces = Array.isArray(rootPkg.workspaces) ? rootPkg.workspaces : []
23
+ for (const ws of workspaces) {
24
+ const tauri = join(cwd, ws, 'src-tauri', 'Cargo.toml')
25
+ if (existsSync(tauri)) return tauri
26
+ const flat = join(cwd, ws, 'Cargo.toml')
27
+ if (existsSync(flat)) return flat
28
+ }
29
+ }
30
+ return null
31
+ }
32
+
33
+ /**
34
+ * Plural-варіант: повертає всі Cargo.toml-маніфести в проєкті — корінь
35
+ * (`cwd/Cargo.toml`) і у workspace-підкаталогах (`<ws>/src-tauri/Cargo.toml`
36
+ * пріоритетніше за `<ws>/Cargo.toml`). Порожній масив якщо нічого не знайдено.
37
+ * Використовується test-концерном `cargo_mutants_config` для per-manifest
38
+ * baseline-копіювання.
39
+ * @param {string} cwd корінь проєкту
40
+ * @returns {Promise<string[]>} абсолютні шляхи до знайдених Cargo.toml
41
+ */
42
+ export async function resolveAllCargoManifests(cwd) {
43
+ const manifests = []
44
+ const rootManifest = join(cwd, 'Cargo.toml')
45
+ if (existsSync(rootManifest)) manifests.push(rootManifest)
46
+
47
+ const rootPkgPath = join(cwd, 'package.json')
48
+ if (existsSync(rootPkgPath)) {
49
+ const rootPkg = JSON.parse(await readFile(rootPkgPath, 'utf8'))
50
+ const workspaces = Array.isArray(rootPkg.workspaces) ? rootPkg.workspaces : []
51
+ for (const ws of workspaces) {
52
+ const tauri = join(cwd, ws, 'src-tauri', 'Cargo.toml')
53
+ if (existsSync(tauri)) {
54
+ manifests.push(tauri)
55
+ continue
56
+ }
57
+ const flat = join(cwd, ws, 'Cargo.toml')
58
+ if (existsSync(flat)) manifests.push(flat)
59
+ }
60
+ }
61
+ return manifests
62
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Утиліта для розв'язання абсолютного шляху до команди в PATH.
3
+ *
4
+ * Використовується для виклику зовнішніх інструментів через абсолютний шлях
5
+ * замість команди з PATH (sonarjs/no-os-command-from-path).
6
+ */
7
+ import { spawnSync } from 'node:child_process'
8
+ import { platform } from 'node:process'
9
+
10
+ /**
11
+ * Повертає абсолютний шлях до команди в PATH або null, якщо команда не знайдена.
12
+ * @param {string} cmd ім'я команди без шляху
13
+ * @returns {string | null} абсолютний шлях або null
14
+ */
15
+ export function resolveCmd(cmd) {
16
+ const whichCmd = platform === 'win32' ? 'where' : 'which'
17
+ // Явно передаємо `process.env`, інакше Bun вмикає snapshot оточення на старті процесу
18
+ // і не бачить змін `process.env.PATH` у runtime (типова ситуація — підстановка стабів у тестах).
19
+ const result = spawnSync(whichCmd, [cmd], { encoding: 'utf8', env: process.env })
20
+ if (result.status !== 0 || result.error) {
21
+ return null
22
+ }
23
+ const line = result.stdout.trim().split('\n', 1)[0].trim()
24
+ return line || null
25
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Резолвить корінь JS-коду в проєкті: для workspace-projects — перший workspace
3
+ * (з підтримкою glob-патернів типу `cf/*`), для single-package — корінь cwd.
4
+ * Спільна утиліта для coverage-провайдера js і test-концерну stryker_config (DRY).
5
+ */
6
+ import { existsSync } from 'node:fs'
7
+ import { glob, readFile } from 'node:fs/promises'
8
+ import { join } from 'node:path'
9
+
10
+ const WORKSPACE_GLOB_IGNORE = ['**/node_modules/**', '**/.git/**']
11
+ const PACKAGE_JSON_SUFFIX_RE = /[/\\]package\.json$/
12
+
13
+ /**
14
+ * Розгортає один workspace-патерн у список абсолютних шляхів каталогів з package.json.
15
+ * Літеральні патерни перевіряються через existsSync; glob-патерни — через node:fs/promises#glob.
16
+ * @param {string} cwd корінь проєкту
17
+ * @param {string} pattern workspace-патерн з package.json (наприклад, `app` або `cf/*`)
18
+ * @returns {Promise<string[]>} абсолютні шляхи до workspace-каталогів
19
+ */
20
+ async function expandWorkspacePattern(cwd, pattern) {
21
+ if (!pattern.includes('*')) {
22
+ const wsPath = join(cwd, pattern)
23
+ return existsSync(join(wsPath, 'package.json')) ? [wsPath] : []
24
+ }
25
+ const results = []
26
+ for await (const rel of glob(`${pattern}/package.json`, { cwd, exclude: WORKSPACE_GLOB_IGNORE })) {
27
+ const wsRel = rel.replace(PACKAGE_JSON_SUFFIX_RE, '')
28
+ results.push(join(cwd, wsRel))
29
+ }
30
+ return results.toSorted()
31
+ }
32
+
33
+ /**
34
+ * @param {string} cwd корінь проєкту (де `.n-rules.json` і кореневий package.json)
35
+ * @returns {Promise<string|null>} абсолютний шлях до JS-root або null без кореневого package.json
36
+ */
37
+ export async function resolveJsRoot(cwd) {
38
+ const roots = await resolveAllJsRoots(cwd)
39
+ if (roots.length === 0) return null
40
+ return roots[0]
41
+ }
42
+
43
+ /**
44
+ * Plural-варіант: повертає всі JS-roots проєкту. Для workspace-projects — кожен
45
+ * workspace з власним `package.json` (з розгортанням glob-патернів); для
46
+ * single-package — `[cwd]`. Порожній масив без кореневого package.json.
47
+ * @param {string} cwd корінь проєкту
48
+ * @returns {Promise<string[]>} абсолютні шляхи до всіх JS-roots
49
+ */
50
+ export async function resolveAllJsRoots(cwd) {
51
+ const rootPkgPath = join(cwd, 'package.json')
52
+ if (!existsSync(rootPkgPath)) return []
53
+ const rootPkg = JSON.parse(await readFile(rootPkgPath, 'utf8'))
54
+ const patterns = Array.isArray(rootPkg.workspaces) ? rootPkg.workspaces : []
55
+ if (patterns.length === 0) return [cwd]
56
+ const roots = []
57
+ for (const pattern of patterns) {
58
+ roots.push(...(await expandWorkspacePattern(cwd, pattern)))
59
+ }
60
+ return roots.length > 0 ? roots : [cwd]
61
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Module-singleton FS-walk cache, спільний для всіх concerns одного `check`-прогону.
3
+ * Ключі — рядкові glob/regex дескриптори; значення — `Promise<string[]>` зі списком файлів.
4
+ * Кеш живий у межах одного процесу (Node/Bun module-instance). Тести скидають через `resetWalkCache()`.
5
+ */
6
+
7
+ /** @type {Map<string, Promise<string[]>> | null} */
8
+ let cache = null
9
+
10
+ /**
11
+ * Повертає поточний cache; lazy-ініціалізує при першому виклику.
12
+ * @returns {Map<string, Promise<string[]>>} module-singleton walk cache
13
+ */
14
+ export function getOrCreateWalkCache() {
15
+ if (cache === null) cache = new Map()
16
+ return cache
17
+ }
18
+
19
+ /**
20
+ * Скидає cache (для тестів між кейсами).
21
+ */
22
+ export function resetWalkCache() {
23
+ cache = new Map()
24
+ }
@@ -0,0 +1,55 @@
1
+ /** @see ./docs/walkDir.md */
2
+ import { join, relative, resolve, sep } from 'node:path'
3
+ import { globby } from 'globby'
4
+
5
+ // .git ніколи не потрапляє в .gitignore — пропускаємо завжди.
6
+ // node_modules — safety net: проєкт може не мати .gitignore або запускатись поза git-репо.
7
+ export const ALWAYS_IGNORE = ['.git/**', 'node_modules/**']
8
+
9
+ /**
10
+ * Прибирає всі кінцеві `/` без regex-бектрекінгу.
11
+ * @param {string} p вхідний шлях.
12
+ * @returns {string} шлях без кінцевих слешів.
13
+ */
14
+ function stripTrailingSlashes(p) {
15
+ let end = p.length
16
+ while (end > 0 && p[end - 1] === '/') end -= 1
17
+ return p.slice(0, end)
18
+ }
19
+
20
+ /**
21
+ * Рекурсивно обходить каталог, поважаючи .gitignore (включно з вкладеними).
22
+ * @param {string} dir абсолютний або відносний шлях до кореня обходу
23
+ * @param {(filePath: string) => void} onFile колбек для кожного файлу (абсолютний шлях)
24
+ * @param {string[]} [ignorePaths] додаткові шляхи для пропуску (абсолютні або відносні від cwd)
25
+ * @returns {Promise<void>}
26
+ */
27
+ export async function walkDir(dir, onFile, ignorePaths = []) {
28
+ const absDir = resolve(dir)
29
+
30
+ const extraIgnore = ignorePaths
31
+ .map(p => {
32
+ const abs = resolve(stripTrailingSlashes(p))
33
+ const rel = relative(absDir, abs).split(sep).join('/')
34
+ if (rel.startsWith('..') || rel === '') return null
35
+ return `${rel}/**`
36
+ })
37
+ .filter(Boolean)
38
+
39
+ let files
40
+ try {
41
+ files = await globby('**/*', {
42
+ cwd: absDir,
43
+ gitignore: true,
44
+ dot: true,
45
+ onlyFiles: true,
46
+ ignore: [...ALWAYS_IGNORE, ...extraIgnore]
47
+ })
48
+ } catch {
49
+ return
50
+ }
51
+
52
+ for (const rel of files) {
53
+ onFile(join(absDir, rel))
54
+ }
55
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Guard-механізм: атомарний lock + dedup для важких команд.
3
+ * Алгоритм: mkdirSync-based lock, перевірка живості PID, sha256-dedup з TTL.
4
+ */
5
+ import * as fs from 'node:fs'
6
+ import { join } from 'node:path'
7
+ import * as os from 'node:os'
8
+ import { setTimeout as sleep } from 'node:timers/promises'
9
+ import { resolveLockCacheDir } from './lock-cache-dir.mjs'
10
+ import { worktreeFingerprint } from './worktree-fingerprint.mjs'
11
+
12
+ const DEFAULTS = {
13
+ ttl: 600_000,
14
+ staleThreshold: 1_800_000,
15
+ waitTimeout: 1_200_000,
16
+ pollInterval: 1500,
17
+ onWaitTimeout: 'run-unlocked'
18
+ }
19
+
20
+ /**
21
+ * Чи процес із заданим PID ще живий на поточному host.
22
+ * @param {number} pid ідентифікатор процесу з owner.json
23
+ * @returns {boolean} true, якщо process.kill(pid, 0) не кинув помилку
24
+ */
25
+ export function isPidAlive(pid) {
26
+ try {
27
+ process.kill(pid, 0)
28
+ return true
29
+ } catch {
30
+ return false
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Повертає функцію, що знімає lock-директорію.
36
+ * @param {string} lockDir абсолютний шлях до lock-директорії
37
+ * @returns {() => void} release-колбек для finally/signal handler
38
+ */
39
+ function makeRelease(lockDir) {
40
+ return () => fs.rmSync(lockDir, { recursive: true, force: true })
41
+ }
42
+
43
+ /**
44
+ * Чи можна пропустити повторний прогін за кешованим result.json.
45
+ * @param {{exitCode:number, fingerprint:string|null, finishedAt:number}} result попередній результат з result.json
46
+ * @param {string|null} fingerprint поточний fingerprint робочого дерева
47
+ * @param {number} ttl TTL дедуплікації в мілісекундах
48
+ * @returns {boolean} true, якщо попередній успішний прогін можна повторно використати
49
+ */
50
+ export function shouldDedup(result, fingerprint, ttl) {
51
+ if (result.exitCode !== 0) return false
52
+ if (fingerprint === null || result.fingerprint !== fingerprint) return false
53
+ return Date.now() - result.finishedAt < ttl
54
+ }
55
+
56
+ /**
57
+ * Один крок узяття лока: пробує `mkdirSync`. При `EEXIST` перевіряє, чи власник
58
+ * ще живий і чи не протермінований TTL (stale) — якщо так, очищає лок і просить
59
+ * повторити спробу негайно; інакше повертає owner для wait-хуків виклику.
60
+ * @param {string} key ключ локу (для console.error-повідомлень).
61
+ * @param {string} lockDir абсолютний шлях до lock-директорії.
62
+ * @param {string} ownerFile шлях до owner.json усередині lockDir.
63
+ * @param {string|null} fingerprint поточний fingerprint робочого дерева (пишеться в owner.json).
64
+ * @param {number} staleThreshold поріг (мс), понад який лок вважається застарілим незалежно від PID.
65
+ * @returns {{status:'acquired'}|{status:'retry'}|{status:'busy', owner:object}} результат однієї спроби
66
+ */
67
+ function tryAcquireOnce(key, lockDir, ownerFile, fingerprint, staleThreshold) {
68
+ try {
69
+ fs.mkdirSync(lockDir)
70
+ fs.writeFileSync(
71
+ ownerFile,
72
+ // cwd — для UI черги (lint-lock.mjs показує, звідки запущений власник лока)
73
+ JSON.stringify({ pid: process.pid, host: os.hostname(), startedAt: Date.now(), fingerprint, cwd: process.cwd() })
74
+ )
75
+ return { status: 'acquired' }
76
+ } catch (error) {
77
+ if (error.code !== 'EEXIST') throw error
78
+ }
79
+ let owner
80
+ try {
81
+ owner = JSON.parse(fs.readFileSync(ownerFile, 'utf8'))
82
+ } catch {
83
+ fs.rmSync(lockDir, { recursive: true, force: true })
84
+ return { status: 'retry' }
85
+ }
86
+ const stale =
87
+ Date.now() - owner.startedAt > staleThreshold || (os.hostname() === owner.host && !isPidAlive(owner.pid))
88
+ if (!stale) return { status: 'busy', owner }
89
+ console.error(`🧹 ${key}: знайдено застарілий лок — очищаю`)
90
+ fs.rmSync(lockDir, { recursive: true, force: true })
91
+ return { status: 'retry' }
92
+ }
93
+
94
+ /**
95
+ * Серіалізує важку команду через атомарний lock і dedup за fingerprint.
96
+ *
97
+ * Хуки очікування (усі опційні; кастомний UI черги — див. `lint-lock.mjs`):
98
+ * `onWaitStart(owner)` — один раз, коли лок виявився зайнятим живим власником;
99
+ * `onWaitTick(owner)` — кожен poll-цикл очікування (заміняє дефолтний
100
+ * `⏳ …: чекаю` console.error-рядок); `onWaitEnd()` — по виходу з очікування
101
+ * (лок взято, таймаут або stale-очистка) — викликається лише якщо був `onWaitStart`.
102
+ * @param {string} key ключ локу (наприклад `lint-ga`, `fix-bun`)
103
+ * @param {() => number | Promise<number>} runFn основна робота; повертає exit code
104
+ * @param {{ttl?:number, staleThreshold?:number, waitTimeout?:number, pollInterval?:number, onWaitTimeout?:'run-unlocked'|'fail', cacheDir?:string, getFingerprint?:() => string | null, onWaitStart?:(owner:object)=>void, onWaitTick?:(owner:object)=>void, onWaitEnd?:()=>void}} [opts] TTL, шлях кешу, поведінка на таймаут (default `run-unlocked`; `fail` = fail-closed), override fingerprint та хуки очікування
105
+ * @returns {Promise<number>} exit code виконаної або дедуплікованої команди
106
+ */
107
+ export async function withLock(key, runFn, opts = {}) {
108
+ const { ttl, staleThreshold, waitTimeout, pollInterval, onWaitTimeout } = { ...DEFAULTS, ...opts }
109
+ const getFingerprint = opts.getFingerprint ?? worktreeFingerprint
110
+ const cacheDir = opts.cacheDir ?? resolveLockCacheDir(key)
111
+ const lockDir = join(cacheDir, 'lock')
112
+ const ownerFile = join(lockDir, 'owner.json')
113
+ const resultFile = join(cacheDir, 'result.json')
114
+ const release = makeRelease(lockDir)
115
+
116
+ const fingerprint = getFingerprint()
117
+ fs.mkdirSync(cacheDir, { recursive: true })
118
+
119
+ const loopStart = Date.now()
120
+ let waiting = false
121
+ /** Викликає `onWaitEnd` один раз, якщо очікування взагалі починалось. */
122
+ const endWait = () => {
123
+ if (!waiting) return
124
+ waiting = false
125
+ opts.onWaitEnd?.()
126
+ }
127
+
128
+ while (true) {
129
+ if (Date.now() - loopStart >= waitTimeout) {
130
+ endWait()
131
+ if (onWaitTimeout === 'fail') {
132
+ throw new Error(`${key}: не вдалося взяти лок за ${waitTimeout / 60_000} хв — fail-closed`)
133
+ }
134
+ console.error(`⚠️ ${key}: чекав ${waitTimeout / 60_000} хв — запускаю без локу`)
135
+ return await runFn()
136
+ }
137
+ const attempt = tryAcquireOnce(key, lockDir, ownerFile, fingerprint, staleThreshold)
138
+ if (attempt.status === 'acquired') {
139
+ endWait()
140
+ break
141
+ }
142
+ if (attempt.status === 'retry') continue
143
+ if (!waiting) {
144
+ waiting = true
145
+ opts.onWaitStart?.(attempt.owner)
146
+ }
147
+ if (opts.onWaitTick) {
148
+ opts.onWaitTick(attempt.owner)
149
+ } else {
150
+ console.error(`⏳ ${key}: чекаю, лок тримає pid ${attempt.owner.pid}…`)
151
+ }
152
+ await sleep(pollInterval)
153
+ }
154
+
155
+ console.error(`🔒 ${key}: лок взято`)
156
+
157
+ try {
158
+ const raw = fs.readFileSync(resultFile, 'utf8')
159
+ const result = JSON.parse(raw)
160
+ if (shouldDedup(result, fingerprint, ttl)) {
161
+ const elapsed = Math.round((Date.now() - result.finishedAt) / 1000)
162
+ console.error(`♻️ ${key}: те саме дерево, ${elapsed}с тому — пропускаю`)
163
+ release()
164
+ return 0
165
+ }
166
+ } catch {
167
+ /* result.json не існує або пошкоджений */
168
+ }
169
+
170
+ // Після release лок ре-рейзиться той самий сигнал: `once` вже зняв обробник,
171
+ // тож процес завершується дефолтною дією з коректним кодом (130/143)
172
+ const onSignal = signal => {
173
+ release()
174
+ process.kill(process.pid, signal)
175
+ }
176
+ process.once('SIGINT', onSignal)
177
+ process.once('SIGTERM', onSignal)
178
+
179
+ let code
180
+ try {
181
+ code = await runFn()
182
+ fs.writeFileSync(resultFile, JSON.stringify({ finishedAt: Date.now(), exitCode: code, fingerprint }))
183
+ } finally {
184
+ process.off('SIGINT', onSignal)
185
+ process.off('SIGTERM', onSignal)
186
+ release()
187
+ }
188
+
189
+ return code
190
+ }