@nitra/cursor 12.6.0 → 12.7.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 (269) hide show
  1. package/.claude-template/settings.template.json +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/bin/docs/n-cursor.md +4 -20
  4. package/bin/n-cursor.js +7 -53
  5. package/docs/stryker.config.md +20 -28
  6. package/package.json +1 -1
  7. package/rules/abie/docs/index.md +1 -0
  8. package/rules/abie/docs/main.md +29 -0
  9. package/rules/abie/{fix.mjs → main.mjs} +5 -3
  10. package/rules/adr/docs/index.md +1 -0
  11. package/rules/adr/docs/main.md +29 -0
  12. package/rules/adr/{fix.mjs → main.mjs} +5 -3
  13. package/rules/bun/docs/index.md +1 -0
  14. package/rules/bun/docs/main.md +30 -0
  15. package/rules/bun/js/docs/layout.md +11 -36
  16. package/rules/bun/{fix.mjs → main.mjs} +5 -3
  17. package/rules/capacitor/docs/index.md +1 -0
  18. package/rules/capacitor/docs/main.md +29 -0
  19. package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
  20. package/rules/changelog/docs/index.md +1 -0
  21. package/rules/changelog/docs/main.md +27 -0
  22. package/rules/changelog/main.mjs +20 -0
  23. package/rules/ci4/docs/index.md +1 -0
  24. package/rules/ci4/docs/main.md +30 -0
  25. package/rules/ci4/main.mjs +20 -0
  26. package/rules/doc-files/docs/index.md +1 -0
  27. package/rules/doc-files/docs/main.md +31 -0
  28. package/rules/doc-files/js/docgen-files-batch.mjs +47 -3
  29. package/rules/doc-files/js/docgen-scan.mjs +89 -9
  30. package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
  31. package/rules/doc-files/js/docs/docgen-scan.md +34 -34
  32. package/rules/doc-files/js/docs/index.md +1 -0
  33. package/rules/doc-files/js/docs/run-lint.md +27 -0
  34. package/rules/doc-files/{lint/lint.mjs → js/run-lint.mjs} +23 -9
  35. package/rules/doc-files/{js/lint.mjs → main.mjs} +60 -10
  36. package/rules/docker/docs/index.md +1 -0
  37. package/rules/docker/docs/main.md +28 -0
  38. package/rules/docker/js/docs/lint.md +26 -54
  39. package/rules/docker/js/lint.mjs +11 -0
  40. package/rules/docker/lib/docker-hadolint.mjs +1 -1
  41. package/rules/docker/lib/docs/docker-hadolint.md +16 -173
  42. package/rules/docker/main.mjs +20 -0
  43. package/rules/efes/docs/index.md +1 -0
  44. package/rules/efes/docs/main.md +29 -0
  45. package/rules/efes/main.mjs +20 -0
  46. package/rules/feedback/docs/index.md +1 -0
  47. package/rules/feedback/docs/main.md +30 -0
  48. package/rules/feedback/main.mjs +20 -0
  49. package/rules/ga/docs/index.md +1 -0
  50. package/rules/ga/docs/main.md +29 -0
  51. package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
  52. package/rules/graphql/docs/index.md +1 -0
  53. package/rules/graphql/docs/main.md +36 -0
  54. package/rules/graphql/main.mjs +20 -0
  55. package/rules/hasura/docs/index.md +1 -0
  56. package/rules/hasura/docs/main.md +30 -0
  57. package/rules/hasura/main.mjs +20 -0
  58. package/rules/image-avif/docs/index.md +1 -0
  59. package/rules/image-avif/docs/main.md +30 -0
  60. package/rules/image-avif/js/docs/avif_generation.md +20 -233
  61. package/rules/image-avif/main.mjs +20 -0
  62. package/rules/image-compress/docs/index.md +1 -0
  63. package/rules/image-compress/docs/main.md +29 -0
  64. package/rules/image-compress/js/docs/package_setup.md +12 -11
  65. package/rules/image-compress/{js/lint.mjs → main.mjs} +21 -5
  66. package/rules/js-bun-db/docs/index.md +1 -0
  67. package/rules/js-bun-db/docs/main.md +30 -0
  68. package/rules/js-bun-db/main.mjs +20 -0
  69. package/rules/js-bun-redis/docs/index.md +1 -0
  70. package/rules/js-bun-redis/docs/main.md +29 -0
  71. package/rules/js-bun-redis/main.mjs +20 -0
  72. package/rules/js-lint/docs/index.md +1 -0
  73. package/rules/js-lint/docs/main.md +29 -0
  74. package/rules/js-lint/js/check.mjs +268 -0
  75. package/rules/js-lint/js/docs/check.md +39 -0
  76. package/rules/js-lint/js/docs/index.md +1 -1
  77. package/rules/js-lint/js/docs/tooling.md +12 -32
  78. package/rules/js-lint/js/tooling.mjs +1 -265
  79. package/rules/js-lint/{js/lint.mjs → main.mjs} +19 -2
  80. package/rules/js-lint-ci/docs/index.md +1 -0
  81. package/rules/js-lint-ci/docs/main.md +27 -0
  82. package/rules/js-lint-ci/main.mjs +33 -0
  83. package/rules/js-mssql/docs/index.md +1 -0
  84. package/rules/js-mssql/docs/main.md +30 -0
  85. package/rules/js-mssql/main.mjs +20 -0
  86. package/rules/js-run/docs/index.md +1 -0
  87. package/rules/js-run/docs/main.md +30 -0
  88. package/rules/js-run/main.mjs +20 -0
  89. package/rules/k8s/docs/index.md +1 -0
  90. package/rules/k8s/docs/main.md +40 -0
  91. package/rules/k8s/js/docs/index.md +12 -0
  92. package/rules/k8s/{lint/lint.mjs → main.mjs} +32 -10
  93. package/rules/nginx-default-tpl/docs/index.md +1 -0
  94. package/rules/nginx-default-tpl/docs/main.md +30 -0
  95. package/rules/nginx-default-tpl/main.mjs +20 -0
  96. package/rules/npm-module/docs/index.md +1 -0
  97. package/rules/npm-module/docs/main.md +29 -0
  98. package/rules/npm-module/js/docs/rule_meta.md +17 -16
  99. package/rules/npm-module/js/rule_meta.mjs +13 -3
  100. package/rules/npm-module/main.mjs +20 -0
  101. package/rules/php/docs/index.md +1 -0
  102. package/rules/php/docs/main.md +33 -0
  103. package/rules/php/js/docs/tooling.md +10 -10
  104. package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
  105. package/rules/python/docs/index.md +1 -0
  106. package/rules/python/docs/main.md +31 -0
  107. package/rules/python/js/docs/tooling.md +17 -17
  108. package/rules/python/{lint/lint.mjs → main.mjs} +29 -5
  109. package/rules/rego/docs/index.md +1 -0
  110. package/rules/rego/docs/main.md +37 -0
  111. package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
  112. package/rules/release/docs/index.md +1 -0
  113. package/rules/release/docs/main.md +29 -0
  114. package/rules/release/docs/release.md +0 -3
  115. package/rules/release/release.mdc +10 -0
  116. package/rules/rust/docs/index.md +1 -0
  117. package/rules/rust/docs/main.md +27 -0
  118. package/rules/rust/{js/lint.mjs → main.mjs} +20 -3
  119. package/rules/security/docs/index.md +1 -0
  120. package/rules/security/docs/main.md +28 -0
  121. package/rules/security/main.mjs +45 -0
  122. package/rules/style-lint/docs/index.md +1 -0
  123. package/rules/style-lint/docs/main.md +29 -0
  124. package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
  125. package/rules/tauri/docs/index.md +1 -0
  126. package/rules/tauri/docs/main.md +29 -0
  127. package/rules/tauri/main.mjs +20 -0
  128. package/rules/test/docs/index.md +1 -0
  129. package/rules/test/docs/main.md +30 -0
  130. package/rules/test/main.mjs +20 -0
  131. package/rules/text/docs/index.md +1 -0
  132. package/rules/text/docs/main.md +29 -0
  133. package/rules/text/js/docs/cspell-fix.md +30 -0
  134. package/rules/text/js/docs/formatting.md +12 -45
  135. package/rules/text/js/docs/index.md +4 -0
  136. package/rules/text/js/docs/run-dotenv-linter.md +31 -0
  137. package/rules/text/js/docs/run-shellcheck.md +28 -0
  138. package/rules/text/js/docs/run-v8r.md +29 -0
  139. package/rules/text/{lint/lint.mjs → main.mjs} +38 -9
  140. package/rules/text/text.mdc +5 -14
  141. package/rules/tool-surface/docs/index.md +1 -0
  142. package/rules/tool-surface/docs/main.md +29 -0
  143. package/rules/tool-surface/main.mjs +20 -0
  144. package/rules/vue/docs/index.md +1 -0
  145. package/rules/vue/docs/main.md +29 -0
  146. package/rules/vue/main.mjs +20 -0
  147. package/rules/worktree/docs/index.md +1 -0
  148. package/rules/worktree/docs/main.md +28 -0
  149. package/rules/worktree/main.mjs +20 -0
  150. package/scripts/docs/index.md +1 -0
  151. package/scripts/docs/post-tool-use-check.md +29 -0
  152. package/scripts/docs/sync-claude-config.md +64 -92
  153. package/scripts/lib/adr/docs/normalize-cli.md +0 -3
  154. package/scripts/lib/adr/docs/normalize-pipeline.md +0 -3
  155. package/scripts/lib/docs/gha-workflow.md +25 -317
  156. package/scripts/lib/docs/index.md +1 -0
  157. package/scripts/lib/docs/list-project-rules-mdc.md +5 -4
  158. package/scripts/lib/docs/list-rule-ids.md +15 -148
  159. package/scripts/lib/docs/read-n-cursor-config-lite.md +12 -16
  160. package/scripts/lib/docs/run-lint-step.md +13 -13
  161. package/scripts/lib/docs/run-lint.md +30 -0
  162. package/scripts/lib/docs/run-rule-cli.md +14 -10
  163. package/scripts/lib/docs/run-standard-lint.md +27 -10
  164. package/scripts/lib/docs/run-standard-rule.md +12 -11
  165. package/scripts/lib/docs/timing-summary.md +11 -12
  166. package/scripts/lib/docs/worktree-notice.md +0 -3
  167. package/scripts/lib/fix/docs/index.md +1 -0
  168. package/scripts/lib/fix/docs/orchestrator.md +23 -18
  169. package/scripts/lib/fix/docs/run-conformance-check.md +32 -0
  170. package/scripts/lib/fix/docs/t0.md +10 -9
  171. package/scripts/lib/fix/orchestrator.mjs +5 -5
  172. package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
  173. package/scripts/lib/fix/t0.mjs +3 -3
  174. package/scripts/lib/gha-workflow.mjs +1 -1
  175. package/scripts/lib/list-project-rules-mdc.mjs +1 -1
  176. package/scripts/lib/list-rule-ids.mjs +12 -3
  177. package/scripts/lib/read-n-cursor-config-lite.mjs +2 -2
  178. package/scripts/lib/run-lint-step.mjs +1 -1
  179. package/{rules/lint/js/orchestrate.mjs → scripts/lib/run-lint.mjs} +42 -20
  180. package/scripts/lib/run-rule-cli.mjs +4 -4
  181. package/scripts/lib/run-standard-lint.mjs +19 -6
  182. package/scripts/lib/run-standard-rule.mjs +4 -4
  183. package/scripts/lib/timing-summary.mjs +1 -1
  184. package/scripts/{post-tool-use-fix.mjs → post-tool-use-check.mjs} +9 -9
  185. package/scripts/sync-claude-config.mjs +2 -2
  186. package/rules/changelog/fix.mjs +0 -18
  187. package/rules/ci4/fix.mjs +0 -18
  188. package/rules/doc-files/fix.mjs +0 -19
  189. package/rules/doc-files/js/docs/lint.md +0 -34
  190. package/rules/doc-files/lint/docs/index.md +0 -11
  191. package/rules/doc-files/lint/docs/lint.md +0 -35
  192. package/rules/docker/fix.mjs +0 -18
  193. package/rules/docker/lint/docs/index.md +0 -11
  194. package/rules/docker/lint/docs/lint.md +0 -200
  195. package/rules/docker/lint/lint.mjs +0 -95
  196. package/rules/efes/fix.mjs +0 -18
  197. package/rules/feedback/fix.mjs +0 -18
  198. package/rules/ga/fix.mjs +0 -18
  199. package/rules/ga/js/docs/lint.md +0 -20
  200. package/rules/ga/js/lint.mjs +0 -12
  201. package/rules/ga/lint/docs/index.md +0 -11
  202. package/rules/ga/lint/docs/lint.md +0 -31
  203. package/rules/graphql/fix.mjs +0 -18
  204. package/rules/hasura/fix.mjs +0 -18
  205. package/rules/image-avif/fix.mjs +0 -18
  206. package/rules/image-compress/fix.mjs +0 -18
  207. package/rules/image-compress/js/docs/lint.md +0 -24
  208. package/rules/js-bun-db/fix.mjs +0 -18
  209. package/rules/js-bun-redis/fix.mjs +0 -18
  210. package/rules/js-lint/fix.mjs +0 -18
  211. package/rules/js-lint/js/docs/lint.md +0 -32
  212. package/rules/js-lint-ci/fix.mjs +0 -18
  213. package/rules/js-lint-ci/js/docs/lint.md +0 -22
  214. package/rules/js-lint-ci/js/lint.mjs +0 -15
  215. package/rules/js-mssql/fix.mjs +0 -18
  216. package/rules/js-run/fix.mjs +0 -18
  217. package/rules/k8s/fix.mjs +0 -18
  218. package/rules/k8s/js/lint.mjs +0 -14
  219. package/rules/k8s/lint/docs/index.md +0 -11
  220. package/rules/k8s/lint/docs/lint.md +0 -413
  221. package/rules/lint/docs/fix.md +0 -25
  222. package/rules/lint/docs/index.md +0 -11
  223. package/rules/lint/fix.mjs +0 -18
  224. package/rules/lint/js/docs/index.md +0 -11
  225. package/rules/lint/js/docs/orchestrate.md +0 -31
  226. package/rules/lint/meta.json +0 -1
  227. package/rules/nginx-default-tpl/fix.mjs +0 -18
  228. package/rules/npm-module/fix.mjs +0 -18
  229. package/rules/php/fix.mjs +0 -18
  230. package/rules/php/js/docs/lint.md +0 -20
  231. package/rules/php/js/lint.mjs +0 -15
  232. package/rules/php/lint/docs/index.md +0 -11
  233. package/rules/php/lint/docs/lint.md +0 -219
  234. package/rules/python/fix.mjs +0 -18
  235. package/rules/python/js/docs/lint.md +0 -21
  236. package/rules/python/js/lint.mjs +0 -14
  237. package/rules/python/lint/docs/index.md +0 -11
  238. package/rules/python/lint/docs/lint.md +0 -29
  239. package/rules/rego/fix.mjs +0 -18
  240. package/rules/rego/js/docs/lint.md +0 -21
  241. package/rules/rego/js/lint.mjs +0 -12
  242. package/rules/rego/lint/docs/index.md +0 -11
  243. package/rules/rego/lint/docs/lint.md +0 -208
  244. package/rules/rust/fix.mjs +0 -18
  245. package/rules/rust/js/docs/lint.md +0 -21
  246. package/rules/security/fix.mjs +0 -18
  247. package/rules/security/js/docs/lint.md +0 -175
  248. package/rules/security/js/lint.mjs +0 -26
  249. package/rules/style-lint/fix.mjs +0 -18
  250. package/rules/style-lint/js/docs/lint.md +0 -31
  251. package/rules/tauri/fix.mjs +0 -18
  252. package/rules/test/fix.mjs +0 -18
  253. package/rules/text/fix.mjs +0 -18
  254. package/rules/text/js/docs/lint.md +0 -23
  255. package/rules/text/js/lint.mjs +0 -15
  256. package/rules/text/lint/docs/cspell-fix.md +0 -32
  257. package/rules/text/lint/docs/index.md +0 -15
  258. package/rules/text/lint/docs/lint.md +0 -36
  259. package/rules/text/lint/docs/run-dotenv-linter.md +0 -161
  260. package/rules/text/lint/docs/run-shellcheck.md +0 -216
  261. package/rules/text/lint/docs/run-v8r.md +0 -201
  262. package/rules/tool-surface/fix.mjs +0 -18
  263. package/rules/vue/fix.mjs +0 -18
  264. package/rules/worktree/fix.mjs +0 -18
  265. /package/rules/release/{fix.mjs → main.mjs} +0 -0
  266. /package/rules/text/{lint → js}/cspell-fix.mjs +0 -0
  267. /package/rules/text/{lint → js}/run-dotenv-linter.mjs +0 -0
  268. /package/rules/text/{lint → js}/run-shellcheck.mjs +0 -0
  269. /package/rules/text/{lint → js}/run-v8r.mjs +0 -0
