@nitra/cursor 12.6.1 → 12.7.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 -1
- package/CHANGELOG.md +10 -0
- package/bin/docs/n-cursor.md +4 -20
- package/bin/n-cursor.js +7 -53
- package/docs/stryker.config.md +20 -28
- package/package.json +1 -1
- package/rules/abie/docs/index.md +1 -0
- package/rules/abie/docs/main.md +29 -0
- package/rules/abie/{fix.mjs → main.mjs} +5 -3
- package/rules/adr/docs/index.md +1 -0
- package/rules/adr/docs/main.md +29 -0
- package/rules/adr/{fix.mjs → main.mjs} +5 -3
- package/rules/bun/docs/index.md +1 -0
- package/rules/bun/docs/main.md +30 -0
- package/rules/bun/js/docs/layout.md +11 -36
- package/rules/bun/{fix.mjs → main.mjs} +5 -3
- package/rules/capacitor/docs/index.md +1 -0
- package/rules/capacitor/docs/main.md +29 -0
- package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
- package/rules/changelog/docs/index.md +1 -0
- package/rules/changelog/docs/main.md +27 -0
- package/rules/changelog/main.mjs +20 -0
- package/rules/ci4/docs/index.md +1 -0
- package/rules/ci4/docs/main.md +30 -0
- package/rules/ci4/main.mjs +20 -0
- package/rules/doc-files/docs/index.md +1 -0
- package/rules/doc-files/docs/main.md +31 -0
- package/rules/doc-files/js/docgen-files-batch.mjs +47 -3
- package/rules/doc-files/js/docgen-scan.mjs +89 -9
- package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
- package/rules/doc-files/js/docs/docgen-scan.md +34 -34
- package/rules/doc-files/js/docs/index.md +1 -0
- package/rules/doc-files/js/docs/run-lint.md +27 -0
- package/rules/doc-files/{lint/lint.mjs → js/run-lint.mjs} +23 -9
- package/rules/doc-files/{js/lint.mjs → main.mjs} +60 -10
- package/rules/docker/docs/index.md +1 -0
- package/rules/docker/docs/main.md +28 -0
- package/rules/docker/js/docs/lint.md +26 -54
- package/rules/docker/js/lint.mjs +11 -0
- package/rules/docker/lib/docker-hadolint.mjs +1 -1
- package/rules/docker/lib/docs/docker-hadolint.md +16 -173
- package/rules/docker/main.mjs +20 -0
- package/rules/efes/docs/index.md +1 -0
- package/rules/efes/docs/main.md +29 -0
- package/rules/efes/main.mjs +20 -0
- package/rules/feedback/docs/index.md +1 -0
- package/rules/feedback/docs/main.md +30 -0
- package/rules/feedback/main.mjs +20 -0
- package/rules/ga/docs/index.md +1 -0
- package/rules/ga/docs/main.md +29 -0
- package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
- package/rules/graphql/docs/index.md +1 -0
- package/rules/graphql/docs/main.md +36 -0
- package/rules/graphql/main.mjs +20 -0
- package/rules/hasura/docs/index.md +1 -0
- package/rules/hasura/docs/main.md +30 -0
- package/rules/hasura/main.mjs +20 -0
- package/rules/image-avif/docs/index.md +1 -0
- package/rules/image-avif/docs/main.md +30 -0
- package/rules/image-avif/js/docs/avif_generation.md +20 -233
- package/rules/image-avif/main.mjs +20 -0
- package/rules/image-compress/docs/index.md +1 -0
- package/rules/image-compress/docs/main.md +29 -0
- package/rules/image-compress/js/docs/package_setup.md +12 -11
- package/rules/image-compress/{js/lint.mjs → main.mjs} +21 -5
- package/rules/js-bun-db/docs/index.md +1 -0
- package/rules/js-bun-db/docs/main.md +30 -0
- package/rules/js-bun-db/main.mjs +20 -0
- package/rules/js-bun-redis/docs/index.md +1 -0
- package/rules/js-bun-redis/docs/main.md +29 -0
- package/rules/js-bun-redis/main.mjs +20 -0
- package/rules/js-lint/docs/index.md +1 -0
- package/rules/js-lint/docs/main.md +29 -0
- package/rules/js-lint/js/check.mjs +268 -0
- package/rules/js-lint/js/docs/check.md +39 -0
- package/rules/js-lint/js/docs/index.md +1 -1
- package/rules/js-lint/js/docs/tooling.md +12 -32
- package/rules/js-lint/js/tooling.mjs +1 -265
- package/rules/js-lint/{js/lint.mjs → main.mjs} +19 -2
- package/rules/js-lint-ci/docs/index.md +1 -0
- package/rules/js-lint-ci/docs/main.md +27 -0
- package/rules/js-lint-ci/main.mjs +33 -0
- package/rules/js-mssql/docs/index.md +1 -0
- package/rules/js-mssql/docs/main.md +30 -0
- package/rules/js-mssql/main.mjs +20 -0
- package/rules/js-run/docs/index.md +1 -0
- package/rules/js-run/docs/main.md +30 -0
- package/rules/js-run/main.mjs +20 -0
- package/rules/k8s/docs/index.md +1 -0
- package/rules/k8s/docs/main.md +40 -0
- package/rules/k8s/js/docs/index.md +12 -0
- package/rules/k8s/{lint/lint.mjs → main.mjs} +32 -10
- package/rules/nginx-default-tpl/docs/index.md +1 -0
- package/rules/nginx-default-tpl/docs/main.md +30 -0
- package/rules/nginx-default-tpl/main.mjs +20 -0
- package/rules/npm-module/docs/index.md +1 -0
- package/rules/npm-module/docs/main.md +29 -0
- package/rules/npm-module/js/docs/rule_meta.md +17 -16
- package/rules/npm-module/js/rule_meta.mjs +13 -3
- package/rules/npm-module/main.mjs +20 -0
- package/rules/php/docs/index.md +1 -0
- package/rules/php/docs/main.md +33 -0
- package/rules/php/js/docs/tooling.md +10 -10
- package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
- package/rules/python/docs/index.md +1 -0
- package/rules/python/docs/main.md +31 -0
- package/rules/python/js/docs/tooling.md +17 -17
- package/rules/python/{lint/lint.mjs → main.mjs} +29 -5
- package/rules/rego/docs/index.md +1 -0
- package/rules/rego/docs/main.md +37 -0
- package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
- package/rules/release/docs/index.md +1 -0
- package/rules/release/docs/main.md +29 -0
- package/rules/release/docs/release.md +0 -3
- package/rules/release/release.mdc +10 -0
- package/rules/rust/docs/index.md +1 -0
- package/rules/rust/docs/main.md +27 -0
- package/rules/rust/{js/lint.mjs → main.mjs} +20 -3
- package/rules/security/docs/index.md +1 -0
- package/rules/security/docs/main.md +28 -0
- package/rules/security/main.mjs +45 -0
- package/rules/style-lint/docs/index.md +1 -0
- package/rules/style-lint/docs/main.md +29 -0
- package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
- package/rules/tauri/docs/index.md +1 -0
- package/rules/tauri/docs/main.md +29 -0
- package/rules/tauri/main.mjs +20 -0
- package/rules/test/docs/index.md +1 -0
- package/rules/test/docs/main.md +30 -0
- package/rules/test/main.mjs +20 -0
- package/rules/text/docs/index.md +1 -0
- package/rules/text/docs/main.md +29 -0
- package/rules/text/js/docs/cspell-fix.md +30 -0
- package/rules/text/js/docs/formatting.md +12 -45
- package/rules/text/js/docs/index.md +4 -0
- package/rules/text/js/docs/run-dotenv-linter.md +31 -0
- package/rules/text/js/docs/run-shellcheck.md +28 -0
- package/rules/text/js/docs/run-v8r.md +29 -0
- package/rules/text/{lint/lint.mjs → main.mjs} +38 -9
- package/rules/tool-surface/docs/index.md +1 -0
- package/rules/tool-surface/docs/main.md +29 -0
- package/rules/tool-surface/main.mjs +20 -0
- package/rules/vue/docs/index.md +1 -0
- package/rules/vue/docs/main.md +29 -0
- package/rules/vue/main.mjs +20 -0
- package/rules/worktree/docs/index.md +1 -0
- package/rules/worktree/docs/main.md +28 -0
- package/rules/worktree/main.mjs +20 -0
- package/scripts/docs/index.md +1 -0
- package/scripts/docs/post-tool-use-check.md +29 -0
- package/scripts/docs/sync-claude-config.md +64 -92
- package/scripts/lib/adr/docs/normalize-cli.md +0 -3
- package/scripts/lib/adr/docs/normalize-pipeline.md +0 -3
- package/scripts/lib/docs/gha-workflow.md +25 -317
- package/scripts/lib/docs/index.md +1 -0
- package/scripts/lib/docs/list-project-rules-mdc.md +5 -4
- package/scripts/lib/docs/list-rule-ids.md +15 -148
- package/scripts/lib/docs/read-n-cursor-config-lite.md +12 -16
- package/scripts/lib/docs/run-lint-step.md +13 -13
- package/scripts/lib/docs/run-lint.md +30 -0
- package/scripts/lib/docs/run-rule-cli.md +14 -10
- package/scripts/lib/docs/run-standard-lint.md +27 -10
- package/scripts/lib/docs/run-standard-rule.md +12 -11
- package/scripts/lib/docs/timing-summary.md +11 -12
- package/scripts/lib/docs/worktree-notice.md +0 -3
- package/scripts/lib/fix/docs/index.md +1 -0
- package/scripts/lib/fix/docs/orchestrator.md +23 -18
- package/scripts/lib/fix/docs/run-conformance-check.md +32 -0
- package/scripts/lib/fix/docs/t0.md +10 -9
- package/scripts/lib/fix/orchestrator.mjs +5 -5
- package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
- package/scripts/lib/fix/t0.mjs +3 -3
- package/scripts/lib/list-project-rules-mdc.mjs +1 -1
- package/scripts/lib/list-rule-ids.mjs +12 -3
- package/scripts/lib/read-n-cursor-config-lite.mjs +2 -2
- package/{rules/lint/js/orchestrate.mjs → scripts/lib/run-lint.mjs} +42 -20
- package/scripts/lib/run-rule-cli.mjs +4 -4
- package/scripts/lib/run-standard-lint.mjs +19 -6
- package/scripts/lib/run-standard-rule.mjs +4 -4
- package/scripts/lib/timing-summary.mjs +1 -1
- package/scripts/{post-tool-use-fix.mjs → post-tool-use-check.mjs} +9 -9
- package/scripts/sync-claude-config.mjs +2 -2
- package/rules/changelog/fix.mjs +0 -18
- package/rules/ci4/fix.mjs +0 -18
- package/rules/doc-files/fix.mjs +0 -19
- package/rules/doc-files/js/docs/lint.md +0 -34
- package/rules/doc-files/lint/docs/index.md +0 -11
- package/rules/doc-files/lint/docs/lint.md +0 -35
- package/rules/docker/fix.mjs +0 -18
- package/rules/docker/lint/docs/index.md +0 -11
- package/rules/docker/lint/docs/lint.md +0 -200
- package/rules/docker/lint/lint.mjs +0 -95
- package/rules/efes/fix.mjs +0 -18
- package/rules/feedback/fix.mjs +0 -18
- package/rules/ga/fix.mjs +0 -18
- package/rules/ga/js/docs/lint.md +0 -20
- package/rules/ga/js/lint.mjs +0 -12
- package/rules/ga/lint/docs/index.md +0 -11
- package/rules/ga/lint/docs/lint.md +0 -31
- package/rules/graphql/fix.mjs +0 -18
- package/rules/hasura/fix.mjs +0 -18
- package/rules/image-avif/fix.mjs +0 -18
- package/rules/image-compress/fix.mjs +0 -18
- package/rules/image-compress/js/docs/lint.md +0 -24
- package/rules/js-bun-db/fix.mjs +0 -18
- package/rules/js-bun-redis/fix.mjs +0 -18
- package/rules/js-lint/fix.mjs +0 -18
- package/rules/js-lint/js/docs/lint.md +0 -32
- package/rules/js-lint-ci/fix.mjs +0 -18
- package/rules/js-lint-ci/js/docs/lint.md +0 -22
- package/rules/js-lint-ci/js/lint.mjs +0 -15
- package/rules/js-mssql/fix.mjs +0 -18
- package/rules/js-run/fix.mjs +0 -18
- package/rules/k8s/fix.mjs +0 -18
- package/rules/k8s/js/lint.mjs +0 -14
- package/rules/k8s/lint/docs/index.md +0 -11
- package/rules/k8s/lint/docs/lint.md +0 -413
- package/rules/lint/docs/fix.md +0 -25
- package/rules/lint/docs/index.md +0 -11
- package/rules/lint/fix.mjs +0 -18
- package/rules/lint/js/docs/index.md +0 -11
- package/rules/lint/js/docs/orchestrate.md +0 -31
- package/rules/lint/meta.json +0 -1
- package/rules/nginx-default-tpl/fix.mjs +0 -18
- package/rules/npm-module/fix.mjs +0 -18
- package/rules/php/fix.mjs +0 -18
- package/rules/php/js/docs/lint.md +0 -20
- package/rules/php/js/lint.mjs +0 -15
- package/rules/php/lint/docs/index.md +0 -11
- package/rules/php/lint/docs/lint.md +0 -219
- package/rules/python/fix.mjs +0 -18
- package/rules/python/js/docs/lint.md +0 -21
- package/rules/python/js/lint.mjs +0 -14
- package/rules/python/lint/docs/index.md +0 -11
- package/rules/python/lint/docs/lint.md +0 -29
- package/rules/rego/fix.mjs +0 -18
- package/rules/rego/js/docs/lint.md +0 -21
- package/rules/rego/js/lint.mjs +0 -12
- package/rules/rego/lint/docs/index.md +0 -11
- package/rules/rego/lint/docs/lint.md +0 -208
- package/rules/rust/fix.mjs +0 -18
- package/rules/rust/js/docs/lint.md +0 -21
- package/rules/security/fix.mjs +0 -18
- package/rules/security/js/docs/lint.md +0 -175
- package/rules/security/js/lint.mjs +0 -26
- package/rules/style-lint/fix.mjs +0 -18
- package/rules/style-lint/js/docs/lint.md +0 -31
- package/rules/tauri/fix.mjs +0 -18
- package/rules/test/fix.mjs +0 -18
- package/rules/text/fix.mjs +0 -18
- package/rules/text/js/docs/lint.md +0 -23
- package/rules/text/js/lint.mjs +0 -15
- package/rules/text/lint/docs/cspell-fix.md +0 -32
- package/rules/text/lint/docs/index.md +0 -15
- package/rules/text/lint/docs/lint.md +0 -36
- package/rules/text/lint/docs/run-dotenv-linter.md +0 -161
- package/rules/text/lint/docs/run-shellcheck.md +0 -216
- package/rules/text/lint/docs/run-v8r.md +0 -201
- package/rules/tool-surface/fix.mjs +0 -18
- package/rules/vue/fix.mjs +0 -18
- package/rules/worktree/fix.mjs +0 -18
- /package/rules/release/{fix.mjs → main.mjs} +0 -0
- /package/rules/text/{lint → js}/cspell-fix.mjs +0 -0
- /package/rules/text/{lint → js}/run-dotenv-linter.mjs +0 -0
- /package/rules/text/{lint → js}/run-shellcheck.mjs +0 -0
- /package/rules/text/{lint → js}/run-v8r.mjs +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/nginx-default-tpl/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 762b6875
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 90
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль перевіряє задане правило, використовуючи конфігурації, які визначаються у meta.json. При запуску через публічну функцію `run` відбувається оркестрація виконання. Процес включає застосування логіки, що використовує кешування результатів у межах одного прогону. Результат виконання визначає код виходу.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
1. Викликається функція `run` для виконання перевірки правила.
|
|
18
|
+
2. Виконання `run` застосовує логіку правила, включаючи обробку JS-запитань, політику та посилання на MDC.
|
|
19
|
+
3. Якщо скрипт виконується як окрема програма (CLI), відбувається запуск оркестрації правила.
|
|
20
|
+
4. Оркестрація правила виконує завантаження конфігурацій, застосовує вайтлістинг та підсумовує результати.
|
|
21
|
+
5. Результат виконання визначає код виходу процесу.
|
|
22
|
+
|
|
23
|
+
## Публічний API
|
|
24
|
+
|
|
25
|
+
run — виконує основну логіку правила, включаючи перевірку відповідності JS-зацікавленостей та політикам, а також посилання на MDC.
|
|
26
|
+
|
|
27
|
+
## Гарантії поведінки
|
|
28
|
+
|
|
29
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
30
|
+
- Кешує результати в межах одного прогону.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
+
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
|
|
6
|
+
* JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
|
|
7
|
+
* (`meta.json` без `lint`), тож експорту `lint` тут немає.
|
|
8
|
+
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
9
|
+
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
10
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
11
|
+
*/
|
|
12
|
+
export function run(ctx) {
|
|
13
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (isRunAsCli(import.meta.url)) {
|
|
17
|
+
// Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
|
|
18
|
+
// (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
|
|
19
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
20
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/npm-module/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 762b6875
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль виконує перевірку, застосовуючи політику, обробляючи JS-запити. При запуску як інструмент командного рядка, метод `run` ініціює повний запуск правила. Цей запуск включає завантаження конфігурацій, що спираються на meta.json, застосування білих списків та підбиття підсумків. Модуль є Read-only, тобто не пише у ФС/БД. Кешування даних відбувається в межах одного прогону.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
1. Викликається функція `run` для виконання перевірки.
|
|
18
|
+
2. Виконання перевірки включає застосування політики, обробку JS-запитань та посилання на MDC-референси.
|
|
19
|
+
3. Якщо код виконується як окремий інструмент командного рядка, ініціюється повний запуск правила.
|
|
20
|
+
4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
|
|
21
|
+
|
|
22
|
+
## Публічний API
|
|
23
|
+
|
|
24
|
+
run — виконує основну логіку правила: застосовує перевірки, обробляє JS-залежності, застосовує політику та посилання MDC.
|
|
25
|
+
|
|
26
|
+
## Гарантії поведінки
|
|
27
|
+
|
|
28
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
29
|
+
- Кешує результати в межах одного прогону.
|
|
@@ -3,31 +3,32 @@ type: JS Module
|
|
|
3
3
|
title: rule_meta.mjs
|
|
4
4
|
resource: npm/rules/npm-module/js/rule_meta.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 938ccd0a
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
7
8
|
score: 100
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль перевіряє конфігурацію правил, розташованих у каталозі `npm/rules`. Він забезпечує наявність обов'язкового файлу `scripts.mdc` для кожного правила. Крім того, він валідує структуру метаданих у `meta.json`, перевіряючи відповідність полів, таких як `auto` та `lint`, визначеним контрактам. У процесі перевірки використовуються маркери повідомлень (scripts.mdc).
|
|
11
14
|
|
|
12
15
|
## Поведінка
|
|
13
16
|
|
|
14
|
-
1.
|
|
15
|
-
2.
|
|
16
|
-
3. Для
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
1. Викликати `check` для початку валідації.
|
|
18
|
+
2. Перевірити наявність каталогу `npm/rules` у корені репозиторію. Якщо каталог відсутній, валідація завершується успішно.
|
|
19
|
+
3. Для кожного підкаталогу у `npm/rules` (який представляє правило):
|
|
20
|
+
а. Перевірити наявність файлу `auto.md`. Якщо він присутній, реєструється помилка, оскільки метадані тепер знаходяться у `meta.json`.
|
|
21
|
+
б. Перевірити наявність файлу `<id>.mdc` у каталозі правила. Якщо він відсутній, реєструється помилка, оскільки це обов'язковий файл (scripts.mdc).
|
|
22
|
+
в. Зчитати вміст `meta.json` правила. Якщо файл відсутній або невалідний, реєструється помилка, і перевірка цього правила припиняється.
|
|
23
|
+
г. Перевірити поле `auto` у `meta.json`. Якщо поле `auto` присутнє, воно повинно бути валідним (відповідати одному з визначених форматів, або бути відсутнім). Якщо поле `auto` містить невідомий предикат, реєструється помилка.
|
|
24
|
+
ґ. Перевірити поле `lint` у `meta.json`. Якщо поле `lint` присутнє, воно повинно бути валідним (відповідати "per-file" або "full"). Також перевіряється, чи експортує файл `main.mjs` у каталозі правила функцію `lint` відповідно до зазначеного значення `lint`.
|
|
25
|
+
і. Якщо всі перевірки для правила пройшли успішно, реєструється повідомлення про валідність `meta.json`.
|
|
26
|
+
4. Після обробки всіх правил, повертається код виходу, що відображає загальний статус валідації.
|
|
24
27
|
|
|
25
28
|
## Публічний API
|
|
26
29
|
|
|
27
|
-
check —
|
|
30
|
+
check — перевіряє відповідність усіх файлів `npm/rules/<id>/meta.json` встановленим критеріям.
|
|
28
31
|
|
|
29
32
|
## Гарантії поведінки
|
|
30
33
|
|
|
31
|
-
- Read-only:
|
|
32
|
-
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
33
|
-
- Не звертається до мережі.
|
|
34
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @see ./docs/rule_meta.md */
|
|
2
|
-
import { existsSync, readdirSync } from 'node:fs'
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
5
5
|
import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
|
|
@@ -41,8 +41,12 @@ function checkLintField(id, ruleDir, raw, reporter) {
|
|
|
41
41
|
reporter.fail(`rules/${id}: meta.json.lint нерозпізнане (очікується "per-file"|"full")`)
|
|
42
42
|
return false
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
const mainPath = join(ruleDir, 'main.mjs')
|
|
45
|
+
const src = existsSync(mainPath) ? readFileSync(mainPath, 'utf8') : ''
|
|
46
|
+
// Канон (ADR 2026-06-21): lint-поверхня — це експорт `lint` із `main.mjs` (інлайн або
|
|
47
|
+
// `export { lint } from './js/…'`), а не окремий `js/lint.mjs`.
|
|
48
|
+
if (!/export\s+(?:async\s+)?function\s+lint\b|export\s*\{[^}]*\blint\b/u.test(src)) {
|
|
49
|
+
reporter.fail(`rules/${id}: lint:"${raw.lint}" але main.mjs не експортує lint`)
|
|
46
50
|
return false
|
|
47
51
|
}
|
|
48
52
|
return true
|
|
@@ -63,6 +67,12 @@ function checkRule(id, ruleDir, reporter) {
|
|
|
63
67
|
ruleOk = false
|
|
64
68
|
}
|
|
65
69
|
|
|
70
|
+
// Канон (scripts.mdc): {rule}.mdc — ОБОВ'ЯЗКОВИЙ у кожному npm/rules/<id>/.
|
|
71
|
+
if (!existsSync(join(ruleDir, `${id}.mdc`))) {
|
|
72
|
+
reporter.fail(`rules/${id}: відсутній ${id}.mdc — обов'язковий (scripts.mdc)`)
|
|
73
|
+
ruleOk = false
|
|
74
|
+
}
|
|
75
|
+
|
|
66
76
|
const raw = readRuleMetaRaw(ruleDir)
|
|
67
77
|
if (!raw) {
|
|
68
78
|
reporter.fail(`rules/${id}: відсутній або невалідний meta.json`)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
+
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
|
|
6
|
+
* JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
|
|
7
|
+
* (`meta.json` без `lint`), тож експорту `lint` тут немає.
|
|
8
|
+
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
9
|
+
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
10
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
11
|
+
*/
|
|
12
|
+
export function run(ctx) {
|
|
13
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (isRunAsCli(import.meta.url)) {
|
|
17
|
+
// Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
|
|
18
|
+
// (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
|
|
19
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
20
|
+
}
|
package/rules/php/docs/index.md
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/php/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: a2c44b0c
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Скрипт виконує перевірку коду відповідно до правила `php.mdc`. Він запускає `composer audit` для перевірки залежностей, а також, якщо встановлені, виконує PHPStan, Psalm, PHP-CS-Fixer (у режимі dry-run) та PHPCS зі стандартом Security. Робота скрипта ґрунтується на конфігурації, визначеній у `composer.json`. Скрипт пропускає запуск інструменту, якщо відповідний виконуваний файл відсутній у `vendor/bin/`. Якщо `composer.json` відсутній у корені, інструменти не запускаються.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
run виконує стандартну перевірку, застосовуючи правила до контексту.
|
|
18
|
+
getPhpcsCodePaths визначає шляхи до каталогів коду для PHPCS, перевіряючи типові директорії (`app`, `src`, `lib`, `public`, `www`) або кореневий каталог.
|
|
19
|
+
runPhpLintSteps виконує послідовність перевірок: `composer audit`, PHP-CS-Fixer (dry-run), phpcs (Security), PHPStan та Psalm, пропускаючи кроки, якщо відповідні інструменти відсутні.
|
|
20
|
+
lint оркеструє виконання кроків PHP-лінтування для всього репозиторію.
|
|
21
|
+
|
|
22
|
+
## Публічний API
|
|
23
|
+
|
|
24
|
+
run — головна точка входу для виконання правил (перевірка логіки застосування до JS-задач, політик та посилань MDC).
|
|
25
|
+
getPhpcsCodePaths — Визначає шляхи до коду, які має аналізувати PHPCS.
|
|
26
|
+
runPhpLintSteps — Виконує етапи лінтингу, включаючи аудит `composer`, `php-cs-fixer`, `phpstan` та `psalm`.
|
|
27
|
+
lint — Координує фазу лінтингу, виконуючи аудит `composer`, перевірку стилю коду (`php-cs-fixer`) та аналіз статичних аналізаторів (`phpstan`/`psalm`).
|
|
28
|
+
|
|
29
|
+
## Гарантії поведінки
|
|
30
|
+
|
|
31
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
32
|
+
- Кешує результати в межах одного прогону.
|
|
33
|
+
- Свідомо пропускає шляхи: `.git`, `node_modules`.
|
|
@@ -3,25 +3,25 @@ type: JS Module
|
|
|
3
3
|
title: tooling.mjs
|
|
4
4
|
resource: npm/rules/php/js/tooling.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
|
|
6
|
+
crc: 22a05733
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
Файл перевіряє наявність конфігураційних файлів для визначення залежностей та робочих потоків. Файл використовується для встановлення наявності певних файлів у репозиторії.
|
|
11
|
+
Модуль перевіряє наявність ключових конфігураційних файлів проєкту, а саме `composer.json` та `package.json`. Перевірка здійснюється за допомогою публічної функції `check`. Мета — підтвердити наявність базових файлів, необхідних для роботи проєкту (php.mdc).
|
|
12
12
|
|
|
13
13
|
## Поведінка
|
|
14
14
|
|
|
15
|
-
1.
|
|
16
|
-
2.
|
|
17
|
-
3.
|
|
15
|
+
1. Перевіряє наявність файлу `composer.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `composer.json` (php.mdc).
|
|
16
|
+
2. Перевіряє наявність файлу `package.json` у корені проєкту. Якщо файл відсутній, повідомляє про відсутність `package.json` (php.mdc).
|
|
17
|
+
3. Перевіряє наявність файлу `.github/workflows/lint-php.yml`. Якщо файл відсутній, повідомляє про необхідність створити його згідно з `php.mdc`.
|
|
18
|
+
4. Повертає код виходу, який вказує на успішне виконання (0) або наявність проблем (1).
|
|
18
19
|
|
|
19
20
|
## Публічний API
|
|
20
21
|
|
|
21
|
-
check —
|
|
22
|
+
check — перевіряє відповідність проєкту стандартам php.mdc.
|
|
22
23
|
|
|
23
24
|
## Гарантії поведінки
|
|
24
25
|
|
|
25
|
-
- Read-only:
|
|
26
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
26
27
|
- Свідомо пропускає шляхи: `.github`, `.git`.
|
|
27
|
-
- Не звертається до мережі.
|
|
@@ -12,9 +12,22 @@ import { spawnSync } from 'node:child_process'
|
|
|
12
12
|
import { existsSync, statSync } from 'node:fs'
|
|
13
13
|
import { join, resolve } from 'node:path'
|
|
14
14
|
|
|
15
|
-
import { isRunAsCli } from '
|
|
16
|
-
import { createCheckReporter } from '
|
|
17
|
-
import { resolveCmd } from '
|
|
15
|
+
import { isRunAsCli } from '../../scripts/cli-entry.mjs'
|
|
16
|
+
import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
|
|
17
|
+
import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
|
|
18
|
+
import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
|
|
19
|
+
import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
20
|
+
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
|
|
24
|
+
* → policy → mdc-refs); `lint()` нижче — lint-поверхня (composer/phpstan/psalm), імпл інлайн тут.
|
|
25
|
+
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
|
|
26
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
27
|
+
*/
|
|
28
|
+
export function run(ctx) {
|
|
29
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
30
|
+
}
|
|
18
31
|
|
|
19
32
|
const PHPCS_CODE_DIR_CANDIDATES = ['app', 'src', 'lib', 'public', 'www']
|
|
20
33
|
|
|
@@ -62,11 +75,11 @@ function runTool(label, abs, args, pass, fail) {
|
|
|
62
75
|
}
|
|
63
76
|
|
|
64
77
|
/**
|
|
65
|
-
* Запускає `lint-php
|
|
78
|
+
* Запускає кроки `lint-php` (composer audit + php-cs-fixer/phpcs/phpstan/psalm).
|
|
66
79
|
* @param {string} [cwd] корінь репозиторію
|
|
67
80
|
* @returns {number} 0 — OK, 1 — є помилки
|
|
68
81
|
*/
|
|
69
|
-
export function
|
|
82
|
+
export function runPhpLintSteps(cwd = process.cwd()) {
|
|
70
83
|
const reporter = createCheckReporter()
|
|
71
84
|
const { pass, fail } = reporter
|
|
72
85
|
|
|
@@ -121,6 +134,19 @@ export function run(cwd = process.cwd()) {
|
|
|
121
134
|
return reporter.getExitCode()
|
|
122
135
|
}
|
|
123
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Оркестраторний адаптер `n-cursor lint php` (лінтер-фаза): composer audit + php-cs-fixer
|
|
139
|
+
* (`--dry-run`) + phpstan/psalm через `run` у `runStandardLint` (лок). Read-only — мутацій
|
|
140
|
+
* немає, тож `opts` ігнорується. Структурні php.mdc-перевірки — у конформність-фазі.
|
|
141
|
+
* @param {string[] | undefined} _files ігнорується (whole-repo обхід)
|
|
142
|
+
* @param {string} [cwd] корінь
|
|
143
|
+
* @returns {Promise<number>} exit code
|
|
144
|
+
*/
|
|
145
|
+
export function lint(_files, cwd = process.cwd()) {
|
|
146
|
+
return runStandardLint(import.meta.dirname, () => runPhpLintSteps(cwd))
|
|
147
|
+
}
|
|
148
|
+
|
|
124
149
|
if (isRunAsCli(import.meta.url)) {
|
|
125
|
-
|
|
150
|
+
// Standalone: bun rules/php/main.mjs — повний еквівалент `npx @nitra/cursor check php`.
|
|
151
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
126
152
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/python/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 8ceba96a
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 90
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Виконує логіку `lint-python` за правилом `python.mdc` для забезпечення якості коду Python. Якщо файл `pyproject.toml` відсутній у корені, виконання завершується з кодом 0. Якщо файл присутній, але `uv` не знайдено у системному шляху, це вважається помилкою, оскільки `uv` є єдиним дозволеним пакет-менеджером (без Poetry). Для роботи необхідно виконати `uv lock --check` для підтвердження актуальності файлу блокування та `uv sync --frozen` для створення середовища, що відповідає `uv.lock` (детальніше про `uv` на https://docs.astral.sh/uv/). Опціональні лінтери запускаються лише за умови їх доступності через `uv run`. Запускаються `ruff` у режимі автоматичного виправлення (`--fix`) та форматування, а також `mypy` для статичного аналізу коду, використовуючи канонічний патерн серіалізації через `runStandardLint`.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
run виконує стандартну перевірку на основі контексту.
|
|
18
|
+
runLintPythonSteps виконує послідовність кроків лінтування Python, включаючи перевірку `pyproject.toml`, виконання `uv lock --check` та `uv sync --frozen`, а також запуск опціональних лінтерів (`ruff`, `mypy`) через `uv run`.
|
|
19
|
+
runLintPython запускає послідовність кроків лінтування Python, використовуючи механізм стандартного лінтування.
|
|
20
|
+
lint оркеструє запуск `runLintPython` для аналізу всього проєкту.
|
|
21
|
+
|
|
22
|
+
## Публічний API
|
|
23
|
+
|
|
24
|
+
run — Основна точка входу для виконання правил, що включає перевірку логіки застосування (JS-concerns → policy → mdc-refs) та виконання лінтингу.
|
|
25
|
+
runLintPythonSteps — Виконує внутрішні етапи лінтингу для Python без збереження логів.
|
|
26
|
+
runLintPython — Публічний інтерфейс для запуску лінтингу Python, що забезпечує унікальність виконання через блокування та аналіз стану репозиторію.
|
|
27
|
+
lint — Координатор, який ініціює запуск лінтингу Python, делегуючи це `runLintPython`.
|
|
28
|
+
|
|
29
|
+
## Гарантії поведінки
|
|
30
|
+
|
|
31
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -3,32 +3,32 @@ type: JS Module
|
|
|
3
3
|
title: tooling.mjs
|
|
4
4
|
resource: npm/rules/python/js/tooling.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
|
|
6
|
+
crc: fcabec1d
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
Модуль перевіряє відповідність структури проєкту вимогам, визначеним у `python.mdc`. Він перевіряє наявність ключових файлів конфігурації, таких як `pyproject.toml`, `uv.lock` та `package.json`, у корені репозиторію. Мета — підтвердити відповідність проєкту встановленим стандартам, зокрема щодо використання `uv` замість Poetry.
|
|
12
|
+
|
|
13
|
+
Поведінка
|
|
14
|
+
Виконує перевірку за допомогою публічної функції `check`. Ігнорує шляхи `.github` та `.git`. Не виконує операцій запису у файлову систему чи бази даних (Read-only). (python.mdc)
|
|
11
15
|
|
|
12
16
|
## Поведінка
|
|
13
17
|
|
|
14
|
-
1.
|
|
15
|
-
2.
|
|
16
|
-
3.
|
|
17
|
-
4.
|
|
18
|
-
5.
|
|
19
|
-
6.
|
|
20
|
-
7.
|
|
21
|
-
8.
|
|
22
|
-
9. Перевірити наявність файлу `.github/workflows/lint-python.yml` у корені репозиторію.
|
|
23
|
-
10. Якщо файлу `.github/workflows/lint-python.yml` немає, повернути помилку.
|
|
24
|
-
11. Повернути код виходу.
|
|
18
|
+
1. Перевіряє відповідність проєкту правилам (python.mdc) у вказаному корені репозиторію.
|
|
19
|
+
2. Якщо файл `pyproject.toml` відсутній у корені, повертає код виходу, що вказує на відсутність конфігурації.
|
|
20
|
+
3. Перевіряє наявність файлу `uv.lock`. Якщо він відсутній, повідомляє про необхідність згенерувати його за допомогою `uv lock` (python.mdc).
|
|
21
|
+
4. Перевіряє відсутність файлів `poetry.lock` та `poetry.toml`. Якщо будь-який із них знайдено, повідомляє про необхідність відмови від Poetry та міграції на `uv` (python.mdc).
|
|
22
|
+
5. Перевіряє наявність файлу `package.json` у корені. Якщо він відсутній, повідомляє про необхідність його додавання (python.mdc).
|
|
23
|
+
6. Перевіряє наявність файлу `.github/workflows/lint-python.yml` у корені. Якщо він відсутній, повідомляє про необхідність його створення згідно з документацією (python.mdc).
|
|
24
|
+
7. Повертає код виходу, що відображає загальний стан перевірки.
|
|
25
|
+
8. Не перевіряє шляхи, що містять `.github` або `.git`.
|
|
25
26
|
|
|
26
27
|
## Публічний API
|
|
27
28
|
|
|
28
|
-
check —
|
|
29
|
+
check — перевіряє відповідність проєкту стандартам python.mdc.
|
|
29
30
|
|
|
30
31
|
## Гарантії поведінки
|
|
31
32
|
|
|
32
|
-
- Read-only:
|
|
33
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
33
34
|
- Свідомо пропускає шляхи: `.github`, `.git`.
|
|
34
|
-
- Не звертається до мережі.
|
|
@@ -24,10 +24,22 @@ import { spawnSync } from 'node:child_process'
|
|
|
24
24
|
import { existsSync } from 'node:fs'
|
|
25
25
|
import { join } from 'node:path'
|
|
26
26
|
|
|
27
|
-
import { isRunAsCli } from '
|
|
28
|
-
import { createCheckReporter } from '
|
|
29
|
-
import { resolveCmd } from '
|
|
30
|
-
import { runStandardLint } from '
|
|
27
|
+
import { isRunAsCli } from '../../scripts/cli-entry.mjs'
|
|
28
|
+
import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
|
|
29
|
+
import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
|
|
30
|
+
import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
|
|
31
|
+
import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
32
|
+
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня (applies → JS-concerns
|
|
36
|
+
* → policy → mdc-refs); `lint()` нижче — lint-поверхня (uv/ruff/mypy), імпл інлайн тут.
|
|
37
|
+
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
|
|
38
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
39
|
+
*/
|
|
40
|
+
export function run(ctx) {
|
|
41
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
42
|
+
}
|
|
31
43
|
|
|
32
44
|
/**
|
|
33
45
|
* Запускає CLI-крок і репортить результат.
|
|
@@ -117,6 +129,18 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
|
|
|
117
129
|
export const runLintPython = (opts = {}) =>
|
|
118
130
|
runStandardLint(import.meta.dirname, () => runLintPythonSteps(process.cwd(), opts))
|
|
119
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Оркестраторний адаптер `n-cursor lint python`: делегує у `runLintPython`.
|
|
134
|
+
* @param {string[] | undefined} _files ігнорується (whole-project аналіз)
|
|
135
|
+
* @param {string} [_cwd] корінь (CLI бере process.cwd())
|
|
136
|
+
* @param {{ readOnly?: boolean }} [opts] readOnly → ruff без `--fix`, format `--check`
|
|
137
|
+
* @returns {Promise<number>} exit code
|
|
138
|
+
*/
|
|
139
|
+
export function lint(_files, _cwd, opts = {}) {
|
|
140
|
+
return runLintPython({ readOnly: opts.readOnly === true })
|
|
141
|
+
}
|
|
142
|
+
|
|
120
143
|
if (isRunAsCli(import.meta.url)) {
|
|
121
|
-
|
|
144
|
+
// Standalone: bun rules/python/main.mjs — повний еквівалент `npx @nitra/cursor check python`.
|
|
145
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
122
146
|
}
|
package/rules/rego/docs/index.md
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/rego/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: e58082a1
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 90
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Файл реалізує конвеєр для лінтування Rego-полісів, що знаходяться у каталозі `npm/rules/` (де живуть Rego-полісі пакета `@nitra/cursor`). Конвеєр послідовно виконує три етапи перевірки: строгу компіляцію за допомогою `opa check --strict`, яка виявляє помилки компіляції, незадекларовані змінні та інші проблеми, які ігнорує `regal`; статичне лінтування за допомогою `regal lint` (згідно з https://docs.styra.com/regal), що перевіряє відповідність стилю та ідіоматичності Rego v1; та опціональний запуск юніт-тестів за допомогою `conftest verify` (як описано на https://www.conftest.dev/install/). Резолюція інструментів (`opa`, `regal`) здійснюється через механізм `ensureTool`, що забезпечує їх доступність у середовищі. Усі операції керуються конфігурацією, визначеною у `target.json`.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
run виконує стандартну перевірку політики, застосовуючи логіку, пов'язану з JS-контекстами та посиланнями на MDC.
|
|
18
|
+
|
|
19
|
+
runLintRegoSteps запускає послідовні кроки лінтування Rego-полісі: `opa check --strict`, `regal lint` та опціонально `conftest verify` для файлів-тестів, якщо `conftest` доступний у PATH.
|
|
20
|
+
|
|
21
|
+
runLintRego серіалізує виконання кроків лінтування Rego, забезпечуючи дедуплікацію на основі стану git-дерева.
|
|
22
|
+
|
|
23
|
+
lint делегує виконання повного аналізу Rego-полісі функції runLintRego.
|
|
24
|
+
|
|
25
|
+
## Публічний API
|
|
26
|
+
|
|
27
|
+
run — Основна точка входу правила, яка застосовує логіку до JS-зацікавлень, політики та посилання на MDC.
|
|
28
|
+
|
|
29
|
+
runLintRegoSteps — Виконує перевірку за допомогою `opa check --strict` та лінтинг за допомогою `regal lint` для визначених цілей. Зупиняє виконання з кодом 1, якщо попередні перевірки не пройшли.
|
|
30
|
+
|
|
31
|
+
runLintRego — Публічний інтерфейс для запуску лінтінгу Rego, що забезпечує дедуплікацію на основі стану репозиторію.
|
|
32
|
+
|
|
33
|
+
lint — Адаптер, що керує запуском лінтінгу Rego, делегуючи це `runLintRego`.
|
|
34
|
+
|
|
35
|
+
## Гарантії поведінки
|
|
36
|
+
|
|
37
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -30,10 +30,22 @@ import { spawnSync } from 'node:child_process'
|
|
|
30
30
|
import { existsSync } from 'node:fs'
|
|
31
31
|
import { resolve } from 'node:path'
|
|
32
32
|
|
|
33
|
-
import { isRunAsCli } from '
|
|
34
|
-
import { ensureTool } from '
|
|
35
|
-
import { resolveCmd } from '
|
|
36
|
-
import { runStandardLint } from '
|
|
33
|
+
import { isRunAsCli } from '../../scripts/cli-entry.mjs'
|
|
34
|
+
import { ensureTool } from '../../scripts/lib/ensure-tool.mjs'
|
|
35
|
+
import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
|
|
36
|
+
import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
|
|
37
|
+
import { runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
38
|
+
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies → JS-concerns
|
|
42
|
+
* → policy → mdc-refs. `lint()` нижче — lint-поверхня (opa/regal/conftest), імпл інлайн тут.
|
|
43
|
+
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону
|
|
44
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
45
|
+
*/
|
|
46
|
+
export function run(ctx) {
|
|
47
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
48
|
+
}
|
|
37
49
|
|
|
38
50
|
/** Шляхи з Rego-полісі (відносно cwd). Існують не всі на ранніх стадіях — фільтруємо нижче. */
|
|
39
51
|
const LINT_TARGETS = ['npm/rules']
|
|
@@ -98,6 +110,16 @@ export function runLintRegoSteps(cwd = process.cwd()) {
|
|
|
98
110
|
*/
|
|
99
111
|
export const runLintRego = () => runStandardLint(import.meta.dirname, () => runLintRegoSteps())
|
|
100
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Оркестраторний адаптер `n-cursor lint rego`: делегує у `runLintRego`.
|
|
115
|
+
* @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
|
|
116
|
+
* @returns {Promise<number>} exit code
|
|
117
|
+
*/
|
|
118
|
+
export function lint(_files) {
|
|
119
|
+
return runLintRego()
|
|
120
|
+
}
|
|
121
|
+
|
|
101
122
|
if (isRunAsCli(import.meta.url)) {
|
|
102
|
-
|
|
123
|
+
// Standalone: bun rules/rego/main.mjs — повний еквівалент `npx @nitra/cursor check rego`.
|
|
124
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
103
125
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: npm/rules/release/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 22936815
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль забезпечує оркестрацію та виконання набору правил. При запуску як CLI ініціює повну оркестрацію правил. Як частина процесу, викликає публічну функцію `run` для виконання стандартного правила у контексті поточної директорії. Результат виконання цього правила визначає код виходу процесу. Модуль не модифікує файлову систему чи бази даних. Результати виконання правил кешуються протягом одного прогону.
|
|
14
|
+
|
|
15
|
+
## Поведінка
|
|
16
|
+
|
|
17
|
+
1. Якщо код виконується як CLI, він запускає оркестрацію правил.
|
|
18
|
+
2. Якщо код виконується як частина процесу, він викликає функцію `run`.
|
|
19
|
+
3. Функція `run` запускає стандартне правило для директорії, де знаходиться цей файл, використовуючи наданий контекст прогону.
|
|
20
|
+
4. Результат виконання стандартного правила визначає код виходу процесу.
|
|
21
|
+
|
|
22
|
+
## Публічний API
|
|
23
|
+
|
|
24
|
+
run — виконує послідовність дій: застосовує правила, обробляє JS-занепокоєння, перевіряє політику та посилання MDC.
|
|
25
|
+
|
|
26
|
+
## Гарантії поведінки
|
|
27
|
+
|
|
28
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
29
|
+
- Кешує результати в межах одного прогону.
|