@nitra/cursor 1.13.82 → 1.13.84

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 (148) hide show
  1. package/.claude-template/commands/n-check.md +2 -2
  2. package/CHANGELOG.md +59 -26
  3. package/README.md +11 -11
  4. package/bin/n-cursor.js +38 -67
  5. package/package.json +1 -1
  6. package/rules/abie/abie.mdc +9 -9
  7. package/rules/abie/fix.mjs +19 -0
  8. package/rules/abie/policy/base_deployment_preem/base_deployment_preem.rego +2 -2
  9. package/rules/abie/policy/health_check_policy/health_check_policy.rego +2 -2
  10. package/rules/abie/policy/http_route_base/http_route_base.rego +1 -1
  11. package/rules/abie/utils/k8s-tree.mjs +1 -1
  12. package/rules/adr/adr.mdc +1 -1
  13. package/rules/adr/fix.mjs +19 -0
  14. package/rules/adr/{fix → js}/hooks/check.mjs +1 -1
  15. package/rules/bun/bun.mdc +1 -1
  16. package/rules/bun/fix.mjs +19 -0
  17. package/rules/bun/{fix → js}/layout/check.mjs +1 -1
  18. package/rules/capacitor/fix.mjs +19 -0
  19. package/rules/capacitor/policy/package_json/package_json.rego +3 -3
  20. package/rules/changelog/changelog.mdc +2 -2
  21. package/rules/changelog/fix.mjs +19 -0
  22. package/rules/ci4/ci4.mdc +1 -1
  23. package/rules/ci4/fix.mjs +19 -0
  24. package/rules/docker/docker.mdc +7 -7
  25. package/rules/docker/fix.mjs +19 -0
  26. package/rules/docker/lint/lint.mjs +2 -2
  27. package/rules/docker/policy/package_json/package_json.rego +1 -1
  28. package/rules/efes/efes.mdc +1 -1
  29. package/rules/efes/fix.mjs +19 -0
  30. package/rules/feedback/feedback.mdc +2 -2
  31. package/rules/feedback/fix.mjs +19 -0
  32. package/rules/ga/fix.mjs +19 -0
  33. package/rules/ga/lint/lint.mjs +6 -6
  34. package/rules/ga/policy/workflow_common/workflow_common.rego +1 -1
  35. package/rules/graphql/fix.mjs +19 -0
  36. package/rules/graphql/{fix → js}/tooling/graphql-gql-scan.mjs +1 -1
  37. package/rules/graphql/policy/vscode_extensions/vscode_extensions.rego +2 -2
  38. package/rules/hasura/fix.mjs +19 -0
  39. package/rules/hasura/policy/svc_hl/svc_hl.rego +1 -1
  40. package/rules/image-avif/fix.mjs +19 -0
  41. package/rules/image-avif/image-avif.mdc +1 -1
  42. package/rules/image-avif/{fix → js}/avif_generation/check.mjs +1 -1
  43. package/rules/image-compress/fix.mjs +19 -0
  44. package/rules/image-compress/{fix → js}/package_setup/check.mjs +1 -1
  45. package/rules/js-bun-db/fix.mjs +19 -0
  46. package/rules/js-bun-redis/fix.mjs +19 -0
  47. package/rules/js-bun-redis/policy/package_json/package_json.rego +1 -1
  48. package/rules/js-lint/fix.mjs +19 -0
  49. package/rules/js-lint/{fix → js}/tooling/check.mjs +5 -5
  50. package/rules/js-lint/{fix → js}/tooling/rebuild-oxlint-canonical.mjs +1 -1
  51. package/rules/js-lint/js-lint.mdc +3 -3
  52. package/rules/js-mssql/fix.mjs +19 -0
  53. package/rules/js-mssql/policy/package_json/package_json.rego +2 -2
  54. package/rules/js-run/fix.mjs +19 -0
  55. package/rules/js-run/{fix → js}/runtime/check.mjs +3 -3
  56. package/rules/k8s/fix.mjs +19 -0
  57. package/rules/k8s/{fix → js}/manifests/check.mjs +1 -1
  58. package/rules/k8s/k8s.mdc +13 -13
  59. package/rules/k8s/lint/lint.mjs +2 -2
  60. package/rules/k8s/policy/base_kustomization/base_kustomization.rego +3 -3
  61. package/rules/k8s/policy/base_manifest/base_manifest.rego +2 -2
  62. package/rules/k8s/policy/gateway/gateway.rego +2 -2
  63. package/rules/k8s/policy/hasura_configmap/hasura_configmap.rego +3 -3
  64. package/rules/k8s/policy/hasura_httproute/hasura_httproute.rego +1 -1
  65. package/rules/k8s/policy/hpa_pdb/hpa_pdb.rego +1 -1
  66. package/rules/k8s/policy/kustomization/kustomization.rego +2 -2
  67. package/rules/k8s/policy/manifest/manifest.rego +4 -4
  68. package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.rego +2 -2
  69. package/rules/k8s/policy/svc_yaml/svc_yaml.rego +2 -2
  70. package/rules/nginx-default-tpl/fix.mjs +19 -0
  71. package/rules/nginx-default-tpl/{fix → js}/template/check.mjs +1 -1
  72. package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.rego +2 -2
  73. package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.rego +1 -1
  74. package/rules/npm-module/fix.mjs +19 -0
  75. package/rules/npm-module/{fix → js}/package_structure/check.mjs +3 -3
  76. package/rules/php/fix.mjs +19 -0
  77. package/rules/php/{fix → js}/tooling/check.mjs +2 -2
  78. package/rules/rego/fix.mjs +19 -0
  79. package/rules/security/fix.mjs +19 -0
  80. package/rules/security/security.mdc +3 -3
  81. package/rules/style-lint/fix.mjs +19 -0
  82. package/rules/style-lint/{fix → js}/tooling/check.mjs +2 -2
  83. package/rules/tauri/fix.mjs +19 -0
  84. package/rules/tauri/{fix → js}/tooling/check.mjs +1 -1
  85. package/rules/tauri/policy/vscode_extensions/vscode_extensions.rego +2 -2
  86. package/rules/test/fix.mjs +19 -0
  87. package/rules/test/test.mdc +2 -2
  88. package/rules/text/fix.mjs +19 -0
  89. package/rules/text/{fix → js}/formatting/check.mjs +2 -2
  90. package/rules/text/text.mdc +1 -1
  91. package/rules/vue/fix.mjs +19 -0
  92. package/rules/vue/{fix → js}/packages/check.mjs +1 -1
  93. package/rules/vue/policy/package_json/package_json.rego +1 -1
  94. package/rules/vue/vue.mdc +1 -1
  95. package/schemas/n-cursor.json +1 -1
  96. package/scripts/auto-rules.mjs +3 -3
  97. package/scripts/build-agents-commands.mjs +1 -1
  98. package/scripts/claude-stop-hook.mjs +1 -1
  99. package/scripts/sync-claude-config.mjs +2 -2
  100. package/scripts/utils/ast-scan-utils.mjs +3 -3
  101. package/scripts/utils/discover-check-rules-from-cursor.mjs +1 -1
  102. package/scripts/utils/discover-checkable-rules.mjs +30 -18
  103. package/scripts/utils/list-rule-ids.mjs +23 -0
  104. package/scripts/utils/read-n-cursor-config-lite.mjs +59 -0
  105. package/scripts/utils/run-rule-cli.mjs +37 -0
  106. package/scripts/utils/run-rule.mjs +7 -7
  107. package/scripts/utils/run-standard-rule.mjs +34 -0
  108. package/scripts/utils/walk-cache.mjs +24 -0
  109. package/scripts/utils/workspaces.mjs +1 -1
  110. package/skills/fix/SKILL.md +5 -5
  111. package/skills/lint/SKILL.md +1 -1
  112. /package/rules/abie/{fix → js}/applies/check.mjs +0 -0
  113. /package/rules/abie/{fix → js}/env_dns/check.mjs +0 -0
  114. /package/rules/abie/{fix → js}/firebase_hosting/check.mjs +0 -0
  115. /package/rules/abie/{fix → js}/hc_pairing/check.mjs +0 -0
  116. /package/rules/abie/{fix → js}/ua_http_route/check.mjs +0 -0
  117. /package/rules/abie/{fix → js}/ua_node_selector/check.mjs +0 -0
  118. /package/rules/adr/{fix → js}/hooks/template/.gitignore.snippet +0 -0
  119. /package/rules/capacitor/{fix → js}/platforms/check.mjs +0 -0
  120. /package/rules/changelog/{fix → js}/consistency/check.mjs +0 -0
  121. /package/rules/changelog/{fix → js}/consistency/package-manifest.mjs +0 -0
  122. /package/rules/docker/{fix → js}/lint/check.mjs +0 -0
  123. /package/rules/docker/{fix → js}/lint/docker-hadolint.mjs +0 -0
  124. /package/rules/docker/{fix → js}/lint/docker-mirror.mjs +0 -0
  125. /package/rules/ga/{fix → js}/workflows/check.mjs +0 -0
  126. /package/rules/graphql/{fix → js}/tooling/check.mjs +0 -0
  127. /package/rules/hasura/{fix → js}/internal_urls/check.mjs +0 -0
  128. /package/rules/js-bun-db/{fix → js}/safety/bun-sql-scan.mjs +0 -0
  129. /package/rules/js-bun-db/{fix → js}/safety/check.mjs +0 -0
  130. /package/rules/js-bun-redis/{fix → js}/imports/check.mjs +0 -0
  131. /package/rules/js-lint/{fix → js}/tooling/knip-canonical.json +0 -0
  132. /package/rules/js-lint/{fix → js}/tooling/oxlint-canonical-skeleton.json +0 -0
  133. /package/rules/js-lint/{fix → js}/tooling/oxlint-canonical.json +0 -0
  134. /package/rules/js-lint/{fix → js}/tooling/oxlint-rules.tsv +0 -0
  135. /package/rules/js-mssql/{fix → js}/deps/check.mjs +0 -0
  136. /package/rules/js-mssql/{fix → js}/deps/mssql-pool-scan.mjs +0 -0
  137. /package/rules/js-run/{fix → js}/runtime/bunyan-imports.mjs +0 -0
  138. /package/rules/js-run/{fix → js}/runtime/check-env-scan.mjs +0 -0
  139. /package/rules/js-run/{fix → js}/runtime/conn-file-rules.mjs +0 -0
  140. /package/rules/js-run/{fix → js}/runtime/conn-imports-scan.mjs +0 -0
  141. /package/rules/js-run/{fix → js}/runtime/promise-settimeout-scan.mjs +0 -0
  142. /package/rules/k8s/{fix → js}/kubescape_exceptions/template/.kubescape-exceptions.json.snippet.json +0 -0
  143. /package/rules/rego/{fix → js}/applies/check.mjs +0 -0
  144. /package/rules/security/{fix → js}/sample_secret/check.mjs +0 -0
  145. /package/rules/security/{fix → js}/trufflehog/check.mjs +0 -0
  146. /package/rules/security/{fix → js}/trufflehog/template/.trufflehog-exclude.snippet.txt +0 -0
  147. /package/rules/test/{fix → js}/location/check.mjs +0 -0
  148. /package/rules/vue/{fix → js}/packages/vue-forbidden-imports.mjs +0 -0
