@nitra/cursor 12.8.9 → 12.10.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 (274) hide show
  1. package/.claude-template/settings.template.json +1 -23
  2. package/CHANGELOG.md +14 -1
  3. package/bin/n-cursor.js +21 -48
  4. package/docs/stryker.config.md +0 -2
  5. package/lib/docs/llm.md +16 -21
  6. package/lib/docs/omlx.md +20 -25
  7. package/lib/llm.mjs +25 -7
  8. package/lib/omlx.mjs +10 -3
  9. package/package.json +5 -5
  10. package/rules/abie/docs/index.md +0 -1
  11. package/rules/abie/docs/main.md +0 -2
  12. package/rules/abie/lib/docs/http-route.md +9 -12
  13. package/rules/abie/lib/http-route.mjs +3 -0
  14. package/rules/abie/main.mdc +0 -22
  15. package/rules/abie/policy/health_check_policy/health_check_policy.mdc +3 -1
  16. package/rules/abie/policy/health_check_policy/health_check_policy.rego +27 -0
  17. package/rules/adr/docs/index.md +0 -1
  18. package/rules/adr/docs/main.md +0 -2
  19. package/rules/adr/js/madr_format.mdc +13 -1
  20. package/rules/adr/main.mdc +0 -9
  21. package/rules/bun/docs/index.md +0 -1
  22. package/rules/bun/docs/main.md +0 -2
  23. package/rules/bun/main.mdc +1 -15
  24. package/rules/bun/policy/package_json/package_json.rego +12 -0
  25. package/rules/capacitor/docs/index.md +0 -1
  26. package/rules/capacitor/docs/main.md +0 -2
  27. package/rules/capacitor/main.mdc +0 -6
  28. package/rules/changelog/docs/index.md +0 -1
  29. package/rules/changelog/docs/main.md +0 -2
  30. package/rules/changelog/js/agent-workflow.mdc +1 -1
  31. package/rules/changelog/js/consistency.mjs +3 -3
  32. package/rules/changelog/js/docs/consistency.md +18 -23
  33. package/rules/changelog/main.mdc +0 -5
  34. package/rules/ci4/docs/index.md +0 -1
  35. package/rules/ci4/docs/main.md +0 -2
  36. package/rules/ci4/main.mdc +0 -5
  37. package/rules/doc-files/docs/index.md +0 -1
  38. package/rules/doc-files/docs/main.md +7 -11
  39. package/rules/doc-files/js/docs/docgen-crc.md +0 -2
  40. package/rules/doc-files/js/docs/docgen-extract.md +0 -2
  41. package/rules/doc-files/js/docs/docgen-files-batch.md +0 -2
  42. package/rules/doc-files/js/docs/docgen-gen.md +0 -2
  43. package/rules/doc-files/js/docs/docgen-judge-measure.md +0 -2
  44. package/rules/doc-files/js/docs/docgen-judge.md +0 -2
  45. package/rules/doc-files/js/docs/docgen-scan.md +0 -2
  46. package/rules/doc-files/js/docs/run-lint.md +0 -2
  47. package/rules/doc-files/main.mjs +2 -3
  48. package/rules/docker/docs/index.md +0 -1
  49. package/rules/docker/docs/main.md +0 -2
  50. package/rules/docker/js/docs/lint.md +0 -2
  51. package/rules/docker/lib/docs/docker-hadolint.md +0 -2
  52. package/rules/docker/main.mdc +1 -21
  53. package/rules/efes/docs/index.md +0 -1
  54. package/rules/efes/docs/main.md +0 -2
  55. package/rules/efes/main.mdc +0 -1
  56. package/rules/feedback/docs/index.md +0 -1
  57. package/rules/feedback/docs/main.md +0 -2
  58. package/rules/ga/docs/index.md +0 -1
  59. package/rules/ga/docs/main.md +0 -2
  60. package/rules/ga/js/docs/index.md +0 -1
  61. package/rules/ga/main.mdc +1 -31
  62. package/rules/graphql/docs/index.md +0 -1
  63. package/rules/graphql/docs/main.md +0 -2
  64. package/rules/graphql/main.mdc +0 -5
  65. package/rules/hasura/docs/index.md +0 -1
  66. package/rules/hasura/docs/main.md +0 -2
  67. package/rules/hasura/js/docs/index.md +1 -0
  68. package/rules/hasura/js/docs/migrations.md +28 -0
  69. package/rules/hasura/js/migrations.mjs +47 -0
  70. package/rules/hasura/main.mdc +1 -11
  71. package/rules/image-avif/docs/index.md +0 -1
  72. package/rules/image-avif/docs/main.md +0 -2
  73. package/rules/image-avif/main.mdc +1 -9
  74. package/rules/image-compress/docs/index.md +0 -1
  75. package/rules/image-compress/docs/main.md +0 -2
  76. package/rules/image-compress/js/docs/index.md +0 -1
  77. package/rules/image-compress/main.mdc +1 -9
  78. package/rules/js/docs/index.md +0 -1
  79. package/rules/js/docs/main.md +0 -2
  80. package/rules/js/js/dep-policy.mjs +91 -0
  81. package/rules/js/js/docs/check.md +0 -2
  82. package/rules/js/js/docs/dep-policy.md +34 -0
  83. package/rules/js/js/docs/index.md +5 -4
  84. package/rules/js/js/docs/tooling.md +0 -2
  85. package/rules/js/js/docs/utils_imports.md +0 -2
  86. package/rules/js/main.mdc +0 -31
  87. package/rules/js/policy/package_json/package_json.rego +16 -0
  88. package/rules/js-bun-db/docs/index.md +0 -1
  89. package/rules/js-bun-db/docs/main.md +0 -2
  90. package/rules/js-bun-db/js/docs/safety.md +18 -23
  91. package/rules/js-bun-db/js/safety.mjs +31 -3
  92. package/rules/js-bun-db/lib/bun-sql-scan.mjs +123 -0
  93. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +37 -331
  94. package/rules/js-bun-db/main.mdc +1 -23
  95. package/rules/js-bun-redis/docs/index.md +0 -1
  96. package/rules/js-bun-redis/docs/main.md +0 -2
  97. package/rules/js-bun-redis/main.mdc +0 -5
  98. package/rules/js-mssql/docs/index.md +0 -1
  99. package/rules/js-mssql/docs/main.md +0 -2
  100. package/rules/js-mssql/main.mdc +0 -12
  101. package/rules/js-run/docs/index.md +0 -1
  102. package/rules/js-run/docs/main.md +0 -2
  103. package/rules/js-run/js/docs/runtime.md +15 -13
  104. package/rules/js-run/js/runtime.mjs +48 -4
  105. package/rules/js-run/main.mdc +0 -25
  106. package/rules/k8s/docs/index.md +0 -1
  107. package/rules/k8s/docs/main.md +0 -2
  108. package/rules/k8s/main.mdc +0 -45
  109. package/rules/nginx-default-tpl/docs/index.md +0 -1
  110. package/rules/nginx-default-tpl/docs/main.md +0 -2
  111. package/rules/nginx-default-tpl/main.mdc +0 -13
  112. package/rules/npm-module/docs/index.md +0 -1
  113. package/rules/npm-module/docs/main.md +0 -2
  114. package/rules/npm-module/js/docs/header_doc_pointer.md +0 -2
  115. package/rules/npm-module/js/docs/rule_meta.md +0 -2
  116. package/rules/npm-module/js/docs/skill_meta.md +0 -2
  117. package/rules/npm-module/main.mdc +1 -15
  118. package/rules/php/docs/index.md +0 -1
  119. package/rules/php/docs/main.md +0 -2
  120. package/rules/php/js/docs/index.md +0 -1
  121. package/rules/php/main.mdc +1 -9
  122. package/rules/python/docs/index.md +0 -1
  123. package/rules/python/docs/main.md +0 -2
  124. package/rules/python/js/docs/index.md +0 -1
  125. package/rules/python/main.mdc +1 -13
  126. package/rules/rego/docs/index.md +0 -1
  127. package/rules/rego/docs/main.md +0 -2
  128. package/rules/rego/js/docs/index.md +1 -1
  129. package/rules/rego/js/docs/tooling.md +26 -0
  130. package/rules/rego/js/tooling.mdc +14 -0
  131. package/rules/rego/js/tooling.mjs +24 -0
  132. package/rules/rego/main.mdc +0 -9
  133. package/rules/rego/policy/package_json/package_json.mdc +12 -0
  134. package/rules/rego/policy/package_json/package_json.rego +21 -0
  135. package/rules/rego/policy/package_json/target.json +4 -0
  136. package/rules/release/docs/index.md +0 -1
  137. package/rules/release/docs/main.md +0 -2
  138. package/rules/release/main.mdc +2 -2
  139. package/rules/rust/docs/index.md +0 -1
  140. package/rules/rust/docs/main.md +0 -2
  141. package/rules/rust/js/docs/index.md +0 -1
  142. package/rules/rust/main.mdc +1 -11
  143. package/rules/rust/policy/lint_rust_yml/lint_rust_yml.rego +24 -0
  144. package/rules/rust/policy/package_json/package_json.mdc +12 -0
  145. package/rules/rust/policy/package_json/package_json.rego +20 -0
  146. package/rules/rust/policy/package_json/target.json +4 -0
  147. package/rules/security/docs/index.md +0 -1
  148. package/rules/security/docs/main.md +0 -2
  149. package/rules/security/js/docs/index.md +0 -1
  150. package/rules/security/main.mdc +0 -13
  151. package/rules/style/docs/index.md +0 -1
  152. package/rules/style/docs/main.md +0 -2
  153. package/rules/style/js/docs/index.md +0 -1
  154. package/rules/style/js/docs/tooling.md +12 -10
  155. package/rules/style/js/tooling.mjs +8 -2
  156. package/rules/style/main.mdc +1 -23
  157. package/rules/style/policy/lint_style_yml/lint_style_yml.rego +5 -0
  158. package/rules/tauri/docs/index.md +0 -1
  159. package/rules/tauri/docs/main.md +0 -2
  160. package/rules/tauri/main.mdc +1 -11
  161. package/rules/test/docs/index.md +0 -1
  162. package/rules/test/docs/main.md +0 -2
  163. package/rules/test/js/docs/index.md +2 -0
  164. package/rules/test/js/docs/no-console-store-restore.md +30 -0
  165. package/rules/test/js/docs/sandbox-aware-test.md +30 -0
  166. package/rules/test/js/docs/stryker_config.md +0 -2
  167. package/rules/test/js/docs/vitest-config-pool-forks.md +0 -2
  168. package/rules/test/js/no-console-store-restore.mjs +88 -0
  169. package/rules/test/js/sandbox-aware-test.mjs +89 -0
  170. package/rules/test/main.mdc +1 -21
  171. package/rules/text/docs/index.md +0 -1
  172. package/rules/text/docs/main.md +0 -2
  173. package/rules/text/js/docs/cspell-fix.md +0 -2
  174. package/rules/text/js/docs/run-dotenv-linter.md +0 -2
  175. package/rules/text/js/docs/run-shellcheck.md +0 -2
  176. package/rules/text/js/docs/run-v8r.md +0 -2
  177. package/rules/text/main.mdc +0 -33
  178. package/rules/tool-surface/docs/index.md +0 -1
  179. package/rules/tool-surface/docs/main.md +0 -2
  180. package/rules/vue/docs/index.md +0 -1
  181. package/rules/vue/docs/main.md +0 -2
  182. package/rules/vue/main.mdc +0 -22
  183. package/rules/worktree/docs/index.md +0 -1
  184. package/rules/worktree/docs/main.md +0 -2
  185. package/scripts/docs/auto-rules.md +0 -2
  186. package/scripts/docs/auto-skills.md +0 -2
  187. package/scripts/docs/hook.md +30 -0
  188. package/scripts/docs/index.md +1 -2
  189. package/scripts/docs/post-tool-use-check.md +0 -2
  190. package/scripts/docs/sync-claude-config.md +1 -3
  191. package/scripts/docs/sync-setup-bun-deps-action.md +0 -2
  192. package/scripts/hook.mjs +71 -0
  193. package/scripts/lib/docs/check-mdc-template-refs.md +0 -2
  194. package/scripts/lib/docs/index.md +35 -36
  195. package/scripts/lib/docs/inline-template-links.md +6 -8
  196. package/scripts/lib/docs/list-project-rules-mdc.md +0 -2
  197. package/scripts/lib/docs/list-rule-ids.md +0 -2
  198. package/scripts/lib/docs/mirror-parity.md +8 -10
  199. package/scripts/lib/docs/read-n-cursor-config-lite.md +0 -2
  200. package/scripts/lib/docs/rule-meta.md +0 -2
  201. package/scripts/lib/docs/run-lint.md +9 -10
  202. package/scripts/lib/docs/run-rule-cli.md +0 -2
  203. package/scripts/lib/docs/run-rule.md +7 -9
  204. package/scripts/lib/docs/run-standard-lint.md +0 -2
  205. package/scripts/lib/docs/run-standard-rule.md +0 -2
  206. package/scripts/lib/docs/skill-meta.md +0 -2
  207. package/scripts/lib/docs/timing-summary.md +0 -2
  208. package/scripts/lib/docs/worktree-notice.md +0 -2
  209. package/scripts/lib/fix/docs/analyze-escalation.md +0 -2
  210. package/scripts/lib/fix/docs/index.md +10 -10
  211. package/scripts/lib/fix/docs/llm-worker.md +18 -8
  212. package/scripts/lib/fix/docs/orchestrator.md +44 -20
  213. package/scripts/lib/fix/docs/run-conformance-check.md +0 -2
  214. package/scripts/lib/fix/docs/t0.md +0 -2
  215. package/scripts/lib/fix/docs/verbose-block.md +27 -0
  216. package/scripts/lib/fix/llm-worker.mjs +75 -22
  217. package/scripts/lib/fix/orchestrator.mjs +13 -3
  218. package/scripts/lib/fix/verbose-block.mjs +82 -0
  219. package/scripts/lib/inline-template-links.mjs +32 -22
  220. package/scripts/lib/mirror-parity.mjs +2 -2
  221. package/scripts/lib/run-lint.mjs +15 -2
  222. package/scripts/lib/run-rule.mjs +1 -2
  223. package/scripts/sync-claude-config.mjs +7 -4
  224. package/scripts/utils/docs/resolve-js-root.md +0 -2
  225. package/skills/adr-normalize/SKILL.md +1 -0
  226. package/skills/coverage-fix/SKILL.md +1 -0
  227. package/skills/doc-aggregate/SKILL.md +1 -0
  228. package/skills/doc-files/SKILL.md +10 -24
  229. package/skills/lint/SKILL.md +24 -19
  230. package/skills/llm-patch/SKILL.md +5 -4
  231. package/skills/publish-telegram/SKILL.md +1 -0
  232. package/skills/start-check/SKILL.md +1 -0
  233. package/skills/taze/SKILL.md +3 -2
  234. package/types/bin/n-cursor.d.ts +1 -1
  235. package/rules/abie/docs/fix.md +0 -37
  236. package/rules/adr/docs/fix.md +0 -37
  237. package/rules/bun/docs/fix.md +0 -30
  238. package/rules/capacitor/docs/fix.md +0 -36
  239. package/rules/changelog/docs/fix.md +0 -37
  240. package/rules/ci4/docs/fix.md +0 -32
  241. package/rules/doc-files/docs/fix.md +0 -29
  242. package/rules/docker/docs/fix.md +0 -35
  243. package/rules/efes/docs/fix.md +0 -37
  244. package/rules/feedback/docs/fix.md +0 -30
  245. package/rules/ga/docs/fix.md +0 -30
  246. package/rules/graphql/docs/fix.md +0 -37
  247. package/rules/hasura/docs/fix.md +0 -39
  248. package/rules/image-avif/docs/fix.md +0 -28
  249. package/rules/image-compress/docs/fix.md +0 -27
  250. package/rules/js/docs/fix.md +0 -37
  251. package/rules/js-bun-db/docs/fix.md +0 -30
  252. package/rules/js-bun-redis/docs/fix.md +0 -32
  253. package/rules/js-mssql/docs/fix.md +0 -30
  254. package/rules/js-run/docs/fix.md +0 -36
  255. package/rules/k8s/docs/fix.md +0 -31
  256. package/rules/nginx-default-tpl/docs/fix.md +0 -35
  257. package/rules/npm-module/docs/fix.md +0 -34
  258. package/rules/php/docs/fix.md +0 -35
  259. package/rules/python/docs/fix.md +0 -38
  260. package/rules/rego/docs/fix.md +0 -31
  261. package/rules/release/docs/fix.md +0 -28
  262. package/rules/rust/docs/fix.md +0 -32
  263. package/rules/security/docs/fix.md +0 -33
  264. package/rules/style/docs/fix.md +0 -28
  265. package/rules/tauri/docs/fix.md +0 -39
  266. package/rules/test/docs/fix.md +0 -31
  267. package/rules/text/docs/fix.md +0 -37
  268. package/rules/tool-surface/docs/fix.md +0 -32
  269. package/rules/vue/docs/fix.md +0 -32
  270. package/rules/worktree/docs/fix.md +0 -40
  271. package/scripts/docs/post-tool-use-fix.md +0 -32
  272. package/scripts/docs/worktree-cli.md +0 -27
  273. package/scripts/lib/docs/worktree.md +0 -42
  274. package/scripts/lib/fix/docs/run-fix-check.md +0 -33
