@nitra/cursor 12.6.1 → 12.8.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/.pi-template/extensions/n-cursor-adr/docs/index.md +2 -2
- package/CHANGELOG.md +25 -5
- package/bin/docs/n-cursor.md +4 -20
- package/bin/n-cursor.js +8 -54
- package/docs/index.md +3 -3
- package/docs/stryker.config.md +20 -28
- package/lib/docs/index.md +5 -5
- package/lib/docs/llm.md +4 -4
- package/package.json +2 -2
- package/rules/abie/docs/fix.md +8 -8
- package/rules/abie/docs/index.md +4 -3
- package/rules/abie/docs/main.md +29 -0
- package/rules/abie/js/docs/index.md +6 -6
- package/rules/abie/lib/docs/index.md +9 -9
- 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/fix.md +5 -5
- package/rules/bun/docs/index.md +4 -3
- package/rules/bun/docs/main.md +30 -0
- package/rules/bun/js/docs/index.md +2 -2
- package/rules/bun/js/docs/layout.md +11 -36
- package/rules/bun/{fix.mjs → main.mjs} +5 -3
- package/rules/capacitor/docs/fix.md +10 -10
- package/rules/capacitor/docs/index.md +4 -3
- package/rules/capacitor/docs/main.md +29 -0
- package/rules/capacitor/js/docs/index.md +2 -2
- package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
- package/rules/changelog/docs/fix.md +11 -11
- package/rules/changelog/docs/index.md +4 -3
- package/rules/changelog/docs/main.md +27 -0
- package/rules/changelog/js/docs/consistency.md +12 -12
- package/rules/changelog/js/docs/index.md +2 -2
- package/rules/changelog/lib/docs/index.md +2 -2
- package/rules/changelog/main.mjs +20 -0
- package/rules/ci4/docs/fix.md +4 -4
- package/rules/ci4/docs/index.md +4 -3
- package/rules/ci4/docs/main.md +30 -0
- package/rules/ci4/js/docs/index.md +2 -2
- package/rules/ci4/main.mjs +20 -0
- package/rules/doc-files/docs/index.md +4 -3
- package/rules/doc-files/docs/main.md +31 -0
- package/rules/doc-files/js/docgen-crc.mjs +2 -8
- package/rules/doc-files/js/docgen-extract.mjs +5 -3
- package/rules/doc-files/js/docgen-files-batch.mjs +63 -4
- package/rules/doc-files/js/docgen-gen.mjs +11 -3
- package/rules/doc-files/js/docgen-judge-measure.mjs +67 -18
- package/rules/doc-files/js/docgen-judge.mjs +8 -1
- package/rules/doc-files/js/docgen-scan.mjs +99 -11
- package/rules/doc-files/js/docs/docgen-crc.md +25 -14
- package/rules/doc-files/js/docs/docgen-extract.md +15 -13
- package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
- package/rules/doc-files/js/docs/docgen-gen.md +15 -26
- package/rules/doc-files/js/docs/docgen-judge-measure.md +14 -12
- package/rules/doc-files/js/docs/docgen-scan.md +34 -34
- package/rules/doc-files/js/docs/index.md +16 -15
- 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/fix.md +6 -6
- package/rules/docker/docs/index.md +4 -3
- package/rules/docker/docs/main.md +28 -0
- package/rules/docker/js/docs/index.md +2 -2
- 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/lib/docs/index.md +5 -5
- package/rules/docker/main.mjs +20 -0
- package/rules/efes/docs/fix.md +8 -8
- package/rules/efes/docs/index.md +4 -3
- package/rules/efes/docs/main.md +29 -0
- package/rules/efes/main.mjs +20 -0
- package/rules/feedback/docs/fix.md +5 -5
- package/rules/feedback/docs/index.md +4 -3
- package/rules/feedback/docs/main.md +30 -0
- package/rules/feedback/main.mjs +20 -0
- package/rules/ga/docs/fix.md +5 -5
- package/rules/ga/docs/index.md +4 -3
- package/rules/ga/docs/main.md +29 -0
- package/rules/ga/js/docs/index.md +3 -3
- package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
- package/rules/graphql/docs/fix.md +8 -8
- package/rules/graphql/docs/index.md +4 -3
- package/rules/graphql/docs/main.md +36 -0
- package/rules/graphql/js/docs/index.md +2 -2
- package/rules/graphql/lib/docs/index.md +2 -2
- package/rules/graphql/main.mjs +20 -0
- package/rules/hasura/docs/fix.md +11 -11
- package/rules/hasura/docs/index.md +4 -3
- package/rules/hasura/docs/main.md +30 -0
- package/rules/hasura/js/docs/index.md +2 -2
- package/rules/hasura/main.mjs +20 -0
- package/rules/image-avif/docs/fix.md +3 -3
- package/rules/image-avif/docs/index.md +4 -3
- package/rules/image-avif/docs/main.md +30 -0
- package/rules/image-avif/js/docs/avif_generation.md +20 -233
- package/rules/image-avif/js/docs/index.md +2 -2
- package/rules/image-avif/main.mjs +20 -0
- package/rules/image-compress/docs/fix.md +2 -2
- package/rules/image-compress/docs/index.md +4 -3
- package/rules/image-compress/docs/main.md +29 -0
- package/rules/image-compress/js/docs/index.md +3 -3
- 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/fix.md +5 -5
- package/rules/js-bun-db/docs/index.md +4 -3
- package/rules/js-bun-db/docs/main.md +30 -0
- package/rules/js-bun-db/js/docs/index.md +2 -2
- package/rules/js-bun-db/lib/docs/index.md +2 -2
- package/rules/js-bun-db/main.mjs +20 -0
- package/rules/js-bun-redis/docs/fix.md +6 -6
- package/rules/js-bun-redis/docs/index.md +4 -3
- package/rules/js-bun-redis/docs/main.md +29 -0
- package/rules/js-bun-redis/js/docs/index.md +2 -2
- package/rules/js-bun-redis/lib/docs/index.md +2 -2
- package/rules/js-bun-redis/main.mjs +20 -0
- package/rules/js-lint/docs/fix.md +9 -9
- package/rules/js-lint/docs/index.md +4 -3
- 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 +4 -4
- 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/fix.md +3 -3
- package/rules/js-lint-ci/docs/index.md +4 -3
- package/rules/js-lint-ci/docs/main.md +27 -0
- package/rules/js-lint-ci/js/docs/index.md +2 -2
- package/rules/js-lint-ci/main.mjs +33 -0
- package/rules/js-mssql/docs/fix.md +5 -5
- package/rules/js-mssql/docs/index.md +4 -3
- package/rules/js-mssql/docs/main.md +30 -0
- package/rules/js-mssql/js/docs/index.md +2 -2
- package/rules/js-mssql/lib/docs/index.md +2 -2
- package/rules/js-mssql/main.mjs +20 -0
- package/rules/js-run/docs/fix.md +8 -8
- package/rules/js-run/docs/index.md +4 -3
- package/rules/js-run/docs/main.md +30 -0
- package/rules/js-run/js/docs/index.md +2 -2
- package/rules/js-run/lib/docs/index.md +7 -7
- package/rules/js-run/main.mjs +20 -0
- package/rules/k8s/docs/fix.md +4 -4
- package/rules/k8s/docs/index.md +4 -3
- 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/fix.md +7 -7
- package/rules/nginx-default-tpl/docs/index.md +4 -3
- package/rules/nginx-default-tpl/docs/main.md +30 -0
- package/rules/nginx-default-tpl/js/docs/index.md +2 -2
- package/rules/nginx-default-tpl/js/docs/template.md +2 -2
- package/rules/nginx-default-tpl/main.mjs +20 -0
- package/rules/npm-module/docs/fix.md +8 -8
- package/rules/npm-module/docs/index.md +4 -3
- package/rules/npm-module/docs/main.md +29 -0
- package/rules/npm-module/js/docs/index.md +5 -5
- package/rules/npm-module/js/docs/rule_meta.md +17 -16
- package/rules/npm-module/js/header_doc_pointer.mjs +1 -3
- package/rules/npm-module/js/rule_meta.mjs +13 -3
- package/rules/npm-module/main.mjs +20 -0
- package/rules/php/docs/fix.md +6 -6
- package/rules/php/docs/index.md +4 -3
- package/rules/php/docs/main.md +33 -0
- package/rules/php/js/docs/index.md +3 -3
- package/rules/php/js/docs/tooling.md +10 -10
- package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
- package/rules/python/docs/fix.md +11 -11
- package/rules/python/docs/index.md +4 -3
- package/rules/python/docs/main.md +31 -0
- package/rules/python/js/docs/index.md +3 -3
- package/rules/python/js/docs/tooling.md +17 -17
- package/rules/python/{lint/lint.mjs → main.mjs} +31 -6
- package/rules/rego/docs/fix.md +5 -5
- package/rules/rego/docs/index.md +4 -3
- package/rules/rego/docs/main.md +37 -0
- package/rules/rego/js/docs/index.md +3 -3
- package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
- package/rules/release/docs/index.md +5 -4
- package/rules/release/docs/main.md +29 -0
- package/rules/release/docs/release.md +0 -3
- package/rules/release/lib/docs/index.md +4 -4
- package/rules/release/release.mdc +10 -0
- package/rules/rust/docs/fix.md +4 -4
- package/rules/rust/docs/index.md +4 -3
- package/rules/rust/docs/main.md +27 -0
- package/rules/rust/js/docs/index.md +3 -3
- package/rules/rust/lib/docs/index.md +2 -2
- package/rules/rust/{js/lint.mjs → main.mjs} +27 -4
- package/rules/security/docs/fix.md +6 -6
- package/rules/security/docs/index.md +4 -3
- package/rules/security/docs/main.md +28 -0
- package/rules/security/js/docs/index.md +4 -4
- package/rules/security/main.mjs +45 -0
- package/rules/style-lint/docs/fix.md +3 -3
- package/rules/style-lint/docs/index.md +4 -3
- package/rules/style-lint/docs/main.md +29 -0
- package/rules/style-lint/js/docs/index.md +3 -3
- package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
- package/rules/tauri/docs/fix.md +11 -11
- package/rules/tauri/docs/index.md +4 -3
- package/rules/tauri/docs/main.md +29 -0
- package/rules/tauri/js/docs/index.md +3 -3
- package/rules/tauri/main.mjs +20 -0
- package/rules/test/docs/fix.md +5 -5
- package/rules/test/docs/index.md +4 -3
- package/rules/test/docs/main.md +30 -0
- package/rules/test/js/data/stryker_config/docs/index.md +4 -4
- package/rules/test/js/data/vitest_config/docs/index.md +2 -2
- package/rules/test/js/docs/index.md +7 -7
- package/rules/test/main.mjs +20 -0
- package/rules/text/docs/fix.md +11 -11
- package/rules/text/docs/index.md +4 -3
- package/rules/text/docs/main.md +29 -0
- package/rules/text/{lint → js}/cspell-fix.mjs +7 -2
- 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 +8 -4
- 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} +41 -10
- package/rules/tool-surface/docs/index.md +4 -3
- package/rules/tool-surface/docs/main.md +29 -0
- package/rules/tool-surface/main.mjs +20 -0
- package/rules/tool-surface/meta.json +6 -1
- package/rules/vue/docs/fix.md +6 -6
- package/rules/vue/docs/index.md +4 -3
- package/rules/vue/docs/main.md +29 -0
- package/rules/vue/js/docs/index.md +2 -2
- package/rules/vue/lib/docs/index.md +2 -2
- package/rules/vue/main.mjs +20 -0
- package/rules/worktree/docs/fix.md +11 -11
- package/rules/worktree/docs/index.md +4 -3
- package/rules/worktree/docs/main.md +28 -0
- package/rules/worktree/main.mjs +20 -0
- package/scripts/coverage-classify/docs/index.md +6 -6
- package/scripts/dispatcher/docs/index.md +2 -2
- package/scripts/docs/index.md +16 -15
- 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 +36 -35
- 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 +29 -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/analyze-escalation.mjs +4 -1
- package/scripts/lib/fix/docs/index.md +11 -10
- package/scripts/lib/fix/docs/orchestrator.md +23 -18
- package/scripts/lib/fix/docs/run-conformance-check.md +33 -0
- package/scripts/lib/fix/docs/run-fix-check.md +3 -3
- package/scripts/lib/fix/docs/t0.md +10 -9
- package/scripts/lib/fix/orchestrator.mjs +31 -8
- package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
- package/scripts/lib/fix/t0.mjs +6 -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 -22
- 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/scripts/utils/docs/index.md +14 -14
- package/skills/doc-aggregate/js/docs/index.md +3 -3
- package/skills/doc-files/.changes/260612-0002.md +1 -0
- package/skills/doc-files/.changes/260612-0006.md +1 -0
- package/skills/doc-files/.changes/260612-0008.md +1 -0
- package/skills/doc-files/.changes/260612-0012.md +1 -0
- package/skills/doc-files/.changes/260612-0031.md +1 -0
- package/skills/doc-files/.changes/260612-0036.md +1 -0
- package/skills/doc-files/.changes/260612-0114.md +1 -0
- package/skills/start-check/js/docs/index.md +2 -2
- package/skills/taze/js/docs/index.md +2 -2
- package/types/bin/n-cursor.d.ts +1 -1
- 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}/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,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
|
+
}
|
|
@@ -12,15 +12,15 @@ docgen:
|
|
|
12
12
|
## Поведінка
|
|
13
13
|
|
|
14
14
|
1. Запуск правила.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
- Приймає контекст прогону.
|
|
16
|
+
- Виконує застосування JS-занепокоєних.
|
|
17
|
+
- Застосовує політику.
|
|
18
|
+
- Генерує посилання MDC.
|
|
19
|
+
- Повертає результат прогону.
|
|
20
20
|
2. Виконання у режимі CLI.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
- Виконується як автономний скрипт.
|
|
22
|
+
- Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
23
|
+
- Повертає код виходу з процесу.
|
|
24
24
|
|
|
25
25
|
## Публічний API
|
|
26
26
|
|
|
@@ -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
|
+
- Кешує результати в межах одного прогону.
|
|
@@ -6,9 +6,9 @@ resource: npm/rules/npm-module/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/npm-module/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ----------------------------------------------- | --------- |
|
|
11
11
|
| [header_doc_pointer.mjs](header_doc_pointer.md) | JS Module |
|
|
12
|
-
| [package_structure.mjs](package_structure.md)
|
|
13
|
-
| [rule_meta.mjs](rule_meta.md)
|
|
14
|
-
| [skill_meta.mjs](skill_meta.md)
|
|
12
|
+
| [package_structure.mjs](package_structure.md) | JS Module |
|
|
13
|
+
| [rule_meta.mjs](rule_meta.md) | JS Module |
|
|
14
|
+
| [skill_meta.mjs](skill_meta.md) | JS Module |
|
|
@@ -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: не виконує операцій запису (ФС/БД).
|
|
@@ -47,9 +47,7 @@ function moduleJsDoc(source) {
|
|
|
47
47
|
* @returns {boolean} true для звичайних source-файлів
|
|
48
48
|
*/
|
|
49
49
|
function isSourceMjs(fileEntry) {
|
|
50
|
-
return (
|
|
51
|
-
fileEntry.isFile() && fileEntry.name.endsWith('.mjs') && !fileEntry.name.endsWith('.test.mjs')
|
|
52
|
-
)
|
|
50
|
+
return fileEntry.isFile() && fileEntry.name.endsWith('.mjs') && !fileEntry.name.endsWith('.test.mjs')
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
/**
|
|
@@ -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/fix.md
CHANGED
|
@@ -14,14 +14,14 @@ docgen:
|
|
|
14
14
|
## Поведінка
|
|
15
15
|
|
|
16
16
|
1. Запуск правила.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
- Приймає контекст прогону.
|
|
18
|
+
- Виконує застосування JS-занепокоєних до політики до mdc-refs.
|
|
19
|
+
- Повертає результат прогону.
|
|
20
20
|
|
|
21
21
|
2. Запуск у режимі CLI.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
- Виконується при запуску через CLI.
|
|
23
|
+
- Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
24
|
+
- Повертає код виходу.
|
|
25
25
|
|
|
26
26
|
## Публічний API
|
|
27
27
|
|
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`.
|
|
@@ -6,7 +6,7 @@ resource: npm/rules/php/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/php/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
11
|
-
| [lint.mjs](lint.md)
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ------------------------- | --------- |
|
|
11
|
+
| [lint.mjs](lint.md) | JS Module |
|
|
12
12
|
| [tooling.mjs](tooling.md) | JS Module |
|
|
@@ -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
|
}
|
package/rules/python/docs/fix.md
CHANGED
|
@@ -12,19 +12,19 @@ docgen:
|
|
|
12
12
|
## Поведінка
|
|
13
13
|
|
|
14
14
|
1. Запуск правила.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
- Приймає контекст прогону.
|
|
16
|
+
- Виконує застосування JS-занепокоєних.
|
|
17
|
+
- Застосовує політику.
|
|
18
|
+
- Генерує посилання на MDC.
|
|
19
|
+
- Повертає результат прогону.
|
|
20
20
|
|
|
21
21
|
2. Виконання у режимі CLI.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
- Виконується як автономний скрипт.
|
|
23
|
+
- Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
24
|
+
- Виконує завантаження конфігурації.
|
|
25
|
+
- Виконує перевірку дозволів.
|
|
26
|
+
- Виконує підбирання списку.
|
|
27
|
+
- Виконує підбирання резюме.
|
|
28
28
|
|
|
29
29
|
## Публічний API
|
|
30
30
|
|
|
@@ -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: не виконує операцій запису (ФС/БД).
|
|
@@ -6,8 +6,8 @@ resource: npm/rules/python/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/python/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ------------------------- | --------- |
|
|
11
11
|
| [applies.mjs](applies.md) | JS Module |
|
|
12
|
-
| [lint.mjs](lint.md)
|
|
12
|
+
| [lint.mjs](lint.md) | JS Module |
|
|
13
13
|
| [tooling.mjs](tooling.md) | JS Module |
|
|
@@ -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-крок і репортить результат.
|
|
@@ -103,7 +115,8 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
|
|
|
103
115
|
const ruffCheck = readOnly ? ['check', '.'] : ['check', '--fix', '.']
|
|
104
116
|
const ruffFormat = readOnly ? ['format', '--check', '.'] : ['format', '.']
|
|
105
117
|
if (!runOptionalUvTool('ruff', readOnly ? 'ruff check' : 'ruff check --fix', ruffCheck)) return reporter.getExitCode()
|
|
106
|
-
if (!runOptionalUvTool('ruff', readOnly ? 'ruff format --check' : 'ruff format', ruffFormat))
|
|
118
|
+
if (!runOptionalUvTool('ruff', readOnly ? 'ruff format --check' : 'ruff format', ruffFormat))
|
|
119
|
+
return reporter.getExitCode()
|
|
107
120
|
if (!runOptionalUvTool('mypy', 'mypy', ['.'])) return reporter.getExitCode()
|
|
108
121
|
|
|
109
122
|
return reporter.getExitCode()
|
|
@@ -117,6 +130,18 @@ export function runLintPythonSteps(cwd = process.cwd(), opts = {}) {
|
|
|
117
130
|
export const runLintPython = (opts = {}) =>
|
|
118
131
|
runStandardLint(import.meta.dirname, () => runLintPythonSteps(process.cwd(), opts))
|
|
119
132
|
|
|
133
|
+
/**
|
|
134
|
+
* Оркестраторний адаптер `n-cursor lint python`: делегує у `runLintPython`.
|
|
135
|
+
* @param {string[] | undefined} _files ігнорується (whole-project аналіз)
|
|
136
|
+
* @param {string} [_cwd] корінь (CLI бере process.cwd())
|
|
137
|
+
* @param {{ readOnly?: boolean }} [opts] readOnly → ruff без `--fix`, format `--check`
|
|
138
|
+
* @returns {Promise<number>} exit code
|
|
139
|
+
*/
|
|
140
|
+
export function lint(_files, _cwd, opts = {}) {
|
|
141
|
+
return runLintPython({ readOnly: opts.readOnly === true })
|
|
142
|
+
}
|
|
143
|
+
|
|
120
144
|
if (isRunAsCli(import.meta.url)) {
|
|
121
|
-
|
|
145
|
+
// Standalone: bun rules/python/main.mjs — повний еквівалент `npx @nitra/cursor check python`.
|
|
146
|
+
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
122
147
|
}
|