@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
@@ -1,200 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/docker/lint/lint.mjs
5
- docgen:
6
- crc: 98a98d10
7
- ---
8
-
9
- Модуль `npm/rules/docker/lint/lint.mjs` реалізує підкоманду `lint-docker` інструмента `n-cursor`. Її задача — знайти у дереві репозиторію канонічні Dockerfile-и та пропустити їх через `hadolint`, фіксуючи результат у форматі звіту `check-reporter` і виставляючи числовий код виходу.
10
-
11
- Особливості, що визначають поведінку:
12
-
13
- - Перевіряються **лише** файли з іменем, що рівне `Dockerfile` (регістр не важливий) та файли, ім’я яких закінчується на суфікс `.dockerfile` (наприклад, `app.Dockerfile`, `worker.dockerfile`). Файли виду `Dockerfile.dev`, `Containerfile` й інші варіанти, які бере `check-docker`, тут навмисно **не** обробляються.
14
- - Обхід дерева виконується тим самим `walkDir`, що й у `check-docker`, з тими самими пропусками каталогів (на основі `.cursorignore`/конфігу Cursor).
15
- - Виклик `hadolint` йде через `lintDockerfileWithHadolint` із `../lib/docker-hadolint.mjs` — інструмент шукається у `PATH` або запускається в Docker (`docker run`).
16
- - Серіалізація важкої CLI-команди (тільки один паралельний прогін на репозиторій і дедуплікація за станом git-дерева) виконана через `runStandardLint` — це канонічний патерн для `lint-*` команд згідно з `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд». Прямий `withLock` тут не використовується.
17
- - Запуск файла напряму через Node (`node lint.mjs`) працює як CLI: модуль ставить `process.exitCode` у код, повернений `runLintDocker`.
18
-
19
- ## Експорти / API
20
-
21
- | Експорт | Вид | Призначення |
22
- | ------------------------- | ----------------------- | ---------------------------------------------------------------------------------------------- |
23
- | `isLintDockerfileName` | `function` | Перевіряє basename файла: чи входить він до набору `lint-docker`. |
24
- | `findLintDockerfilePaths` | `async function` | Збирає відсортований список абсолютних шляхів придатних для `lint-docker` файлів. |
25
- | `runLintDocker` | `() => Promise<number>` | Публічна CLI-форма команди `lint-docker`: серіалізований прогон з кешуванням за станом дерева. |
26
-
27
- Внутрішня (не експортована) функція:
28
-
29
- - `runLintDockerSteps()` — самі кроки lint-у без обгортки локу й дедупу. Викликається `runStandardLint`.
30
-
31
- CLI-режим (`if (isRunAsCli(import.meta.url))`) при прямому запуску файла ставить `process.exitCode = await runLintDocker()`.
32
-
33
- ## Функції
34
-
35
- ### `isLintDockerfileName(name)`
36
-
37
- ```js
38
- export function isLintDockerfileName(name): boolean
39
- ```
40
-
41
- - **Параметри:**
42
- - `name: string` — basename шляху (тобто лише ім’я файла, без каталогів).
43
- - **Повертає:** `boolean` — `true`, якщо файл підходить під набір `lint-docker`, інакше `false`.
44
- - **Логіка:**
45
- 1. Зводить ім’я до нижнього регістру (`n`).
46
- 2. Якщо `n === 'dockerfile'` — повертає `true`.
47
- 3. Інакше повертає `true`, лише якщо `n` закінчується на `.dockerfile` **і** довжина `n` строго більша за довжину суфікса `.dockerfile`. Завдяки цій додатковій умові саме `.dockerfile` (без префікса) — не валідний кейс.
48
- - **Side effects:** немає.
49
- - **Приклади:**
50
- - `isLintDockerfileName('Dockerfile')` → `true`
51
- - `isLintDockerfileName('dockerfile')` → `true`
52
- - `isLintDockerfileName('app.Dockerfile')` → `true`
53
- - `isLintDockerfileName('worker.dockerfile')` → `true`
54
- - `isLintDockerfileName('.dockerfile')` → `false`
55
- - `isLintDockerfileName('Dockerfile.dev')` → `false`
56
- - `isLintDockerfileName('Containerfile')` → `false`
57
-
58
- ### `findLintDockerfilePaths(root, ignorePaths = [])`
59
-
60
- ```js
61
- export async function findLintDockerfilePaths(root, ignorePaths = []): Promise<string[]>
62
- ```
63
-
64
- - **Параметри:**
65
- - `root: string` — корінь обходу (зазвичай корінь репозиторію).
66
- - `ignorePaths?: string[]` — абсолютні шляхи каталогів, повністю виключених з обходу (за замовчуванням пустий масив).
67
- - **Повертає:** `Promise<string[]>` — масив абсолютних шляхів придатних файлів, відсортований за `String.prototype.localeCompare` через `Array.prototype.toSorted` (не мутує проміжний масив).
68
- - **Логіка:**
69
- 1. Створює локальний акумулятор `out`.
70
- 2. Викликає `walkDir(root, visit, ignorePaths)`, де `visit(p)` додає `p` до `out`, якщо `isLintDockerfileName(basename(p))` істинне.
71
- 3. Повертає `out.toSorted((a, b) => a.localeCompare(b))`.
72
- - **Side effects:** виконує асинхронний обхід файлової системи через `walkDir`. Не пише нічого на диск і нічого не виводить у stdout/stderr.
73
-
74
- ### `runLintDockerSteps()` _(internal)_
75
-
76
- ```js
77
- async function runLintDockerSteps(): Promise<number>
78
- ```
79
-
80
- - **Параметри:** немає.
81
- - **Повертає:** `Promise<number>` — `reporter.getExitCode()`: `0`, якщо помилок не зафіксовано, `1`, якщо хоча б один `fail`.
82
- - **Логіка:**
83
- 1. Створює репортер: `const reporter = createCheckReporter(); const { pass, fail } = reporter`.
84
- 2. Бере `root = process.cwd()`.
85
- 3. Завантажує `ignorePaths` через `await loadCursorIgnorePaths(root)`.
86
- 4. Шукає кандидатів: `files = await findLintDockerfilePaths(root, ignorePaths)`.
87
- 5. Якщо `files.length === 0` — викликає `pass('lint-docker: немає Dockerfile / *.Dockerfile — hadolint пропущено')` і повертає `reporter.getExitCode()`.
88
- 6. Інакше повідомляє `pass(\`lint-docker: файлів для hadolint: ${files.length}\`)`.
89
- 7. Для кожного абсолютного шляху `abs`:
90
- - Обчислює відносний шлях `rel = posixRel(root, abs) || basename(abs)` — якщо `posixRel` повернула порожній рядок, береться лише basename.
91
- - Викликає `const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)` (синхронний виклик, як видно з відсутності `await`).
92
- - Об’єднує `stdout + stderr`, тримує (`trim()`) у `tail`.
93
- - Якщо `ok` — `pass(\`${rel} (${via})\`)`.
94
- - Якщо ні — формує `detail = tail ? \`:\n${tail}\` : ''` і викликає `fail(\`${rel} (${via})${detail}\`)`.
95
- 8. Повертає `reporter.getExitCode()`.
96
- - **Side effects:**
97
- - Читає поточну робочу директорію (`process.cwd()`).
98
- - Читає файлову систему репозиторію через `walkDir`/`loadCursorIgnorePaths`.
99
- - Запускає зовнішній процес `hadolint` (через `PATH` або через `docker run`) для кожного знайденого Dockerfile.
100
- - Пише повідомлення у консоль/звіт через `pass`/`fail` репортера.
101
-
102
- ### `runLintDocker`
103
-
104
- ```js
105
- export const runLintDocker = (): Promise<number> =>
106
- runStandardLint(import.meta.dirname, runLintDockerSteps)
107
- ```
108
-
109
- - **Параметри:** немає.
110
- - **Повертає:** `Promise<number>` — фінальний код виходу команди.
111
- - **Логіка:** делегує виконання у `runStandardLint`, передаючи:
112
- - `import.meta.dirname` — каталог цього модуля (`npm/rules/docker/lint`); `runStandardLint` використовує його як ідентифікатор/корінь для серіалізації та для дедуплікації запусків за станом git-дерева;
113
- - `runLintDockerSteps` — асинхронну функцію з фактичними кроками lint-у.
114
- - **Side effects:** усі побічні ефекти `runStandardLint` (взяття локу `lint-docker`, перевірка попереднього стану git, можливе пропускання запуску при ідентичному стані тощо) + усі ефекти `runLintDockerSteps`.
115
-
116
- ### CLI-ентрі
117
-
118
- ```js
119
- if (isRunAsCli(import.meta.url)) {
120
- process.exitCode = await runLintDocker()
121
- }
122
- ```
123
-
124
- - **Поведінка:** при прямому запуску модуля як Node-скрипта (`node npm/rules/docker/lint/lint.mjs` або у вигляді ESM bin) встановлює `process.exitCode` у значення, повернене `runLintDocker()`. Імпорт як модуля з іншого файла не активує цю гілку.
125
- - **Side effects:** мутує `process.exitCode`.
126
-
127
- ## Залежності
128
-
129
- ### Зовнішні (Node API)
130
-
131
- - `node:path` — використовується лише `basename` для виділення імені файла зі шляху.
132
-
133
- ### Внутрішні модулі репозиторію
134
-
135
- | Імпорт | Що з нього береться | Роль у цьому модулі |
136
- | --------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------- |
137
- | `../../../scripts/cli-entry.mjs` | `isRunAsCli` | Визначення, чи модуль запущено як CLI напряму. |
138
- | `../lib/docker-hadolint.mjs` | `lintDockerfileWithHadolint`, `posixRel` | Власне виклик `hadolint` (через PATH або `docker run`) і обчислення POSIX-відносного шляху. |
139
- | `../../../scripts/lib/check-reporter.mjs` | `createCheckReporter` | Створення репортера з методами `pass`/`fail` і фінальним `getExitCode`. |
140
- | `../../../scripts/lib/load-cursor-config.mjs` | `loadCursorIgnorePaths` | Завантаження списку каталогів, які потрібно ігнорувати під час обходу. |
141
- | `../../../scripts/utils/walkDir.mjs` | `walkDir` | Асинхронний обхід дерева файлів з підтримкою списку ігнорувань. |
142
- | `../../../scripts/lib/run-standard-lint.mjs` | `runStandardLint` | Канонічна обгортка `lint-*`-команд: лок, дедуп за станом git-дерева, уніфікований запуск. |
143
-
144
- ### Зовнішні CLI/інструменти, що викликаються опосередковано
145
-
146
- - `hadolint` — або з `PATH`, або через `docker run` (визначається в `lintDockerfileWithHadolint`).
147
- - Опосередковано — `git` (для обчислення стану дерева всередині `runStandardLint`), `docker` (якщо `hadolint` запускається в контейнері).
148
-
149
- ## Потік виконання / Використання
150
-
151
- ### Послідовність дій при `n-cursor lint docker`
152
-
153
- 1. `bin/n-cursor.js` диспатчить правило `docker` на `npm/rules/docker/js/lint.mjs`, яке використовує `runLintDocker` із цього модуля.
154
- 2. `runLintDocker` → `runStandardLint(import.meta.dirname, runLintDockerSteps)`:
155
- - бере серіалізаційний лок на ім’я `lint-docker`;
156
- - перевіряє стан git-дерева; якщо стан збігається з попереднім успішним прогоном — крок може бути пропущено (дедуп);
157
- - інакше викликає `runLintDockerSteps`.
158
- 3. `runLintDockerSteps`:
159
- - читає `cwd`;
160
- - завантажує `ignorePaths`;
161
- - обходить дерево і збирає Dockerfile-кандидатів (тільки `Dockerfile` і `*.Dockerfile`/`*.dockerfile`);
162
- - якщо нічого не знайдено — фіксує `pass` про пропуск і виходить;
163
- - інакше повідомляє кількість файлів і по кожному викликає `lintDockerfileWithHadolint`;
164
- - кожен результат маркується як `pass` або `fail` (з прикладеним хвостом `stdout`+`stderr`).
165
- 4. Підсумковий `reporter.getExitCode()` повертається у `runStandardLint`, а той — у `runLintDocker`.
166
- 5. При прямому запуску файла Node — код виходу пишеться у `process.exitCode`.
167
-
168
- ### Як це використовується ззовні
169
-
170
- - **CLI:** `n-cursor lint docker` — основний сценарій.
171
- - **Програмно з інших скриптів:**
172
-
173
- ```js
174
- import { runLintDocker } from 'npm/rules/docker/lint/lint.mjs'
175
-
176
- const code = await runLintDocker() // 0 — OK, 1 — є зауваження/помилки
177
- ```
178
-
179
- - **Тести/допоміжний код:**
180
-
181
- ```js
182
- import { isLintDockerfileName, findLintDockerfilePaths } from 'npm/rules/docker/lint/lint.mjs'
183
-
184
- isLintDockerfileName('Dockerfile') // true
185
- isLintDockerfileName('app.Dockerfile') // true
186
- isLintDockerfileName('Dockerfile.dev') // false
187
-
188
- const files = await findLintDockerfilePaths(process.cwd(), [])
189
- ```
190
-
191
- ### Контракт коду виходу
192
-
193
- - `0` — або не знайдено Dockerfile-ів, або всі знайдені пройшли `hadolint`.
194
- - `1` — хоча б один файл не пройшов `hadolint` (або зафіксована інша помилка через `fail`).
195
-
196
- ### Відмінності від `check-docker`
197
-
198
- - `check-docker` працює з ширшим набором імен (зокрема `Dockerfile.*`, `Containerfile` тощо).
199
- - `lint-docker` свідомо звужений до канонічного `Dockerfile` та суфікса `.dockerfile`, що відповідає правилу `docker.mdc` для самого hadolint-кроку.
200
- - Серіалізація `lint-docker` — через `runStandardLint`, а не через прямий `withLock`, як того вимагає `scripts.mdc`.
@@ -1,95 +0,0 @@
1
- /**
2
- * run-docker (скрипт lint-docker): hadolint лише для файлів з іменем Dockerfile та суфіксом .dockerfile (див. docker.mdc).
3
- *
4
- * Обхід дерева як у check-docker (walkDir, ті самі пропуски каталогів). На відміну від
5
- * check docker, не обробляються Dockerfile.*, Containerfile тощо — лише канонічне ім’я
6
- * Dockerfile та варіанти виду app.Dockerfile (регістр суфікса не важливий).
7
- *
8
- * Виклик hadolint — через ../js/lint/docker-hadolint.mjs (PATH або docker run).
9
- *
10
- * Канон патерну `lint-*` (серіалізація через `runStandardLint`, без прямого `withLock`) —
11
- * `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд».
12
- */
13
- import { basename } from 'node:path'
14
-
15
- import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
16
- import { lintDockerfileWithHadolint, posixRel } from '../lib/docker-hadolint.mjs'
17
- import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
18
- import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
19
- import { walkDir } from '../../../scripts/utils/walkDir.mjs'
20
- import { runStandardLint } from '../../../scripts/lib/run-standard-lint.mjs'
21
-
22
- /**
23
- * Чи входить файл до набору lint-docker: Dockerfile або *.Dockerfile (*.dockerfile).
24
- * @param {string} name basename шляху
25
- * @returns {boolean} true, якщо ім’я підходить під lint-docker
26
- */
27
- export function isLintDockerfileName(name) {
28
- const n = name.toLowerCase()
29
- if (n === 'dockerfile') return true
30
- return n.endsWith('.dockerfile') && n.length > '.dockerfile'.length
31
- }
32
-
33
- /**
34
- * Збирає абсолютні шляхи для lint-docker.
35
- * @param {string} root корінь репозиторію
36
- * @param {string[]} [ignorePaths] абсолютні шляхи каталогів, повністю виключених з обходу
37
- * @returns {Promise<string[]>} відсортовані абсолютні шляхи
38
- */
39
- export async function findLintDockerfilePaths(root, ignorePaths = []) {
40
- /** @type {string[]} */
41
- const out = []
42
- await walkDir(
43
- root,
44
- p => {
45
- if (isLintDockerfileName(basename(p))) out.push(p)
46
- },
47
- ignorePaths
48
- )
49
- return out.toSorted((a, b) => a.localeCompare(b))
50
- }
51
-
52
- /**
53
- * Внутрішні кроки `lint-docker` без локу: hadolint по Dockerfile та *.Dockerfile.
54
- * @returns {Promise<number>} 0 — OK, 1 — зауваження або помилка
55
- */
56
- async function runLintDockerSteps() {
57
- const reporter = createCheckReporter()
58
- const { pass, fail } = reporter
59
-
60
- const root = process.cwd()
61
- const ignorePaths = await loadCursorIgnorePaths(root)
62
- const files = await findLintDockerfilePaths(root, ignorePaths)
63
-
64
- if (files.length === 0) {
65
- pass('lint-docker: немає Dockerfile / *.Dockerfile — hadolint пропущено')
66
- return reporter.getExitCode()
67
- }
68
-
69
- pass(`lint-docker: файлів для hadolint: ${files.length}`)
70
-
71
- for (const abs of files) {
72
- const rel = posixRel(root, abs) || basename(abs)
73
- const { ok, stdout, stderr, via } = lintDockerfileWithHadolint(root, abs)
74
- const tail = (stdout + stderr).trim()
75
- if (ok) {
76
- pass(`${rel} (${via})`)
77
- } else {
78
- const detail = tail ? `:\n${tail}` : ''
79
- fail(`${rel} (${via})${detail}`)
80
- }
81
- }
82
-
83
- return reporter.getExitCode()
84
- }
85
-
86
- /**
87
- * Публічна CLI-форма: серіалізує через `withLock('lint-docker')` + дедуп за станом git-дерева.
88
- * Експортовано як `runLintDocker` — використовується з `bin/n-cursor.js` як підкоманда `lint-docker`.
89
- * @returns {Promise<number>} код виходу
90
- */
91
- export const runLintDocker = () => runStandardLint(import.meta.dirname, runLintDockerSteps)
92
-
93
- if (isRunAsCli(import.meta.url)) {
94
- process.exitCode = await runLintDocker()
95
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
package/rules/ga/fix.mjs DELETED
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,20 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/ga/js/lint.mjs
5
- docgen:
6
- crc: 428bf482
7
- score: 100
8
- ---
9
-
10
- Делегує застосування правил зовнішньому інструменту командного рядка. Параметр `files` ігнорується, оскільки режим перевірки на рівні окремих файлів відсутній. Публічна функція `lint` повертає код виходу інструменту, який визначає успішність або невдачу перевірки.
11
-
12
- ## Поведінка
13
-
14
- 1. Викликає зовнішній інструмент для перевірки коду.
15
- 2. Повертає код виходу цього інструменту.
16
-
17
- ## Гарантії поведінки
18
-
19
- - Read-only: файл не виконує операцій запису у файлову систему.
20
- - Не звертається до мережі.
@@ -1,12 +0,0 @@
1
- /**
2
- * Ci-крок ga: делегує у наявний CLI правила (per-file режиму немає — `files` ігнорується).
3
- */
4
- import { runLintGaCli } from '../lint/lint.mjs'
5
-
6
- /**
7
- * @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
8
- * @returns {Promise<number>} exit code
9
- */
10
- export function lint(_files) {
11
- return runLintGaCli()
12
- }
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga/lint
4
- resource: npm/rules/ga/lint/
5
- ---
6
-
7
- # npm/rules/ga/lint
8
-
9
- | Файл | Тип |
10
- |---|---|
11
- | [lint.mjs](lint.md) | JS Module |
@@ -1,31 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/ga/lint/lint.mjs
5
- docgen:
6
- crc: c391782d
7
- ---
8
-
9
- Файл надає CLI-обгортку для інструменту `lint-ga`, який автоматично встановлює необхідні інструменти, такі як `shellcheck` та `conftest`, для перевірки коду. Він послідовно виконує перевірку коду за допомогою Rego та JavaScript, забезпечуючи узгодженість з правилами `ga.mdc`. Цей файл служить централізованим джерелом для виконання та налаштування процесу linting, що спрощує інтеграцію в CI/CD.
10
-
11
- ## Поведінка
12
-
13
- 1. **Підготовка середовища:** Перевіряє наявність необхідних інструментів: `shellcheck` та `conftest`. Якщо їх немає, автоматично встановлює їх, щоб забезпечити коректну роботу.
14
- 2. **Перевірка залежностей:** Перевіряє наявність `uv`. Якщо `uv` відсутній, надає інструкції щодо його встановлення, щоб забезпечити виконання наступного етапу.
15
- 3. **Запуск попередньої перевірки:** Виконує попередню перевірку за допомогою `github-actionlint`, що дозволяє виявити проблеми на ранніх етапах.
16
- 4. **Виконання аналізу коду:** Запускає `uvx zizmor` для поглибленого аналізу коду, включаючи перевірку на відповідність стандартам та виявлення потенційних проблем.
17
- 5. **Перевірка Rego-полісів:** Запускає Rego-полісі з `npm/policy/ga/` для забезпечення відповідності коду політикам.
18
- 6. **Перевірка правил:** Виконує перевірку правил `ga.mdc` як для JS-коду, так і для Rego-полісів, забезпечуючи загальну відповідність стандартам.
19
- 7. **Звіт про результати:** Формує звіт про результати перевірки, що включає інформацію про виявлені проблеми та їх серйозність.
20
- 8. **Повернення статусу:** Повертає код завершення, що вказує на успішне виконання або наявність проблем, які потребують уваги.
21
-
22
- ## Гарантії поведінки
23
-
24
- - `ensureTool` встановлює `shellcheck` та `conftest` згідно з обраним методом встановлення (brew, scoop, GitHub Release).
25
- - Якщо `uv` не встановлено, `uvx zizmor` завершується з помилкою.
26
- - `bunx github-actionlint` пропускає shell-перевірки в `run:` блоках, якщо `shellcheck` не вказаний у PATH.
27
- - `runLintGaCli` повертає `false` або `null` при помилках, не викликаючи виняток.
28
- - Не використовується кешування.
29
- - `uvx zizmor` вимагає наявності `uv`.
30
- - Логіка встановлення та запуску перевірок централізована у `rules/ga/fix.mjs`.
31
- - `runLintGaCli` використовується як підкоманда `lint-ga`.
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,24 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/image-compress/js/lint.mjs
5
- ---
6
-
7
- Адаптер підключає `@nitra/minify-image` до єдиної точки входу `n-cursor lint image-compress`.
8
-
9
- ## Поведінка
10
-
11
- 1. У fix-режимі запускає `npx @nitra/minify-image --src=. --write`.
12
- 2. У read-only режимі запускає `npx @nitra/minify-image --src=. --json`.
13
- 3. Парсить JSON-звіт і падає, якщо `summary.needsCompression > 0`.
14
- 4. Повертає exit code дочірнього процесу або reporter exit code.
15
-
16
- ## Публічний API
17
-
18
- `lint` — оркестраторний entrypoint для правила `image-compress`.
19
-
20
- ## Гарантії поведінки
21
-
22
- - Read-only режим не стискає файли і не пише cache, покладаючись на `--json` detect-mode у `@nitra/minify-image`.
23
- - Fix-режим делегує запис тільки `@nitra/minify-image --write`.
24
- - За помилки запуску або невалідного JSON повертає ненульовий exit code.
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,18 +0,0 @@
1
- import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
- import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
-
4
- /**
5
- * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
6
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
7
- * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
8
- * @returns {Promise<number>} 0 — OK, 1 — порушення
9
- */
10
- export function run(ctx) {
11
- return runStandardRule(import.meta.dirname, ctx)
12
- }
13
-
14
- if (isRunAsCli(import.meta.url)) {
15
- // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
- // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- process.exitCode = await runRuleCli(import.meta.dirname)
18
- }
@@ -1,32 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: lint.mjs
4
- resource: npm/rules/js-lint/js/lint.mjs
5
- docgen:
6
- crc: 1f38613e
7
- score: 100
8
- ---
9
-
10
- filterJsFiles
11
- Перевіряє шляхи та повертає лише ті, що відповідають розширенням js-подібних файлів.
12
-
13
- lint
14
- Запускає інструмент для перевірки лінтування, працюючи з вибраними файлами або з усім проєктом.
15
-
16
- ## Поведінка
17
-
18
- filterJsFiles
19
- Фільтрує список шляхів, повертаючи лише ті, що відповідають розширенням js-подібних файлів.
20
-
21
- lint
22
- Запускає інструмент для перевірки лінтування. Може працювати з вибраними файлами або з усім проєктом.
23
-
24
- ## Публічний API
25
-
26
- filterJsFiles — відбирає лише файли з розширенням .js.
27
- lint — запускає oxlint та eslint з можливістю автоматичного виправлення помилок.
28
-
29
- ## Гарантії поведінки
30
-
31
- - Read-only: файл не виконує операцій запису у файлову систему.
32
- - Не звертається до мережі.