@nitra/cursor 1.10.0 → 1.11.1
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/CHANGELOG.md +42 -1
- package/bin/n-cursor.js +31 -31
- package/package.json +2 -4
- package/rules/abie/js/applies/check.mjs +24 -0
- package/rules/abie/js/env_dns/check.mjs +53 -0
- package/rules/abie/js/firebase_hosting/check.mjs +49 -0
- package/rules/abie/js/hc_pairing/check.mjs +58 -0
- package/rules/abie/js/ua_http_route/check.mjs +86 -0
- package/rules/abie/js/ua_node_selector/check.mjs +65 -0
- package/rules/abie/policy/base_deployment_preem/target.json +10 -0
- package/rules/abie/policy/clean_merged_ignore_branches/target.json +4 -0
- package/rules/abie/policy/health_check_policy/target.json +4 -0
- package/rules/abie/policy/http_route_base/target.json +4 -0
- package/rules/abie/utils/enabled.mjs +35 -0
- package/rules/abie/utils/env-dns.mjs +81 -0
- package/rules/abie/utils/hc-yaml.mjs +27 -0
- package/rules/abie/utils/http-route.mjs +93 -0
- package/rules/abie/utils/k8s-tree.mjs +102 -0
- package/rules/abie/utils/kustomization-patches.mjs +224 -0
- package/rules/abie/utils/overlay-paths.mjs +97 -0
- package/rules/abie/utils/yaml.mjs +72 -0
- package/rules/adr/js/{check.mjs → hooks/check.mjs} +2 -2
- package/rules/adr/policy/settings_json/target.json +4 -0
- package/rules/adr/policy/settings_local_json/target.json +4 -0
- package/rules/bun/js/{check.mjs → layout/check.mjs} +1 -1
- package/rules/bun/policy/bunfig/target.json +4 -0
- package/rules/bun/policy/package_json/target.json +4 -0
- package/rules/capacitor/js/{check.mjs → platforms/check.mjs} +1 -1
- package/rules/capacitor/policy/package_json/target.json +4 -0
- package/rules/changelog/js/{check.mjs → consistency/check.mjs} +2 -2
- package/rules/docker/js/{check.mjs → lint/check.mjs} +5 -5
- package/rules/docker/policy/lint_docker_yml/target.json +4 -0
- package/rules/docker/policy/package_json/target.json +4 -0
- package/rules/ga/js/lint.mjs +1 -1
- package/rules/ga/js/{check.mjs → workflows/check.mjs} +4 -4
- package/rules/graphql/js/{check.mjs → tooling/check.mjs} +5 -5
- package/rules/hasura/js/{check.mjs → internal_urls/check.mjs} +4 -4
- package/rules/hasura/policy/svc_hl/target.json +4 -0
- package/rules/image-avif/js/{check.mjs → avif_generation/check.mjs} +5 -5
- package/rules/image-avif/policy/package_json/target.json +4 -0
- package/rules/image-compress/js/{check.mjs → package_setup/check.mjs} +1 -1
- package/rules/image-compress/policy/package_json/target.json +4 -0
- package/rules/js-bun-db/js/{check.mjs → safety/check.mjs} +5 -5
- package/rules/js-bun-db/policy/package_json/target.json +4 -0
- package/rules/js-bun-redis/js/{check.mjs → imports/check.mjs} +4 -4
- package/rules/js-bun-redis/policy/package_json/target.json +4 -0
- package/rules/js-lint/js/{check.mjs → tooling/check.mjs} +16 -2
- package/rules/js-lint/policy/lint_js_yml/target.json +4 -0
- package/rules/js-lint/policy/package_json/target.json +4 -0
- package/rules/js-mssql/js/{check.mjs → deps/check.mjs} +5 -5
- package/rules/js-mssql/policy/package_json/target.json +4 -0
- package/rules/js-run/js/{check.mjs → runtime/check.mjs} +10 -10
- package/rules/js-run/policy/configmap/target.json +4 -0
- package/rules/js-run/policy/package_json/target.json +4 -0
- package/rules/k8s/js/{check.mjs → manifests/check.mjs} +4 -4
- package/rules/k8s/policy/base_kustomization/target.json +4 -0
- package/rules/k8s/policy/base_manifest/target.json +10 -0
- package/rules/k8s/policy/gateway/target.json +4 -0
- package/rules/k8s/policy/hpa_pdb/target.json +4 -0
- package/rules/k8s/policy/kustomization/target.json +4 -0
- package/rules/k8s/policy/manifest/target.json +4 -0
- package/rules/k8s/policy/svc_hl_yaml/target.json +4 -0
- package/rules/k8s/policy/svc_yaml/target.json +4 -0
- package/rules/nginx-default-tpl/js/{check.mjs → template/check.mjs} +5 -5
- package/rules/npm-module/js/{check.mjs → package_structure/check.mjs} +4 -4
- package/rules/npm-module/policy/emit_types_config/target.json +4 -0
- package/rules/npm-module/policy/npm_package_json/target.json +4 -0
- package/rules/npm-module/policy/npm_publish_yml/target.json +4 -0
- package/rules/npm-module/policy/root_package_json/target.json +4 -0
- package/rules/php/js/{check.mjs → tooling/check.mjs} +1 -1
- package/rules/php/policy/lint_php_yml/target.json +4 -0
- package/rules/php/policy/package_json/target.json +4 -0
- package/rules/rego/js/applies/check.mjs +54 -0
- package/rules/rego/policy/package_json/target.json +5 -0
- package/rules/rego/policy/vscode_extensions/target.json +5 -0
- package/rules/rego/policy/vscode_settings/target.json +5 -0
- package/rules/style-lint/js/{check.mjs → tooling/check.mjs} +1 -1
- package/rules/style-lint/policy/lint_style_yml/target.json +4 -0
- package/rules/style-lint/policy/package_json/target.json +4 -0
- package/rules/style-lint/policy/vscode_extensions/target.json +4 -0
- package/rules/style-lint/policy/vscode_settings/target.json +4 -0
- package/rules/tauri/js/{check.mjs → tooling/check.mjs} +2 -2
- package/rules/text/js/{check.mjs → formatting/check.mjs} +2 -2
- package/rules/text/policy/cspell/target.json +4 -0
- package/rules/text/policy/markdownlint/target.json +4 -0
- package/rules/text/policy/oxfmtrc/target.json +4 -0
- package/rules/text/policy/package_json/target.json +4 -0
- package/rules/text/policy/vscode_extensions/target.json +4 -0
- package/rules/text/policy/vscode_settings/target.json +4 -0
- package/rules/vue/js/{check.mjs → packages/check.mjs} +5 -5
- package/rules/vue/policy/package_json/target.json +4 -0
- package/schemas/target.json +58 -0
- package/scripts/lint-conftest.mjs +65 -414
- package/scripts/utils/discover-checkable-rules.mjs +106 -0
- package/scripts/utils/resolve-target-files.mjs +109 -0
- package/scripts/utils/run-rule.mjs +127 -0
- package/rules/abie/js/check.mjs +0 -1152
- package/rules/rego/js/check.mjs +0 -106
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { existsSync } from 'node:fs'
|
|
13
13
|
|
|
14
|
-
import { createCheckReporter } from '
|
|
14
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Перевіряє відповідність проєкту правилам php.mdc.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies-гейт правила `rego` (rego.mdc): правило застосовне, лише якщо в репозиторії є
|
|
3
|
+
* хоча б один `.rego`-файл (під типовими skip-ами і `.n-cursor.json:ignore`).
|
|
4
|
+
*
|
|
5
|
+
* Якщо `.rego` нема — CLI пропускає правило цілком (включно з polices `package_json`,
|
|
6
|
+
* `vscode_extensions`, `vscode_settings`), бо вимоги rego-tooling неактуальні. Якщо є — CLI
|
|
7
|
+
* прогонить policy-концерни через `target.json`-маніфести у `rules/rego/policy/<name>/`.
|
|
8
|
+
*
|
|
9
|
+
* JS тут лишається лише як cross-file гейт: walkDir не виразити декларативно через `target.json`.
|
|
10
|
+
* Друк короткого pass-повідомлення з контекстом робить `check()` (необовʼязковий).
|
|
11
|
+
*/
|
|
12
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
13
|
+
import { loadCursorIgnorePaths } from '../../../../scripts/utils/load-cursor-config.mjs'
|
|
14
|
+
import { walkDir } from '../../../../scripts/utils/walkDir.mjs'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Чи є хоча б один `.rego`-файл у дереві від `cwd`. Зупиняється на першому матчі.
|
|
18
|
+
* @param {string} root абсолютний шлях кореня
|
|
19
|
+
* @param {string[]} ignorePaths шляхи каталогів, повністю виключених з обходу
|
|
20
|
+
* @returns {Promise<boolean>} `true`, якщо знайдено хоч один `.rego`
|
|
21
|
+
*/
|
|
22
|
+
async function projectHasRegoFiles(root, ignorePaths) {
|
|
23
|
+
let found = false
|
|
24
|
+
await walkDir(
|
|
25
|
+
root,
|
|
26
|
+
p => {
|
|
27
|
+
if (p.endsWith('.rego')) {
|
|
28
|
+
found = true
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
ignorePaths
|
|
32
|
+
)
|
|
33
|
+
return found
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Rule-level applies-гейт: CLI пропускає правило, якщо в репо немає `.rego` файлів.
|
|
38
|
+
* @returns {Promise<boolean>} `true`, якщо правило застосовне
|
|
39
|
+
*/
|
|
40
|
+
export async function applies() {
|
|
41
|
+
const root = process.cwd()
|
|
42
|
+
const ignorePaths = await loadCursorIgnorePaths(root)
|
|
43
|
+
return projectHasRegoFiles(root, ignorePaths)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Друкує короткий context-pass — самі полісі прогонить CLI через `policy/<name>/target.json`.
|
|
48
|
+
* @returns {Promise<number>} 0 — все ок (фактичні порушення повертають policy-концерни)
|
|
49
|
+
*/
|
|
50
|
+
export async function check() {
|
|
51
|
+
const reporter = createCheckReporter()
|
|
52
|
+
reporter.pass('Знайдено *.rego у дереві — перевіряємо канонічні конфіги rego.mdc')
|
|
53
|
+
return reporter.getExitCode()
|
|
54
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { existsSync } from 'node:fs'
|
|
20
20
|
import { readFile } from 'node:fs/promises'
|
|
21
21
|
|
|
22
|
-
import { createCheckReporter } from '
|
|
22
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Альтернатива полю `stylelint` у `package.json` — зовнішній файл конфігу. Якщо
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
import { existsSync, statSync } from 'node:fs'
|
|
19
19
|
import { readFile } from 'node:fs/promises'
|
|
20
20
|
|
|
21
|
-
import { createCheckReporter } from '
|
|
22
|
-
import { runConftestBatch } from '
|
|
21
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
22
|
+
import { runConftestBatch } from '../../../../scripts/utils/run-conftest-batch.mjs'
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Чи є префікс `@tauri-apps/` у ключах `dependencies` або `devDependencies`.
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
import { existsSync } from 'node:fs'
|
|
33
33
|
import { readFile } from 'node:fs/promises'
|
|
34
34
|
|
|
35
|
-
import { createCheckReporter } from '
|
|
36
|
-
import { anyRunStepIncludes, parseWorkflowYaml } from '
|
|
35
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
36
|
+
import { anyRunStepIncludes, parseWorkflowYaml } from '../../../../scripts/utils/gha-workflow.mjs'
|
|
37
37
|
|
|
38
38
|
/** Заголовок абзацу про апостроф у text.mdc / n-text.mdc. */
|
|
39
39
|
const UK_APOSTROPHE_HEADING = '**Український апостроф:**'
|
|
@@ -21,16 +21,16 @@ import { existsSync } from 'node:fs'
|
|
|
21
21
|
import { readFile } from 'node:fs/promises'
|
|
22
22
|
import { join, relative } from 'node:path'
|
|
23
23
|
|
|
24
|
-
import { createCheckReporter } from '
|
|
24
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
25
25
|
import {
|
|
26
26
|
findForbiddenNodeImportsInVueFile,
|
|
27
27
|
findForbiddenVueImportsInSourceFile,
|
|
28
28
|
isVueImportScanSourceFile,
|
|
29
29
|
shouldSkipFileForVueImportScan
|
|
30
|
-
} from '
|
|
31
|
-
import { loadCursorIgnorePaths } from '
|
|
32
|
-
import { walkDir } from '
|
|
33
|
-
import { getMonorepoPackageRootDirs } from '
|
|
30
|
+
} from '../../../../scripts/utils/vue-forbidden-imports.mjs'
|
|
31
|
+
import { loadCursorIgnorePaths } from '../../../../scripts/utils/load-cursor-config.mjs'
|
|
32
|
+
import { walkDir } from '../../../../scripts/utils/walkDir.mjs'
|
|
33
|
+
import { getMonorepoPackageRootDirs } from '../../../../scripts/utils/workspaces.mjs'
|
|
34
34
|
|
|
35
35
|
const ESBUILD_RE = /\besbuild\b/
|
|
36
36
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://unpkg.com/@nitra/cursor/schemas/target.json",
|
|
4
|
+
"title": "Rego policy target manifest",
|
|
5
|
+
"description": "Маніфест поряд із <name>.rego: декларує, які файли проєкту фідити в conftest для цієї полісі. Лежить у npm/rules/<id>/policy/<name>/target.json (per-policy, поруч із <name>.rego). CLI читає й передає у runConftestBatch — JS-оркестратор у js/<name>/check.mjs не зобовʼязаний дублювати виклик. Namespace полісі обчислюється з шляху: <id>.<name>, відповідно `package <id>.<name>` у .rego.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["files"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"format": "uri",
|
|
13
|
+
"description": "Опційне посилання на JSON Schema для IDE-валідації; очікувано https://unpkg.com/@nitra/cursor/schemas/target.json"
|
|
14
|
+
},
|
|
15
|
+
"files": {
|
|
16
|
+
"oneOf": [
|
|
17
|
+
{
|
|
18
|
+
"type": "object",
|
|
19
|
+
"additionalProperties": false,
|
|
20
|
+
"required": ["single"],
|
|
21
|
+
"properties": {
|
|
22
|
+
"single": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"minLength": 1,
|
|
25
|
+
"description": "Відносний шлях від кореня репозиторію (posix). Заборонені сегменти '..' і абсолютні шляхи."
|
|
26
|
+
},
|
|
27
|
+
"required": {
|
|
28
|
+
"type": "boolean",
|
|
29
|
+
"description": "true → fail при відсутності файла з відповідним missingMessage; false/відсутнє → silent skip (полісі не запускається). За замовчуванням false."
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["walkGlob"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"walkGlob": {
|
|
39
|
+
"oneOf": [
|
|
40
|
+
{ "type": "string", "minLength": 1 },
|
|
41
|
+
{
|
|
42
|
+
"type": "array",
|
|
43
|
+
"minItems": 1,
|
|
44
|
+
"items": { "type": "string", "minLength": 1 }
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"description": "Один або декілька picomatch-globів (matched проти відносного posix-шляху). walkDir від cwd із загальними skip-ами + .n-cursor.json:ignore."
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"missingMessage": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "Override дефолтного fail-повідомлення при відсутності required:single файла. Без значення CLI використає шаблон '<path> не існує (<id>.<name>)'."
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|