@@ -1,5 +1,5 @@
1
1
  # Порт перевірки ConfigMap для Hasura-Deployment з
2
- # `npm/scripts/check-k8s.mjs` (k8s.mdc): у ConfigMap, що сусідствує з
2
+ # `npm/scripts/rules/k8s/fix.mjs` (k8s.mdc): у ConfigMap, що сусідствує з
3
3
  # Hasura-Deployment, у `data` обов'язково має бути ключ
4
4
  # `HASURA_GRAPHQL_ENABLE_REMOTE_SCHEMA_PERMISSIONS` зі значенням `"true"`.
5
5
  #
@@ -8,7 +8,7 @@
8
8
  # -p npm/policy/k8s/hasura_configmap \
9
9
  # --namespace k8s.hasura_configmap
10
10
  #
11
- # Прив'язка ConfigMap-Deployment cross-file — у JS (`check-k8s.mjs`:
11
+ # Прив'язка ConfigMap-Deployment cross-file — у JS (`rules/k8s/fix.mjs`:
12
12
  # `validateHasuraConfigMapRemoteSchemaPermissions` шукає Hasura-Deployment
13
13
  # у тому ж dir-у і викликає conftest з цією намеспейс лише для відповідних
14
14
  # ConfigMap-ів). JS authoritative (`hasuraConfigMapRemoteSchemaPermissionsViolation`,
