@7n/rules 1.0.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/hooks/capture-decisions.sh +355 -0
- package/.claude-template/hooks/lib/tooling-only.sh +77 -0
- package/.claude-template/hooks/normalize-decisions.sh +574 -0
- package/.claude-template/settings.template.json +26 -0
- package/.pi-template/extensions/n-rules-adr/docs/index.md +28 -0
- package/.pi-template/extensions/n-rules-adr/index.ts +105 -0
- package/.pi-template/extensions/n-rules-adr/tsconfig.json +17 -0
- package/AGENTS.template.md +53 -0
- package/CHANGELOG.md +4277 -0
- package/README.md +189 -0
- package/bin/docs/n-rules.md +612 -0
- package/bin/docs/rename-yaml-extensions.md +207 -0
- package/bin/n-rules.js +1709 -0
- package/bin/rename-yaml-extensions.mjs +42 -0
- package/docs/index.md +12 -0
- package/docs/stryker.config.md +31 -0
- package/docs/vitest.config.md +36 -0
- package/github-actions/release/action.yml +9 -0
- package/github-actions/setup-bun-deps/action.yml +27 -0
- package/package.json +87 -0
- package/rules/abie/base_deployment_preem/base_deployment_preem.mdc +22 -0
- package/rules/abie/base_deployment_preem/base_deployment_preem.rego +54 -0
- package/rules/abie/base_deployment_preem/concern.json +8 -0
- package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
- package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.rego +81 -0
- package/rules/abie/clean_merged_ignore_branches/concern.json +8 -0
- package/rules/abie/clean_merged_ignore_branches/template/clean-merged-branch.yml.snippet.yml +9 -0
- package/rules/abie/docs/index.md +11 -0
- package/rules/abie/env_dns/concern.json +4 -0
- package/rules/abie/env_dns/docs/main.md +32 -0
- package/rules/abie/env_dns/env_dns.mdc +33 -0
- package/rules/abie/env_dns/main.mjs +47 -0
- package/rules/abie/firebase_hosting/concern.json +4 -0
- package/rules/abie/firebase_hosting/docs/main.md +41 -0
- package/rules/abie/firebase_hosting/firebase_hosting.mdc +3 -0
- package/rules/abie/firebase_hosting/main.mjs +46 -0
- package/rules/abie/hc_pairing/concern.json +4 -0
- package/rules/abie/hc_pairing/docs/main.md +34 -0
- package/rules/abie/hc_pairing/hc_pairing.mdc +23 -0
- package/rules/abie/hc_pairing/main.mjs +52 -0
- package/rules/abie/health_check_policy/concern.json +8 -0
- package/rules/abie/health_check_policy/health_check_policy.mdc +19 -0
- package/rules/abie/health_check_policy/health_check_policy.rego +172 -0
- package/rules/abie/http_route_base/concern.json +8 -0
- package/rules/abie/http_route_base/http_route_base.mdc +9 -0
- package/rules/abie/http_route_base/http_route_base.rego +45 -0
- package/rules/abie/lib/docs/enabled.md +38 -0
- package/rules/abie/lib/docs/env-dns.md +31 -0
- package/rules/abie/lib/docs/hc-yaml.md +33 -0
- package/rules/abie/lib/docs/http-route.md +31 -0
- package/rules/abie/lib/docs/index.md +18 -0
- package/rules/abie/lib/docs/k8s-tree.md +44 -0
- package/rules/abie/lib/docs/kustomization-patches.md +37 -0
- package/rules/abie/lib/docs/overlay-paths.md +42 -0
- package/rules/abie/lib/docs/yaml.md +33 -0
- package/rules/abie/lib/enabled.mjs +37 -0
- package/rules/abie/lib/env-dns.mjs +81 -0
- package/rules/abie/lib/hc-yaml.mjs +27 -0
- package/rules/abie/lib/http-route.mjs +100 -0
- package/rules/abie/lib/k8s-tree.mjs +110 -0
- package/rules/abie/lib/kustomization-patches.mjs +211 -0
- package/rules/abie/lib/overlay-paths.mjs +97 -0
- package/rules/abie/lib/yaml.mjs +72 -0
- package/rules/abie/main.json +1 -0
- package/rules/abie/main.mdc +47 -0
- package/rules/abie/package_json_shared/concern.json +11 -0
- package/rules/abie/package_json_shared/package_json_shared.mdc +17 -0
- package/rules/abie/package_json_shared/package_json_shared.rego +16 -0
- package/rules/abie/ua_http_route/concern.json +4 -0
- package/rules/abie/ua_http_route/docs/main.md +44 -0
- package/rules/abie/ua_http_route/main.mjs +80 -0
- package/rules/abie/ua_http_route/ua_http_route.mdc +47 -0
- package/rules/abie/ua_node_selector/concern.json +4 -0
- package/rules/abie/ua_node_selector/docs/main.md +34 -0
- package/rules/abie/ua_node_selector/main.mjs +62 -0
- package/rules/abie/ua_node_selector/ua_node_selector.mdc +27 -0
- package/rules/adr/docs/index.md +11 -0
- package/rules/adr/hooks/concern.json +4 -0
- package/rules/adr/hooks/docs/main.md +38 -0
- package/rules/adr/hooks/hooks.mdc +32 -0
- package/rules/adr/hooks/main.mjs +367 -0
- package/rules/adr/main.json +1 -0
- package/rules/adr/main.mdc +93 -0
- package/rules/adr/settings_json/concern.json +9 -0
- package/rules/adr/settings_json/settings_json.mdc +7 -0
- package/rules/adr/settings_json/settings_json.rego +37 -0
- package/rules/adr/settings_local_json/concern.json +9 -0
- package/rules/adr/settings_local_json/settings_local_json.mdc +7 -0
- package/rules/adr/settings_local_json/settings_local_json.rego +40 -0
- package/rules/bun/bunfig/bunfig.mdc +12 -0
- package/rules/bun/bunfig/bunfig.rego +29 -0
- package/rules/bun/bunfig/concern.json +9 -0
- package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +2 -0
- package/rules/bun/docs/index.md +11 -0
- package/rules/bun/layout/concern.json +16 -0
- package/rules/bun/layout/docs/fix-layout.md +29 -0
- package/rules/bun/layout/docs/main.md +34 -0
- package/rules/bun/layout/fix-layout.mjs +63 -0
- package/rules/bun/layout/layout.mdc +60 -0
- package/rules/bun/layout/main.mjs +53 -0
- package/rules/bun/licensee/concern.json +7 -0
- package/rules/bun/licensee/docs/fix-licensee.md +28 -0
- package/rules/bun/licensee/docs/index.md +12 -0
- package/rules/bun/licensee/docs/main.md +37 -0
- package/rules/bun/licensee/fix-licensee.mjs +32 -0
- package/rules/bun/licensee/main.mjs +44 -0
- package/rules/bun/main.json +1 -0
- package/rules/bun/main.mdc +11 -0
- package/rules/bun/package_json/concern.json +9 -0
- package/rules/bun/package_json/docs/fix-package_json.md +28 -0
- package/rules/bun/package_json/docs/index.md +9 -0
- package/rules/bun/package_json/fix-package_json.mjs +311 -0
- package/rules/bun/package_json/package_json.mdc +14 -0
- package/rules/bun/package_json/package_json.rego +64 -0
- package/rules/bun/package_json/template/package.json.deny.json +4 -0
- package/rules/capacitor/docs/index.md +11 -0
- package/rules/capacitor/main.json +1 -0
- package/rules/capacitor/main.mdc +12 -0
- package/rules/capacitor/package_json/concern.json +9 -0
- package/rules/capacitor/package_json/package_json.mdc +9 -0
- package/rules/capacitor/package_json/package_json.rego +45 -0
- package/rules/capacitor/platforms/concern.json +4 -0
- package/rules/capacitor/platforms/docs/main.md +41 -0
- package/rules/capacitor/platforms/main.mjs +486 -0
- package/rules/changelog/consistency/concern.json +4 -0
- package/rules/changelog/consistency/docs/fix-consistency.md +31 -0
- package/rules/changelog/consistency/docs/main.md +41 -0
- package/rules/changelog/consistency/fix-consistency.mjs +71 -0
- package/rules/changelog/consistency/main.mjs +820 -0
- package/rules/changelog/docs/index.md +11 -0
- package/rules/changelog/lib/docs/index.md +11 -0
- package/rules/changelog/lib/docs/package-manifest.md +214 -0
- package/rules/changelog/lib/package-manifest.mjs +158 -0
- package/rules/changelog/main.json +1 -0
- package/rules/changelog/main.mdc +7 -0
- package/rules/changelog/presence/concern.json +7 -0
- package/rules/changelog/presence/docs/main.md +44 -0
- package/rules/changelog/presence/main.mjs +87 -0
- package/rules/ci4/docs/index.md +11 -0
- package/rules/ci4/main.json +1 -0
- package/rules/ci4/main.mdc +375 -0
- package/rules/ci4/marksman_config/concern.json +5 -0
- package/rules/ci4/marksman_config/data/marksman_config/marksman.baseline.toml +27 -0
- package/rules/ci4/marksman_config/docs/fix-marksman_config.md +27 -0
- package/rules/ci4/marksman_config/docs/main.md +30 -0
- package/rules/ci4/marksman_config/fix-marksman_config.mjs +24 -0
- package/rules/ci4/marksman_config/main.mjs +38 -0
- package/rules/ci4/marksman_config/marksman_config.mdc +31 -0
- package/rules/ci4/vscode_extensions/concern.json +9 -0
- package/rules/ci4/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/ci4/vscode_extensions/docs/index.md +11 -0
- package/rules/ci4/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/ci4/vscode_extensions/template/extensions.json.snippet.json +3 -0
- package/rules/ci4/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/ci4/vscode_extensions/vscode_extensions.rego +12 -0
- package/rules/doc-files/check/concern.json +7 -0
- package/rules/doc-files/check/docs/fix-check.md +28 -0
- package/rules/doc-files/check/docs/fix-worker.md +28 -0
- package/rules/doc-files/check/docs/main.md +32 -0
- package/rules/doc-files/check/fix-check.mjs +45 -0
- package/rules/doc-files/check/fix-worker.mjs +56 -0
- package/rules/doc-files/check/main.mjs +99 -0
- package/rules/doc-files/docgen-crc/concern.json +3 -0
- package/rules/doc-files/docgen-crc/docs/main.md +46 -0
- package/rules/doc-files/docgen-crc/main.mjs +207 -0
- package/rules/doc-files/docgen-extract/concern.json +3 -0
- package/rules/doc-files/docgen-extract/docs/main.md +38 -0
- package/rules/doc-files/docgen-extract/main.mjs +471 -0
- package/rules/doc-files/docgen-extract-anchors/concern.json +3 -0
- package/rules/doc-files/docgen-extract-anchors/docs/main.md +49 -0
- package/rules/doc-files/docgen-extract-anchors/main.mjs +115 -0
- package/rules/doc-files/docgen-files-batch/concern.json +3 -0
- package/rules/doc-files/docgen-files-batch/docs/main.md +38 -0
- package/rules/doc-files/docgen-files-batch/main.mjs +517 -0
- package/rules/doc-files/docgen-fix-worker/concern.json +3 -0
- package/rules/doc-files/docgen-gen/concern.json +3 -0
- package/rules/doc-files/docgen-gen/docs/main.md +40 -0
- package/rules/doc-files/docgen-gen/main.mjs +582 -0
- package/rules/doc-files/docgen-ignore/concern.json +3 -0
- package/rules/doc-files/docgen-ignore/docs/main.md +33 -0
- package/rules/doc-files/docgen-ignore/main.mjs +54 -0
- package/rules/doc-files/docgen-judge/concern.json +3 -0
- package/rules/doc-files/docgen-judge/docs/main.md +43 -0
- package/rules/doc-files/docgen-judge/main.mjs +116 -0
- package/rules/doc-files/docgen-prompts/concern.json +3 -0
- package/rules/doc-files/docgen-prompts/docs/main.md +48 -0
- package/rules/doc-files/docgen-prompts/main.mjs +222 -0
- package/rules/doc-files/docgen-scan/concern.json +3 -0
- package/rules/doc-files/docgen-scan/docs/main.md +52 -0
- package/rules/doc-files/docgen-scan/main.mjs +231 -0
- package/rules/doc-files/docs/index.md +11 -0
- package/rules/doc-files/main.json +1 -0
- package/rules/doc-files/main.mdc +49 -0
- package/rules/doc-files/units/concern.json +3 -0
- package/rules/doc-files/units/docs/main.md +32 -0
- package/rules/doc-files/units/main.mjs +20 -0
- package/rules/doc-files/units-js/concern.json +3 -0
- package/rules/doc-files/units-js/docs/main.md +32 -0
- package/rules/doc-files/units-js/main.mjs +141 -0
- package/rules/doc-files/units-rs/concern.json +3 -0
- package/rules/doc-files/units-rs/docs/main.md +36 -0
- package/rules/doc-files/units-rs/main.mjs +311 -0
- package/rules/docker/docs/index.md +11 -0
- package/rules/docker/lib/docker-hadolint.mjs +60 -0
- package/rules/docker/lib/docker-mirror.mjs +148 -0
- package/rules/docker/lib/docker-native-addon.mjs +93 -0
- package/rules/docker/lib/docker-nginx-user.mjs +122 -0
- package/rules/docker/lib/docs/docker-hadolint.md +29 -0
- package/rules/docker/lib/docs/docker-mirror.md +251 -0
- package/rules/docker/lib/docs/docker-native-addon.md +174 -0
- package/rules/docker/lib/docs/docker-nginx-user.md +223 -0
- package/rules/docker/lib/docs/index.md +14 -0
- package/rules/docker/lint/concern.json +7 -0
- package/rules/docker/lint/docs/main.md +47 -0
- package/rules/docker/lint/main.mjs +360 -0
- package/rules/docker/lint_docker_yml/concern.json +9 -0
- package/rules/docker/lint_docker_yml/lint_docker_yml.mdc +14 -0
- package/rules/docker/lint_docker_yml/lint_docker_yml.rego +79 -0
- package/rules/docker/lint_docker_yml/template/lint-docker.yml.snippet.yml +41 -0
- package/rules/docker/main.json +1 -0
- package/rules/docker/main.mdc +14 -0
- package/rules/efes/docs/index.md +11 -0
- package/rules/efes/main.json +1 -0
- package/rules/efes/main.mdc +21 -0
- package/rules/efes/package_json_shared/concern.json +11 -0
- package/rules/efes/package_json_shared/package_json_shared.mdc +33 -0
- package/rules/efes/package_json_shared/package_json_shared.rego +16 -0
- package/rules/feedback/docs/index.md +11 -0
- package/rules/feedback/main.json +1 -0
- package/rules/feedback/main.mdc +63 -0
- package/rules/ga/clean_ga_workflows/clean_ga_workflows.mdc +20 -0
- package/rules/ga/clean_ga_workflows/clean_ga_workflows.rego +112 -0
- package/rules/ga/clean_ga_workflows/concern.json +10 -0
- package/rules/ga/clean_ga_workflows/template/clean-ga-workflows.yml.snippet.yml +26 -0
- package/rules/ga/clean_merged_branch/clean_merged_branch.mdc +24 -0
- package/rules/ga/clean_merged_branch/clean_merged_branch.rego +163 -0
- package/rules/ga/clean_merged_branch/concern.json +10 -0
- package/rules/ga/clean_merged_branch/template/clean-merged-branch.yml.snippet.yml +37 -0
- package/rules/ga/docs/index.md +11 -0
- package/rules/ga/git_ai/concern.json +11 -0
- package/rules/ga/git_ai/git_ai.mdc +19 -0
- package/rules/ga/git_ai/git_ai.rego +76 -0
- package/rules/ga/git_ai/template/git-ai.yml.snippet.yml +30 -0
- package/rules/ga/lint_ga/concern.json +10 -0
- package/rules/ga/lint_ga/lint_ga.mdc +21 -0
- package/rules/ga/lint_ga/lint_ga.rego +132 -0
- package/rules/ga/lint_ga/template/lint-ga.yml.snippet.yml +41 -0
- package/rules/ga/main.json +1 -0
- package/rules/ga/main.mdc +17 -0
- package/rules/ga/vscode_extensions/concern.json +11 -0
- package/rules/ga/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/ga/vscode_extensions/docs/index.md +11 -0
- package/rules/ga/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/ga/vscode_extensions/template/extensions.json.snippet.json +1 -0
- package/rules/ga/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/ga/vscode_extensions/vscode_extensions.rego +18 -0
- package/rules/ga/vscode_settings/concern.json +11 -0
- package/rules/ga/vscode_settings/template/settings.json.snippet.json +1 -0
- package/rules/ga/vscode_settings/vscode_settings.mdc +9 -0
- package/rules/ga/vscode_settings/vscode_settings.rego +22 -0
- package/rules/ga/workflow_common/concern.json +9 -0
- package/rules/ga/workflow_common/template/uses-min-versions.snippet.json +4 -0
- package/rules/ga/workflow_common/workflow_common.mdc +18 -0
- package/rules/ga/workflow_common/workflow_common.rego +288 -0
- package/rules/ga/workflows/concern.json +8 -0
- package/rules/ga/workflows/docs/fix-workflows.md +37 -0
- package/rules/ga/workflows/docs/main.md +38 -0
- package/rules/ga/workflows/fix-workflows.mjs +212 -0
- package/rules/ga/workflows/main.mjs +433 -0
- package/rules/ga/workflows/workflows.mdc +33 -0
- package/rules/ga/zizmor_yml/concern.json +11 -0
- package/rules/ga/zizmor_yml/template/zizmor.yml.snippet.yml +5 -0
- package/rules/ga/zizmor_yml/zizmor_yml.mdc +9 -0
- package/rules/ga/zizmor_yml/zizmor_yml.rego +27 -0
- package/rules/graphql/docs/index.md +11 -0
- package/rules/graphql/lib/docs/graphql-gql-scan.md +226 -0
- package/rules/graphql/lib/docs/index.md +11 -0
- package/rules/graphql/lib/graphql-gql-scan.mjs +146 -0
- package/rules/graphql/main.json +1 -0
- package/rules/graphql/main.mdc +8 -0
- package/rules/graphql/tooling/concern.json +8 -0
- package/rules/graphql/tooling/docs/main.md +36 -0
- package/rules/graphql/tooling/main.mjs +129 -0
- package/rules/graphql/tooling/tooling.mdc +13 -0
- package/rules/graphql/vscode_extensions/concern.json +9 -0
- package/rules/graphql/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
- package/rules/graphql/vscode_extensions/docs/index.md +11 -0
- package/rules/graphql/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/graphql/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/graphql/vscode_extensions/vscode_extensions.rego +20 -0
- package/rules/hasura/docs/index.md +11 -0
- package/rules/hasura/internal_urls/concern.json +5 -0
- package/rules/hasura/internal_urls/docs/fix-internal_urls.md +26 -0
- package/rules/hasura/internal_urls/docs/index.md +12 -0
- package/rules/hasura/internal_urls/docs/main.md +36 -0
- package/rules/hasura/internal_urls/fix-internal_urls.mjs +66 -0
- package/rules/hasura/internal_urls/internal_urls.mdc +27 -0
- package/rules/hasura/internal_urls/main.mjs +233 -0
- package/rules/hasura/main.json +1 -0
- package/rules/hasura/main.mdc +8 -0
- package/rules/hasura/migrations/concern.json +4 -0
- package/rules/hasura/migrations/docs/fix-migrations.md +25 -0
- package/rules/hasura/migrations/docs/index.md +12 -0
- package/rules/hasura/migrations/docs/main.md +35 -0
- package/rules/hasura/migrations/fix-migrations.mjs +35 -0
- package/rules/hasura/migrations/main.mjs +53 -0
- package/rules/hasura/migrations/migrations.mdc +13 -0
- package/rules/hasura/svc_hl/concern.json +8 -0
- package/rules/hasura/svc_hl/svc_hl.mdc +15 -0
- package/rules/hasura/svc_hl/svc_hl.rego +50 -0
- package/rules/image-avif/avif_generation/avif_generation.mdc +26 -0
- package/rules/image-avif/avif_generation/concern.json +4 -0
- package/rules/image-avif/avif_generation/docs/fix-avif_generation.md +27 -0
- package/rules/image-avif/avif_generation/docs/main.md +36 -0
- package/rules/image-avif/avif_generation/fix-avif_generation.mjs +80 -0
- package/rules/image-avif/avif_generation/main.mjs +411 -0
- package/rules/image-avif/docs/index.md +11 -0
- package/rules/image-avif/main.json +1 -0
- package/rules/image-avif/main.mdc +8 -0
- package/rules/image-avif/package_json/concern.json +9 -0
- package/rules/image-avif/package_json/package_json.mdc +18 -0
- package/rules/image-avif/package_json/package_json.rego +47 -0
- package/rules/image-avif/package_json/template/package.json.deny.json +5 -0
- package/rules/image-compress/check/concern.json +7 -0
- package/rules/image-compress/check/docs/fix-check.md +34 -0
- package/rules/image-compress/check/docs/index.md +10 -0
- package/rules/image-compress/check/docs/main.md +31 -0
- package/rules/image-compress/check/fix-check.mjs +74 -0
- package/rules/image-compress/check/main.mjs +64 -0
- package/rules/image-compress/docs/index.md +11 -0
- package/rules/image-compress/main.json +1 -0
- package/rules/image-compress/main.mdc +10 -0
- package/rules/image-compress/package_json/concern.json +9 -0
- package/rules/image-compress/package_json/package_json.mdc +13 -0
- package/rules/image-compress/package_json/package_json.rego +21 -0
- package/rules/image-compress/package_json/template/package.json.deny.json +8 -0
- package/rules/image-compress/package_setup/concern.json +4 -0
- package/rules/image-compress/package_setup/docs/main.md +34 -0
- package/rules/image-compress/package_setup/main.mjs +98 -0
- package/rules/image-compress/package_setup/package_setup.mdc +13 -0
- package/rules/js/check/concern.json +19 -0
- package/rules/js/check/docs/eslint-config.md +56 -0
- package/rules/js/check/docs/fix-check.md +31 -0
- package/rules/js/check/docs/index.md +13 -0
- package/rules/js/check/docs/main.md +45 -0
- package/rules/js/check/eslint-config.mjs +262 -0
- package/rules/js/check/fix-check.mjs +39 -0
- package/rules/js/check/main.mjs +312 -0
- package/rules/js/dep-policy/concern.json +4 -0
- package/rules/js/dep-policy/dep-policy.mdc +36 -0
- package/rules/js/dep-policy/docs/main.md +35 -0
- package/rules/js/dep-policy/main.mjs +99 -0
- package/rules/js/docs/index.md +11 -0
- package/rules/js/eslint/concern.json +7 -0
- package/rules/js/eslint/docs/fix-eslint.md +32 -0
- package/rules/js/eslint/docs/main.md +33 -0
- package/rules/js/eslint/fix-eslint.mjs +77 -0
- package/rules/js/eslint/main.mjs +99 -0
- package/rules/js/jscpd_config/concern.json +11 -0
- package/rules/js/jscpd_config/jscpd_config.mdc +14 -0
- package/rules/js/jscpd_config/jscpd_config.rego +44 -0
- package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +7 -0
- package/rules/js/jscpd_duplicates/concern.json +7 -0
- package/rules/js/jscpd_duplicates/docs/main.md +29 -0
- package/rules/js/jscpd_duplicates/main.mjs +70 -0
- package/rules/js/knip/concern.json +6 -0
- package/rules/js/knip/docs/main.md +32 -0
- package/rules/js/knip/main.mjs +68 -0
- package/rules/js/lint-findings/concern.json +3 -0
- package/rules/js/lint-findings/docs/main.md +41 -0
- package/rules/js/lint-findings/main.mjs +125 -0
- package/rules/js/lint_js_yml/concern.json +9 -0
- package/rules/js/lint_js_yml/lint_js_yml.mdc +14 -0
- package/rules/js/lint_js_yml/lint_js_yml.rego +117 -0
- package/rules/js/lint_js_yml/template/lint-js.yml.snippet.yml +40 -0
- package/rules/js/main.json +1 -0
- package/rules/js/main.mdc +19 -0
- package/rules/js/package_json/concern.json +9 -0
- package/rules/js/package_json/package_json.mdc +15 -0
- package/rules/js/package_json/package_json.rego +142 -0
- package/rules/js/package_json/template/package.json.snippet.json +6 -0
- package/rules/js/tooling/concern.json +3 -0
- package/rules/js/tooling/data/tooling/knip-canonical.json +29 -0
- package/rules/js/tooling/data/tooling/oxlint-canonical.json +400 -0
- package/rules/js/tooling/docs/main.md +31 -0
- package/rules/js/tooling/main.mjs +149 -0
- package/rules/js/utils_imports/concern.json +4 -0
- package/rules/js/utils_imports/docs/main.md +50 -0
- package/rules/js/utils_imports/main.mjs +185 -0
- package/rules/js/vscode_extensions/concern.json +11 -0
- package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/js/vscode_extensions/docs/index.md +11 -0
- package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js/vscode_extensions/template/extensions.json.snippet.json +3 -0
- package/rules/js/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/js/vscode_extensions/vscode_extensions.rego +12 -0
- package/rules/js-bun-db/docs/index.md +11 -0
- package/rules/js-bun-db/lib/bun-sql-scan.mjs +1055 -0
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +63 -0
- package/rules/js-bun-db/lib/docs/index.md +11 -0
- package/rules/js-bun-db/main.json +1 -0
- package/rules/js-bun-db/main.mdc +8 -0
- package/rules/js-bun-db/package_json/concern.json +9 -0
- package/rules/js-bun-db/package_json/package_json.mdc +17 -0
- package/rules/js-bun-db/package_json/package_json.rego +15 -0
- package/rules/js-bun-db/package_json/template/package.json.deny.json +6 -0
- package/rules/js-bun-db/safety/concern.json +4 -0
- package/rules/js-bun-db/safety/docs/main.md +34 -0
- package/rules/js-bun-db/safety/main.mjs +430 -0
- package/rules/js-bun-redis/docs/index.md +11 -0
- package/rules/js-bun-redis/imports/concern.json +4 -0
- package/rules/js-bun-redis/imports/docs/main.md +36 -0
- package/rules/js-bun-redis/imports/imports.mdc +47 -0
- package/rules/js-bun-redis/imports/main.mjs +88 -0
- package/rules/js-bun-redis/lib/docs/index.md +11 -0
- package/rules/js-bun-redis/lib/docs/redis-imports.md +227 -0
- package/rules/js-bun-redis/lib/redis-imports.mjs +130 -0
- package/rules/js-bun-redis/main.json +1 -0
- package/rules/js-bun-redis/main.mdc +8 -0
- package/rules/js-bun-redis/package_json/concern.json +9 -0
- package/rules/js-bun-redis/package_json/package_json.mdc +11 -0
- package/rules/js-bun-redis/package_json/package_json.rego +15 -0
- package/rules/js-bun-redis/package_json/template/package.json.deny.json +12 -0
- package/rules/js-mssql/deps/concern.json +4 -0
- package/rules/js-mssql/deps/docs/main.md +33 -0
- package/rules/js-mssql/deps/main.mjs +297 -0
- package/rules/js-mssql/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +380 -0
- package/rules/js-mssql/lib/mssql-pool-scan.mjs +610 -0
- package/rules/js-mssql/main.json +1 -0
- package/rules/js-mssql/main.mdc +14 -0
- package/rules/js-mssql/package_json/concern.json +9 -0
- package/rules/js-mssql/package_json/package_json.mdc +9 -0
- package/rules/js-mssql/package_json/package_json.rego +57 -0
- package/rules/js-run/configmap/concern.json +9 -0
- package/rules/js-run/configmap/configmap.mdc +31 -0
- package/rules/js-run/configmap/configmap.rego +21 -0
- package/rules/js-run/configmap/template/configmap.yaml.contains.yml +4 -0
- package/rules/js-run/docs/index.md +11 -0
- package/rules/js-run/jsconfig/concern.json +9 -0
- package/rules/js-run/jsconfig/docs/fix-jsconfig.md +29 -0
- package/rules/js-run/jsconfig/docs/index.md +9 -0
- package/rules/js-run/jsconfig/fix-jsconfig.mjs +119 -0
- package/rules/js-run/jsconfig/jsconfig.mdc +25 -0
- package/rules/js-run/jsconfig/jsconfig.rego +59 -0
- package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +10 -0
- package/rules/js-run/lib/bunyan-imports.mjs +98 -0
- package/rules/js-run/lib/check-env-scan.mjs +338 -0
- package/rules/js-run/lib/conn-file-rules.mjs +214 -0
- package/rules/js-run/lib/conn-imports-scan.mjs +154 -0
- package/rules/js-run/lib/docs/bunyan-imports.md +121 -0
- package/rules/js-run/lib/docs/check-env-scan.md +438 -0
- package/rules/js-run/lib/docs/conn-file-rules.md +304 -0
- package/rules/js-run/lib/docs/conn-imports-scan.md +208 -0
- package/rules/js-run/lib/docs/index.md +16 -0
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +334 -0
- package/rules/js-run/lib/docs/temporal-scan.md +29 -0
- package/rules/js-run/lib/promise-settimeout-scan.mjs +128 -0
- package/rules/js-run/lib/temporal-scan.mjs +52 -0
- package/rules/js-run/main.json +1 -0
- package/rules/js-run/main.mdc +16 -0
- package/rules/js-run/package_json/concern.json +9 -0
- package/rules/js-run/package_json/package_json.mdc +38 -0
- package/rules/js-run/package_json/package_json.rego +37 -0
- package/rules/js-run/package_json/template/package.json.deny.json +22 -0
- package/rules/js-run/runtime/concern.json +12 -0
- package/rules/js-run/runtime/docs/fix-runtime.md +27 -0
- package/rules/js-run/runtime/docs/main.md +35 -0
- package/rules/js-run/runtime/fix-runtime.mjs +46 -0
- package/rules/js-run/runtime/main.mjs +494 -0
- package/rules/js-run/runtime/runtime.mdc +14 -0
- package/rules/k8s/base_kustomization/base_kustomization.mdc +12 -0
- package/rules/k8s/base_kustomization/base_kustomization.rego +77 -0
- package/rules/k8s/base_kustomization/concern.json +8 -0
- package/rules/k8s/base_manifest/base_manifest.mdc +14 -0
- package/rules/k8s/base_manifest/base_manifest.rego +154 -0
- package/rules/k8s/base_manifest/concern.json +8 -0
- package/rules/k8s/docs/index.md +11 -0
- package/rules/k8s/gateway/concern.json +8 -0
- package/rules/k8s/gateway/gateway.mdc +31 -0
- package/rules/k8s/gateway/gateway.rego +151 -0
- package/rules/k8s/hasura_configmap/concern.json +8 -0
- package/rules/k8s/hasura_configmap/hasura_configmap.mdc +20 -0
- package/rules/k8s/hasura_configmap/hasura_configmap.rego +129 -0
- package/rules/k8s/hasura_httproute/concern.json +8 -0
- package/rules/k8s/hasura_httproute/hasura_httproute.mdc +16 -0
- package/rules/k8s/hasura_httproute/hasura_httproute.rego +298 -0
- package/rules/k8s/hpa_pdb/concern.json +8 -0
- package/rules/k8s/hpa_pdb/hpa_pdb.mdc +25 -0
- package/rules/k8s/hpa_pdb/hpa_pdb.rego +139 -0
- package/rules/k8s/kubeconform/concern.json +7 -0
- package/rules/k8s/kubeconform/docs/main.md +32 -0
- package/rules/k8s/kubeconform/main.mjs +39 -0
- package/rules/k8s/kustomization/concern.json +8 -0
- package/rules/k8s/kustomization/kustomization.mdc +20 -0
- package/rules/k8s/kustomization/kustomization.rego +220 -0
- package/rules/k8s/lint_k8s_yml/concern.json +9 -0
- package/rules/k8s/lint_k8s_yml/lint_k8s_yml.rego +57 -0
- package/rules/k8s/lint_k8s_yml/template/lint-k8s.yml.snippet.yml +43 -0
- package/rules/k8s/main.json +1 -0
- package/rules/k8s/main.mdc +22 -0
- package/rules/k8s/manifest/concern.json +8 -0
- package/rules/k8s/manifest/manifest.mdc +17 -0
- package/rules/k8s/manifest/manifest.rego +328 -0
- package/rules/k8s/manifests/concern.json +6 -0
- package/rules/k8s/manifests/docs/fix-manifests.md +47 -0
- package/rules/k8s/manifests/fix-manifests.mjs +217 -0
- package/rules/k8s/manifests/main.mjs +6838 -0
- package/rules/k8s/network_policy/concern.json +8 -0
- package/rules/k8s/network_policy/network_policy.mdc +22 -0
- package/rules/k8s/network_policy/network_policy.rego +151 -0
- package/rules/k8s/network_policy/template/deployment.snippet.yaml +61 -0
- package/rules/k8s/network_policy/template/stateful-set.snippet.yaml +69 -0
- package/rules/k8s/svc_hl_yaml/concern.json +8 -0
- package/rules/k8s/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
- package/rules/k8s/svc_hl_yaml/svc_hl_yaml.rego +51 -0
- package/rules/k8s/svc_yaml/concern.json +8 -0
- package/rules/k8s/svc_yaml/svc_yaml.mdc +12 -0
- package/rules/k8s/svc_yaml/svc_yaml.rego +31 -0
- package/rules/nginx-default-tpl/docs/index.md +11 -0
- package/rules/nginx-default-tpl/main.json +1 -0
- package/rules/nginx-default-tpl/main.mdc +8 -0
- package/rules/nginx-default-tpl/template/concern.json +17 -0
- package/rules/nginx-default-tpl/template/docs/fix-template.md +26 -0
- package/rules/nginx-default-tpl/template/docs/main.md +42 -0
- package/rules/nginx-default-tpl/template/fix-template.mjs +67 -0
- package/rules/nginx-default-tpl/template/main.mjs +505 -0
- package/rules/nginx-default-tpl/vscode_extensions/concern.json +9 -0
- package/rules/nginx-default-tpl/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/nginx-default-tpl/vscode_extensions/vscode_extensions.rego +16 -0
- package/rules/nginx-default-tpl/vscode_settings/concern.json +9 -0
- package/rules/nginx-default-tpl/vscode_settings/vscode_settings.mdc +15 -0
- package/rules/nginx-default-tpl/vscode_settings/vscode_settings.rego +36 -0
- package/rules/npm-module/docs/index.md +11 -0
- package/rules/npm-module/emit_types_config/concern.json +9 -0
- package/rules/npm-module/emit_types_config/emit_types_config.mdc +43 -0
- package/rules/npm-module/emit_types_config/emit_types_config.rego +28 -0
- package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +9 -0
- package/rules/npm-module/header_doc_pointer/concern.json +5 -0
- package/rules/npm-module/header_doc_pointer/docs/main.md +40 -0
- package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +18 -0
- package/rules/npm-module/header_doc_pointer/main.mjs +131 -0
- package/rules/npm-module/main.json +1 -0
- package/rules/npm-module/main.mdc +38 -0
- package/rules/npm-module/npm_package_json/concern.json +9 -0
- package/rules/npm-module/npm_package_json/npm_package_json.mdc +57 -0
- package/rules/npm-module/npm_package_json/npm_package_json.rego +73 -0
- package/rules/npm-module/npm_package_json/template/package.json.snippet.json +1 -0
- package/rules/npm-module/npm_publish_yml/concern.json +10 -0
- package/rules/npm-module/npm_publish_yml/template/npm-publish.yml.snippet.yml +49 -0
- package/rules/npm-module/package_structure/concern.json +5 -0
- package/rules/npm-module/package_structure/docs/main.md +37 -0
- package/rules/npm-module/package_structure/main.mjs +515 -0
- package/rules/npm-module/package_structure/package_structure.mdc +63 -0
- package/rules/npm-module/root_package_json/concern.json +9 -0
- package/rules/npm-module/root_package_json/root_package_json.mdc +41 -0
- package/rules/npm-module/root_package_json/root_package_json.rego +28 -0
- package/rules/npm-module/root_package_json/template/package.json.snippet.json +1 -0
- package/rules/npm-module/rule_meta/concern.json +8 -0
- package/rules/npm-module/rule_meta/docs/main.md +35 -0
- package/rules/npm-module/rule_meta/main.mjs +119 -0
- package/rules/npm-module/rule_meta/rule_meta.mdc +11 -0
- package/rules/npm-module/skill_meta/concern.json +5 -0
- package/rules/npm-module/skill_meta/docs/main.md +149 -0
- package/rules/npm-module/skill_meta/main.mjs +91 -0
- package/rules/npm-module/skill_meta/skill_meta.mdc +11 -0
- package/rules/php/cs_fixer/concern.json +7 -0
- package/rules/php/cs_fixer/docs/main.md +34 -0
- package/rules/php/cs_fixer/main.mjs +52 -0
- package/rules/php/docs/index.md +11 -0
- package/rules/php/lint_php_yml/concern.json +9 -0
- package/rules/php/lint_php_yml/lint_php_yml.mdc +23 -0
- package/rules/php/lint_php_yml/lint_php_yml.rego +34 -0
- package/rules/php/lint_php_yml/template/lint-php.yml.snippet.yml +47 -0
- package/rules/php/main.json +1 -0
- package/rules/php/main.mdc +8 -0
- package/rules/php/phpcs/concern.json +7 -0
- package/rules/php/phpcs/docs/main.md +31 -0
- package/rules/php/phpcs/main.mjs +71 -0
- package/rules/php/project/concern.json +6 -0
- package/rules/php/project/docs/main.md +36 -0
- package/rules/php/project/main.mjs +88 -0
- package/rules/php/tooling/concern.json +5 -0
- package/rules/php/tooling/docs/main.md +33 -0
- package/rules/php/tooling/main.mjs +35 -0
- package/rules/php/tooling/tooling.mdc +66 -0
- package/rules/python/applies/concern.json +4 -0
- package/rules/python/applies/docs/main.md +29 -0
- package/rules/python/applies/main.mjs +24 -0
- package/rules/python/docs/index.md +11 -0
- package/rules/python/lib/docs/index.md +9 -0
- package/rules/python/lib/docs/uv-run.md +32 -0
- package/rules/python/lib/uv-run.mjs +48 -0
- package/rules/python/lint_python_yml/concern.json +9 -0
- package/rules/python/lint_python_yml/lint_python_yml.mdc +12 -0
- package/rules/python/lint_python_yml/lint_python_yml.rego +68 -0
- package/rules/python/lint_python_yml/template/lint-python.yml.snippet.yml +41 -0
- package/rules/python/main.json +1 -0
- package/rules/python/main.mdc +8 -0
- package/rules/python/mypy/concern.json +7 -0
- package/rules/python/mypy/docs/main.md +32 -0
- package/rules/python/mypy/main.mjs +36 -0
- package/rules/python/project/concern.json +6 -0
- package/rules/python/project/docs/main.md +43 -0
- package/rules/python/project/main.mjs +115 -0
- package/rules/python/pyproject_toml/concern.json +9 -0
- package/rules/python/pyproject_toml/pyproject_toml.mdc +13 -0
- package/rules/python/pyproject_toml/pyproject_toml.rego +53 -0
- package/rules/python/pyproject_toml/template/pyproject.toml.deny.toml +2 -0
- package/rules/python/pyproject_toml/template/pyproject.toml.snippet.toml +12 -0
- package/rules/python/ruff/concern.json +7 -0
- package/rules/python/ruff/docs/fix-ruff.md +34 -0
- package/rules/python/ruff/docs/main.md +35 -0
- package/rules/python/ruff/fix-ruff.mjs +63 -0
- package/rules/python/ruff/main.mjs +52 -0
- package/rules/python/tooling/concern.json +15 -0
- package/rules/python/tooling/docs/index.md +11 -0
- package/rules/python/tooling/docs/main.md +35 -0
- package/rules/python/tooling/main.mjs +50 -0
- package/rules/python/tooling/tooling.mdc +23 -0
- package/rules/rego/conftest_verify/concern.json +6 -0
- package/rules/rego/conftest_verify/docs/main.md +31 -0
- package/rules/rego/conftest_verify/main.mjs +55 -0
- package/rules/rego/docs/index.md +11 -0
- package/rules/rego/lib/docs/index.md +9 -0
- package/rules/rego/lib/docs/run-external-tool.md +36 -0
- package/rules/rego/lib/run-external-tool.mjs +53 -0
- package/rules/rego/main.json +1 -0
- package/rules/rego/main.mdc +20 -0
- package/rules/rego/opa_check/concern.json +7 -0
- package/rules/rego/opa_check/docs/main.md +32 -0
- package/rules/rego/opa_check/main.mjs +34 -0
- package/rules/rego/package_json/concern.json +10 -0
- package/rules/rego/package_json/package_json.mdc +12 -0
- package/rules/rego/package_json/package_json.rego +21 -0
- package/rules/rego/regal/concern.json +7 -0
- package/rules/rego/regal/docs/index.md +11 -0
- package/rules/rego/regal/docs/main.md +32 -0
- package/rules/rego/regal/main.mjs +34 -0
- package/rules/rego/tooling/concern.json +5 -0
- package/rules/rego/tooling/docs/index.md +11 -0
- package/rules/rego/tooling/docs/main.md +31 -0
- package/rules/rego/tooling/main.mjs +25 -0
- package/rules/rego/tooling/tooling.mdc +14 -0
- package/rules/rego/vscode_extensions/concern.json +11 -0
- package/rules/rego/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
- package/rules/rego/vscode_extensions/docs/index.md +11 -0
- package/rules/rego/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/rego/vscode_extensions/template/extensions.json.snippet.json +1 -0
- package/rules/rego/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/rego/vscode_extensions/vscode_extensions.rego +15 -0
- package/rules/rego/vscode_settings/concern.json +11 -0
- package/rules/rego/vscode_settings/template/settings.json.snippet.json +6 -0
- package/rules/rego/vscode_settings/vscode_settings.mdc +19 -0
- package/rules/rego/vscode_settings/vscode_settings.rego +30 -0
- package/rules/release/change.mjs +88 -0
- package/rules/release/docs/change.md +189 -0
- package/rules/release/docs/index.md +13 -0
- package/rules/release/docs/release.md +25 -0
- package/rules/release/lib/aggregate.mjs +82 -0
- package/rules/release/lib/change-file.mjs +116 -0
- package/rules/release/lib/docs/aggregate.md +250 -0
- package/rules/release/lib/docs/change-file.md +206 -0
- package/rules/release/lib/docs/fallback.md +207 -0
- package/rules/release/lib/docs/index.md +13 -0
- package/rules/release/lib/fallback.mjs +48 -0
- package/rules/release/main.json +1 -0
- package/rules/release/main.mdc +10 -0
- package/rules/release/release.mjs +220 -0
- package/rules/rust/applies/concern.json +4 -0
- package/rules/rust/applies/docs/index.md +11 -0
- package/rules/rust/applies/docs/main.md +30 -0
- package/rules/rust/applies/main.mjs +28 -0
- package/rules/rust/check/concern.json +7 -0
- package/rules/rust/check/docs/fix-check.md +30 -0
- package/rules/rust/check/docs/index.md +11 -0
- package/rules/rust/check/docs/main.md +37 -0
- package/rules/rust/check/fix-check.mjs +79 -0
- package/rules/rust/check/main.mjs +81 -0
- package/rules/rust/coverage/coverage.mdc +28 -0
- package/rules/rust/docs/index.md +11 -0
- package/rules/rust/lib/docs/has-cargo-toml.md +134 -0
- package/rules/rust/lib/docs/index.md +11 -0
- package/rules/rust/lib/has-cargo-toml.mjs +37 -0
- package/rules/rust/lint_rust_yml/concern.json +11 -0
- package/rules/rust/lint_rust_yml/lint_rust_yml.mdc +17 -0
- package/rules/rust/lint_rust_yml/lint_rust_yml.rego +79 -0
- package/rules/rust/lint_rust_yml/template/lint-rust.yml.snippet.yml +44 -0
- package/rules/rust/main.json +1 -0
- package/rules/rust/main.mdc +8 -0
- package/rules/rust/package_json/concern.json +10 -0
- package/rules/rust/package_json/package_json.mdc +12 -0
- package/rules/rust/package_json/package_json.rego +20 -0
- package/rules/rust/toolchain_cache/concern.json +5 -0
- package/rules/rust/toolchain_cache/docs/fix-toolchain_cache.md +35 -0
- package/rules/rust/toolchain_cache/docs/index.md +12 -0
- package/rules/rust/toolchain_cache/docs/main.md +57 -0
- package/rules/rust/toolchain_cache/fix-toolchain_cache.mjs +117 -0
- package/rules/rust/toolchain_cache/main.mjs +177 -0
- package/rules/rust/toolchain_cache/toolchain_cache.mdc +23 -0
- package/rules/rust/vscode_extensions/concern.json +11 -0
- package/rules/rust/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/rust/vscode_extensions/docs/index.md +11 -0
- package/rules/rust/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/rust/vscode_extensions/template/extensions.json.snippet.json +1 -0
- package/rules/rust/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/rust/vscode_extensions/vscode_extensions.rego +15 -0
- package/rules/security/docs/index.md +11 -0
- package/rules/security/lint_security_yml/concern.json +11 -0
- package/rules/security/lint_security_yml/lint_security_yml.mdc +7 -0
- package/rules/security/lint_security_yml/lint_security_yml.rego +33 -0
- package/rules/security/lint_security_yml/template/lint-security.yml.snippet.yml +31 -0
- package/rules/security/main.json +1 -0
- package/rules/security/main.mdc +15 -0
- package/rules/security/package_json/concern.json +9 -0
- package/rules/security/package_json/package_json.mdc +7 -0
- package/rules/security/package_json/package_json.rego +19 -0
- package/rules/security/package_json/template/package.json.deny.json +4 -0
- package/rules/security/sample_secret/concern.json +11 -0
- package/rules/security/sample_secret/docs/index.md +11 -0
- package/rules/security/sample_secret/docs/main.md +29 -0
- package/rules/security/sample_secret/main.mjs +80 -0
- package/rules/security/sample_secret/sample_secret.mdc +20 -0
- package/rules/security/scan/concern.json +6 -0
- package/rules/security/scan/docs/index.md +11 -0
- package/rules/security/scan/docs/main.md +32 -0
- package/rules/security/scan/main.mjs +48 -0
- package/rules/security/todo.MD +27 -0
- package/rules/security/trufflehog/concern.json +4 -0
- package/rules/security/trufflehog/docs/index.md +11 -0
- package/rules/security/trufflehog/docs/main.md +28 -0
- package/rules/security/trufflehog/main.mjs +45 -0
- package/rules/security/trufflehog/templates/trufflehog/.trufflehog-exclude.snippet.txt +6 -0
- package/rules/security/trufflehog/trufflehog.mdc +21 -0
- package/rules/style/docs/index.md +11 -0
- package/rules/style/lint/concern.json +7 -0
- package/rules/style/lint/docs/fix-lint.md +29 -0
- package/rules/style/lint/docs/index.md +11 -0
- package/rules/style/lint/docs/main.md +29 -0
- package/rules/style/lint/fix-lint.mjs +66 -0
- package/rules/style/lint/main.mjs +68 -0
- package/rules/style/lint_style_yml/concern.json +9 -0
- package/rules/style/lint_style_yml/lint_style_yml.mdc +13 -0
- package/rules/style/lint_style_yml/lint_style_yml.rego +38 -0
- package/rules/style/lint_style_yml/template/lint-style.yml.snippet.yml +39 -0
- package/rules/style/main.json +1 -0
- package/rules/style/main.mdc +13 -0
- package/rules/style/package_json/concern.json +9 -0
- package/rules/style/package_json/package_json.mdc +18 -0
- package/rules/style/package_json/package_json.rego +31 -0
- package/rules/style/package_json/template/package.json.snippet.json +5 -0
- package/rules/style/tooling/concern.json +14 -0
- package/rules/style/tooling/docs/fix-tooling.md +29 -0
- package/rules/style/tooling/docs/index.md +12 -0
- package/rules/style/tooling/docs/main.md +34 -0
- package/rules/style/tooling/fix-tooling.mjs +58 -0
- package/rules/style/tooling/main.mjs +78 -0
- package/rules/style/tooling/tooling.mdc +85 -0
- package/rules/style/vscode_extensions/concern.json +9 -0
- package/rules/style/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/style/vscode_extensions/docs/index.md +11 -0
- package/rules/style/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/style/vscode_extensions/template/extensions.json.snippet.json +1 -0
- package/rules/style/vscode_extensions/vscode_extensions.mdc +13 -0
- package/rules/style/vscode_extensions/vscode_extensions.rego +13 -0
- package/rules/style/vscode_settings/concern.json +9 -0
- package/rules/style/vscode_settings/template/settings.json.snippet.json +5 -0
- package/rules/style/vscode_settings/vscode_settings.mdc +19 -0
- package/rules/style/vscode_settings/vscode_settings.rego +15 -0
- package/rules/tauri/cargo_mutants_config/cargo_mutants_config.mdc +39 -0
- package/rules/tauri/cargo_mutants_config/concern.json +5 -0
- package/rules/tauri/cargo_mutants_config/docs/fix-cargo_mutants_config.md +30 -0
- package/rules/tauri/cargo_mutants_config/docs/index.md +12 -0
- package/rules/tauri/cargo_mutants_config/docs/main.md +30 -0
- package/rules/tauri/cargo_mutants_config/fix-cargo_mutants_config.mjs +53 -0
- package/rules/tauri/cargo_mutants_config/main.mjs +148 -0
- package/rules/tauri/core_test_isolation/concern.json +5 -0
- package/rules/tauri/core_test_isolation/core_test_isolation.mdc +43 -0
- package/rules/tauri/core_test_isolation/docs/index.md +9 -0
- package/rules/tauri/core_test_isolation/docs/main.md +36 -0
- package/rules/tauri/core_test_isolation/main.mjs +166 -0
- package/rules/tauri/docs/index.md +11 -0
- package/rules/tauri/linux_deps/concern.json +8 -0
- package/rules/tauri/linux_deps/docs/fix-linux_deps.md +29 -0
- package/rules/tauri/linux_deps/docs/index.md +10 -0
- package/rules/tauri/linux_deps/docs/main.md +36 -0
- package/rules/tauri/linux_deps/fix-linux_deps.mjs +89 -0
- package/rules/tauri/linux_deps/linux_deps.mdc +18 -0
- package/rules/tauri/linux_deps/main.mjs +100 -0
- package/rules/tauri/main.json +1 -0
- package/rules/tauri/main.mdc +86 -0
- package/rules/tauri/release/concern.json +8 -0
- package/rules/tauri/release/docs/fix-release.md +28 -0
- package/rules/tauri/release/docs/index.md +10 -0
- package/rules/tauri/release/docs/main.md +32 -0
- package/rules/tauri/release/fix-release.mjs +353 -0
- package/rules/tauri/release/main.mjs +315 -0
- package/rules/tauri/release/release.mdc +104 -0
- package/rules/tauri/tooling/concern.json +8 -0
- package/rules/tauri/tooling/docs/index.md +11 -0
- package/rules/tauri/tooling/docs/main.md +34 -0
- package/rules/tauri/tooling/main.mjs +94 -0
- package/rules/tauri/tooling/tooling.mdc +27 -0
- package/rules/tauri/updater/concern.json +14 -0
- package/rules/tauri/updater/docs/fix-updater.md +33 -0
- package/rules/tauri/updater/docs/index.md +10 -0
- package/rules/tauri/updater/docs/main.md +32 -0
- package/rules/tauri/updater/fix-updater.mjs +322 -0
- package/rules/tauri/updater/main.mjs +403 -0
- package/rules/tauri/updater/updater.mdc +90 -0
- package/rules/tauri/vscode_extensions/concern.json +9 -0
- package/rules/tauri/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/tauri/vscode_extensions/docs/index.md +11 -0
- package/rules/tauri/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/tauri/vscode_extensions/vscode_extensions.mdc +23 -0
- package/rules/tauri/vscode_extensions/vscode_extensions.rego +26 -0
- package/rules/test/cargo_mutants_config/cargo_mutants_config.mdc +18 -0
- package/rules/test/cargo_mutants_config/concern.json +8 -0
- package/rules/test/cargo_mutants_config/data/cargo_mutants_config/mutants.toml.baseline +7 -0
- package/rules/test/cargo_mutants_config/docs/fix-cargo_mutants_config.md +31 -0
- package/rules/test/cargo_mutants_config/docs/index.md +12 -0
- package/rules/test/cargo_mutants_config/docs/main.md +36 -0
- package/rules/test/cargo_mutants_config/fix-cargo_mutants_config.mjs +49 -0
- package/rules/test/cargo_mutants_config/main.mjs +62 -0
- package/rules/test/docs/index.md +11 -0
- package/rules/test/location/concern.json +8 -0
- package/rules/test/location/docs/index.md +11 -0
- package/rules/test/location/docs/main.md +36 -0
- package/rules/test/location/location.mdc +52 -0
- package/rules/test/location/main.mjs +70 -0
- package/rules/test/main.json +1 -0
- package/rules/test/main.mdc +26 -0
- package/rules/test/no-bun-test-import/concern.json +7 -0
- package/rules/test/no-bun-test-import/docs/fix-no-bun-test-import.md +31 -0
- package/rules/test/no-bun-test-import/docs/index.md +10 -0
- package/rules/test/no-bun-test-import/docs/main.md +36 -0
- package/rules/test/no-bun-test-import/fix-no-bun-test-import.mjs +51 -0
- package/rules/test/no-bun-test-import/main.mjs +105 -0
- package/rules/test/no-bun-test-import/no-bun-test-import.mdc +9 -0
- package/rules/test/no-console-store-restore/concern.json +7 -0
- package/rules/test/no-console-store-restore/docs/index.md +11 -0
- package/rules/test/no-console-store-restore/docs/main.md +44 -0
- package/rules/test/no-console-store-restore/main.mjs +88 -0
- package/rules/test/no-console-store-restore/no-console-store-restore.mdc +11 -0
- package/rules/test/no-process-chdir/concern.json +7 -0
- package/rules/test/no-process-chdir/docs/index.md +11 -0
- package/rules/test/no-process-chdir/docs/main.md +32 -0
- package/rules/test/no-process-chdir/main.mjs +40 -0
- package/rules/test/no-process-chdir/no-process-chdir.mdc +15 -0
- package/rules/test/no-relative-fs-path/concern.json +7 -0
- package/rules/test/no-relative-fs-path/docs/index.md +11 -0
- package/rules/test/no-relative-fs-path/docs/main.md +34 -0
- package/rules/test/no-relative-fs-path/main.mjs +239 -0
- package/rules/test/no-relative-fs-path/no-relative-fs-path.mdc +22 -0
- package/rules/test/package_json/concern.json +11 -0
- package/rules/test/package_json/package_json.mdc +18 -0
- package/rules/test/package_json/package_json.rego +25 -0
- package/rules/test/package_json/template/package.json.contains.json +6 -0
- package/rules/test/sandbox-aware-test/concern.json +7 -0
- package/rules/test/sandbox-aware-test/docs/index.md +11 -0
- package/rules/test/sandbox-aware-test/docs/main.md +55 -0
- package/rules/test/sandbox-aware-test/main.mjs +89 -0
- package/rules/test/sandbox-aware-test/sandbox-aware-test.mdc +28 -0
- package/rules/test/stryker_config/concern.json +8 -0
- package/rules/test/stryker_config/data/stryker_config/docs/index.md +13 -0
- package/rules/test/stryker_config/data/stryker_config/docs/stryker-vue-macros-ignorer.md +31 -0
- package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.baseline.md +31 -0
- package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.vue.baseline.md +35 -0
- package/rules/test/stryker_config/data/stryker_config/stryker-vue-macros-ignorer.mjs +48 -0
- package/rules/test/stryker_config/data/stryker_config/stryker.config.baseline.mjs +18 -0
- package/rules/test/stryker_config/data/stryker_config/stryker.config.vue.baseline.mjs +23 -0
- package/rules/test/stryker_config/data/vitest_config/docs/index.md +11 -0
- package/rules/test/stryker_config/data/vitest_config/docs/vitest.config.baseline.md +35 -0
- package/rules/test/stryker_config/data/vitest_config/vitest.config.baseline.js +22 -0
- package/rules/test/stryker_config/docs/fix-stryker_config.md +42 -0
- package/rules/test/stryker_config/docs/index.md +12 -0
- package/rules/test/stryker_config/docs/main.md +38 -0
- package/rules/test/stryker_config/fix-stryker_config.mjs +76 -0
- package/rules/test/stryker_config/main.mjs +504 -0
- package/rules/test/stryker_config/stryker_config.mdc +26 -0
- package/rules/test/vitest-config-pool-forks/concern.json +7 -0
- package/rules/test/vitest-config-pool-forks/docs/index.md +11 -0
- package/rules/test/vitest-config-pool-forks/docs/main.md +42 -0
- package/rules/test/vitest-config-pool-forks/main.mjs +41 -0
- package/rules/test/vitest-config-pool-forks/vitest-config-pool-forks.mdc +34 -0
- package/rules/text/cspell/concern.json +9 -0
- package/rules/text/cspell/cspell.mdc +41 -0
- package/rules/text/cspell/cspell.rego +71 -0
- package/rules/text/cspell/docs/fix-cspell.md +36 -0
- package/rules/text/cspell/docs/index.md +11 -0
- package/rules/text/cspell/fix-cspell.mjs +115 -0
- package/rules/text/cspell/template/.cspell.json.contains.json +3 -0
- package/rules/text/cspell/template/.cspell.json.deny.json +5 -0
- package/rules/text/cspell/template/.cspell.json.snippet.json +15 -0
- package/rules/text/cspell-fix/concern.json +7 -0
- package/rules/text/cspell-fix/docs/fix-worker.md +38 -0
- package/rules/text/cspell-fix/docs/index.md +12 -0
- package/rules/text/cspell-fix/docs/main.md +32 -0
- package/rules/text/cspell-fix/fix-worker.mjs +73 -0
- package/rules/text/cspell-fix/main.mjs +185 -0
- package/rules/text/docs/index.md +11 -0
- package/rules/text/forbidden-prettier/concern.json +7 -0
- package/rules/text/forbidden-prettier/docs/index.md +11 -0
- package/rules/text/forbidden-prettier/docs/main.md +38 -0
- package/rules/text/forbidden-prettier/forbidden-prettier.mdc +14 -0
- package/rules/text/forbidden-prettier/main.mjs +56 -0
- package/rules/text/formatting/concern.json +17 -0
- package/rules/text/formatting/docs/index.md +11 -0
- package/rules/text/formatting/docs/main.md +39 -0
- package/rules/text/formatting/main.mjs +149 -0
- package/rules/text/lint_text/concern.json +8 -0
- package/rules/text/lint_text/lint_text.mdc +19 -0
- package/rules/text/lint_text/lint_text.rego +104 -0
- package/rules/text/lint_text/template/lint-text.yml.snippet.yml +61 -0
- package/rules/text/main.json +1 -0
- package/rules/text/main.mdc +23 -0
- package/rules/text/markdownlint/concern.json +12 -0
- package/rules/text/markdownlint/docs/fix-markdownlint.md +38 -0
- package/rules/text/markdownlint/docs/index.md +12 -0
- package/rules/text/markdownlint/docs/main.md +40 -0
- package/rules/text/markdownlint/fix-markdownlint.mjs +64 -0
- package/rules/text/markdownlint/main.mjs +55 -0
- package/rules/text/markdownlint/markdownlint.mdc +40 -0
- package/rules/text/markdownlint/markdownlint.rego +57 -0
- package/rules/text/markdownlint/template/.markdownlint-cli2.jsonc.snippet.jsonc +11 -0
- package/rules/text/oxfmt/concern.json +7 -0
- package/rules/text/oxfmt/docs/fix-oxfmt.md +28 -0
- package/rules/text/oxfmt/docs/main.md +27 -0
- package/rules/text/oxfmt/fix-oxfmt.mjs +52 -0
- package/rules/text/oxfmt/main.mjs +48 -0
- package/rules/text/oxfmt/oxfmt.mdc +11 -0
- package/rules/text/oxfmtrc/concern.json +9 -0
- package/rules/text/oxfmtrc/oxfmtrc.mdc +11 -0
- package/rules/text/oxfmtrc/oxfmtrc.rego +55 -0
- package/rules/text/oxfmtrc/template/.oxfmtrc.json.snippet.json +8 -0
- package/rules/text/package_json/concern.json +9 -0
- package/rules/text/package_json/package_json.mdc +35 -0
- package/rules/text/package_json/package_json.rego +66 -0
- package/rules/text/package_json/template/package.json.deny.json +15 -0
- package/rules/text/run-dotenv-linter/concern.json +7 -0
- package/rules/text/run-dotenv-linter/docs/fix-run-dotenv-linter.md +43 -0
- package/rules/text/run-dotenv-linter/docs/index.md +12 -0
- package/rules/text/run-dotenv-linter/docs/main.md +35 -0
- package/rules/text/run-dotenv-linter/fix-run-dotenv-linter.mjs +64 -0
- package/rules/text/run-dotenv-linter/main.mjs +122 -0
- package/rules/text/run-shellcheck/concern.json +7 -0
- package/rules/text/run-shellcheck/docs/fix-run-shellcheck.md +40 -0
- package/rules/text/run-shellcheck/docs/index.md +12 -0
- package/rules/text/run-shellcheck/docs/main.md +31 -0
- package/rules/text/run-shellcheck/fix-run-shellcheck.mjs +44 -0
- package/rules/text/run-shellcheck/main.mjs +245 -0
- package/rules/text/run-v8r/concern.json +7 -0
- package/rules/text/run-v8r/docs/index.md +11 -0
- package/rules/text/run-v8r/docs/main.md +40 -0
- package/rules/text/run-v8r/main.mjs +266 -0
- package/rules/text/vscode_extensions/concern.json +9 -0
- package/rules/text/vscode_extensions/docs/fix-vscode_extensions.md +36 -0
- package/rules/text/vscode_extensions/docs/index.md +11 -0
- package/rules/text/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/text/vscode_extensions/template/extensions.json.snippet.json +3 -0
- package/rules/text/vscode_extensions/vscode_extensions.mdc +13 -0
- package/rules/text/vscode_extensions/vscode_extensions.rego +12 -0
- package/rules/text/vscode_settings/concern.json +9 -0
- package/rules/text/vscode_settings/template/settings.json.snippet.json +9 -0
- package/rules/text/vscode_settings/vscode_settings.mdc +13 -0
- package/rules/text/vscode_settings/vscode_settings.rego +34 -0
- package/rules/tool-surface/docs/index.md +11 -0
- package/rules/tool-surface/main.json +6 -0
- package/rules/tool-surface/main.mdc +72 -0
- package/rules/vue/docs/index.md +11 -0
- package/rules/vue/lib/docs/index.md +11 -0
- package/rules/vue/lib/docs/vue-forbidden-imports.md +265 -0
- package/rules/vue/lib/vue-forbidden-imports.mjs +264 -0
- package/rules/vue/main.json +1 -0
- package/rules/vue/main.mdc +18 -0
- package/rules/vue/package_json/concern.json +9 -0
- package/rules/vue/package_json/package_json.mdc +30 -0
- package/rules/vue/package_json/package_json.rego +140 -0
- package/rules/vue/packages/concern.json +6 -0
- package/rules/vue/packages/docs/index.md +11 -0
- package/rules/vue/packages/docs/main.md +35 -0
- package/rules/vue/packages/main.mjs +575 -0
- package/rules/worktree/docs/index.md +11 -0
- package/rules/worktree/main.json +1 -0
- package/rules/worktree/main.mdc +100 -0
- package/rules/worktree/vscode_settings/concern.json +10 -0
- package/rules/worktree/vscode_settings/template/settings.json.snippet.json +8 -0
- package/rules/worktree/zed_settings/concern.json +10 -0
- package/rules/worktree/zed_settings/template/settings.json.snippet.json +12 -0
- package/schemas/any.json +4 -0
- package/schemas/concern.json +108 -0
- package/schemas/layers-config.json +38 -0
- package/schemas/n-rules.json +65 -0
- package/schemas/rule-meta.json +39 -0
- package/schemas/skill-meta.json +30 -0
- package/schemas/target.json +63 -0
- package/schemas/v8r-catalog.json +179 -0
- package/schemas/vendor/bunfig.json +616 -0
- package/schemas/vendor/cargo-mutants-config.json +158 -0
- package/schemas/vendor/cargo.json +9438 -0
- package/schemas/vendor/claude-code-settings.json +2742 -0
- package/schemas/vendor/codex-hooks.json +148 -0
- package/schemas/vendor/cspell.json +2427 -0
- package/schemas/vendor/github-action.json +695 -0
- package/schemas/vendor/github-workflow.json +2193 -0
- package/schemas/vendor/jsconfig.json +1252 -0
- package/schemas/vendor/jscpd.json +405 -0
- package/schemas/vendor/knip.json +915 -0
- package/schemas/vendor/mcp.json +26 -0
- package/schemas/vendor/mt-config.json +85 -0
- package/schemas/vendor/oxfmtrc.json +810 -0
- package/schemas/vendor/oxlintrc.json +18690 -0
- package/schemas/vendor/package.json +23798 -0
- package/schemas/vendor/prettierrc.json +433 -0
- package/schemas/vendor/quikrun.json +195 -0
- package/schemas/vendor/schema-catalog.json +62 -0
- package/schemas/vendor/tsconfig.json +1535 -0
- package/schemas/vendor/zizmor.json +489 -0
- package/scripts/auto-rules.mjs +444 -0
- package/scripts/auto-skills.mjs +95 -0
- package/scripts/build-agents-commands.mjs +91 -0
- package/scripts/cli-entry.mjs +34 -0
- package/scripts/dispatcher/docs/index.md +11 -0
- package/scripts/docs/auto-rules.md +34 -0
- package/scripts/docs/auto-skills.md +30 -0
- package/scripts/docs/build-agents-commands.md +37 -0
- package/scripts/docs/cli-entry.md +36 -0
- package/scripts/docs/ensure-n-rules-dev-dependencies.md +40 -0
- package/scripts/docs/hook.md +30 -0
- package/scripts/docs/index.md +22 -0
- package/scripts/docs/post-tool-use-check.md +27 -0
- package/scripts/docs/rename-yaml-extensions.md +40 -0
- package/scripts/docs/skills-cli.md +35 -0
- package/scripts/docs/smoke-check-imports.md +31 -0
- package/scripts/docs/sync-claude-config.md +84 -0
- package/scripts/docs/sync-setup-bun-deps-action.md +28 -0
- package/scripts/docs/update-blue-oak.md +28 -0
- package/scripts/docs/upgrade-n-rules-and-install.md +36 -0
- package/scripts/ensure-n-rules-dev-dependencies.mjs +217 -0
- package/scripts/hook.mjs +100 -0
- package/scripts/lib/adr/docs/index.md +12 -0
- package/scripts/lib/adr/docs/normalize-cli.md +36 -0
- package/scripts/lib/adr/docs/normalize-pipeline.md +45 -0
- package/scripts/lib/adr/normalize-cli.mjs +74 -0
- package/scripts/lib/adr/normalize-pipeline.mjs +701 -0
- package/scripts/lib/assert-project-root.mjs +77 -0
- package/scripts/lib/blue-oak.mjs +41 -0
- package/scripts/lib/changed-files.mjs +83 -0
- package/scripts/lib/check-reporter.mjs +27 -0
- package/scripts/lib/collect-test-files.mjs +48 -0
- package/scripts/lib/concern-meta.mjs +140 -0
- package/scripts/lib/diff-added-lines.mjs +86 -0
- package/scripts/lib/discover-check-rules-from-cursor.mjs +40 -0
- package/scripts/lib/discover-checkable-rules.mjs +49 -0
- package/scripts/lib/docs/assert-project-root.md +30 -0
- package/scripts/lib/docs/blue-oak.md +29 -0
- package/scripts/lib/docs/changed-files.md +32 -0
- package/scripts/lib/docs/check-reporter.md +179 -0
- package/scripts/lib/docs/collect-test-files.md +32 -0
- package/scripts/lib/docs/concern-meta.md +34 -0
- package/scripts/lib/docs/diff-added-lines.md +38 -0
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +29 -0
- package/scripts/lib/docs/discover-checkable-rules.md +25 -0
- package/scripts/lib/docs/ensure-tool.md +258 -0
- package/scripts/lib/docs/generated-markdown.md +279 -0
- package/scripts/lib/docs/gha-workflow.md +38 -0
- package/scripts/lib/docs/index.md +40 -0
- package/scripts/lib/docs/inline-template-links.md +25 -0
- package/scripts/lib/docs/list-project-rules-mdc.md +27 -0
- package/scripts/lib/docs/list-rule-ids.md +25 -0
- package/scripts/lib/docs/load-cursor-config.md +154 -0
- package/scripts/lib/docs/mirror-parity.md +32 -0
- package/scripts/lib/docs/read-n-rules-config-lite.md +26 -0
- package/scripts/lib/docs/resolve-target-files.md +38 -0
- package/scripts/lib/docs/root-notice.md +29 -0
- package/scripts/lib/docs/rule-meta-helpers.md +38 -0
- package/scripts/lib/docs/rule-meta.md +29 -0
- package/scripts/lib/docs/rule-predicates.md +31 -0
- package/scripts/lib/docs/run-conftest-batch.md +30 -0
- package/scripts/lib/docs/run-lint-step.md +29 -0
- package/scripts/lib/docs/run-standard-lint.md +43 -0
- package/scripts/lib/docs/skill-meta.md +62 -0
- package/scripts/lib/docs/sync-gitignore-worktree.md +26 -0
- package/scripts/lib/docs/template.md +44 -0
- package/scripts/lib/docs/timing-summary.md +25 -0
- package/scripts/lib/docs/workspaces.md +34 -0
- package/scripts/lib/docs/worktree-notice.md +27 -0
- package/scripts/lib/ensure-tool.mjs +352 -0
- package/scripts/lib/fix/docs/index.md +11 -0
- package/scripts/lib/fix/docs/vscode-ext-add.md +33 -0
- package/scripts/lib/fix/vscode-ext-add.mjs +53 -0
- package/scripts/lib/generated-markdown.mjs +71 -0
- package/scripts/lib/gha-workflow.mjs +220 -0
- package/scripts/lib/inline-template-links.mjs +108 -0
- package/scripts/lib/lint-surface/codegen-opa-wrapper.mjs +30 -0
- package/scripts/lib/lint-surface/collateral-veto.mjs +55 -0
- package/scripts/lib/lint-surface/default-worker.mjs +67 -0
- package/scripts/lib/lint-surface/detect.mjs +169 -0
- package/scripts/lib/lint-surface/docs/codegen-opa-wrapper.md +30 -0
- package/scripts/lib/lint-surface/docs/collateral-veto.md +28 -0
- package/scripts/lib/lint-surface/docs/default-worker.md +32 -0
- package/scripts/lib/lint-surface/docs/detect.md +38 -0
- package/scripts/lib/lint-surface/docs/index.md +27 -0
- package/scripts/lib/lint-surface/docs/ladder.md +33 -0
- package/scripts/lib/lint-surface/docs/lint-lock.md +47 -0
- package/scripts/lib/lint-surface/docs/mt-run-node.md +37 -0
- package/scripts/lib/lint-surface/docs/mt-tail.md +41 -0
- package/scripts/lib/lint-surface/docs/policy-lint-adapter.md +44 -0
- package/scripts/lib/lint-surface/docs/policy-test-step.md +43 -0
- package/scripts/lib/lint-surface/docs/progress.md +28 -0
- package/scripts/lib/lint-surface/docs/render.md +29 -0
- package/scripts/lib/lint-surface/docs/run-detectors.md +32 -0
- package/scripts/lib/lint-surface/docs/run-fix.md +33 -0
- package/scripts/lib/lint-surface/docs/snapshot.md +30 -0
- package/scripts/lib/lint-surface/docs/tier-sampling-bench.md +40 -0
- package/scripts/lib/lint-surface/docs/tier-sampling-experiment.md +35 -0
- package/scripts/lib/lint-surface/docs/types.md +27 -0
- package/scripts/lib/lint-surface/docs/violation-reporter.md +32 -0
- package/scripts/lib/lint-surface/ladder.mjs +92 -0
- package/scripts/lib/lint-surface/lint-lock.mjs +247 -0
- package/scripts/lib/lint-surface/mt-run-node.mjs +206 -0
- package/scripts/lib/lint-surface/mt-tail.mjs +0 -0
- package/scripts/lib/lint-surface/policy-lint-adapter.mjs +101 -0
- package/scripts/lib/lint-surface/policy-test-step.mjs +149 -0
- package/scripts/lib/lint-surface/progress.mjs +198 -0
- package/scripts/lib/lint-surface/render.mjs +50 -0
- package/scripts/lib/lint-surface/run-detectors.mjs +314 -0
- package/scripts/lib/lint-surface/run-fix.mjs +732 -0
- package/scripts/lib/lint-surface/snapshot.mjs +83 -0
- package/scripts/lib/lint-surface/tier-sampling-bench.mjs +457 -0
- package/scripts/lib/lint-surface/tier-sampling-experiment.mjs +289 -0
- package/scripts/lib/lint-surface/types.mjs +150 -0
- package/scripts/lib/lint-surface/violation-reporter.mjs +46 -0
- package/scripts/lib/list-project-rules-mdc.mjs +22 -0
- package/scripts/lib/list-rule-ids.mjs +32 -0
- package/scripts/lib/load-cursor-config.mjs +58 -0
- package/scripts/lib/mirror-parity.mjs +62 -0
- package/scripts/lib/read-n-rules-config-lite.mjs +63 -0
- package/scripts/lib/resolve-target-files.mjs +103 -0
- package/scripts/lib/root-notice.mjs +67 -0
- package/scripts/lib/rule-meta-helpers.mjs +103 -0
- package/scripts/lib/rule-meta.mjs +66 -0
- package/scripts/lib/rule-predicates.mjs +114 -0
- package/scripts/lib/run-conftest-batch.mjs +124 -0
- package/scripts/lib/run-lint-step.mjs +38 -0
- package/scripts/lib/run-standard-lint.mjs +50 -0
- package/scripts/lib/skill-meta.mjs +90 -0
- package/scripts/lib/sync-gitignore-worktree.mjs +27 -0
- package/scripts/lib/template.mjs +315 -0
- package/scripts/lib/timing-summary.mjs +63 -0
- package/scripts/lib/workspaces.mjs +109 -0
- package/scripts/lib/worktree-notice.mjs +183 -0
- package/scripts/post-tool-use-check.mjs +82 -0
- package/scripts/rename-yaml-extensions.mjs +170 -0
- package/scripts/skills-cli.mjs +262 -0
- package/scripts/smoke-check-imports.mjs +66 -0
- package/scripts/sync-claude-config.mjs +692 -0
- package/scripts/sync-setup-bun-deps-action.mjs +36 -0
- package/scripts/update-blue-oak.mjs +50 -0
- package/scripts/upgrade-n-rules-and-install.mjs +264 -0
- package/scripts/utils/apply-to-files.mjs +36 -0
- package/scripts/utils/ast-extract.mjs +149 -0
- package/scripts/utils/ast-scan-utils.mjs +206 -0
- package/scripts/utils/docs/apply-to-files.md +38 -0
- package/scripts/utils/docs/ast-extract.md +30 -0
- package/scripts/utils/docs/ast-scan-utils.md +54 -0
- package/scripts/utils/docs/ensure-gitignore-entries.md +32 -0
- package/scripts/utils/docs/find-package-json-paths.md +30 -0
- package/scripts/utils/docs/index.md +23 -0
- package/scripts/utils/docs/lock-cache-dir.md +29 -0
- package/scripts/utils/docs/pass.md +29 -0
- package/scripts/utils/docs/resolve-cargo-manifest.md +27 -0
- package/scripts/utils/docs/resolve-cmd.md +33 -0
- package/scripts/utils/docs/resolve-js-root.md +26 -0
- package/scripts/utils/docs/test-helpers.md +30 -0
- package/scripts/utils/docs/walk-cache.md +31 -0
- package/scripts/utils/docs/walkDir.md +31 -0
- package/scripts/utils/docs/with-lock.md +30 -0
- package/scripts/utils/docs/worktree-fingerprint.md +31 -0
- package/scripts/utils/ensure-gitignore-entries.mjs +30 -0
- package/scripts/utils/find-package-json-paths.mjs +30 -0
- package/scripts/utils/lock-cache-dir.mjs +37 -0
- package/scripts/utils/pass.mjs +9 -0
- package/scripts/utils/resolve-cargo-manifest.mjs +62 -0
- package/scripts/utils/resolve-cmd.mjs +25 -0
- package/scripts/utils/resolve-js-root.mjs +61 -0
- package/scripts/utils/walk-cache.mjs +24 -0
- package/scripts/utils/walkDir.mjs +55 -0
- package/scripts/utils/with-lock.mjs +190 -0
- package/scripts/utils/worktree-fingerprint.mjs +33 -0
- package/skills/adr-normalize/SKILL.md +73 -0
- package/skills/adr-normalize/main.json +1 -0
- package/skills/brainstorming/SKILL.md +165 -0
- package/skills/brainstorming/main.json +1 -0
- package/skills/doc-aggregate/SKILL.md +121 -0
- package/skills/doc-aggregate/js/docs/index.md +11 -0
- package/skills/doc-aggregate/main.json +1 -0
- package/skills/doc-files/.changes/260612-0002.md +6 -0
- package/skills/doc-files/.changes/260612-0006.md +6 -0
- package/skills/doc-files/.changes/260612-0008.md +6 -0
- package/skills/doc-files/.changes/260612-0012.md +6 -0
- package/skills/doc-files/.changes/260612-0031.md +6 -0
- package/skills/doc-files/.changes/260612-0036.md +6 -0
- package/skills/doc-files/.changes/260612-0114.md +6 -0
- package/skills/doc-files/SKILL.md +86 -0
- package/skills/doc-files/main.json +1 -0
- package/skills/lint/SKILL.md +121 -0
- package/skills/lint/main.json +1 -0
- package/skills/llm-patch/SKILL.md +260 -0
- package/skills/llm-patch/main.json +1 -0
- package/skills/publish-telegram/SKILL.md +93 -0
- package/skills/publish-telegram/main.json +1 -0
- package/skills/taze/SKILL.md +114 -0
- package/skills/taze/js/diff.mjs +140 -0
- package/skills/taze/js/docs/diff.md +55 -0
- package/skills/taze/js/docs/index.md +11 -0
- package/skills/taze/main.json +1 -0
- package/types/bin/n-rules.d.ts +2 -0
|
@@ -0,0 +1,732 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central fix-pipeline unified lint surface (spec 2026-06-29 §Fix Role / §Tier Ladder).
|
|
3
|
+
*
|
|
4
|
+
* Послідовно, per concern:
|
|
5
|
+
* detect → (clean: keep) → T0 (permanent, поза rollback) → snapshot S1 →
|
|
6
|
+
* detect → (clean: keep) → ladder[restore S1 → worker → detect]* → (exhausted: rollback S1)
|
|
7
|
+
*
|
|
8
|
+
* Ролі чесні: detector тільки виявляє; T0 і worker тільки змінюють; success визначає
|
|
9
|
+
* ВИКЛЮЧНО canonical re-detect. Worker не володіє rollback/tier/ladder — лише один attempt.
|
|
10
|
+
* @typedef {import('./types.mjs').LintContext} LintContext
|
|
11
|
+
* @typedef {import('./types.mjs').LintViolation} LintViolation
|
|
12
|
+
* @typedef {import('./types.mjs').FixContext} FixContext
|
|
13
|
+
* @typedef {import('./types.mjs').T0Pattern} T0Pattern
|
|
14
|
+
* @typedef {import('./run-detectors.mjs').PlanItem} PlanItem
|
|
15
|
+
* @typedef {import('./ladder.mjs').Rung} Rung
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync } from 'node:fs'
|
|
18
|
+
import { join, relative } from 'node:path'
|
|
19
|
+
import { pathToFileURL } from 'node:url'
|
|
20
|
+
|
|
21
|
+
import { LOCAL_MIN, CLOUD_MIN, CLOUD_AVG, isLocalModel } from '@7n/llm-lib/model-tiers'
|
|
22
|
+
import { startChain } from '@7n/llm-lib/chain'
|
|
23
|
+
import { writeTrace } from '@7n/llm-lib/trace'
|
|
24
|
+
import { withTimeout } from '@7n/llm-lib/with-timeout'
|
|
25
|
+
import { buildDetectPlan } from './run-detectors.mjs'
|
|
26
|
+
import { runConcernDetector, DetectorError } from './detect.mjs'
|
|
27
|
+
import { renderViolations } from './render.mjs'
|
|
28
|
+
import { createSnapshot } from './snapshot.mjs'
|
|
29
|
+
import { findCollateralEdits, realpathBestEffort } from './collateral-veto.mjs'
|
|
30
|
+
import { createProgressReporter } from './progress.mjs'
|
|
31
|
+
import { buildLadder, decideAfterFailure, DEFAULT_MAX_AVG } from './ladder.mjs'
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Стабільний ключ одиниці прогресу для ProgressReporter.
|
|
35
|
+
* @param {PlanItem} item Елемент плану.
|
|
36
|
+
* @returns {string} `rule/concern`
|
|
37
|
+
*/
|
|
38
|
+
function progressKey(item) {
|
|
39
|
+
return `${item.entry.ruleId}/${item.entry.concern.name}`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Завантажує structured T0-патерни concern-а з `fix-<concern>.mjs`.
|
|
44
|
+
* @param {string} concernDir Директорія concern-а, де шукати fix-модуль.
|
|
45
|
+
* @param {string} concernName Ім'я concern-а для формування назви fix-файлу.
|
|
46
|
+
* @returns {Promise<T0Pattern[]>} Масив T0-патернів або порожній, якщо файл відсутній.
|
|
47
|
+
*/
|
|
48
|
+
async function loadT0Patterns(concernDir, concernName) {
|
|
49
|
+
const fixPath = join(concernDir, `fix-${concernName}.mjs`)
|
|
50
|
+
if (!existsSync(fixPath)) return []
|
|
51
|
+
try {
|
|
52
|
+
// eslint-disable-next-line no-unsanitized/method
|
|
53
|
+
const mod = await import(pathToFileURL(fixPath).href)
|
|
54
|
+
return Array.isArray(mod.patterns) ? mod.patterns : []
|
|
55
|
+
} catch {
|
|
56
|
+
return []
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Резолвить fix-worker concern-а з `fix-worker.mjs` (експорт `fixWorker`).
|
|
62
|
+
* @param {string} concernDir Директорія concern-а, де шукати fix-worker.mjs.
|
|
63
|
+
* @returns {Promise<import('./types.mjs').FixWorkerFn|null>} Функція-worker або null, якщо відсутня.
|
|
64
|
+
*/
|
|
65
|
+
async function loadFixWorker(concernDir) {
|
|
66
|
+
const workerPath = join(concernDir, 'fix-worker.mjs')
|
|
67
|
+
if (!existsSync(workerPath)) return null
|
|
68
|
+
try {
|
|
69
|
+
// eslint-disable-next-line no-unsanitized/method
|
|
70
|
+
const mod = await import(pathToFileURL(workerPath).href)
|
|
71
|
+
return typeof mod.fixWorker === 'function' ? mod.fixWorker : null
|
|
72
|
+
} catch {
|
|
73
|
+
return null
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Застосовує T0-патерни (детерміновано, permanent — поза rollback). `standalone: true`
|
|
79
|
+
* (spec docs/specs/2026-07-02-text-check-per-file-split-design.md §8, Phase 2) обходить
|
|
80
|
+
* `test()`-гейт: патерн сам ідемпотентний і самоаналізуючий (напр. `oxfmt --write`) — не
|
|
81
|
+
* потребує per-violation даних, щоб вирішити, чи запускати `apply()`.
|
|
82
|
+
* @param {T0Pattern[]} patterns Список T0-патернів для перевірки й застосування.
|
|
83
|
+
* @param {LintViolation[]} violations Порушення свого concern-а.
|
|
84
|
+
* @param {LintContext} ctx Контекст лінту (cwd, ruleId, concernId тощо).
|
|
85
|
+
* @param {(s: string) => void} log Логер для повідомлень про застосовані патерни.
|
|
86
|
+
* @returns {Promise<Array<{ id: string, message: string|null, touchedFiles: string[] }>>} Застосовані патерни з їхніми змінами.
|
|
87
|
+
*/
|
|
88
|
+
async function applyT0(patterns, violations, ctx, log) {
|
|
89
|
+
const applied = []
|
|
90
|
+
for (const p of patterns) {
|
|
91
|
+
if (!p.standalone && !p.test(violations)) continue
|
|
92
|
+
const res = await p.apply(violations, ctx)
|
|
93
|
+
if (res && Array.isArray(res.touchedFiles)) {
|
|
94
|
+
applied.push({ id: p.id, message: res.message ?? null, touchedFiles: res.touchedFiles })
|
|
95
|
+
if (res.message) log(` ⚙️ T0 ${ctx.ruleId}/${ctx.concernId}: ${res.message}\n`)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return applied
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Чи всі T0-патерни concern-а позначені `standalone: true` (і їх принаймні один) —
|
|
103
|
+
* такий concern пропускає початковий detect у fix-режимі: `apply()` викликається
|
|
104
|
+
* безумовно (ідемпотентно), а post-T0 re-detect сам стає джерелом правди "чи були
|
|
105
|
+
* порушення" (spec §8, Phase 2). Змішаний набір (частина standalone, частина ні) —
|
|
106
|
+
* НЕ підпадає: бодай один патерн, якому потрібні реальні violations, вимагає
|
|
107
|
+
* початкового detect для всього concern-а.
|
|
108
|
+
* @param {T0Pattern[]} patterns T0-патерни concern-а.
|
|
109
|
+
* @returns {boolean} true — concern можна фіксити без початкового detect.
|
|
110
|
+
*/
|
|
111
|
+
function isStandaloneConcern(patterns) {
|
|
112
|
+
return patterns.length > 0 && patterns.every(p => p.standalone === true)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Re-detect одного concern-а (canonical verdict). Кидає DetectorError → пробрасується.
|
|
117
|
+
* Кожен знімок живить ProgressReporter — тикер «знайдено/виправлено» оновлюється
|
|
118
|
+
* саме тут, після кожного canonical detect.
|
|
119
|
+
* @param {PlanItem} item Елемент плану з entry та переліком файлів.
|
|
120
|
+
* @param {string} cwd Робоча директорія для запуску детектора.
|
|
121
|
+
* @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
|
|
122
|
+
* @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
|
|
123
|
+
* @returns {Promise<LintViolation[]>} Актуальні порушення concern-а після re-detect.
|
|
124
|
+
*/
|
|
125
|
+
async function reDetect(item, cwd, progress = null, verbose = false) {
|
|
126
|
+
const ctx = { cwd, ruleId: item.entry.ruleId, concernId: item.entry.concern.name, files: item.files, verbose }
|
|
127
|
+
const res = await runConcernDetector(item.entry.concern, ctx)
|
|
128
|
+
progress?.detectSnapshot(progressKey(item), res.violations.length)
|
|
129
|
+
return res.violations
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Резолвить worker concern-а: override → concern-specific fix-worker.mjs → дефолтний pi-agent.
|
|
134
|
+
* @param {string} concernDir Директорія concern-а.
|
|
135
|
+
* @param {import('./types.mjs').FixWorkerFn|null} [workerOverride] Worker-override для тестів.
|
|
136
|
+
* @returns {Promise<import('./types.mjs').FixWorkerFn|null>} Резолвлений worker або null.
|
|
137
|
+
*/
|
|
138
|
+
async function resolveWorker(concernDir, workerOverride) {
|
|
139
|
+
const worker = workerOverride ?? (await loadFixWorker(concernDir))
|
|
140
|
+
if (worker) return worker
|
|
141
|
+
const defaultWorkerMod = await import('./default-worker.mjs')
|
|
142
|
+
return defaultWorkerMod.fixWorker
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Фаза T0: застосовує детерміновані патерни й re-detect. Повертає стан фази.
|
|
147
|
+
* @param {PlanItem} item Елемент плану.
|
|
148
|
+
* @param {LintViolation[]} initialViolations Порушення до T0.
|
|
149
|
+
* @param {T0Pattern[]} patterns T0-патерни concern-а.
|
|
150
|
+
* @param {LintContext} lintCtx Контекст лінту.
|
|
151
|
+
* @param {string} cwd Робоча директорія.
|
|
152
|
+
* @param {(s: string) => void} log Логер.
|
|
153
|
+
* @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
|
|
154
|
+
* @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
|
|
155
|
+
* @returns {Promise<{ closed: boolean, violations: LintViolation[], applied: Array<{ id: string, message: string|null, touchedFiles: string[] }> }>} closed=true якщо concern закрито T0; applied — застосовані патерни з їхніми змінами.
|
|
156
|
+
*/
|
|
157
|
+
async function runT0Phase(item, initialViolations, patterns, lintCtx, cwd, log, progress = null, verbose = false) {
|
|
158
|
+
if (patterns.length === 0) return { closed: false, violations: initialViolations, applied: [] }
|
|
159
|
+
progress?.concernStart(progressKey(item), 'T0')
|
|
160
|
+
const applied = await applyT0(patterns, initialViolations, lintCtx, log)
|
|
161
|
+
const afterT0 = await reDetect(item, cwd, progress, verbose)
|
|
162
|
+
if (afterT0.length === 0) {
|
|
163
|
+
log(` ✅ T0: ${lintCtx.ruleId}/${lintCtx.concernId}\n`)
|
|
164
|
+
return { closed: true, violations: afterT0, applied }
|
|
165
|
+
}
|
|
166
|
+
return { closed: false, violations: afterT0, applied }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @typedef {{ previousModel: string, previousError: string|null }} FixFeedback
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @typedef {{ action: 'break'|'skip-model'|null, violations: LintViolation[], feedback: FixFeedback }} RungOutcome
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Проводить один rung ladder-а: worker → canonical re-detect → rollback при провалі.
|
|
179
|
+
* @param {Rung} rung Поточна сходинка ladder-а.
|
|
180
|
+
* @param {import('./types.mjs').FixWorkerFn} worker Fix-worker concern-а.
|
|
181
|
+
* @param {LintViolation[]} violations Актуальні порушення на вході в rung.
|
|
182
|
+
* @param {FixFeedback|null} feedback Feedback з попереднього rung-а.
|
|
183
|
+
* @param {object} rungDeps Залежності rung-а.
|
|
184
|
+
* @param {PlanItem} rungDeps.item Елемент плану.
|
|
185
|
+
* @param {string} rungDeps.cwd Робоча директорія.
|
|
186
|
+
* @param {ReturnType<typeof createSnapshot>} rungDeps.snapshot Snapshot S1.
|
|
187
|
+
* @param {(s: string) => void} rungDeps.log Логер.
|
|
188
|
+
* @param {import('./progress.mjs').ProgressReporter|null} [rungDeps.progress] Reporter прогресу.
|
|
189
|
+
* @param {boolean} [rungDeps.verbose] Детальний вивід (прокидається у ctx concern-а).
|
|
190
|
+
* @returns {Promise<{ closed: true, touchedFiles: string[] } | { closed: false, outcome: RungOutcome }>} closed=true якщо concern закрито (touchedFiles — зміни worker-а); інакше результат для наступного кроку.
|
|
191
|
+
*/
|
|
192
|
+
async function runRung(rung, worker, violations, feedback, rungDeps) {
|
|
193
|
+
const { item, cwd, snapshot, log, progress = null, verbose = false, chain = null } = rungDeps
|
|
194
|
+
const { ruleId } = item.entry
|
|
195
|
+
const concernName = item.entry.concern.name
|
|
196
|
+
progress?.concernStart(progressKey(item), rung.tier)
|
|
197
|
+
|
|
198
|
+
/** @type {FixContext} */
|
|
199
|
+
const fixCtx = {
|
|
200
|
+
cwd,
|
|
201
|
+
ruleId,
|
|
202
|
+
concernId: concernName,
|
|
203
|
+
files: item.files,
|
|
204
|
+
tier: rung.tier,
|
|
205
|
+
model: rung.model,
|
|
206
|
+
timeoutMs: rung.timeoutMs,
|
|
207
|
+
feedback: rung.feedback ? feedback : undefined,
|
|
208
|
+
recordWrite: absPath => snapshot.record(absPath),
|
|
209
|
+
recordDurableWrite: absPath => snapshot.recordDurable(absPath),
|
|
210
|
+
chain,
|
|
211
|
+
// Evidence-гейт рунга (Фаза A1): item-scoped canonical re-detect для verify-петлі
|
|
212
|
+
// всередині worker-а. ДетекторError тут ковтається у {ok:false} — зовнішній
|
|
213
|
+
// canonical re-detect нижче вдарить у той самий детектор і кине штатно.
|
|
214
|
+
verify: async () => {
|
|
215
|
+
let after
|
|
216
|
+
try {
|
|
217
|
+
after = await reDetect(item, cwd, progress, verbose)
|
|
218
|
+
} catch (detectError) {
|
|
219
|
+
return { ok: false, output: `detector error: ${detectError.message}` }
|
|
220
|
+
}
|
|
221
|
+
return { ok: after.length === 0, output: renderViolations(after) }
|
|
222
|
+
},
|
|
223
|
+
// Local-тири повільні — одна додаткова ітерація; cloud тягне дві.
|
|
224
|
+
verifyMax: isLocalModel(rung.model) ? 1 : 2
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
let workerResult = null
|
|
228
|
+
let error = null
|
|
229
|
+
try {
|
|
230
|
+
// Первинний таймаут — у самому worker-і (ctx.timeoutMs → runAgentFix abort-ить
|
|
231
|
+
// сесію). Backstop ×1.25 страхує від worker-а, що ігнорує ctx.timeoutMs
|
|
232
|
+
// (ADR 260620-0556: зависла cloud-SSE без гонки блокувала lint назавжди);
|
|
233
|
+
// запас гарантує, що штатно першим спрацьовує внутрішній abort-шлях.
|
|
234
|
+
workerResult = await withTimeout(worker(violations, fixCtx), Math.round(rung.timeoutMs * 1.25), {
|
|
235
|
+
label: 'fix'
|
|
236
|
+
})
|
|
237
|
+
} catch (workerError) {
|
|
238
|
+
error = workerError.message
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Canonical re-detect = джерело правди.
|
|
242
|
+
let after
|
|
243
|
+
try {
|
|
244
|
+
after = await reDetect(item, cwd, progress, verbose)
|
|
245
|
+
} catch (detectError) {
|
|
246
|
+
if (detectError instanceof DetectorError) throw detectError
|
|
247
|
+
throw detectError
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Semantic-collateral veto (§12 addendum 2026-07-05): clean-вердикт не приймається,
|
|
251
|
+
// якщо rung ЗМІНИВ наявні файли поза target-set порушення (клас «App.vue: хардкод
|
|
252
|
+
// версії замість getVersion»). Нові файли дозволені (scaffold/доки); порожній
|
|
253
|
+
// target-set (whole-repo концерни без file-атрибуції) → veto незастосовний.
|
|
254
|
+
const targetFiles = [...new Set([...violations.map(v => v.file).filter(Boolean), ...(item.files ?? [])])]
|
|
255
|
+
const collateral = findCollateralEdits({ modifiedExisting: snapshot.modifiedExisting(), targetFiles, cwd })
|
|
256
|
+
// relative — від так само realpath-нормалізованого cwd, інакше symlink-cwd (macOS
|
|
257
|
+
// /var → /private/var) дає `../../…`-шляхи у телеметрії та feedback.
|
|
258
|
+
const rejectedRel = collateral.map(p => relative(realpathBestEffort(cwd), p))
|
|
259
|
+
if (collateral.length > 0) {
|
|
260
|
+
// Телеметрія відхилених правок — той самий глобальний llm-trace, що й fix-виклики.
|
|
261
|
+
writeTrace({
|
|
262
|
+
caller: `fix:${ruleId}/${concernName}:${rung.tier}`,
|
|
263
|
+
backend: 'pi-ai',
|
|
264
|
+
kind: 'collateral-veto',
|
|
265
|
+
rule: ruleId,
|
|
266
|
+
rung: rung.tier,
|
|
267
|
+
model: rung.model,
|
|
268
|
+
cwd,
|
|
269
|
+
rejectedFiles: rejectedRel,
|
|
270
|
+
targetFiles,
|
|
271
|
+
cleanDetect: after.length === 0
|
|
272
|
+
})
|
|
273
|
+
}
|
|
274
|
+
const vetoed = after.length === 0 && !error && collateral.length > 0
|
|
275
|
+
const touchedFiles = workerResult?.touchedFiles ?? []
|
|
276
|
+
|
|
277
|
+
if (after.length === 0 && !error && !vetoed) {
|
|
278
|
+
log(` ✅ ${rung.tier} (${rung.model}): ${ruleId}/${concernName}\n`)
|
|
279
|
+
// Фаза C: успішний agentic-фікс (canonical clean, без veto) → глобальний
|
|
280
|
+
// distillation-стор (§13 pi-migration: корпус oldText→newText для маховика T0).
|
|
281
|
+
// Best-effort і лише за наявності реальних правок (T0/manual-фікси не пишемо).
|
|
282
|
+
const edits = workerResult?.telemetry?.edits
|
|
283
|
+
if (Array.isArray(edits) && edits.length > 0) {
|
|
284
|
+
const { recordFixTelemetry } = await import('@7n/llm-lib/telemetry-store')
|
|
285
|
+
recordFixTelemetry({
|
|
286
|
+
rule: ruleId,
|
|
287
|
+
concern: concernName,
|
|
288
|
+
rung: rung.tier,
|
|
289
|
+
model: rung.model,
|
|
290
|
+
cwd,
|
|
291
|
+
edits,
|
|
292
|
+
verifyAttempts: workerResult?.telemetry?.verifyAttempts?.length ?? 0,
|
|
293
|
+
anchoredEdits: workerResult?.telemetry?.anchoredEdits ?? false
|
|
294
|
+
})
|
|
295
|
+
}
|
|
296
|
+
return { closed: true, touchedFiles }
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
let errorSuffix = ' ❌ досі порушено'
|
|
300
|
+
if (error) errorSuffix = ` ❌ ${error.slice(0, 120)}`
|
|
301
|
+
else if (vetoed) errorSuffix = ` 🚫 collateral-veto: ${rejectedRel.join(', ')}`
|
|
302
|
+
log(` ⚡ ${rung.tier} (${rung.model}): ${ruleId}/${concernName}${errorSuffix}\n`)
|
|
303
|
+
|
|
304
|
+
// Не clean → restore S1 перед наступним rung-ом (degraded не тече далі).
|
|
305
|
+
// Durable-write-и worker-а (recordDurableWrite) rollback НЕ чіпає: кожен такий файл —
|
|
306
|
+
// самодостатній кінцевий стан (doc-files-батч), і прогрес по ньому вже зарахований
|
|
307
|
+
// canonical re-detect-ом вище — наступний rung/прогін продовжує з решти, не з нуля.
|
|
308
|
+
snapshot.rollback()
|
|
309
|
+
|
|
310
|
+
// Мовчазна невдача (worker не кинув виняток, але порушення лишилось) — без цього
|
|
311
|
+
// наступний rung стартує без жодного знання про попередню спробу (buildFixPrompt
|
|
312
|
+
// додає `## Попередня спроба` лише коли previousError truthy).
|
|
313
|
+
let silentFailureNote
|
|
314
|
+
if (vetoed) {
|
|
315
|
+
silentFailureNote =
|
|
316
|
+
`Попередня спроба (${rung.model}) закрила порушення, але змінила наявні файли поза ` +
|
|
317
|
+
`target-set (${rejectedRel.join(', ')}) — усі правки відхилено. ` +
|
|
318
|
+
`Редагуй ЛИШЕ файли порушення: ${targetFiles.join(', ')}.`
|
|
319
|
+
} else if (touchedFiles.length === 0) {
|
|
320
|
+
silentFailureNote = `Попередня спроба (${rung.model}) не внесла жодної зміни у файли; порушення досі активне.`
|
|
321
|
+
} else {
|
|
322
|
+
silentFailureNote =
|
|
323
|
+
`Попередня спроба (${rung.model}) торкнулась файлів (${touchedFiles.join(', ')}), ` +
|
|
324
|
+
'але порушення досі активне — той самий підхід не спрацював, спробуй інакше.'
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
closed: false,
|
|
329
|
+
outcome: {
|
|
330
|
+
action: decideAfterFailure(rung, error),
|
|
331
|
+
violations: after.length > 0 ? after : violations,
|
|
332
|
+
feedback: { previousModel: rung.model, previousError: error ?? silentFailureNote }
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Кеп telemetry-списку змінених файлів у extra ланцюжка (повний обсяг — touchedTotal). */
|
|
338
|
+
const TOUCHED_FILES_CAP = 20
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Стислий опис проблеми concern-а для шапки ланцюжка (`extra.problem` фінального
|
|
342
|
+
* chain-запису) — щоб в аналітиці (myllm, chains-report) було видно, ЩО саме
|
|
343
|
+
* вирішував ланцюжок, а не лише rule/concern.
|
|
344
|
+
* @param {LintViolation[]} violations Порушення concern-а.
|
|
345
|
+
* @returns {{ violations: number, reasons: string[], files: string[], sample: string|null }|null} Зведення або null, якщо порушень нема.
|
|
346
|
+
*/
|
|
347
|
+
function summarizeProblem(violations) {
|
|
348
|
+
if (!violations?.length) return null
|
|
349
|
+
return {
|
|
350
|
+
violations: violations.length,
|
|
351
|
+
reasons: [...new Set(violations.map(v => v.reason))].slice(0, 5),
|
|
352
|
+
files: [...new Set(violations.map(v => v.file).filter(Boolean))].slice(0, 10),
|
|
353
|
+
sample: violations[0]?.message?.slice(0, 200) ?? null
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Проводить ОДИН concern по pipeline: T0 → S1 → ladder. Повертає чи закрито.
|
|
359
|
+
* @param {PlanItem} item Елемент плану з entry та переліком файлів.
|
|
360
|
+
* @param {LintViolation[]} initialViolations Початкові порушення concern-а до fix.
|
|
361
|
+
* @param {object} deps Залежності pipeline.
|
|
362
|
+
* @param {string} deps.cwd Робоча директорія.
|
|
363
|
+
* @param {Rung[]} deps.ladder Сходинки ladder-а (tier/model послідовність).
|
|
364
|
+
* @param {() => number} deps.avgRemaining Скільки avg-бюджету лишилось.
|
|
365
|
+
* @param {(n: number) => void} deps.spendAvg Списати n одиниць avg-бюджету.
|
|
366
|
+
* @param {import('./types.mjs').FixWorkerFn|null} [deps.workerOverride] Worker-override для тестів.
|
|
367
|
+
* @param {T0Pattern[]} [deps.t0Override] T0-патерни override для тестів.
|
|
368
|
+
* @param {(s: string) => void} deps.log Логер прогресу.
|
|
369
|
+
* @param {import('./progress.mjs').ProgressReporter|null} [deps.progress] Reporter прогресу.
|
|
370
|
+
* @param {boolean} [deps.verbose] Детальний вивід (прокидається у ctx concern-а).
|
|
371
|
+
* @param {typeof startChain} [deps.chainFactory] Фабрика ланцюжка (інжект для тестів).
|
|
372
|
+
* @returns {Promise<boolean>} Чи закрито concern (усі порушення усунено).
|
|
373
|
+
*/
|
|
374
|
+
export async function fixConcern(item, initialViolations, deps) {
|
|
375
|
+
const { ruleId } = item.entry
|
|
376
|
+
const concernName = item.entry.concern.name
|
|
377
|
+
// Ланцюжок concern-а охоплює і T0: закриття без жодного LLM-виклику (steps:0,
|
|
378
|
+
// t0Closed) — золотий baseline для метрики дистиляції.
|
|
379
|
+
const chain = (deps.chainFactory ?? startChain)({
|
|
380
|
+
kind: 'fix-concern',
|
|
381
|
+
unit: `${ruleId}/${concernName}`,
|
|
382
|
+
cwd: deps.cwd
|
|
383
|
+
})
|
|
384
|
+
const chainExtra = {
|
|
385
|
+
t0Closed: false,
|
|
386
|
+
stop: null,
|
|
387
|
+
rungs: [],
|
|
388
|
+
rollbacks: 0,
|
|
389
|
+
avgCapSkipped: 0,
|
|
390
|
+
// Шапка ланцюжка в аналітиці: яку проблему вирішували, хто закрив (t0 |
|
|
391
|
+
// tier:model), і до яких змін файлів це привело (permanent T0 + closing rung;
|
|
392
|
+
// rollback-нуті rung-и сюди не потрапляють).
|
|
393
|
+
problem: summarizeProblem(initialViolations),
|
|
394
|
+
resolvedBy: null,
|
|
395
|
+
t0Applied: [],
|
|
396
|
+
touchedFiles: [],
|
|
397
|
+
touchedTotal: 0
|
|
398
|
+
}
|
|
399
|
+
// Абсолютні шляхи змін накопичуються тут і нормалізуються один раз у finally
|
|
400
|
+
// (cwd-relative, дедуп, кеп) — щоб у trace не текли абсолютні шляхи машини.
|
|
401
|
+
const touchedAbs = []
|
|
402
|
+
let closed = false
|
|
403
|
+
try {
|
|
404
|
+
closed = await fixConcernCore(item, initialViolations, deps, chain, chainExtra, touchedAbs)
|
|
405
|
+
return closed
|
|
406
|
+
} finally {
|
|
407
|
+
const base = realpathBestEffort(deps.cwd)
|
|
408
|
+
const rel = [...new Set(touchedAbs.map(p => relative(base, realpathBestEffort(p))))]
|
|
409
|
+
chainExtra.touchedTotal = rel.length
|
|
410
|
+
chainExtra.touchedFiles = rel.slice(0, TOUCHED_FILES_CAP)
|
|
411
|
+
let outcome = 'fail'
|
|
412
|
+
if (closed) outcome = 'success'
|
|
413
|
+
else if (chainExtra.stop) outcome = 'partial'
|
|
414
|
+
chain.end({ outcome, extra: chainExtra })
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Фіксує результат T0-фази в телеметрії ланцюжка: застосовані патерни, їхні
|
|
420
|
+
* зміни (permanent — рахуються навіть якщо concern далі не закрився) і
|
|
421
|
+
* resolvedBy='t0' при закритті.
|
|
422
|
+
* @param {{ closed: boolean, applied: Array<{ id: string, message: string|null, touchedFiles: string[] }> }} t0 Результат runT0Phase.
|
|
423
|
+
* @param {{ t0Closed: boolean, resolvedBy: string|null, t0Applied: object[] }} chainExtra Акумулятор extra.
|
|
424
|
+
* @param {string[]} touchedAbs Акумулятор абсолютних шляхів змін.
|
|
425
|
+
* @returns {void}
|
|
426
|
+
*/
|
|
427
|
+
function noteT0Phase(t0, chainExtra, touchedAbs) {
|
|
428
|
+
if (t0.applied.length > 0) {
|
|
429
|
+
chainExtra.t0Applied = t0.applied.map(a => ({ id: a.id, message: a.message }))
|
|
430
|
+
touchedAbs.push(...t0.applied.flatMap(a => a.touchedFiles))
|
|
431
|
+
}
|
|
432
|
+
if (t0.closed) {
|
|
433
|
+
chainExtra.t0Closed = true
|
|
434
|
+
chainExtra.resolvedBy = 't0'
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Тіло fix-pipeline одного concern-а (T0 → S1 → ladder); chain/chainExtra — акумулятори
|
|
440
|
+
* телеметрії ланцюжка (володіє ними fixConcern-обгортка).
|
|
441
|
+
* @param {PlanItem} item Елемент плану.
|
|
442
|
+
* @param {LintViolation[]} initialViolations Початкові порушення.
|
|
443
|
+
* @param {object} deps Залежності pipeline (див. fixConcern).
|
|
444
|
+
* @param {object} chain Chain handle.
|
|
445
|
+
* @param {{ t0Closed: boolean, stop: string|null, rungs: object[], rollbacks: number, avgCapSkipped: number, problem: object|null, resolvedBy: string|null, t0Applied: object[] }} chainExtra Акумулятор extra.
|
|
446
|
+
* @param {string[]} touchedAbs Акумулятор абсолютних шляхів реально збережених змін (T0 + closing rung).
|
|
447
|
+
* @returns {Promise<boolean>} Чи закрито concern.
|
|
448
|
+
*/
|
|
449
|
+
async function fixConcernCore(item, initialViolations, deps, chain, chainExtra, touchedAbs) {
|
|
450
|
+
const { cwd, ladder, log, progress = null, verbose = false } = deps
|
|
451
|
+
const { ruleId } = item.entry
|
|
452
|
+
const concernName = item.entry.concern.name
|
|
453
|
+
const concernDir = item.entry.concern.dir
|
|
454
|
+
/** @type {LintContext} */
|
|
455
|
+
const lintCtx = { cwd, ruleId, concernId: concernName, concernDir, files: item.files, verbose }
|
|
456
|
+
|
|
457
|
+
// ── T0 (детермінований, permanent) ──
|
|
458
|
+
const patterns = deps.t0Override ?? (await loadT0Patterns(concernDir, concernName))
|
|
459
|
+
const t0 = await runT0Phase(item, initialViolations, patterns, lintCtx, cwd, log, progress, verbose)
|
|
460
|
+
noteT0Phase(t0, chainExtra, touchedAbs)
|
|
461
|
+
if (t0.closed) return true
|
|
462
|
+
initialViolations = t0.violations
|
|
463
|
+
// Standalone-концерни стартують без початкового detect (problem=null) — перший
|
|
464
|
+
// canonical detect відбувається тут, після T0; фіксуємо його як проблему ланцюжка.
|
|
465
|
+
if (!chainExtra.problem) chainExtra.problem = summarizeProblem(initialViolations)
|
|
466
|
+
|
|
467
|
+
// ── Fixability-гейт ── config/structural concern-и НЕ йдуть у LLM-ladder: їхній фікс
|
|
468
|
+
// детермінований (T0/regen) або ризикований для авто-правки. T0 уже відпрацював вище —
|
|
469
|
+
// якщо не закрив, це сигнал ручного/config-фіксу, а не привід палити tier-и (fail-fast).
|
|
470
|
+
const fixability = item.entry.concern.fixability ?? 'code'
|
|
471
|
+
if (fixability !== 'code') {
|
|
472
|
+
log(` ⏹️ ${ruleId}/${concernName}: fixability=${fixability} — LLM-ladder пропущено (T0/manual)\n`)
|
|
473
|
+
chainExtra.stop = 'fixability'
|
|
474
|
+
return false
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// ── Worker ladder ── concern-specific fix-worker.mjs, інакше дефолтний pi-agent worker.
|
|
478
|
+
const worker = await resolveWorker(concernDir, deps.workerOverride)
|
|
479
|
+
if (!worker || ladder.length === 0) {
|
|
480
|
+
chainExtra.stop = 'no-worker'
|
|
481
|
+
return false
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// S1: знімок post-T0. Один tracker акумулює pre-images; rollback цілить у S1.
|
|
485
|
+
const snapshot = createSnapshot()
|
|
486
|
+
let feedback = null
|
|
487
|
+
let violations = initialViolations
|
|
488
|
+
const skipModels = new Set()
|
|
489
|
+
|
|
490
|
+
for (const rung of ladder) {
|
|
491
|
+
if (skipModels.has(rung.model)) continue
|
|
492
|
+
if (rung.isAvg && deps.avgRemaining() <= 0) {
|
|
493
|
+
log(` ⏭️ ${ruleId}/${concernName}: ${rung.tier} пропущено (avg-кеп вичерпано)\n`)
|
|
494
|
+
chainExtra.avgCapSkipped++
|
|
495
|
+
continue
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const res = await runRung(rung, worker, violations, feedback, {
|
|
499
|
+
item,
|
|
500
|
+
cwd,
|
|
501
|
+
snapshot,
|
|
502
|
+
log,
|
|
503
|
+
progress,
|
|
504
|
+
verbose,
|
|
505
|
+
chain
|
|
506
|
+
})
|
|
507
|
+
if (rung.isAvg) deps.spendAvg(1)
|
|
508
|
+
chainExtra.rungs.push({
|
|
509
|
+
tier: rung.tier,
|
|
510
|
+
model: rung.model,
|
|
511
|
+
error: res.closed ? null : (res.outcome.feedback.previousError ?? '').slice(0, 200)
|
|
512
|
+
})
|
|
513
|
+
if (res.closed) {
|
|
514
|
+
chainExtra.resolvedBy = `${rung.tier}:${rung.model}`
|
|
515
|
+
touchedAbs.push(...res.touchedFiles)
|
|
516
|
+
return true
|
|
517
|
+
}
|
|
518
|
+
chainExtra.rollbacks++
|
|
519
|
+
|
|
520
|
+
violations = res.outcome.violations
|
|
521
|
+
feedback = res.outcome.feedback
|
|
522
|
+
if (res.outcome.action === 'break') break
|
|
523
|
+
if (res.outcome.action === 'skip-model') skipModels.add(rung.model)
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
return false
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Detect-фаза: прогін усіх concern-ів плану. При `DetectorError` — сигнал коду 2.
|
|
531
|
+
* @param {PlanItem[]} plan План прогону.
|
|
532
|
+
* @param {string} cwd Робоча директорія.
|
|
533
|
+
* @param {boolean} verbose Детальний вивід плану.
|
|
534
|
+
* @param {(s: string) => void} log Логер.
|
|
535
|
+
* @param {import('./progress.mjs').ProgressReporter|null} [progress] Reporter прогресу.
|
|
536
|
+
* @returns {Promise<{ code: 2 } | { detected: Array<{ item: PlanItem, violations: LintViolation[] }> }>} код 2 при DetectorError або зібрані результати detect.
|
|
537
|
+
*/
|
|
538
|
+
async function detectAllForFix(plan, cwd, verbose, log, progress = null) {
|
|
539
|
+
/** @type {Array<{ item: PlanItem, violations: LintViolation[] }>} */
|
|
540
|
+
const detected = []
|
|
541
|
+
for (const item of plan) {
|
|
542
|
+
const ctx = { cwd, ruleId: item.entry.ruleId, concernId: item.entry.concern.name, files: item.files, verbose }
|
|
543
|
+
progress?.concernStart(progressKey(item), 'detect')
|
|
544
|
+
if (verbose) {
|
|
545
|
+
const countStr = item.files === undefined ? 'весь репо' : `${item.files.length} файл(ів)`
|
|
546
|
+
log(` 🔍 ${ctx.ruleId}/${ctx.concernId} [${item.entry.concern.lint.scope}] → ${countStr}\n`)
|
|
547
|
+
}
|
|
548
|
+
try {
|
|
549
|
+
const res = await runConcernDetector(item.entry.concern, ctx)
|
|
550
|
+
progress?.detectSnapshot(progressKey(item), res.violations.length)
|
|
551
|
+
detected.push({ item, violations: res.violations })
|
|
552
|
+
} catch (detectError) {
|
|
553
|
+
if (detectError instanceof DetectorError) {
|
|
554
|
+
log(`💥 ${detectError.message}\n`)
|
|
555
|
+
return { code: 2 }
|
|
556
|
+
}
|
|
557
|
+
throw detectError
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return { detected }
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Фінальний render невирішених порушень (після провального fix-проходу).
|
|
565
|
+
* @param {Array<{ item: PlanItem, violations: LintViolation[] }>} failing Провальні concern-и.
|
|
566
|
+
* @param {string} cwd Робоча директорія.
|
|
567
|
+
* @param {(s: string) => void} log Логер.
|
|
568
|
+
* @param {boolean} [verbose] Детальний вивід (прокидається у ctx concern-а).
|
|
569
|
+
* @returns {Promise<void>} нічого не повертає (тільки лог).
|
|
570
|
+
*/
|
|
571
|
+
async function renderRemaining(failing, cwd, log, verbose = false) {
|
|
572
|
+
const remaining = []
|
|
573
|
+
for (const { item } of failing) {
|
|
574
|
+
try {
|
|
575
|
+
remaining.push(...(await reDetect(item, cwd, null, verbose)))
|
|
576
|
+
} catch {
|
|
577
|
+
/* DetectorError на фінальному render — ігноруємо, основний verdict уже worst=1 */
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
if (remaining.length > 0) log(renderViolations(remaining))
|
|
581
|
+
return remaining
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Фаза B: матеріалізує невиправлений хвіст у вузли MT-графа. Єдиний гейт —
|
|
586
|
+
* **onboarded-репо** (наявність `.mt.json`, перевіряє preflight у materializeTail):
|
|
587
|
+
* не-MT-репо → fail-open skip; MT-репо → хвіст стає графом задач, executor яких —
|
|
588
|
+
* наш pi-harness (`ensureNodeExecutor` конфігурує `node_executor`). Env-прапорець
|
|
589
|
+
* скасовано (rollout-guard більше не потрібен — B2/executor-міст у main). Fail-open
|
|
590
|
+
* на всіх рівнях: lint ніколи не падає через MT.
|
|
591
|
+
* @param {LintViolation[]} remaining Невиправлені порушення (з renderRemaining).
|
|
592
|
+
* @param {string} cwd Робоча директорія.
|
|
593
|
+
* @param {(s: string) => void} log Логер.
|
|
594
|
+
* @returns {Promise<void>} нічого не повертає (side-effect: вузли у mt/).
|
|
595
|
+
*/
|
|
596
|
+
async function materializeTailToMt(remaining, cwd, log) {
|
|
597
|
+
if (remaining.length === 0) return
|
|
598
|
+
const { materializeTail } = await import('./mt-tail.mjs')
|
|
599
|
+
try {
|
|
600
|
+
materializeTail({ violations: remaining, cwd, createdAt: new Date().toISOString(), log })
|
|
601
|
+
} catch (error) {
|
|
602
|
+
// Ніколи не валимо lint через MT-матеріалізацію (fail-open навіть на неочікуваному).
|
|
603
|
+
log(` ⏭️ MT-tail помилка (проігноровано): ${error.message}\n`)
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Повний fix-pipeline: detect усе → fix кожен провальний concern → exit code.
|
|
609
|
+
* @param {object} opts Опції запуску pipeline.
|
|
610
|
+
* @param {string} opts.rulesDir Директорія з правилами.
|
|
611
|
+
* @param {string} opts.cwd Робоча директорія.
|
|
612
|
+
* @param {boolean} [opts.full] Прогін по всьому репо замість дельти.
|
|
613
|
+
* @param {string[]} [opts.rules] Перелік ruleId для обмеження прогону.
|
|
614
|
+
* @param {string[]|null} [opts.files] Перелік файлів або null для повного набору.
|
|
615
|
+
* @param {boolean} [opts.verbose] Детальний вивід плану детекції.
|
|
616
|
+
* @param {number} [opts.maxAvg] Ліміт avg-бюджету.
|
|
617
|
+
* @param {(s: string) => void} [opts.log] Логер виводу.
|
|
618
|
+
* @param {boolean} [opts.isTTY] Override TTY-режиму ProgressReporter (тести); типово isTTY stdout.
|
|
619
|
+
* @param {(snap: object) => void} [opts.onProgress] Публікація знімків прогресу назовні (черга lint --full).
|
|
620
|
+
* @param {object} [opts.deps] Інжекти для тестів: { ladder, workerFor, t0For, chainFactory }.
|
|
621
|
+
* @returns {Promise<0|1|2>} Exit code: 0 — чисто, 1 — лишились порушення, 2 — DetectorError.
|
|
622
|
+
*/
|
|
623
|
+
export async function runFixPipeline(opts) {
|
|
624
|
+
const { cwd } = opts
|
|
625
|
+
const baseLog = opts.log ?? (s => process.stdout.write(s))
|
|
626
|
+
const verbose = opts.verbose === true
|
|
627
|
+
const deps = opts.deps ?? {}
|
|
628
|
+
|
|
629
|
+
const plan = await buildDetectPlan(opts)
|
|
630
|
+
|
|
631
|
+
// ProgressReporter (канон scripts.mdc «Прогрес довгих lint/fix-прогонів»):
|
|
632
|
+
// бар по концернах + тикер порушень; TTY/не-TTY розгалуження всередині.
|
|
633
|
+
// onUpdate → publisher черги (--full): процеси в черзі бачать живий прогрес.
|
|
634
|
+
const progress = createProgressReporter({
|
|
635
|
+
total: plan.length,
|
|
636
|
+
log: baseLog,
|
|
637
|
+
isTTY: opts.isTTY,
|
|
638
|
+
onUpdate: opts.onProgress
|
|
639
|
+
})
|
|
640
|
+
const log = progress.log
|
|
641
|
+
|
|
642
|
+
// Преloadимо T0-патерни разом із планом — потрібно, щоб класифікувати standalone-концерни
|
|
643
|
+
// (spec docs/specs/2026-07-02-text-check-per-file-split-design.md §8, Phase 2) ДО початкового
|
|
644
|
+
// detect. Той самий preload передається далі в fixConcern як t0Override — без повторного
|
|
645
|
+
// dynamic import().
|
|
646
|
+
const patternsByItem = new Map(
|
|
647
|
+
await Promise.all(
|
|
648
|
+
plan.map(async item => [
|
|
649
|
+
item,
|
|
650
|
+
deps.t0For
|
|
651
|
+
? (deps.t0For(item.entry) ?? [])
|
|
652
|
+
: await loadT0Patterns(item.entry.concern.dir, item.entry.concern.name)
|
|
653
|
+
])
|
|
654
|
+
)
|
|
655
|
+
)
|
|
656
|
+
const standaloneItems = plan.filter(item => isStandaloneConcern(patternsByItem.get(item)))
|
|
657
|
+
const normalPlan = plan.filter(item => !standaloneItems.includes(item))
|
|
658
|
+
|
|
659
|
+
// try/finally: stop() гарантовано звільняє TTY-рядок (hideCursor) навіть при
|
|
660
|
+
// DetectorError з глибини fix-циклу; сам stop() ідемпотентний.
|
|
661
|
+
try {
|
|
662
|
+
// ── Detect лише для normal-концернів; standalone апляє одразу (без початкового detect) ──
|
|
663
|
+
const detectResult = await detectAllForFix(normalPlan, cwd, verbose, log, progress)
|
|
664
|
+
if ('code' in detectResult) return detectResult.code
|
|
665
|
+
|
|
666
|
+
const failing = detectResult.detected.filter(d => d.violations.length > 0)
|
|
667
|
+
// Чисті концерни закриваються одразу — бар рухається без очікування fix-фази.
|
|
668
|
+
for (const d of detectResult.detected) {
|
|
669
|
+
if (d.violations.length === 0) progress.concernDone(progressKey(d.item))
|
|
670
|
+
}
|
|
671
|
+
if (failing.length === 0 && standaloneItems.length === 0) return 0
|
|
672
|
+
|
|
673
|
+
const ladder = deps.ladder ?? buildLadder({ localMin: LOCAL_MIN, cloudMin: CLOUD_MIN, cloudAvg: CLOUD_AVG })
|
|
674
|
+
let avgBudget = typeof opts.maxAvg === 'number' ? opts.maxAvg : DEFAULT_MAX_AVG
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* @param {PlanItem} item Елемент плану.
|
|
678
|
+
* @param {LintViolation[]} violations Початкові порушення (порожньо для standalone).
|
|
679
|
+
* @returns {Promise<boolean>} Чи закрито concern.
|
|
680
|
+
*/
|
|
681
|
+
const runOne = (item, violations) =>
|
|
682
|
+
fixConcern(item, violations, {
|
|
683
|
+
cwd,
|
|
684
|
+
ladder,
|
|
685
|
+
log,
|
|
686
|
+
progress,
|
|
687
|
+
verbose,
|
|
688
|
+
avgRemaining: () => avgBudget,
|
|
689
|
+
spendAvg: n => {
|
|
690
|
+
avgBudget -= n
|
|
691
|
+
},
|
|
692
|
+
workerOverride: deps.workerFor ? deps.workerFor(item.entry) : undefined,
|
|
693
|
+
t0Override: patternsByItem.get(item),
|
|
694
|
+
chainFactory: deps.chainFactory
|
|
695
|
+
})
|
|
696
|
+
|
|
697
|
+
let worst = 0
|
|
698
|
+
const attemptedForRender = []
|
|
699
|
+
|
|
700
|
+
for (const { item, violations } of failing) {
|
|
701
|
+
if (!(await runOne(item, violations))) {
|
|
702
|
+
worst = 1
|
|
703
|
+
attemptedForRender.push({ item })
|
|
704
|
+
}
|
|
705
|
+
progress.concernDone(progressKey(item))
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
for (const item of standaloneItems) {
|
|
709
|
+
if (verbose) {
|
|
710
|
+
const label = `${item.entry.ruleId}/${item.entry.concern.name}`
|
|
711
|
+
log(` 🔍 ${label} [standalone-merge] → apply без початкового detect\n`)
|
|
712
|
+
}
|
|
713
|
+
if (!(await runOne(item, []))) {
|
|
714
|
+
worst = 1
|
|
715
|
+
attemptedForRender.push({ item })
|
|
716
|
+
}
|
|
717
|
+
progress.concernDone(progressKey(item))
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
// Бар звільняє TTY-рядок ДО фінального render-у невирішених порушень.
|
|
721
|
+
progress.stop()
|
|
722
|
+
if (worst === 1) {
|
|
723
|
+
const remaining = await renderRemaining(attemptedForRender, cwd, baseLog, verbose)
|
|
724
|
+
// B1: невиправлений хвіст → вузли MT (за env-гейтом, fail-open).
|
|
725
|
+
await materializeTailToMt(remaining, cwd, baseLog)
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
return worst
|
|
729
|
+
} finally {
|
|
730
|
+
progress.stop()
|
|
731
|
+
}
|
|
732
|
+
}
|