@7n/rules 1.26.0 → 1.28.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 (292) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +2 -5
  3. package/rules/doc-files/docgen-crc/docs/main.md +1 -1
  4. package/rules/doc-files/docgen-crc/main.mjs +5 -12
  5. package/rules/doc-files/docgen-gen/docs/main.md +1 -1
  6. package/rules/doc-files/docgen-gen/main.mjs +12 -4
  7. package/rules/doc-files/docgen-scan/docs/main.md +2 -2
  8. package/rules/doc-files/docgen-scan/main.mjs +6 -13
  9. package/schemas/concern.json +4 -0
  10. package/scripts/auto-rules.mjs +2 -3
  11. package/scripts/docs/auto-rules.md +1 -1
  12. package/scripts/lib/concern-meta.mjs +14 -1
  13. package/scripts/lib/docs/concern-meta.md +3 -6
  14. package/scripts/lib/docs/glob-to-regex.md +31 -0
  15. package/scripts/lib/docs/index.md +2 -0
  16. package/scripts/lib/docs/js-source-signals.md +32 -0
  17. package/scripts/lib/glob-to-regex.mjs +79 -0
  18. package/scripts/lib/js-source-signals.mjs +50 -0
  19. package/scripts/lib/lint-surface/docs/ladder.md +3 -5
  20. package/scripts/lib/lint-surface/docs/run-fix.md +3 -2
  21. package/scripts/lib/lint-surface/ladder.mjs +18 -9
  22. package/scripts/lib/lint-surface/run-fix.mjs +15 -2
  23. package/scripts/utils/ast-scan-utils.mjs +2 -2
  24. package/scripts/utils/docs/ast-scan-utils.md +1 -1
  25. package/scripts/utils/docs/test-helpers.md +2 -1
  26. package/skills/doc-files/SKILL.md +1 -1
  27. package/skills/taze/js/docs/orchestrate.md +1 -1
  28. package/rules/bun/bunfig/bunfig.mdc +0 -17
  29. package/rules/bun/bunfig/bunfig.rego +0 -29
  30. package/rules/bun/bunfig/concern.json +0 -9
  31. package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +0 -2
  32. package/rules/bun/docs/index.md +0 -11
  33. package/rules/bun/layout/concern.json +0 -16
  34. package/rules/bun/layout/docs/fix-layout.md +0 -29
  35. package/rules/bun/layout/docs/main.md +0 -34
  36. package/rules/bun/layout/fix-layout.mjs +0 -63
  37. package/rules/bun/layout/layout.mdc +0 -60
  38. package/rules/bun/layout/main.mjs +0 -53
  39. package/rules/bun/licensee/concern.json +0 -7
  40. package/rules/bun/licensee/docs/fix-licensee.md +0 -27
  41. package/rules/bun/licensee/docs/index.md +0 -12
  42. package/rules/bun/licensee/docs/main.md +0 -30
  43. package/rules/bun/licensee/fix-licensee.mjs +0 -31
  44. package/rules/bun/licensee/main.mjs +0 -68
  45. package/rules/bun/lint-surface/concern.json +0 -3
  46. package/rules/bun/lint-surface/lint-surface.mdc +0 -13
  47. package/rules/bun/main.json +0 -1
  48. package/rules/bun/main.mdc +0 -11
  49. package/rules/bun/package_json/concern.json +0 -9
  50. package/rules/bun/package_json/docs/fix-package_json.md +0 -28
  51. package/rules/bun/package_json/docs/index.md +0 -9
  52. package/rules/bun/package_json/fix-package_json.mjs +0 -311
  53. package/rules/bun/package_json/package_json.mdc +0 -14
  54. package/rules/bun/package_json/package_json.rego +0 -64
  55. package/rules/bun/package_json/template/package.json.deny.json +0 -4
  56. package/rules/doc-files/docgen-extract/concern.json +0 -3
  57. package/rules/doc-files/docgen-extract/docs/main.md +0 -38
  58. package/rules/doc-files/docgen-extract/main.mjs +0 -275
  59. package/rules/doc-files/units/concern.json +0 -3
  60. package/rules/doc-files/units/docs/main.md +0 -31
  61. package/rules/doc-files/units/main.mjs +0 -19
  62. package/rules/doc-files/units-js/concern.json +0 -3
  63. package/rules/doc-files/units-js/docs/main.md +0 -32
  64. package/rules/doc-files/units-js/main.mjs +0 -141
  65. package/rules/js/check/check.mdc +0 -26
  66. package/rules/js/check/concern.json +0 -19
  67. package/rules/js/check/docs/eslint-config.md +0 -56
  68. package/rules/js/check/docs/fix-check.md +0 -48
  69. package/rules/js/check/docs/index.md +0 -13
  70. package/rules/js/check/docs/main.md +0 -48
  71. package/rules/js/check/eslint-config.mjs +0 -262
  72. package/rules/js/check/fix-check.mjs +0 -82
  73. package/rules/js/check/main.mjs +0 -310
  74. package/rules/js/dep-policy/concern.json +0 -4
  75. package/rules/js/dep-policy/dep-policy.mdc +0 -36
  76. package/rules/js/dep-policy/docs/main.md +0 -35
  77. package/rules/js/dep-policy/main.mjs +0 -99
  78. package/rules/js/docs/index.md +0 -11
  79. package/rules/js/eslint/concern.json +0 -7
  80. package/rules/js/eslint/docs/fix-eslint.md +0 -50
  81. package/rules/js/eslint/docs/fix-worker.md +0 -31
  82. package/rules/js/eslint/docs/index.md +0 -11
  83. package/rules/js/eslint/docs/main.md +0 -35
  84. package/rules/js/eslint/fix-eslint.mjs +0 -160
  85. package/rules/js/eslint/fix-worker.mjs +0 -139
  86. package/rules/js/eslint/main.mjs +0 -115
  87. package/rules/js/file-extensions/concern.json +0 -3
  88. package/rules/js/file-extensions/file-extensions.mdc +0 -12
  89. package/rules/js/jscpd_config/concern.json +0 -11
  90. package/rules/js/jscpd_config/docs/fix-jscpd_config.md +0 -26
  91. package/rules/js/jscpd_config/docs/index.md +0 -9
  92. package/rules/js/jscpd_config/fix-jscpd_config.mjs +0 -3
  93. package/rules/js/jscpd_config/jscpd_config.mdc +0 -42
  94. package/rules/js/jscpd_config/jscpd_config.rego +0 -44
  95. package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +0 -7
  96. package/rules/js/jscpd_duplicates/concern.json +0 -7
  97. package/rules/js/jscpd_duplicates/docs/main.md +0 -29
  98. package/rules/js/jscpd_duplicates/main.mjs +0 -69
  99. package/rules/js/knip/concern.json +0 -7
  100. package/rules/js/knip/docs/main.md +0 -32
  101. package/rules/js/knip/knip.mdc +0 -15
  102. package/rules/js/knip/main.mjs +0 -68
  103. package/rules/js/lint-findings/concern.json +0 -3
  104. package/rules/js/lint-findings/docs/main.md +0 -41
  105. package/rules/js/lint-findings/main.mjs +0 -125
  106. package/rules/js/main.json +0 -1
  107. package/rules/js/main.mdc +0 -18
  108. package/rules/js/package_json/concern.json +0 -9
  109. package/rules/js/package_json/docs/fix-package_json.md +0 -26
  110. package/rules/js/package_json/docs/index.md +0 -9
  111. package/rules/js/package_json/fix-package_json.mjs +0 -3
  112. package/rules/js/package_json/package_json.mdc +0 -15
  113. package/rules/js/package_json/package_json.rego +0 -142
  114. package/rules/js/package_json/template/package.json.snippet.json +0 -6
  115. package/rules/js/tooling/concern.json +0 -3
  116. package/rules/js/tooling/data/tooling/knip-canonical.json +0 -30
  117. package/rules/js/tooling/data/tooling/oxlint-canonical.json +0 -400
  118. package/rules/js/tooling/docs/main.md +0 -53
  119. package/rules/js/tooling/main.mjs +0 -183
  120. package/rules/js/utils_imports/concern.json +0 -4
  121. package/rules/js/utils_imports/docs/main.md +0 -50
  122. package/rules/js/utils_imports/main.mjs +0 -185
  123. package/rules/js/utils_imports/utils_imports.mdc +0 -15
  124. package/rules/js/vscode_extensions/concern.json +0 -11
  125. package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +0 -25
  126. package/rules/js/vscode_extensions/docs/index.md +0 -11
  127. package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +0 -1
  128. package/rules/js/vscode_extensions/template/extensions.json.snippet.json +0 -6
  129. package/rules/js/vscode_extensions/vscode_extensions.mdc +0 -11
  130. package/rules/js/vscode_extensions/vscode_extensions.rego +0 -12
  131. package/rules/js-bun-db/connection/concern.json +0 -3
  132. package/rules/js-bun-db/connection/connection.mdc +0 -42
  133. package/rules/js-bun-db/docs/index.md +0 -11
  134. package/rules/js-bun-db/lib/bun-sql-scan.mjs +0 -1055
  135. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +0 -63
  136. package/rules/js-bun-db/lib/docs/index.md +0 -11
  137. package/rules/js-bun-db/main.json +0 -1
  138. package/rules/js-bun-db/main.mdc +0 -8
  139. package/rules/js-bun-db/package_json/concern.json +0 -9
  140. package/rules/js-bun-db/package_json/package_json.mdc +0 -31
  141. package/rules/js-bun-db/package_json/package_json.rego +0 -15
  142. package/rules/js-bun-db/package_json/template/package.json.deny.json +0 -6
  143. package/rules/js-bun-db/pg_format_identifiers/concern.json +0 -3
  144. package/rules/js-bun-db/pg_format_identifiers/pg_format_identifiers.mdc +0 -104
  145. package/rules/js-bun-db/safety/concern.json +0 -4
  146. package/rules/js-bun-db/safety/docs/main.md +0 -34
  147. package/rules/js-bun-db/safety/main.mjs +0 -430
  148. package/rules/js-bun-db/safety/safety.mdc +0 -458
  149. package/rules/js-bun-redis/docs/index.md +0 -11
  150. package/rules/js-bun-redis/imports/concern.json +0 -4
  151. package/rules/js-bun-redis/imports/docs/main.md +0 -36
  152. package/rules/js-bun-redis/imports/imports.mdc +0 -47
  153. package/rules/js-bun-redis/imports/main.mjs +0 -88
  154. package/rules/js-bun-redis/lib/docs/index.md +0 -11
  155. package/rules/js-bun-redis/lib/docs/redis-imports.md +0 -227
  156. package/rules/js-bun-redis/lib/redis-imports.mjs +0 -130
  157. package/rules/js-bun-redis/main.json +0 -1
  158. package/rules/js-bun-redis/main.mdc +0 -8
  159. package/rules/js-bun-redis/package_json/concern.json +0 -9
  160. package/rules/js-bun-redis/package_json/package_json.mdc +0 -11
  161. package/rules/js-bun-redis/package_json/package_json.rego +0 -15
  162. package/rules/js-bun-redis/package_json/template/package.json.deny.json +0 -12
  163. package/rules/js-mssql/deps/concern.json +0 -4
  164. package/rules/js-mssql/deps/docs/main.md +0 -33
  165. package/rules/js-mssql/deps/main.mjs +0 -297
  166. package/rules/js-mssql/docs/index.md +0 -11
  167. package/rules/js-mssql/lib/docs/index.md +0 -11
  168. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +0 -380
  169. package/rules/js-mssql/lib/mssql-pool-scan.mjs +0 -610
  170. package/rules/js-mssql/main.json +0 -1
  171. package/rules/js-mssql/main.mdc +0 -144
  172. package/rules/js-mssql/mssql-tvp/concern.json +0 -3
  173. package/rules/js-mssql/mssql-tvp/mssql-tvp.mdc +0 -77
  174. package/rules/js-mssql/package_json/concern.json +0 -9
  175. package/rules/js-mssql/package_json/package_json.mdc +0 -9
  176. package/rules/js-mssql/package_json/package_json.rego +0 -57
  177. package/rules/js-run/configmap/concern.json +0 -9
  178. package/rules/js-run/configmap/configmap.mdc +0 -37
  179. package/rules/js-run/configmap/configmap.rego +0 -21
  180. package/rules/js-run/configmap/template/configmap.yaml.contains.yml +0 -4
  181. package/rules/js-run/docs/index.md +0 -11
  182. package/rules/js-run/jsconfig/concern.json +0 -9
  183. package/rules/js-run/jsconfig/docs/fix-jsconfig.md +0 -29
  184. package/rules/js-run/jsconfig/docs/index.md +0 -9
  185. package/rules/js-run/jsconfig/fix-jsconfig.mjs +0 -119
  186. package/rules/js-run/jsconfig/jsconfig.mdc +0 -48
  187. package/rules/js-run/jsconfig/jsconfig.rego +0 -59
  188. package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +0 -10
  189. package/rules/js-run/lib/bunyan-imports.mjs +0 -98
  190. package/rules/js-run/lib/check-env-scan.mjs +0 -338
  191. package/rules/js-run/lib/conn-file-rules.mjs +0 -214
  192. package/rules/js-run/lib/conn-imports-scan.mjs +0 -154
  193. package/rules/js-run/lib/docs/bunyan-imports.md +0 -121
  194. package/rules/js-run/lib/docs/check-env-scan.md +0 -438
  195. package/rules/js-run/lib/docs/conn-file-rules.md +0 -304
  196. package/rules/js-run/lib/docs/conn-imports-scan.md +0 -208
  197. package/rules/js-run/lib/docs/index.md +0 -16
  198. package/rules/js-run/lib/docs/promise-settimeout-scan.md +0 -334
  199. package/rules/js-run/lib/docs/temporal-scan.md +0 -29
  200. package/rules/js-run/lib/promise-settimeout-scan.mjs +0 -128
  201. package/rules/js-run/lib/temporal-scan.mjs +0 -52
  202. package/rules/js-run/main.json +0 -1
  203. package/rules/js-run/main.mdc +0 -16
  204. package/rules/js-run/package_json/concern.json +0 -9
  205. package/rules/js-run/package_json/package_json.mdc +0 -44
  206. package/rules/js-run/package_json/package_json.rego +0 -37
  207. package/rules/js-run/package_json/template/package.json.deny.json +0 -22
  208. package/rules/js-run/project-structure/concern.json +0 -3
  209. package/rules/js-run/project-structure/project-structure.mdc +0 -11
  210. package/rules/js-run/runtime/concern.json +0 -12
  211. package/rules/js-run/runtime/docs/fix-runtime.md +0 -27
  212. package/rules/js-run/runtime/docs/main.md +0 -35
  213. package/rules/js-run/runtime/fix-runtime.mjs +0 -46
  214. package/rules/js-run/runtime/main.mjs +0 -494
  215. package/rules/js-run/runtime/runtime.mdc +0 -184
  216. package/rules/js-run/scope/concern.json +0 -3
  217. package/rules/js-run/scope/scope.mdc +0 -11
  218. package/rules/npm-module/docs/index.md +0 -11
  219. package/rules/npm-module/emit_types_config/concern.json +0 -9
  220. package/rules/npm-module/emit_types_config/docs/fix-emit_types_config.md +0 -25
  221. package/rules/npm-module/emit_types_config/docs/index.md +0 -9
  222. package/rules/npm-module/emit_types_config/emit_types_config.mdc +0 -43
  223. package/rules/npm-module/emit_types_config/emit_types_config.rego +0 -28
  224. package/rules/npm-module/emit_types_config/fix-emit_types_config.mjs +0 -5
  225. package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +0 -9
  226. package/rules/npm-module/header_doc_pointer/concern.json +0 -5
  227. package/rules/npm-module/header_doc_pointer/docs/main.md +0 -40
  228. package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +0 -18
  229. package/rules/npm-module/header_doc_pointer/main.mjs +0 -131
  230. package/rules/npm-module/main.json +0 -1
  231. package/rules/npm-module/main.mdc +0 -36
  232. package/rules/npm-module/npm_package_json/concern.json +0 -9
  233. package/rules/npm-module/npm_package_json/docs/fix-npm_package_json.md +0 -27
  234. package/rules/npm-module/npm_package_json/docs/index.md +0 -9
  235. package/rules/npm-module/npm_package_json/fix-npm_package_json.mjs +0 -5
  236. package/rules/npm-module/npm_package_json/npm_package_json.mdc +0 -57
  237. package/rules/npm-module/npm_package_json/npm_package_json.rego +0 -73
  238. package/rules/npm-module/npm_package_json/template/package.json.snippet.json +0 -1
  239. package/rules/npm-module/package_structure/concern.json +0 -5
  240. package/rules/npm-module/package_structure/docs/main.md +0 -37
  241. package/rules/npm-module/package_structure/main.mjs +0 -515
  242. package/rules/npm-module/package_structure/package_structure.mdc +0 -63
  243. package/rules/npm-module/root_package_json/concern.json +0 -9
  244. package/rules/npm-module/root_package_json/docs/fix-root_package_json.md +0 -26
  245. package/rules/npm-module/root_package_json/docs/index.md +0 -9
  246. package/rules/npm-module/root_package_json/fix-root_package_json.mjs +0 -5
  247. package/rules/npm-module/root_package_json/root_package_json.mdc +0 -41
  248. package/rules/npm-module/root_package_json/root_package_json.rego +0 -28
  249. package/rules/npm-module/root_package_json/template/package.json.snippet.json +0 -1
  250. package/rules/npm-module/rule_meta/concern.json +0 -8
  251. package/rules/npm-module/rule_meta/docs/main.md +0 -35
  252. package/rules/npm-module/rule_meta/main.mjs +0 -119
  253. package/rules/npm-module/rule_meta/rule_meta.mdc +0 -11
  254. package/rules/npm-module/skill_meta/concern.json +0 -5
  255. package/rules/npm-module/skill_meta/docs/main.md +0 -149
  256. package/rules/npm-module/skill_meta/main.mjs +0 -91
  257. package/rules/npm-module/skill_meta/skill_meta.mdc +0 -11
  258. package/rules/tool-surface/docs/index.md +0 -11
  259. package/rules/tool-surface/main.json +0 -6
  260. package/rules/tool-surface/main.mdc +0 -72
  261. package/rules/vue/composition-api/composition-api.mdc +0 -82
  262. package/rules/vue/composition-api/concern.json +0 -3
  263. package/rules/vue/docs/index.md +0 -11
  264. package/rules/vue/lib/docs/index.md +0 -11
  265. package/rules/vue/lib/docs/vue-forbidden-imports.md +0 -265
  266. package/rules/vue/lib/vue-forbidden-imports.mjs +0 -264
  267. package/rules/vue/main.json +0 -1
  268. package/rules/vue/main.mdc +0 -18
  269. package/rules/vue/nheader-layout/concern.json +0 -3
  270. package/rules/vue/nheader-layout/nheader-layout.mdc +0 -171
  271. package/rules/vue/package_json/concern.json +0 -9
  272. package/rules/vue/package_json/package_json.mdc +0 -30
  273. package/rules/vue/package_json/package_json.rego +0 -140
  274. package/rules/vue/packages/concern.json +0 -6
  275. package/rules/vue/packages/docs/index.md +0 -11
  276. package/rules/vue/packages/docs/main.md +0 -35
  277. package/rules/vue/packages/main.mjs +0 -575
  278. package/rules/vue/packages/packages.mdc +0 -56
  279. package/rules/vue/quasar-ui/concern.json +0 -3
  280. package/rules/vue/quasar-ui/quasar-ui.mdc +0 -32
  281. package/rules/vue/structure/concern.json +0 -3
  282. package/rules/vue/structure/structure.mdc +0 -101
  283. package/rules/vue/testing/concern.json +0 -3
  284. package/rules/vue/testing/testing.mdc +0 -40
  285. package/rules/vue/tfm-translations/concern.json +0 -7
  286. package/rules/vue/tfm-translations/docs/main.md +0 -29
  287. package/rules/vue/tfm-translations/main.mjs +0 -55
  288. package/rules/vue/tfm-translations/tfm-translations.mdc +0 -32
  289. package/rules/vue/vite-config/concern.json +0 -3
  290. package/rules/vue/vite-config/vite-config.mdc +0 -153
  291. package/rules/vue/vite-env/concern.json +0 -3
  292. package/rules/vue/vite-env/vite-env.mdc +0 -61