@@ -3,27 +3,28 @@ type: JS Module
3
3
  title: package_setup.mjs
4
4
  resource: npm/rules/image-compress/js/package_setup.mjs
5
5
  docgen:
6
- crc: 13f6d8f3
7
- score: 95
6
+ crc: 8a5453c6
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
8
9
  ---
9
10
 
10
- Файл виконує перевірку наявності та видалення кешу. Він зчитує рядки з `.gitignore`, перевіряє наявність кешу `HASH_CACHE_FILENAME` та видаляє застарілий кеш `LEGACY_CACHE_FILENAME`. Код перевіряє відповідність правилу, визначеного в (image-compress.mdc).
11
+ Модуль виконує перевірку репозиторіїв за допомогою публічної функції `check`. Він перевіряє відповідність конфігурації, спираючись на `package.json`. Модуль також керує кешуванням результатів у межах одного прогону. Перевірка включає відповідність політикам, зокрема щодо файлів, що ігноруються, як описано в (image-compress.mdc).
11
12
 
12
13
  ## Поведінка
13
14
 
14
- 1. Зчитування рядків з `.gitignore`
15
- 2. Перевірка наявності кешу `HASH_CACHE_FILENAME` у `.gitignore`
16
- 3. Перевірка видалення застарілого кешу `LEGACY_CACHE_FILENAME`
17
- 4. Перевірка відповідності правилу `image-compress.mdc`
15
+ 1. Перевіряє наявність файлу `package.json` у корені репозиторію. Якщо файл відсутній, повідомляє про порушення (image-compress.mdc).
16
+ 2. Якщо `package.json` знайдено, повідомляє про відповідність політики залежностей.
17
+ 3. Перевіряє, чи не містить файл `.gitignore` запису про кеш `HASH_CACHE_FILENAME`. Якщо запис знайдено, повідомляє про порушення (image-compress.mdc).
18
+ 4. Перевіряє, чи відсутній застарілий кеш `LEGACY_CACHE_FILENAME` у корені репозиторію. Якщо файл знайдено, повідомляє про порушення (image-compress.mdc) та надає інструкції щодо його видалення.
19
+ 5. Якщо `LEGACY_CACHE_FILENAME` відсутній, перевіряє, чи не містить файл `.gitignore` запису про цей застарілий кеш. Якщо запис знайдено, повідомляє про порушення (image-compress.mdc).
20
+ 6. Повертає код виходу, що відображає загальний статус перевірки.
18
21
 
