@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
@@ -367,7 +367,13 @@ async function checkWorkspacePackage(rootDir, ignorePaths, fail, passFn, cwd) {
367
367
  passFn(`${label}немає Temporal API у Bun runtime-коді`)
368
368
  }
369
369
 
370
- checkOtelConfigmap(rootDir, passFn, cwd)
370
+ checkOtelConfigmap(rootDir, passFn, fail, cwd)
371
+
372
+ const connAliasViolations = checkConnAliasDeclaration(absPackageRoot, sourcePaths, pkgJson, label, fail)
373
+ if (connAliasViolations === 0) {
374
+ const connDir = resolveConnDirFromPackageJson(pkgJson)
375
+ passFn(`${label}package.json.imports["#conn/*"] оголошений (або файлів у '${connDir}/' немає)`)
376
+ }
371
377
  }
372
378
 
373
379
  /**
@@ -409,9 +415,47 @@ async function loadPackageJson(rootDir, cwd) {
409
415
  * @returns {void}
410
416
  * @param {string} cwd корінь репозиторію
411
417
  */
412
- function checkOtelConfigmap(rootDir, passFn, cwd) {
413
- const configmapPath = join(cwd, rootDir, 'k8s', 'base', 'configmap.yaml')
414
- if (!existsSync(configmapPath)) return
418
+ /**
419
+ * Перевіряє наявність `package.json#imports["#conn/*"]` коли у `connDir` є файли.
420
+ * @param {string} absPackageRoot абсолютний корінь пакета
421
+ * @param {string[]} sourcePaths абсолютні шляхи до файлів пакета
422
+ * @param {unknown} pkgJson розпарсений package.json пакета (або null)
423
+ * @param {string} label префікс повідомлення
424
+ * @param {(msg: string) => void} fail callback при помилці
425
+ * @returns {number} 0 — ок, 1 — порушення
426
+ */
427
+ function checkConnAliasDeclaration(absPackageRoot, sourcePaths, pkgJson, label, fail) {
428
+ const connDir = resolveConnDirFromPackageJson(pkgJson)
429
+ const hasConnFiles = sourcePaths.some(absPath => isInsideConnDir(relPosix(absPackageRoot, absPath), connDir))
430
+ if (!hasConnFiles) return 0
431
+
432
+ const imports =
433
+ pkgJson && typeof pkgJson === 'object' && !Array.isArray(pkgJson)
434
+ ? /** @type {Record<string, unknown>} */ (pkgJson).imports
435
+ : null
436
+ if (imports && typeof imports === 'object' && !Array.isArray(imports) && imports['#conn/*']) return 0
437
+
438
+ fail(
439
+ `${label}є файли у '${connDir}/', але в package.json відсутній аліас "#conn/*" — ` +
440
+ `додай "imports": { "#conn/*": "./${connDir}/*" } (js-run.mdc conn-aliases)`
441
+ )
442
+ return 1
443
+ }
444
+
445
+ function checkOtelConfigmap(rootDir, passFn, failFn, cwd) {
446
+ const k8sDir = join(cwd, rootDir, 'k8s')
447
+ if (!existsSync(k8sDir)) {
448
+ passFn(`${rootDir}: немає каталогу k8s/ — перевірку OTEL configmap пропущено`)
449
+ return
450
+ }
451
+ const configmapPath = join(k8sDir, 'base', 'configmap.yaml')
452
+ if (!existsSync(configmapPath)) {
453
+ failFn(
454
+ `${rootDir}/k8s/base/configmap.yaml відсутній — додай з полем OTEL_RESOURCE_ATTRIBUTES ` +
455
+ `(service.name=, service.namespace=), js-run.mdc`
456
+ )
457
+ return
458
+ }
415
459
  passFn(`${rootDir}/k8s/base/configmap.yaml є (OTEL — npx @nitra/cursor fix → js_run.configmap)`)
416
460
  }
417
461
 
@@ -7,32 +7,7 @@ version: '1.12'
7
7
 
8
8
  Правило охоплює backend Node.js workspace-пакети (jobs, GraphQL/HTTP-сервери, CLI) — визначення меж застосування, вимоги до runtime, структуру проекту, конфігурацію, логування, підключення до БД/GraphQL і безпечне використання env-змінних.
9
9
 
10
- [js-run-scope](./js/scope.mdc)
11
-
12
- [js-run-runtime](./js/runtime.mdc)
13
-
14
- [js-run-temporal](./js/temporal.mdc)
15
-
16
- [js-run-project-structure](./js/project-structure.mdc)
17
-
18
- [js-run-jsconfig](./js/jsconfig.mdc)
19
-
20
- [js-run-pino](./js/pino.mdc)
21
-
22
- [js-run-otel-configmap](./js/otel-configmap.mdc)
23
-
24
- [js-run-conn-aliases](./js/conn-aliases.mdc)
25
-
26
- [js-run-check-env](./js/check-env.mdc)
27
-
28
- [js-run-settimeout](./js/settimeout.mdc)
29
-
30
10
  ## Швидкий gate через conftest
31
11
 
32
12
  Rego-пакети, які запускає `npx @nitra/cursor fix js-run` / `npx @nitra/cursor check`:
33
13
 
34
- [js-run-package_json](./policy/package_json/package_json.mdc)
35
-
36
- [js-run-jsconfig](./policy/jsconfig/jsconfig.mdc)
37
-
38
- [js-run-configmap](./policy/configmap/configmap.mdc)
@@ -8,5 +8,4 @@ resource: npm/rules/k8s/
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: 85
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль знаходить унікальні корені каталогів із іменем `k8s` за шляхами файлів `*.yaml` у репозиторії. Якщо таких файлів немає, виконання завершується з кодом 0 без виклику зовнішніх CLI. Для знайдених коренів виконується перевірка YAML-маніфестів. `kubeconform` перевіряє маніфести проти OpenAPI-схем Kubernetes (https://github.com/yannh/kubeconform#readme), використовуючи версію, узгоджену з лінією релізу. `kubescape` сканує маніфести на misconfiguration та відповідність стандартам (NSA, MITRE, CIS), використовуючи конфігураційний файл `.kubescape-exceptions.json`. Орієнтир цільового кластера для `kubescape` визначається за тією ж лінією релізу, що й для `kubeconform`. Обидві утиліти (`kubeconform` та `kubescape`) повинні бути доступні в системному PATH.
14
12
 
15
13
  ## Поведінка
@@ -17,52 +17,7 @@ alwaysApply: false
17
17
 
18
18
  Правило активується автоматично для `**/k8s/**/*.yaml` (через `globs`). Додаткова конфігурація в `.n-cursor.json` не потрібна.
19
19
 
20
- [k8s-schema-modeline](./js/schema_modeline.mdc)
21
-
22
- [k8s-lint-k8s](./js/lint_k8s.mdc)
23
-
24
- [k8s-deployment-resources](./js/deployment_resources.mdc)
25
-
26
- [k8s-hasura-httproute](./js/hasura_httproute.mdc)
27
-
28
- [k8s-service](./js/service.mdc)
29
-
30
- [k8s-configmap](./js/configmap.mdc)
31
-
32
- [k8s-kustomize-structure](./js/kustomize_structure.mdc)
33
-
34
- [k8s-topology-hpa-pdb](./js/topology_hpa_pdb.mdc)
35
-
36
- [k8s-network-policy](./js/network_policy.mdc)
37
-
38
- [k8s-ingress-gateway](./js/ingress_gateway.mdc)
39
-
40
- [k8s-hpa-apiversion](./js/hpa_apiversion.mdc)
41
-
42
- [k8s-multidoc-yaml](./js/multidoc_yaml.mdc)
43
-
44
20
  ## Швидкий gate через conftest (Rego)
45
21
 
46
22
  Підмножину пер-документних правил продубльовано як rego-полісі у **`npm/rules/k8s/policy/`** (запускається через **`bun run lint-rego`** для `*_test.rego` юніт-тестів і через **`npx @nitra/cursor fix k8s`** для прогону по реальних YAML). JS authoritative; rego — швидкий gate для одиничного маніфеста.
47
23
 
48
- [k8s-policy-manifest](./policy/manifest/manifest.mdc)
49
-
50
- [k8s-policy-base-manifest](./policy/base_manifest/base_manifest.mdc)
51
-
52
- [k8s-policy-base-kustomization](./policy/base_kustomization/base_kustomization.mdc)
53
-
54
- [k8s-policy-gateway](./policy/gateway/gateway.mdc)
55
-
56
- [k8s-policy-hasura-configmap](./policy/hasura_configmap/hasura_configmap.mdc)
57
-
58
- [k8s-policy-hasura-httproute](./policy/hasura_httproute/hasura_httproute.mdc)
59
-
60
- [k8s-policy-hpa-pdb](./policy/hpa_pdb/hpa_pdb.mdc)
61
-
62
- [k8s-policy-kustomization](./policy/kustomization/kustomization.mdc)
63
-
64
- [k8s-policy-network-policy](./policy/network_policy/network_policy.mdc)
65
-
66
- [k8s-policy-svc-yaml](./policy/svc_yaml/svc_yaml.mdc)
67
-
68
- [k8s-policy-svc-hl-yaml](./policy/svc_hl_yaml/svc_hl_yaml.mdc)
@@ -8,5 +8,4 @@ resource: npm/rules/nginx-default-tpl/
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
  Модуль перевіряє задане правило, використовуючи конфігурації, які визначаються у meta.json. При запуску через публічну функцію `run` відбувається оркестрація виконання. Процес включає застосування логіки, що використовує кешування результатів у межах одного прогону. Результат виконання визначає код виходу.
14
12
 
15
13
  ## Поведінка
@@ -7,16 +7,3 @@ alwaysApply: false
7
7
 
8
8
  Правило забезпечує відповідність `default.conf.template` канонічній структурі nginx для фронтенду зі статичними файлами, а також перевіряє пов'язані артефакти: HTTPRoute (k8s), Dockerfile, ini-файли середовищ і VS Code конфігурацію.
9
9
 
10
- [nginx-default-tpl-template-structure](./js/template-structure.mdc)
11
-
12
- [nginx-default-tpl-http-route](./js/http-route.mdc)
13
-
14
- [nginx-default-tpl-dockerfile](./js/dockerfile.mdc)
15
-
16
- [nginx-default-tpl-ini-keys](./js/ini-keys.mdc)
17
-
18
- [nginx-default-tpl-vscode](./js/vscode.mdc)
19
-
20
- [nginx-default-tpl-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
21
-
22
- [nginx-default-tpl-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -8,5 +8,4 @@ resource: npm/rules/npm-module/
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-запити. При запуску як інструмент командного рядка, метод `run` ініціює повний запуск правила. Цей запуск включає завантаження конфігурацій, що спираються на meta.json, застосування білих списків та підбиття підсумків. Модуль є Read-only, тобто не пише у ФС/БД. Кешування даних відбувається в межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль валідує відповідність контракту документації для файлів `.mjs` у сегментах `npm/rules` та `npm/skills`. Він виявляє порушення, якщо для файлу `.mjs` існує відповідний файл `docs/<ім'я>.md`, а його JSDoc-блок містить більше одного непорожнього рядка.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє конфігурації правил, розташованих у каталозі `npm/rules`. Він гарантує, що кожен підкаталог правила містить необхідні файли, включаючи маркери повідомлень (`scripts.mdc`), та коректно структурований конфігураційний файл, що базується на `main.json` та `meta.json`. Перевірка включає валідацію визначених предикатів та експортованих функцій відповідно до очікуваного контракту.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Перевіряє структуру та конфігурацію скілів у каталозі `npm/skills`, використовуючи правила, визначені в `meta.json`. Валідує, що кожен скіл не містить файлу `auto.md`. Перевіряє валідність полів `worktree`, `auto` та `requireRoot` у `main.json` кожного скіла.
14
12
 
15
13
  ## Поведінка
@@ -7,17 +7,9 @@ version: '1.14'
7
7
 
8
8
  Bun monorepo: workspace **`npm/`**, кореневий **`package.json`**, **`.github/workflows/`**; опційно **`demo/`**.
9
9
 
10
- [npm-module-package_structure](./js/package_structure.mdc)
11
-
12
- [npm-module-rule_meta](./js/rule_meta.mdc)
13
-
14
- [npm-module-skill_meta](./js/skill_meta.mdc)
15
-
16
- [npm-module-header_doc_pointer](./js/header_doc_pointer.mdc)
17
-
18
10
  ## Версія та CHANGELOG
19
11
 
20
- Версію (`version` у **`npm/package.json`**) і **`npm/CHANGELOG.md`** **не редагуй вручну** — навіть для hotfix. Єдиний артефакт зміни — **change-файл** (`npx @nitra/cursor change --bump <major|minor|patch> --section <Added|Changed|Fixed|Removed> --message "<…>"`); bump `version` і генерацію секції CHANGELOG робить `n-cursor release` у CI на `main`. Будь-який ручний bump `version` поза CI завалює `check changelog` — навіть із change-файлом.
12
+ Версію (`version` у **`npm/package.json`**) і **`npm/CHANGELOG.md`** **не редагуй вручну** — навіть для hotfix. Єдиний артефакт зміни — **change-файл** (`npx @7n/n ch [--bump <major|minor|patch>] [--section <Added|Changed|Fixed|Removed>] [--message "<…>"]`); bump `version` і генерацію секції CHANGELOG робить `n-cursor release` у CI на `main`. Будь-який ручний bump `version` поза CI завалює `check changelog` — навіть із change-файлом.
21
13
 
22
14
  Повна модель (база порівняння, інверсія шляхів, формат CHANGELOG, post-release-інваріант «верхня секція CHANGELOG == `version`») — у **`n-changelog.mdc`** (джерело істини). Це правило їй підпорядковане й власних інструкцій bump/CHANGELOG не дублює.
23
15
 
@@ -25,10 +17,4 @@ Bun monorepo: workspace **`npm/`**, кореневий **`package.json`**, **`.g
25
17
 
26
18
  Rego-пакети (запускаються через `npx @nitra/cursor fix`):
27
19
 
28
- [npm-module-npm_package_json](./policy/npm_package_json/npm_package_json.mdc)
29
-
30
- [npm-module-root_package_json](./policy/root_package_json/root_package_json.mdc)
31
-
32
- [npm-module-emit_types_config](./policy/emit_types_config/emit_types_config.mdc)
33
-
34
20
  - `npm_module.npm_publish_yml` — template-driven перевірка `.github/workflows/npm-publish.yml` (deep-subset: усі обовʼязкові поля й кроки з канонічного сніпету).
@@ -8,5 +8,4 @@ resource: npm/rules/php/
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
  Скрипт виконує перевірку коду відповідно до правила `php.mdc`. Він запускає `composer audit` для перевірки залежностей, а також, якщо встановлені, виконує PHPStan, Psalm, PHP-CS-Fixer (у режимі dry-run) та PHPCS зі стандартом Security. Робота скрипта ґрунтується на конфігурації, визначеній у `composer.json`. Скрипт пропускає запуск інструменту, якщо відповідний виконуваний файл відсутній у `vendor/bin/`. Якщо `composer.json` відсутній у корені, інструменти не запускаються.
14
12
 
15
13
  ## Поведінка
@@ -8,5 +8,4 @@ resource: npm/rules/php/js/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
- | [lint.mjs](lint.md) | JS Module |
12
11
  | [tooling.mjs](tooling.md) | JS Module |
@@ -5,12 +5,4 @@ globs: "**/*.php"
5
5
  alwaysApply: false
6
6
  ---
7
7
 
8
- Весь код повинен відповідати PHP 8.5 (PHPCompatibility + Rector). Лінт запускається через `n-cursor lint php`.
9
-
10
- [php-tooling](./js/tooling.mdc)
11
-
12
- [php-lint_php_yml](./js/lint_php_yml.mdc)
13
-
14
- ## Швидкий gate через conftest
15
-
16
- [php-lint_php_yml](./policy/lint_php_yml/lint_php_yml.mdc)
8
+ Весь код повинен відповідати PHP 8.5 (PHPCompatibility + Rector). Лінт запускається через `n-cursor lint php`.
@@ -8,5 +8,4 @@ resource: npm/rules/python/
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
  Реалізує логіку запуску `lint-python` за правилом `python.mdc` на базі [uv](https://docs.astral.sh/uv/). Якщо `pyproject.toml` у корені відсутній, процес завершується з кодом виходу 0. Якщо файл присутній, але інструмент `uv` не знайдено в PATH, це розглядається як помилка. Обов'язкові кроки включають перевірку актуальності lock-файлу (`uv lock --check`) та синхронізацію середовища (`uv sync --frozen`). Опційні лінтери (`ruff`, `mypy`) запускаються лише за умови їх доступності через `uv run`. `ruff` виконується у режимі автоматичного виправлення (`--fix`) для мутації робочого дерева та для форматування. Цей підхід відповідає канону патерну `lint-*` (серіалізація через `runStandardLint`, без прямого `withLock`).
14
12
 
15
13
  ## Поведінка
@@ -9,5 +9,4 @@ resource: npm/rules/python/js/
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
11
  | [applies.mjs](applies.md) | JS Module |
12
- | [lint.mjs](lint.md) | JS Module |
13
12
  | [tooling.mjs](tooling.md) | JS Module |
@@ -5,16 +5,4 @@ alwaysApply: false
5
5
  version: '1.0'
6
6
  ---
7
7
 
8
- Python-проєкти ведуться **виключно** на [uv](https://docs.astral.sh/uv/) — єдиний пакет-менеджер і резолвер. **Poetry заборонено.** Середовище: `uv sync --frozen` (строго з `uv.lock`).
9
-
10
- [python-pyproject_toml](./js/pyproject_toml.mdc)
11
-
12
- [python-lint_python_yml](./js/lint_python_yml.mdc)
13
-
14
- [python-tooling](./js/tooling.mdc)
15
-
16
- ## Швидкий gate через conftest (Rego)
17
-
18
- [python-pyproject_toml-policy](./policy/pyproject_toml/pyproject_toml.mdc)
19
-
20
- [python-lint_python_yml-policy](./policy/lint_python_yml/lint_python_yml.mdc)
8
+ Python-проєкти ведуться **виключно** на [uv](https://docs.astral.sh/uv/) — єдиний пакет-менеджер і резолвер. **Poetry заборонено.** Середовище: `uv sync --frozen` (строго з `uv.lock`).
@@ -8,5 +8,4 @@ resource: npm/rules/rego/
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
  Файл реалізує конвеєр для лінтування Rego-полісів, що знаходяться у каталозі `npm/rules/` (де живуть Rego-полісі пакета `@nitra/cursor`). Конвеєр послідовно виконує три етапи перевірки: строгу компіляцію за допомогою `opa check --strict`, яка виявляє помилки компіляції, незадекларовані змінні та інші проблеми, які ігнорує `regal`; статичне лінтування за допомогою `regal lint` (згідно з https://docs.styra.com/regal), що перевіряє відповідність стилю та ідіоматичності Rego v1; та опціональний запуск юніт-тестів за допомогою `conftest verify` (як описано на https://www.conftest.dev/install/). Резолюція інструментів (`opa`, `regal`) здійснюється через механізм `ensureTool`, що забезпечує їх доступність у середовищі. Усі операції керуються конфігурацією, визначеною у `target.json`.
14
12
 
15
13
  ## Поведінка
@@ -9,4 +9,4 @@ resource: npm/rules/rego/js/
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
11
  | [applies.mjs](applies.md) | JS Module |
12
- | [lint.mjs](lint.md) | JS Module |
12
+ | [tooling.mjs](tooling.md) | JS Module |
@@ -0,0 +1,26 @@
1
+ ---
2
+ type: JS Module
3
+ title: tooling.mjs
4
+ resource: npm/rules/rego/js/tooling.mjs
5
+ docgen:
6
+ crc: 4c098cd0
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ Перевіряє наявність конфігураційного файлу `.regal/config.yaml` у корені проєкту. Ця функція визначає можливість подальшої ініціалізації системи. У разі відсутності файлу, повертає повідомлення, що вимагає створення конфігураційного файлу (rego.mdc).
12
+
13
+ ## Поведінка
14
+
15
+ 1. Викликає перевірку на наявність файлу `.regal/config.yaml` у корені проєкту.
16
+ 2. Якщо файл `.regal/config.yaml` існує, повідомляє про успіх (rego.mdc).
17
+ 3. Якщо файл `.regal/config.yaml` не існує, повідомляє про помилку та рекомендує створити його у корені проєкту (rego.mdc).
18
+ 4. Повертає код виходу, що відображає загальний статус перевірки.
19
+
20
+ ## Публічний API
21
+
22
+ check — констатує наявність файлу `.regal/config.yaml` у корені проєкту (rego.mdc).
23
+
24
+ ## Гарантії поведінки
25
+
26
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,14 @@
1
+ ## Rego tooling: `.regal/config.yaml`
2
+
3
+ У корені проєкту **має бути** файл `.regal/config.yaml` — конфіг лінтера [regal](https://docs.styra.com/regal).
4
+
5
+ Мінімальний приклад (вимикає `no-defined-entrypoint` для conftest-полісі):
6
+
7
+ ```yaml title=".regal/config.yaml"
8
+ rules:
9
+ idiomatic:
10
+ no-defined-entrypoint:
11
+ level: ignore
12
+ ```
13
+
14
+ `regal lint` запускається через `n-cursor lint rego`; без `.regal/config.yaml` regal використовує дефолти і може помилково флагувати conftest `deny`-правила як entrypoint-порушення.
@@ -0,0 +1,24 @@
1
+ /** @see ./docs/tooling.md */
2
+ import { existsSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+
5
+ import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
6
+
7
+ /**
8
+ * Перевіряє наявність `.regal/config.yaml` у корені проєкту.
9
+ * @param {string} [cwd] корінь репозиторію
10
+ * @returns {Promise<number>} 0 — все OK, 1 — є проблеми
11
+ */
12
+ export async function check(cwd = process.cwd()) {
13
+ const reporter = createCheckReporter()
14
+ const { pass, fail } = reporter
15
+
16
+ const regalConfig = join(cwd, '.regal', 'config.yaml')
17
+ if (existsSync(regalConfig)) {
18
+ pass('.regal/config.yaml існує (rego.mdc)')
19
+ } else {
20
+ fail('.regal/config.yaml не існує — створи у корені проєкту (rego.mdc)')
21
+ }
22
+
23
+ return reporter.getExitCode()
24
+ }
@@ -9,8 +9,6 @@ alwaysApply: false
9
9
 
10
10
  Синтаксичні правила (`rego.v1`, `import rego.v1`, заборона legacy v0) — у `conftest.mdc` (alwaysApply). Цей файл — про **інструментарій**: VS Code, лінтери, форматування.
11
11
 
12
- [rego-rego-lint](./js/rego-lint.mdc)
13
-
14
12
  ## Швидкий gate через conftest
15
13
 
16
14
  | Пакет | Ціль | Що перевіряє |
@@ -18,10 +16,3 @@ alwaysApply: false
18
16
  | `rego.vscode_extensions` | `.vscode/extensions.json` | `recommendations` містить `tsandall.opa` |
19
17
  | `rego.vscode_settings` | `.vscode/settings.json` | `[rego]`-блок з `defaultFormatter` + `formatOnSave` |
20
18
 
21
- [rego-vscode_extensions](./js/vscode_extensions.mdc)
22
-
23
- [rego-vscode_settings](./js/vscode_settings.mdc)
24
-
25
- [rego-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
26
-
27
- [rego-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -0,0 +1,12 @@
1
+ ## Rego-gate: `opa` та `regal` заборонені у `package.json`
2
+
3
+ Rego-пакет: `rego.package_json`
4
+
5
+ Цільовий файл: `package.json`
6
+
7
+ `opa` і `regal` — це CLI-тули Rego-екосистеми. Вони **не є npm-пакетами** і **не додаються** у `dependencies`, `devDependencies` або `peerDependencies`. Їх встановлюють:
8
+
9
+ - **локально** — через [Homebrew](https://brew.sh/) / системний пакетний менеджер або вручну в PATH;
10
+ - **у CI** — через крок з GitHub-action або аналог.
11
+
12
+ Gate видає deny, якщо `opa` або `regal` з'являється у будь-якій секції залежностей `package.json`.
@@ -0,0 +1,21 @@
1
+ # Перевірка `package.json` (rego.mdc / rego-lint.mdc).
2
+ #
3
+ # `opa` і `regal` не додаються у dependencies / devDependencies — вони мають бути
4
+ # лише у PATH (встановлені глобально або через CI-крок). Rego-лінт запускається
5
+ # через `n-cursor lint rego`, а не через package.json-залежності.
6
+ package rego.package_json
7
+
8
+ import rego.v1
9
+
10
+ banned_opa_tools := {"opa", "regal"}
11
+
12
+ deny contains msg if {
13
+ some field in {"dependencies", "devDependencies", "peerDependencies"}
14
+ deps := object.get(input, field, {})
15
+ some name, _ in deps
16
+ name in banned_opa_tools
17
+ msg := sprintf(
18
+ "package.json: %s.%s заборонений — opa/regal встановлюються глобально або через CI, не через npm (rego.mdc)",
19
+ [field, name]
20
+ )
21
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json", "required": false }
4
+ }
@@ -9,6 +9,5 @@ resource: npm/rules/release/
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
11
  | [change.mjs](change.md) | JS Module |
12
- | [fix.mjs](fix.md) | JS Module |
13
12
  | [main.mjs](main.md) | JS Module |
14
13
  | [release.mjs](release.md) | JS Module |
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль забезпечує оркестрацію та виконання набору правил. При запуску як CLI ініціює повну оркестрацію правил. Як частина процесу, викликає публічну функцію `run` для виконання стандартного правила у контексті поточної директорії. Результат виконання цього правила визначає код виходу процесу. Модуль не модифікує файлову систему чи бази даних. Результати виконання правил кешуються протягом одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -1,10 +1,10 @@
1
1
  ---
2
- description: n-cursor release та n-cursor change — автоматичний version-bump і CHANGELOG із change-файлів
2
+ description: n-cursor release та @7n/n ch — автоматичний version-bump і CHANGELOG із change-файлів
3
3
  version: '1.0'
4
4
  globs: "**/package.json,**/pyproject.toml,**/CHANGELOG.md,**/.changes/*.md"
5
5
  alwaysApply: false
6
6
  ---
7
7
 
8
- Версія та CHANGELOG **не редагуються вручну**. Єдиний артефакт зміни — **change-файл** (`npx @nitra/cursor change --bump <major|minor|patch> --section <Added|Changed|Fixed|Removed> --message "<…>"`). Bump `version` і генерацію секції CHANGELOG виконує `n-cursor release` у CI на `main`.
8
+ Версія та CHANGELOG **не редагуються вручну**. Єдиний артефакт зміни — **change-файл** (`npx @7n/n ch [--bump <major|minor|patch>] [--section <Added|Changed|Fixed|Removed>] [--message "<…>"]`). Bump `version` і генерацію секції CHANGELOG виконує `n-cursor release` у CI на `main`.
9
9
 
10
10
  Детальна модель (база порівняння, формат CHANGELOG, post-release-інваріант) — у `n-changelog.mdc`.
@@ -8,5 +8,4 @@ resource: npm/rules/rust/
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
  Модуль надає інструменти для забезпечення якості коду Rust. Він дозволяє виконати перевірку коду на відповідність заданим Lint-правилам або запустити повну оркестрацію форматування та аналізу коду через `cargo`. Функціонал реалізується через публічні функції `run` та `lint`.
14
12
 
15
13
  ## Поведінка
@@ -9,4 +9,3 @@ resource: npm/rules/rust/js/
9
9
  | Файл | Тип |
10
10
  | ------------------------- | --------- |
11
11
  | [applies.mjs](applies.md) | JS Module |
12
- | [lint.mjs](lint.md) | JS Module |
@@ -5,14 +5,4 @@ alwaysApply: false
5
5
  version: '1.4'
6
6
  ---
7
7
 
8
- Правило забезпечує форматування (rustfmt), лінт (clippy), CI workflow та покриття для Rust-проєктів.
9
-
10
- [rust-lint](./js/lint.mdc)
11
- [rust-vscode_extensions](./js/vscode_extensions.mdc)
12
- [rust-tauri_composition](./js/tauri_composition.mdc)
13
- [rust-coverage](./js/coverage.mdc)
14
-
15
- ## Швидкий gate через conftest
16
-
17
- [rust-lint_rust_yml](./policy/lint_rust_yml/lint_rust_yml.mdc)
18
- [rust-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
8
+ Правило забезпечує форматування (rustfmt), лінт (clippy), CI workflow та покриття для Rust-проєктів.
@@ -48,6 +48,30 @@ deny contains msg if {
48
48
  msg := sprintf("lint-rust.yml: жоден крок run не містить %q (rust.mdc)", [expected_run])
49
49
  }
50
50
 
51
+ # Крок dtolnay/rust-toolchain@stable має мати with.components з rustfmt і clippy.
52
+ toolchain_step(step) if {
53
+ uses := object.get(step, "uses", "")
54
+ startswith(uses, "dtolnay/rust-toolchain@")
55
+ }
56
+
57
+ deny contains msg if {
58
+ some job in object.get(input, "jobs", {})
59
+ some step in object.get(job, "steps", [])
60
+ toolchain_step(step)
61
+ components := object.get(object.get(step, "with", {}), "components", "")
62
+ not contains(components, "rustfmt")
63
+ msg := "lint-rust.yml: dtolnay/rust-toolchain step потребує with.components: rustfmt, clippy (rust.mdc)"
64
+ }
65
+
66
+ deny contains msg if {
67
+ some job in object.get(input, "jobs", {})
68
+ some step in object.get(job, "steps", [])
69
+ toolchain_step(step)
70
+ components := object.get(object.get(step, "with", {}), "components", "")
71
+ not contains(components, "clippy")
72
+ msg := "lint-rust.yml: dtolnay/rust-toolchain step потребує with.components: rustfmt, clippy (rust.mdc)"
73
+ }
74
+
51
75
  step_run_to_text(step) := step.run if is_string(step.run)
52
76
 
53
77
  else := concat("\n", [s | some s in step.run]) if is_array(step.run)