@nitra/cursor 12.8.7 → 12.8.9

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 (111) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +1 -1
  3. package/rules/abie/main.mdc +9 -5
  4. package/rules/abie/policy/base_deployment_preem/base_deployment_preem.mdc +22 -0
  5. package/rules/abie/policy/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
  6. package/rules/abie/policy/health_check_policy/health_check_policy.mdc +17 -0
  7. package/rules/abie/policy/http_route_base/http_route_base.mdc +9 -0
  8. package/rules/abie/policy/package_json_shared/package_json_shared.mdc +17 -0
  9. package/rules/adr/main.mdc +4 -0
  10. package/rules/adr/policy/settings_json/settings_json.mdc +7 -0
  11. package/rules/adr/policy/settings_local_json/settings_local_json.mdc +7 -0
  12. package/rules/bun/main.mdc +3 -4
  13. package/rules/bun/policy/bunfig/bunfig.mdc +12 -0
  14. package/rules/bun/policy/package_json/package_json.mdc +14 -0
  15. package/rules/capacitor/main.mdc +1 -3
  16. package/rules/capacitor/policy/package_json/package_json.mdc +9 -0
  17. package/rules/ci4/main.mdc +2 -0
  18. package/rules/ci4/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  19. package/rules/docker/main.mdc +1 -3
  20. package/rules/docker/policy/lint_docker_yml/lint_docker_yml.mdc +14 -0
  21. package/rules/efes/main.mdc +1 -1
  22. package/rules/efes/policy/package_json_shared/package_json_shared.mdc +30 -0
  23. package/rules/ga/main.mdc +15 -10
  24. package/rules/ga/policy/clean_ga_workflows/clean_ga_workflows.mdc +18 -0
  25. package/rules/ga/policy/clean_merged_branch/clean_merged_branch.mdc +22 -0
  26. package/rules/ga/policy/git_ai/git_ai.mdc +19 -0
  27. package/rules/ga/policy/lint_ga/lint_ga.mdc +21 -0
  28. package/rules/ga/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  29. package/rules/ga/policy/vscode_settings/vscode_settings.mdc +9 -0
  30. package/rules/ga/policy/workflow_common/workflow_common.mdc +18 -0
  31. package/rules/ga/policy/zizmor_yml/zizmor_yml.mdc +9 -0
  32. package/rules/graphql/main.mdc +2 -0
  33. package/rules/graphql/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  34. package/rules/hasura/main.mdc +1 -3
  35. package/rules/hasura/policy/svc_hl/svc_hl.mdc +15 -0
  36. package/rules/image-avif/main.mdc +1 -3
  37. package/rules/image-avif/policy/package_json/package_json.mdc +18 -0
  38. package/rules/image-compress/main.mdc +1 -1
  39. package/rules/image-compress/policy/package_json/package_json.mdc +13 -0
  40. package/rules/js/main.mdc +7 -6
  41. package/rules/js/policy/jscpd/jscpd.mdc +14 -0
  42. package/rules/js/policy/lint_js_yml/lint_js_yml.mdc +14 -0
  43. package/rules/js/policy/package_json/package_json.mdc +15 -0
  44. package/rules/js/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  45. package/rules/js-bun-db/main.mdc +1 -6
  46. package/rules/js-bun-db/policy/package_json/package_json.mdc +17 -0
  47. package/rules/js-bun-redis/main.mdc +2 -0
  48. package/rules/js-bun-redis/policy/package_json/package_json.mdc +11 -0
  49. package/rules/js-mssql/main.mdc +1 -1
  50. package/rules/js-mssql/policy/package_json/package_json.mdc +9 -0
  51. package/rules/js-run/main.mdc +5 -3
  52. package/rules/js-run/policy/configmap/configmap.mdc +31 -0
  53. package/rules/js-run/policy/jsconfig/jsconfig.mdc +25 -0
  54. package/rules/js-run/policy/package_json/package_json.mdc +38 -0
  55. package/rules/k8s/main.mdc +21 -13
  56. package/rules/k8s/policy/base_kustomization/base_kustomization.mdc +12 -0
  57. package/rules/k8s/policy/base_manifest/base_manifest.mdc +14 -0
  58. package/rules/k8s/policy/gateway/gateway.mdc +17 -0
  59. package/rules/k8s/policy/hasura_configmap/hasura_configmap.mdc +20 -0
  60. package/rules/k8s/policy/hasura_httproute/hasura_httproute.mdc +16 -0
  61. package/rules/k8s/policy/hpa_pdb/hpa_pdb.mdc +23 -0
  62. package/rules/k8s/policy/kustomization/kustomization.mdc +20 -0
  63. package/rules/k8s/policy/manifest/manifest.mdc +17 -0
  64. package/rules/k8s/policy/network_policy/network_policy.mdc +22 -0
  65. package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
  66. package/rules/k8s/policy/svc_yaml/svc_yaml.mdc +12 -0
  67. package/rules/nginx-default-tpl/main.mdc +4 -0
  68. package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  69. package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.mdc +15 -0
  70. package/rules/npm-module/main.mdc +6 -3
  71. package/rules/npm-module/policy/emit_types_config/emit_types_config.mdc +40 -0
  72. package/rules/npm-module/policy/npm_package_json/npm_package_json.mdc +50 -0
  73. package/rules/npm-module/policy/root_package_json/root_package_json.mdc +37 -0
  74. package/rules/php/main.mdc +1 -3
  75. package/rules/php/policy/lint_php_yml/lint_php_yml.mdc +21 -0
  76. package/rules/python/main.mdc +3 -4
  77. package/rules/python/policy/lint_python_yml/lint_python_yml.mdc +12 -0
  78. package/rules/python/policy/pyproject_toml/pyproject_toml.mdc +13 -0
  79. package/rules/rego/main.mdc +4 -0
  80. package/rules/rego/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  81. package/rules/rego/policy/vscode_settings/vscode_settings.mdc +19 -0
  82. package/rules/rust/main.mdc +2 -2
  83. package/rules/rust/policy/lint_rust_yml/lint_rust_yml.mdc +12 -0
  84. package/rules/rust/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  85. package/rules/security/main.mdc +3 -2
  86. package/rules/security/policy/lint_security_yml/lint_security_yml.mdc +7 -0
  87. package/rules/security/policy/package_json/package_json.mdc +7 -0
  88. package/rules/style/main.mdc +6 -5
  89. package/rules/style/policy/lint_style_yml/lint_style_yml.mdc +13 -0
  90. package/rules/style/policy/package_json/package_json.mdc +18 -0
  91. package/rules/style/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  92. package/rules/style/policy/vscode_settings/vscode_settings.mdc +19 -0
  93. package/rules/tauri/main.mdc +1 -3
  94. package/rules/tauri/policy/vscode_extensions/vscode_extensions.mdc +21 -0
  95. package/rules/test/main.mdc +1 -3
  96. package/rules/test/policy/package_json/package_json.mdc +16 -0
  97. package/rules/text/main.mdc +13 -7
  98. package/rules/text/policy/cspell/cspell.mdc +34 -0
  99. package/rules/text/policy/lint_text/lint_text.mdc +19 -0
  100. package/rules/text/policy/markdownlint/markdownlint.mdc +38 -0
  101. package/rules/text/policy/oxfmtrc/oxfmtrc.mdc +11 -0
  102. package/rules/text/policy/package_json/package_json.mdc +33 -0
  103. package/rules/text/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  104. package/rules/text/policy/vscode_settings/vscode_settings.mdc +13 -0
  105. package/rules/vue/main.mdc +1 -3
  106. package/rules/vue/policy/package_json/package_json.mdc +30 -0
  107. package/scripts/lib/docs/index.md +36 -36
  108. package/scripts/lib/docs/rule-meta.md +10 -9
  109. package/scripts/lib/docs/run-lint.md +8 -8
  110. package/scripts/lib/rule-meta.mjs +2 -1
  111. package/scripts/lib/run-lint.mjs +39 -1
