@7n/rules-lang-js 0.3.1 → 0.4.1

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 (258) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +14 -4
  3. package/rules/bun/bunfig/bunfig.mdc +17 -0
  4. package/rules/bun/bunfig/bunfig.rego +29 -0
  5. package/rules/bun/bunfig/concern.json +9 -0
  6. package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +2 -0
  7. package/rules/bun/docs/index.md +11 -0
  8. package/rules/bun/layout/concern.json +16 -0
  9. package/rules/bun/layout/docs/fix-layout.md +29 -0
  10. package/rules/bun/layout/docs/main.md +34 -0
  11. package/rules/bun/layout/fix-layout.mjs +63 -0
  12. package/rules/bun/layout/layout.mdc +60 -0
  13. package/rules/bun/layout/main.mjs +53 -0
  14. package/rules/bun/licensee/concern.json +7 -0
  15. package/rules/bun/licensee/docs/fix-licensee.md +27 -0
  16. package/rules/bun/licensee/docs/index.md +12 -0
  17. package/rules/bun/licensee/docs/main.md +30 -0
  18. package/rules/bun/licensee/fix-licensee.mjs +31 -0
  19. package/rules/bun/licensee/main.mjs +68 -0
  20. package/rules/bun/lint-surface/concern.json +3 -0
  21. package/rules/bun/lint-surface/lint-surface.mdc +13 -0
  22. package/rules/bun/main.json +1 -0
  23. package/rules/bun/main.mdc +11 -0
  24. package/rules/bun/package_json/concern.json +9 -0
  25. package/rules/bun/package_json/docs/fix-package_json.md +28 -0
  26. package/rules/bun/package_json/docs/index.md +9 -0
  27. package/rules/bun/package_json/fix-package_json.mjs +311 -0
  28. package/rules/bun/package_json/package_json.mdc +14 -0
  29. package/rules/bun/package_json/package_json.rego +64 -0
  30. package/rules/bun/package_json/template/package.json.deny.json +4 -0
  31. package/rules/js/check/check.mdc +26 -0
  32. package/rules/js/check/concern.json +19 -0
  33. package/rules/js/check/docs/eslint-config.md +56 -0
  34. package/rules/js/check/docs/fix-check.md +48 -0
  35. package/rules/js/check/docs/index.md +13 -0
  36. package/rules/js/check/docs/main.md +48 -0
  37. package/rules/js/check/eslint-config.mjs +262 -0
  38. package/rules/js/check/fix-check.mjs +82 -0
  39. package/rules/js/check/main.mjs +310 -0
  40. package/rules/js/dep-policy/concern.json +4 -0
  41. package/rules/js/dep-policy/dep-policy.mdc +36 -0
  42. package/rules/js/dep-policy/docs/main.md +35 -0
  43. package/rules/js/dep-policy/main.mjs +99 -0
  44. package/rules/js/docs/index.md +11 -0
  45. package/rules/js/eslint/concern.json +8 -0
  46. package/rules/js/eslint/docs/fix-eslint.md +50 -0
  47. package/rules/js/eslint/docs/fix-worker.md +31 -0
  48. package/rules/js/eslint/docs/index.md +11 -0
  49. package/rules/js/eslint/docs/main.md +35 -0
  50. package/rules/js/eslint/fix-eslint.mjs +160 -0
  51. package/rules/js/eslint/fix-worker.mjs +139 -0
  52. package/rules/js/eslint/main.mjs +115 -0
  53. package/rules/js/file-extensions/concern.json +3 -0
  54. package/rules/js/file-extensions/file-extensions.mdc +12 -0
  55. package/rules/js/jscpd_config/concern.json +11 -0
  56. package/rules/js/jscpd_config/docs/fix-jscpd_config.md +25 -0
  57. package/rules/js/jscpd_config/docs/index.md +9 -0
  58. package/rules/js/jscpd_config/fix-jscpd_config.mjs +3 -0
  59. package/rules/js/jscpd_config/jscpd_config.mdc +42 -0
  60. package/rules/js/jscpd_config/jscpd_config.rego +44 -0
  61. package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +7 -0
  62. package/rules/js/jscpd_duplicates/concern.json +7 -0
  63. package/rules/js/jscpd_duplicates/docs/main.md +29 -0
  64. package/rules/js/jscpd_duplicates/main.mjs +69 -0
  65. package/rules/js/knip/concern.json +7 -0
  66. package/rules/js/knip/docs/main.md +31 -0
  67. package/rules/js/knip/knip.mdc +15 -0
  68. package/rules/js/knip/main.mjs +89 -0
  69. package/rules/js/lint-findings/concern.json +3 -0
  70. package/rules/js/lint-findings/docs/main.md +40 -0
  71. package/rules/js/lint-findings/main.mjs +125 -0
  72. package/rules/js/main.json +1 -0
  73. package/rules/js/main.mdc +18 -0
  74. package/rules/js/package_json/concern.json +9 -0
  75. package/rules/js/package_json/docs/fix-package_json.md +25 -0
  76. package/rules/js/package_json/docs/index.md +9 -0
  77. package/rules/js/package_json/fix-package_json.mjs +3 -0
  78. package/rules/js/package_json/package_json.mdc +15 -0
  79. package/rules/js/package_json/package_json.rego +142 -0
  80. package/rules/js/package_json/template/package.json.snippet.json +6 -0
  81. package/rules/js/tooling/concern.json +3 -0
  82. package/rules/js/tooling/data/tooling/knip-canonical.json +30 -0
  83. package/rules/js/tooling/data/tooling/oxlint-canonical.json +400 -0
  84. package/rules/js/tooling/docs/main.md +53 -0
  85. package/rules/js/tooling/main.mjs +183 -0
  86. package/rules/js/utils_imports/concern.json +4 -0
  87. package/rules/js/utils_imports/docs/main.md +50 -0
  88. package/rules/js/utils_imports/main.mjs +185 -0
  89. package/rules/js/utils_imports/utils_imports.mdc +15 -0
  90. package/rules/js/vscode_extensions/concern.json +11 -0
  91. package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
  92. package/rules/js/vscode_extensions/docs/index.md +11 -0
  93. package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  94. package/rules/js/vscode_extensions/template/extensions.json.snippet.json +6 -0
  95. package/rules/js/vscode_extensions/vscode_extensions.mdc +11 -0
  96. package/rules/js/vscode_extensions/vscode_extensions.rego +12 -0
  97. package/rules/js-bun-db/connection/concern.json +3 -0
  98. package/rules/js-bun-db/connection/connection.mdc +42 -0
  99. package/rules/js-bun-db/docs/index.md +11 -0
  100. package/rules/js-bun-db/lib/bun-sql-scan.mjs +1047 -0
  101. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +63 -0
  102. package/rules/js-bun-db/lib/docs/index.md +11 -0
  103. package/rules/js-bun-db/main.json +1 -0
  104. package/rules/js-bun-db/main.mdc +8 -0
  105. package/rules/js-bun-db/package_json/concern.json +9 -0
  106. package/rules/js-bun-db/package_json/package_json.mdc +31 -0
  107. package/rules/js-bun-db/package_json/package_json.rego +15 -0
  108. package/rules/js-bun-db/package_json/template/package.json.deny.json +6 -0
  109. package/rules/js-bun-db/pg_format_identifiers/concern.json +3 -0
  110. package/rules/js-bun-db/pg_format_identifiers/pg_format_identifiers.mdc +104 -0
  111. package/rules/js-bun-db/safety/concern.json +4 -0
  112. package/rules/js-bun-db/safety/docs/main.md +34 -0
  113. package/rules/js-bun-db/safety/main.mjs +430 -0
  114. package/rules/js-bun-db/safety/safety.mdc +458 -0
  115. package/rules/js-bun-redis/docs/index.md +11 -0
  116. package/rules/js-bun-redis/imports/concern.json +4 -0
  117. package/rules/js-bun-redis/imports/docs/main.md +36 -0
  118. package/rules/js-bun-redis/imports/imports.mdc +47 -0
  119. package/rules/js-bun-redis/imports/main.mjs +88 -0
  120. package/rules/js-bun-redis/lib/docs/index.md +11 -0
  121. package/rules/js-bun-redis/lib/docs/redis-imports.md +227 -0
  122. package/rules/js-bun-redis/lib/redis-imports.mjs +130 -0
  123. package/rules/js-bun-redis/main.json +1 -0
  124. package/rules/js-bun-redis/main.mdc +8 -0
  125. package/rules/js-bun-redis/package_json/concern.json +9 -0
  126. package/rules/js-bun-redis/package_json/package_json.mdc +11 -0
  127. package/rules/js-bun-redis/package_json/package_json.rego +15 -0
  128. package/rules/js-bun-redis/package_json/template/package.json.deny.json +12 -0
  129. package/rules/js-mssql/deps/concern.json +4 -0
  130. package/rules/js-mssql/deps/docs/main.md +33 -0
  131. package/rules/js-mssql/deps/main.mjs +297 -0
  132. package/rules/js-mssql/docs/index.md +11 -0
  133. package/rules/js-mssql/lib/docs/index.md +11 -0
  134. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +380 -0
  135. package/rules/js-mssql/lib/mssql-pool-scan.mjs +610 -0
  136. package/rules/js-mssql/main.json +1 -0
  137. package/rules/js-mssql/main.mdc +144 -0
  138. package/rules/js-mssql/mssql-tvp/concern.json +3 -0
  139. package/rules/js-mssql/mssql-tvp/mssql-tvp.mdc +77 -0
  140. package/rules/js-mssql/package_json/concern.json +9 -0
  141. package/rules/js-mssql/package_json/package_json.mdc +9 -0
  142. package/rules/js-mssql/package_json/package_json.rego +57 -0
  143. package/rules/js-run/configmap/concern.json +9 -0
  144. package/rules/js-run/configmap/configmap.mdc +37 -0
  145. package/rules/js-run/configmap/configmap.rego +21 -0
  146. package/rules/js-run/configmap/template/configmap.yaml.contains.yml +4 -0
  147. package/rules/js-run/docs/index.md +11 -0
  148. package/rules/js-run/jsconfig/concern.json +9 -0
  149. package/rules/js-run/jsconfig/docs/fix-jsconfig.md +28 -0
  150. package/rules/js-run/jsconfig/docs/index.md +9 -0
  151. package/rules/js-run/jsconfig/fix-jsconfig.mjs +119 -0
  152. package/rules/js-run/jsconfig/jsconfig.mdc +48 -0
  153. package/rules/js-run/jsconfig/jsconfig.rego +59 -0
  154. package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +10 -0
  155. package/rules/js-run/lib/bunyan-imports.mjs +98 -0
  156. package/rules/js-run/lib/check-env-scan.mjs +338 -0
  157. package/rules/js-run/lib/conn-file-rules.mjs +214 -0
  158. package/rules/js-run/lib/conn-imports-scan.mjs +154 -0
  159. package/rules/js-run/lib/docs/bunyan-imports.md +121 -0
  160. package/rules/js-run/lib/docs/check-env-scan.md +438 -0
  161. package/rules/js-run/lib/docs/conn-file-rules.md +304 -0
  162. package/rules/js-run/lib/docs/conn-imports-scan.md +208 -0
  163. package/rules/js-run/lib/docs/index.md +16 -0
  164. package/rules/js-run/lib/docs/promise-settimeout-scan.md +334 -0
  165. package/rules/js-run/lib/docs/temporal-scan.md +29 -0
  166. package/rules/js-run/lib/promise-settimeout-scan.mjs +128 -0
  167. package/rules/js-run/lib/temporal-scan.mjs +52 -0
  168. package/rules/js-run/main.json +1 -0
  169. package/rules/js-run/main.mdc +16 -0
  170. package/rules/js-run/package_json/concern.json +9 -0
  171. package/rules/js-run/package_json/package_json.mdc +44 -0
  172. package/rules/js-run/package_json/package_json.rego +37 -0
  173. package/rules/js-run/package_json/template/package.json.deny.json +22 -0
  174. package/rules/js-run/project-structure/concern.json +3 -0
  175. package/rules/js-run/project-structure/project-structure.mdc +11 -0
  176. package/rules/js-run/runtime/concern.json +12 -0
  177. package/rules/js-run/runtime/docs/fix-runtime.md +27 -0
  178. package/rules/js-run/runtime/docs/main.md +35 -0
  179. package/rules/js-run/runtime/fix-runtime.mjs +46 -0
  180. package/rules/js-run/runtime/main.mjs +496 -0
  181. package/rules/js-run/runtime/runtime.mdc +184 -0
  182. package/rules/js-run/scope/concern.json +3 -0
  183. package/rules/js-run/scope/scope.mdc +11 -0
  184. package/rules/npm-module/docs/index.md +11 -0
  185. package/rules/npm-module/emit_types_config/concern.json +9 -0
  186. package/rules/npm-module/emit_types_config/docs/fix-emit_types_config.md +25 -0
  187. package/rules/npm-module/emit_types_config/docs/index.md +9 -0
  188. package/rules/npm-module/emit_types_config/emit_types_config.mdc +43 -0
  189. package/rules/npm-module/emit_types_config/emit_types_config.rego +28 -0
  190. package/rules/npm-module/emit_types_config/fix-emit_types_config.mjs +5 -0
  191. package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +9 -0
  192. package/rules/npm-module/header_doc_pointer/concern.json +5 -0
  193. package/rules/npm-module/header_doc_pointer/docs/main.md +40 -0
  194. package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +18 -0
  195. package/rules/npm-module/header_doc_pointer/main.mjs +131 -0
  196. package/rules/npm-module/main.json +1 -0
  197. package/rules/npm-module/main.mdc +36 -0
  198. package/rules/npm-module/npm_package_json/concern.json +9 -0
  199. package/rules/npm-module/npm_package_json/docs/fix-npm_package_json.md +26 -0
  200. package/rules/npm-module/npm_package_json/docs/index.md +9 -0
  201. package/rules/npm-module/npm_package_json/fix-npm_package_json.mjs +5 -0
  202. package/rules/npm-module/npm_package_json/npm_package_json.mdc +57 -0
  203. package/rules/npm-module/npm_package_json/npm_package_json.rego +73 -0
  204. package/rules/npm-module/npm_package_json/template/package.json.snippet.json +1 -0
  205. package/rules/npm-module/package_structure/concern.json +5 -0
  206. package/rules/npm-module/package_structure/docs/main.md +37 -0
  207. package/rules/npm-module/package_structure/main.mjs +448 -0
  208. package/rules/npm-module/package_structure/package_structure.mdc +63 -0
  209. package/rules/npm-module/root_package_json/concern.json +9 -0
  210. package/rules/npm-module/root_package_json/docs/fix-root_package_json.md +25 -0
  211. package/rules/npm-module/root_package_json/docs/index.md +9 -0
  212. package/rules/npm-module/root_package_json/fix-root_package_json.mjs +5 -0
  213. package/rules/npm-module/root_package_json/root_package_json.mdc +41 -0
  214. package/rules/npm-module/root_package_json/root_package_json.rego +28 -0
  215. package/rules/npm-module/root_package_json/template/package.json.snippet.json +1 -0
  216. package/rules/npm-module/rule_meta/concern.json +8 -0
  217. package/rules/npm-module/rule_meta/docs/main.md +35 -0
  218. package/rules/npm-module/rule_meta/main.mjs +119 -0
  219. package/rules/npm-module/rule_meta/rule_meta.mdc +11 -0
  220. package/rules/npm-module/skill_meta/concern.json +5 -0
  221. package/rules/npm-module/skill_meta/docs/main.md +149 -0
  222. package/rules/npm-module/skill_meta/main.mjs +91 -0
  223. package/rules/npm-module/skill_meta/skill_meta.mdc +11 -0
  224. package/rules/tool-surface/docs/index.md +11 -0
  225. package/rules/tool-surface/main.json +6 -0
  226. package/rules/tool-surface/main.mdc +72 -0
  227. package/rules/vue/composition-api/composition-api.mdc +82 -0
  228. package/rules/vue/composition-api/concern.json +3 -0
  229. package/rules/vue/docs/index.md +11 -0
  230. package/rules/vue/lib/docs/index.md +11 -0
  231. package/rules/vue/lib/docs/vue-forbidden-imports.md +265 -0
  232. package/rules/vue/lib/vue-forbidden-imports.mjs +240 -0
  233. package/rules/vue/main.json +1 -0
  234. package/rules/vue/main.mdc +18 -0
  235. package/rules/vue/nheader-layout/concern.json +3 -0
  236. package/rules/vue/nheader-layout/nheader-layout.mdc +171 -0
  237. package/rules/vue/package_json/concern.json +9 -0
  238. package/rules/vue/package_json/package_json.mdc +30 -0
  239. package/rules/vue/package_json/package_json.rego +140 -0
  240. package/rules/vue/packages/concern.json +6 -0
  241. package/rules/vue/packages/docs/index.md +11 -0
  242. package/rules/vue/packages/docs/main.md +35 -0
  243. package/rules/vue/packages/main.mjs +575 -0
  244. package/rules/vue/packages/packages.mdc +56 -0
  245. package/rules/vue/quasar-ui/concern.json +3 -0
  246. package/rules/vue/quasar-ui/quasar-ui.mdc +32 -0
  247. package/rules/vue/structure/concern.json +3 -0
  248. package/rules/vue/structure/structure.mdc +101 -0
  249. package/rules/vue/testing/concern.json +3 -0
  250. package/rules/vue/testing/testing.mdc +40 -0
  251. package/rules/vue/tfm-translations/concern.json +7 -0
  252. package/rules/vue/tfm-translations/docs/main.md +29 -0
  253. package/rules/vue/tfm-translations/main.mjs +55 -0
  254. package/rules/vue/tfm-translations/tfm-translations.mdc +32 -0
  255. package/rules/vue/vite-config/concern.json +3 -0
  256. package/rules/vue/vite-config/vite-config.mdc +153 -0
  257. package/rules/vue/vite-env/concern.json +3 -0
  258. package/rules/vue/vite-env/vite-env.mdc +61 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.1] - 2026-07-19