19
22
  ## Публічний API
20
23
 
21
- check — Перевіряє, чи відсутній у `.gitignore` файл `.n-minify-image.tsv` та чи видалено `.minify-image-cache.tsv`. Package-level стискання зображень виконує `n-cursor lint image-compress`, а read-only CI-gate використовує JSON detect-mode `@nitra/minify-image --json`. (image-compress.mdc)
24
+ check — перевіряє, чи файл `.n-minify-image.tsv` не ігнорується у `.gitignore` та чи видалено застарілий `.minify-image-cache.tsv` відповідно до правил `image-compress.mdc`.
22
25
 
23
26
  ## Гарантії поведінки
24
27
 
25
- - Read-only: файл не виконує операцій запису у файлову систему.
26
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
28
+ - Read-only: не виконує операцій запису (ФС/БД).
27
29
  - Кешує результати в межах одного прогону.
28
30
  - Свідомо пропускає шляхи: `.git`.
29
- - Не звертається до мережі.
@@ -1,10 +1,21 @@
1
- /** @see ./docs/lint.md */
2
1
  import { spawnSync } from 'node:child_process'
3
2
 
4
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
3
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
4
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
5
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
5
6
 
6
7
  const JSON_MAX_BUFFER = 20 * 1024 * 1024
7
8
 