@@ -0,0 +1,37 @@
1
+ ## Rego-gate: валідація кореневого `package.json`
2
+
3
+ Rego-пакет: `npm-module.root_package_json`
4
+
5
+ Цільовий файл: `package.json` (корінь репозиторію)
6
+
7
+ ### Що перевіряється
8
+
9
+ Subset-of перевірка масиву `workspaces`: кожне значення з канонічного сніпету має бути присутнє у `workspaces`. За замовчуванням обовʼязковий елемент — `"npm"`.
10
+
11
+ Якщо `workspaces` відсутнє або не є масивом — окрема deny-помилка.
12
+
13
+ Канонічний сніпет: [package.json.snippet.json](./template/package.json.snippet.json)
14
+
15
+ Решта перевірок кореневого `package.json` (заборонені поля, devDeps лише `@nitra/*`) — у пакеті `bun.package_json`. FS-перевірки (наявність директорії `npm/`, `npm/package.json`) — у JS.
16
+
17
+ ### Приклади
18
+
19
+ ✓ Правильно — `workspaces` містить `"npm"`:
20
+ ```json
21
+ { "workspaces": ["npm"] }
22
+ ```
23
+
24
+ ✓ Правильно — `workspaces` містить `"npm"` разом з іншими:
25
+ ```json
26
+ { "workspaces": ["demo", "npm", "tests"] }
27
+ ```
28
+
29
+ ✗ Неправильно — `workspaces` відсутній:
30
+ ```json
31
+ { "name": "monorepo" }
32
+ ```
33
+
34
+ ✗ Неправильно — `workspaces` без `"npm"`:
35
+ ```json
36
+ { "workspaces": ["demo"] }
37
+ ```
@@ -13,6 +13,4 @@ alwaysApply: false
13
13
 