4
+
5
+ ### Fixed
6
+
7
+ - js/knip: вбудований ігнор unused-dependency на пакети екосистеми n-rules (@7n/rules і @7n/rules-* плагіни — їх ставить сам npx @7n/rules, код споживача не імпортує) + канон knip ignoreDependencies з тим самим патерном
8
+
9
+ ## [0.4.0] - 2026-07-19
10
+
11
+ ### Added
12
+
13
+ - JS-сімʼя lint-правил з ядра (фаза 5c spec lang-plugins-extraction): js, bun, vue, js-run, js-bun-db, js-bun-redis, js-mssql, npm-module, tool-surface — плагін тепер contributes.rules з власними залежностями інструментів (eslint, oxlint, knip, jscpd, oxc-parser, globby, ignore); спільні з рушієм хелпери (globToRegex, textHasBunSqlImport, contentForVueImportScan) імпортуються з ядра і ре-експортуються для сумісності API
14
+
3
15
  ## [0.3.1] - 2026-07-19
4
16
 
5
17
  ### Fixed
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@7n/rules-lang-js",
3
- "version": "0.3.1",
4
- "description": "Плагін @7n/rules: JS/npm/bun-екосистема — taze-провайдер (package.json, bunx taze) і doc-files-екстрактори (oxc AST)",
3
+ "version": "0.4.1",
4
+ "description": "Плагін @7n/rules: JS/npm/bun-екосистема — lint-правила (js/bun/vue/js-run/npm-module/db), taze-провайдер (package.json, bunx taze) і doc-files-екстрактори (oxc AST)",
5
5
  "keywords": [
6
6
  "javascript",
7
7
  "bun",
@@ -22,6 +22,7 @@
22
22
  "type": "module",
23
23
  "files": [
24
24
  "doc-files",
25
+ "rules",
25
26
  "taze",
26
27
  "skills",
27
28
  "CHANGELOG.md",
@@ -35,7 +36,7 @@
35
36
  "lang:js"
36
37
  ],
37
38
  "contributes": {
38
- "rules": false,
39
+ "rules": true,
39
40
  "handlers": {
40
41
  "taze": "./taze/provider.mjs",
41
42
  "doc-files": "./doc-files/extractors.mjs"
@@ -50,8 +51,17 @@
50
51
  }
51
52
  }
52
53
  },
