@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.
Files changed (98) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/bin/n-cursor.js +31 -31
  3. package/package.json +2 -4
  4. package/rules/abie/js/applies/check.mjs +24 -0
  5. package/rules/abie/js/env_dns/check.mjs +53 -0
  6. package/rules/abie/js/firebase_hosting/check.mjs +49 -0
  7. package/rules/abie/js/hc_pairing/check.mjs +58 -0
  8. package/rules/abie/js/ua_http_route/check.mjs +86 -0
  9. package/rules/abie/js/ua_node_selector/check.mjs +65 -0
  10. package/rules/abie/policy/base_deployment_preem/target.json +10 -0
  11. package/rules/abie/policy/clean_merged_ignore_branches/target.json +4 -0
  12. package/rules/abie/policy/health_check_policy/target.json +4 -0
  13. package/rules/abie/policy/http_route_base/target.json +4 -0
  14. package/rules/abie/utils/enabled.mjs +35 -0
  15. package/rules/abie/utils/env-dns.mjs +81 -0
  16. package/rules/abie/utils/hc-yaml.mjs +27 -0
  17. package/rules/abie/utils/http-route.mjs +93 -0
  18. package/rules/abie/utils/k8s-tree.mjs +102 -0
  19. package/rules/abie/utils/kustomization-patches.mjs +224 -0
  20. package/rules/abie/utils/overlay-paths.mjs +97 -0
  21. package/rules/abie/utils/yaml.mjs +72 -0
  22. package/rules/adr/js/{check.mjs → hooks/check.mjs} +2 -2
  23. package/rules/adr/policy/settings_json/target.json +4 -0
  24. package/rules/adr/policy/settings_local_json/target.json +4 -0
  25. package/rules/bun/js/{check.mjs → layout/check.mjs} +1 -1
  26. package/rules/bun/policy/bunfig/target.json +4 -0
  27. package/rules/bun/policy/package_json/target.json +4 -0
  28. package/rules/capacitor/js/{check.mjs → platforms/check.mjs} +1 -1
  29. package/rules/capacitor/policy/package_json/target.json +4 -0
  30. package/rules/changelog/js/{check.mjs → consistency/check.mjs} +2 -2
  31. package/rules/docker/js/{check.mjs → lint/check.mjs} +5 -5
  32. package/rules/docker/policy/lint_docker_yml/target.json +4 -0
  33. package/rules/docker/policy/package_json/target.json +4 -0
  34. package/rules/ga/js/lint.mjs +1 -1
  35. package/rules/ga/js/{check.mjs → workflows/check.mjs} +4 -4
  36. package/rules/graphql/js/{check.mjs → tooling/check.mjs} +5 -5
  37. package/rules/hasura/js/{check.mjs → internal_urls/check.mjs} +4 -4
  38. package/rules/hasura/policy/svc_hl/target.json +4 -0
  39. package/rules/image-avif/js/{check.mjs → avif_generation/check.mjs} +5 -5
  40. package/rules/image-avif/policy/package_json/target.json +4 -0
  41. package/rules/image-compress/js/{check.mjs → package_setup/check.mjs} +1 -1
  42. package/rules/image-compress/policy/package_json/target.json +4 -0
  43. package/rules/js-bun-db/js/{check.mjs → safety/check.mjs} +5 -5
  44. package/rules/js-bun-db/policy/package_json/target.json +4 -0
  45. package/rules/js-bun-redis/js/{check.mjs → imports/check.mjs} +4 -4
  46. package/rules/js-bun-redis/policy/package_json/target.json +4 -0
  47. package/rules/js-lint/js/{check.mjs → tooling/check.mjs} +16 -2
  48. package/rules/js-lint/policy/lint_js_yml/target.json +4 -0
  49. package/rules/js-lint/policy/package_json/target.json +4 -0
  50. package/rules/js-mssql/js/{check.mjs → deps/check.mjs} +5 -5
  51. package/rules/js-mssql/policy/package_json/target.json +4 -0
  52. package/rules/js-run/js/{check.mjs → runtime/check.mjs} +10 -10
  53. package/rules/js-run/policy/configmap/target.json +4 -0
  54. package/rules/js-run/policy/package_json/target.json +4 -0
  55. package/rules/k8s/js/{check.mjs → manifests/check.mjs} +4 -4
  56. package/rules/k8s/policy/base_kustomization/target.json +4 -0
  57. package/rules/k8s/policy/base_manifest/target.json +10 -0
  58. package/rules/k8s/policy/gateway/target.json +4 -0
  59. package/rules/k8s/policy/hpa_pdb/target.json +4 -0
  60. package/rules/k8s/policy/kustomization/target.json +4 -0
  61. package/rules/k8s/policy/manifest/target.json +4 -0
  62. package/rules/k8s/policy/svc_hl_yaml/target.json +4 -0
  63. package/rules/k8s/policy/svc_yaml/target.json +4 -0
  64. package/rules/nginx-default-tpl/js/{check.mjs → template/check.mjs} +5 -5
  65. package/rules/npm-module/js/{check.mjs → package_structure/check.mjs} +4 -4
  66. package/rules/npm-module/policy/emit_types_config/target.json +4 -0
  67. package/rules/npm-module/policy/npm_package_json/target.json +4 -0
  68. package/rules/npm-module/policy/npm_publish_yml/target.json +4 -0
  69. package/rules/npm-module/policy/root_package_json/target.json +4 -0
  70. package/rules/php/js/{check.mjs → tooling/check.mjs} +1 -1
  71. package/rules/php/policy/lint_php_yml/target.json +4 -0
  72. package/rules/php/policy/package_json/target.json +4 -0
  73. package/rules/rego/js/applies/check.mjs +54 -0
  74. package/rules/rego/policy/package_json/target.json +5 -0
  75. package/rules/rego/policy/vscode_extensions/target.json +5 -0
  76. package/rules/rego/policy/vscode_settings/target.json +5 -0
  77. package/rules/style-lint/js/{check.mjs → tooling/check.mjs} +1 -1
  78. package/rules/style-lint/policy/lint_style_yml/target.json +4 -0
  79. package/rules/style-lint/policy/package_json/target.json +4 -0
  80. package/rules/style-lint/policy/vscode_extensions/target.json +4 -0
  81. package/rules/style-lint/policy/vscode_settings/target.json +4 -0
  82. package/rules/tauri/js/{check.mjs → tooling/check.mjs} +2 -2
  83. package/rules/text/js/{check.mjs → formatting/check.mjs} +2 -2
  84. package/rules/text/policy/cspell/target.json +4 -0
  85. package/rules/text/policy/markdownlint/target.json +4 -0
  86. package/rules/text/policy/oxfmtrc/target.json +4 -0
  87. package/rules/text/policy/package_json/target.json +4 -0
  88. package/rules/text/policy/vscode_extensions/target.json +4 -0
  89. package/rules/text/policy/vscode_settings/target.json +4 -0
  90. package/rules/vue/js/{check.mjs → packages/check.mjs} +5 -5
  91. package/rules/vue/policy/package_json/target.json +4 -0
  92. package/schemas/target.json +58 -0
  93. package/scripts/lint-conftest.mjs +65 -414
  94. package/scripts/utils/discover-checkable-rules.mjs +106 -0
  95. package/scripts/utils/resolve-target-files.mjs +109 -0
  96. package/scripts/utils/run-rule.mjs +127 -0
  97. package/rules/abie/js/check.mjs +0 -1152
  98. 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 '../../../scripts/utils/check-reporter.mjs'