@@ -440,6 +440,18 @@ function noteT0Phase(t0, chainExtra, touchedAbs) {
440
440
  }
441
441
  }
442
442
 
443
+ /**
444
+ * Ladder concern-а: повний, або без local-tier rung-ів (`concern.skipLocalTier`) —
445
+ * concern-и, де local-min/local-min-retry емпірично не встигають дати результат
446
+ * у межах свого бюджету (concern-meta.mjs).
447
+ * @param {Rung[]} ladder Повний ladder pipeline-у.
448
+ * @param {import('../concern-meta.mjs').ConcernMeta} concern Concern-meta елемента плану.
449
+ * @returns {Rung[]} Ladder, застосовний до цього concern-а.
450
+ */
451
+ function selectLadder(ladder, concern) {
452
+ return concern.skipLocalTier ? ladder.filter(rung => !rung.local) : ladder
453
+ }
454
+
443
455
  /**
444
456
  * Тіло fix-pipeline одного concern-а (T0 → S1 → ladder); chain/chainExtra — акумулятори
445
457
  * телеметрії ланцюжка (володіє ними fixConcern-обгортка).
@@ -481,7 +493,8 @@ async function fixConcernCore(item, initialViolations, deps, chain, chainExtra,
481
493
 
482
494
  // ── Worker ladder ── concern-specific fix-worker.mjs, інакше дефолтний pi-agent worker.
483
495
  const worker = await resolveWorker(concernDir, deps.workerOverride)
484
- if (!worker || ladder.length === 0) {
496
+ const effectiveLadder = selectLadder(ladder, item.entry.concern)
497
+ if (!worker || effectiveLadder.length === 0) {
485
498
  chainExtra.stop = 'no-worker'
486
499
  return false
487
500
  }
@@ -492,7 +505,7 @@ async function fixConcernCore(item, initialViolations, deps, chain, chainExtra,
492
505
  let violations = initialViolations
493
506
  const skipModels = new Set()
494
507
 
495
- for (const rung of ladder) {
508
+ for (const rung of effectiveLadder) {
496
509
  if (skipModels.has(rung.model)) continue
497
510
  if (rung.isAvg && deps.avgRemaining() <= 0) {
498
511
  log(` ⏭️ ${ruleId}/${concernName}: ${rung.tier} пропущено (avg-кеп вичерпано)\n`)
@@ -6,8 +6,8 @@
6
6
  * робота з `TemplateLiteral` (текст quasis, контекст SQL-списку).
7
7
  *
8
8
  * Використовується сканерами у `rules/<rule>/js/...` (наприклад,
9
- * `rules/js-bun-db/js/safety/bun-sql-scan.mjs`, `rules/js-mssql/js/deps/mssql-pool-scan.mjs`,
10
- * `rules/js-run/js/runtime/*-scan.mjs`) для уникнення дублювання boilerplate.
9
+ * `@7n/rules-lang-js`: rules/js-bun-db, rules/js-mssql, rules/js-run —
10
+ * фаза 5c spec lang-plugins-extraction) для уникнення дублювання boilerplate.
11
11
  */
