@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
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: run-shellcheck.mjs
|
|
4
|
-
resource: npm/rules/text/lint/run-shellcheck.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 6b2daaa8
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Модуль `run-shellcheck.mjs` — частина ланцюжка `lint-text` для перевірки якості shell-скриптів (`*.sh`) у проєкті за допомогою зовнішнього інструменту **ShellCheck**. Скрипт виконує два етапи:
|
|
10
|
-
|
|
11
|
-
1. **Авто-виправлення**: оскільки ShellCheck не має прапорця `--fix`, для кожного знайденого `*.sh` файла модуль запускає `shellcheck -f diff` і застосовує отриманий unified-diff через системну утиліту `patch -p1` у корені проєкту. Цикл повторюється до `MAX_FIX_ROUNDS_PER_FILE` (32) разів, поки залишаються авто-виправні зауваження.
|
|
12
|
-
2. **Фінальний прогон**: звичайний `shellcheck` по всіх зібраних файлах. Будь-яке попередження чи помилка дають ненульовий код виходу.
|
|
13
|
-
|
|
14
|
-
Модуль уміє працювати як **CLI** (через `isRunAsCli`) і як **бібліотека** (експортує функції). Шляхи скриптів збираються з `git ls-files` у git-репозиторії або через `globSync` (з виключенням `node_modules`) поза git-деревом.
|
|
15
|
-
|
|
16
|
-
Якщо у системі немає `shellcheck` чи `patch`, у stderr друкуються підказки встановлення для macOS (Homebrew), Debian/Ubuntu (apt) та Arch (pacman), а скрипт завершується з кодом 1.
|
|
17
|
-
|
|
18
|
-
## Експорти / API
|
|
19
|
-
|
|
20
|
-
| Експорт | Тип | Призначення |
|
|
21
|
-
| --------------------------- | -------------- | ---------------------------------------------------------------------------------- |
|
|
22
|
-
| `listShellScriptPaths(cwd)` | named function | Зібрати відсортований унікальний список відносних шляхів до `*.sh` файлів у `cwd`. |
|
|
23
|
-
| `runShellcheckText(cwd?)` | named function | Запустити повний цикл: авто-фікси + фінальна перевірка. Повертає код виходу (0/1). |
|
|
24
|
-
|
|
25
|
-
Модуль також виконується як CLI: якщо `import.meta.url` відповідає поточному запуску — викликається `runShellcheckText()` і її результат присвоюється `process.exitCode`.
|
|
26
|
-
|
|
27
|
-
## Функції
|
|
28
|
-
|
|
29
|
-
### `printShellcheckInstallHints()`
|
|
30
|
-
|
|
31
|
-
- **Сигнатура**: `function printShellcheckInstallHints(): void`
|
|
32
|
-
- **Параметри**: немає.
|
|
33
|
-
- **Повертає**: `void`.
|
|
34
|
-
- **Side effects**: пише у `process.stderr` повідомлення з інструкціями встановлення `shellcheck` для macOS, Debian/Ubuntu та Arch.
|
|
35
|
-
|
|
36
|
-
### `printPatchInstallHints()`
|
|
37
|
-
|
|
38
|
-
- **Сигнатура**: `function printPatchInstallHints(): void`
|
|
39
|
-
- **Параметри**: немає.
|
|
40
|
-
- **Повертає**: `void`.
|
|
41
|
-
- **Side effects**: пише у `process.stderr` підказку про встановлення `patch` (на macOS зазвичай є; на Debian/Ubuntu — `sudo apt-get install -y patch`).
|
|
42
|
-
|
|
43
|
-
### `listShellScriptPaths(cwd)` (export)
|
|
44
|
-
|
|
45
|
-
- **Сигнатура**: `function listShellScriptPaths(cwd: string): string[]`
|
|
46
|
-
- **Параметри**:
|
|
47
|
-
- `cwd` — абсолютний шлях до кореня проєкту (вже має бути нормалізований через `resolve`, якщо потрібно).
|
|
48
|
-
- **Повертає**: відсортований масив унікальних відносних шляхів до `*.sh` файлів від `cwd`. Слеші уніфікуються в forward-slash (`'/'`).
|
|
49
|
-
- **Side effects**: виконує `git rev-parse --is-inside-work-tree` і `git ls-files -z -- ':(glob)**/*.sh'` через `spawnSync`; у безгітовому контексті — викликає `globSync('**/*.sh')` з виключенням `node_modules`.
|
|
50
|
-
- **Логіка**:
|
|
51
|
-
- Якщо `git` доступний і `cwd` — частина git-робочого дерева, читаються лише tracked файли (`ls-files` з NUL-розділенням, дублікати усуваються через `Set`).
|
|
52
|
-
- Якщо `git` доступний, але `ls-files` повертає ненульовий статус — повертається порожній масив.
|
|
53
|
-
- Інакше — `globSync` з `exclude`, який відкидає шляхи, що містять `node_modules` (на будь-якому рівні), і нормалізує бекслеші (`\\` → `/`).
|
|
54
|
-
|
|
55
|
-
### `runShellcheckText(cwd = process.cwd())` (export)
|
|
56
|
-
|
|
57
|
-
- **Сигнатура**: `function runShellcheckText(cwd?: string): number`
|
|
58
|
-
- **Параметри**:
|
|
59
|
-
- `cwd` — необов'язковий робочий каталог. За замовчуванням — `process.cwd()`.
|
|
60
|
-
- **Повертає**: `0` — все OK; `1` — помилка середовища (немає `shellcheck`/`patch`), помилка spawn, або залишкові зауваження ShellCheck після авто-фіксів.
|
|
61
|
-
- **Side effects**:
|
|
62
|
-
- Можливий вивід підказок у `stderr` (якщо немає `shellcheck`/`patch`).
|
|
63
|
-
- Запис патчів у файли через `patch -p1` (модифікує source-файли).
|
|
64
|
-
- Друк звичайного звіту ShellCheck у `stdout`/`stderr` на фінальному кроці.
|
|
65
|
-
- **Алгоритм**:
|
|
66
|
-
1. `root = resolve(cwd)`.
|
|
67
|
-
2. `shellcheck = resolveCmd('shellcheck')` → якщо немає, друк підказки та `return 1`.
|
|
68
|
-
3. `patchBin = resolveCmd('patch')` → якщо немає, друк підказки та `return 1`.
|
|
69
|
-
4. `files = listShellScriptPaths(root)` → якщо порожньо, `return 0`.
|
|
70
|
-
5. Для кожного `rel` із `files`: `autofixOneFile(...)`. Якщо ненульовий код — негайний `return`.
|
|
71
|
-
6. `return runFinalShellcheck(shellcheck, files, root)`.
|
|
72
|
-
|
|
73
|
-
### `autofixOneFile(shellcheck, patchBin, root, rel)`
|
|
74
|
-
|
|
75
|
-
- **Сигнатура**: `function autofixOneFile(shellcheck: string, patchBin: string, root: string, rel: string): number`
|
|
76
|
-
- **Параметри**:
|
|
77
|
-
- `shellcheck` — абсолютний шлях до бінарника ShellCheck.
|
|
78
|
-
- `patchBin` — абсолютний шлях до бінарника `patch`.
|
|
79
|
-
- `root` — абсолютний `cwd` для spawn.
|
|
80
|
-
- `rel` — відносний шлях файла від `root`.
|
|
81
|
-
- **Повертає**: `0` — більше нема чого фіксити (нормальне завершення циклу); `1` — помилка spawn чи помилка `patch`.
|
|
82
|
-
- **Side effects**: до 32 викликів `spawnSync(shellcheck, ['-f', 'diff', rel])` і `applyShellcheckDiff(...)` на файл; модифікує сам файл через `patch`.
|
|
83
|
-
- **Логіка**:
|
|
84
|
-
- У циклі `0..MAX_FIX_ROUNDS_PER_FILE-1`:
|
|
85
|
-
- Запускає `shellcheck -f diff <rel>` з `maxBuffer: 10MiB`.
|
|
86
|
-
- Якщо `diffResult.error` — друкує повідомлення і повертає 1.
|
|
87
|
-
- Якщо `shouldStopAutofixLoop(diffResult)` — повертає 0.
|
|
88
|
-
- Інакше — `applyShellcheckDiff(...)`. На помилку — повертає 1.
|
|
89
|
-
- Якщо досягнуто `MAX_FIX_ROUNDS_PER_FILE` — повертає 0 (захист від зациклення).
|
|
90
|
-
|
|
91
|
-
### `shouldStopAutofixLoop(diffResult)`
|
|
92
|
-
|
|
93
|
-
- **Сигнатура**: `function shouldStopAutofixLoop(diffResult: { status: number | null, stdout?: string | null, stderr?: string | null }): boolean`
|
|
94
|
-
- **Параметри**:
|
|
95
|
-
- `diffResult` — об'єкт результату `spawnSync` (потрібні `status`, `stdout`, `stderr`).
|
|
96
|
-
- **Повертає**: `true`, якщо подальші ітерації авто-фіксів не мають сенсу.
|
|
97
|
-
- **Side effects**: немає (чиста перевірка).
|
|
98
|
-
- **Логіка**: повертає `true`, якщо
|
|
99
|
-
- `status === 0` (ShellCheck не знайшов зауважень), **або**
|
|
100
|
-
- `stderr` містить підрядок `'none were auto-fixable'` (`NON_AUTOFIXABLE_HINT`), **або**
|
|
101
|
-
- `stdout` після `trim()` порожній (нема дифу для застосування).
|
|
102
|
-
|
|
103
|
-
### `applyShellcheckDiff(patchBin, root, rel, diffStdout)`
|
|
104
|
-
|
|
105
|
-
- **Сигнатура**: `function applyShellcheckDiff(patchBin: string, root: string, rel: string, diffStdout: string): number`
|
|
106
|
-
- **Параметри**:
|
|
107
|
-
- `patchBin` — абсолютний шлях до `patch`.
|
|
108
|
-
- `root` — `cwd` для spawn (корінь проєкту).
|
|
109
|
-
- `rel` — відносний шлях файла, для якого формується diff (використовується тільки у повідомленні про помилку).
|
|
110
|
-
- `diffStdout` — вміст unified-diff, отриманий від `shellcheck -f diff`.
|
|
111
|
-
- **Повертає**: `0` — патч застосовано; `1` — `patch` повернув ненульовий код.
|
|
112
|
-
- **Side effects**:
|
|
113
|
-
- Запускає `patch -p1` із `diffStdout` через stdin.
|
|
114
|
-
- На помилку виливає `stderr` і `stdout` процесу `patch` у `process.stderr`, а також додає рядок `run-shellcheck-text: patch не застосував diff для ${rel}`.
|
|
115
|
-
|
|
116
|
-
### `runFinalShellcheck(shellcheck, files, root)`
|
|
117
|
-
|
|
118
|
-
- **Сигнатура**: `function runFinalShellcheck(shellcheck: string, files: string[], root: string): number`
|
|
119
|
-
- **Параметри**:
|
|
120
|
-
- `shellcheck` — абсолютний шлях до ShellCheck.
|
|
121
|
-
- `files` — відносні шляхи усіх файлів для перевірки.
|
|
122
|
-
- `root` — `cwd` для spawn.
|
|
123
|
-
- **Повертає**: `0` — звіт чистий; `1` — `spawnSync` віддав `error` або `status !== 0`.
|
|
124
|
-
- **Side effects**:
|
|
125
|
-
- Виконує `shellcheck <files...>` без прапорця `-f diff`, з `maxBuffer: 10MiB` і `stdio: ['ignore', 'pipe', 'pipe']`.
|
|
126
|
-
- Якщо є помилка — друкує `error.message` у `stderr`.
|
|
127
|
-
- Якщо `status !== 0` — друкує `stdout` у `process.stdout` і `stderr` у `process.stderr`.
|
|
128
|
-
|
|
129
|
-
## Константи
|
|
130
|
-
|
|
131
|
-
| Ім'я | Значення | Призначення |
|
|
132
|
-
| ------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
133
|
-
| `NON_AUTOFIXABLE_HINT` | `'none were auto-fixable'` | Маркер у stderr ShellCheck про відсутність авто-виправлень — критерій виходу з циклу `autofixOneFile`. |
|
|
134
|
-
| `MAX_FIX_ROUNDS_PER_FILE` | `32` | Жорсткий ліміт ітерацій `diff`+`patch` на один файл для уникнення зациклення. |
|
|
135
|
-
|
|
136
|
-
## Залежності
|
|
137
|
-
|
|
138
|
-
### Node.js (built-in)
|
|
139
|
-
|
|
140
|
-
- `node:child_process` → `spawnSync` — синхронний запуск `git`, `shellcheck`, `patch`.
|
|
141
|
-
- `node:fs` → `globSync` — пошук `*.sh` поза git-деревом.
|
|
142
|
-
- `node:path` → `resolve` — нормалізація `cwd` у абсолютний шлях.
|
|
143
|
-
|
|
144
|
-
### Внутрішні модулі
|
|
145
|
-
|
|
146
|
-
- `../../../scripts/cli-entry.mjs` → `isRunAsCli(import.meta.url)` — перевіряє, чи модуль запущено напряму як CLI (а не імпортовано).
|
|
147
|
-
- `../../../scripts/utils/resolve-cmd.mjs` → `resolveCmd(name)` — повертає абсолютний шлях до бінарника з PATH або `null`.
|
|
148
|
-
|
|
149
|
-
### Зовнішні бінарники (runtime)
|
|
150
|
-
|
|
151
|
-
- **shellcheck** — обов'язковий; без нього `runShellcheckText` повертає 1.
|
|
152
|
-
- **patch** — обов'язковий для авто-фіксів; без нього `runShellcheckText` повертає 1.
|
|
153
|
-
- **git** — необов'язковий: якщо доступний і ми у робочому дереві — використовується `git ls-files`; інакше — `globSync`.
|
|
154
|
-
|
|
155
|
-
## Потік виконання / Використання
|
|
156
|
-
|
|
157
|
-
### CLI
|
|
158
|
-
|
|
159
|
-
Скрипт можна запустити напряму:
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
node npm/rules/text/lint/run-shellcheck.mjs
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
Логіка CLI-входу:
|
|
166
|
-
|
|
167
|
-
```js
|
|
168
|
-
if (isRunAsCli(import.meta.url)) {
|
|
169
|
-
process.exitCode = runShellcheckText()
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
`process.exitCode` встановлюється у значення, повернуте `runShellcheckText()` (0 або 1).
|
|
174
|
-
|
|
175
|
-
### Програмний виклик
|
|
176
|
-
|
|
177
|
-
```js
|
|
178
|
-
import { runShellcheckText, listShellScriptPaths } from './run-shellcheck.mjs'
|
|
179
|
-
|
|
180
|
-
// Повний прогон у поточному каталозі:
|
|
181
|
-
const code = runShellcheckText()
|
|
182
|
-
|
|
183
|
-
// Тільки список *.sh файлів:
|
|
184
|
-
const files = listShellScriptPaths(process.cwd())
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Високорівнева послідовність кроків `runShellcheckText`
|
|
188
|
-
|
|
189
|
-
1. `resolve(cwd)` → абсолютний `root`.
|
|
190
|
-
2. `resolveCmd('shellcheck')` → перевірка наявності бінарника. **Fail-fast**: підказка + `return 1`.
|
|
191
|
-
3. `resolveCmd('patch')` → перевірка наявності бінарника. **Fail-fast**: підказка + `return 1`.
|
|
192
|
-
4. `listShellScriptPaths(root)`:
|
|
193
|
-
- `git` доступний і ми в робочому дереві → `git ls-files -z -- ':(glob)**/*.sh'` (NUL-роздільник, унікальні, відсортовані).
|
|
194
|
-
- Інакше → `globSync('**/*.sh', { exclude: ... })` з виключенням `node_modules` (forward-slashes).
|
|
195
|
-
5. Якщо файлів немає → `return 0` (no-op).
|
|
196
|
-
6. Для кожного файла → `autofixOneFile(...)`:
|
|
197
|
-
- Цикл до 32 разів: `shellcheck -f diff <rel>` → `patch -p1` (через stdin).
|
|
198
|
-
- Виходить раніше, якщо `status === 0`, `none were auto-fixable`, або порожній diff.
|
|
199
|
-
7. `runFinalShellcheck(shellcheck, files, root)`:
|
|
200
|
-
- `shellcheck <files...>` без формату diff.
|
|
201
|
-
- Будь-який ненульовий статус → друк stdout/stderr у консоль і `return 1`.
|
|
202
|
-
|
|
203
|
-
### Коди виходу
|
|
204
|
-
|
|
205
|
-
| Код | Причина |
|
|
206
|
-
| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
207
|
-
| `0` | Немає `*.sh` файлів, або всі пройшли фінальний `shellcheck` чисто (можливо, після авто-фіксів). |
|
|
208
|
-
| `1` | Немає `shellcheck`/`patch` у PATH; помилка `spawnSync` (наприклад, `ENOENT`); `patch` не застосував diff; фінальний `shellcheck` повернув ненульовий статус. |
|
|
209
|
-
|
|
210
|
-
### Ефекти на файлову систему
|
|
211
|
-
|
|
212
|
-
Авто-фікси **модифікують сам source `.sh`-файл** через `patch -p1`. Запуск передбачає, що користувач готовий побачити змінений вміст (наприклад, виконує перевірку перед коммітом у CI або локально).
|
|
213
|
-
|
|
214
|
-
### Контекст застосування
|
|
215
|
-
|
|
216
|
-
Модуль використовується у складі `lint-text` ланцюжка (правила `npm/rules/text/lint/`) для перевірки текстової частини проєкту, де shell-скрипти підлягають аналізу ShellCheck. Це частина набору `rules/text/lint/*`, описаного у `n-text.mdc` і `n-js-lint.mdc`.
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: run-v8r.mjs
|
|
4
|
-
resource: npm/rules/text/lint/run-v8r.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: caf707a8
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Модуль `run-v8r.mjs` — це послідовний раннер CLI-валідатора схем `v8r` для всіх типів файлів, які він підтримує (`.json`, `.json5`, `.yml`, `.yaml`, `.toml`). Він є проміжним рівнем між кореневою командою `lint-text` та `bunx v8r`.
|
|
10
|
-
|
|
11
|
-
Призначення модуля — обійти специфічну ваду `v8r`: якщо у єдиний виклик передати кілька glob-патернів і хоча б один із них не знаходить жодного файлу, процес `v8r` падає з кодом виходу `98`, тому решта розширень узагалі не перевіряється. Щоб уникнути цього, скрипт виконує **окремий** `bunx v8r` на **кожен** glob і толерантно ставиться до коду `98` (порожнє співпадіння — не помилка).
|
|
12
|
-
|
|
13
|
-
Додатково модуль автоматично підставляє у виклик `v8r` параметр `-c <шлях до v8r-catalog.json>` — каталог схем пакета `@nitra/cursor`, який лежить у `npm/schemas/v8r-catalog.json` від кореня репозиторію. Завдяки цьому користувачі цього раннера не зобовʼязані пам’ятати про каталог схем.
|
|
14
|
-
|
|
15
|
-
Поведінка щодо виводу:
|
|
16
|
-
|
|
17
|
-
- Якщо v8r для конкретного glob завершився з кодом `0` (успіх) або `98` (порожнє співпадіння) — вивід **не друкується**, обхід продовжується.
|
|
18
|
-
- Якщо v8r повернув будь-який інший код — `stdout` і `stderr` друкуються «як є», а сам раннер повертає той самий код виходу і **припиняє** подальший обхід glob-патернів.
|
|
19
|
-
|
|
20
|
-
Файл одночасно є модулем (експортує API) і CLI-точкою входу: під час прямого запуску він читає glob-и з `process.argv` (починаючи з 3-го елемента) і виставляє `process.exitCode`.
|
|
21
|
-
|
|
22
|
-
## Експорти / API
|
|
23
|
-
|
|
24
|
-
Модуль експортує дві іменовані сутності:
|
|
25
|
-
|
|
26
|
-
| Імʼя | Тип | Призначення |
|
|
27
|
-
| ------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
28
|
-
| `DEFAULT_V8R_GLOBS` | `string[]` | Список glob-патернів за замовчуванням для форматів, які підтримує `v8r`. |
|
|
29
|
-
| `V8R_CATALOG_PATH` | `string` | Абсолютний шлях до файлу `v8r-catalog.json` у каталозі `schemas` пакета `@nitra/cursor`. |
|
|
30
|
-
| `runV8rWithGlobs` | `function` | Послідовний запуск `bunx v8r` по списку glob-патернів; повертає числовий код виходу. Не змінює `process.exitCode`. |
|
|
31
|
-
|
|
32
|
-
### `DEFAULT_V8R_GLOBS`
|
|
33
|
-
|
|
34
|
-
Значення:
|
|
35
|
-
|
|
36
|
-
```js
|
|
37
|
-
;['**/*.json', '**/*.json5', '**/*.yml', '**/*.yaml', '**/*.toml']
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Використовується як значення за замовчуванням для `runV8rWithGlobs`, а також як fallback у CLI-режимі, коли користувач не передав власних glob-аргументів.
|
|
41
|
-
|
|
42
|
-
### `V8R_CATALOG_PATH`
|
|
43
|
-
|
|
44
|
-
Обчислюється на момент завантаження модуля з `import.meta.url`:
|
|
45
|
-
|
|
46
|
-
```js
|
|
47
|
-
join(dirname(fileURLToPath(import.meta.url)), '../../../schemas/v8r-catalog.json')
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
З урахуванням розташування самого модуля (`npm/rules/text/lint/run-v8r.mjs`) три рівні `..` піднімають шлях до `npm/`, після чого додається `schemas/v8r-catalog.json`. Результат — абсолютний шлях, який не залежить від поточної робочої директорії процесу.
|
|
51
|
-
|
|
52
|
-
### `runV8rWithGlobs(globs?)`
|
|
53
|
-
|
|
54
|
-
Див. секцію [«Функції»](#функції).
|
|
55
|
-
|
|
56
|
-
## Функції
|
|
57
|
-
|
|
58
|
-
### `runV8rWithGlobs(globs = DEFAULT_V8R_GLOBS)`
|
|
59
|
-
|
|
60
|
-
Сигнатура:
|
|
61
|
-
|
|
62
|
-
```js
|
|
63
|
-
/**
|
|
64
|
-
* @param {string[]} [globs] патерни; за замовчуванням DEFAULT_V8R_GLOBS
|
|
65
|
-
* @returns {number} 0 — OK, 1 — помилка spawn, 2 — немає каталогу схем, інше — код v8r
|
|
66
|
-
*/
|
|
67
|
-
export function runV8rWithGlobs(globs = DEFAULT_V8R_GLOBS)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
#### Параметри
|
|
71
|
-
|
|
72
|
-
- `globs` (`string[]`, опційно) — масив glob-патернів, які буде передано в `v8r` по черзі (по одному на виклик). За замовчуванням — `DEFAULT_V8R_GLOBS`.
|
|
73
|
-
|
|
74
|
-
#### Повертає
|
|
75
|
-
|
|
76
|
-
Числовий код виходу, який повинен стати `process.exitCode` у CLI-режимі:
|
|
77
|
-
|
|
78
|
-
- `0` — усі glob-и оброблено успішно (або вони порожні);
|
|
79
|
-
- `1` — `spawnSync` повернув `result.error` (наприклад, не вдалося запустити процес);
|
|
80
|
-
- `2` — не знайдено файл `V8R_CATALOG_PATH` (відсутній каталог схем `npm/schemas/v8r-catalog.json`);
|
|
81
|
-
- будь-яке інше число — реальний код виходу від `v8r` для першого glob-а, який не дав `0` або `98`.
|
|
82
|
-
|
|
83
|
-
#### Side effects
|
|
84
|
-
|
|
85
|
-
- Може писати в `process.stderr` повідомлення про відсутній каталог схем (код `2`) або текст помилки `spawnSync.error.message` (код `1`).
|
|
86
|
-
- Для невдалого `v8r` (код, відмінний від `0`/`98`) друкує його `stdout` і `stderr` без змін.
|
|
87
|
-
- **Не** мутує `process.exitCode` і **не** викликає `process.exit`. Цією операцією займається CLI-блок наприкінці файла.
|
|
88
|
-
- Виконує синхронний `spawnSync` (`bun x v8r ...`) — блокуючий виклик на кожен glob.
|
|
89
|
-
|
|
90
|
-
#### Алгоритм
|
|
91
|
-
|
|
92
|
-
1. Перевіряє існування `V8R_CATALOG_PATH` через `existsSync`. Якщо файла немає — пише повідомлення в `stderr` і повертає `2`.
|
|
93
|
-
2. Перебирає `globs` у тому ж порядку, у якому вони передані:
|
|
94
|
-
1. Резолвить `bun` через `resolveCmd('bun')`; якщо `bun` не знайдено в `PATH`, використовує `process.execPath` як fallback (тобто запустить поточний інтерпретатор, що збігається з шляхом до `node`/`bun`-runtime, який запустив скрипт).
|
|
95
|
-
2. Викликає `spawnSync(bunPath, ['x', 'v8r', pattern, '-c', V8R_CATALOG_PATH], { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024, shell: false, stdio: ['ignore', 'pipe', 'pipe'] })`.
|
|
96
|
-
3. Якщо `result.error` — пише `result.error.message` у `stderr` і повертає `1`.
|
|
97
|
-
4. Бере `result.status ?? 1` (якщо процес був вбитий сигналом, `status === null`, тоді трактує це як `1`).
|
|
98
|
-
5. Якщо код **не** `0` і **не** `98` — друкує накопичений `stdout`/`stderr` (якщо вони непорожні) і повертає цей код, **зупиняючи** подальший обхід.
|
|
99
|
-
3. Якщо всі glob-и пройшли — повертає `0`.
|
|
100
|
-
|
|
101
|
-
### CLI-блок (нижній рівень файла)
|
|
102
|
-
|
|
103
|
-
Сигнатура (не функція, а side-effect блок):
|
|
104
|
-
|
|
105
|
-
```js
|
|
106
|
-
if (isRunAsCli(import.meta.url)) {
|
|
107
|
-
const globs = process.argv.length > 2 ? process.argv.slice(2) : DEFAULT_V8R_GLOBS
|
|
108
|
-
process.exitCode = runV8rWithGlobs(globs)
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
#### Поведінка
|
|
113
|
-
|
|
114
|
-
- `isRunAsCli(import.meta.url)` повертає `true`, коли модуль викликано як точку входу (а не імпортовано).
|
|
115
|
-
- Якщо передано хоча б один аргумент після назви скрипта (`process.argv.length > 2`) — усі аргументи (зрізані з індексу 2) використовуються як glob-патерни.
|
|
116
|
-
- Інакше — `DEFAULT_V8R_GLOBS`.
|
|
117
|
-
- Результат `runV8rWithGlobs(...)` записується у `process.exitCode`, що дозволяє завершити процес із потрібним кодом без переривання поточного call-stack.
|
|
118
|
-
|
|
119
|
-
## Залежності
|
|
120
|
-
|
|
121
|
-
### Внутрішні (Node.js core)
|
|
122
|
-
|
|
123
|
-
- `node:child_process` → `spawnSync` — синхронний запуск зовнішнього процесу `bun x v8r ...`.
|
|
124
|
-
- `node:fs` → `existsSync` — перевірка наявності файлу каталогу схем.
|
|
125
|
-
- `node:path` → `dirname`, `join` — побудова шляху до `v8r-catalog.json`.
|
|
126
|
-
- `node:url` → `fileURLToPath` — конвертація `import.meta.url` в абсолютний файловий шлях.
|
|
127
|
-
|
|
128
|
-
### Внутрішні (`@nitra/cursor`)
|
|
129
|
-
|
|
130
|
-
- `../../../scripts/cli-entry.mjs` → `isRunAsCli(metaUrl)` — детектор «запущено як CLI чи імпортовано як модуль».
|
|
131
|
-
- `../../../scripts/utils/resolve-cmd.mjs` → `resolveCmd(name)` — пошук абсолютного шляху до бінарника за `PATH`-у (з повним fallback-резолвером, на відміну від простого `which`).
|
|
132
|
-
|
|
133
|
-
### Зовнішні (через `bunx`)
|
|
134
|
-
|
|
135
|
-
- `v8r` — CLI-валідатор JSON/YAML/TOML за каталогом JSON-схем. Запускається через `bun x v8r ...`.
|
|
136
|
-
- `bun` — runtime, через який запускається `v8r`. Якщо `bun` відсутній у `PATH`, використовується `process.execPath`.
|
|
137
|
-
|
|
138
|
-
### Конфігурація / артефакти
|
|
139
|
-
|
|
140
|
-
- `npm/schemas/v8r-catalog.json` (в межах пакета `@nitra/cursor`) — обовʼязковий файл-каталог відповідностей `glob → schemaURL`. Без нього раннер повертає код `2`.
|
|
141
|
-
|
|
142
|
-
## Потік виконання / Використання
|
|
143
|
-
|
|
144
|
-
### Як частина команди `lint-text`
|
|
145
|
-
|
|
146
|
-
Раннер призначений для виклику з правила `n-cursor lint text`. Замість того, щоб запускати `v8r` чотирма (або п’ятьма) окремими командами в `package.json`, використовується один виклик цього модуля, який сам обходить усі типові glob-и:
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
node ./npm/rules/text/lint/run-v8r.mjs
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Це еквівалентно послідовним викликам:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
bunx v8r '**/*.json' -c npm/schemas/v8r-catalog.json
|
|
156
|
-
bunx v8r '**/*.json5' -c npm/schemas/v8r-catalog.json
|
|
157
|
-
bunx v8r '**/*.yml' -c npm/schemas/v8r-catalog.json
|
|
158
|
-
bunx v8r '**/*.yaml' -c npm/schemas/v8r-catalog.json
|
|
159
|
-
bunx v8r '**/*.toml' -c npm/schemas/v8r-catalog.json
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
але без падіння на коді `98`, коли якесь розширення не зустрічається в проєкті.
|
|
163
|
-
|
|
164
|
-
### Запуск з кастомними glob-ами
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
node ./npm/rules/text/lint/run-v8r.mjs '**/*.json' 'configs/*.yaml'
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
У цьому режимі `DEFAULT_V8R_GLOBS` ігноруються, обходяться лише передані патерни.
|
|
171
|
-
|
|
172
|
-
### Імпорт як модуль
|
|
173
|
-
|
|
174
|
-
```js
|
|
175
|
-
import { runV8rWithGlobs, DEFAULT_V8R_GLOBS, V8R_CATALOG_PATH } from './run-v8r.mjs'
|
|
176
|
-
|
|
177
|
-
const code = runV8rWithGlobs(['**/*.json'])
|
|
178
|
-
if (code !== 0) {
|
|
179
|
-
// обробити збій валідації
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
Корисно з тестів і інших скриптів, які мають потребу перевалідовувати лише підмножину файлів.
|
|
184
|
-
|
|
185
|
-
### Семантика кодів виходу
|
|
186
|
-
|
|
187
|
-
| Код | Значення |
|
|
188
|
-
| ---- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
189
|
-
| `0` | Усі glob-и пройшли (валідно або порожньо). |
|
|
190
|
-
| `1` | Внутрішня помилка запуску процесу (`spawnSync.error`); зокрема, якщо ані `bun`, ані `process.execPath` не змогли стартувати. |
|
|
191
|
-
| `2` | Не знайдено каталог схем `npm/schemas/v8r-catalog.json` у пакеті `@nitra/cursor`. |
|
|
192
|
-
| `98` | **Не повертається**: внутрішньо трактується як «успіх для цього glob» і обхід триває далі. |
|
|
193
|
-
| інше | Дослівний код виходу від `v8r` для першого glob, на якому валідація провалилася. |
|
|
194
|
-
|
|
195
|
-
### Особливості реалізації, на які варто звернути увагу
|
|
196
|
-
|
|
197
|
-
- `shell: false` запобігає інтерполяції glob-патернів shell-ом — їх обробляє безпосередньо `v8r`.
|
|
198
|
-
- `maxBuffer: 50 * 1024 * 1024` (50 MiB) — захист від обрізання довгого виводу `v8r` на великих репозиторіях.
|
|
199
|
-
- `stdio: ['ignore', 'pipe', 'pipe']` — `stdin` процесу не використовується; вивід буферизується й друкується лише при помилці.
|
|
200
|
-
- Обхід «лінивий» по помилкам: на першому невдалому glob цикл завершується. Це навмисно — повертати треба перший реальний код помилки, а решта валідації не має сенсу до її усунення.
|
|
201
|
-
- Раннер **не** мутує `process.exitCode` усередині `runV8rWithGlobs`, тому імпортери можуть безпечно викликати функцію кілька разів і самостійно вирішувати, що з кодом робити.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
package/rules/vue/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
package/rules/worktree/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|