@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.
- package/.claude-template/commands/n-check.md +2 -2
- package/CHANGELOG.md +59 -26
- package/README.md +11 -11
- package/bin/n-cursor.js +38 -67
- package/package.json +1 -1
- package/rules/abie/abie.mdc +9 -9
- package/rules/abie/fix.mjs +19 -0
- package/rules/abie/policy/base_deployment_preem/base_deployment_preem.rego +2 -2
- package/rules/abie/policy/health_check_policy/health_check_policy.rego +2 -2
- package/rules/abie/policy/http_route_base/http_route_base.rego +1 -1
- package/rules/abie/utils/k8s-tree.mjs +1 -1
- package/rules/adr/adr.mdc +1 -1
- package/rules/adr/fix.mjs +19 -0
- package/rules/adr/{fix → js}/hooks/check.mjs +1 -1
- package/rules/bun/bun.mdc +1 -1
- package/rules/bun/fix.mjs +19 -0
- package/rules/bun/{fix → js}/layout/check.mjs +1 -1
- package/rules/capacitor/fix.mjs +19 -0
- package/rules/capacitor/policy/package_json/package_json.rego +3 -3
- package/rules/changelog/changelog.mdc +2 -2
- package/rules/changelog/fix.mjs +19 -0
- package/rules/ci4/ci4.mdc +1 -1
- package/rules/ci4/fix.mjs +19 -0
- package/rules/docker/docker.mdc +7 -7
- package/rules/docker/fix.mjs +19 -0
- package/rules/docker/lint/lint.mjs +2 -2
- package/rules/docker/policy/package_json/package_json.rego +1 -1
- package/rules/efes/efes.mdc +1 -1
- package/rules/efes/fix.mjs +19 -0
- package/rules/feedback/feedback.mdc +2 -2
- package/rules/feedback/fix.mjs +19 -0
- package/rules/ga/fix.mjs +19 -0
- package/rules/ga/lint/lint.mjs +6 -6
- package/rules/ga/policy/workflow_common/workflow_common.rego +1 -1
- package/rules/graphql/fix.mjs +19 -0
- package/rules/graphql/{fix → js}/tooling/graphql-gql-scan.mjs +1 -1
- package/rules/graphql/policy/vscode_extensions/vscode_extensions.rego +2 -2
- package/rules/hasura/fix.mjs +19 -0
- package/rules/hasura/policy/svc_hl/svc_hl.rego +1 -1
- package/rules/image-avif/fix.mjs +19 -0
- package/rules/image-avif/image-avif.mdc +1 -1
- package/rules/image-avif/{fix → js}/avif_generation/check.mjs +1 -1
- package/rules/image-compress/fix.mjs +19 -0
- package/rules/image-compress/{fix → js}/package_setup/check.mjs +1 -1
- package/rules/js-bun-db/fix.mjs +19 -0
- package/rules/js-bun-redis/fix.mjs +19 -0
- package/rules/js-bun-redis/policy/package_json/package_json.rego +1 -1
- package/rules/js-lint/fix.mjs +19 -0
- package/rules/js-lint/{fix → js}/tooling/check.mjs +5 -5
- package/rules/js-lint/{fix → js}/tooling/rebuild-oxlint-canonical.mjs +1 -1
- package/rules/js-lint/js-lint.mdc +3 -3
- package/rules/js-mssql/fix.mjs +19 -0
- package/rules/js-mssql/policy/package_json/package_json.rego +2 -2
- package/rules/js-run/fix.mjs +19 -0
- package/rules/js-run/{fix → js}/runtime/check.mjs +3 -3
- package/rules/k8s/fix.mjs +19 -0
- package/rules/k8s/{fix → js}/manifests/check.mjs +1 -1
- package/rules/k8s/k8s.mdc +13 -13
- package/rules/k8s/lint/lint.mjs +2 -2
- package/rules/k8s/policy/base_kustomization/base_kustomization.rego +3 -3
- package/rules/k8s/policy/base_manifest/base_manifest.rego +2 -2
- package/rules/k8s/policy/gateway/gateway.rego +2 -2
- package/rules/k8s/policy/hasura_configmap/hasura_configmap.rego +3 -3
- package/rules/k8s/policy/hasura_httproute/hasura_httproute.rego +1 -1
- package/rules/k8s/policy/hpa_pdb/hpa_pdb.rego +1 -1
- package/rules/k8s/policy/kustomization/kustomization.rego +2 -2
- package/rules/k8s/policy/manifest/manifest.rego +4 -4
- package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.rego +2 -2
- package/rules/k8s/policy/svc_yaml/svc_yaml.rego +2 -2
- package/rules/nginx-default-tpl/fix.mjs +19 -0
- package/rules/nginx-default-tpl/{fix → js}/template/check.mjs +1 -1
- package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.rego +2 -2
- package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.rego +1 -1
- package/rules/npm-module/fix.mjs +19 -0
- package/rules/npm-module/{fix → js}/package_structure/check.mjs +3 -3
- package/rules/php/fix.mjs +19 -0
- package/rules/php/{fix → js}/tooling/check.mjs +2 -2
- package/rules/rego/fix.mjs +19 -0
- package/rules/security/fix.mjs +19 -0
- package/rules/security/security.mdc +3 -3
- package/rules/style-lint/fix.mjs +19 -0
- package/rules/style-lint/{fix → js}/tooling/check.mjs +2 -2
- package/rules/tauri/fix.mjs +19 -0
- package/rules/tauri/{fix → js}/tooling/check.mjs +1 -1
- package/rules/tauri/policy/vscode_extensions/vscode_extensions.rego +2 -2
- package/rules/test/fix.mjs +19 -0
- package/rules/test/test.mdc +2 -2
- package/rules/text/fix.mjs +19 -0
- package/rules/text/{fix → js}/formatting/check.mjs +2 -2
- package/rules/text/text.mdc +1 -1
- package/rules/vue/fix.mjs +19 -0
- package/rules/vue/{fix → js}/packages/check.mjs +1 -1
- package/rules/vue/policy/package_json/package_json.rego +1 -1
- package/rules/vue/vue.mdc +1 -1
- package/schemas/n-cursor.json +1 -1
- package/scripts/auto-rules.mjs +3 -3
- package/scripts/build-agents-commands.mjs +1 -1
- package/scripts/claude-stop-hook.mjs +1 -1
- package/scripts/sync-claude-config.mjs +2 -2
- package/scripts/utils/ast-scan-utils.mjs +3 -3
- package/scripts/utils/discover-check-rules-from-cursor.mjs +1 -1
- package/scripts/utils/discover-checkable-rules.mjs +30 -18
- package/scripts/utils/list-rule-ids.mjs +23 -0
- package/scripts/utils/read-n-cursor-config-lite.mjs +59 -0
- package/scripts/utils/run-rule-cli.mjs +37 -0
- package/scripts/utils/run-rule.mjs +7 -7
- package/scripts/utils/run-standard-rule.mjs +34 -0
- package/scripts/utils/walk-cache.mjs +24 -0
- package/scripts/utils/workspaces.mjs +1 -1
- package/skills/fix/SKILL.md +5 -5
- package/skills/lint/SKILL.md +1 -1
- /package/rules/abie/{fix → js}/applies/check.mjs +0 -0
- /package/rules/abie/{fix → js}/env_dns/check.mjs +0 -0
- /package/rules/abie/{fix → js}/firebase_hosting/check.mjs +0 -0
- /package/rules/abie/{fix → js}/hc_pairing/check.mjs +0 -0
- /package/rules/abie/{fix → js}/ua_http_route/check.mjs +0 -0
- /package/rules/abie/{fix → js}/ua_node_selector/check.mjs +0 -0
- /package/rules/adr/{fix → js}/hooks/template/.gitignore.snippet +0 -0
- /package/rules/capacitor/{fix → js}/platforms/check.mjs +0 -0
- /package/rules/changelog/{fix → js}/consistency/check.mjs +0 -0
- /package/rules/changelog/{fix → js}/consistency/package-manifest.mjs +0 -0
- /package/rules/docker/{fix → js}/lint/check.mjs +0 -0
- /package/rules/docker/{fix → js}/lint/docker-hadolint.mjs +0 -0
- /package/rules/docker/{fix → js}/lint/docker-mirror.mjs +0 -0
- /package/rules/ga/{fix → js}/workflows/check.mjs +0 -0
- /package/rules/graphql/{fix → js}/tooling/check.mjs +0 -0
- /package/rules/hasura/{fix → js}/internal_urls/check.mjs +0 -0
- /package/rules/js-bun-db/{fix → js}/safety/bun-sql-scan.mjs +0 -0
- /package/rules/js-bun-db/{fix → js}/safety/check.mjs +0 -0
- /package/rules/js-bun-redis/{fix → js}/imports/check.mjs +0 -0
- /package/rules/js-lint/{fix → js}/tooling/knip-canonical.json +0 -0
- /package/rules/js-lint/{fix → js}/tooling/oxlint-canonical-skeleton.json +0 -0
- /package/rules/js-lint/{fix → js}/tooling/oxlint-canonical.json +0 -0
- /package/rules/js-lint/{fix → js}/tooling/oxlint-rules.tsv +0 -0
- /package/rules/js-mssql/{fix → js}/deps/check.mjs +0 -0
- /package/rules/js-mssql/{fix → js}/deps/mssql-pool-scan.mjs +0 -0
- /package/rules/js-run/{fix → js}/runtime/bunyan-imports.mjs +0 -0
- /package/rules/js-run/{fix → js}/runtime/check-env-scan.mjs +0 -0
- /package/rules/js-run/{fix → js}/runtime/conn-file-rules.mjs +0 -0
- /package/rules/js-run/{fix → js}/runtime/conn-imports-scan.mjs +0 -0
- /package/rules/js-run/{fix → js}/runtime/promise-settimeout-scan.mjs +0 -0
- /package/rules/k8s/{fix → js}/kubescape_exceptions/template/.kubescape-exceptions.json.snippet.json +0 -0
- /package/rules/rego/{fix → js}/applies/check.mjs +0 -0
- /package/rules/security/{fix → js}/sample_secret/check.mjs +0 -0
- /package/rules/security/{fix → js}/trufflehog/check.mjs +0 -0
- /package/rules/security/{fix → js}/trufflehog/template/.trufflehog-exclude.snippet.txt +0 -0
- /package/rules/test/{fix → js}/location/check.mjs +0 -0
- /package/rules/vue/{fix → js}/packages/vue-forbidden-imports.mjs +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Порт перевірки ConfigMap для Hasura-Deployment з
|
|
2
|
-
# `npm/scripts/
|
|
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 (`
|
|
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` (узгоджено з `
|
|
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/
|
|
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/
|
|
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/
|
|
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` — у `
|
|
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/
|
|
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/`) лишається у `
|
|
28
|
-
# JS authoritative (`
|
|
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` у `
|
|
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/
|
|
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 (`
|
|
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/
|
|
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 (`
|
|
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/
|
|
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
|
-
# Викликається з `
|
|
3
|
+
# Викликається з `rules/nginx-default-tpl/fix.mjs` через `runConftestBatch` лише
|
|
4
4
|
# ПІСЛЯ того, як JS виявив `default.conf.template` у дереві (умовне правило).
|
|
5
|
-
# Глобально без `target.json` поруч (не auto-discoverable через `n-cursor
|
|
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
|
-
# Викликається з `
|
|
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
|
|
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
|
|
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>/
|
|
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
|
|
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
|
|
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](./
|
|
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` — деталі скану в `
|
|
48
|
+
Перевіряється лише `secret` у позиції значення (після `=`, `:`, `=>`); імена ключів на кшталт `client_secret` не чіпаються. Concern `security.sample_secret` — деталі скану в `js/sample_secret/check.mjs`.
|
|
49
49
|
|
|
50
50
|
## Перевірка
|
|
51
51
|
|
|
52
|
-
`npx @nitra/cursor
|
|
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
|
|
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
|
|
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
|
|
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
|
-
# Викликається з `
|
|
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
|
|
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
|
+
}
|
package/rules/test/test.mdc
CHANGED
|
@@ -9,7 +9,7 @@ alwaysApply: true
|
|
|
9
9
|
JS-тести у пакеті лежать у **піддиректорії `tests/`** поряд із кодом, який тестується, а **не безпосередньо біля джерельного файлу**.
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
rules/foo/
|
|
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
|
|
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-
|
|
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
|
|
114
|
+
passFn(`${path} є (структуру перевіряє npx @nitra/cursor fix → ${mdcRef})`)
|
|
115
115
|
} else {
|
|
116
116
|
failFn(`${path} не існує — створи згідно n-text.mdc`)
|
|
117
117
|
}
|
package/rules/text/text.mdc
CHANGED
|
@@ -260,4 +260,4 @@ kebab-case
|
|
|
260
260
|
|
|
261
261
|
## Перевірка
|
|
262
262
|
|
|
263
|
-
`npx @nitra/cursor
|
|
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
|
|
416
|
+
passFn(`${prefix}package.json залежності перевіряє npx @nitra/cursor fix → vue.package_json`)
|
|
417
417
|
|
|
418
418
|
await checkViteClientEnvAndEditorConfig(rootDir, prefix, passFn, fail)
|
|
419
419
|
|
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
|
|
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`).
|
package/schemas/n-cursor.json
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"ignore": {
|
|
47
47
|
"type": "array",
|
|
48
|
-
"description": "Директорії, що повністю виключаються з обходу check-скриптів CLI (npx @nitra/cursor
|
|
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
|
package/scripts/auto-rules.mjs
CHANGED
|
@@ -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/
|
|
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/
|
|
25
|
-
import { contentForVueImportScan } from '../rules/vue/
|
|
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}
|
|
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
|
|
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/
|
|
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/
|
|
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
|
|