12
12
  import { parseSync } from 'oxc-parser'
13
13
 
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: ast-scan-utils.mjs
4
4
  resource: npm/scripts/utils/ast-scan-utils.mjs
5
5
  docgen:
6
- crc: 0f9b4a21
6
+ crc: ed9f189b
7
7
  ---
8
8
 
9
9
  Цей файл містить утиліти для AST-сканерів JavaScript та TypeScript, що використовуються для аналізу коду та виявлення потенційних проблем. Він надає інструменти для обробки AST, перетворення даних та взаємодії з різними типами вузлів, забезпечуючи основу для створення правил безпеки та аналізу коду. Ці утиліти спрощують розробку сканерів, усуваючи необхідність повторного написання boilerplate-коду.
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: test-helpers.mjs
4
4
  resource: npm/scripts/utils/test-helpers.mjs
5
5
  docgen:
6
- crc: 9af8ee18
6
+ crc: a01017b0
7
7
  ---
8
8
 
9
9
  ## Огляд
@@ -18,6 +18,7 @@ docgen:
18
18
  - `withBinStubInPath(bin, fn)` — створює тимчасовий каталог зі стабом `<bin>` (`<bin>.exe` на Windows), що завершується з кодом 0, додає каталог на початок `PATH` на час `fn`, потім відновлює `PATH` і прибирає стаб. Реальний бінарник не запускається: і машини без інструмента, і повільні мережево-залежні інструменти (наприклад, `kubescape`, який на старті тягне артефакти з хмарних API десятки секунд) отримують детермінований швидкий прогін.