14
14
  ## Швидкий gate через conftest
15
15
 
16
- | Пакет | Що перевіряє |
17
- |---|---|
18
- | `php.lint_php_yml` | Структуру `.github/workflows/lint-php.yml` — наявність канонічних `run:`-кроків |
16
+ [php-lint_php_yml](./policy/lint_php_yml/lint_php_yml.mdc)
@@ -0,0 +1,21 @@
1
+ ## Структура `.github/workflows/lint-php.yml`
2
+
3
+ Rego-пакет: `php.lint_php_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-php.yml` (парситься як YAML).
6
+
7
+ Перевіряє, що у workflow присутні всі канонічні `run:`-кроки з template-сніпету — крок `n-cursor lint php --read-only` має бути в одному зі steps jobs.
8
+
9
+ Канонічний template-сніпет: [lint-php.yml.snippet.yml](./template/lint-php.yml.snippet.yml)
10
+
11
+ **✓ Правильно** — job `php` містить крок:
12
+ ```yaml
13
+ - name: Lint PHP
14
+ run: n-cursor lint php --read-only
15
+ ```
16
+
17
+ **✗ Неправильно** — крок відсутній або містить інший run-рядок:
18
+ ```yaml
19
+ - name: Lint PHP
20
+ run: echo something
21
+ ```
@@ -15,7 +15,6 @@ Python-проєкти ведуться **виключно** на [uv](https://do
15
15
 
16
16
  ## Швидкий gate через conftest (Rego)
17
17
 
18
- | Namespace | Що перевіряє |
19
- |-----------|-------------|
20
- | `python.pyproject_toml` | Заборона `[tool.poetry]`; наявність `[project].name` і `[project].version` (PEP 621) |
21
- | `python.lint_python_yml` | Обовʼязкові `uses` і `run`-кроки у `.github/workflows/lint-python.yml` |
18
+ [python-pyproject_toml-policy](./policy/pyproject_toml/pyproject_toml.mdc)
19
+
20
+ [python-lint_python_yml-policy](./policy/lint_python_yml/lint_python_yml.mdc)
@@ -0,0 +1,12 @@
1
+ ## Rego-gate: перевірка `.github/workflows/lint-python.yml`
2
+
3
+ Rego-пакет: `python.lint_python_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-python.yml`
6
+
7
+ Перевіряє (drift-safe через `--data template`):
8
+
9
+ - кожен `uses` з канону (підмножина) присутній у workflow: `actions/checkout@v6`, `./.github/actions/setup-bun-deps`, `astral-sh/setup-uv@v8.0.0`;
10
+ - кожен `run` з канону є substring серед run-кроків: `uv sync --frozen`, `n-cursor lint python --read-only`.
11
+
12
+ Канонічний workflow: [lint-python.yml.snippet.yml](./template/lint-python.yml.snippet.yml)
@@ -0,0 +1,13 @@
1
+ ## Rego-gate: перевірка `pyproject.toml`
2
+
3
+ Rego-пакет: `python.pyproject_toml`
4
+
5
+ Цільовий файл: `pyproject.toml`
6
+
7
+ Дві групи правил:
8
+
9
+ **1. Заборона Poetry** — перевіряє заборонені під-таблиці `[tool.*]` за deny-template (drift-safe через `--data template`): [pyproject.toml.deny.toml](./template/pyproject.toml.deny.toml)
10
+
11
+ **2. PEP 621** — `[project].name` і `[project].version` мають бути непорожніми рядками.
12
+
13
+ Канонічний цільовий вигляд: [pyproject.toml.snippet.toml](./template/pyproject.toml.snippet.toml)
@@ -21,3 +21,7 @@ alwaysApply: false
21
21
  [rego-vscode_extensions](./js/vscode_extensions.mdc)
22
22
 
23
23
  [rego-vscode_settings](./js/vscode_settings.mdc)
24
+
25
+ [rego-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
26
+
27
+ [rego-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -0,0 +1,11 @@
1
+ ## Rego-перевірка наявності tsandall.opa у recommendations
2
+
3
+ Rego-пакет: `rego.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Перевіряє: поле `recommendations` містить рядок `"tsandall.opa"`. Порожній масив або відсутнє поле — deny. Додаткові записи дозволені.
8
+
9
+ Канонічний сніпет: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
10
+
11
+ Логіка: subset-of — кожна рекомендація зі сніпету має бути присутня у `recommendations` вхідного файлу. Канон надходить через `--data` як `data.template.snippet`.
@@ -0,0 +1,19 @@
1
+ ## Rego-gate: налаштування форматера rego у `.vscode/settings.json`
2
+
3
+ Rego-пакет: `rego.vscode_settings`
4
+
5
+ Цільовий файл: `.vscode/settings.json`
6
+
7
+ Перевіряє `[rego]`-блок — два листові ключі:
8
+
9
+ - `editor.defaultFormatter` має дорівнювати `"tsandall.opa"`
10
+ - `editor.formatOnSave` має бути `true`
11
+
12
+ Канонічний сніпет: [settings.json.snippet.json](./template/settings.json.snippet.json)
13
+
14
+ Два незалежні deny-правила:
15
+
16
+ 1. Leaf-by-leaf: якщо `[rego]`-блок є обʼєктом — кожне ключ/значення зі сніпету звіряється з фактичним значенням (відсутнє або відмінне — deny).
17
+ 2. Тип: якщо `[rego]`-блок присутній, але не є обʼєктом (наприклад, рядок) — окрема помилка типу.
18
+
19
+ Канон надходить через `--data` як `data.template.snippet`.
@@ -14,5 +14,5 @@ version: '1.4'
14
14
 
15
15
  ## Швидкий gate через conftest
16
16
 
17
- - `rust.lint_rust_yml` — перевіряє `.github/workflows/lint-rust.yml`: наявність обов'язкових `uses` (`actions/checkout@v6`, `dtolnay/rust-toolchain@stable`, `Swatinem/rust-cache@v2`) та `run`-кроків з канону.
18
- - `rust.vscode_extensions` — перевіряє `.vscode/extensions.json`: `recommendations` містить `rust-lang.rust-analyzer` і `tamasfe.even-better-toml`.
17
+ [rust-lint_rust_yml](./policy/lint_rust_yml/lint_rust_yml.mdc)
18
+ [rust-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
@@ -0,0 +1,12 @@
1
+ ## Перевірка `.github/workflows/lint-rust.yml`
2
+
3
+ Rego-пакет: `rust.lint_rust_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-rust.yml`
6
+
7
+ Перевіряє:
8
+ - кожен `uses`-крок з канону присутній у workflow (підмножина): `actions/checkout@v6`, `dtolnay/rust-toolchain@stable`, `Swatinem/rust-cache@v2`
9
+ - кожен `run`-крок з канону присутній як підрядок серед усіх `run`-кроків: `cargo fmt --all -- --check`, `cargo clippy --all-targets --all-features -- -D warnings`
10
+ - канон завантажується через `--data` з template-сніпету — drift-safe: зміна шаблону автоматично рухає перевірку
11
+
12
+ Канонічний template: [lint-rust.yml.snippet.yml](./template/lint-rust.yml.snippet.yml)
@@ -0,0 +1,9 @@
1
+ ## Перевірка `.vscode/extensions.json` (Rego-gate)
2
+
3
+ Rego-пакет: `rust.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Семантика `contains`: кожен запис з канону має бути присутнім у `recommendations` — додаткові розширення дозволені. Канон завантажується через `--data` з template-сніпету.
8
+
9
+ Канонічний template: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
@@ -15,8 +15,9 @@ version: '2.1'
15
15
 
16
16
  ## Швидкий gate через conftest
17
17
 
18
- - `security.package_json` — забороняє `trufflehog` у `dependencies`/`devDependencies`
19
- - `security.lint_security_yml` — перевіряє наявність кроку `trufflesecurity/trufflehog@main` у CI workflow
18
+ [security-package-json](./policy/package_json/package_json.mdc)
19
+
20
+ [security-lint-security-yml](./policy/lint_security_yml/lint_security_yml.mdc)
20
21
 
21
22
  ## Перевірка
22
23
 
@@ -0,0 +1,7 @@
1
+ ## Наявність кроку TruffleHog у CI workflow
2
+
3
+ Rego-пакет: `security.lint_security_yml`
4
+
5
+ Цільові файли: `.github/workflows/lint-security.yml`
6
+
7
+ Перевіряє, що серед `uses:` у workflow присутній крок `trufflesecurity/trufflehog@main`. Очікуваний перелік action-refs (не-`actions/*`) береться з `--data` через [lint-security.yml.snippet.yml](./template/lint-security.yml.snippet.yml). Універсальні кроки (`actions/*`) перевіряє `ga.workflow_common`.
@@ -0,0 +1,7 @@
1
+ ## Заборона `trufflehog` у залежностях `package.json`
2
+
3
+ Rego-пакет: `security.package_json`
4
+
5
+ Цільові файли: `package.json`
6
+
7
+ Перевіряє, що пакет `trufflehog` відсутній у `dependencies` та `devDependencies` — він є глобальним CLI і не має бути npm-залежністю. Список заборонених пакетів надходить через `--data` з [package.json.deny.json](./template/package.json.deny.json).
@@ -21,9 +21,10 @@ alwaysApply: false
21
21
 
22
22
  ## Швидкий gate через conftest (Rego)
23
23
 
24
- Пакети у `npm/rules/style/policy/`:
24
+ [style-lint_style_yml](./policy/lint_style_yml/lint_style_yml.mdc)
25
25
 
26
- - `style_lint.package_json` — `package.json`: `stylelint.extends == "@nitra/stylelint-config"`, `@nitra/stylelint-config` у `devDependencies`.
27
- - `style_lint.vscode_extensions` — `.vscode/extensions.json`: `recommendations` містить `stylelint.vscode-stylelint`.
28
- - `style_lint.vscode_settings` — `.vscode/settings.json`: `css.validate`, `less.validate`, `scss.validate` вимкнені (`false`).
29
- - `style_lint.lint_style_yml` — `.github/workflows/lint-style.yml`: крок `run` містить команду `n-cursor lint style --read-only`.
26
+ [style-package_json](./policy/package_json/package_json.mdc)
27
+
28
+ [style-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
29
+
30
+ [style-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -0,0 +1,13 @@
1
+ ## GitHub Actions workflow: lint-style.yml
2
+
3
+ Rego-пакет: `style_lint.lint_style_yml`
4
+
5
+ Цільовий файл: `.github/workflows/lint-style.yml`
6
+
7
+ Перевіряє, що у workflow є крок `run`, який містить команду `n-cursor lint style --read-only` (substring-match по всіх кроках усіх jobs). Канонічний текст береться з template через `--data`.
8
+
9
+ Канонічний template: [lint-style.yml.snippet.yml](./template/lint-style.yml.snippet.yml)
10
+
11
+ **✓ Правильно** — крок `run: n-cursor lint style --read-only` присутній у jobs.stylelint.steps.
12
+
13
+ **✗ Неправильно** — крок відсутній або містить лише `echo nothing` / `npx stylelint` без канонічного рядка.
@@ -0,0 +1,18 @@
1
+ ## package.json: stylelint-конфіг та devDependencies
2
+
3
+ Rego-пакет: `style_lint.package_json`
4
+
5
+ Цільовий файл: `package.json`
6
+
7
+ Дві незалежні перевірки:
8
+
9
+ 1. **snippet-walker** — якщо поле `stylelint` присутнє у `package.json`, перевіряє `stylelint.extends == "@nitra/stylelint-config"` (2-рівневий обхід через template).
10
+ 2. **presence-check** — `@nitra/stylelint-config` має бути у `devDependencies` (ця перевірка завжди активна, не залежить від template).
11
+
12
+ FS-альтернативи (`.stylelintrc.*` файли) та `.stylelintignore` перевіряються у JS, не в Rego.
13
+
14
+ Канонічний template: [package.json.snippet.json](./template/package.json.snippet.json)
15
+
16
+ **✓ Правильно** — `devDependencies` містить `@nitra/stylelint-config`; якщо є поле `stylelint` — `extends` дорівнює `"@nitra/stylelint-config"`.
17
+
18
+ **✗ Неправильно** — відсутній `@nitra/stylelint-config` у `devDependencies`; або поле `stylelint.extends` має інше значення.
@@ -0,0 +1,13 @@
1
+ ## .vscode/extensions.json: розширення для stylelint
2
+
3
+ Rego-пакет: `style_lint.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Перевіряє, що масив `recommendations` містить усі записи з канонічного template (subset-check). Додаткові розширення поза списком — дозволені.
8
+
9
+ Канонічний template: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
10
+
11
+ **✓ Правильно** — `recommendations` містить `"stylelint.vscode-stylelint"` (може бути і більше елементів).
12
+
13
+ **✗ Неправильно** — `recommendations` відсутній або не містить `"stylelint.vscode-stylelint"`.
@@ -0,0 +1,19 @@
1
+ ## .vscode/settings.json: вимкнення вбудованих CSS/SCSS/Less валідаторів
2
+
3
+ Rego-пакет: `style_lint.vscode_settings`
4
+
5
+ Цільовий файл: `.vscode/settings.json`
6
+
7
+ Leaf-by-leaf walker: перевіряє кожен ключ з template — його значення у `settings.json` має точно збігатися. Додаткові ключі у файлі — дозволені.
8
+
9
+ Канонічний template: [settings.json.snippet.json](./template/settings.json.snippet.json)
10
+
11
+ Обов'язкові значення:
12
+
13
+ - `"css.validate": false`
14
+ - `"less.validate": false`
15
+ - `"scss.validate": false`
16
+
17
+ **✓ Правильно** — усі три ключі присутні зі значенням `false`; можуть бути й інші ключі.
18
+
19
+ **✗ Неправильно** — будь-який з ключів відсутній, має значення `true` або рядок (`"off"`).
@@ -9,9 +9,7 @@ version: '1.5'
9
9
 
10
10
  ## Швидкий gate через conftest
11
11
 
12
- | Namespace | Файл | Що перевіряє |
13
- |---|---|---|
14
- | `tauri.vscode_extensions` | `.vscode/extensions.json` | `recommendations` містить `tauri-apps.tauri-vscode` |
12
+ [tauri-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
15
13
 
16
14
  [tauri-tooling](./js/tooling.mdc)
17
15
 
@@ -0,0 +1,21 @@
1
+ ## VS Code розширення для Tauri-проєктів
2
+
3
+ Rego-пакет: `tauri.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ Перевіряє, що поле `recommendations` містить розширення `tauri-apps.tauri-vscode`.
8
+
9
+ Запускається умовно — лише якщо JS-перевірка (`tooling.mjs`) виявила маркер Tauri-проєкту (`src-tauri/`, `tauri.conf.json` або залежність `@tauri-apps/*`). Розширення `rust-lang.rust-analyzer` і `tamasfe.even-better-toml` вимагаються окремо правилом `rust` (rust.mdc).
10
+
11
+ **✓ Правильно:**
12
+ ```json
13
+ { "recommendations": ["tauri-apps.tauri-vscode"] }
14
+ ```
15
+
16
+ **✗ Неправильно:**
17
+ ```json
18
+ { "recommendations": ["rust-lang.rust-analyzer"] }
19
+ { "recommendations": [] }
20
+ {}
21
+ ```
@@ -39,6 +39,4 @@ alwaysApply: false
39
39
 
40
40
  ## Швидкий gate через conftest
41
41
 
42
- | Namespace | Що перевіряє |
43
- |---|---|
44
- | `test.package_json` | `scripts.coverage` містить `n-cursor coverage`; `scripts.test` містить `vitest` |
42
+ [test-package_json](./policy/package_json/package_json.mdc)
@@ -0,0 +1,16 @@
1
+ ## Обовʼязкові скрипти в package.json
2
+
3
+ Rego-пакет: `test.package_json`
4
+
5
+ Цільовий файл: `package.json` кожного workspace.
6
+
7
+ Перевіряє substring-відповідність значень у `scripts`:
8
+
9
+ | Поле | Має містити |
10
+ |---|---|
11
+ | `scripts.coverage` | `n-cursor coverage` |
12
+ | `scripts.test` | `vitest` |
13
+
14
+ Substring-семантика: команди-обгортки (наприклад `bun run pre-coverage && n-cursor coverage`) дозволені — головне, щоб потрібний рядок був присутній.
15
+
16
+ Канон підтягується через `--data`: [package.json.contains.json](./template/package.json.contains.json)
@@ -30,10 +30,16 @@ version: '1.30'
30
30
 
31
31
  Rego-пакети, що перевіряються через conftest (auto-discovered за `target.json` поряд із `.rego`):
32
32
 
33
- - `text.cspell` — `.cspell.json`: version, ignorePaths, import (@nitra/cspell-dict), language, заборонені @cspell/dict-* у import
34
- - `text.lint_text` — `.github/workflows/lint-text.yml`: name, on.push/pull_request branches+paths, runs-on, permissions, кроки uses+run
35
- - `text.markdownlint` — `.markdownlint-cli2.jsonc`: gitignore, config leafs (MD013, MD024.siblings_only, MD029, MD040, MD041)
36
- - `text.oxfmtrc` — `.oxfmtrc.json`: обовʼязкові ключі (presence), ignorePatterns subset, scalar leafs
37
- - `text.package_json` — `package.json`: заборонені top-level/deps (prettier, @nitra/prettier-config, markdownlint-cli2), @nitra/cspell-dict ^2.0.0+ у devDependencies, scripts без prettier
38
- - `text.vscode_extensions` — `.vscode/extensions.json`: recommendations містить канонічні розширення
39
- - `text.vscode_settings` — `.vscode/settings.json`: editor.formatOnSave, editor.defaultFormatter для мов
33
+ [text-policy-cspell](./policy/cspell/cspell.mdc)
34
+
35
+ [text-policy-lint_text](./policy/lint_text/lint_text.mdc)
36
+
37
+ [text-policy-markdownlint](./policy/markdownlint/markdownlint.mdc)
38
+
39
+ [text-policy-oxfmtrc](./policy/oxfmtrc/oxfmtrc.mdc)
40
+
41
+ [text-policy-package_json](./policy/package_json/package_json.mdc)
42
+
43
+ [text-policy-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
44
+
45
+ [text-policy-vscode_settings](./policy/vscode_settings/vscode_settings.mdc)
@@ -0,0 +1,34 @@
1
+ ## Перевірка `.cspell.json` — структура та canonical import
2
+
3
+ Rego-пакет: `text.cspell`
4
+
5
+ Цільовий файл: `.cspell.json`
6
+
7
+ **Що перевіряється:**
8
+
9
+ - `version` — має відповідати канону (наразі `"0.2"`)
10
+ - `language` — поле обов'язкове (presence-only, значення довільне, наприклад `"en,uk"`)
11
+ - `ignorePaths` — масив має бути надмножиною канонічних glob-ів, включно з `docs/adr/**`
12
+ - `import` — має містити підрядок `@nitra/cspell-dict`; заборонені будь-які записи з підрядком `@cspell/dict-` (використовуй лише `@nitra/cspell-dict`)
13
+
14
+ **Приклади:**
15
+
16
+ ✓ правильно:
17
+ ```json
18
+ {
19
+ "version": "0.2",
20
+ "language": "en,uk",
21
+ "import": ["@nitra/cspell-dict/cspell-ext.json"],
22
+ "ignorePaths": ["**/node_modules/**", "**/.git/**", "docs/adr/**"]
23
+ }
24
+ ```
25
+
26
+ ✗ неправильно:
27
+ ```json
28
+ {
29
+ "version": "0.1",
30
+ "import": ["@cspell/dict-de"],
31
+ "ignorePaths": []
32
+ }
33
+ ```
34
+ (відсутнє `language`, застарілий `version`, заборонений `@cspell/dict-`, не всі canonical `ignorePaths`)
@@ -0,0 +1,19 @@
1
+ ## Перевірка `.github/workflows/lint-text.yml` — структура CI-workflow
2
+
3
+ Rego-пакет: `text.lint_text`
4
+
5
+ Цільовий файл: `.github/workflows/lint-text.yml`
6
+
7
+ **Що перевіряється:**
8
+
9
+ - `name` — має бути `"Lint Text"`
10
+ - `on.push.branches` та `on.pull_request.branches` — мають містити `dev` і `main`
11
+ - `on.push.paths` — має бути надмножиною канонічних glob-ів (усі текстові розширення)
12
+ - `jobs.text` — job обов'язковий
13
+ - `jobs.text.runs-on` — має бути `ubuntu-latest`
14
+ - `jobs.text.permissions.contents` — має бути `read`
15
+ - `jobs.text.steps` — не порожній; має містити всі канонічні `uses:` та `run:` підрядки
16
+
17
+ Канонічна структура workflow: [lint-text.yml.snippet.yml](./template/lint-text.yml.snippet.yml)
18
+
19
+ **Примітка:** conftest парсить YAML 1.1, де ключ `on:` без лапок перетворюється на булевий `true` — rego читає on-блок через `input["true"]`.
@@ -0,0 +1,38 @@
1
+ ## Перевірка `.markdownlint-cli2.jsonc` — конфігурація markdownlint
2
+
3
+ Rego-пакет: `text.markdownlint`
4
+
5
+ Цільовий файл: `.markdownlint-cli2.jsonc`
6
+
7
+ **Що перевіряється (generic walker по канонічному snippet):**
8
+
9
+ - Top-level scalar leafs (наприклад `gitignore: true`)
10
+ - 2-рівневі leafs: `config.<rule>` — скалярні значення правил (MD013, MD029, MD040, MD041 тощо)
11
+ - 3-рівневі leafs: `config.MD024.siblings_only` — вкладене поле
12
+ - Наявність самого об'єкта `config` (якщо відсутній — deny)
13
+
14
+ **Приклади:**
15
+
16
+ ✓ правильно:
17
+ ```jsonc
18
+ {
19
+ "gitignore": true,
20
+ "config": {
21
+ "MD013": false,
22
+ "MD024": { "siblings_only": true },
23
+ "MD029": false,
24
+ "MD040": false,
25
+ "MD041": false
26
+ }
27
+ }
28
+ ```
29
+
30
+ ✗ неправильно:
31
+ ```jsonc
32
+ {
33
+ "gitignore": false,
34
+ "config": {
35
+ "MD024": {}
36
+ }
37
+ }
38
+ ```
@@ -0,0 +1,11 @@
1
+ ## Перевірка `.oxfmtrc.json` — конфігурація oxfmt форматера
2
+
3
+ Rego-пакет: `text.oxfmtrc`
4
+
5
+ Цільовий файл: `.oxfmtrc.json`
6
+
7
+ **Що перевіряється:**
8
+
9
+ - Наявність усіх обов'язкових ключів (presence-only): `arrowParens`, `printWidth`, `bracketSpacing`, `bracketSameLine`, `semi`, `singleQuote`, `tabWidth`, `trailingComma`, `useTabs`
10
+ - Scalar leafs: точні значення відповідно до канонічного snippet
11
+ - `ignorePatterns`: масив має бути надмножиною канонічних glob-ів (subset-of перевірка)
@@ -0,0 +1,33 @@
1
+ ## Перевірка `package.json` — текст-специфічні обмеження
2
+
3
+ Rego-пакет: `text.package_json`
4
+
5
+ Цільовий файл: `package.json`
6
+
7
+ **Що перевіряється:**
8
+
9
+ - Заборонені top-level поля: `prettier`
10
+ - Заборонені пакети у `dependencies` / `devDependencies`: `prettier`, `@nitra/prettier-config`, `markdownlint-cli2` (використовуй `bunx` у lint-text)
11
+ - `@nitra/cspell-dict` обов'язковий у `devDependencies` з версією `^2.0.0` або новішою
12
+ - `scripts.*` — будь-який скрипт, що викликає `prettier` (через `bunx`, `npx`, прямо або через шлях), заборонений; використовуй `oxfmt`
13
+
14
+ Список заборонених пакетів: [package.json.deny.json](./template/package.json.deny.json)
15
+
16
+ **Приклади:**
17
+
18
+ ✓ правильно:
19
+ ```json
20
+ {
21
+ "devDependencies": { "@nitra/cspell-dict": "^2.0.0" },
22
+ "scripts": { "format": "oxfmt --write ." }
23
+ }
24
+ ```
25
+
26
+ ✗ неправильно:
27
+ ```json
28
+ {
29
+ "prettier": "@nitra/prettier-config",
30
+ "devDependencies": { "prettier": "^3.0.0", "@nitra/cspell-dict": "^1.0.0" },
31
+ "scripts": { "fix": "bunx prettier --write ." }
32
+ }
33
+ ```
@@ -0,0 +1,13 @@
1
+ ## Перевірка `.vscode/extensions.json` — канонічні розширення
2
+
3
+ Rego-пакет: `text.vscode_extensions`
4
+
5
+ Цільовий файл: `.vscode/extensions.json`
6
+
7
+ **Що перевіряється:**
8
+
9
+ - `recommendations` має бути надмножиною канонічного списку розширень
10
+
11
+ Канонічний snippet: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
12
+
13
+ Обов'язкові розширення: `DavidAnson.vscode-markdownlint`, `oxc.oxc-vscode`, `timonwong.shellcheck`
@@ -0,0 +1,13 @@
1
+ ## Перевірка `.vscode/settings.json` — налаштування редактора
2
+
3
+ Rego-пакет: `text.vscode_settings`
4
+
5
+ Цільовий файл: `.vscode/settings.json`
6
+
7
+ **Що перевіряється (generic walker по канонічному snippet):**
8
+
9
+ - Scalar leafs: `editor.formatOnSave` має бути `true`
10
+ - Об'єктні блоки мовних налаштувань `[javascript]`, `[typescript]`, `[json]`, `[vue]`, `[css]`, `[html]`: `editor.defaultFormatter` має бути `"oxc.oxc-vscode"`
11
+ - Якщо блок відсутній або не є об'єктом — deny
12
+
13
+ Канонічний snippet: [settings.json.snippet.json](./template/settings.json.snippet.json)
@@ -33,9 +33,7 @@ alwaysApply: false
33
33
 
34
34
  Rego-перевірки (запускаються через `npx @nitra/cursor fix vue`):
35
35
 
36
- | Namespace | Що перевіряє |
37
- | --- | --- |
38
- | `vue.package_json` | `vite` ≥ 8 у devDeps, наявність `@vitejs/plugin-vue`, `vue-macros`, `unplugin-auto-import`, `vite-plugin-vue-layouts-next`; відсутність `esbuild`, `vitest`, `jsdom` |
36
+ [vue-package_json](./policy/package_json/package_json.mdc)
39
37
 
40
38
  ## Перевірка
41
39
 
@@ -0,0 +1,30 @@
1
+ ## Залежності Vue+Vite пакета — канонічний набір і заборони
2
+
3
+ Rego-пакет: `vue.package_json`
4
+
5
+ Цільові файли: `**/package.json`
6
+
7
+ Перевірка активна лише якщо у `dependencies` присутній `vue`.
8
+
9
+ **Обов'язкові залежності:**
10
+
11
+ - `devDependencies.vite` — мажорна версія ≥ 8
12
+ - `devDependencies.@vitejs/plugin-vue`
13
+ - `vue-macros` (dependencies або devDependencies)
14
+ - `unplugin-auto-import` (dependencies або devDependencies)
15
+ - `vite-plugin-vue-layouts-next` (dependencies або devDependencies)
16
+
17
+ **Заборонені залежності (у будь-якій групі):**
18
+
19
+ - `esbuild` — замінено на rolldown
20
+ - `vitest` — замінено на Bun Test Runner (`bun test`)
21
+ - `jsdom` — замінено на happy-dom
22
+
23
+ Приклади:
24
+
25
+ ```
26
+ ✓ "devDependencies": { "vite": "^8.0.0", "@vitejs/plugin-vue": "^6.0.0", "vue-macros": "^3.0.0", "unplugin-auto-import": "^20.0.0", "vite-plugin-vue-layouts-next": "^1.0.0" }
27
+ ✗ "devDependencies": { "vite": "^7.0.0", "esbuild": "^0.25.0", "vitest": "^3.0.0", "jsdom": "^25.0.0" }
28
+ ```
29
+
30
+ Пакети без `vue` у `dependencies` — ігноруються повністю.