@nitra/cursor 12.8.9 → 12.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-template/settings.template.json +1 -23
- package/CHANGELOG.md +14 -1
- package/bin/n-cursor.js +21 -48
- package/docs/stryker.config.md +0 -2
- package/lib/docs/llm.md +16 -21
- package/lib/docs/omlx.md +20 -25
- package/lib/llm.mjs +25 -7
- package/lib/omlx.mjs +10 -3
- package/package.json +5 -5
- package/rules/abie/docs/index.md +0 -1
- package/rules/abie/docs/main.md +0 -2
- package/rules/abie/lib/docs/http-route.md +9 -12
- package/rules/abie/lib/http-route.mjs +3 -0
- package/rules/abie/main.mdc +0 -22
- package/rules/abie/policy/health_check_policy/health_check_policy.mdc +3 -1
- package/rules/abie/policy/health_check_policy/health_check_policy.rego +27 -0
- package/rules/adr/docs/index.md +0 -1
- package/rules/adr/docs/main.md +0 -2
- package/rules/adr/js/madr_format.mdc +13 -1
- package/rules/adr/main.mdc +0 -9
- package/rules/bun/docs/index.md +0 -1
- package/rules/bun/docs/main.md +0 -2
- package/rules/bun/main.mdc +1 -15
- package/rules/bun/policy/package_json/package_json.rego +12 -0
- package/rules/capacitor/docs/index.md +0 -1
- package/rules/capacitor/docs/main.md +0 -2
- package/rules/capacitor/main.mdc +0 -6
- package/rules/changelog/docs/index.md +0 -1
- package/rules/changelog/docs/main.md +0 -2
- package/rules/changelog/js/agent-workflow.mdc +1 -1
- package/rules/changelog/js/consistency.mjs +3 -3
- package/rules/changelog/js/docs/consistency.md +18 -23
- package/rules/changelog/main.mdc +0 -5
- package/rules/ci4/docs/index.md +0 -1
- package/rules/ci4/docs/main.md +0 -2
- package/rules/ci4/main.mdc +0 -5
- package/rules/doc-files/docs/index.md +0 -1
- package/rules/doc-files/docs/main.md +7 -11
- package/rules/doc-files/js/docs/docgen-crc.md +0 -2
- package/rules/doc-files/js/docs/docgen-extract.md +0 -2
- package/rules/doc-files/js/docs/docgen-files-batch.md +0 -2
- package/rules/doc-files/js/docs/docgen-gen.md +0 -2
- package/rules/doc-files/js/docs/docgen-judge-measure.md +0 -2
- package/rules/doc-files/js/docs/docgen-judge.md +0 -2
- package/rules/doc-files/js/docs/docgen-scan.md +0 -2
- package/rules/doc-files/js/docs/run-lint.md +0 -2
- package/rules/doc-files/main.mjs +2 -3
- package/rules/docker/docs/index.md +0 -1
- package/rules/docker/docs/main.md +0 -2
- package/rules/docker/js/docs/lint.md +0 -2
- package/rules/docker/lib/docs/docker-hadolint.md +0 -2
- package/rules/docker/main.mdc +1 -21
- package/rules/efes/docs/index.md +0 -1
- package/rules/efes/docs/main.md +0 -2
- package/rules/efes/main.mdc +0 -1
- package/rules/feedback/docs/index.md +0 -1
- package/rules/feedback/docs/main.md +0 -2
- package/rules/ga/docs/index.md +0 -1
- package/rules/ga/docs/main.md +0 -2
- package/rules/ga/js/docs/index.md +0 -1
- package/rules/ga/main.mdc +1 -31
- package/rules/graphql/docs/index.md +0 -1
- package/rules/graphql/docs/main.md +0 -2
- package/rules/graphql/main.mdc +0 -5
- package/rules/hasura/docs/index.md +0 -1
- package/rules/hasura/docs/main.md +0 -2
- package/rules/hasura/js/docs/index.md +1 -0
- package/rules/hasura/js/docs/migrations.md +28 -0
- package/rules/hasura/js/migrations.mjs +47 -0
- package/rules/hasura/main.mdc +1 -11
- package/rules/image-avif/docs/index.md +0 -1
- package/rules/image-avif/docs/main.md +0 -2
- package/rules/image-avif/main.mdc +1 -9
- package/rules/image-compress/docs/index.md +0 -1
- package/rules/image-compress/docs/main.md +0 -2
- package/rules/image-compress/js/docs/index.md +0 -1
- package/rules/image-compress/main.mdc +1 -9
- package/rules/js/docs/index.md +0 -1
- package/rules/js/docs/main.md +0 -2
- package/rules/js/js/dep-policy.mjs +91 -0
- package/rules/js/js/docs/check.md +0 -2
- package/rules/js/js/docs/dep-policy.md +34 -0
- package/rules/js/js/docs/index.md +5 -4
- package/rules/js/js/docs/tooling.md +0 -2
- package/rules/js/js/docs/utils_imports.md +0 -2
- package/rules/js/main.mdc +0 -31
- package/rules/js/policy/package_json/package_json.rego +16 -0
- package/rules/js-bun-db/docs/index.md +0 -1
- package/rules/js-bun-db/docs/main.md +0 -2
- package/rules/js-bun-db/js/docs/safety.md +18 -23
- package/rules/js-bun-db/js/safety.mjs +31 -3
- package/rules/js-bun-db/lib/bun-sql-scan.mjs +123 -0
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +37 -331
- package/rules/js-bun-db/main.mdc +1 -23
- package/rules/js-bun-redis/docs/index.md +0 -1
- package/rules/js-bun-redis/docs/main.md +0 -2
- package/rules/js-bun-redis/main.mdc +0 -5
- package/rules/js-mssql/docs/index.md +0 -1
- package/rules/js-mssql/docs/main.md +0 -2
- package/rules/js-mssql/main.mdc +0 -12
- package/rules/js-run/docs/index.md +0 -1
- package/rules/js-run/docs/main.md +0 -2
- package/rules/js-run/js/docs/runtime.md +15 -13
- package/rules/js-run/js/runtime.mjs +48 -4
- package/rules/js-run/main.mdc +0 -25
- package/rules/k8s/docs/index.md +0 -1
- package/rules/k8s/docs/main.md +0 -2
- package/rules/k8s/main.mdc +0 -45
- package/rules/nginx-default-tpl/docs/index.md +0 -1
- package/rules/nginx-default-tpl/docs/main.md +0 -2
- package/rules/nginx-default-tpl/main.mdc +0 -13
- package/rules/npm-module/docs/index.md +0 -1
- package/rules/npm-module/docs/main.md +0 -2
- package/rules/npm-module/js/docs/header_doc_pointer.md +0 -2
- package/rules/npm-module/js/docs/rule_meta.md +0 -2
- package/rules/npm-module/js/docs/skill_meta.md +0 -2
- package/rules/npm-module/main.mdc +1 -15
- package/rules/php/docs/index.md +0 -1
- package/rules/php/docs/main.md +0 -2
- package/rules/php/js/docs/index.md +0 -1
- package/rules/php/main.mdc +1 -9
- package/rules/python/docs/index.md +0 -1
- package/rules/python/docs/main.md +0 -2
- package/rules/python/js/docs/index.md +0 -1
- package/rules/python/main.mdc +1 -13
- package/rules/rego/docs/index.md +0 -1
- package/rules/rego/docs/main.md +0 -2
- package/rules/rego/js/docs/index.md +1 -1
- package/rules/rego/js/docs/tooling.md +26 -0
- package/rules/rego/js/tooling.mdc +14 -0
- package/rules/rego/js/tooling.mjs +24 -0
- package/rules/rego/main.mdc +0 -9
- package/rules/rego/policy/package_json/package_json.mdc +12 -0
- package/rules/rego/policy/package_json/package_json.rego +21 -0
- package/rules/rego/policy/package_json/target.json +4 -0
- package/rules/release/docs/index.md +0 -1
- package/rules/release/docs/main.md +0 -2
- package/rules/release/main.mdc +2 -2
- package/rules/rust/docs/index.md +0 -1
- package/rules/rust/docs/main.md +0 -2
- package/rules/rust/js/docs/index.md +0 -1
- package/rules/rust/main.mdc +1 -11
- package/rules/rust/policy/lint_rust_yml/lint_rust_yml.rego +24 -0
- package/rules/rust/policy/package_json/package_json.mdc +12 -0
- package/rules/rust/policy/package_json/package_json.rego +20 -0
- package/rules/rust/policy/package_json/target.json +4 -0
- package/rules/security/docs/index.md +0 -1
- package/rules/security/docs/main.md +0 -2
- package/rules/security/js/docs/index.md +0 -1
- package/rules/security/main.mdc +0 -13
- package/rules/style/docs/index.md +0 -1
- package/rules/style/docs/main.md +0 -2
- package/rules/style/js/docs/index.md +0 -1
- package/rules/style/js/docs/tooling.md +12 -10
- package/rules/style/js/tooling.mjs +8 -2
- package/rules/style/main.mdc +1 -23
- package/rules/style/policy/lint_style_yml/lint_style_yml.rego +5 -0
- package/rules/tauri/docs/index.md +0 -1
- package/rules/tauri/docs/main.md +0 -2
- package/rules/tauri/main.mdc +1 -11
- package/rules/test/docs/index.md +0 -1
- package/rules/test/docs/main.md +0 -2
- package/rules/test/js/docs/index.md +2 -0
- package/rules/test/js/docs/no-console-store-restore.md +30 -0
- package/rules/test/js/docs/sandbox-aware-test.md +30 -0
- package/rules/test/js/docs/stryker_config.md +0 -2
- package/rules/test/js/docs/vitest-config-pool-forks.md +0 -2
- package/rules/test/js/no-console-store-restore.mjs +88 -0
- package/rules/test/js/sandbox-aware-test.mjs +89 -0
- package/rules/test/main.mdc +1 -21
- package/rules/text/docs/index.md +0 -1
- package/rules/text/docs/main.md +0 -2
- package/rules/text/js/docs/cspell-fix.md +0 -2
- package/rules/text/js/docs/run-dotenv-linter.md +0 -2
- package/rules/text/js/docs/run-shellcheck.md +0 -2
- package/rules/text/js/docs/run-v8r.md +0 -2
- package/rules/text/main.mdc +0 -33
- package/rules/tool-surface/docs/index.md +0 -1
- package/rules/tool-surface/docs/main.md +0 -2
- package/rules/vue/docs/index.md +0 -1
- package/rules/vue/docs/main.md +0 -2
- package/rules/vue/main.mdc +0 -22
- package/rules/worktree/docs/index.md +0 -1
- package/rules/worktree/docs/main.md +0 -2
- package/scripts/docs/auto-rules.md +0 -2
- package/scripts/docs/auto-skills.md +0 -2
- package/scripts/docs/hook.md +30 -0
- package/scripts/docs/index.md +1 -2
- package/scripts/docs/post-tool-use-check.md +0 -2
- package/scripts/docs/sync-claude-config.md +1 -3
- package/scripts/docs/sync-setup-bun-deps-action.md +0 -2
- package/scripts/hook.mjs +71 -0
- package/scripts/lib/docs/check-mdc-template-refs.md +0 -2
- package/scripts/lib/docs/index.md +35 -36
- package/scripts/lib/docs/inline-template-links.md +6 -8
- package/scripts/lib/docs/list-project-rules-mdc.md +0 -2
- package/scripts/lib/docs/list-rule-ids.md +0 -2
- package/scripts/lib/docs/mirror-parity.md +8 -10
- package/scripts/lib/docs/read-n-cursor-config-lite.md +0 -2
- package/scripts/lib/docs/rule-meta.md +0 -2
- package/scripts/lib/docs/run-lint.md +9 -10
- package/scripts/lib/docs/run-rule-cli.md +0 -2
- package/scripts/lib/docs/run-rule.md +7 -9
- package/scripts/lib/docs/run-standard-lint.md +0 -2
- package/scripts/lib/docs/run-standard-rule.md +0 -2
- package/scripts/lib/docs/skill-meta.md +0 -2
- package/scripts/lib/docs/timing-summary.md +0 -2
- package/scripts/lib/docs/worktree-notice.md +0 -2
- package/scripts/lib/fix/docs/analyze-escalation.md +0 -2
- package/scripts/lib/fix/docs/index.md +10 -10
- package/scripts/lib/fix/docs/llm-worker.md +18 -8
- package/scripts/lib/fix/docs/orchestrator.md +44 -20
- package/scripts/lib/fix/docs/run-conformance-check.md +0 -2
- package/scripts/lib/fix/docs/t0.md +0 -2
- package/scripts/lib/fix/docs/verbose-block.md +27 -0
- package/scripts/lib/fix/llm-worker.mjs +75 -22
- package/scripts/lib/fix/orchestrator.mjs +13 -3
- package/scripts/lib/fix/verbose-block.mjs +82 -0
- package/scripts/lib/inline-template-links.mjs +32 -22
- package/scripts/lib/mirror-parity.mjs +2 -2
- package/scripts/lib/run-lint.mjs +15 -2
- package/scripts/lib/run-rule.mjs +1 -2
- package/scripts/sync-claude-config.mjs +7 -4
- package/scripts/utils/docs/resolve-js-root.md +0 -2
- package/skills/adr-normalize/SKILL.md +1 -0
- package/skills/coverage-fix/SKILL.md +1 -0
- package/skills/doc-aggregate/SKILL.md +1 -0
- package/skills/doc-files/SKILL.md +10 -24
- package/skills/lint/SKILL.md +24 -19
- package/skills/llm-patch/SKILL.md +5 -4
- package/skills/publish-telegram/SKILL.md +1 -0
- package/skills/start-check/SKILL.md +1 -0
- package/skills/taze/SKILL.md +3 -2
- package/types/bin/n-cursor.d.ts +1 -1
- package/rules/abie/docs/fix.md +0 -37
- package/rules/adr/docs/fix.md +0 -37
- package/rules/bun/docs/fix.md +0 -30
- package/rules/capacitor/docs/fix.md +0 -36
- package/rules/changelog/docs/fix.md +0 -37
- package/rules/ci4/docs/fix.md +0 -32
- package/rules/doc-files/docs/fix.md +0 -29
- package/rules/docker/docs/fix.md +0 -35
- package/rules/efes/docs/fix.md +0 -37
- package/rules/feedback/docs/fix.md +0 -30
- package/rules/ga/docs/fix.md +0 -30
- package/rules/graphql/docs/fix.md +0 -37
- package/rules/hasura/docs/fix.md +0 -39
- package/rules/image-avif/docs/fix.md +0 -28
- package/rules/image-compress/docs/fix.md +0 -27
- package/rules/js/docs/fix.md +0 -37
- package/rules/js-bun-db/docs/fix.md +0 -30
- package/rules/js-bun-redis/docs/fix.md +0 -32
- package/rules/js-mssql/docs/fix.md +0 -30
- package/rules/js-run/docs/fix.md +0 -36
- package/rules/k8s/docs/fix.md +0 -31
- package/rules/nginx-default-tpl/docs/fix.md +0 -35
- package/rules/npm-module/docs/fix.md +0 -34
- package/rules/php/docs/fix.md +0 -35
- package/rules/python/docs/fix.md +0 -38
- package/rules/rego/docs/fix.md +0 -31
- package/rules/release/docs/fix.md +0 -28
- package/rules/rust/docs/fix.md +0 -32
- package/rules/security/docs/fix.md +0 -33
- package/rules/style/docs/fix.md +0 -28
- package/rules/tauri/docs/fix.md +0 -39
- package/rules/test/docs/fix.md +0 -31
- package/rules/text/docs/fix.md +0 -37
- package/rules/tool-surface/docs/fix.md +0 -32
- package/rules/vue/docs/fix.md +0 -32
- package/rules/worktree/docs/fix.md +0 -40
- package/scripts/docs/post-tool-use-fix.md +0 -32
- package/scripts/docs/worktree-cli.md +0 -27
- package/scripts/lib/docs/worktree.md +0 -42
- package/scripts/lib/fix/docs/run-fix-check.md +0 -33
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Rego-gate: `cargo`, `rustfmt`, `clippy` заборонені у `package.json`
|
|
2
|
+
|
|
3
|
+
Rego-пакет: `rust.package_json`
|
|
4
|
+
|
|
5
|
+
Цільовий файл: `package.json`
|
|
6
|
+
|
|
7
|
+
`cargo`, `rustfmt` і `clippy` — це частина **Rust toolchain**, а не npm-пакети. Вони **не додаються** у `dependencies`, `devDependencies` або `peerDependencies`. Встановлення:
|
|
8
|
+
|
|
9
|
+
- **локально** — через `rustup` (`rustup component add rustfmt clippy`);
|
|
10
|
+
- **у CI** — через крок `dtolnay/rust-toolchain@stable` із `with.components: rustfmt, clippy`.
|
|
11
|
+
|
|
12
|
+
Gate видає deny, якщо `cargo`, `rustfmt` або `clippy` з'являється у будь-якій секції залежностей `package.json`.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Перевірка `package.json` для Rust-проєктів (rust.mdc / lint.mdc).
|
|
2
|
+
#
|
|
3
|
+
# `cargo`, `rustfmt`, `clippy` — частина Rust toolchain (rustup), не npm-залежностей.
|
|
4
|
+
# Вони мають бути у PATH через `rustup` локально або `dtolnay/rust-toolchain@stable` у CI.
|
|
5
|
+
package rust.package_json
|
|
6
|
+
|
|
7
|
+
import rego.v1
|
|
8
|
+
|
|
9
|
+
banned_rust_tools := {"cargo", "rustfmt", "clippy"}
|
|
10
|
+
|
|
11
|
+
deny contains msg if {
|
|
12
|
+
some field in {"dependencies", "devDependencies", "peerDependencies"}
|
|
13
|
+
deps := object.get(input, field, {})
|
|
14
|
+
some name, _ in deps
|
|
15
|
+
name in banned_rust_tools
|
|
16
|
+
msg := sprintf(
|
|
17
|
+
"package.json: %s.%s заборонений — Rust toolchain встановлюється через rustup / dtolnay/rust-toolchain@stable, не через npm (rust.mdc)",
|
|
18
|
+
[field, name]
|
|
19
|
+
)
|
|
20
|
+
}
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль виконує перевірку якості коду та безпеки репозиторію, спираючись на конфігурації, визначені у meta.json. Функція `run` застосовує політики та посилання на MDC для виконання перевірки. Функція `lint` сканує файлову систему репозиторію на наявність секретів. Обидві функції мають публічний статус, а кешування відбувається у межах одного прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/security/main.mdc
CHANGED
|
@@ -6,19 +6,6 @@ version: '2.1'
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
Правило **security** забезпечує сканування секретів через [TruffleHog](https://github.com/trufflesecurity/trufflehog) локально та на CI, а також правильне використання placeholder-значень у прикладних файлах.
|
|
9
|
-
|
|
10
|
-
[security-trufflehog](./js/trufflehog.mdc)
|
|
11
|
-
|
|
12
|
-
[security-sample-secret](./js/sample_secret.mdc)
|
|
13
|
-
|
|
14
|
-
[security-rego-policies](./js/rego_policies.mdc)
|
|
15
|
-
|
|
16
|
-
## Швидкий gate через conftest
|
|
17
|
-
|
|
18
|
-
[security-package-json](./policy/package_json/package_json.mdc)
|
|
19
|
-
|
|
20
|
-
[security-lint-security-yml](./policy/lint_security_yml/lint_security_yml.mdc)
|
|
21
|
-
|
|
22
9
|
## Перевірка
|
|
23
10
|
|
|
24
11
|
`npx @nitra/cursor fix security`
|
package/rules/style/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль реалізує логіку для виконання правил, фільтрації файлів за розширеннями та запуску стильового лінтера. Функція `run` виконує визначені правила. `filterStyleFiles` обробляє файли, вибираючи їх на основі розширень. `lint` запускає перевірку стилю.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -3,25 +3,27 @@ type: JS Module
|
|
|
3
3
|
title: tooling.mjs
|
|
4
4
|
resource: npm/rules/style/js/tooling.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
|
|
6
|
+
crc: 27bb12d3
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 95
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
Перевіряє налаштування для стилістичного лінтера, підтверджуючи наявність файлів конфігурації, таких як `.stylelintrc.json` та `package.json`. Це забезпечує коректний запуск перевірок відповідно до вимог, визначених у `.stylelintrc.json` та `settings.json`. (js.mdc), (style.mdc)
|
|
11
12
|
|
|
12
13
|
## Поведінка
|
|
13
14
|
|
|
14
|
-
1.
|
|
15
|
-
2.
|
|
16
|
-
3.
|
|
17
|
-
4.
|
|
15
|
+
1. Викликається функція check.
|
|
16
|
+
2. Перевіряється наявність конфігурації stylelint у package.json або зовнішньому файлі (наприклад, .stylelintrc.json, .stylelintrc.js, stylelint.config.js). Якщо конфігурація відсутня, повідомляється про необхідність додати її до package.json (js.mdc).
|
|
17
|
+
3. Якщо існує файл .stylelintignore, перевіряється, чи містить він рядок `dist/`. Якщо ні, повідомляється про необхідність додати цей рядок (style.mdc).
|
|
18
|
+
4. Перевіряється наявність файлу .github/workflows/lint-style.yml. Якщо він відсутній, повідомляється про необхідність його створення.
|
|
19
|
+
5. Функція повертає код виходу, що відображає загальний статус перевірки.
|
|
20
|
+
6. Перевірка не включає шляхи .github та .git.
|
|
18
21
|
|
|
19
22
|
## Публічний API
|
|
20
23
|
|
|
21
|
-
check —
|
|
24
|
+
check — перевіряє відповідність проєкту стандартам оформлення (style.mdc).
|
|
22
25
|
|
|
23
26
|
## Гарантії поведінки
|
|
24
27
|
|
|
25
|
-
- Read-only:
|
|
28
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
26
29
|
- Свідомо пропускає шляхи: `.github`, `.git`.
|
|
27
|
-
- Не звертається до мережі.
|
|
@@ -54,8 +54,14 @@ export async function check(cwd = process.cwd()) {
|
|
|
54
54
|
|
|
55
55
|
await checkStylelintConfigPresence(reporter, cwd)
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
const ignorePath = join(cwd, '.stylelintignore')
|
|
58
|
+
if (existsSync(ignorePath)) {
|
|
59
|
+
const ignoreContent = await readFile(ignorePath, 'utf8')
|
|
60
|
+
if (ignoreContent.split('\n').some(line => line.trim() === 'dist/')) {
|
|
61
|
+
pass('.stylelintignore існує і містить dist/')
|
|
62
|
+
} else {
|
|
63
|
+
fail('.stylelintignore не містить рядка dist/ — додай його (style.mdc)')
|
|
64
|
+
}
|
|
59
65
|
} else {
|
|
60
66
|
fail('.stylelintignore не існує — створи з вмістом: dist/')
|
|
61
67
|
}
|
package/rules/style/main.mdc
CHANGED
|
@@ -5,26 +5,4 @@ globs: "**/*.{css,scss,vue}"
|
|
|
5
5
|
alwaysApply: false
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
Правило **style** для Vue-проєктів: Quasar як стильова система, SCSS-конвенції кольорів і відступів, фікси компонентів, stylelint через `@nitra/stylelint-config`.
|
|
9
|
-
|
|
10
|
-
[style-quasar](./js/quasar.mdc)
|
|
11
|
-
|
|
12
|
-
[style-colors](./js/colors.mdc)
|
|
13
|
-
|
|
14
|
-
[style-gap](./js/gap.mdc)
|
|
15
|
-
|
|
16
|
-
[style-quasar-fixes](./js/quasar-fixes.mdc)
|
|
17
|
-
|
|
18
|
-
[style-tooling](./js/tooling.mdc)
|
|
19
|
-
|
|
20
|
-
[style-admin-table](./js/admin-table.mdc)
|
|
21
|
-
|
|
22
|
-
## Швидкий gate через conftest (Rego)
|
|
23
|
-
|
|
24
|
-
[style-lint_style_yml](./policy/lint_style_yml/lint_style_yml.mdc)
|
|
25
|
-
|
|
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)
|
|
8
|
+
Правило **style** для Vue-проєктів: Quasar як стильова система, SCSS-конвенції кольорів і відступів, фікси компонентів, stylelint через `@nitra/stylelint-config`.
|
|
@@ -26,6 +26,11 @@ deny contains msg if {
|
|
|
26
26
|
msg := sprintf("lint-style.yml: жоден крок run не містить %q (style.mdc)", [expected_run_blob])
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
deny contains msg if {
|
|
30
|
+
contains(all_run_text, "bunx stylelint")
|
|
31
|
+
msg := "lint-style.yml: знайдено bunx stylelint — використовуй n-cursor lint style --read-only (style.mdc)"
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
step_run_to_text(step) := step.run if is_string(step.run)
|
|
30
35
|
|
|
31
36
|
else := concat("\n", [s | some s in step.run]) if is_array(step.run)
|
package/rules/tauri/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль обробляє JS-запити та взаємодіє з MDC для отримання даних. При запуску через публічну функцію `run` він оркеструє застосування правил, завантажуючи конфігурації з meta.json, застосовуючи білий список та надаючи підсумок. Модуль є read-only і не здійснює записів у ФС/БД.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/tauri/main.mdc
CHANGED
|
@@ -5,14 +5,4 @@ alwaysApply: false
|
|
|
5
5
|
version: '1.5'
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
Правило встановлює канонічні вимоги для Tauri-проєктів: виявлення маркерів у монорепо, VS Code-розширення, налаштування mutation-testing для platform bridge та реалізацію Tool Surface поверх Tauri+Rust.
|
|
9
|
-
|
|
10
|
-
## Швидкий gate через conftest
|
|
11
|
-
|
|
12
|
-
[tauri-vscode_extensions](./policy/vscode_extensions/vscode_extensions.mdc)
|
|
13
|
-
|
|
14
|
-
[tauri-tooling](./js/tooling.mdc)
|
|
15
|
-
|
|
16
|
-
[tauri-cargo_mutants_config](./js/cargo_mutants_config.mdc)
|
|
17
|
-
|
|
18
|
-
[tauri-tool_surface](./js/tool_surface.mdc)
|
|
8
|
+
Правило встановлює канонічні вимоги для Tauri-проєктів: виявлення маркерів у монорепо, VS Code-розширення, налаштування mutation-testing для platform bridge та реалізацію Tool Surface поверх Tauri+Rust.
|
package/rules/test/docs/index.md
CHANGED
package/rules/test/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль виконує перевірку, обробляючи JS-запитання, політику та посилання на mdc. При запуску як окрема програма, він зчитує конфігурації з meta.json, застосовує білий список та підсумовує результати після застосування білого списку, визначаючи код виходу процесу. Функція run ініціює цей процес. Модуль є read-only і не пише у ФС/БД. Кешування відбувається у межах прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -10,7 +10,9 @@ resource: npm/rules/test/js/
|
|
|
10
10
|
| ----------------------------------------------------------- | --------- |
|
|
11
11
|
| [cargo_mutants_config.mjs](cargo_mutants_config.md) | JS Module |
|
|
12
12
|
| [location.mjs](location.md) | JS Module |
|
|
13
|
+
| [no-console-store-restore.mjs](no-console-store-restore.md) | JS Module |
|
|
13
14
|
| [no-process-chdir.mjs](no-process-chdir.md) | JS Module |
|
|
14
15
|
| [no-relative-fs-path.mjs](no-relative-fs-path.md) | JS Module |
|
|
16
|
+
| [sandbox-aware-test.mjs](sandbox-aware-test.md) | JS Module |
|
|
15
17
|
| [stryker_config.mjs](stryker_config.md) | JS Module |
|
|
16
18
|
| [vitest-config-pool-forks.mjs](vitest-config-pool-forks.md) | JS Module |
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: no-console-store-restore.mjs
|
|
4
|
+
resource: npm/rules/test/js/no-console-store-restore.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 39f9fb6d
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Модуль сканує репозиторій для пошуку файлів, що відповідають шаблону `*.test.{mjs,js}`. Він перевіряє вміст кожного такого файлу на наявність прямих присвоєнь методів консолі. Публічна функція `check` виявляє такі присвоєння. (test.mdc)
|
|
12
|
+
|
|
13
|
+
## Поведінка
|
|
14
|
+
|
|
15
|
+
1. Визначає, які файли є тестовими (`*.test.{mjs,js}`).
|
|
16
|
+
2. Збирає список усіх тестових файлів у репозиторії, ігноруючи конфігураційні шляхи.
|
|
17
|
+
3. Для кожного тестового файлу зчитує його вміст.
|
|
18
|
+
4. Аналізує вміст файлу, шукаючи прямі присвоєння `console.<method> = …`.
|
|
19
|
+
5. Якщо порушення знайдено, реєструє його з зазначенням файлу та номера рядка.
|
|
20
|
+
6. Якщо порушень немає, повідомляє про успішну перевірку (test.mdc).
|
|
21
|
+
7. Якщо порушення знайдено, повідомляє про кожне порушення, вказуючи, що пряме присвоєння заборонено і слід використовувати `vi.spyOn.mockReturnValue` (test.mdc, no-console-store-restore).
|
|
22
|
+
8. Повертає код виходу, що відображає результат перевірки.
|
|
23
|
+
|
|
24
|
+
## Публічний API
|
|
25
|
+
|
|
26
|
+
check — виявляє, чи не перевизначає жоден тестовий файл методи `console.*` через пряме присвоєння.
|
|
27
|
+
|
|
28
|
+
## Гарантії поведінки
|
|
29
|
+
|
|
30
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: sandbox-aware-test.mjs
|
|
4
|
+
resource: npm/rules/test/js/sandbox-aware-test.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 0c64c75c
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Модуль сканує тестові файли, що відповідають шаблону `*.test.{mjs,js}` у вказаному корені репозиторію. Він перевіряє, чи файли, що містять глибоку навігацію (визначену як використання `import.meta.dirname` або `import.meta.url` з чотирма або більше рівнями `..`), захищені викликом `withTmpDir` або `test.skipIf` з посиланням на змінну середовища `env.STRYKER_MUTATOR_WORKER`. Перевірка фіксує порушення (test.mdc) у разі відсутності необхідної ізоляції для тестових файлів з глибокою навігацією.
|
|
12
|
+
|
|
13
|
+
## Поведінка
|
|
14
|
+
|
|
15
|
+
1. Визначає тестові файли, що відповідають шаблону `*.test.{mjs,js}` у вказаному корені репозиторію.
|
|
16
|
+
2. Для кожного тестового файлу перевіряє, чи містить він глибоку навігацію за допомогою `import.meta.dirname` або `import.meta.url` з чотирма або більше рівнями `..`.
|
|
17
|
+
3. Якщо глибока навігація виявлена, перевіряє, чи захищено цей файл викликом `withTmpDir` або `test.skipIf` з посиланням на `env.STRYKER_MUTATOR_WORKER`.
|
|
18
|
+
4. Якщо глибока навігація виявлена, але файл не захищений, він реєструється як порушення (test.mdc).
|
|
19
|
+
5. Викликає `check` для запуску перевірки.
|
|
20
|
+
6. Якщо порушень немає, повідомляє про успішне виконання (test.mdc).
|
|
21
|
+
7. Якщо порушення виявлено, повідомляє про кожен виявлений файл та необхідність застосування ізоляції.
|
|
22
|
+
8. Повертає код виходу, що відображає результат перевірки.
|
|
23
|
+
|
|
24
|
+
## Публічний API
|
|
25
|
+
|
|
26
|
+
check — Виявляє тести, що використовують глибоку навігацію `import.meta` (≥4 `..`-рівнів) і не захищені механізмами `withTmpDir` або `test.skipIf`. Це запобігає збоям Git-операцій у тестах, які не мають ізоляції Stryker-sandbox. (test.mdc)
|
|
27
|
+
|
|
28
|
+
## Гарантії поведінки
|
|
29
|
+
|
|
30
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль перевіряє готовність JavaScript-проєктів до виконання тестів. Він збирає кореневі каталоги проєктів, використовуючи публічну функцію `check` для валідації. Перевірка гарантує наявність необхідних конфігураційних файлів, зокрема `mutation.json` та `package.json`, у кожному знайденому проєкті. Модуль свідомо пропускає каталоги `node_modules`. Він також додає відповідні артефакти тестів до `.gitignore` у коренях проєктів. (test.mdc)
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** @see ./docs/no-console-store-restore.md */
|
|
2
|
+
import { readFile } from 'node:fs/promises'
|
|
3
|
+
import { basename, relative } from 'node:path'
|
|
4
|
+
|
|
5
|
+
import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
|
|
6
|
+
import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
|
|
7
|
+
import { walkDir } from '../../../scripts/utils/walkDir.mjs'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Ловить пряме присвоєння `console.<method> = …` у `*.test.{js,mjs}`.
|
|
11
|
+
* `console.log = fn` — process-wide мутація; канон: `vi.spyOn(console, 'log')`.
|
|
12
|
+
* `(?!=)` виключає `==` та `===` (лише одиночний `=`).
|
|
13
|
+
*/
|
|
14
|
+
const CONSOLE_ASSIGN_RE =
|
|
15
|
+
/\bconsole\.(?:log|error|warn|info|debug|dir|table|trace|group|groupEnd|time|timeEnd)\s*=(?!=)/u
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Чи файл — JS-тест (`*.test.mjs` / `*.test.js`).
|
|
19
|
+
* @param {string} absPath абсолютний шлях
|
|
20
|
+
* @returns {boolean} `true` для `.test.{mjs,js}` файлів
|
|
21
|
+
*/
|
|
22
|
+
function isTestFile(absPath) {
|
|
23
|
+
const name = basename(absPath)
|
|
24
|
+
return name.endsWith('.test.mjs') || name.endsWith('.test.js')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Знаходить рядки з прямим присвоєнням `console.<method> = …`.
|
|
29
|
+
* @param {string} body вміст файлу
|
|
30
|
+
* @returns {Array<{line: number}>} знайдені порушення
|
|
31
|
+
*/
|
|
32
|
+
function findOffenders(body) {
|
|
33
|
+
const offenders = []
|
|
34
|
+
const lines = body.split('\n')
|
|
35
|
+
for (const [i, line] of lines.entries()) {
|
|
36
|
+
if (CONSOLE_ASSIGN_RE.test(line)) {
|
|
37
|
+
offenders.push({ line: i + 1 })
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return offenders
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Перевіряє, що жоден `*.test.{mjs,js}` файл не перевизначає `console.<method>`
|
|
45
|
+
* через пряме присвоєння. Канон — `vi.spyOn(console, 'log').mockReturnValue()`.
|
|
46
|
+
* @param {string} [cwdParam] корінь репозиторію
|
|
47
|
+
* @returns {Promise<number>} 0 — чисто, 1 — є порушення
|
|
48
|
+
*/
|
|
49
|
+
export async function check(cwdParam = process.cwd()) {
|
|
50
|
+
const reporter = createCheckReporter()
|
|
51
|
+
const { pass, fail } = reporter
|
|
52
|
+
|
|
53
|
+
const cwd = cwdParam
|
|
54
|
+
const ignorePaths = await loadCursorIgnorePaths(cwd)
|
|
55
|
+
|
|
56
|
+
/** @type {string[]} */
|
|
57
|
+
const testFiles = []
|
|
58
|
+
await walkDir(
|
|
59
|
+
cwd,
|
|
60
|
+
absPath => {
|
|
61
|
+
if (isTestFile(absPath)) testFiles.push(absPath)
|
|
62
|
+
},
|
|
63
|
+
ignorePaths
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
/** @type {Array<{file: string, line: number}>} */
|
|
67
|
+
const offenders = []
|
|
68
|
+
for (const absPath of testFiles) {
|
|
69
|
+
const body = await readFile(absPath, 'utf8')
|
|
70
|
+
for (const o of findOffenders(body)) {
|
|
71
|
+
offenders.push({ file: relative(cwd, absPath), ...o })
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (offenders.length === 0) {
|
|
76
|
+
pass(`Жоден з ${testFiles.length} тестових файлів не присвоює console.<method> = … (test.mdc)`)
|
|
77
|
+
return reporter.getExitCode()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
for (const { file, line } of offenders) {
|
|
81
|
+
fail(
|
|
82
|
+
`${file}:${line}: пряме присвоєння console.<method> = … заборонено — ` +
|
|
83
|
+
`використовуй vi.spyOn(console, 'method').mockReturnValue() (test.mdc, no-console-store-restore)`
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return reporter.getExitCode()
|
|
88
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** @see ./docs/sandbox-aware-test.md */
|
|
2
|
+
import { readFile } from 'node:fs/promises'
|
|
3
|
+
import { basename, relative } from 'node:path'
|
|
4
|
+
|
|
5
|
+
import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
|
|
6
|
+
import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
|
|
7
|
+
import { walkDir } from '../../../scripts/utils/walkDir.mjs'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Чи файл — JS-тест (`*.test.mjs` / `*.test.js`).
|
|
11
|
+
* @param {string} absPath абсолютний шлях
|
|
12
|
+
* @returns {boolean} `true` для `.test.{mjs,js}` файлів
|
|
13
|
+
*/
|
|
14
|
+
function isTestFile(absPath) {
|
|
15
|
+
const name = basename(absPath)
|
|
16
|
+
return name.endsWith('.test.mjs') || name.endsWith('.test.js')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Чи файл містить `import.meta.dirname`/`import.meta.url`-навігацію з ≥4 `..`-рівнів.
|
|
21
|
+
* Для кожного вживання `import.meta.dirname|url` рахує `'..'`/`".."` у вікні 400 символів.
|
|
22
|
+
* @param {string} body вміст файлу
|
|
23
|
+
* @returns {boolean} `true` якщо знайдено глибоку навігацію
|
|
24
|
+
*/
|
|
25
|
+
function hasDeepMetaNavigation(body) {
|
|
26
|
+
const RE = /import\.meta\.(?:dirname|url)\b/gu
|
|
27
|
+
let match
|
|
28
|
+
while ((match = RE.exec(body)) !== null) {
|
|
29
|
+
const chunk = body.slice(match.index, match.index + 400)
|
|
30
|
+
const dots = (chunk.match(/'\.\.'|"\.\."/gu) ?? []).length
|
|
31
|
+
if (dots >= 4) return true
|
|
32
|
+
}
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Захист через тимчасову пісочницю — `withTmpDir`. */
|
|
37
|
+
const WITH_TMP_DIR_RE = /\bwithTmpDir\b/u
|
|
38
|
+
|
|
39
|
+
/** Захист через явний skip у Stryker-sandbox (`test.skipIf`). */
|
|
40
|
+
const SKIP_IF_STRYKER_RE = /\btest\.skipIf\s*\(\s*(?:env|process\.env)\.STRYKER_MUTATOR_WORKER\b/u
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Перевіряє, що `*.test.{mjs,js}` з глибокою `import.meta`-навігацією (≥4 `..`-рівнів)
|
|
44
|
+
* захищені `withTmpDir` або `test.skipIf(env.STRYKER_MUTATOR_WORKER)`.
|
|
45
|
+
* Без ізоляції Stryker-sandbox (`reports/stryker/.tmp/sandbox-XXX/`) не має `.git/`,
|
|
46
|
+
* тому git-операції у таких тестах падають і мутаційний прогін не стартує.
|
|
47
|
+
* @param {string} [cwdParam] корінь репозиторію
|
|
48
|
+
* @returns {Promise<number>} 0 — чисто, 1 — є порушення
|
|
49
|
+
*/
|
|
50
|
+
export async function check(cwdParam = process.cwd()) {
|
|
51
|
+
const reporter = createCheckReporter()
|
|
52
|
+
const { pass, fail } = reporter
|
|
53
|
+
|
|
54
|
+
const cwd = cwdParam
|
|
55
|
+
const ignorePaths = await loadCursorIgnorePaths(cwd)
|
|
56
|
+
|
|
57
|
+
/** @type {string[]} */
|
|
58
|
+
const testFiles = []
|
|
59
|
+
await walkDir(
|
|
60
|
+
cwd,
|
|
61
|
+
absPath => {
|
|
62
|
+
if (isTestFile(absPath)) testFiles.push(absPath)
|
|
63
|
+
},
|
|
64
|
+
ignorePaths
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
/** @type {string[]} */
|
|
68
|
+
const offenders = []
|
|
69
|
+
for (const absPath of testFiles) {
|
|
70
|
+
const body = await readFile(absPath, 'utf8')
|
|
71
|
+
if (!hasDeepMetaNavigation(body)) continue
|
|
72
|
+
if (WITH_TMP_DIR_RE.test(body) || SKIP_IF_STRYKER_RE.test(body)) continue
|
|
73
|
+
offenders.push(relative(cwd, absPath))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (offenders.length === 0) {
|
|
77
|
+
pass(`Усі ${testFiles.length} тестові файли sandbox-aware (test.mdc)`)
|
|
78
|
+
return reporter.getExitCode()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const file of offenders) {
|
|
82
|
+
fail(
|
|
83
|
+
`${file}: import.meta deep navigation (≥4 рівні ..) без ізоляції — ` +
|
|
84
|
+
`оберни у withTmpDir() або захисти test.skipIf(env.STRYKER_MUTATOR_WORKER) (test.mdc, sandbox-aware-test)`
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return reporter.getExitCode()
|
|
89
|
+
}
|
package/rules/test/main.mdc
CHANGED
|
@@ -7,22 +7,6 @@ alwaysApply: false
|
|
|
7
7
|
|
|
8
8
|
Правило **test** керує розміщенням тестових файлів, безпекою ізоляції тестів (заборона `process.chdir`, відносних шляхів у FS, ручного store/restore console), налаштуванням Vitest/Stryker baseline та конфігурацією cargo-mutants для Rust.
|
|
9
9
|
|
|
10
|
-
[test-location](./js/location.mdc)
|
|
11
|
-
|
|
12
|
-
[test-no-process-chdir](./js/no-process-chdir.mdc)
|
|
13
|
-
|
|
14
|
-
[test-no-relative-fs-path](./js/no-relative-fs-path.mdc)
|
|
15
|
-
|
|
16
|
-
[test-no-console-store-restore](./js/no-console-store-restore.mdc)
|
|
17
|
-
|
|
18
|
-
[test-sandbox-aware-test](./js/sandbox-aware-test.mdc)
|
|
19
|
-
|
|
20
|
-
[test-vitest-config-pool-forks](./js/vitest-config-pool-forks.mdc)
|
|
21
|
-
|
|
22
|
-
[test-stryker-config](./js/stryker_config.mdc)
|
|
23
|
-
|
|
24
|
-
[test-cargo-mutants-config](./js/cargo_mutants_config.mdc)
|
|
25
|
-
|
|
26
10
|
## Покриття + мутаційне тестування
|
|
27
11
|
|
|
28
12
|
Канонічна команда — `n-cursor coverage`: збирає метрики покриття (`vitest run --coverage`, `cargo llvm-cov` тощо) і мутаційного тестування (Stryker з vitest-runner + `coverageAnalysis: 'perTest'`, `cargo-mutants`) з усіх активних провайдерів у `.n-cursor.json#rules` і пише `COVERAGE.md` у корінь проєкту.
|
|
@@ -35,8 +19,4 @@ alwaysApply: false
|
|
|
35
19
|
|
|
36
20
|
### Multi-workspace iteration
|
|
37
21
|
|
|
38
|
-
У monorepo `n-cursor coverage` ітерує усі workspaces з власним `package.json` і агрегує метрики lcov + Stryker у єдиний `JS`-рядок `COVERAGE.md`. Workspace без тестів пропускається без помилки.
|
|
39
|
-
|
|
40
|
-
## Швидкий gate через conftest
|
|
41
|
-
|
|
42
|
-
[test-package_json](./policy/package_json/package_json.mdc)
|
|
22
|
+
У monorepo `n-cursor coverage` ітерує усі workspaces з власним `package.json` і агрегує метрики lcov + Stryker у єдиний `JS`-рядок `COVERAGE.md`. Workspace без тестів пропускається без помилки.
|
package/rules/text/docs/index.md
CHANGED
package/rules/text/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Цей модуль є CLI-обгорткою над канонічним `lint-text` (text.mdc) та викликається через `n-cursor lint text` (оркестраторний адаптер `lint`). Він автоматично встановлює необхідні інструменти (`shellcheck`, `dotenv-linter`) через `ensureTool` (brew/scoop/GitHub Release per-platform) та перевіряє наявність `patch` (для авто-фіксу shellcheck). Функція `runLintTextCli` послідовно виконує: 1) перевірку правопису з `@nitra/cspell-dict` (`cspell .`); 2) авто-фікс та фінальну перевірку `.sh` файлів (`shellcheck`); 3) авто-фікс та фінальну перевірку `.env*` файлів (`dotenv-linter`); 4) авто-фікс Markdown-документів (`markdownlint-cli2 --fix "**\/*.md" "**\/*.mdc"`); 5) schema-валідацію JSON/YAML/TOML через `v8r`. При першому ненульовому коді з ланцюжка повертається код виходу, і наступні кроки не запускаються. Конфігурації, на які спирається код: meta.json.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль інтегрує cspell у ланцюжку lint-text для класифікації невідомих слів згідно зі схемою docs/specs/2026-06-15-opportunistic-llm-fix-tier.md. Він виявляє невідомі слова, класифікує їх за допомогою LLM у межах omlx-класифікації. Валідні слова автоматично дописуються до `.cspell.json#words` (відповідно до конфігурацій .cspell.json та meta.json). Невалідні знахідки залишаються для ручного рев'ю. Процес є read-only (нуль мутацій), оскільки fix-режим не переписує файли, а лише класифікує знахідки. Після дописування словника виконується re-detect. Гейт-механізм гарантує, що cspell поверне ненульовий код, якщо нерозкласифіковані або потенційні одруки залишилися.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль запускає `dotenv-linter` для валідації конфігураційних файлів `.env*` відповідно до стандартів (наприклад, `LowercaseKey`). Процес включає два етапи: спочатку автоматичне виправлення порушень за допомогою `dotenv-linter fix`, а потім фінальну перевірку за допомогою `dotenv-linter check`. Інструмент очікується у системному PATH і не включається у залежності проєкту. Він рекурсивно шукає файли, виключаючи `node_modules` та `.envrc`. Якщо `dotenv-linter` відсутній, виводиться інструкція щодо його встановлення (наприклад, `brew install dotenv-linter`) та повертається код помилки. Усі деталі роботи можна знайти за посиланням https://git.io/JLbXn.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Скрипт забезпечує відповідність shell-скриптів стандартам, виконуючи дві послідовні дії: спочатку застосовує автоматичні виправлення для проблем, виявлених `shellcheck` за допомогою формату виводу `diff` та команди `patch -p1` у корені проєкту; потім проводить фінальну перевірку всіх зібраних файлів. Скрипт збирає всі відстежувані shell-скрипти у робочому дереві, ігноруючи директорії `node_modules`. Якщо скриптів не знайдено, процес завершується з кодом 0. Якщо `shellcheck` або `patch` відсутні у PATH, скрипт завершується з кодом 1, надаючи підказки для їх встановлення. Після циклу автовиправлень будь-яке попередження чи помилка від `shellcheck` призводить до ненульового коду виходу.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Скрипт виконує єдиний виклик `v8r` для перевірки відповідності всіх файлів, які підтримує `v8r` (json, json5, yaml, yml, toml), визначеним контрактам. Це замінює необхідність у кількох окремих викликах `v8r`. Скрипт автоматично використовує каталог схем `@nitra/cursor`, який визначається у `v8r-catalog.json`. Якщо не надано додаткових аргументів, він шукає файли за типовими шаблонами у дереві проєкту. Механізм гарантує, що перевірка всіх розширень відбувається, навіть якщо один із глобів не знаходить файлів, оскільки він обходить проблему падіння `v8r` з кодом 98.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|