19
19
  - `withShellcheckStubInPath(fn)` — спеціалізація `withBinStubInPath` для `shellcheck` (перевірки `check ga` на машинах без реального shellcheck).
20
20
  - `withBinRemovedFromPath(bin, fn)` — виконує `fn` із `PATH`, з якого прибрані всі каталоги з виконуваним `<bin>`; решта `PATH` (git, bun) лишається. На час `fn` виставляє `N_CURSOR_NO_AUTO_INSTALL=1`, щоб `ensureTool` не запускав реальний brew/scoop/curl-install. Для негативних тестів «fail, коли інструмента нема».
21
+ - `installFakeLangJsPlugin(dir)` — кладе у tmp-репо фейковий `@7n/rules-lang-js` (маніфест із doc-files-розширеннями js/mjs/ts/vue у `node_modules`) і активує його через `.n-rules.json`. Після фази 5b ядро не має вбудованих кодових розширень — тестам doc-files без цього хелпера скан не бачить жодного джерела.
21
22
 
22
23
  ## Гарантії поведінки
23
24
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: doc-files
3
3
  description: >-
4
- Обовʼязковий крок задачі (як lint): для кожного зміненого/нового кодового файлу (js/mjs/ts/vue вбудовано; rs/py — через lang-плагіни) JS-оркестрована генерація лаконічної поведінкової української md-документації у теку docs/ поряд із кодом, зі звіркою застарілості за CRC у frontmatter
4
+ Обовʼязковий крок задачі (як lint): для кожного зміненого/нового кодового файлу (розширення декларують lang-плагіни: js/mjs/ts/vue lang-js, rs/py — lang-rust/lang-python) JS-оркестрована генерація лаконічної поведінкової української md-документації у теку docs/ поряд із кодом, зі звіркою застарілості за CRC у frontmatter
5
5
  version: '1.0'