@@ -20,7 +20,7 @@ package k8s.hasura_configmap
20
20
 
21
21
  import rego.v1
22
22
 
23
- # Обов'язковий ключ у `data` (узгоджено з `check-k8s.mjs`).
23
+ # Обов'язковий ключ у `data` (узгоджено з `rules/k8s/fix.mjs`).
24
24
  required_key := "HASURA_GRAPHQL_ENABLE_REMOTE_SCHEMA_PERMISSIONS"
25
25
 
26
26
  key_missing_template := concat(" ", [
@@ -1,4 +1,4 @@
1
- # Порт перевірки `httpRouteHasuraCanonViolation` з `npm/scripts/check-k8s.mjs`
1
+ # Порт перевірки `httpRouteHasuraCanonViolation` з `npm/scripts/rules/k8s/fix.mjs`
2
2
  # (k8s.mdc): HTTPRoute, що сусідствує з Hasura-Deployment з тим самим
3
3
  # `metadata.name`, має містити канон з 4 правил у такому порядку:
4
4
  #
@@ -1,5 +1,5 @@
1
1
  # Порт **структурних** пер-документних перевірок HPA та PDB з
2
- # `npm/scripts/check-k8s.mjs` (k8s.mdc). Перевіряє лише ті властивості, що
2
+ # `npm/scripts/rules/k8s/fix.mjs` (k8s.mdc). Перевіряє лише ті властивості, що
3
3
  # не залежать від cross-file контексту (`expectedDeployName`, `expectedAppLabel`,
4
4
  # `isDevLike`-сегмента). Cross-file перевірки лишаються в JS
5
5
  # (`hpaManifestViolations`, `pdbManifestViolations`,
@@ -1,5 +1,5 @@
1
1
  # Порт пер-документних структурних перевірок `kustomization.yaml` з
2
- # `npm/scripts/check-k8s.mjs` (k8s.mdc).
2
+ # `npm/scripts/rules/k8s/fix.mjs` (k8s.mdc).
3
3
  #
4
4
  # Запуск (локально, на одному kustomization.yaml):
5
5
  # conftest test path/to/kustomization.yaml -p npm/policy/k8s/kustomization \
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # JS authoritative: повна резолюція kustomize-дерева, перевірка існування
16
16
  # refs на диску, парність `svc.yaml`/`svc-hl.yaml`, вибір conftest-цілей за
17
- # patternом `kustomization.yaml` — у `check-k8s.mjs`.
17
+ # patternом `kustomization.yaml` — у `rules/k8s/fix.mjs`.
18
18
  #
19
19
  # Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
20
20
  # Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
@@ -1,4 +1,4 @@
1
- # Порт пер-документних структурних перевірок з `npm/scripts/check-k8s.mjs`
1
+ # Порт пер-документних структурних перевірок з `npm/scripts/rules/k8s/fix.mjs`
2
2
  # (k8s.mdc). Цей пакет описує лише ті правила, що дивляться на ОДИН манифест
3
3
  # (один YAML-документ): conftest за замовчуванням розрізає файли по `---` і
4
4
  # запускає policy на кожен документ окремо.
@@ -24,8 +24,8 @@
24
24
  # CROSS-FILE логіка (Kustomize-резолюція ресурсів, парність svc.yaml/svc-hl.yaml,
25
25
  # HPA/PDB/topologySpreadConstraints за каталогом, BackendConfig-сепарація,
26
26
  # yaml-language-server schema modeline, namespace-перевірки за деревом
27
- # `…/k8s/base/`) лишається у `check-k8s.mjs`: вона потребує файлової системи.
28
- # JS authoritative (`check-k8s.mjs` робить ці ж пер-документні перевірки в ширшому
27
+ # `…/k8s/base/`) лишається у `rules/k8s/fix.mjs`: вона потребує файлової системи.
28
+ # JS authoritative (`rules/k8s/fix.mjs` робить ці ж пер-документні перевірки в ширшому
29
29
  # контексті); ця Rego — швидкий gate для одиничного маніфеста.
30
30
  #
31
31
  # Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
@@ -45,7 +45,7 @@ forbidden_service_annotations := {
45
45
  }
46
46
 
47
47
  # Дозволені посилання на образ `hasura/graphql-engine` (узгоджено з
48
- # `HASURA_GRAPHQL_ENGINE_IMAGE` у `check-k8s.mjs`). Зараз — один канонічний тег
48
+ # `HASURA_GRAPHQL_ENGINE_IMAGE` у `rules/k8s/fix.mjs`). Зараз — один канонічний тег
49
49
  # у двох варіантах префіксу (із `docker.io/` і без). Digest (`@sha256:…`)
50
50
  # відрізається перед звіркою.
51
51
  allowed_hasura_images := {
@@ -1,12 +1,12 @@
1
1
  # Порт пер-документної структурної перевірки `svc-hl.yaml` з
2
- # `npm/scripts/check-k8s.mjs` (k8s.mdc): headless Service з суфіксом
2
+ # `npm/scripts/rules/k8s/fix.mjs` (k8s.mdc): headless Service з суфіксом
3
3
  # `metadata.name` `-hl` і `spec.clusterIP: None`.
4
4
  #
5
5
  # Запуск (локально, лише для одного svc-hl.yaml):
6
6
  # conftest test path/to/k8s/.../svc-hl.yaml -p npm/policy/k8s/svc_hl_yaml \
7
7
  # --namespace k8s.svc_hl_yaml
8
8
  #
9
- # JS authoritative (`check-k8s.mjs`: `serviceSvcHlYamlHeadlessViolation`,
9
+ # JS authoritative (`rules/k8s/fix.mjs`: `serviceSvcHlYamlHeadlessViolation`,
10
10
  # вибір файла `svc-hl.yaml` через walk).
11
11
  #
12
12
  # Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
@@ -1,12 +1,12 @@
1
1
  # Порт пер-документної структурної перевірки `svc.yaml` з
2
- # `npm/scripts/check-k8s.mjs` (k8s.mdc): `Service` у файлі `svc.yaml` має
2
+ # `npm/scripts/rules/k8s/fix.mjs` (k8s.mdc): `Service` у файлі `svc.yaml` має
3
3
  # мати `spec.type: ClusterIP`.
4
4
  #
5
5
  # Запуск (локально, лише для одного svc.yaml):
6
6
  # conftest test path/to/k8s/.../svc.yaml -p npm/policy/k8s/svc_yaml \
7
7
  # --namespace k8s.svc_yaml
8
8
  #
9
- # JS authoritative (`check-k8s.mjs`: `serviceSvcYamlClusterIpTypeViolation`,
9
+ # JS authoritative (`rules/k8s/fix.mjs`: `serviceSvcYamlClusterIpTypeViolation`,
10
10
  # вибір файла `svc.yaml` через walk). Цю Rego JS викликає окремою таргет-командою
11
11
  # лише для basename == `svc.yaml`.
12
12
  #
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -17,7 +17,7 @@ import { existsSync } from 'node:fs'
17
17
  import { readdir, readFile, rename, unlink, writeFile } from 'node:fs/promises'
18
18
  import { basename, dirname, join, relative } from 'node:path'
19
19
 
20
- import { findDockerfilePaths } from '../../../docker/fix/lint/check.mjs'
20
+ import { findDockerfilePaths } from '../../../docker/js/lint/check.mjs'
21
21
  import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
22
22
  import { loadCursorIgnorePaths } from '../../../../scripts/utils/load-cursor-config.mjs'
23
23
  import { runConftestBatch } from '../../../../scripts/utils/run-conftest-batch.mjs'
@@ -1,8 +1,8 @@
1
1
  # Перевірка `.vscode/extensions.json` для nginx-default-tpl (nginx-default-tpl.mdc).
2
2
  #
3
- # Викликається з `check-nginx-default-tpl.mjs` через `runConftestBatch` лише
3
+ # Викликається з `rules/nginx-default-tpl/fix.mjs` через `runConftestBatch` лише
4
4
  # ПІСЛЯ того, як JS виявив `default.conf.template` у дереві (умовне правило).
5
- # Глобально без `target.json` поруч (не auto-discoverable через `n-cursor check`).
5
+ # Глобально без `target.json` поруч (не auto-discoverable через `n-cursor fix`).
6
6
  #
7
7
  # Canonical: `recommendations` має містити `ahmadalli.vscode-nginx-conf`.
8
8
  package nginx_default_tpl.vscode_extensions
@@ -1,6 +1,6 @@
1
1
  # Перевірка `.vscode/settings.json` для nginx-default-tpl (nginx-default-tpl.mdc).
2
2
  #
3
- # Викликається з `check-nginx-default-tpl.mjs` через `runConftestBatch` лише
3
+ # Викликається з `rules/nginx-default-tpl/fix.mjs` через `runConftestBatch` лише
4
4
  # ПІСЛЯ того, як JS виявив `default.conf.template`. Без `target.json` поруч
5
5
  # не реєструється.
6
6
  #
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -204,7 +204,7 @@ function checkEmitTypesConfig(passFn, failFn) {
204
204
  )
205
205
  return
206
206
  }
207
- passFn(`${EMIT_TYPES_CONFIG} є (структуру перевіряє npx @nitra/cursor check → npm_module.emit_types_config)`)
207
+ passFn(`${EMIT_TYPES_CONFIG} є (структуру перевіряє npx @nitra/cursor fix → npm_module.emit_types_config)`)
208
208
  }
209
209
 
210
210
  /**
@@ -338,7 +338,7 @@ async function checkDirtyNpmRequiresVersionBump(passFn, failFn) {
338
338
  function checkPublishWorkflow(passFn, failFn) {
339
339
  const publishWf = '.github/workflows/npm-publish.yml'
340
340
  if (existsSync(publishWf)) {
341
- passFn(`${publishWf} є (структуру перевіряє npx @nitra/cursor check → npm_module.npm_publish_yml)`)
341
+ passFn(`${publishWf} є (структуру перевіряє npx @nitra/cursor fix → npm_module.npm_publish_yml)`)
342
342
  } else {
343
343
  failFn(`Відсутній ${publishWf} (npm-module.mdc: npm publish)`)
344
344
  }
@@ -457,7 +457,7 @@ export function findTestFrameworkImport(content, virtualPath) {
457
457
  * Carve-out: для шляху `rules/<rule-name>/...` сегмент `<rule-name>` (індекс 1)
458
458
  * — це ім'я правила, а не каталог. Зокрема, правило з id `test` (або `tests`)
459
459
  * описує конвенцію розміщення тестів і саме по собі не є test-fixture'ом.
460
- * Подальші сегменти (наприклад, `rules/<r>/fix/<c>/tests/`) продовжують перевірятись.
460
+ * Подальші сегменти (наприклад, `rules/<r>/js/<c>/tests/`) продовжують перевірятись.
461
461
  * @param {string} relPath posix-шлях відносно `npm/`
462
462
  * @returns {Promise<string | null>} причина порушення або `null`
463
463
  */
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -28,14 +28,14 @@ export function check() {
28
28
  }
29
29
 
30
30
  if (existsSync('package.json')) {
31
- pass('package.json є (наявність lint-php перевіряє npx @nitra/cursor check → php.package_json)')
31
+ pass('package.json є (наявність lint-php перевіряє npx @nitra/cursor fix → php.package_json)')
32
32
  } else {
33
33
  fail('package.json не знайдено в корені — додай (php.mdc)')
34
34
  }
35
35
 
36
36
  const wfPath = '.github/workflows/lint-php.yml'
37
37
  if (existsSync(wfPath)) {
38
- pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor check → php.lint_php_yml)`)
38
+ pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor fix → php.lint_php_yml)`)
39
39
  } else {
40
40
  fail(`${wfPath} не існує — створи згідно php.mdc`)
41
41
  }
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -24,7 +24,7 @@ version: '2.1'
24
24
 