54
+ "dependencies": {
55
+ "eslint": "^10.4.1",
56
+ "globby": "^16.0.0",
57
+ "ignore": "^7.0.5",
58
+ "jscpd": "^5.0.11",
59
+ "knip": "^6.22.0",
60
+ "oxc-parser": "^0.137.0",
61
+ "oxlint": "^1.68.0"
62
+ },
53
63
  "peerDependencies": {
54
- "@7n/rules": ">=1.24.0"
64
+ "@7n/rules": ">=1.27.0"
55
65
  },
56
66
  "publishConfig": {
57
67
  "access": "public"
@@ -0,0 +1,17 @@
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.
@@ -0,0 +1,29 @@
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
+ }
@@ -0,0 +1,9 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ [install]
2
+ linker = "hoisted"
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/bun
4
+ resource: plugins/lang-js/rules/bun/
5
+ ---
6
+
7
+ # npm/rules/bun
8
+
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,16 @@
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
+ }
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-layout.mjs
4
+ resource: plugins/lang-js/rules/bun/layout/fix-layout.mjs
5
+ docgen:
6
+ crc: a8664761
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
+ - (специфічних машинно-виведених гарантій немає)
@@ -0,0 +1,34 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: plugins/lang-js/rules/bun/layout/main.mjs
5
+ docgen:
6
+ crc: 21f102d5
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: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,63 @@
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('@7n/rules/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
+ ]
@@ -0,0 +1,60 @@
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**).
@@ -0,0 +1,53 @@
1
+ /** @see ./docs/layout.md */
2
+ import { existsSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+
5
+ import { createViolationReporter } from '@7n/rules/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('@7n/rules/scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону
14
+ * @returns {import('@7n/rules/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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
+ "fixability": "config",
4
+ "lint": {
5
+ "scope": "full"
6
+ }
7
+ }
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-licensee.mjs
4
+ resource: plugins/lang-js/rules/bun/licensee/fix-licensee.mjs
5
+ docgen:
6
+ crc: fadaf25f
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.
@@ -0,0 +1,12 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/bun/licensee
4
+ resource: plugins/lang-js/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 |
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: plugins/lang-js/rules/bun/licensee/main.mjs
5
+ docgen:
6
+ crc: 0db50dff
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 реальне порушення; текстові евристики за вмістом повідомлення не використовуються.
@@ -0,0 +1,31 @@
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 '@7n/rules/scripts/utils/resolve-cmd.mjs'
10
+ import { spawnAsync } from '@7n/rules/scripts/utils/spawn-async.mjs'
11
+
12
+ /** @type {import('@7n/rules/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
+ ]
@@ -0,0 +1,68 @@
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 '@7n/rules/scripts/lib/lint-surface/violation-reporter.mjs'
9
+ import { resolveCmd } from '@7n/rules/scripts/utils/resolve-cmd.mjs'
10
+ import { spawnAsync } from '@7n/rules/scripts/utils/spawn-async.mjs'
11
+
12
+ /**
13
+ * Detector bun/licensee: ліцензії npm-залежностей через `licensee` (read-only).
14
+ * @param {import('@7n/rules/scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону
15
+ * @returns {Promise<import('@7n/rules/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
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json"
3
+ }
@@ -0,0 +1,13 @@
1
+ ## Лінт через n-rules, не package.json-скрипти
2
+
3
+ Лінт запускається через CLI **`n-rules`** (локально) / **`npx @7n/rules`** (без локальної інсталяції),
4
+ **не** через `package.json`-скрипти:
5
+
6
+ - **`npx @7n/rules lint --full`** — весь репо (CI-режим);
7
+ - **`npx @7n/rules lint`** — дельта vs origin (лише змінені файли, типовий задачний прогін);
8
+ - **`n-rules lint <rule…>`** — конкретні правила, напр. **`n-rules lint ga`**.
9
+
10
+ У кореневому `package.json` **не повинно бути** `lint`/`lint-*` скриптів — єдина точка лінту — CLI
11
+ `n-rules` (пакет `@7n/rules`). Цей запис механічно перевіряється Rego-gate'ом
12
+ [`bun.package_json`](../package_json/package_json.mdc) (deny на `scripts.lint` / `scripts.lint-*`) —
13
+ тут лишається лише пояснення *чому* так (єдина точка входу для лінту), без дублювання самого чеку.
@@ -0,0 +1 @@
1
+ { "auto": { "glob": ["package.json", ".licensee.json"] } }
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Bun як єдиний package manager у монорепо
3
+ globs: "**/package.json,**/bunfig.toml,**/bun.lock,**/bun.lockb"
4
+ alwaysApply: false
5
+ version: '2.1'
6
+ ---
7
+
8
+ Проект використовує тільки Bun для керування залежностями та запуску скриптів.
9
+
10
+ - [package.json.deny.json](./package_json/template/package.json.deny.json)
11
+ - [bunfig.toml.snippet.toml](./bunfig/template/bunfig.toml.snippet.toml)
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
+ "fixability": "config",
4
+ "policy": {
5
+ "files": {
6
+ "single": "package.json"
7
+ }
8
+ }
9
+ }