14
+ import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
15
15
 
16
16
  /**
17
17
  * Перевіряє відповідність проєкту правилам php.mdc.
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".github/workflows/lint-php.yml" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json" }
4
+ }
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json", "required": true },
4
+ "missingMessage": "package.json не існує — створи згідно rego.mdc (rego.package_json)"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/extensions.json", "required": true },
4
+ "missingMessage": ".vscode/extensions.json не існує — створи згідно rego.mdc (rego.vscode_extensions)"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/settings.json", "required": true },
4
+ "missingMessage": ".vscode/settings.json не існує — створи згідно rego.mdc (rego.vscode_settings)"
5
+ }
@@ -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 '../../../scripts/utils/check-reporter.mjs'
22
+ import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
23
23
 
24
24
  /**
25
25
  * Альтернатива полю `stylelint` у `package.json` — зовнішній файл конфігу. Якщо
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".github/workflows/lint-style.yml" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/extensions.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/settings.json" }
4
+ }
@@ -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 '../../../scripts/utils/check-reporter.mjs'
22
- import { runConftestBatch } from '../../../scripts/utils/run-conftest-batch.mjs'
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 '../../../scripts/utils/check-reporter.mjs'
36
- import { anyRunStepIncludes, parseWorkflowYaml } from '../../../scripts/utils/gha-workflow.mjs'
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 = '**Український апостроф:**'
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".cspell.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".markdownlint-cli2.jsonc" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".oxfmtrc.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": "package.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/extensions.json" }
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "single": ".vscode/settings.json" }
4
+ }
@@ -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 '../../../scripts/utils/check-reporter.mjs'
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 '../../../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'
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,4 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/target.json",
3
+ "files": { "walkGlob": "**/package.json" }
4
+ }
@@ -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
+ }