25
25
  ## `.trufflehog-exclude` (рекомендована основа)
26
26
 
27
- Канон (допускає розширення): [.trufflehog-exclude.snippet.txt](./fix/trufflehog/template/.trufflehog-exclude.snippet.txt)
27
+ Канон (допускає розширення): [.trufflehog-exclude.snippet.txt](./js/trufflehog/template/.trufflehog-exclude.snippet.txt)
28
28
 
29
29
  **Важливо:** один regex-pattern на рядок, без TOML-обгортки; коментарі починаються з `#`.
30
30
 
@@ -45,8 +45,8 @@ Workflow обовʼязковий — забезпечує незалежний
45
45
  - Правильно: `DB_PASSWORD=sample-secret`, `password: "sample-secret"`
46
46
  - Неправильно: `DB_PASSWORD=secret`, `password: "secret"`
47
47
 
48
- Перевіряється лише `secret` у позиції значення (після `=`, `:`, `=>`); імена ключів на кшталт `client_secret` не чіпаються. Concern `security.sample_secret` — деталі скану в `fix/sample_secret/check.mjs`.
48
+ Перевіряється лише `secret` у позиції значення (після `=`, `:`, `=>`); імена ключів на кшталт `client_secret` не чіпаються. Concern `security.sample_secret` — деталі скану в `js/sample_secret/check.mjs`.
49
49
 