@@ -0,0 +1,12 @@
1
+ ## Rego-gate: `cargo`, `rustfmt`, `clippy` заборонені у `package.json`
2
+
3
+ Rego-пакет: `rust.package_json`
4
+
5
+ Цільовий файл: `package.json`
6
+
7
+ `cargo`, `rustfmt` і `clippy` — це частина **Rust toolchain**, а не npm-пакети. Вони **не додаються** у `dependencies`, `devDependencies` або `peerDependencies`. Встановлення:
8
+
9
+ - **локально** — через `rustup` (`rustup component add rustfmt clippy`);
10
+ - **у CI** — через крок `dtolnay/rust-toolchain@stable` із `with.components: rustfmt, clippy`.
11
+
12
+ Gate видає deny, якщо `cargo`, `rustfmt` або `clippy` з'являється у будь-якій секції залежностей `package.json`.
@@ -0,0 +1,20 @@
1
+ # Перевірка `package.json` для Rust-проєктів (rust.mdc / lint.mdc).
2
+ #
3
+ # `cargo`, `rustfmt`, `clippy` — частина Rust toolchain (rustup), не npm-залежностей.
4
+ # Вони мають бути у PATH через `rustup` локально або `dtolnay/rust-toolchain@stable` у CI.
5
+ package rust.package_json
6
+
7
+ import rego.v1
8
+
9
+ banned_rust_tools := {"cargo", "rustfmt", "clippy"}
10
+
11
+ deny contains msg if {
12
+ some field in {"dependencies", "devDependencies", "peerDependencies"}
13
+ deps := object.get(input, field, {})
14
+ some name, _ in deps
15
+ name in banned_rust_tools
16
+ msg := sprintf(
17
+ "package.json: %s.%s заборонений — Rust toolchain встановлюється через rustup / dtolnay/rust-toolchain@stable, не через npm (rust.mdc)",
18
+ [field, name]
19
+ )
20
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json", "required": false }
4
+ }
@@ -8,5 +8,4 @@ resource: npm/rules/security/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує перевірку якості коду та безпеки репозиторію, спираючись на конфігурації, визначені у meta.json. Функція `run` застосовує політики та посилання на MDC для виконання перевірки. Функція `lint` сканує файлову систему репозиторію на наявність секретів. Обидві функції мають публічний статус, а кешування відбувається у межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -8,6 +8,5 @@ resource: npm/rules/security/js/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------------------------- | --------- |
11
- | [lint.mjs](lint.md) | JS Module |
12
11
  | [sample_secret.mjs](sample_secret.md) | JS Module |
