@nitra/cursor 12.8.7 → 12.8.8
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 +6 -0
- package/package.json +1 -1
- package/rules/abie/main.mdc +9 -5
- package/rules/abie/policy/base_deployment_preem/base_deployment_preem.mdc +22 -0
- package/rules/abie/policy/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
- package/rules/abie/policy/health_check_policy/health_check_policy.mdc +17 -0
- package/rules/abie/policy/http_route_base/http_route_base.mdc +9 -0
- package/rules/abie/policy/package_json_shared/package_json_shared.mdc +17 -0
- package/rules/adr/main.mdc +4 -0
- package/rules/adr/policy/settings_json/settings_json.mdc +7 -0
- package/rules/adr/policy/settings_local_json/settings_local_json.mdc +7 -0
- package/rules/bun/main.mdc +3 -4
- package/rules/bun/policy/bunfig/bunfig.mdc +12 -0
- package/rules/bun/policy/package_json/package_json.mdc +14 -0
- package/rules/capacitor/main.mdc +1 -3
- package/rules/capacitor/policy/package_json/package_json.mdc +9 -0
- package/rules/ci4/main.mdc +2 -0
- package/rules/ci4/policy/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/docker/main.mdc +1 -3
- package/rules/docker/policy/lint_docker_yml/lint_docker_yml.mdc +14 -0
- package/rules/efes/main.mdc +1 -1
- package/rules/efes/policy/package_json_shared/package_json_shared.mdc +30 -0
- package/rules/ga/main.mdc +15 -10
- package/rules/ga/policy/clean_ga_workflows/clean_ga_workflows.mdc +18 -0
- package/rules/ga/policy/clean_merged_branch/clean_merged_branch.mdc +22 -0
- package/rules/ga/policy/git_ai/git_ai.mdc +19 -0
- package/rules/ga/policy/lint_ga/lint_ga.mdc +21 -0
- package/rules/ga/policy/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/ga/policy/vscode_settings/vscode_settings.mdc +9 -0
- package/rules/ga/policy/workflow_common/workflow_common.mdc +18 -0
- package/rules/ga/policy/zizmor_yml/zizmor_yml.mdc +9 -0
- package/rules/graphql/main.mdc +2 -0
- package/rules/graphql/policy/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/hasura/main.mdc +1 -3
- package/rules/hasura/policy/svc_hl/svc_hl.mdc +15 -0
- package/rules/image-avif/main.mdc +1 -3
- package/rules/image-avif/policy/package_json/package_json.mdc +18 -0
- package/rules/image-compress/main.mdc +1 -1
- package/rules/image-compress/policy/package_json/package_json.mdc +13 -0
- package/rules/js/main.mdc +7 -6
- package/rules/js/policy/jscpd/jscpd.mdc +14 -0
- package/rules/js/policy/lint_js_yml/lint_js_yml.mdc +14 -0
- package/rules/js/policy/package_json/package_json.mdc +15 -0
- package/rules/js/policy/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/js-bun-db/main.mdc +1 -6
- package/rules/js-bun-db/policy/package_json/package_json.mdc +17 -0
- package/rules/js-bun-redis/main.mdc +2 -0
- package/rules/js-bun-redis/policy/package_json/package_json.mdc +11 -0
- package/rules/js-mssql/main.mdc +1 -1
- package/rules/js-mssql/policy/package_json/package_json.mdc +9 -0
- package/rules/js-run/main.mdc +5 -3
- package/rules/js-run/policy/configmap/configmap.mdc +31 -0
- package/rules/js-run/policy/jsconfig/jsconfig.mdc +25 -0
- package/rules/js-run/policy/package_json/package_json.mdc +38 -0
- package/rules/k8s/main.mdc +21 -13
- package/rules/k8s/policy/base_kustomization/base_kustomization.mdc +12 -0
- package/rules/k8s/policy/base_manifest/base_manifest.mdc +14 -0
- package/rules/k8s/policy/gateway/gateway.mdc +17 -0
- package/rules/k8s/policy/hasura_configmap/hasura_configmap.mdc +20 -0
- package/rules/k8s/policy/hasura_httproute/hasura_httproute.mdc +16 -0
- package/rules/k8s/policy/hpa_pdb/hpa_pdb.mdc +23 -0
- package/rules/k8s/policy/kustomization/kustomization.mdc +20 -0
- package/rules/k8s/policy/manifest/manifest.mdc +17 -0
- package/rules/k8s/policy/network_policy/network_policy.mdc +22 -0
- package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
- package/rules/k8s/policy/svc_yaml/svc_yaml.mdc +12 -0
- package/rules/nginx-default-tpl/main.mdc +4 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.mdc +15 -0
- package/rules/npm-module/main.mdc +6 -3
- package/rules/npm-module/policy/emit_types_config/emit_types_config.mdc +40 -0
- package/rules/npm-module/policy/npm_package_json/npm_package_json.mdc +50 -0
- package/rules/npm-module/policy/root_package_json/root_package_json.mdc +37 -0
- package/rules/php/main.mdc +1 -3
- package/rules/php/policy/lint_php_yml/lint_php_yml.mdc +21 -0
- package/rules/python/main.mdc +3 -4
- package/rules/python/policy/lint_python_yml/lint_python_yml.mdc +12 -0
- package/rules/python/policy/pyproject_toml/pyproject_toml.mdc +13 -0
- package/rules/rego/main.mdc +4 -0
- package/rules/rego/policy/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/rego/policy/vscode_settings/vscode_settings.mdc +19 -0
- package/rules/rust/main.mdc +2 -2
- package/rules/rust/policy/lint_rust_yml/lint_rust_yml.mdc +12 -0
- package/rules/rust/policy/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/security/main.mdc +3 -2
- package/rules/security/policy/lint_security_yml/lint_security_yml.mdc +7 -0
- package/rules/security/policy/package_json/package_json.mdc +7 -0
- package/rules/style/main.mdc +6 -5
- package/rules/style/policy/lint_style_yml/lint_style_yml.mdc +13 -0
- package/rules/style/policy/package_json/package_json.mdc +18 -0
- package/rules/style/policy/vscode_extensions/vscode_extensions.mdc +13 -0
- package/rules/style/policy/vscode_settings/vscode_settings.mdc +19 -0
- package/rules/tauri/main.mdc +1 -3
- package/rules/tauri/policy/vscode_extensions/vscode_extensions.mdc +21 -0
- package/rules/test/main.mdc +1 -3
- package/rules/test/policy/package_json/package_json.mdc +16 -0
- package/rules/text/main.mdc +13 -7
- package/rules/text/policy/cspell/cspell.mdc +34 -0
- package/rules/text/policy/lint_text/lint_text.mdc +19 -0
- package/rules/text/policy/markdownlint/markdownlint.mdc +38 -0
- package/rules/text/policy/oxfmtrc/oxfmtrc.mdc +11 -0
- package/rules/text/policy/package_json/package_json.mdc +33 -0
- package/rules/text/policy/vscode_extensions/vscode_extensions.mdc +13 -0
- package/rules/text/policy/vscode_settings/vscode_settings.mdc +13 -0
- package/rules/vue/main.mdc +1 -3
- package/rules/vue/policy/package_json/package_json.mdc +30 -0
|
@@ -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
|
+
```
|
package/rules/php/main.mdc
CHANGED
|
@@ -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
|
+
```
|
package/rules/python/main.mdc
CHANGED
|
@@ -15,7 +15,6 @@ Python-проєкти ведуться **виключно** на [uv](https://do
|
|
|
15
15
|
|
|
16
16
|
## Швидкий gate через conftest (Rego)
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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)
|
package/rules/rego/main.mdc
CHANGED
|
@@ -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`.
|
package/rules/rust/main.mdc
CHANGED
|
@@ -14,5 +14,5 @@ version: '1.4'
|
|
|
14
14
|
|
|
15
15
|
## Швидкий gate через conftest
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
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)
|
package/rules/security/main.mdc
CHANGED
|
@@ -15,8 +15,9 @@ version: '2.1'
|
|
|
15
15
|
|
|
16
16
|
## Швидкий gate через conftest
|
|
17
17
|
|
|
18
|
-
-
|
|
19
|
-
|
|
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).
|
package/rules/style/main.mdc
CHANGED
|
@@ -21,9 +21,10 @@ alwaysApply: false
|
|
|
21
21
|
|
|
22
22
|
## Швидкий gate через conftest (Rego)
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
[style-lint_style_yml](./policy/lint_style_yml/lint_style_yml.mdc)
|
|
25
25
|
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
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"`).
|
package/rules/tauri/main.mdc
CHANGED
|
@@ -9,9 +9,7 @@ version: '1.5'
|
|
|
9
9
|
|
|
10
10
|
## Швидкий gate через conftest
|
|
11
11
|
|
|
12
|
-
|
|
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
|
+
```
|
package/rules/test/main.mdc
CHANGED
|
@@ -39,6 +39,4 @@ alwaysApply: false
|
|
|
39
39
|
|
|
40
40
|
## Швидкий gate через conftest
|
|
41
41
|
|
|
42
|
-
|
|
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)
|
package/rules/text/main.mdc
CHANGED
|
@@ -30,10 +30,16 @@ version: '1.30'
|
|
|
30
30
|
|
|
31
31
|
Rego-пакети, що перевіряються через conftest (auto-discovered за `target.json` поряд із `.rego`):
|
|
32
32
|
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
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)
|
package/rules/vue/main.mdc
CHANGED
|
@@ -33,9 +33,7 @@ alwaysApply: false
|
|
|
33
33
|
|
|
34
34
|
Rego-перевірки (запускаються через `npx @nitra/cursor fix vue`):
|
|
35
35
|
|
|
36
|
-
|
|
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` — ігноруються повністю.
|