50
50
  ## Перевірка
51
51
 
52
- `npx @nitra/cursor check security`
52
+ `npx @nitra/cursor fix security`
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -44,7 +44,7 @@ async function checkStylelintConfigPresence(reporter) {
44
44
  // `.vscode/extensions.json` (`stylelint.vscode-stylelint`) і `.vscode/settings.json`
45
45
  // (`css.validate`/`scss.validate`/`less.validate: false`) — у rego-пакетах
46
46
  // `style_lint.vscode_extensions` і `style_lint.vscode_settings`, прогоняє
47
- // `npx @nitra/cursor check`. JS-копії видалено, щоб не було двох джерел істини.
47
+ // `npx @nitra/cursor fix`. JS-копії видалено, щоб не було двох джерел істини.
48
48
 
49
49
  /**
50
50
  * Перевіряє відповідність проєкту правилам style-lint.mdc
@@ -64,7 +64,7 @@ export async function check() {
64
64
 
65
65
  const wfPath = '.github/workflows/lint-style.yml'
66
66
  if (existsSync(wfPath)) {
67
- pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor check → style_lint.lint_style_yml)`)
67
+ pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor fix → style_lint.lint_style_yml)`)
68
68
  } else {
69
69
  fail(`${wfPath} не існує — створи його`)
70
70
  }
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -12,7 +12,7 @@
12
12
  * 3. Інакше — для `.vscode/extensions.json` зробити FS-existence + делегувати
13
13
  * content `rego.tauri.vscode_extensions` через `runConftestBatch`.
14
14
  *
15
- * Rego-полісі глобально без `target.json` поруч (не auto-discoverable через `n-cursor check`) — це conditional
15
+ * Rego-полісі глобально без `target.json` поруч (не auto-discoverable через `n-cursor fix`) — це conditional
16
16
  * правило. Plan B: Rego-authoritative + JS-orchestrator з `runConftestBatch`.
17
17
  */
18
18
  import { existsSync, statSync } from 'node:fs'
@@ -1,9 +1,9 @@
1
1
  # Перевірка `.vscode/extensions.json` для tauri (tauri.mdc).
2
2
  #
3
- # Викликається з `check-tauri.mjs` через `runConftestBatch` лише ПІСЛЯ того,
3
+ # Викликається з `rules/tauri/fix.mjs` через `runConftestBatch` лише ПІСЛЯ того,
4
4
  # як JS виявив маркер Tauri-проєкту (`src-tauri/` каталог, `tauri.conf.json`
5
5
  # у будь-якому пакеті, або залежність `@tauri-apps/*`). Без `target.json` поруч
6
- # (не auto-discoverable через `n-cursor check`) — інакше false-positive порушення на не-Tauri проєктах.
6
+ # (не auto-discoverable через `n-cursor fix`) — інакше false-positive порушення на не-Tauri проєктах.
7
7
  #
8
8
  # Canonical (tauri.mdc): `recommendations` має містити обидва записи —
9
9
  # - tauri-apps.tauri-vscode
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -9,7 +9,7 @@ alwaysApply: true
9
9
  JS-тести у пакеті лежать у **піддиректорії `tests/`** поряд із кодом, який тестується, а **не безпосередньо біля джерельного файлу**.
10
10
 
11
11
  ```
12
- rules/foo/fix/bar/
12
+ rules/foo/js/bar/
13
13
  ├── check.mjs ← JS-джерело
14
14
  └── tests/
15
15
  └── check.test.mjs ← тест check.mjs
@@ -53,7 +53,7 @@ Recursive globs ловлять файли всередині `tests/` так с
53
53
 
54
54
  ## Що перевіряє правило
55
55
 
56
- `npx @nitra/cursor check test` (concern `location`) проходить деревом пакета й перевіряє: **кожен `*.test.mjs` файл лежить усередині каталогу з ім'ям `tests`** (точне співпадіння басенейму батьківської директорії). Файли поза цим каталогом репортуються з порадою куди їх перенести.
56
+ `npx @nitra/cursor fix test` (concern `location`) проходить деревом пакета й перевіряє: **кожен `*.test.mjs` файл лежить усередині каталогу з ім'ям `tests`** (точне співпадіння басенейму батьківської директорії). Файли поза цим каталогом репортуються з порадою куди їх перенести.
57
57
 
58
58
  `*_test.rego` перевіркою **не охоплюються** — вони не переміщуються.
59
59
 
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -11,7 +11,7 @@
11
11
  * - абзац про український апостроф у `.cursor/rules/n-text.mdc` /
12
12
  * `npm/mdc/text.mdc` (markdown-текст, не JSON/YAML);
13
13
  * - складна валідація скрипта `lint-text` (cspell, markdownlint, v8r у трьох
14
- * варіантах, run-shellcheck-text.mjs, обовʼязкові glob-и);
14
+ * варіантах, run-shellrules/text/fix.mjs, обовʼязкові glob-и);
15
15
  * - workflow `lint-text.yml` має крок `bun run lint-text` (структура — rego `text.lint_text`).
16
16
  *
17
17
  * **Що покрила Rego** (`npx \@nitra/cursor check`):
@@ -111,7 +111,7 @@ function checkTextConfigsExistence(passFn, failFn) {
111
111
  ['.vscode/settings.json', 'text.vscode_settings']
112
112
  ]) {
113
113
  if (existsSync(path)) {
114
- passFn(`${path} є (структуру перевіряє npx @nitra/cursor check → ${mdcRef})`)
114
+ passFn(`${path} є (структуру перевіряє npx @nitra/cursor fix → ${mdcRef})`)
115
115
  } else {
116
116
  failFn(`${path} не існує — створи згідно n-text.mdc`)
117
117
  }
@@ -260,4 +260,4 @@ kebab-case
260
260
 
261
261
  ## Перевірка
262
262
 
263
- `npx @nitra/cursor check text` (охоплює oxfmt, cspell, shellcheck у `lint-text`, markdownlint, v8r, CI для `lint-text`)
263
+ `npx @nitra/cursor fix text` (охоплює oxfmt, cspell, shellcheck у `lint-text`, markdownlint, v8r, CI для `lint-text`)
@@ -0,0 +1,19 @@
1
+ import { runStandardRule } from '../../scripts/utils/run-standard-rule.mjs'
2
+
3
+ /**
4
+ * Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
5
+ * Library mode: викликається CLI orchestration через `import + run(ctx)`.
6
+ * @param {import('../../scripts/utils/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
7
+ * @returns {Promise<number>} 0 — OK, 1 — порушення
8
+ */
9
+ export function run(ctx) {
10
+ return runStandardRule(import.meta.dirname, ctx)
11
+ }
12
+
13
+ if (import.meta.main) {
14
+ // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
15
+ // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
16
+ const { runRuleCli } = await import('../../scripts/utils/run-rule-cli.mjs')
17
+ // eslint-disable-next-line unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
+ process.exit(await runRuleCli(import.meta.dirname))
19
+ }
@@ -413,7 +413,7 @@ async function checkVueImportViolations(rootDir, absPackageRoot, ignorePaths, ha
413
413
  */
414
414
  async function checkVuePackage(rootDir, ignorePaths, fail, passFn) {
415
415
  const prefix = `[${packageLabel(rootDir)}] `
416
- passFn(`${prefix}package.json залежності перевіряє npx @nitra/cursor check → vue.package_json`)
416
+ passFn(`${prefix}package.json залежності перевіряє npx @nitra/cursor fix → vue.package_json`)
417
417
 
418
418
  await checkViteClientEnvAndEditorConfig(rootDir, prefix, passFn, fail)
419
419
 
@@ -1,5 +1,5 @@
1
1
  # Порт перевірки версій з `package.json` для Vue+Vite пакетів з
2
- # `npm/scripts/check-vue.mjs` (vue.mdc).
2
+ # `npm/scripts/rules/vue/fix.mjs` (vue.mdc).
3
3
  #
4
4
  # Запуск (локально, у Vue+Vite-пакеті):
5
5
  # conftest test path/to/package.json -p npm/policy/vue \
package/rules/vue/vue.mdc CHANGED
@@ -341,4 +341,4 @@ import path from 'node:path'
341
341
 
342
342
  ## Перевірка
343
343
 
344
- `npx @nitra/cursor check vue` — перевіряє залежності, `vite.config`, наявність **`src/vite-env.d.ts`** з `/// <reference types="vite/client" />` та **`jsconfig.json`** у корені Vue-пакета; обходить джерела Vue-пакета (`.vue`, `.ts`, `.js` тощо) на заборонені value-імпорти з модуля `vue` (дозволені лише type-only та side-effect `import 'vue'`) і додатково сканує `.vue` SFC на імпорти Node-нативних модулів (`node:*` префікс або bare-ім’я вбудованого модуля Node — `fs`, `path`, `timers/promises` тощо). Імпорти аналізуються через **oxc-parser** (`module.staticImports`); для `.vue` вміст `<script>` витягується з SFC, далі той самий парсер (логіка в `npm/rules/vue/fix/packages/vue-forbidden-imports.mjs`).
344
+ `npx @nitra/cursor fix vue` — перевіряє залежності, `vite.config`, наявність **`src/vite-env.d.ts`** з `/// <reference types="vite/client" />` та **`jsconfig.json`** у корені Vue-пакета; обходить джерела Vue-пакета (`.vue`, `.ts`, `.js` тощо) на заборонені value-імпорти з модуля `vue` (дозволені лише type-only та side-effect `import 'vue'`) і додатково сканує `.vue` SFC на імпорти Node-нативних модулів (`node:*` префікс або bare-ім’я вбудованого модуля Node — `fs`, `path`, `timers/promises` тощо). Імпорти аналізуються через **oxc-parser** (`module.staticImports`); для `.vue` вміст `<script>` витягується з SFC, далі той самий парсер (логіка в `npm/rules/vue/js/packages/vue-forbidden-imports.mjs`).
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "ignore": {
47
47
  "type": "array",
48
- "description": "Директорії, що повністю виключаються з обходу check-скриптів CLI (npx @nitra/cursor check ...) і AI-модифікацій (AI не редагує, не видаляє, не створює файли). Шляхи відносно кореня репозиторію (posix). Приклади: vendored Helm-чарти, генеровані маніфести, legacy-дерева. Стандартні виключення (node_modules, .git, dist, coverage, .turbo, .next) застосовуються завжди — додавати їх не треба.",
48
+ "description": "Директорії, що повністю виключаються з обходу check-скриптів CLI (npx @nitra/cursor fix ...) і AI-модифікацій (AI не редагує, не видаляє, не створює файли). Шляхи відносно кореня репозиторію (posix). Приклади: vendored Helm-чарти, генеровані маніфести, legacy-дерева. Стандартні виключення (node_modules, .git, dist, coverage, .turbo, .next) застосовуються завжди — додавати їх не треба.",
49
49
  "items": {
50
50
  "type": "string",
51
51
  "minLength": 1
@@ -16,13 +16,13 @@ import { existsSync } from 'node:fs'
16
16
  import { readdir, readFile } from 'node:fs/promises'
17
17
  import { basename, join, relative } from 'node:path'
18
18
 
19
- import { textHasBunSqlImport } from '../rules/js-bun-db/fix/safety/bun-sql-scan.mjs'
19
+ import { textHasBunSqlImport } from '../rules/js-bun-db/js/safety/bun-sql-scan.mjs'
20
20
  import {
21
21
  isGqlScanSourceFile,
22
22
  shouldSkipFileForGqlScan,
23
23
  sourceFileHasGqlTaggedTemplate
24
- } from '../rules/graphql/fix/tooling/graphql-gql-scan.mjs'
25
- import { contentForVueImportScan } from '../rules/vue/fix/packages/vue-forbidden-imports.mjs'
24
+ } from '../rules/graphql/js/tooling/graphql-gql-scan.mjs'
25
+ import { contentForVueImportScan } from '../rules/vue/js/packages/vue-forbidden-imports.mjs'
26
26
 
27
27
  /** Порядок автододавання правил відповідно до `rules/<rule>/auto.md`. */
28
28
  export const AUTO_RULE_ORDER = Object.freeze([
@@ -81,7 +81,7 @@ export async function buildAgentsCommandBulletItems(projectRoot) {
81
81
  {
82
82
  name: `- **Оновити правила та ${AGENTS_MD}** (після змін у правилах/шаблоні CLI): \`npx ${PACKAGE_NAME}\``
83
83
  },
84
- { name: `- **Перевірки правил (programmatic)**: \`npx ${PACKAGE_NAME} check\`` },
84
+ { name: `- **Перевірки правил (programmatic)**: \`npx ${PACKAGE_NAME} fix\`` },
85
85
  { name: `- **knip (невикористані залежності та експорти)**: \`bunx knip\`` }
86
86
  )
87
87
 
@@ -68,7 +68,7 @@ export async function runStopHookCli() {
68
68
  const [code] = await once(child, 'exit')
69
69
  return code ?? 1
70
70
  } catch (error) {
71
- process.stderr.write(`stop-hook: не вдалося запустити npx @nitra/cursor check — ${error.message}\n`)
71
+ process.stderr.write(`stop-hook: не вдалося запустити npx @nitra/cursor fix — ${error.message}\n`)
72
72
  return 1
73
73
  }
74
74
  }
@@ -19,7 +19,7 @@
19
19
  * - `.cursor/hooks.json` — **merge**: користувацькі hooks зберігаються; ADR stop
20
20
  * entries додаються, коли правило `adr` увімкнене, і видаляються, коли вимкнене.
21
21
  * - `.gitignore` — **merge** (лише з `adr`): дописує відсутні рядки з канонічного
22
- * фрагмента `rules/adr/fix/hooks/template/.gitignore.snippet` (`node_modules/`, `dist/`,
22
+ * фрагмента `rules/adr/js/hooks/template/.gitignore.snippet` (`node_modules/`, `dist/`,
23
23
  * `*.secret`, логи capture/normalize, `.normalize-state`, `.normalize.lock`); існуючі
24
24
  * рядки не перезаписуються.
25
25
  *
@@ -56,7 +56,7 @@ const ADR_HOOK_SCRIPT_NAME = 'capture-decisions.sh'
56
56
  const ADR_NORMALIZE_HOOK_SCRIPT_NAME = 'normalize-decisions.sh'
57
57
  const TEMPLATE_DIR_NAME = '.claude-template'
58
58
  /** Відносний шлях до канонічного фрагмента `.gitignore` для ADR Stop-hook'ів у tarball пакета. */
59
- export const ADR_GITIGNORE_SNIPPET_REL = 'rules/adr/fix/hooks/template/.gitignore.snippet'
59
+ export const ADR_GITIGNORE_SNIPPET_REL = 'rules/adr/js/hooks/template/.gitignore.snippet'
60
60
  const GITIGNORE_FILE = '.gitignore'
61
61
  const EOL_RE = /\r?\n/u
62
62