6
6
  ---
7
7
 
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: orchestrate.mjs
4
4
  resource: npm/skills/taze/js/orchestrate.mjs
5
5
  docgen:
6
- crc: df10e67a
6
+ crc: c1bcfe63
7
7
  model: openai-codex/gpt-5.4-mini
8
8
  score: 100
9
9
  issues: judge:inaccurate:0.98
@@ -1,17 +0,0 @@
1
- ## Rego-gate: відповідність bunfig.toml канонічному шаблону
2
-
3
- Rego-пакет: `bun.bunfig`
4
-
5
- Цільовий файл: `bunfig.toml` (корінь репо).
6
-
7
- Шаблон (leaf-значення, які gate порівнює): [bunfig.toml.snippet.toml](./template/bunfig.toml.snippet.toml)
8
-
9
- Gate порівнює кожен leaf-ключ у кожній секції шаблону з фактичним значенням у `bunfig.toml`. Зайві ключі та секції — ігноруються. Deny-повідомлення виникає, якщо:
10
-
11
- - секція відсутня або не є обʼєктом (`bunfig.toml: відсутня секція [install]`)
12
- - leaf-ключ має інше значення (`bunfig.toml: у секції [install] має бути linker = "hoisted"`)
13
-
14
- ## Навіщо саме `linker = "hoisted"`
15
-
16
- Канонічна лінковка для кореневого `bunfig.toml` — **hoisted**: пласке `node_modules`,
17
- сумісне з інструментами, які не розуміють ізольований (isolated) layout Bun.
@@ -1,29 +0,0 @@
1
- # Перевірка `bunfig.toml` для bun (bun.mdc).
2
- #
3
- # Канон надходить через --data: { "template": { "snippet": ... } }
4
- # Структура --data сформована з template/bunfig.toml.snippet.toml.
5
- # Snippet — 2-рівнева мапа (section → key → expected). Walker такий самий,
6
- # як для ga.vscode_settings: leaf-by-leaf коли section-обʼєкт існує + окремий
7
- # deny коли section відсутній / не обʼєкт.
8
- package bun.bunfig
9
-
10
- import rego.v1
11
-
12
- # Leaf-by-leaf: section присутня й обʼєкт.
13
- deny contains msg if {
14
- some section, expected_inner in data.template.snippet
15
- inner := object.get(input, section, {})
16
- is_object(inner)
17
- some leaf_key, expected_value in expected_inner
18
- actual := object.get(inner, leaf_key, null)
19
- actual != expected_value
20
- msg := sprintf("bunfig.toml: у секції [%s] має бути %s = %q (bun.mdc)", [section, leaf_key, expected_value])
21
- }
22
-
23
- # Section відсутня (null) або не обʼєкт.
24
- deny contains msg if {
25
- some section in object.keys(data.template.snippet)
26
- raw := object.get(input, section, null)
27
- not is_object(raw)
28
- msg := sprintf("bunfig.toml: відсутня секція [%s] (bun.mdc)", [section])
29
- }
@@ -1,9 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "fixability": "config",
4
- "policy": {
5
- "files": {
6
- "single": "bunfig.toml"
7
- }
8
- }
9
- }
@@ -1,2 +0,0 @@
1
- [install]
2
- linker = "hoisted"
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/bun
4
- resource: npm/rules/bun/
5
- ---
6
-
7
- # npm/rules/bun
8
-
9
- | Файл | Тип |
10
- | ------------------- | --------- |
11
- | [main.mjs](main.md) | JS Module |
@@ -1,16 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "lint": {
4
- "scope": "full",
5
- "glob": [
6
- "package-lock.json",
7
- "yarn.lock",
8
- "pnpm-lock.yaml",
9
- ".yarnrc.yml",
10
- ".yarn/**",
11
- "bun.lock",
12
- "bunfig.toml",
13
- "package.json"
14
- ]
15
- }
16
- }
@@ -1,29 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-layout.mjs
4
- resource: npm/rules/bun/layout/fix-layout.mjs
5
- docgen:
6
- crc: 14f58bce
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
9
- issues: judge:inaccurate:0.98
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- Т0-autofix паттерни для `bun/js/layout.mjs` забезпечують детерміноване виправлення структури проєкту. Він виконує такі дії, керуючись конфігом `package-lock.json`: видаляє заборонені файли (наприклад, `package-lock.json`, `yarn.lock`), створює відсутні конфігураційні файли (`bunfig.toml`) та каталоги (`.yarn`). Ці механізми реалізуються через публічну змінну `patterns` без звернення до LLM.
16
-
17
- ## Поведінка
18
-
19
- Поведінка:
20
-
21
- 1. Виконується детерміноване автоматичне виправлення структури проєкту на основі попереднього логу.
22
- 2. Перевіряється наявність заборонених файлів, таких як `package-lock.json`. У разі виявлення, ці файли фізично видаляються з робочої директорії.
23
- 3. Перевіряється наявність файлу `bunfig.toml`. Якщо він відсутній, його створюється з базовим налаштуванням для встановлення залежностей.
24
- 4. Перевіряється наявність каталогу `.yarn`. У разі його виявлення, цей каталог повністю видаляється.
25
- 5. Усі ці дії інкапсульовані у публічній змінній `patterns`, що містить набір визначених механізмів виправлення.
26
-
27
- ## Гарантії поведінки
28
-
29
- - (специфічних машинно-виведених гарантій немає)
@@ -1,34 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: main.mjs
4
- resource: npm/rules/bun/layout/main.mjs
5
- docgen:
6
- crc: 457e5fcd
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 95
9
- issues: anchor-miss:(bun.mdc),judge:inaccurate:0.99
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- Цей модуль забезпечує автоматизовану перевірку конфігурації проекту, аналізуючи файли package.json та package-lock.json. Він діагностує відсутність ключових файлів або невідповідність усталеним стандартам управління залежностями. Успішна робота підтверджує відповідність проекту визначеним вимогам.
16
-
17
- ## Поведінка
18
-
19
- Поведінка:
20
-
21
- 1. При запуску `main` перевіряється наявність файлів блокування залежностей (`package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `.yarnrc.yml`). Якщо будь-який з них присутній, це розцінюється як порушення.
22
- 2. Перевіряється наявність директорії `.yarn`. Її наявність сприймається як порушення.
23
- 3. Перевіряється наявність файлу `bun.lock`. Якщо його немає, це вказує на необхідність виконання `bun i`.
24
- 4. Перевіряється наявність конфігураційного файлу `bunfig.toml`. Якщо його немає, це вимагає створення файлу з налаштуванням `[install] linker = "hoisted"` відповідно до вимог `bun.mdc`.
25
- 5. Визначається шлях до `package.json` у корені репозиторію. Якщо цей файл відсутній, процес перевірки зупиняється.
26
- 6. У разі успішної перевірки всіх умов, повертається код, що вказує на відсутність проблем.
27
-
28
- ## Публічний API
29
-
30
- main — перевіряє, чи відповідає проєкт встановленим у bun.mdc правилам.
31
-
32
- ## Гарантії поведінки
33
-
34
- - Read-only: не виконує операцій запису (ФС/БД).
@@ -1,63 +0,0 @@
1
- /**
2
- * T0-autofix паттерни для `bun/layout` — детерміновані FS-виправлення
3
- * заборонених файлів (package-lock.json, yarn.lock тощо), відсутнього bunfig.toml
4
- * та каталогу .yarn без звернення до LLM.
5
- *
6
- * Unified lint surface: structured violations (test(violations)/apply(violations,ctx)).
7
- * Імена заборонених файлів читаються з `v.message`, не з агрегованого output-рядка.
8
- */
9
- import { existsSync, rmSync, writeFileSync } from 'node:fs'
10
- import { join } from 'node:path'
11
-
12
- const FORBIDDEN_FILE_RE = /Знайдено заборонений файл: \S+/u
13
- const FORBIDDEN_FILE_NAME_RE = /Знайдено заборонений файл: (\S+)/u
14
- const BUNFIG_MISSING_RE = /Відсутній bunfig\.toml/u
15
- const YARN_DIR_RE = /Знайдено директорію \.yarn/u
16
-
17
- /** @type {import('../../../scripts/lib/lint-surface/types.mjs').T0Pattern[]} */
18
- export const patterns = [
19
- {
20
- id: 'rm-forbidden-file',
21
- test: violations => violations.some(v => FORBIDDEN_FILE_RE.test(v.message)),
22
- apply: (violations, ctx) => {
23
- const cwd = ctx.cwd
24
- const touchedFiles = []
25
- for (const v of violations) {
26
- const m = FORBIDDEN_FILE_NAME_RE.exec(v.message)
27
- if (!m) continue
28
- const filePath = join(cwd, m[1])
29
- if (existsSync(filePath)) {
30
- ctx.recordWrite?.(filePath)
31
- rmSync(filePath, { force: true })
32
- touchedFiles.push(filePath)
33
- }
34
- }
35
- if (touchedFiles.length === 0) return { touchedFiles: [] }
36
- return { touchedFiles, message: `видалено: ${touchedFiles.join(', ')}` }
37
- }
38
- },
39
-
40
- {
41
- id: 'bun-bunfig-create',
42
- test: violations => violations.some(v => BUNFIG_MISSING_RE.test(v.message)),
43
- apply: (_violations, ctx) => {
44
- const target = join(ctx.cwd, 'bunfig.toml')
45
- if (existsSync(target)) return { touchedFiles: [] }
46
- ctx.recordWrite?.(target)
47
- writeFileSync(target, '[install]\nlinker = "hoisted"\n', 'utf8')
48
- return { touchedFiles: [target], message: 'створено bunfig.toml' }
49
- }
50
- },
51
-
52
- {
53
- id: 'bun-yarn-dir-remove',
54
- test: violations => violations.some(v => YARN_DIR_RE.test(v.message)),
55
- apply: (_violations, ctx) => {
56
- const target = join(ctx.cwd, '.yarn')
57
- if (!existsSync(target)) return { touchedFiles: [] }
58
- ctx.recordWrite?.(target)
59
- rmSync(target, { recursive: true, force: true })
60
- return { touchedFiles: [target], message: 'видалено .yarn/' }
61
- }
62
- }
63
- ]
@@ -1,60 +0,0 @@
1
- ## Структура lockfile та менеджер пакетів
2
-
3
- Проект використовує **тільки Bun** для керування залежностями та запуску скриптів.
4
-
5
- **Заборонені lockfile / директорії** (мають бути відсутні у репозиторії):
6
-
7
- - `package-lock.json`
8
- - `yarn.lock`
9
- - `pnpm-lock.yaml`
10
- - `.yarnrc.yml`
11
- - `.yarn/`
12
-
13
- Якщо якийсь із цих файлів чи директорій існує — **видали** його.
14
-
15
- **Обовʼязковий lockfile:** `bun.lock` (має бути присутній у корені).
16
-
17
- **Заборонені команди менеджерів пакетів:**
18
-
19
- - `npm install`, `yarn`, `pnpm` і їх відповідники lockfile (крім `bun.lock`)
20
-
21
- **Дозволені команди:**
22
-
23
- - `bun i`
24
- - `bun run <script>`
25
- - `bun add <pkg>`
26
- - `bun add -d <pkg>`
27
- - `bun remove <pkg>`
28
- - `bunx <tool>`
29
- - `npx <tool>` — якщо у проєкті вже використовується `npx` (не замінюй на `bunx`)
30
-
31
- **Одноразові CLI (`bunx` / `npx`):**
32
-
33
- - Якщо в проєкті вже використовується **`npx`** (скрипти, CI, Dockerfile) — **залишай `npx`**, не замінюй на `bunx`.
34
- - Якщо новий виклик CLI додається з нуля і в репозиторії прийнято лише Bun — можна `bunx <tool>`.
35
-
36
- **Не додавай** у `dependencies` / `devDependencies` пакети, які **використовуються лише як CLI** і їх достатньо викликати через **`bunx <pkg>`** (або **`npx`**, якщо в проєкті так прийнято): наприклад **oxlint**, **jscpd**, **eslint** у корені тощо. Виняток — пакет потрібен як **бібліотека** (імпорт у коді), peer для іншого пакета, або інструмент **не** покривається `bunx` у вашому CI.
37
-
38
- **Monorepo:**
39
-
40
- - Встановлювати залежності у відповідному пакеті, а не в корені без потреби.
41
- - Якщо залежність потрібна лише одному пакету, додавати її в директорії цього пакета.
42
- - У CI та локально запускати скрипти через `bun run`.
43
-
44
- **Dockerfile:**
45
-
46
- ```dockerfile
47
- FROM oven/bun:alpine AS build-env
48
- ```
49
-
50
- замість образу node.
51
-
52
- **GitHub Actions:** не вставляй у workflow окремі кроки **`actions/setup-node`**, **`oven-sh/setup-bun`**, **`actions/cache`** та **`bun install`** — їх **заборонено** дублювати в кожному job; завжди використовуй **локальний composite** (деталі й заборона дублювання — **ga.mdc**). Під капотом composite уже містить Node **24**, Bun, кеш і **`bun install --frozen-lockfile`**.
53
-
54
- Після **`actions/checkout@v6`** (`persist-credentials: false`):
55
-
56
- ```yaml
57
- - uses: ./.github/actions/setup-bun-deps
58
- ```
59
-
60
- Якщо в репозиторії action збережено під **`./npm/github-actions/setup-bun-deps`**, у `uses:` вкажи цей шлях замість `.github/actions/…` (**ga.mdc**).
@@ -1,53 +0,0 @@
1
- /** @see ./docs/layout.md */
2
- import { existsSync } from 'node:fs'
3
- import { join } from 'node:path'
4
-
5
- import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
6
-
7
- // Перевірка `devDependencies` кореневого `package.json` (дозволено лише `@nitra/*`)
8
- // — у rego (`npm/policy/bun/package_json/`). JS-копії `isAllowedRootDevDependency`
9
- // видалено, щоб не було двох джерел істини.
10
-
11
- /**
12
- * Перевіряє відповідність проєкту правилам bun.mdc
13
- * @param {import('../../../scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону
14
- * @returns {import('../../../scripts/lib/lint-surface/types.mjs').LintResult} результат перевірки
15
- */
16
- export function lint(ctx) {
17
- const cwd = ctx.cwd
18
- const reporter = createViolationReporter(ctx)
19
- const { pass, fail } = reporter
20
-
21
- for (const f of ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', '.yarnrc.yml']) {
22
- if (existsSync(join(cwd, f))) {
23
- fail(`Знайдено заборонений файл: ${f} — видали його`)
24
- } else {
25
- pass(`Немає ${f}`)
26
- }
27
- }
28
-
29
- if (existsSync(join(cwd, '.yarn'))) {
30
- fail('Знайдено директорію .yarn — видали її')
31
- } else {
32
- pass('Немає .yarn/')
33
- }
34
- if (existsSync(join(cwd, 'bun.lock'))) {
35
- pass('bun.lock є')
36
- } else {
37
- fail('Відсутній bun.lock — запусти bun i')
38
- }
39
-
40
- if (existsSync(join(cwd, 'bunfig.toml'))) {
41
- pass('bunfig.toml є (структуру перевіряє npx @7n/rules fix → bun.bunfig)')
42
- } else {
43
- fail('Відсутній bunfig.toml — створи з [install] linker = "hoisted" (bun.mdc)')
44
- }
45
-
46
- const pkgPath = join(cwd, 'package.json')
47
- if (!existsSync(pkgPath)) {
48
- fail('Відсутній package.json у корені')
49
- return reporter.result()
50
- }
51
-
52
- return reporter.result()
53
- }
@@ -1,7 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "fixability": "config",
4
- "lint": {
5
- "scope": "full"
6
- }
7
- }
@@ -1,27 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-licensee.mjs
4
- resource: npm/rules/bun/licensee/fix-licensee.mjs
5
- docgen:
6
- crc: 5c27ef32
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
9
- issues: judge:inaccurate:0.99
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- Цей модуль виконує детерміновану генерацію конфігураційного файлу `.licensee.json` у корені проекту. Генерація відбувається через виконання канонічної команди `licensee --init`, що ініціалізує файл `.licensee.json` для забезпечення метаданих ліцензування проекту. Це механізм для встановлення початкової конфігурації.
16
-
17
- ## Поведінка
18
-
19
- Поведінка:
20
- 1. Перевіряється, чи існують порушення, пов'язані з відсутністю конфігурації `licensee` у контексті.
21
- 2. Якщо порушення виявлено, викликається команда `bun x licensee --init --production --quiet` у поточному робочому каталозі для створення або ініціалізації файлу `.licensee.json`.
22
- 3. Результат виконання команди фіксується, а файл `.licensee.json` позначається як змінений.
23
- 4. Якщо порушень немає, жодних дій не виконується.
24
-
25
- ## Гарантії поведінки
26
-
27
- - Пише лише `.licensee.json`; за відсутності `bun` у PATH — no-op.
@@ -1,12 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/bun/licensee
4
- resource: npm/rules/bun/licensee/
5
- ---
6
-
7
- # npm/rules/bun/licensee
8
-
9
- | Файл | Тип |
10
- | ----------------------------------- | --------- |
11
- | [fix-licensee.mjs](fix-licensee.md) | JS Module |
12
- | [main.mjs](main.md) | JS Module |
@@ -1,30 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: main.mjs
4
- resource: npm/rules/bun/licensee/main.mjs
5
- docgen:
6
- crc: 787e39cc
7
- model: manual
8
- ---
9
-
10
- ## Огляд
11
-
12
- Read-only detector `bun/licensee`: перевіряє ліцензії npm-залежностей проєкту через зовнішній інструмент `licensee` (`bun x licensee`), звіряючи їх з allowlist у `.licensee.json`. Розрізняє два принципово різні провали: `licensee` знайшов реально заборонену ліцензію (`license-violation`) — і `licensee` сам впав з помилкою (fail-open діагностика, не порушення), наприклад через несумісність `@npmcli/arborist` (яким він читає `node_modules`) з деревом, зібраним `bun install`.
13
-
14
- ## Поведінка
15
-
16
- 1. Якщо `.licensee.json` відсутній — `licensee-config-missing`; генерація конфігу — окремий T0-фікс (`fix-licensee.mjs`), не тут.
17
- 2. Якщо `bun` не знайдено в PATH — `bun-missing`.
18
- 3. Запускає `bun x licensee --production --errors-only` (без `--quiet` — реальне порушення потребує деталі: ім'я/версія/ліцензія пакета, які `licensee` пише в stdout через `print()`).
19
- 4. Статус 0 — без порушень.
20
- 5. Статус ≠ 0 і є вивід у **stderr** — трактується як crash/`die()` самого `licensee` (invalid config або необроблений виняток усередині тула), НЕ як ліцензійне порушення: **fail-open** — warn-діагностика (видима у `--verbose`, не блокує exit code) зі stderr і підказкою перевірити вручну `bunx licensee --production`; fail-closed тут перманентно червонив би CI bun-монорепо.
21
- 6. Статус ≠ 0 і stderr порожній, є вивід у **stdout** — це справжній `NOT APPROVED`-звіт від `licensee` (`--errors-only` друкує лише невідповідні пакети): `license-violation` з деталлю пакета/ліцензії у повідомленні.
22
-
23
- ## Публічний API
24
-
25
- - `lint(ctx)` — detector-контракт unified lint surface; повертає `{ violations }` (при crash тула — `{ violations: [], diagnostics }`).
26
-
27
- ## Гарантії поведінки
28
-
29
- - Read-only: не пише `.licensee.json` і не змінює `node_modules`/lockfile сам (побічний ефект `bun x` — авто-встановлення пакета `licensee`, якщо відсутній у bunx-кеші, — керується bun, не цим модулем).
30
- - Канал stdout/stderr — єдиний сигнал розрізнення crash vs реальне порушення; текстові евристики за вмістом повідомлення не використовуються.
@@ -1,31 +0,0 @@
1
- /**
2
- * T0-autofix для `bun/licensee` — детермінована генерація `.licensee.json` через
3
- * `licensee --init` (canon-команда самого тула, та сама, що detector радить запустити
4
- * вручну). Реальні `license-violation` (файл є, але залежності не проходять) — НЕ
5
- * T0-фікс: потребують людського рішення про ліцензійну політику, не regen.
6
- */
7
- import { join } from 'node:path'
8
-
9
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
10
- import { spawnAsync } from '../../../scripts/utils/spawn-async.mjs'
11
-
12
- /** @type {import('../../../scripts/lib/lint-surface/types.mjs').T0Pattern[]} */
13
- export const patterns = [
14
- {
15
- id: 'bun-licensee-config-init',
16
- test: violations => violations.some(v => v.reason === 'licensee-config-missing'),
17
- apply: async (violations, ctx) => {
18
- const bun = resolveCmd('bun')
19
- if (!bun) return { touchedFiles: [] }
20
-
21
- await spawnAsync(bun, ['x', 'licensee', '--init', '--production', '--quiet'], {
22
- cwd: ctx.cwd,
23
- shell: false
24
- })
25
-
26
- const configPath = join(ctx.cwd, '.licensee.json')
27
- ctx.recordWrite?.(configPath)
28
- return { touchedFiles: [configPath], message: 'licensee --init: .licensee.json' }
29
- }
30
- }
31
- ]
@@ -1,68 +0,0 @@
1
- /**
2
- * lint-поверхня bun/licensee: read-only detector ліцензій npm-залежностей (`licensee`).
3
- * Генерація дефолтного `.licensee.json` — окремий T0-fix (`fix-licensee.mjs`), не в detector-і.
4
- */
5
- import { existsSync } from 'node:fs'
6
- import { join } from 'node:path'
7
-
8
- import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
9
- import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
10
- import { spawnAsync } from '../../../scripts/utils/spawn-async.mjs'
11
-
12
- /**
13
- * Detector bun/licensee: ліцензії npm-залежностей через `licensee` (read-only).
14
- * @param {import('../../../scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону
15
- * @returns {Promise<import('../../../scripts/lib/lint-surface/types.mjs').LintResult>} результат detector-а
16
- */
17
- export async function lint(ctx) {
18
- const reporter = createViolationReporter(ctx)
19
- const { fail } = reporter
20
- const cwd = ctx.cwd
21
-
22
- const configPath = join(cwd, '.licensee.json')
23
- if (!existsSync(configPath)) {
24
- fail(
25
- 'lint-bun: licensee — немає .licensee.json; запустіть `npx @7n/rules lint bun` локально для генерації (bun.mdc)',
26
- 'licensee-config-missing'
27
- )
28
- return reporter.result()
29
- }
30
-
31
- const bun = resolveCmd('bun')
32
- if (!bun) {
33
- fail('lint-bun: `bun` не знайдено в PATH (bun.mdc)', 'bun-missing')
34
- return reporter.result()
35
- }
36
-
37
- // Без --quiet: `licensee` пише реальні NOT APPROVED записи (name/version/license) у
38
- // stdout через print() — деталь замість голого "код 1". Crash/die() усередині
39
- // самого тула (invalid config, внутрішній виняток на кшталт "Cannot read properties
40
- // of undefined (reading 'localeCompare')" — спостережено з @npmcli/arborist на
41
- // bun-based node_modules) завжди йде у stderr через die(); легітимний звіт про
42
- // порушення — лише у stdout. Канал розрізняє crash від реального порушення.
43
- const r = await spawnAsync(bun, ['x', 'licensee', '--production', '--errors-only'], { cwd, shell: false })
44
- if (r.exitCode !== 0) {
45
- const stderr = (r.stderr ?? '').trim().slice(0, 2000)
46
- if (stderr) {
47
- // Crash самого тула — НЕ підтверджене ліцензійне порушення: fail-open
48
- // діагностикою (не блокує CI-гейт). Fail-closed тут перманентно червонив би
49
- // bun-монорепо: @npmcli/arborist (яким licensee читає node_modules)
50
- // несумісний із деревом bun install.
51
- const result = reporter.result()
52
- result.diagnostics = [
53
- {
54
- level: 'warn',
55
- message:
56
- `lint-bun: licensee — інструмент завершився з помилкою, це НЕ підтверджене ліцензійне порушення ` +
57
- `(код ${r.exitCode}, bun.mdc). Ймовірна причина — несумісність @npmcli/arborist з деревом bun install. ` +
58
- `Перевір вручну: \`bunx licensee --production\`.\n${stderr}`
59
- }
60
- ]
61
- return result
62
- }
63
- const stdout = (r.stdout ?? '').trim().slice(0, 2000)
64
- const detail = stdout ? `\n${stdout}` : ''
65
- fail(`lint-bun: licensee — порушення ліцензій (код ${r.exitCode}, bun.mdc)${detail}`, 'license-violation')
66
- }
67
- return reporter.result()
68
- }
@@ -1,3 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json"
3
- }