@harness-engineering/cli 1.13.0 → 1.13.1
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/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
- package/dist/{agents-md-P2RHSUV7.js → agents-md-XU3BHE22.js} +1 -1
- package/dist/{architecture-ESOOE26S.js → architecture-2R5Z4ZAF.js} +2 -2
- package/dist/bin/harness-mcp.js +14 -13
- package/dist/bin/harness.js +22 -21
- package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-2OFZ7OWW.js} +3 -2
- package/dist/{chunk-LD3DKUK5.js → chunk-4ZMOCPYO.js} +1 -1
- package/dist/{chunk-5VY23YK3.js → chunk-65FRIL4D.js} +2 -2
- package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
- package/dist/{chunk-MACVXDZK.js → chunk-DZS7CJKL.js} +4 -4
- package/dist/{chunk-7PZWR4LI.js → chunk-IM32EEDM.js} +9 -9
- package/dist/{chunk-2YPZKGAG.js → chunk-IMFVFNJE.js} +1 -1
- package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
- package/dist/{chunk-MI5XJQDY.js → chunk-ND6PNADU.js} +23 -9
- package/dist/{chunk-7KQSUZVG.js → chunk-NERR4TAO.js} +729 -436
- package/dist/{chunk-PSNN4LWX.js → chunk-NOPU4RZ4.js} +2 -2
- package/dist/{chunk-KELT6K6M.js → chunk-PQ5YK4AY.js} +287 -258
- package/dist/{chunk-WPPDRIJL.js → chunk-QY4T6YAZ.js} +3 -3
- package/dist/{chunk-RZSUJBZZ.js → chunk-SSKDAOX5.js} +31 -28
- package/dist/{chunk-2VU4MFM3.js → chunk-TKJZKICB.js} +6 -6
- package/dist/{chunk-GNGELAXY.js → chunk-TS3XWPW5.js} +1 -1
- package/dist/chunk-UAX4I5ZE.js +217 -0
- package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
- package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
- package/dist/{chunk-3KOLLWWE.js → chunk-Z77YQRQT.js} +11 -207
- package/dist/{ci-workflow-4NYBUG6R.js → ci-workflow-EHV65NQB.js} +1 -1
- package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
- package/dist/{dist-WF4C7A4A.js → dist-2B363XUH.js} +1 -1
- package/dist/{dist-M6BQODWC.js → dist-HXHWB7SV.js} +2 -2
- package/dist/{docs-BPYCN2DR.js → docs-FZOPM4GK.js} +4 -2
- package/dist/{engine-LXLIWQQ3.js → engine-OL4T6NZS.js} +1 -1
- package/dist/{entropy-4VDVV5CR.js → entropy-LVHJMFGH.js} +2 -2
- package/dist/{feedback-63QB5RCA.js → feedback-IHLVLMRD.js} +1 -1
- package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-64S3CLEZ.js} +3 -3
- package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
- package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-GJZ4FN4Y.js} +1 -1
- package/dist/index.d.ts +35 -8
- package/dist/index.js +23 -21
- package/dist/{loader-Z2IT7QX3.js → loader-DPYFB6R6.js} +1 -1
- package/dist/{mcp-KQHEL5IF.js → mcp-JQUI7BVZ.js} +14 -13
- package/dist/{performance-26BH47O4.js → performance-ZTVSUANN.js} +2 -2
- package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-76JHKGSV.js} +1 -1
- package/dist/{runtime-PDWD7UIK.js → runtime-X7U6SC7K.js} +1 -1
- package/dist/{security-UQFUZXEN.js → security-FWQZF2IZ.js} +1 -1
- package/dist/skill-executor-XZLYZYAK.js +8 -0
- package/dist/{validate-N7QJOKFZ.js → validate-GCHZJIL7.js} +2 -2
- package/dist/{validate-cross-check-EDQ5QGTM.js → validate-cross-check-STFHYMAZ.js} +1 -1
- package/package.json +3 -3
- package/dist/skill-executor-RG45LUO5.js +0 -8
|
@@ -3,27 +3,23 @@ import {
|
|
|
3
3
|
Ok
|
|
4
4
|
} from "./chunk-MHBMTPW7.js";
|
|
5
5
|
|
|
6
|
-
// ../core/dist/chunk-
|
|
6
|
+
// ../core/dist/chunk-D6VFA6AS.mjs
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import { relative as relative2 } from "path";
|
|
9
8
|
import { createHash } from "crypto";
|
|
10
9
|
import { minimatch } from "minimatch";
|
|
11
10
|
import { access, constants, readFile } from "fs";
|
|
12
11
|
import { promisify } from "util";
|
|
12
|
+
import { relative } from "path";
|
|
13
13
|
import { glob } from "glob";
|
|
14
|
-
import { dirname, resolve
|
|
15
|
-
import { relative as relative3 } from "path";
|
|
14
|
+
import { dirname, resolve } from "path";
|
|
16
15
|
import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "fs";
|
|
17
16
|
import { randomBytes } from "crypto";
|
|
18
17
|
import { join, dirname as dirname2 } from "path";
|
|
19
|
-
import { relative as relative4 } from "path";
|
|
20
18
|
import { readFile as readFile2 } from "fs/promises";
|
|
21
|
-
import { relative as relative5 } from "path";
|
|
22
|
-
import { relative as relative6 } from "path";
|
|
23
19
|
import { readFile as readFile3, readdir } from "fs/promises";
|
|
24
|
-
import { join as join2
|
|
20
|
+
import { join as join2 } from "path";
|
|
25
21
|
import { readFile as readFile4, readdir as readdir2 } from "fs/promises";
|
|
26
|
-
import { join as join3,
|
|
22
|
+
import { join as join3, dirname as dirname3, resolve as resolve2 } from "path";
|
|
27
23
|
var ArchMetricCategorySchema = z.enum([
|
|
28
24
|
"circular-deps",
|
|
29
25
|
"layer-violations",
|
|
@@ -106,8 +102,7 @@ var ConstraintRuleSchema = z.object({
|
|
|
106
102
|
// forward-compat for governs edges
|
|
107
103
|
});
|
|
108
104
|
function violationId(relativePath, category, normalizedDetail) {
|
|
109
|
-
const
|
|
110
|
-
const input = `${path20}:${category}:${normalizedDetail}`;
|
|
105
|
+
const input = `${relativePath}:${category}:${normalizedDetail}`;
|
|
111
106
|
return createHash("sha256").update(input).digest("hex");
|
|
112
107
|
}
|
|
113
108
|
function constraintRuleId(category, scope, description) {
|
|
@@ -158,6 +153,9 @@ async function readFileContent(path20) {
|
|
|
158
153
|
async function findFiles(pattern, cwd = process.cwd()) {
|
|
159
154
|
return glob(pattern, { cwd, absolute: true });
|
|
160
155
|
}
|
|
156
|
+
function relativePosix(from, to) {
|
|
157
|
+
return relative(from, to).replaceAll("\\", "/");
|
|
158
|
+
}
|
|
161
159
|
function resolveImportPath(importSource, fromFile, _rootDir) {
|
|
162
160
|
if (!importSource.startsWith(".") && !importSource.startsWith("/")) {
|
|
163
161
|
return null;
|
|
@@ -209,8 +207,8 @@ async function buildDependencyGraph(files, parser, graphDependencyData) {
|
|
|
209
207
|
function checkLayerViolations(graph, layers, rootDir) {
|
|
210
208
|
const violations = [];
|
|
211
209
|
for (const edge of graph.edges) {
|
|
212
|
-
const fromRelative =
|
|
213
|
-
const toRelative =
|
|
210
|
+
const fromRelative = relativePosix(rootDir, edge.from);
|
|
211
|
+
const toRelative = relativePosix(rootDir, edge.to);
|
|
214
212
|
const fromLayer = resolveFileToLayer(fromRelative, layers);
|
|
215
213
|
const toLayer = resolveFileToLayer(toRelative, layers);
|
|
216
214
|
if (!fromLayer || !toLayer) continue;
|
|
@@ -436,8 +434,8 @@ var CircularDepsCollector = class {
|
|
|
436
434
|
}
|
|
437
435
|
const { cycles, largestCycle } = result.value;
|
|
438
436
|
const violations = cycles.map((cycle) => {
|
|
439
|
-
const cyclePath = cycle.cycle.map((f) =>
|
|
440
|
-
const firstFile =
|
|
437
|
+
const cyclePath = cycle.cycle.map((f) => relativePosix(rootDir, f)).join(" -> ");
|
|
438
|
+
const firstFile = relativePosix(rootDir, cycle.cycle[0]);
|
|
441
439
|
return {
|
|
442
440
|
id: violationId(firstFile, this.category, cyclePath),
|
|
443
441
|
file: firstFile,
|
|
@@ -499,8 +497,8 @@ var LayerViolationCollector = class {
|
|
|
499
497
|
(v) => v.reason === "WRONG_LAYER"
|
|
500
498
|
);
|
|
501
499
|
const violations = layerViolations.map((v) => {
|
|
502
|
-
const relFile =
|
|
503
|
-
const relImport =
|
|
500
|
+
const relFile = relativePosix(rootDir, v.file);
|
|
501
|
+
const relImport = relativePosix(rootDir, v.imports);
|
|
504
502
|
const detail = `${v.fromLayer} -> ${v.toLayer}: ${relFile} imports ${relImport}`;
|
|
505
503
|
return {
|
|
506
504
|
id: violationId(relFile, this.category, detail),
|
|
@@ -980,7 +978,7 @@ var ComplexityCollector = class {
|
|
|
980
978
|
(v) => v.severity === "error" || v.severity === "warning"
|
|
981
979
|
);
|
|
982
980
|
const violations = filtered.map((v) => {
|
|
983
|
-
const relFile =
|
|
981
|
+
const relFile = relativePosix(rootDir, v.file);
|
|
984
982
|
const idDetail = `${v.metric}:${v.function}`;
|
|
985
983
|
return {
|
|
986
984
|
id: violationId(relFile, this.category, idDetail),
|
|
@@ -1202,7 +1200,7 @@ var CouplingCollector = class {
|
|
|
1202
1200
|
(v) => v.severity === "error" || v.severity === "warning"
|
|
1203
1201
|
);
|
|
1204
1202
|
const violations = filtered.map((v) => {
|
|
1205
|
-
const relFile =
|
|
1203
|
+
const relFile = relativePosix(rootDir, v.file);
|
|
1206
1204
|
const idDetail = `${v.metric}`;
|
|
1207
1205
|
return {
|
|
1208
1206
|
id: violationId(relFile, this.category, idDetail),
|
|
@@ -1266,8 +1264,8 @@ var ForbiddenImportCollector = class {
|
|
|
1266
1264
|
(v) => v.reason === "FORBIDDEN_IMPORT"
|
|
1267
1265
|
);
|
|
1268
1266
|
const violations = forbidden.map((v) => {
|
|
1269
|
-
const relFile =
|
|
1270
|
-
const relImport =
|
|
1267
|
+
const relFile = relativePosix(rootDir, v.file);
|
|
1268
|
+
const relImport = relativePosix(rootDir, v.imports);
|
|
1271
1269
|
const detail = `forbidden import: ${relFile} -> ${relImport}`;
|
|
1272
1270
|
return {
|
|
1273
1271
|
id: violationId(relFile, this.category, detail),
|
|
@@ -1319,10 +1317,10 @@ async function discoverModules(rootDir) {
|
|
|
1319
1317
|
}
|
|
1320
1318
|
}
|
|
1321
1319
|
modules.push({
|
|
1322
|
-
modulePath:
|
|
1320
|
+
modulePath: relativePosix(rootDir, dir),
|
|
1323
1321
|
fileCount: tsFiles.length,
|
|
1324
1322
|
totalLoc,
|
|
1325
|
-
files: tsFiles.map((f) =>
|
|
1323
|
+
files: tsFiles.map((f) => relativePosix(rootDir, f))
|
|
1326
1324
|
});
|
|
1327
1325
|
}
|
|
1328
1326
|
for (const sub of subdirs) {
|
|
@@ -1494,7 +1492,7 @@ var DepDepthCollector = class {
|
|
|
1494
1492
|
}
|
|
1495
1493
|
const moduleMap = /* @__PURE__ */ new Map();
|
|
1496
1494
|
for (const file of allFiles) {
|
|
1497
|
-
const relDir =
|
|
1495
|
+
const relDir = relativePosix(rootDir, dirname3(file));
|
|
1498
1496
|
if (!moduleMap.has(relDir)) moduleMap.set(relDir, []);
|
|
1499
1497
|
moduleMap.get(relDir).push(file);
|
|
1500
1498
|
}
|
|
@@ -1743,19 +1741,18 @@ var archMatchers = {
|
|
|
1743
1741
|
// ../core/dist/index.mjs
|
|
1744
1742
|
import { join as join4, dirname as dirname4 } from "path";
|
|
1745
1743
|
import { minimatch as minimatch2 } from "minimatch";
|
|
1746
|
-
import { basename
|
|
1747
|
-
import { join as join22, basename as basename2
|
|
1748
|
-
import {
|
|
1744
|
+
import { basename } from "path";
|
|
1745
|
+
import { join as join22, basename as basename2 } from "path";
|
|
1746
|
+
import { basename as basename3, dirname as dirname22 } from "path";
|
|
1749
1747
|
import { z as z2 } from "zod";
|
|
1750
1748
|
import * as fs from "fs/promises";
|
|
1751
1749
|
import * as fs2 from "fs/promises";
|
|
1752
1750
|
import { parse } from "@typescript-eslint/typescript-estree";
|
|
1753
|
-
import { join as join32, resolve as resolve3
|
|
1751
|
+
import { join as join32, resolve as resolve3 } from "path";
|
|
1754
1752
|
import { minimatch as minimatch22 } from "minimatch";
|
|
1755
1753
|
import { dirname as dirname32, resolve as resolve22 } from "path";
|
|
1756
1754
|
import { dirname as dirname42, resolve as resolve32 } from "path";
|
|
1757
1755
|
import { minimatch as minimatch3 } from "minimatch";
|
|
1758
|
-
import { relative as relative52 } from "path";
|
|
1759
1756
|
import { readdirSync, statSync } from "fs";
|
|
1760
1757
|
import { join as join42 } from "path";
|
|
1761
1758
|
import * as fs3 from "fs";
|
|
@@ -2157,7 +2154,7 @@ async function checkDocCoverage(domain, options = {}) {
|
|
|
2157
2154
|
try {
|
|
2158
2155
|
const sourceFiles = await findFiles("**/*.{ts,js,tsx,jsx}", sourceDir);
|
|
2159
2156
|
const filteredSourceFiles = sourceFiles.filter((file) => {
|
|
2160
|
-
const relativePath =
|
|
2157
|
+
const relativePath = relativePosix(sourceDir, file);
|
|
2161
2158
|
return !excludePatterns.some((pattern) => {
|
|
2162
2159
|
return minimatch2(relativePath, pattern, { dot: true }) || minimatch2(file, pattern, { dot: true });
|
|
2163
2160
|
});
|
|
@@ -2180,7 +2177,7 @@ async function checkDocCoverage(domain, options = {}) {
|
|
|
2180
2177
|
const undocumented = [];
|
|
2181
2178
|
const gaps = [];
|
|
2182
2179
|
for (const sourceFile of filteredSourceFiles) {
|
|
2183
|
-
const relativePath =
|
|
2180
|
+
const relativePath = relativePosix(sourceDir, sourceFile);
|
|
2184
2181
|
const fileName = basename(sourceFile);
|
|
2185
2182
|
const isDocumented = documentedPaths.has(relativePath) || documentedPaths.has(fileName) || documentedPaths.has(`src/${relativePath}`);
|
|
2186
2183
|
if (isDocumented) {
|
|
@@ -2237,7 +2234,7 @@ async function validateKnowledgeMap(rootDir = process.cwd()) {
|
|
|
2237
2234
|
totalLinks: agentsTotalLinks
|
|
2238
2235
|
} = agentsResult.value;
|
|
2239
2236
|
const existingFiles = await findFiles("**/*", rootDir);
|
|
2240
|
-
const relativeExistingFiles = existingFiles.map((f) =>
|
|
2237
|
+
const relativeExistingFiles = existingFiles.map((f) => relativePosix(rootDir, f));
|
|
2241
2238
|
const brokenLinks = agentsBrokenLinks.map((link) => {
|
|
2242
2239
|
const section = sections.find(
|
|
2243
2240
|
(s) => s.links.some((l) => l.path === link.path && l.line === link.line)
|
|
@@ -2275,7 +2272,7 @@ var DEFAULT_SECTIONS = [
|
|
|
2275
2272
|
function groupByDirectory(files, rootDir) {
|
|
2276
2273
|
const groups = /* @__PURE__ */ new Map();
|
|
2277
2274
|
for (const file of files) {
|
|
2278
|
-
const relativePath =
|
|
2275
|
+
const relativePath = relativePosix(rootDir, file);
|
|
2279
2276
|
const dir = dirname22(relativePath);
|
|
2280
2277
|
if (!groups.has(dir)) {
|
|
2281
2278
|
groups.set(dir, []);
|
|
@@ -2331,7 +2328,7 @@ async function generateAgentsMap(config, graphSections) {
|
|
|
2331
2328
|
allFiles.push(...files);
|
|
2332
2329
|
}
|
|
2333
2330
|
const filteredFiles = allFiles.filter((file) => {
|
|
2334
|
-
const relativePath =
|
|
2331
|
+
const relativePath = relativePosix(rootDir, file);
|
|
2335
2332
|
return !matchesExcludePattern(relativePath, excludePaths);
|
|
2336
2333
|
});
|
|
2337
2334
|
lines.push("## Repository Structure");
|
|
@@ -2359,11 +2356,11 @@ async function generateAgentsMap(config, graphSections) {
|
|
|
2359
2356
|
}
|
|
2360
2357
|
const sectionFiles = await findFiles(section.pattern, rootDir);
|
|
2361
2358
|
const filteredSectionFiles = sectionFiles.filter((file) => {
|
|
2362
|
-
const relativePath =
|
|
2359
|
+
const relativePath = relativePosix(rootDir, file);
|
|
2363
2360
|
return !matchesExcludePattern(relativePath, excludePaths);
|
|
2364
2361
|
});
|
|
2365
2362
|
for (const file of filteredSectionFiles.slice(0, 20)) {
|
|
2366
|
-
lines.push(formatFileLink(
|
|
2363
|
+
lines.push(formatFileLink(relativePosix(rootDir, file)));
|
|
2367
2364
|
}
|
|
2368
2365
|
if (filteredSectionFiles.length > 20) {
|
|
2369
2366
|
lines.push(`- _... and ${filteredSectionFiles.length - 20} more files_`);
|
|
@@ -3548,7 +3545,7 @@ async function buildSnapshot(config) {
|
|
|
3548
3545
|
sourceFilePaths.push(...files2);
|
|
3549
3546
|
}
|
|
3550
3547
|
sourceFilePaths = sourceFilePaths.filter((f) => {
|
|
3551
|
-
const rel =
|
|
3548
|
+
const rel = relativePosix(rootDir, f);
|
|
3552
3549
|
return !excludePatterns.some((p) => minimatch22(rel, p));
|
|
3553
3550
|
});
|
|
3554
3551
|
const files = [];
|
|
@@ -4072,7 +4069,7 @@ async function detectDeadCode(snapshot, graphDeadCodeData) {
|
|
|
4072
4069
|
return Ok(report);
|
|
4073
4070
|
}
|
|
4074
4071
|
function fileMatchesPattern(filePath, pattern, rootDir) {
|
|
4075
|
-
const relativePath =
|
|
4072
|
+
const relativePath = relativePosix(rootDir, filePath);
|
|
4076
4073
|
return minimatch3(relativePath, pattern);
|
|
4077
4074
|
}
|
|
4078
4075
|
function checkConfigPattern(pattern, file, rootDir) {
|
|
@@ -7943,238 +7940,270 @@ var ALL_CHECKS = [
|
|
|
7943
7940
|
"phase-gate",
|
|
7944
7941
|
"arch"
|
|
7945
7942
|
];
|
|
7946
|
-
async function
|
|
7947
|
-
const start = Date.now();
|
|
7943
|
+
async function runValidateCheck(projectRoot, config) {
|
|
7948
7944
|
const issues = [];
|
|
7949
|
-
|
|
7950
|
-
|
|
7951
|
-
|
|
7952
|
-
|
|
7953
|
-
|
|
7954
|
-
|
|
7955
|
-
|
|
7956
|
-
|
|
7957
|
-
if (result.value.errors) {
|
|
7958
|
-
for (const err of result.value.errors) {
|
|
7959
|
-
issues.push({ severity: "error", message: err.message });
|
|
7960
|
-
}
|
|
7961
|
-
}
|
|
7962
|
-
for (const section of result.value.missingSections) {
|
|
7963
|
-
issues.push({ severity: "warning", message: `Missing section: ${section}` });
|
|
7964
|
-
}
|
|
7965
|
-
for (const link of result.value.brokenLinks) {
|
|
7966
|
-
issues.push({
|
|
7967
|
-
severity: "warning",
|
|
7968
|
-
message: `Broken link: ${link.text} \u2192 ${link.path}`,
|
|
7969
|
-
file: link.path
|
|
7970
|
-
});
|
|
7971
|
-
}
|
|
7972
|
-
}
|
|
7973
|
-
break;
|
|
7945
|
+
const agentsPath = path12.join(projectRoot, config.agentsMapPath ?? "AGENTS.md");
|
|
7946
|
+
const result = await validateAgentsMap(agentsPath);
|
|
7947
|
+
if (!result.ok) {
|
|
7948
|
+
issues.push({ severity: "error", message: result.error.message });
|
|
7949
|
+
} else if (!result.value.valid) {
|
|
7950
|
+
if (result.value.errors) {
|
|
7951
|
+
for (const err of result.value.errors) {
|
|
7952
|
+
issues.push({ severity: "error", message: err.message });
|
|
7974
7953
|
}
|
|
7975
|
-
|
|
7976
|
-
|
|
7977
|
-
|
|
7978
|
-
|
|
7979
|
-
|
|
7980
|
-
|
|
7981
|
-
|
|
7982
|
-
|
|
7983
|
-
|
|
7984
|
-
|
|
7985
|
-
|
|
7986
|
-
|
|
7987
|
-
|
|
7988
|
-
|
|
7989
|
-
|
|
7990
|
-
|
|
7991
|
-
|
|
7992
|
-
|
|
7993
|
-
|
|
7994
|
-
|
|
7995
|
-
|
|
7996
|
-
|
|
7997
|
-
|
|
7998
|
-
|
|
7999
|
-
|
|
8000
|
-
|
|
8001
|
-
|
|
8002
|
-
|
|
8003
|
-
|
|
8004
|
-
|
|
7954
|
+
}
|
|
7955
|
+
for (const section of result.value.missingSections) {
|
|
7956
|
+
issues.push({ severity: "warning", message: `Missing section: ${section}` });
|
|
7957
|
+
}
|
|
7958
|
+
for (const link of result.value.brokenLinks) {
|
|
7959
|
+
issues.push({
|
|
7960
|
+
severity: "warning",
|
|
7961
|
+
message: `Broken link: ${link.text} \u2192 ${link.path}`,
|
|
7962
|
+
file: link.path
|
|
7963
|
+
});
|
|
7964
|
+
}
|
|
7965
|
+
}
|
|
7966
|
+
return issues;
|
|
7967
|
+
}
|
|
7968
|
+
async function runDepsCheck(projectRoot, config) {
|
|
7969
|
+
const issues = [];
|
|
7970
|
+
const rawLayers = config.layers;
|
|
7971
|
+
if (rawLayers && rawLayers.length > 0) {
|
|
7972
|
+
const parser = new TypeScriptParser();
|
|
7973
|
+
const layers = rawLayers.map(
|
|
7974
|
+
(l) => defineLayer(
|
|
7975
|
+
l.name,
|
|
7976
|
+
Array.isArray(l.patterns) ? l.patterns : [l.pattern],
|
|
7977
|
+
l.allowedDependencies
|
|
7978
|
+
)
|
|
7979
|
+
);
|
|
7980
|
+
const result = await validateDependencies({
|
|
7981
|
+
layers,
|
|
7982
|
+
rootDir: projectRoot,
|
|
7983
|
+
parser
|
|
7984
|
+
});
|
|
7985
|
+
if (!result.ok) {
|
|
7986
|
+
issues.push({ severity: "error", message: result.error.message });
|
|
7987
|
+
} else if (result.value.violations.length > 0) {
|
|
7988
|
+
for (const v of result.value.violations) {
|
|
7989
|
+
issues.push({
|
|
7990
|
+
severity: "error",
|
|
7991
|
+
message: `${v.reason}: ${v.file} imports ${v.imports} (${v.fromLayer} \u2192 ${v.toLayer})`,
|
|
7992
|
+
file: v.file,
|
|
7993
|
+
line: v.line
|
|
7994
|
+
});
|
|
8005
7995
|
}
|
|
8006
|
-
|
|
8007
|
-
|
|
8008
|
-
|
|
8009
|
-
|
|
8010
|
-
|
|
8011
|
-
|
|
8012
|
-
|
|
8013
|
-
|
|
8014
|
-
|
|
8015
|
-
|
|
8016
|
-
|
|
8017
|
-
|
|
7996
|
+
}
|
|
7997
|
+
}
|
|
7998
|
+
return issues;
|
|
7999
|
+
}
|
|
8000
|
+
async function runDocsCheck(projectRoot, config) {
|
|
8001
|
+
const issues = [];
|
|
8002
|
+
const docsDir = path12.join(projectRoot, config.docsDir ?? "docs");
|
|
8003
|
+
const entropyConfig = config.entropy || {};
|
|
8004
|
+
const result = await checkDocCoverage("project", {
|
|
8005
|
+
docsDir,
|
|
8006
|
+
sourceDir: projectRoot,
|
|
8007
|
+
excludePatterns: entropyConfig.excludePatterns || [
|
|
8008
|
+
"**/node_modules/**",
|
|
8009
|
+
"**/dist/**",
|
|
8010
|
+
"**/*.test.ts",
|
|
8011
|
+
"**/fixtures/**"
|
|
8012
|
+
]
|
|
8013
|
+
});
|
|
8014
|
+
if (!result.ok) {
|
|
8015
|
+
issues.push({ severity: "warning", message: result.error.message });
|
|
8016
|
+
} else if (result.value.gaps.length > 0) {
|
|
8017
|
+
for (const gap of result.value.gaps) {
|
|
8018
|
+
issues.push({
|
|
8019
|
+
severity: "warning",
|
|
8020
|
+
message: `Undocumented: ${gap.file} (suggested: ${gap.suggestedSection})`,
|
|
8021
|
+
file: gap.file
|
|
8022
|
+
});
|
|
8023
|
+
}
|
|
8024
|
+
}
|
|
8025
|
+
return issues;
|
|
8026
|
+
}
|
|
8027
|
+
async function runEntropyCheck(projectRoot, _config) {
|
|
8028
|
+
const issues = [];
|
|
8029
|
+
const analyzer = new EntropyAnalyzer({
|
|
8030
|
+
rootDir: projectRoot,
|
|
8031
|
+
analyze: { drift: true, deadCode: true, patterns: false }
|
|
8032
|
+
});
|
|
8033
|
+
const result = await analyzer.analyze();
|
|
8034
|
+
if (!result.ok) {
|
|
8035
|
+
issues.push({ severity: "warning", message: result.error.message });
|
|
8036
|
+
} else {
|
|
8037
|
+
const report = result.value;
|
|
8038
|
+
if (report.drift) {
|
|
8039
|
+
for (const drift of report.drift.drifts) {
|
|
8040
|
+
issues.push({
|
|
8041
|
+
severity: "warning",
|
|
8042
|
+
message: `Doc drift (${drift.type}): ${drift.details}`,
|
|
8043
|
+
file: drift.docFile,
|
|
8044
|
+
line: drift.line
|
|
8018
8045
|
});
|
|
8019
|
-
if (!result.ok) {
|
|
8020
|
-
issues.push({ severity: "warning", message: result.error.message });
|
|
8021
|
-
} else if (result.value.gaps.length > 0) {
|
|
8022
|
-
for (const gap of result.value.gaps) {
|
|
8023
|
-
issues.push({
|
|
8024
|
-
severity: "warning",
|
|
8025
|
-
message: `Undocumented: ${gap.file} (suggested: ${gap.suggestedSection})`,
|
|
8026
|
-
file: gap.file
|
|
8027
|
-
});
|
|
8028
|
-
}
|
|
8029
|
-
}
|
|
8030
|
-
break;
|
|
8031
8046
|
}
|
|
8032
|
-
|
|
8033
|
-
|
|
8034
|
-
|
|
8035
|
-
|
|
8047
|
+
}
|
|
8048
|
+
if (report.deadCode) {
|
|
8049
|
+
for (const dead of report.deadCode.deadExports) {
|
|
8050
|
+
issues.push({
|
|
8051
|
+
severity: "warning",
|
|
8052
|
+
message: `Dead export: ${dead.name}`,
|
|
8053
|
+
file: dead.file,
|
|
8054
|
+
line: dead.line
|
|
8036
8055
|
});
|
|
8037
|
-
const result = await analyzer.analyze();
|
|
8038
|
-
if (!result.ok) {
|
|
8039
|
-
issues.push({ severity: "warning", message: result.error.message });
|
|
8040
|
-
} else {
|
|
8041
|
-
const report = result.value;
|
|
8042
|
-
if (report.drift) {
|
|
8043
|
-
for (const drift of report.drift.drifts) {
|
|
8044
|
-
issues.push({
|
|
8045
|
-
severity: "warning",
|
|
8046
|
-
message: `Doc drift (${drift.type}): ${drift.details}`,
|
|
8047
|
-
file: drift.docFile,
|
|
8048
|
-
line: drift.line
|
|
8049
|
-
});
|
|
8050
|
-
}
|
|
8051
|
-
}
|
|
8052
|
-
if (report.deadCode) {
|
|
8053
|
-
for (const dead of report.deadCode.deadExports) {
|
|
8054
|
-
issues.push({
|
|
8055
|
-
severity: "warning",
|
|
8056
|
-
message: `Dead export: ${dead.name}`,
|
|
8057
|
-
file: dead.file,
|
|
8058
|
-
line: dead.line
|
|
8059
|
-
});
|
|
8060
|
-
}
|
|
8061
|
-
}
|
|
8062
|
-
}
|
|
8063
|
-
break;
|
|
8064
8056
|
}
|
|
8065
|
-
|
|
8066
|
-
|
|
8067
|
-
|
|
8068
|
-
|
|
8069
|
-
|
|
8070
|
-
|
|
8071
|
-
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8077
|
-
|
|
8078
|
-
|
|
8079
|
-
|
|
8057
|
+
}
|
|
8058
|
+
}
|
|
8059
|
+
return issues;
|
|
8060
|
+
}
|
|
8061
|
+
async function runSecurityCheck(projectRoot, config) {
|
|
8062
|
+
const issues = [];
|
|
8063
|
+
const securityConfig = parseSecurityConfig(config.security);
|
|
8064
|
+
if (!securityConfig.enabled) return issues;
|
|
8065
|
+
const scanner = new SecurityScanner(securityConfig);
|
|
8066
|
+
scanner.configureForProject(projectRoot);
|
|
8067
|
+
const { glob: globFn } = await import("glob");
|
|
8068
|
+
const sourceFiles = await globFn("**/*.{ts,tsx,js,jsx,go,py}", {
|
|
8069
|
+
cwd: projectRoot,
|
|
8070
|
+
ignore: securityConfig.exclude ?? [
|
|
8071
|
+
"**/node_modules/**",
|
|
8072
|
+
"**/dist/**",
|
|
8073
|
+
"**/*.test.ts",
|
|
8074
|
+
"**/fixtures/**"
|
|
8075
|
+
],
|
|
8076
|
+
absolute: true
|
|
8077
|
+
});
|
|
8078
|
+
const scanResult = await scanner.scanFiles(sourceFiles);
|
|
8079
|
+
for (const finding of scanResult.findings) {
|
|
8080
|
+
issues.push({
|
|
8081
|
+
severity: finding.severity === "info" ? "warning" : finding.severity,
|
|
8082
|
+
message: `[${finding.ruleId}] ${finding.message}: ${finding.match}`,
|
|
8083
|
+
file: finding.file,
|
|
8084
|
+
line: finding.line
|
|
8085
|
+
});
|
|
8086
|
+
}
|
|
8087
|
+
return issues;
|
|
8088
|
+
}
|
|
8089
|
+
async function runPerfCheck(projectRoot, config) {
|
|
8090
|
+
const issues = [];
|
|
8091
|
+
const perfConfig = config.performance || {};
|
|
8092
|
+
const perfAnalyzer = new EntropyAnalyzer({
|
|
8093
|
+
rootDir: projectRoot,
|
|
8094
|
+
analyze: {
|
|
8095
|
+
complexity: perfConfig.complexity || true,
|
|
8096
|
+
coupling: perfConfig.coupling || true,
|
|
8097
|
+
sizeBudget: perfConfig.sizeBudget || false
|
|
8098
|
+
}
|
|
8099
|
+
});
|
|
8100
|
+
const perfResult = await perfAnalyzer.analyze();
|
|
8101
|
+
if (!perfResult.ok) {
|
|
8102
|
+
issues.push({ severity: "warning", message: perfResult.error.message });
|
|
8103
|
+
} else {
|
|
8104
|
+
const perfReport = perfResult.value;
|
|
8105
|
+
if (perfReport.complexity) {
|
|
8106
|
+
for (const v of perfReport.complexity.violations) {
|
|
8107
|
+
issues.push({
|
|
8108
|
+
severity: v.severity === "info" ? "warning" : v.severity,
|
|
8109
|
+
message: `[Tier ${v.tier}] ${v.metric}: ${v.function} in ${v.file} (${v.value} > ${v.threshold})`,
|
|
8110
|
+
file: v.file,
|
|
8111
|
+
line: v.line
|
|
8080
8112
|
});
|
|
8081
|
-
const scanResult = await scanner.scanFiles(sourceFiles);
|
|
8082
|
-
for (const finding of scanResult.findings) {
|
|
8083
|
-
issues.push({
|
|
8084
|
-
severity: finding.severity === "info" ? "warning" : finding.severity,
|
|
8085
|
-
message: `[${finding.ruleId}] ${finding.message}: ${finding.match}`,
|
|
8086
|
-
file: finding.file,
|
|
8087
|
-
line: finding.line
|
|
8088
|
-
});
|
|
8089
|
-
}
|
|
8090
|
-
break;
|
|
8091
8113
|
}
|
|
8092
|
-
|
|
8093
|
-
|
|
8094
|
-
|
|
8095
|
-
|
|
8096
|
-
|
|
8097
|
-
|
|
8098
|
-
|
|
8099
|
-
sizeBudget: perfConfig.sizeBudget || false
|
|
8100
|
-
}
|
|
8114
|
+
}
|
|
8115
|
+
if (perfReport.coupling) {
|
|
8116
|
+
for (const v of perfReport.coupling.violations) {
|
|
8117
|
+
issues.push({
|
|
8118
|
+
severity: v.severity === "info" ? "warning" : v.severity,
|
|
8119
|
+
message: `[Tier ${v.tier}] ${v.metric}: ${v.file} (${v.value} > ${v.threshold})`,
|
|
8120
|
+
file: v.file
|
|
8101
8121
|
});
|
|
8102
|
-
const perfResult = await perfAnalyzer.analyze();
|
|
8103
|
-
if (!perfResult.ok) {
|
|
8104
|
-
issues.push({ severity: "warning", message: perfResult.error.message });
|
|
8105
|
-
} else {
|
|
8106
|
-
const perfReport = perfResult.value;
|
|
8107
|
-
if (perfReport.complexity) {
|
|
8108
|
-
for (const v of perfReport.complexity.violations) {
|
|
8109
|
-
issues.push({
|
|
8110
|
-
severity: v.severity === "info" ? "warning" : v.severity,
|
|
8111
|
-
message: `[Tier ${v.tier}] ${v.metric}: ${v.function} in ${v.file} (${v.value} > ${v.threshold})`,
|
|
8112
|
-
file: v.file,
|
|
8113
|
-
line: v.line
|
|
8114
|
-
});
|
|
8115
|
-
}
|
|
8116
|
-
}
|
|
8117
|
-
if (perfReport.coupling) {
|
|
8118
|
-
for (const v of perfReport.coupling.violations) {
|
|
8119
|
-
issues.push({
|
|
8120
|
-
severity: v.severity === "info" ? "warning" : v.severity,
|
|
8121
|
-
message: `[Tier ${v.tier}] ${v.metric}: ${v.file} (${v.value} > ${v.threshold})`,
|
|
8122
|
-
file: v.file
|
|
8123
|
-
});
|
|
8124
|
-
}
|
|
8125
|
-
}
|
|
8126
|
-
}
|
|
8127
|
-
break;
|
|
8128
8122
|
}
|
|
8129
|
-
|
|
8130
|
-
|
|
8131
|
-
|
|
8132
|
-
|
|
8133
|
-
|
|
8123
|
+
}
|
|
8124
|
+
}
|
|
8125
|
+
return issues;
|
|
8126
|
+
}
|
|
8127
|
+
async function runPhaseGateCheck(_projectRoot, config) {
|
|
8128
|
+
const issues = [];
|
|
8129
|
+
const phaseGates = config.phaseGates;
|
|
8130
|
+
if (!phaseGates?.enabled) {
|
|
8131
|
+
return issues;
|
|
8132
|
+
}
|
|
8133
|
+
issues.push({
|
|
8134
|
+
severity: "warning",
|
|
8135
|
+
message: "Phase gate is enabled but requires CLI context. Run `harness check-phase-gate` separately for full validation."
|
|
8136
|
+
});
|
|
8137
|
+
return issues;
|
|
8138
|
+
}
|
|
8139
|
+
async function runArchCheck(projectRoot, config) {
|
|
8140
|
+
const issues = [];
|
|
8141
|
+
const rawArchConfig = config.architecture;
|
|
8142
|
+
const archConfig = ArchConfigSchema.parse(rawArchConfig ?? {});
|
|
8143
|
+
if (!archConfig.enabled) return issues;
|
|
8144
|
+
const results = await runAll(archConfig, projectRoot);
|
|
8145
|
+
const baselineManager = new ArchBaselineManager(projectRoot, archConfig.baselinePath);
|
|
8146
|
+
const baseline = baselineManager.load();
|
|
8147
|
+
if (baseline) {
|
|
8148
|
+
const diffResult = diff(results, baseline);
|
|
8149
|
+
if (!diffResult.passed) {
|
|
8150
|
+
for (const v of diffResult.newViolations) {
|
|
8134
8151
|
issues.push({
|
|
8135
|
-
severity:
|
|
8136
|
-
message:
|
|
8152
|
+
severity: v.severity,
|
|
8153
|
+
message: `[${v.category || "arch"}] NEW: ${v.detail}`,
|
|
8154
|
+
file: v.file
|
|
8137
8155
|
});
|
|
8138
|
-
break;
|
|
8139
8156
|
}
|
|
8140
|
-
|
|
8141
|
-
|
|
8142
|
-
|
|
8143
|
-
|
|
8144
|
-
|
|
8145
|
-
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
|
|
8152
|
-
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
});
|
|
8156
|
-
}
|
|
8157
|
-
for (const r of diffResult.regressions) {
|
|
8158
|
-
issues.push({
|
|
8159
|
-
severity: "error",
|
|
8160
|
-
message: `[${r.category}] REGRESSION: ${r.currentValue} > ${r.baselineValue} (delta: ${r.delta})`
|
|
8161
|
-
});
|
|
8162
|
-
}
|
|
8163
|
-
}
|
|
8164
|
-
} else {
|
|
8165
|
-
for (const result of results) {
|
|
8166
|
-
for (const v of result.violations) {
|
|
8167
|
-
issues.push({
|
|
8168
|
-
severity: v.severity,
|
|
8169
|
-
message: `[${result.category}] ${v.detail}`,
|
|
8170
|
-
file: v.file
|
|
8171
|
-
});
|
|
8172
|
-
}
|
|
8173
|
-
}
|
|
8174
|
-
}
|
|
8175
|
-
break;
|
|
8157
|
+
for (const r of diffResult.regressions) {
|
|
8158
|
+
issues.push({
|
|
8159
|
+
severity: "error",
|
|
8160
|
+
message: `[${r.category}] REGRESSION: ${r.currentValue} > ${r.baselineValue} (delta: ${r.delta})`
|
|
8161
|
+
});
|
|
8162
|
+
}
|
|
8163
|
+
}
|
|
8164
|
+
} else {
|
|
8165
|
+
for (const result of results) {
|
|
8166
|
+
for (const v of result.violations) {
|
|
8167
|
+
issues.push({
|
|
8168
|
+
severity: v.severity,
|
|
8169
|
+
message: `[${result.category}] ${v.detail}`,
|
|
8170
|
+
file: v.file
|
|
8171
|
+
});
|
|
8176
8172
|
}
|
|
8177
8173
|
}
|
|
8174
|
+
}
|
|
8175
|
+
return issues;
|
|
8176
|
+
}
|
|
8177
|
+
async function runSingleCheck(name, projectRoot, config) {
|
|
8178
|
+
const start = Date.now();
|
|
8179
|
+
const issues = [];
|
|
8180
|
+
try {
|
|
8181
|
+
switch (name) {
|
|
8182
|
+
case "validate":
|
|
8183
|
+
issues.push(...await runValidateCheck(projectRoot, config));
|
|
8184
|
+
break;
|
|
8185
|
+
case "deps":
|
|
8186
|
+
issues.push(...await runDepsCheck(projectRoot, config));
|
|
8187
|
+
break;
|
|
8188
|
+
case "docs":
|
|
8189
|
+
issues.push(...await runDocsCheck(projectRoot, config));
|
|
8190
|
+
break;
|
|
8191
|
+
case "entropy":
|
|
8192
|
+
issues.push(...await runEntropyCheck(projectRoot, config));
|
|
8193
|
+
break;
|
|
8194
|
+
case "security":
|
|
8195
|
+
issues.push(...await runSecurityCheck(projectRoot, config));
|
|
8196
|
+
break;
|
|
8197
|
+
case "perf":
|
|
8198
|
+
issues.push(...await runPerfCheck(projectRoot, config));
|
|
8199
|
+
break;
|
|
8200
|
+
case "phase-gate":
|
|
8201
|
+
issues.push(...await runPhaseGateCheck(projectRoot, config));
|
|
8202
|
+
break;
|
|
8203
|
+
case "arch":
|
|
8204
|
+
issues.push(...await runArchCheck(projectRoot, config));
|
|
8205
|
+
break;
|
|
8206
|
+
}
|
|
8178
8207
|
} catch (error) {
|
|
8179
8208
|
issues.push({
|
|
8180
8209
|
severity: "error",
|
|
@@ -8539,7 +8568,7 @@ async function readContextFile(projectRoot, filePath, reason) {
|
|
|
8539
8568
|
if (!result.ok) return null;
|
|
8540
8569
|
const content = result.value;
|
|
8541
8570
|
const lines = content.split("\n").length;
|
|
8542
|
-
const relPath = path14.isAbsolute(filePath) ?
|
|
8571
|
+
const relPath = path14.isAbsolute(filePath) ? relativePosix(projectRoot, filePath) : filePath;
|
|
8543
8572
|
return { path: relPath, content, reason, lines };
|
|
8544
8573
|
}
|
|
8545
8574
|
function extractImportSources2(content) {
|
|
@@ -8557,7 +8586,7 @@ async function resolveImportPath2(projectRoot, fromFile, importSource) {
|
|
|
8557
8586
|
const fromDir = path14.dirname(path14.join(projectRoot, fromFile));
|
|
8558
8587
|
const basePath = path14.resolve(fromDir, importSource);
|
|
8559
8588
|
if (!isWithinProject(basePath, projectRoot)) return null;
|
|
8560
|
-
const relBase =
|
|
8589
|
+
const relBase = relativePosix(projectRoot, basePath);
|
|
8561
8590
|
const candidates = [
|
|
8562
8591
|
relBase + ".ts",
|
|
8563
8592
|
relBase + ".tsx",
|
|
@@ -8576,7 +8605,7 @@ async function findTestFiles(projectRoot, sourceFile) {
|
|
|
8576
8605
|
const baseName = path14.basename(sourceFile, path14.extname(sourceFile));
|
|
8577
8606
|
const pattern = `**/${baseName}.{test,spec}.{ts,tsx,mts}`;
|
|
8578
8607
|
const results = await findFiles(pattern, projectRoot);
|
|
8579
|
-
return results.map((f) =>
|
|
8608
|
+
return results.map((f) => relativePosix(projectRoot, f));
|
|
8580
8609
|
}
|
|
8581
8610
|
async function gatherImportContext(projectRoot, changedFiles, budget) {
|
|
8582
8611
|
const contextFiles = [];
|
|
@@ -10369,7 +10398,7 @@ function getUpdateNotification(currentVersion) {
|
|
|
10369
10398
|
return `Update available: v${currentVersion} -> v${state.latestVersion}
|
|
10370
10399
|
Run "harness update" to upgrade.`;
|
|
10371
10400
|
}
|
|
10372
|
-
var VERSION = "0.
|
|
10401
|
+
var VERSION = "0.13.0";
|
|
10373
10402
|
|
|
10374
10403
|
export {
|
|
10375
10404
|
ArchMetricCategorySchema,
|