13
12
  | [trufflehog.mjs](trufflehog.md) | JS Module |
@@ -6,19 +6,6 @@ version: '2.1'
6
6
  ---
7
7
 
8
8
  Правило **security** забезпечує сканування секретів через [TruffleHog](https://github.com/trufflesecurity/trufflehog) локально та на CI, а також правильне використання placeholder-значень у прикладних файлах.
9
-
10
- [security-trufflehog](./js/trufflehog.mdc)
11
-
12
- [security-sample-secret](./js/sample_secret.mdc)
13
-
14
- [security-rego-policies](./js/rego_policies.mdc)
15
-
16
- ## Швидкий gate через conftest
17
-
18
- [security-package-json](./policy/package_json/package_json.mdc)
19
-
20
- [security-lint-security-yml](./policy/lint_security_yml/lint_security_yml.mdc)
21
-
22
9
  ## Перевірка
23
10
 
24
11
  `npx @nitra/cursor fix security`
@@ -8,5 +8,4 @@ resource: npm/rules/style/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль реалізує логіку для виконання правил, фільтрації файлів за розширеннями та запуску стильового лінтера. Функція `run` виконує визначені правила. `filterStyleFiles` обробляє файли, вибираючи їх на основі розширень. `lint` запускає перевірку стилю.
14
12
 
15
13
  ## Поведінка
@@ -8,5 +8,4 @@ resource: npm/rules/style/js/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
- | [lint.mjs](lint.md) | JS Module |
12
11
  | [tooling.mjs](tooling.md) | JS Module |
@@ -3,25 +3,27 @@ type: JS Module
3
3
  title: tooling.mjs
4
4
  resource: npm/rules/style/js/tooling.mjs
5
5
  docgen:
6
- crc: bc2b0934
7
- score: 80
6
+ crc: 27bb12d3
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 95
8
9
  ---
9
10
 
10
- Файл виконує перевірку конфігурації stylelint та файлів, пов'язаних з лінтуванням. Перевірка включає наявність конфігурації stylelint у `package.json` або зовнішньому файлі, файлів конфігу stylelint у директорії, файлів ігнорування stylelint та файлу workflow для лінтування.
11
+ Перевіряє налаштування для стилістичного лінтера, підтверджуючи наявність файлів конфігурації, таких як `.stylelintrc.json` та `package.json`. Це забезпечує коректний запуск перевірок відповідно до вимог, визначених у `.stylelintrc.json` та `settings.json`. (js.mdc), (style.mdc)
11
12
 
12
13
  ## Поведінка
13
14
 
14
- 1. Перевірити наявність конфігурації stylelint у package.json або зовнішньому файлі
15
- 2. Перевірити наявність файлів конфігу stylelint у директорії
16
- 3. Перевірити наявність файлів ігнорування stylelint
17
- 4. Перевірити наявність файлу workflow для лінтування
15
+ 1. Викликається функція check.
16
+ 2. Перевіряється наявність конфігурації stylelint у package.json або зовнішньому файлі (наприклад, .stylelintrc.json, .stylelintrc.js, stylelint.config.js). Якщо конфігурація відсутня, повідомляється про необхідність додати її до package.json (js.mdc).
17
+ 3. Якщо існує файл .stylelintignore, перевіряється, чи містить він рядок `dist/`. Якщо ні, повідомляється про необхідність додати цей рядок (style.mdc).
18
+ 4. Перевіряється наявність файлу .github/workflows/lint-style.yml. Якщо він відсутній, повідомляється про необхідність його створення.
19
+ 5. Функція повертає код виходу, що відображає загальний статус перевірки.
20
+ 6. Перевірка не включає шляхи .github та .git.
18
21
 
19
22
  ## Публічний API
20
23
 
21
- check — Перевіряє відповідність проєкту правилам style.mdc
24
+ check — перевіряє відповідність проєкту стандартам оформлення (style.mdc).
22
25
 
23
26
  ## Гарантії поведінки
24
27
 
25
- - Read-only: файл не виконує операцій запису у файлову систему.
28
+ - Read-only: не виконує операцій запису (ФС/БД).
26
29
  - Свідомо пропускає шляхи: `.github`, `.git`.
27
- - Не звертається до мережі.
@@ -54,8 +54,14 @@ export async function check(cwd = process.cwd()) {
54
54
 
55
55
  await checkStylelintConfigPresence(reporter, cwd)
56
56
 
57
- if (existsSync(join(cwd, '.stylelintignore'))) {
58
- pass('.stylelintignore існує')
57
+ const ignorePath = join(cwd, '.stylelintignore')
58
+ if (existsSync(ignorePath)) {
59
+ const ignoreContent = await readFile(ignorePath, 'utf8')
60
+ if (ignoreContent.split('\n').some(line => line.trim() === 'dist/')) {
61
+ pass('.stylelintignore існує і містить dist/')
62
+ } else {
63
+ fail('.stylelintignore не містить рядка dist/ — додай його (style.mdc)')
64
+ }
59
65
  } else {
60
66
  fail('.stylelintignore не існує — створи з вмістом: dist/')
61
67
  }
@@ -5,26 +5,4 @@ globs: "**/*.{css,scss,vue}"
5
5
  alwaysApply: false
6
6
  ---
7
7
 
8
- Правило **style** для Vue-проєктів: Quasar як стильова система, SCSS-конвенції кольорів і відступів, фікси компонентів, stylelint через `@nitra/stylelint-config`.
9
-
10
- [style-quasar](./js/quasar.mdc)
11
-
12
- [style-colors](./js/colors.mdc)
13
-
14
- [style-gap](./js/gap.mdc)
15
-
16
- [style-quasar-fixes](./js/quasar-fixes.mdc)
17
-
18
- [style-tooling](./js/tooling.mdc)
19
-
20
- [style-admin-table](./js/admin-table.mdc)
21
-
22
- ## Швидкий gate через conftest (Rego)
23
-
24
- [style-lint_style_yml](./policy/lint_style_yml/lint_style_yml.mdc)
25
-
26
- [style-package_json](./policy/package_json/package_json.mdc)
27
-
28
- [style-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
29
-
30
- [style-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
8
+ Правило **style** для Vue-проєктів: Quasar як стильова система, SCSS-конвенції кольорів і відступів, фікси компонентів, stylelint через `@nitra/stylelint-config`.
@@ -26,6 +26,11 @@ deny contains msg if {
26
26
  msg := sprintf("lint-style.yml: жоден крок run не містить %q (style.mdc)", [expected_run_blob])
27
27
  }
28
28
 
29
+ deny contains msg if {
30
+ contains(all_run_text, "bunx stylelint")
31
+ msg := "lint-style.yml: знайдено bunx stylelint — використовуй n-cursor lint style --read-only (style.mdc)"
32
+ }
33
+
29
34
  step_run_to_text(step) := step.run if is_string(step.run)
30
35
 
31
36
  else := concat("\n", [s | some s in step.run]) if is_array(step.run)
@@ -8,5 +8,4 @@ resource: npm/rules/tauri/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль обробляє JS-запити та взаємодіє з MDC для отримання даних. При запуску через публічну функцію `run` він оркеструє застосування правил, завантажуючи конфігурації з meta.json, застосовуючи білий список та надаючи підсумок. Модуль є read-only і не здійснює записів у ФС/БД.
14
12
 
15
13
  ## Поведінка
@@ -5,14 +5,4 @@ alwaysApply: false
5
5
  version: '1.5'
6
6
  ---
7
7
 
8
- Правило встановлює канонічні вимоги для Tauri-проєктів: виявлення маркерів у монорепо, VS Code-розширення, налаштування mutation-testing для platform bridge та реалізацію Tool Surface поверх Tauri+Rust.
9
-
10
- ## Швидкий gate через conftest
11
-
12
- [tauri-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
13
-
14
- [tauri-tooling](./js/tooling.mdc)
15
-
16
- [tauri-cargo_mutants_config](./js/cargo_mutants_config.mdc)
17
-
18
- [tauri-tool_surface](./js/tool_surface.mdc)
8
+ Правило встановлює канонічні вимоги для Tauri-проєктів: виявлення маркерів у монорепо, VS Code-розширення, налаштування mutation-testing для platform bridge та реалізацію Tool Surface поверх Tauri+Rust.
@@ -8,5 +8,4 @@ resource: npm/rules/test/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує перевірку, обробляючи JS-запитання, політику та посилання на mdc. При запуску як окрема програма, він зчитує конфігурації з meta.json, застосовує білий список та підсумовує результати після застосування білого списку, визначаючи код виходу процесу. Функція run ініціює цей процес. Модуль є read-only і не пише у ФС/БД. Кешування відбувається у межах прогону.
14
12
 
15
13
  ## Поведінка
@@ -10,7 +10,9 @@ resource: npm/rules/test/js/
10
10
  | ----------------------------------------------------------- | --------- |
11
11
  | [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
12
12
  | [location.mjs](location.md) | JS Module |
13
+ | [no-console-store-restore.mjs](no-console-store-restore.md) | JS Module |
13
14
  | [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
14
15
  | [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
16
+ | [sandbox-aware-test.mjs](sandbox-aware-test.md) | JS Module |
15
17
  | [stryker_config.mjs](stryker_config.md) | JS Module |
16
18
  | [vitest-config-pool-forks.mjs](vitest-config-pool-forks.md) | JS Module |
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: no-console-store-restore.mjs
4
+ resource: npm/rules/test/js/no-console-store-restore.mjs
5
+ docgen:
6
+ crc: 39f9fb6d
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ Модуль сканує репозиторій для пошуку файлів, що відповідають шаблону `*.test.{mjs,js}`. Він перевіряє вміст кожного такого файлу на наявність прямих присвоєнь методів консолі. Публічна функція `check` виявляє такі присвоєння. (test.mdc)
12
+
13
+ ## Поведінка
14
+
15
+ 1. Визначає, які файли є тестовими (`*.test.{mjs,js}`).
16
+ 2. Збирає список усіх тестових файлів у репозиторії, ігноруючи конфігураційні шляхи.
17
+ 3. Для кожного тестового файлу зчитує його вміст.
18
+ 4. Аналізує вміст файлу, шукаючи прямі присвоєння `console.<method> = …`.
19
+ 5. Якщо порушення знайдено, реєструє його з зазначенням файлу та номера рядка.
20
+ 6. Якщо порушень немає, повідомляє про успішну перевірку (test.mdc).
21
+ 7. Якщо порушення знайдено, повідомляє про кожне порушення, вказуючи, що пряме присвоєння заборонено і слід використовувати `vi.spyOn.mockReturnValue` (test.mdc, no-console-store-restore).
22
+ 8. Повертає код виходу, що відображає результат перевірки.
23
+
24
+ ## Публічний API
25
+
26
+ check — виявляє, чи не перевизначає жоден тестовий файл методи `console.*` через пряме присвоєння.
27
+
28
+ ## Гарантії поведінки
29
+
30
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,30 @@
1
+ ---
2
+ type: JS Module
3
+ title: sandbox-aware-test.mjs
4
+ resource: npm/rules/test/js/sandbox-aware-test.mjs
5
+ docgen:
6
+ crc: 0c64c75c
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ Модуль сканує тестові файли, що відповідають шаблону `*.test.{mjs,js}` у вказаному корені репозиторію. Він перевіряє, чи файли, що містять глибоку навігацію (визначену як використання `import.meta.dirname` або `import.meta.url` з чотирма або більше рівнями `..`), захищені викликом `withTmpDir` або `test.skipIf` з посиланням на змінну середовища `env.STRYKER_MUTATOR_WORKER`. Перевірка фіксує порушення (test.mdc) у разі відсутності необхідної ізоляції для тестових файлів з глибокою навігацією.
12
+
13
+ ## Поведінка
14
+
15
+ 1. Визначає тестові файли, що відповідають шаблону `*.test.{mjs,js}` у вказаному корені репозиторію.
16
+ 2. Для кожного тестового файлу перевіряє, чи містить він глибоку навігацію за допомогою `import.meta.dirname` або `import.meta.url` з чотирма або більше рівнями `..`.
17
+ 3. Якщо глибока навігація виявлена, перевіряє, чи захищено цей файл викликом `withTmpDir` або `test.skipIf` з посиланням на `env.STRYKER_MUTATOR_WORKER`.
18
+ 4. Якщо глибока навігація виявлена, але файл не захищений, він реєструється як порушення (test.mdc).
19
+ 5. Викликає `check` для запуску перевірки.
20
+ 6. Якщо порушень немає, повідомляє про успішне виконання (test.mdc).
21
+ 7. Якщо порушення виявлено, повідомляє про кожен виявлений файл та необхідність застосування ізоляції.
22
+ 8. Повертає код виходу, що відображає результат перевірки.
23
+
24
+ ## Публічний API
25
+
26
+ check — Виявляє тести, що використовують глибоку навігацію `import.meta` (≥4 `..`-рівнів) і не захищені механізмами `withTmpDir` або `test.skipIf`. Це запобігає збоям Git-операцій у тестах, які не мають ізоляції Stryker-sandbox. (test.mdc)
27
+
28
+ ## Гарантії поведінки
29
+
30
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє готовність JavaScript-проєктів до виконання тестів. Він збирає кореневі каталоги проєктів, використовуючи публічну функцію `check` для валідації. Перевірка гарантує наявність необхідних конфігураційних файлів, зокрема `mutation.json` та `package.json`, у кожному знайденому проєкті. Модуль свідомо пропускає каталоги `node_modules`. Він також додає відповідні артефакти тестів до `.gitignore` у коренях проєктів. (test.mdc)
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Визначає шлях до конфігураційного файлу Vitest. Перевіряє, чи встановлено в цьому файлі `pool: 'forks'`. (test.mdc)
14
12
 
15
13
  Поведінка:
@@ -0,0 +1,88 @@
1
+ /** @see ./docs/no-console-store-restore.md */
2
+ import { readFile } from 'node:fs/promises'
3
+ import { basename, relative } from 'node:path'
4
+
5
+ import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
6
+ import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
7
+ import { walkDir } from '../../../scripts/utils/walkDir.mjs'
8
+
9
+ /**
10
+ * Ловить пряме присвоєння `console.<method> = …` у `*.test.{js,mjs}`.
11
+ * `console.log = fn` — process-wide мутація; канон: `vi.spyOn(console, 'log')`.
12
+ * `(?!=)` виключає `==` та `===` (лише одиночний `=`).
13
+ */
14
+ const CONSOLE_ASSIGN_RE =
15
+ /\bconsole\.(?:log|error|warn|info|debug|dir|table|trace|group|groupEnd|time|timeEnd)\s*=(?!=)/u
16
+
17
+ /**
18
+ * Чи файл — JS-тест (`*.test.mjs` / `*.test.js`).
19
+ * @param {string} absPath абсолютний шлях
20
+ * @returns {boolean} `true` для `.test.{mjs,js}` файлів
21
+ */
22
+ function isTestFile(absPath) {
23
+ const name = basename(absPath)
24
+ return name.endsWith('.test.mjs') || name.endsWith('.test.js')
25
+ }
26
+
27
+ /**
28
+ * Знаходить рядки з прямим присвоєнням `console.<method> = …`.
29
+ * @param {string} body вміст файлу
30
+ * @returns {Array<{line: number}>} знайдені порушення
31
+ */
32
+ function findOffenders(body) {
33
+ const offenders = []
34
+ const lines = body.split('\n')
35
+ for (const [i, line] of lines.entries()) {
36
+ if (CONSOLE_ASSIGN_RE.test(line)) {
37
+ offenders.push({ line: i + 1 })
38
+ }
39
+ }
40
+ return offenders
41
+ }
42
+
43
+ /**
44
+ * Перевіряє, що жоден `*.test.{mjs,js}` файл не перевизначає `console.<method>`
45
+ * через пряме присвоєння. Канон — `vi.spyOn(console, 'log').mockReturnValue()`.
46
+ * @param {string} [cwdParam] корінь репозиторію
47
+ * @returns {Promise<number>} 0 — чисто, 1 — є порушення
48
+ */
49
+ export async function check(cwdParam = process.cwd()) {
50
+ const reporter = createCheckReporter()
51
+ const { pass, fail } = reporter
52
+
53
+ const cwd = cwdParam
54
+ const ignorePaths = await loadCursorIgnorePaths(cwd)
55
+
56
+ /** @type {string[]} */
57
+ const testFiles = []
58
+ await walkDir(
59
+ cwd,
60
+ absPath => {
61
+ if (isTestFile(absPath)) testFiles.push(absPath)
62
+ },
63
+ ignorePaths
64
+ )
65
+
66
+ /** @type {Array<{file: string, line: number}>} */
67
+ const offenders = []
68
+ for (const absPath of testFiles) {
69
+ const body = await readFile(absPath, 'utf8')
70
+ for (const o of findOffenders(body)) {
71
+ offenders.push({ file: relative(cwd, absPath), ...o })
72
+ }
73
+ }
74
+
75
+ if (offenders.length === 0) {
76
+ pass(`Жоден з ${testFiles.length} тестових файлів не присвоює console.<method> = … (test.mdc)`)
77
+ return reporter.getExitCode()
78
+ }
79
+
80
+ for (const { file, line } of offenders) {
81
+ fail(
82
+ `${file}:${line}: пряме присвоєння console.<method> = … заборонено — ` +
83
+ `використовуй vi.spyOn(console, 'method').mockReturnValue() (test.mdc, no-console-store-restore)`
84
+ )
85
+ }
86
+
87
+ return reporter.getExitCode()
88
+ }
@@ -0,0 +1,89 @@
1
+ /** @see ./docs/sandbox-aware-test.md */
2
+ import { readFile } from 'node:fs/promises'
3
+ import { basename, relative } from 'node:path'
4
+
5
+ import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
6
+ import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
7
+ import { walkDir } from '../../../scripts/utils/walkDir.mjs'
8
+
9
+ /**
10
+ * Чи файл — JS-тест (`*.test.mjs` / `*.test.js`).
11
+ * @param {string} absPath абсолютний шлях
12
+ * @returns {boolean} `true` для `.test.{mjs,js}` файлів
13
+ */
14
+ function isTestFile(absPath) {
15
+ const name = basename(absPath)
16
+ return name.endsWith('.test.mjs') || name.endsWith('.test.js')
17
+ }
18
+
19
+ /**
20
+ * Чи файл містить `import.meta.dirname`/`import.meta.url`-навігацію з ≥4 `..`-рівнів.
21
+ * Для кожного вживання `import.meta.dirname|url` рахує `'..'`/`".."` у вікні 400 символів.
22
+ * @param {string} body вміст файлу
23
+ * @returns {boolean} `true` якщо знайдено глибоку навігацію
24
+ */
25
+ function hasDeepMetaNavigation(body) {
26
+ const RE = /import\.meta\.(?:dirname|url)\b/gu
27
+ let match
28
+ while ((match = RE.exec(body)) !== null) {
29
+ const chunk = body.slice(match.index, match.index + 400)
30
+ const dots = (chunk.match(/'\.\.'|"\.\."/gu) ?? []).length
31
+ if (dots >= 4) return true
32
+ }
33
+ return false
34
+ }
35
+
36
+ /** Захист через тимчасову пісочницю — `withTmpDir`. */
37
+ const WITH_TMP_DIR_RE = /\bwithTmpDir\b/u
38
+
39
+ /** Захист через явний skip у Stryker-sandbox (`test.skipIf`). */
40
+ const SKIP_IF_STRYKER_RE = /\btest\.skipIf\s*\(\s*(?:env|process\.env)\.STRYKER_MUTATOR_WORKER\b/u
41
+
42
+ /**
43
+ * Перевіряє, що `*.test.{mjs,js}` з глибокою `import.meta`-навігацією (≥4 `..`-рівнів)
44
+ * захищені `withTmpDir` або `test.skipIf(env.STRYKER_MUTATOR_WORKER)`.
45
+ * Без ізоляції Stryker-sandbox (`reports/stryker/.tmp/sandbox-XXX/`) не має `.git/`,
46
+ * тому git-операції у таких тестах падають і мутаційний прогін не стартує.
47
+ * @param {string} [cwdParam] корінь репозиторію
48
+ * @returns {Promise<number>} 0 — чисто, 1 — є порушення
49
+ */
50
+ export async function check(cwdParam = process.cwd()) {
51
+ const reporter = createCheckReporter()
52
+ const { pass, fail } = reporter
53
+
54
+ const cwd = cwdParam
55
+ const ignorePaths = await loadCursorIgnorePaths(cwd)
56
+
57
+ /** @type {string[]} */
58
+ const testFiles = []
59
+ await walkDir(
60
+ cwd,
61
+ absPath => {
62
+ if (isTestFile(absPath)) testFiles.push(absPath)
63
+ },
64
+ ignorePaths
65
+ )
66
+
67
+ /** @type {string[]} */
68
+ const offenders = []
69
+ for (const absPath of testFiles) {
70
+ const body = await readFile(absPath, 'utf8')
71
+ if (!hasDeepMetaNavigation(body)) continue
72
+ if (WITH_TMP_DIR_RE.test(body) || SKIP_IF_STRYKER_RE.test(body)) continue
73
+ offenders.push(relative(cwd, absPath))
74
+ }
75
+
76
+ if (offenders.length === 0) {
77
+ pass(`Усі ${testFiles.length} тестові файли sandbox-aware (test.mdc)`)
78
+ return reporter.getExitCode()
79
+ }
80
+
81
+ for (const file of offenders) {
82
+ fail(
83
+ `${file}: import.meta deep navigation (≥4 рівні ..) без ізоляції — ` +
84
+ `оберни у withTmpDir() або захисти test.skipIf(env.STRYKER_MUTATOR_WORKER) (test.mdc, sandbox-aware-test)`
85
+ )
86
+ }
87
+
88
+ return reporter.getExitCode()
89
+ }
@@ -7,22 +7,6 @@ alwaysApply: false
7
7
 
8
8
  Правило **test** керує розміщенням тестових файлів, безпекою ізоляції тестів (заборона `process.chdir`, відносних шляхів у FS, ручного store/restore console), налаштуванням Vitest/Stryker baseline та конфігурацією cargo-mutants для Rust.
9
9
 
10
- [test-location](./js/location.mdc)
11
-
12
- [test-no-process-chdir](./js/no-process-chdir.mdc)
13
-
14
- [test-no-relative-fs-path](./js/no-relative-fs-path.mdc)
15
-
16
- [test-no-console-store-restore](./js/no-console-store-restore.mdc)
17
-
18
- [test-sandbox-aware-test](./js/sandbox-aware-test.mdc)
19
-
20
- [test-vitest-config-pool-forks](./js/vitest-config-pool-forks.mdc)
21
-
22
- [test-stryker-config](./js/stryker_config.mdc)
23
-
24
- [test-cargo-mutants-config](./js/cargo_mutants_config.mdc)
25
-
26
10
  ## Покриття + мутаційне тестування
27
11
 
28
12
  Канонічна команда — `n-cursor coverage`: збирає метрики покриття (`vitest run --coverage`, `cargo llvm-cov` тощо) і мутаційного тестування (Stryker з vitest-runner + `coverageAnalysis: 'perTest'`, `cargo-mutants`) з усіх активних провайдерів у `.n-cursor.json#rules` і пише `COVERAGE.md` у корінь проєкту.
@@ -35,8 +19,4 @@ alwaysApply: false
35
19
 
36
20
  ### Multi-workspace iteration
37
21
 
38
- У monorepo `n-cursor coverage` ітерує усі workspaces з власним `package.json` і агрегує метрики lcov + Stryker у єдиний `JS`-рядок `COVERAGE.md`. Workspace без тестів пропускається без помилки.
39
-
40
- ## Швидкий gate через conftest
41
-
42
- [test-package_json](./policy/package_json/package_json.mdc)
22
+ У monorepo `n-cursor coverage` ітерує усі workspaces з власним `package.json` і агрегує метрики lcov + Stryker у єдиний `JS`-рядок `COVERAGE.md`. Workspace без тестів пропускається без помилки.
@@ -8,5 +8,4 @@ resource: npm/rules/text/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------- | --------- |
11
- | [fix.mjs](fix.md) | JS Module |
12
11
  | [main.mjs](main.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Цей модуль є CLI-обгорткою над канонічним `lint-text` (text.mdc) та викликається через `n-cursor lint text` (оркестраторний адаптер `lint`). Він автоматично встановлює необхідні інструменти (`shellcheck`, `dotenv-linter`) через `ensureTool` (brew/scoop/GitHub Release per-platform) та перевіряє наявність `patch` (для авто-фіксу shellcheck). Функція `runLintTextCli` послідовно виконує: 1) перевірку правопису з `@nitra/cspell-dict` (`cspell .`); 2) авто-фікс та фінальну перевірку `.sh` файлів (`shellcheck`); 3) авто-фікс та фінальну перевірку `.env*` файлів (`dotenv-linter`); 4) авто-фікс Markdown-документів (`markdownlint-cli2 --fix "**\/*.md" "**\/*.mdc"`); 5) schema-валідацію JSON/YAML/TOML через `v8r`. При першому ненульовому коді з ланцюжка повертається код виходу, і наступні кроки не запускаються. Конфігурації, на які спирається код: meta.json.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль інтегрує cspell у ланцюжку lint-text для класифікації невідомих слів згідно зі схемою docs/specs/2026-06-15-opportunistic-llm-fix-tier.md. Він виявляє невідомі слова, класифікує їх за допомогою LLM у межах omlx-класифікації. Валідні слова автоматично дописуються до `.cspell.json#words` (відповідно до конфігурацій .cspell.json та meta.json). Невалідні знахідки залишаються для ручного рев'ю. Процес є read-only (нуль мутацій), оскільки fix-режим не переписує файли, а лише класифікує знахідки. Після дописування словника виконується re-detect. Гейт-механізм гарантує, що cspell поверне ненульовий код, якщо нерозкласифіковані або потенційні одруки залишилися.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль запускає `dotenv-linter` для валідації конфігураційних файлів `.env*` відповідно до стандартів (наприклад, `LowercaseKey`). Процес включає два етапи: спочатку автоматичне виправлення порушень за допомогою `dotenv-linter fix`, а потім фінальну перевірку за допомогою `dotenv-linter check`. Інструмент очікується у системному PATH і не включається у залежності проєкту. Він рекурсивно шукає файли, виключаючи `node_modules` та `.envrc`. Якщо `dotenv-linter` відсутній, виводиться інструкція щодо його встановлення (наприклад, `brew install dotenv-linter`) та повертається код помилки. Усі деталі роботи можна знайти за посиланням https://git.io/JLbXn.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Скрипт забезпечує відповідність shell-скриптів стандартам, виконуючи дві послідовні дії: спочатку застосовує автоматичні виправлення для проблем, виявлених `shellcheck` за допомогою формату виводу `diff` та команди `patch -p1` у корені проєкту; потім проводить фінальну перевірку всіх зібраних файлів. Скрипт збирає всі відстежувані shell-скрипти у робочому дереві, ігноруючи директорії `node_modules`. Якщо скриптів не знайдено, процес завершується з кодом 0. Якщо `shellcheck` або `patch` відсутні у PATH, скрипт завершується з кодом 1, надаючи підказки для їх встановлення. Після циклу автовиправлень будь-яке попередження чи помилка від `shellcheck` призводить до ненульового коду виходу.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Скрипт виконує єдиний виклик `v8r` для перевірки відповідності всіх файлів, які підтримує `v8r` (json, json5, yaml, yml, toml), визначеним контрактам. Це замінює необхідність у кількох окремих викликах `v8r`. Скрипт автоматично використовує каталог схем `@nitra/cursor`, який визначається у `v8r-catalog.json`. Якщо не надано додаткових аргументів, він шукає файли за типовими шаблонами у дереві проєкту. Механізм гарантує, що перевірка всіх розширень відбувається, навіть якщо один із глобів не знаходить файлів, оскільки він обходить проблему падіння `v8r` з кодом 98.
14
12
 
15
13
  ## Поведінка