9
+ /**
10
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
11
+ * → policy → mdc-refs); `lint()` — lint-поверхня (`@nitra/minify-image`), імпл інлайн тут.
12
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
13
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
14
+ */
15
+ export function run(ctx) {
16
+ return runStandardRule(import.meta.dirname, ctx)
17
+ }
18
+
8
19
  /**
9
20
  * Парсить JSON-звіт `@nitra/minify-image --json`.
10
21
  * @param {string} stdout stdout дочірнього процесу
@@ -15,8 +26,8 @@ function parseMinifyJson(stdout) {
15
26
  }
16
27
 
17
28
  /**
18
- * Read-only detect-mode для `image-compress`: `@nitra/minify-image --json` не стискає файли і не
19
- * пише cache, але повідомляє скільки зображень не відповідають `.n-minify-image.tsv`.
29
+ * Read-only detect-mode: `@nitra/minify-image --json` не стискає файли і не пише cache, але
30
+ * повідомляє скільки зображень не відповідають `.n-minify-image.tsv`.
20
31
  * @param {string} cwd корінь
21
32
  * @returns {number} exit code
22
33
  */
@@ -61,7 +72,7 @@ function runJsonDetect(cwd) {
61
72
  }
62
73
 
63
74
  /**
64
- * Оркестраторний адаптер `n-cursor lint image-compress`.
75
+ * lint-поверхня: `@nitra/minify-image` (readOnly → `--json` детект; fix → `--write`).
65
76
  * @param {string[] | undefined} _files ігнорується; `@nitra/minify-image` сам обходить дерево
66
77
  * @param {string} [cwd] корінь
67
78
  * @param {{ readOnly?: boolean }} [opts] readOnly → `--json`, fix → `--write`
@@ -76,3 +87,8 @@ export function lint(_files, cwd = process.cwd(), opts = {}) {
76
87
  }
77
88
  return Promise.resolve(typeof r.status === 'number' ? r.status : 1)
78
89
  }
90
+
91
+ if (isRunAsCli(import.meta.url)) {
92
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`.
93
+ process.exitCode = await runRuleCli(import.meta.dirname)
94
+ }
@@ -9,3 +9,4 @@ resource: npm/rules/js-bun-db/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.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: npm/rules/js-bun-db/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 90
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку, застосовуючи правила та політики. При виклику публічної функції `run` він завантажує конфігурації, зокрема `meta.json`, застосовує білі списки та підбиває підсумки. Модуль є Read-only, тобто не пише у файлову систему чи базу даних. Під час роботи відбувається кешування даних у межах одного прогону. Результат перевірки визначає код виходу процесу.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування правил, обробку JS-зацікавленостей, застосування політик та збір посилань MDC.
19
+ 3. Якщо код виконується як окрема програма (CLI), ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій (наприклад, `meta.json`), застосування білих списків та підбиття підсумків.
21
+ 5. Результат виконання визначає код виходу процесу.
22
+
23
+ ## Публічний API
24
+
25
+ run — виконує основну логіку правила, включаючи перевірку відповідності вимогам, застосування політик та посилання на метадані.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
30
+ - Кешує результати в межах одного прогону.
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -9,3 +9,4 @@ resource: npm/rules/js-bun-redis/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/js-bun-redis/main.mjs
5
+ docgen:
6
+ crc: 762b6875
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Виконує перевірку, застосовуючи правила, аналізуючи логіку JS-контекстів та перевіряючи політики на основі конфігурацій із meta.json. Збирає посилання MDC. Публічна функція run ініціює повний запуск, що включає завантаження конфігурацій, застосування білих списків та формування зведеного звіту. Операція є Read-only (не пише ФС/БД) та використовує кешування у межах прогону.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликається функція `run` для виконання перевірки.
18
+ 2. Виконання перевірки включає застосування правил, обробку логіки JS-контекстів, перевірку політик та збір посилань MDC.
19
+ 3. Якщо код виконується як автономна програма (CLI), ініціюється повний запуск правила.
20
+ 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та формування зведеного звіту.
21
+
22
+ ## Публічний API
23
+
24
+ run — виконує основну логіку правила: перевіряє відповідність до вимог, застосовує логіку, пов'язану з JS-контекстом та політикою, а також перевіряє посилання на MDC.
25
+
26
+ ## Гарантії поведінки
27
+
28
+ - Read-only: не виконує операцій запису (ФС/БД).
29
+ - Кешує результати в межах одного прогону.
@@ -0,0 +1,20 @@
1
+ import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
+ import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
+
4
+ /**
5
+ * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
+ * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
+ * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
9
+ * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
11
+ */
12
+ export function run(ctx) {
13
+ return runStandardRule(import.meta.dirname, ctx)
14
+ }
15
+
16
+ if (isRunAsCli(import.meta.url)) {
17
+ // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
+ // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
19
+ process.exitCode = await runRuleCli(import.meta.dirname)
20
+ }
@@ -9,3 +9,4 @@ resource: npm/rules/js-lint/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [fix.mjs](fix.md) | JS Module |
12
+ | [main.mjs](main.md) | JS Module |
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: main.mjs
4
+ resource: npm/rules/js-lint/main.mjs
5
+ docgen:
6
+ crc: 4f68b557
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль надає інструменти для аналізу кодової бази. Функція `run` ініціює повну перевірку проєкту. Функція `filterJsFiles` відбирає файли з розширенням JavaScript. Функція `lint` запускає лінтинг для виявлення порушень у коді.
14
+
15
+ ## Поведінка
16
+
17
+ run виконує стандартну перевірку проєкту.
18
+ filterJsFiles відбирає з наданого списку лише файли, що мають розширення, характерне для JavaScript.
19
+ lint запускає лінтинг для вказаних файлів або всього проєкту, залежно від аргументів, і класифікує знайдені порушення.
20
+
21
+ ## Публічний API
22
+
23
+ run — головна точка входу для виконання правил, що включає перевірку логіки (JS-завдання → політика → посилання MDC) та запуск лінтера.
24
+ filterJsFiles — відбирає лише файли, що відповідають формату JavaScript.
25
+ lint — виконує аналіз коду за допомогою oxlint та eslint, з можливістю автоматичного виправлення або лише виявлення проблем.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,268 @@
1
+ /** @see ./docs/tooling.md */
2
+ import { existsSync } from 'node:fs'
3
+ import { copyFile, readFile } from 'node:fs/promises'
4
+ import { join } from 'node:path'
5
+
6
+ import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
7
+
8
+ import { KNIP_CANONICAL_JSON_PATH, OXLINT_CANONICAL_JSON_PATH, verifyOxlintRcAgainstCanonical } from './tooling.mjs'
9
+
10
+ const NON_DIGITS_RE = /\D+/u
11
+
12
+ /**
13
+ * Перевіряє ESLint flat config файл.
14
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
15
+ * @param {(msg: string) => void} failFn callback при помилці
16
+ * @param {string} cwd корінь репозиторію
17
+ */
18
+ async function checkEslintConfig(passFn, failFn, cwd) {
19
+ let eslintPath
20
+ if (existsSync(join(cwd, 'eslint.config.js'))) {
21
+ eslintPath = 'eslint.config.js'
22
+ passFn('eslint.config.js існує')
23
+ } else if (existsSync(join(cwd, 'eslint.config.mjs'))) {
24
+ eslintPath = 'eslint.config.mjs'
25
+ passFn('eslint.config.mjs існує')
26
+ } else {
27
+ failFn('Відсутній eslint.config.js або eslint.config.mjs — flat config з getConfig (js-lint.mdc)')
28
+ return
29
+ }
30
+ const eslintRaw = await readFile(join(cwd, eslintPath), 'utf8')
31
+ const checks = [
32
+ {
33
+ needle: 'getConfig',
34
+ ok: `${eslintPath}: містить getConfig`,
35
+ err: `${eslintPath}: потрібен виклик getConfig (js-lint.mdc)`
36
+ },
37
+ {
38
+ needle: '@nitra/eslint-config',
39
+ ok: `${eslintPath}: імпорт @nitra/eslint-config`,
40
+ err: `${eslintPath}: імпортуй getConfig з @nitra/eslint-config`
41
+ },
42
+ {
43
+ needle: '**/auto-imports.d.ts',
44
+ ok: `${eslintPath}: ignores містить **/auto-imports.d.ts`,
45
+ err: `${eslintPath}: додай у ignores запис **/auto-imports.d.ts (js-lint.mdc)`
46
+ }
47
+ ]
48
+ for (const { needle, ok, err } of checks) {
49
+ if (eslintRaw.includes(needle)) {
50
+ passFn(ok)
51
+ } else {
52
+ failFn(err)
53
+ }
54
+ }
55
+ }
56
+
57
+ // Перевірки `prettier` / `@nitra/prettier-config` у залежностях (text.mdc) і
58
+ // `@nitra/eslint-config ≥ 3.10.0` тепер у Rego: відповідно
59
+ // `npm/policy/text/package_json/` і `npm/policy/js_lint/package_json/`. Тут
60
+ // лишилася лише workspace-ітерація для `type: "module"` і engines, бо js_lint
61
+ // Rego запускається лише на кореневому `package.json`.
62
+
63
+ /**
64
+ * Перевіряє, що package.json має `"type": "module"`.
65
+ * @param {string} label шлях або назва пакета для повідомлень
66
+ * @param {{ type?: string }} pkg parsed package.json
67
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
68
+ * @param {(msg: string) => void} failFn callback при помилці
69
+ */
70
+ function checkPackageJsonTypeModule(label, pkg, passFn, failFn) {
71
+ if (pkg.type === 'module') {
72
+ passFn(`${label}: "type": "module"`)
73
+ } else {
74
+ failFn(`${label}: має містити "type": "module" (js-lint.mdc)`)
75
+ }
76
+ }
77
+
78
+ /**
79
+ * `"type": "module"`, `engines.node >= 24` і `engines.bun >= 1.3` у кожному workspace `package.json`.
80
+ * @param {unknown[]} workspaces поле workspaces з package.json
81
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
82
+ * @param {(msg: string) => void} failFn callback при помилці
83
+ * @param {string} cwd корінь репозиторію
84
+ */
85
+ async function checkWorkspacePackages(workspaces, passFn, failFn, cwd) {
86
+ for (const ws of workspaces) {
87
+ const wsPkgRel = `${ws}/package.json`
88
+ const wsPkgAbs = join(cwd, wsPkgRel)
89
+ if (existsSync(wsPkgAbs)) {
90
+ const wsPkg = JSON.parse(await readFile(wsPkgAbs, 'utf8'))
91
+ checkPackageJsonTypeModule(wsPkgRel, wsPkg, passFn, failFn)
92
+ checkEnginesNode(wsPkgRel, wsPkg, passFn, failFn)
93
+ checkEnginesBun(wsPkgRel, wsPkg, passFn, failFn)
94
+ }
95
+ }
96
+ }
97
+
98
+ /**
99
+ * engines.node >= 24.
100
+ * @param {string} label шлях або назва пакета для повідомлень
101
+ * @param {{ engines?: { node?: string } }} pkg розпарсений package.json
102
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
103
+ * @param {(msg: string) => void} failFn callback при помилці
104
+ */
105
+ function checkEnginesNode(label, pkg, passFn, failFn) {
106
+ const nodeEngine = pkg.engines?.node
107
+ if (nodeEngine) {
108
+ const firstNumeric = String(nodeEngine).split(NON_DIGITS_RE).find(Boolean)
109
+ if (firstNumeric && Number(firstNumeric) >= 24) {
110
+ passFn(`${label}: engines.node "${nodeEngine}"`)
111
+ } else {
112
+ failFn(`${label}: engines.node "${nodeEngine}" — має бути >=24`)
113
+ }
114
+ } else {
115
+ failFn(`${label} не містить engines.node — додай: "engines": { "node": ">=24" }`)
116
+ }
117
+ }
118
+
119
+ /**
120
+ * engines.bun >= 1.3.
121
+ * @param {string} label шлях або назва пакета для повідомлень
122
+ * @param {{ engines?: { bun?: string } }} pkg розпарсений package.json
123
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
124
+ * @param {(msg: string) => void} failFn callback при помилці
125
+ */
126
+ function checkEnginesBun(label, pkg, passFn, failFn) {
127
+ const bunEngine = pkg.engines?.bun
128
+ if (bunEngine) {
129
+ const [major, minor] = String(bunEngine).split(NON_DIGITS_RE).filter(Boolean).map(Number)
130
+ if (Number.isFinite(major) && Number.isFinite(minor) && (major > 1 || (major === 1 && minor >= 3))) {
131
+ passFn(`${label}: engines.bun "${bunEngine}"`)
132
+ } else {
133
+ failFn(`${label}: engines.bun "${bunEngine}" — має бути >=1.3`)
134
+ }
135
+ } else {
136
+ failFn(`${label} не містить engines.bun — додай: "engines": { "bun": ">=1.3" }`)
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Workspace-ітерація: для кожного workspace `package.json` перевіряємо
142
+ * `type: "module"` і `engines.{node,bun}`. Кореневий `package.json` ці поля
143
+ * валідує `npm/policy/js_lint/package_json/`; lint-js скрипт і `@nitra/eslint-config`
144
+ * — теж у Rego.
145
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
146
+ * @param {(msg: string) => void} failFn callback при помилці
147
+ * @param {string} cwd корінь репозиторію
148
+ */
149
+ async function checkPackageJsonJsLint(passFn, failFn, cwd) {
150
+ const pkgPath = join(cwd, 'package.json')
151
+ if (!existsSync(pkgPath)) return
152
+ const pkg = JSON.parse(await readFile(pkgPath, 'utf8'))
153
+ const workspaces = Array.isArray(pkg.workspaces) ? pkg.workspaces : []
154
+ await checkWorkspacePackages(workspaces, passFn, failFn, cwd)
155
+ }
156
+
157
+ /**
158
+ * Перевіряє .oxlintrc.json.
159
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
160
+ * @param {(msg: string) => void} failFn callback при помилці
161
+ * @param {string} cwd корінь репозиторію
162
+ */
163
+ async function checkOxlintRc(passFn, failFn, cwd) {
164
+ const oxPath = join(cwd, '.oxlintrc.json')
165
+ if (!existsSync(oxPath)) {
166
+ failFn('.oxlintrc.json не існує — додай конфіг oxlint (js-lint.mdc)')
167
+ return
168
+ }
169
+ let oxCfg
170
+ try {
171
+ oxCfg = JSON.parse(await readFile(oxPath, 'utf8'))
172
+ } catch {
173
+ failFn('.oxlintrc.json не є валідним JSON')
174
+ return
175
+ }
176
+ passFn('.oxlintrc.json існує')
177
+ let canonical
178
+ try {
179
+ canonical = JSON.parse(await readFile(OXLINT_CANONICAL_JSON_PATH, 'utf8'))
180
+ } catch {
181
+ failFn('внутрішня помилка: не вдалося прочитати канон oxlint з пакета @nitra/cursor')
182
+ return
183
+ }
184
+ const oxV = verifyOxlintRcAgainstCanonical(oxCfg, canonical)
185
+ if (oxV.ok) {
186
+ passFn('.oxlintrc.json збігається з каноном oxlint (@nitra/cursor)')
187
+ } else {
188
+ for (const msg of oxV.failures) {
189
+ failFn(msg)
190
+ }
191
+ }
192
+ }
193
+
194
+ /**
195
+ * FS-existence для `lint-js.yml` + cross-file перевірка, що `lint.yml` (якщо існує)
196
+ * не дублює лінт JS-кроки. Структуру `lint-js.yml` (`actions/checkout@v6`,
197
+ * `persist-credentials: false`, `setup-bun-deps`, `bunx oxlint/eslint/jscpd .`,
198
+ * заборона `--fix` у CI) валідує `npm/policy/js_lint/lint_js_yml/`.
199
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
200
+ * @param {(msg: string) => void} failFn callback при помилці
201
+ * @param {string} cwd корінь репозиторію
202
+ */
203
+ async function checkLintJsWorkflows(passFn, failFn, cwd) {
204
+ if (existsSync(join(cwd, '.github/workflows/lint-js.yml'))) {
205
+ passFn('.github/workflows/lint-js.yml є (структуру перевіряє npx @nitra/cursor fix → js_lint.lint_js_yml)')
206
+ } else {
207
+ failFn('.github/workflows/lint-js.yml не існує — створи його (js-lint.mdc)')
208
+ }
209
+
210
+ const lintYmlPath = join(cwd, '.github/workflows/lint.yml')
211
+ if (existsSync(lintYmlPath)) {
212
+ const lintYml = await readFile(lintYmlPath, 'utf8')
213
+ if (lintYml.includes('bunx oxlint') && lintYml.includes('bunx eslint') && lintYml.includes('jscpd')) {
214
+ failFn('.github/workflows/lint.yml дублює кроки lint-js.yml — залиш один workflow на лінт JS (js-lint.mdc)')
215
+ } else {
216
+ passFn('.github/workflows/lint.yml не дублює oxlint/eslint/jscpd з lint-js.yml')
217
+ }
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Перевіряє наявність `knip.json` у корені проєкту. Якщо файл відсутній —
223
+ * копіює канонічний `knip-canonical.json` з пакета `@nitra/cursor` як стартовий
224
+ * baseline; зміст подальших модифікацій локально не валідується (`entry` /
225
+ * `project` / `ignore` / `ignoreDependencies` / `ignoreBinaries` дозволені
226
+ * будь-які; це side effect — описано у js-lint.mdc).
227
+ * @param {(msg: string) => void} passFn callback при успішній перевірці
228
+ * @param {(msg: string) => void} failFn callback при помилці
229
+ * @param {string} cwd корінь репозиторію
230
+ */
231
+ async function checkKnipConfig(passFn, failFn, cwd) {
232
+ const knipPath = join(cwd, 'knip.json')
233
+ if (existsSync(knipPath)) {
234
+ passFn('knip.json існує')
235
+ return
236
+ }
237
+ if (!existsSync(KNIP_CANONICAL_JSON_PATH)) {
238
+ failFn(
239
+ `knip.json відсутній, і канонічний шаблон у пакеті не знайдено (${KNIP_CANONICAL_JSON_PATH}) — ` +
240
+ 'перевстанови @nitra/cursor'
241
+ )
242
+ return
243
+ }
244
+ await copyFile(KNIP_CANONICAL_JSON_PATH, knipPath)
245
+ passFn('knip.json створено з канонічного npm/rules/js-lint/js/data/tooling/knip-canonical.json (js-lint.mdc)')
246
+ }
247
+
248
+ /**
249
+ * Перевіряє відповідність проєкту правилам js-lint.mdc
250
+ * @param {string} [cwd] корінь репозиторію
251
+ * @returns {Promise<number>} 0 — все OK, 1 — є проблеми
252
+ */
253
+ export async function check(cwd = process.cwd()) {
254
+ const reporter = createCheckReporter()
255
+ const { pass, fail } = reporter
256
+
257
+ await checkEslintConfig(pass, fail, cwd)
258
+ await checkPackageJsonJsLint(pass, fail, cwd)
259
+ await checkOxlintRc(pass, fail, cwd)
260
+ await checkLintJsWorkflows(pass, fail, cwd)
261
+ await checkKnipConfig(pass, fail, cwd)
262
+
263
+ for (const dup of ['.eslintrc', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yml']) {
264
+ if (existsSync(join(cwd, dup))) fail(`Знайдено застарілий конфіг ESLint: ${dup} — видали, використовуй flat config`)
265
+ }
266
+
267
+ return reporter.getExitCode()
268
+ }
@@ -0,0 +1,39 @@
1
+ ---
2
+ type: JS Module
3
+ title: check.mjs
4
+ resource: npm/rules/js-lint/js/check.mjs
5
+ docgen:
6
+ crc: f61768f2
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку конфігураційних файлів проєкту, забезпечуючи їхню відповідність встановленим стандартам. Він читає та аналізує конфігураційні файли, включаючи `package.json`, `.oxlintrc.json`, `knip.json`, `knip-canonical.json` та `.eslintrc.json`. Перевірка ґрунтується на логіці, визначеній у (js-lint.mdc) та (text.mdc). Функціонал реалізований у режимі лише читання, що означає відсутність змін у файловій системі чи базах даних. При виявленні проблем, система перехоплює помилки, працюючи у режимі fail-safe. Свідомо ігноруються шляхи `.github` та `.git`.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Викликає `check` для початку перевірки.
18
+ 2. Перевіряє наявність та відповідність конфігурації ESLint.
19
+ 3. Перевіряє конфігурацію `package.json` для всіх робочих просторів:
20
+ а. Перевіряє, чи має `package.json` `"type": "module"`.
21
+ б. Перевіряє, чи містить `package.json` `engines.node` з версією не менше 24.
22
+ в. Перевіряє, чи містить `package.json` `engines.bun` з версією не менше 1.3.
23
+ 4. Перевіряє конфігураційний файл `.oxlintrc.json` на відповідність канонічному шаблону.
24
+ 5. Перевіряє файли робочих процесів у `.github/workflows/`:
25
+ а. Перевіряє наявність `lint-js.yml`.
26
+ б. Перевіряє, чи не дублює `lint.yml` кроки лінтінгу JS.
27
+ 6. Перевіряє наявність файлу `knip.json` у корені проєкту. Якщо він відсутній, копіює канонічний шаблон.
28
+ 7. Перевіряє наявність застарілих конфігурацій ESLint (`.eslintrc`, `.eslintrc.js`, `.eslintrc.json`, `.eslintrc.yml`) та повідомляє про їхнє існування.
29
+ 8. Повертає код виходу, що відображає загальний статус перевірки.
30
+
31
+ ## Публічний API
32
+
33
+ check — забезпечує відповідність проєкту вимогам, описаним у js-lint.mdc.
34
+
35
+ ## Гарантії поведінки
36
+
37
+ - Read-only: не виконує операцій запису (ФС/БД).
38
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
39
+ - Свідомо пропускає шляхи: `.github`, `.git`.
@@ -8,7 +8,7 @@ resource: npm/rules/js-lint/js/
8
8
 
9
9
  | Файл | Тип |
10
10
  |---|---|
11
+ | [check.mjs](check.md) | JS Module |
11
12
  | [lint-findings.mjs](lint-findings.md) | JS Module |
12
- | [lint.mjs](lint.md) | JS Module |
13
13
  | [tooling.mjs](tooling.md) | JS Module |
14
14
  | [utils_imports.mjs](utils_imports.md) | JS Module |
@@ -3,47 +3,27 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/js-lint/js/tooling.mjs
5
5
  docgen:
6
- crc: e847996e
7
- score: 80
6
+ crc: 7ead48ee
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 95
8
9
  ---
9
10
 
10
- OXLINT_CANONICAL_JSON_PATH
11
- Повертає шлях до канонічного JSON-файлу oxlint у пакету
11
+ ## Огляд
12
12
 
13
- KNIP_CANONICAL_JSON_PATH
14
- Повертає шлях до канонічного JSON-файлу knip у пакету
15
-
16
- verifyOxlintRcAgainstCanonical
17
- Звіряє блок rules з `.oxlintrc.json` проти канону пакета @nitra/cursor
18
-
19
- check
20
- Перевіряє конфігурацію проєкту відповідно до правил js-lint.mdc
13
+ Визначає шляхи до канонічних конфігураційних файлів для oxlint та knip за допомогою OXLINT_CANONICAL_JSON_PATH та KNIP_CANONICAL_JSON_PATH. Дозволяє перевіряти відповідність конфігураційного файлу .oxlintrc.json до канонічного файлу oxlint-canonical.json за допомогою verifyOxlintRcAgainstCanonical.
21
14
 
22
15
  ## Поведінка
23
16
 
24
- OXLINT_CANONICAL_JSON_PATH
25
- Шлях до канонічного oxlint JSON у цьому пакеті
26
-
27
- KNIP_CANONICAL_JSON_PATH
28
- Шлях до канонічного knip JSON у цьому пакеті
29
-
30
- verifyOxlintRcAgainstCanonical
31
- Звіряє блок rules з `.oxlintrc.json` проти канону пакета @nitra/cursor
32
-
33
- check
34
- Перевіряє конфігурацію проєкту відповідно до правил js-lint.mdc
17
+ OXLINT_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу oxlint у цьому пакеті.
18
+ KNIP_CANONICAL_JSON_PATH — Вказує шлях до канонічного JSON-файлу knip у цьому пакеті.
19
+ verifyOxlintRcAgainstCanonical — Перевіряє конфігураційний файл `.oxlintrc.json` на відповідність канонічному файлу oxlint-canonical.json, виявляючи відхилення у правилах та інших полях.
35
20
 
36
21
  ## Публічний API
37
22
 
38
- OXLINT_CANONICAL_JSON_PATH — Шлях до канонічного oxlint JSON у пакету (для перевірки та тестів)
39
- KNIP_CANONICAL_JSON_PATH — Шлях до канонічного knip JSON у пакету (копіюється у корінь проєкту-споживача, якщо відсутній)
40
- verifyOxlintRcAgainstCanonical — Порівнює `.oxlintrc.json` з каноном пакета `@nitra/cursor` (включає всі правила з канону та інші поля з `oxlint-canonical.json`). Дозволено додати лише ключі в `rules`; інші поля мають збігатися з каноном.
41
- check — Перевіряє відповідність проєкту правилам js-lint.mdc
23
+ OXLINT_CANONICAL_JSON_PATH — Вказує розташування стандартного конфігураційного файлу oxlint для валідації.
24
+ KNIP_CANONICAL_JSON_PATH — Вказує розташування стандартного конфігураційного файлу knip, який копіюється у кореневий каталог проєкту, якщо його там немає.
25
+ verifyOxlintRcAgainstCanonical — Порівнює конфігураційний файл `.oxlintrc.json` з канонічним файлом пакета, вимагаючи збігу всіх полів, крім додаткових ключів у секції `rules`.
42
26
 
43
27
  ## Гарантії поведінки
44
28
 
45
- - Read-only: файл не виконує операцій запису у файлову систему.
46
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
47
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
48
- - Свідомо пропускає шляхи: `.github`, `.git`.
49
- - Не звертається до мережі.
29
+ - Read-only: не виконує операцій запису (ФС/БД).