@harness-engineering/cli 1.13.0 → 1.14.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/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.md +39 -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.md +44 -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.md +44 -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.md +39 -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.md +3 -3
- 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.md +35 -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.md +11 -3
- 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.md +39 -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.md +44 -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.md +44 -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.md +39 -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.md +3 -3
- 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.md +35 -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.md +11 -3
- 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-YTYQDA3P.js +8 -0
- package/dist/{architecture-ESOOE26S.js → architecture-JQZYM4US.js} +4 -4
- package/dist/bin/harness-mcp.js +16 -15
- package/dist/bin/harness.js +31 -30
- package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-L3RADYWO.js} +4 -3
- package/dist/{chunk-WPPDRIJL.js → chunk-3C2MLBPJ.js} +4 -4
- package/dist/chunk-6KTUUFRN.js +217 -0
- package/dist/{chunk-MI5XJQDY.js → chunk-7IP4JIFL.js} +24 -10
- package/dist/{chunk-C2ERUR3L.js → chunk-7MJAPE3Z.js} +165 -49
- package/dist/{chunk-KELT6K6M.js → chunk-ABQHQ6I5.js} +1861 -1418
- package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
- package/dist/{chunk-QPEH2QPG.js → chunk-DBSOCI3G.js} +53 -54
- package/dist/{chunk-MHBMTPW7.js → chunk-ERS5EVUZ.js} +9 -0
- package/dist/{chunk-JSTQ3AWB.js → chunk-FIAPHX37.js} +1 -1
- package/dist/{chunk-2YPZKGAG.js → chunk-FTMXDOR6.js} +1 -1
- package/dist/{chunk-72GHBOL2.js → chunk-GZKSBLQL.js} +1 -1
- package/dist/{chunk-K6XAPGML.js → chunk-H7Y5CKTM.js} +1 -1
- package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
- package/dist/{chunk-LD3DKUK5.js → chunk-NLVUVUGD.js} +1 -1
- package/dist/{chunk-3KOLLWWE.js → chunk-O5OJVPL6.js} +26 -211
- package/dist/{chunk-NKDM3FMH.js → chunk-OD3S2NHN.js} +1 -1
- package/dist/{chunk-5VY23YK3.js → chunk-OSXBPAMK.js} +2 -2
- package/dist/{chunk-MACVXDZK.js → chunk-OXLLOSSR.js} +45 -47
- package/dist/{chunk-GNGELAXY.js → chunk-RCWZBSK5.js} +2 -2
- package/dist/{chunk-PSNN4LWX.js → chunk-S2FXOWOR.js} +3 -3
- package/dist/{chunk-VUCPTQ6G.js → chunk-SD3SQOZ2.js} +1 -1
- package/dist/{chunk-7PZWR4LI.js → chunk-TPOTOBR7.js} +9 -9
- package/dist/{chunk-RZSUJBZZ.js → chunk-XKECDXJS.js} +452 -353
- package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
- package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
- package/dist/{chunk-2VU4MFM3.js → chunk-YPYGXRDR.js} +7 -7
- package/dist/{chunk-Q6AB7W5Z.js → chunk-YQ6KC6TE.js} +1 -1
- package/dist/{chunk-7KQSUZVG.js → chunk-YZD2MRNQ.js} +1528 -1010
- package/dist/ci-workflow-EQZFVX3P.js +8 -0
- package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
- package/dist/{dist-M6BQODWC.js → dist-B26DFXMP.js} +573 -480
- package/dist/{dist-L7LAAQAS.js → dist-DZ63LLUD.js} +1 -1
- package/dist/{dist-WF4C7A4A.js → dist-HWXF2C3R.js} +18 -2
- package/dist/{dist-D4RYGUZE.js → dist-USY2C5JL.js} +3 -1
- package/dist/{docs-BPYCN2DR.js → docs-7ECGYMAV.js} +5 -3
- package/dist/engine-EG4EH4IX.js +8 -0
- package/dist/{entropy-4VDVV5CR.js → entropy-5USWKLVS.js} +3 -3
- package/dist/{feedback-63QB5RCA.js → feedback-UTBXZZHF.js} +1 -1
- package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-3PM5EU7V.js} +5 -5
- package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
- package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-2M2HXDQI.js} +1 -1
- package/dist/index.d.ts +183 -17
- package/dist/index.js +32 -30
- package/dist/loader-ZPALXIVR.js +10 -0
- package/dist/mcp-362EZHF4.js +35 -0
- package/dist/{performance-26BH47O4.js → performance-OQAFMJUD.js} +3 -3
- package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-C4GCFVGP.js} +1 -1
- package/dist/runtime-7YLVK453.js +9 -0
- package/dist/{security-UQFUZXEN.js → security-PZOX7AQS.js} +1 -1
- package/dist/skill-executor-XZLYZYAK.js +8 -0
- package/dist/templates/axum/Cargo.toml.hbs +8 -0
- package/dist/templates/axum/src/main.rs +12 -0
- package/dist/templates/axum/template.json +16 -0
- package/dist/templates/django/manage.py.hbs +19 -0
- package/dist/templates/django/requirements.txt.hbs +1 -0
- package/dist/templates/django/src/settings.py.hbs +44 -0
- package/dist/templates/django/src/urls.py +6 -0
- package/dist/templates/django/src/wsgi.py.hbs +9 -0
- package/dist/templates/django/template.json +21 -0
- package/dist/templates/express/package.json.hbs +15 -0
- package/dist/templates/express/src/app.ts +12 -0
- package/dist/templates/express/src/lib/.gitkeep +0 -0
- package/dist/templates/express/template.json +16 -0
- package/dist/templates/fastapi/requirements.txt.hbs +2 -0
- package/dist/templates/fastapi/src/main.py +8 -0
- package/dist/templates/fastapi/template.json +20 -0
- package/dist/templates/gin/go.mod.hbs +5 -0
- package/dist/templates/gin/main.go +15 -0
- package/dist/templates/gin/template.json +19 -0
- package/dist/templates/go-base/.golangci.yml +16 -0
- package/dist/templates/go-base/AGENTS.md.hbs +35 -0
- package/dist/templates/go-base/go.mod.hbs +3 -0
- package/dist/templates/go-base/harness.config.json.hbs +17 -0
- package/dist/templates/go-base/main.go +7 -0
- package/dist/templates/go-base/template.json +14 -0
- package/dist/templates/java-base/AGENTS.md.hbs +35 -0
- package/dist/templates/java-base/checkstyle.xml +20 -0
- package/dist/templates/java-base/harness.config.json.hbs +16 -0
- package/dist/templates/java-base/pom.xml.hbs +39 -0
- package/dist/templates/java-base/src/main/java/App.java.hbs +5 -0
- package/dist/templates/java-base/template.json +13 -0
- package/dist/templates/nestjs/nest-cli.json +5 -0
- package/dist/templates/nestjs/package.json.hbs +18 -0
- package/dist/templates/nestjs/src/app.module.ts +8 -0
- package/dist/templates/nestjs/src/lib/.gitkeep +0 -0
- package/dist/templates/nestjs/src/main.ts +11 -0
- package/dist/templates/nestjs/template.json +16 -0
- package/dist/templates/nextjs/template.json +15 -1
- package/dist/templates/python-base/.python-version +1 -0
- package/dist/templates/python-base/AGENTS.md.hbs +32 -0
- package/dist/templates/python-base/harness.config.json.hbs +16 -0
- package/dist/templates/python-base/pyproject.toml.hbs +18 -0
- package/dist/templates/python-base/ruff.toml +5 -0
- package/dist/templates/python-base/src/__init__.py +0 -0
- package/dist/templates/python-base/template.json +13 -0
- package/dist/templates/react-vite/index.html +12 -0
- package/dist/templates/react-vite/package.json.hbs +18 -0
- package/dist/templates/react-vite/src/App.tsx +7 -0
- package/dist/templates/react-vite/src/lib/.gitkeep +0 -0
- package/dist/templates/react-vite/src/main.tsx +9 -0
- package/dist/templates/react-vite/template.json +19 -0
- package/dist/templates/react-vite/vite.config.ts +6 -0
- package/dist/templates/rust-base/AGENTS.md.hbs +35 -0
- package/dist/templates/rust-base/Cargo.toml.hbs +6 -0
- package/dist/templates/rust-base/clippy.toml +2 -0
- package/dist/templates/rust-base/harness.config.json.hbs +17 -0
- package/dist/templates/rust-base/src/main.rs +3 -0
- package/dist/templates/rust-base/template.json +14 -0
- package/dist/templates/spring-boot/pom.xml.hbs +50 -0
- package/dist/templates/spring-boot/src/main/java/Application.java.hbs +19 -0
- package/dist/templates/spring-boot/template.json +15 -0
- package/dist/templates/vue/index.html +12 -0
- package/dist/templates/vue/package.json.hbs +16 -0
- package/dist/templates/vue/src/App.vue +7 -0
- package/dist/templates/vue/src/lib/.gitkeep +0 -0
- package/dist/templates/vue/src/main.ts +4 -0
- package/dist/templates/vue/template.json +19 -0
- package/dist/templates/vue/vite.config.ts +6 -0
- package/dist/{validate-N7QJOKFZ.js → validate-FD3Z6VJD.js} +4 -4
- package/dist/validate-cross-check-WNJM6H2D.js +8 -0
- package/package.json +6 -6
- package/dist/agents-md-P2RHSUV7.js +0 -8
- package/dist/ci-workflow-4NYBUG6R.js +0 -8
- package/dist/engine-LXLIWQQ3.js +0 -8
- package/dist/loader-Z2IT7QX3.js +0 -10
- package/dist/mcp-KQHEL5IF.js +0 -34
- package/dist/runtime-PDWD7UIK.js +0 -9
- package/dist/skill-executor-RG45LUO5.js +0 -8
- package/dist/validate-cross-check-EDQ5QGTM.js +0 -8
|
@@ -264,6 +264,49 @@ async function validate(options) {
|
|
|
264
264
|
}
|
|
265
265
|
return { success: true, ruleCount: parseResult.data.rules.length };
|
|
266
266
|
}
|
|
267
|
+
function resolveOutputDir(options, configOutput) {
|
|
268
|
+
const configDir = path3.dirname(path3.resolve(options.configPath));
|
|
269
|
+
return options.outputDir ? path3.resolve(options.outputDir) : path3.resolve(configDir, configOutput);
|
|
270
|
+
}
|
|
271
|
+
async function prepareOutputDir(outputDir, clean) {
|
|
272
|
+
if (clean) {
|
|
273
|
+
try {
|
|
274
|
+
await fs3.rm(outputDir, { recursive: true, force: true });
|
|
275
|
+
} catch {
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
await fs3.mkdir(outputDir, { recursive: true });
|
|
279
|
+
}
|
|
280
|
+
async function processRule(rule, templates, configDir, outputDir, configPath, dryRun, errors) {
|
|
281
|
+
const templateResult = await loadTemplate(rule.type, templates, configDir);
|
|
282
|
+
if (!templateResult.success) {
|
|
283
|
+
errors.push({ type: "template", error: templateResult.error, ruleName: rule.name });
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
const ruleResult = generateRule(rule, templateResult.source, outputDir, configPath);
|
|
287
|
+
if (!ruleResult.success) {
|
|
288
|
+
errors.push({ type: "render", error: ruleResult.error, ruleName: ruleResult.ruleName });
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
if (!dryRun) {
|
|
292
|
+
try {
|
|
293
|
+
await fs3.writeFile(ruleResult.rule.outputPath, ruleResult.rule.content, "utf-8");
|
|
294
|
+
} catch (err) {
|
|
295
|
+
errors.push({ type: "write", error: err, path: ruleResult.rule.outputPath });
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return rule.name;
|
|
300
|
+
}
|
|
301
|
+
async function writeIndexFile(outputDir, generatedRules, errors) {
|
|
302
|
+
const indexContent = generateIndex(generatedRules);
|
|
303
|
+
const indexPath = path3.join(outputDir, "index.ts");
|
|
304
|
+
try {
|
|
305
|
+
await fs3.writeFile(indexPath, indexContent, "utf-8");
|
|
306
|
+
} catch (err) {
|
|
307
|
+
errors.push({ type: "write", error: err, path: indexPath });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
267
310
|
async function generate(options) {
|
|
268
311
|
const errors = [];
|
|
269
312
|
const parseResult = await parseConfig(options.configPath);
|
|
@@ -271,69 +314,25 @@ async function generate(options) {
|
|
|
271
314
|
return { success: false, errors: [{ type: "parse", error: parseResult.error }] };
|
|
272
315
|
}
|
|
273
316
|
const config = parseResult.data;
|
|
317
|
+
const outputDir = resolveOutputDir(options, config.output);
|
|
318
|
+
const dryRun = options.dryRun ?? false;
|
|
274
319
|
const configDir = path3.dirname(path3.resolve(options.configPath));
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
try {
|
|
278
|
-
await fs3.rm(outputDir, { recursive: true, force: true });
|
|
279
|
-
} catch {
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (!options.dryRun) {
|
|
283
|
-
await fs3.mkdir(outputDir, { recursive: true });
|
|
320
|
+
if (!dryRun) {
|
|
321
|
+
await prepareOutputDir(outputDir, options.clean ?? false);
|
|
284
322
|
}
|
|
285
323
|
const generatedRules = [];
|
|
286
324
|
for (const rule of config.rules) {
|
|
287
|
-
const
|
|
288
|
-
if (
|
|
289
|
-
|
|
290
|
-
type: "template",
|
|
291
|
-
error: templateResult.error,
|
|
292
|
-
ruleName: rule.name
|
|
293
|
-
});
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
const ruleResult = generateRule(rule, templateResult.source, outputDir, options.configPath);
|
|
297
|
-
if (!ruleResult.success) {
|
|
298
|
-
errors.push({
|
|
299
|
-
type: "render",
|
|
300
|
-
error: ruleResult.error,
|
|
301
|
-
ruleName: ruleResult.ruleName
|
|
302
|
-
});
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
if (!options.dryRun) {
|
|
306
|
-
try {
|
|
307
|
-
await fs3.writeFile(ruleResult.rule.outputPath, ruleResult.rule.content, "utf-8");
|
|
308
|
-
} catch (err) {
|
|
309
|
-
errors.push({
|
|
310
|
-
type: "write",
|
|
311
|
-
error: err,
|
|
312
|
-
path: ruleResult.rule.outputPath
|
|
313
|
-
});
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
generatedRules.push(rule.name);
|
|
325
|
+
const name = await processRule(rule, config.templates, configDir, outputDir, options.configPath, dryRun, errors);
|
|
326
|
+
if (name)
|
|
327
|
+
generatedRules.push(name);
|
|
318
328
|
}
|
|
319
|
-
if (generatedRules.length > 0 && !
|
|
320
|
-
|
|
321
|
-
const indexPath = path3.join(outputDir, "index.ts");
|
|
322
|
-
try {
|
|
323
|
-
await fs3.writeFile(indexPath, indexContent, "utf-8");
|
|
324
|
-
} catch (err) {
|
|
325
|
-
errors.push({ type: "write", error: err, path: indexPath });
|
|
326
|
-
}
|
|
329
|
+
if (generatedRules.length > 0 && !dryRun) {
|
|
330
|
+
await writeIndexFile(outputDir, generatedRules, errors);
|
|
327
331
|
}
|
|
328
332
|
if (errors.length > 0) {
|
|
329
333
|
return { success: false, errors };
|
|
330
334
|
}
|
|
331
|
-
return {
|
|
332
|
-
success: true,
|
|
333
|
-
rulesGenerated: generatedRules,
|
|
334
|
-
outputDir,
|
|
335
|
-
dryRun: options.dryRun ?? false
|
|
336
|
-
};
|
|
335
|
+
return { success: true, rulesGenerated: generatedRules, outputDir, dryRun };
|
|
337
336
|
}
|
|
338
337
|
|
|
339
338
|
export {
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
// ../types/dist/index.mjs
|
|
2
|
+
var SESSION_SECTION_NAMES = [
|
|
3
|
+
"terminology",
|
|
4
|
+
"decisions",
|
|
5
|
+
"constraints",
|
|
6
|
+
"risks",
|
|
7
|
+
"openQuestions",
|
|
8
|
+
"evidence"
|
|
9
|
+
];
|
|
2
10
|
function Ok(value) {
|
|
3
11
|
return { ok: true, value };
|
|
4
12
|
}
|
|
@@ -21,6 +29,7 @@ var STANDARD_COGNITIVE_MODES = [
|
|
|
21
29
|
];
|
|
22
30
|
|
|
23
31
|
export {
|
|
32
|
+
SESSION_SECTION_NAMES,
|
|
24
33
|
Ok,
|
|
25
34
|
Err,
|
|
26
35
|
isOk,
|
|
@@ -15,7 +15,7 @@ function evictIfNeeded() {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
async function doLoadGraphStore(projectRoot) {
|
|
18
|
-
const { GraphStore } = await import("./dist-
|
|
18
|
+
const { GraphStore } = await import("./dist-B26DFXMP.js");
|
|
19
19
|
const graphDir = path.join(projectRoot, ".harness", "graph");
|
|
20
20
|
const store = new GraphStore();
|
|
21
21
|
const loaded = await store.load(graphDir);
|
|
@@ -69,6 +69,28 @@ function resolveCommunitySkillsDir(platform = "claude-code") {
|
|
|
69
69
|
}
|
|
70
70
|
return path.join(__dirname, "agents", "skills", "community", platform);
|
|
71
71
|
}
|
|
72
|
+
function resolveAllSkillsDirs(platform = "claude-code") {
|
|
73
|
+
const dirs = [];
|
|
74
|
+
const projectDir = resolveProjectSkillsDir();
|
|
75
|
+
if (projectDir) {
|
|
76
|
+
const platformDir = path.join(path.dirname(projectDir), platform);
|
|
77
|
+
if (fs.existsSync(platformDir)) {
|
|
78
|
+
dirs.push(platformDir);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const communityDir = resolveCommunitySkillsDir(platform);
|
|
82
|
+
if (fs.existsSync(communityDir)) {
|
|
83
|
+
dirs.push(communityDir);
|
|
84
|
+
}
|
|
85
|
+
const globalDir = resolveGlobalSkillsDir();
|
|
86
|
+
const globalPlatformDir = path.join(path.dirname(globalDir), platform);
|
|
87
|
+
if (fs.existsSync(globalPlatformDir)) {
|
|
88
|
+
if (!dirs.some((d) => path.resolve(d) === path.resolve(globalPlatformDir))) {
|
|
89
|
+
dirs.push(globalPlatformDir);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return dirs;
|
|
93
|
+
}
|
|
72
94
|
|
|
73
95
|
export {
|
|
74
96
|
resolveTemplatesDir,
|
|
@@ -76,5 +98,6 @@ export {
|
|
|
76
98
|
resolveSkillsDir,
|
|
77
99
|
resolveProjectSkillsDir,
|
|
78
100
|
resolveGlobalSkillsDir,
|
|
79
|
-
resolveCommunitySkillsDir
|
|
101
|
+
resolveCommunitySkillsDir,
|
|
102
|
+
resolveAllSkillsDirs
|
|
80
103
|
};
|
|
@@ -45,7 +45,7 @@ var runCodeReviewDefinition = {
|
|
|
45
45
|
};
|
|
46
46
|
async function handleRunCodeReview(input) {
|
|
47
47
|
try {
|
|
48
|
-
const { parseDiff, runReviewPipeline } = await import("./dist-
|
|
48
|
+
const { parseDiff, runReviewPipeline } = await import("./dist-HWXF2C3R.js");
|
|
49
49
|
const parseResult = parseDiff(input.diff);
|
|
50
50
|
if (!parseResult.ok) {
|
|
51
51
|
return {
|
|
@@ -1,22 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
logger
|
|
3
|
-
} from "./chunk-EBJQ6N4M.js";
|
|
4
1
|
import {
|
|
5
2
|
CLIError,
|
|
6
3
|
ExitCode
|
|
7
4
|
} from "./chunk-3WGJMBKH.js";
|
|
8
5
|
import {
|
|
9
6
|
ArchConfigSchema
|
|
10
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ABQHQ6I5.js";
|
|
11
8
|
import {
|
|
12
9
|
Err,
|
|
13
10
|
Ok
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
|
|
16
|
-
// src/commands/check-phase-gate.ts
|
|
17
|
-
import { Command } from "commander";
|
|
18
|
-
import * as path2 from "path";
|
|
19
|
-
import * as fs2 from "fs";
|
|
11
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
20
12
|
|
|
21
13
|
// src/config/loader.ts
|
|
22
14
|
import * as fs from "fs";
|
|
@@ -192,12 +184,23 @@ var HarnessConfigSchema = z.object({
|
|
|
192
184
|
performance: PerformanceConfigSchema.optional(),
|
|
193
185
|
/** Project template settings (used by 'harness init') */
|
|
194
186
|
template: z.object({
|
|
195
|
-
/** Complexity level of the template */
|
|
196
|
-
level: z.enum(["basic", "intermediate", "advanced"]),
|
|
187
|
+
/** Complexity level of the template (JS/TS only) */
|
|
188
|
+
level: z.enum(["basic", "intermediate", "advanced"]).optional(),
|
|
189
|
+
/** Target language */
|
|
190
|
+
language: z.enum(["typescript", "python", "go", "rust", "java"]).optional(),
|
|
197
191
|
/** Primary technology framework */
|
|
198
192
|
framework: z.string().optional(),
|
|
199
193
|
/** Template version */
|
|
200
|
-
version: z.number()
|
|
194
|
+
version: z.number(),
|
|
195
|
+
/** Language-specific tooling configuration */
|
|
196
|
+
tooling: z.object({
|
|
197
|
+
packageManager: z.string().optional(),
|
|
198
|
+
linter: z.string().optional(),
|
|
199
|
+
formatter: z.string().optional(),
|
|
200
|
+
buildTool: z.string().optional(),
|
|
201
|
+
testRunner: z.string().optional(),
|
|
202
|
+
lockFile: z.string().optional()
|
|
203
|
+
}).optional()
|
|
201
204
|
}).optional(),
|
|
202
205
|
/** Phase gate and readiness check configuration */
|
|
203
206
|
phaseGates: PhaseGatesConfigSchema.optional(),
|
|
@@ -209,6 +212,15 @@ var HarnessConfigSchema = z.object({
|
|
|
209
212
|
review: ReviewConfigSchema.optional(),
|
|
210
213
|
/** General architectural enforcement settings */
|
|
211
214
|
architecture: ArchConfigSchema.optional(),
|
|
215
|
+
/** Skill loading, suggestion, and tier override settings */
|
|
216
|
+
skills: z.object({
|
|
217
|
+
/** Skills to always suggest in the dispatcher, regardless of scoring */
|
|
218
|
+
alwaysSuggest: z.array(z.string()).default([]),
|
|
219
|
+
/** Skills to never suggest in the dispatcher, even if they score highly */
|
|
220
|
+
neverSuggest: z.array(z.string()).default([]),
|
|
221
|
+
/** Override the tier of specific skills (e.g., promote a Tier 3 skill to Tier 2) */
|
|
222
|
+
tierOverrides: z.record(z.string(), z.number().int().min(1).max(3)).default({})
|
|
223
|
+
}).optional(),
|
|
212
224
|
/** How often (in ms) to check for CLI updates */
|
|
213
225
|
updateCheckInterval: z.number().int().min(0).optional()
|
|
214
226
|
});
|
|
@@ -266,205 +278,8 @@ function resolveConfig(configPath) {
|
|
|
266
278
|
return loadConfig(findResult.value);
|
|
267
279
|
}
|
|
268
280
|
|
|
269
|
-
// src/utils/files.ts
|
|
270
|
-
import { glob } from "glob";
|
|
271
|
-
async function findFiles(pattern, cwd = process.cwd()) {
|
|
272
|
-
return glob(pattern, { cwd, absolute: true });
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// src/output/formatter.ts
|
|
276
|
-
import chalk from "chalk";
|
|
277
|
-
var OutputMode = {
|
|
278
|
-
/** Output as formatted JSON */
|
|
279
|
-
JSON: "json",
|
|
280
|
-
/** Output as human-readable text */
|
|
281
|
-
TEXT: "text",
|
|
282
|
-
/** Minimal output, only errors and successes */
|
|
283
|
-
QUIET: "quiet",
|
|
284
|
-
/** Full output with detailed context and suggestions */
|
|
285
|
-
VERBOSE: "verbose"
|
|
286
|
-
};
|
|
287
|
-
var OutputFormatter = class {
|
|
288
|
-
/**
|
|
289
|
-
* Creates a new OutputFormatter.
|
|
290
|
-
*
|
|
291
|
-
* @param mode - The output mode to use. Defaults to TEXT.
|
|
292
|
-
*/
|
|
293
|
-
constructor(mode = OutputMode.TEXT) {
|
|
294
|
-
this.mode = mode;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Formats raw data for output.
|
|
298
|
-
*
|
|
299
|
-
* @param data - The data to format.
|
|
300
|
-
* @returns A string representation of the data based on the current mode.
|
|
301
|
-
*/
|
|
302
|
-
format(data) {
|
|
303
|
-
if (this.mode === OutputMode.JSON) {
|
|
304
|
-
return JSON.stringify(data, null, 2);
|
|
305
|
-
}
|
|
306
|
-
return String(data);
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Formats a validation result into a user-friendly string.
|
|
310
|
-
*
|
|
311
|
-
* @param result - The validation result to format.
|
|
312
|
-
* @returns A formatted string containing the validation status and any issues.
|
|
313
|
-
*/
|
|
314
|
-
formatValidation(result) {
|
|
315
|
-
if (this.mode === OutputMode.JSON) {
|
|
316
|
-
return JSON.stringify(result, null, 2);
|
|
317
|
-
}
|
|
318
|
-
if (this.mode === OutputMode.QUIET) {
|
|
319
|
-
if (result.valid) return "";
|
|
320
|
-
return result.issues.map((i) => `${i.file ?? ""}: ${i.message}`).join("\n");
|
|
321
|
-
}
|
|
322
|
-
const lines = [];
|
|
323
|
-
if (result.valid) {
|
|
324
|
-
lines.push(chalk.green("v validation passed"));
|
|
325
|
-
} else {
|
|
326
|
-
lines.push(chalk.red(`x Validation failed (${result.issues.length} issues)`));
|
|
327
|
-
lines.push("");
|
|
328
|
-
for (const issue of result.issues) {
|
|
329
|
-
const location = issue.file ? issue.line ? `${issue.file}:${issue.line}` : issue.file : "unknown";
|
|
330
|
-
lines.push(` ${chalk.yellow("*")} ${chalk.dim(location)}`);
|
|
331
|
-
lines.push(` ${issue.message}`);
|
|
332
|
-
if (issue.suggestion && this.mode === OutputMode.VERBOSE) {
|
|
333
|
-
lines.push(` ${chalk.dim("->")} ${issue.suggestion}`);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return lines.join("\n");
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Formats a summary line with a success/failure icon and label.
|
|
341
|
-
*
|
|
342
|
-
* @param label - The name of the field to summarize.
|
|
343
|
-
* @param value - The value to display.
|
|
344
|
-
* @param success - Whether the summary represents a success or failure state.
|
|
345
|
-
* @returns A formatted summary string, or an empty string in JSON or QUIET modes.
|
|
346
|
-
*/
|
|
347
|
-
formatSummary(label, value, success) {
|
|
348
|
-
if (this.mode === OutputMode.JSON || this.mode === OutputMode.QUIET) {
|
|
349
|
-
return "";
|
|
350
|
-
}
|
|
351
|
-
const icon = success ? chalk.green("v") : chalk.red("x");
|
|
352
|
-
return `${icon} ${label}: ${value}`;
|
|
353
|
-
}
|
|
354
|
-
};
|
|
355
|
-
|
|
356
|
-
// src/commands/check-phase-gate.ts
|
|
357
|
-
function resolveSpecPath(implFile, implPattern, specPattern, cwd) {
|
|
358
|
-
const relImpl = path2.relative(cwd, implFile).replace(/\\/g, "/");
|
|
359
|
-
const implBase = (implPattern.split("*")[0] ?? "").replace(/\/+$/, "");
|
|
360
|
-
const afterBase = relImpl.startsWith(implBase + "/") ? relImpl.slice(implBase.length + 1) : relImpl;
|
|
361
|
-
const segments = afterBase.split("/");
|
|
362
|
-
const firstSegment = segments[0] ?? "";
|
|
363
|
-
const feature = segments.length > 1 ? firstSegment : path2.basename(firstSegment, path2.extname(firstSegment));
|
|
364
|
-
const specRelative = specPattern.replace("{feature}", feature);
|
|
365
|
-
return path2.resolve(cwd, specRelative);
|
|
366
|
-
}
|
|
367
|
-
async function runCheckPhaseGate(options) {
|
|
368
|
-
const configResult = resolveConfig(options.configPath);
|
|
369
|
-
if (!configResult.ok) {
|
|
370
|
-
return configResult;
|
|
371
|
-
}
|
|
372
|
-
const config = configResult.value;
|
|
373
|
-
const cwd = options.cwd ?? (options.configPath ? path2.dirname(path2.resolve(options.configPath)) : process.cwd());
|
|
374
|
-
if (!config.phaseGates?.enabled) {
|
|
375
|
-
return Ok({
|
|
376
|
-
pass: true,
|
|
377
|
-
skipped: true,
|
|
378
|
-
missingSpecs: [],
|
|
379
|
-
checkedFiles: 0
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
const phaseGates = config.phaseGates;
|
|
383
|
-
const missingSpecs = [];
|
|
384
|
-
let checkedFiles = 0;
|
|
385
|
-
for (const mapping of phaseGates.mappings) {
|
|
386
|
-
const implFiles = await findFiles(mapping.implPattern, cwd);
|
|
387
|
-
for (const implFile of implFiles) {
|
|
388
|
-
checkedFiles++;
|
|
389
|
-
const expectedSpec = resolveSpecPath(implFile, mapping.implPattern, mapping.specPattern, cwd);
|
|
390
|
-
if (!fs2.existsSync(expectedSpec)) {
|
|
391
|
-
missingSpecs.push({
|
|
392
|
-
implFile: path2.relative(cwd, implFile).replace(/\\/g, "/"),
|
|
393
|
-
expectedSpec: path2.relative(cwd, expectedSpec).replace(/\\/g, "/")
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
const pass = missingSpecs.length === 0;
|
|
399
|
-
return Ok({
|
|
400
|
-
pass,
|
|
401
|
-
skipped: false,
|
|
402
|
-
severity: phaseGates.severity,
|
|
403
|
-
missingSpecs,
|
|
404
|
-
checkedFiles
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
function createCheckPhaseGateCommand() {
|
|
408
|
-
const command = new Command("check-phase-gate").description("Verify that implementation files have matching spec documents").action(async (_opts, cmd) => {
|
|
409
|
-
const globalOpts = cmd.optsWithGlobals();
|
|
410
|
-
const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
|
|
411
|
-
const formatter = new OutputFormatter(mode);
|
|
412
|
-
const result = await runCheckPhaseGate({
|
|
413
|
-
configPath: globalOpts.config,
|
|
414
|
-
json: globalOpts.json,
|
|
415
|
-
verbose: globalOpts.verbose,
|
|
416
|
-
quiet: globalOpts.quiet
|
|
417
|
-
});
|
|
418
|
-
if (!result.ok) {
|
|
419
|
-
if (mode === OutputMode.JSON) {
|
|
420
|
-
console.log(JSON.stringify({ error: result.error.message }));
|
|
421
|
-
} else {
|
|
422
|
-
logger.error(result.error.message);
|
|
423
|
-
}
|
|
424
|
-
process.exit(result.error.exitCode);
|
|
425
|
-
}
|
|
426
|
-
const value = result.value;
|
|
427
|
-
if (value.skipped) {
|
|
428
|
-
if (mode === OutputMode.JSON) {
|
|
429
|
-
console.log(formatter.format(value));
|
|
430
|
-
} else if (mode !== OutputMode.QUIET) {
|
|
431
|
-
logger.dim("Phase gates not enabled, skipping.");
|
|
432
|
-
}
|
|
433
|
-
process.exit(ExitCode.SUCCESS);
|
|
434
|
-
}
|
|
435
|
-
const output = formatter.formatValidation({
|
|
436
|
-
valid: value.pass,
|
|
437
|
-
issues: value.missingSpecs.map((m) => ({
|
|
438
|
-
file: m.implFile,
|
|
439
|
-
message: `Missing spec: ${m.expectedSpec}`
|
|
440
|
-
}))
|
|
441
|
-
});
|
|
442
|
-
if (output) {
|
|
443
|
-
console.log(output);
|
|
444
|
-
}
|
|
445
|
-
const summary = formatter.formatSummary(
|
|
446
|
-
"Phase gate check",
|
|
447
|
-
`${value.checkedFiles} files checked, ${value.missingSpecs.length} missing specs`,
|
|
448
|
-
value.pass
|
|
449
|
-
);
|
|
450
|
-
if (summary) {
|
|
451
|
-
console.log(summary);
|
|
452
|
-
}
|
|
453
|
-
if (!value.pass && value.severity === "error") {
|
|
454
|
-
process.exit(ExitCode.VALIDATION_FAILED);
|
|
455
|
-
}
|
|
456
|
-
process.exit(ExitCode.SUCCESS);
|
|
457
|
-
});
|
|
458
|
-
return command;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
281
|
export {
|
|
462
282
|
findConfigFile,
|
|
463
283
|
loadConfig,
|
|
464
|
-
resolveConfig
|
|
465
|
-
OutputMode,
|
|
466
|
-
OutputFormatter,
|
|
467
|
-
findFiles,
|
|
468
|
-
runCheckPhaseGate,
|
|
469
|
-
createCheckPhaseGateCommand
|
|
284
|
+
resolveConfig
|
|
470
285
|
};
|
|
@@ -26,7 +26,7 @@ var runSecurityScanDefinition = {
|
|
|
26
26
|
};
|
|
27
27
|
async function handleRunSecurityScan(input) {
|
|
28
28
|
try {
|
|
29
|
-
const core = await import("./dist-
|
|
29
|
+
const core = await import("./dist-HWXF2C3R.js");
|
|
30
30
|
const projectRoot = sanitizePath(input.path);
|
|
31
31
|
let configData = {};
|
|
32
32
|
try {
|
|
@@ -49,7 +49,7 @@ async function handleRunSecurityScan(input) {
|
|
|
49
49
|
if (input.files && input.files.length > 0) {
|
|
50
50
|
filesToScan = input.files.map((f) => path.resolve(projectRoot, f));
|
|
51
51
|
} else {
|
|
52
|
-
const { globFiles } = await import("./glob-helper-
|
|
52
|
+
const { globFiles } = await import("./glob-helper-R5FXNUPS.js");
|
|
53
53
|
filesToScan = await globFiles(projectRoot, securityConfig.exclude);
|
|
54
54
|
}
|
|
55
55
|
const result = await scanner.scanFiles(filesToScan);
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
} from "./chunk-W6Y7ZW3Y.js";
|
|
7
7
|
import {
|
|
8
8
|
Ok
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
10
10
|
|
|
11
11
|
// src/mcp/tools/entropy.ts
|
|
12
12
|
async function loadEntropyGraphOptions(projectPath) {
|
|
13
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
13
|
+
const { loadGraphStore } = await import("./graph-loader-2M2HXDQI.js");
|
|
14
14
|
const store = await loadGraphStore(projectPath);
|
|
15
15
|
if (!store) return void 0;
|
|
16
|
-
const { GraphEntropyAdapter } = await import("./dist-
|
|
16
|
+
const { GraphEntropyAdapter } = await import("./dist-B26DFXMP.js");
|
|
17
17
|
const adapter = new GraphEntropyAdapter(store);
|
|
18
18
|
const driftData = adapter.computeDriftData();
|
|
19
19
|
const deadCodeData = adapter.computeDeadCodeData();
|
|
@@ -82,9 +82,48 @@ var detectEntropyDefinition = {
|
|
|
82
82
|
required: ["path"]
|
|
83
83
|
}
|
|
84
84
|
};
|
|
85
|
+
function summarizeDrift(drift) {
|
|
86
|
+
const driftIssues = (drift.drifts ?? []).map(
|
|
87
|
+
(d) => `Drift: ${d.type}${d.file ? ` in ${d.file}` : ""}`
|
|
88
|
+
);
|
|
89
|
+
return { issueCount: driftIssues.length, topIssues: driftIssues.slice(0, 3) };
|
|
90
|
+
}
|
|
91
|
+
function summarizeDeadCode(deadCode) {
|
|
92
|
+
const deadIssues = [
|
|
93
|
+
...(deadCode.unusedImports ?? []).map(
|
|
94
|
+
(i) => `Unused import: ${i.specifiers.join(", ")} from ${i.source}`
|
|
95
|
+
),
|
|
96
|
+
...(deadCode.deadExports ?? []).map(
|
|
97
|
+
(e) => `Dead export: ${e.name} in ${e.file}`
|
|
98
|
+
),
|
|
99
|
+
...(deadCode.deadFiles ?? []).map((f) => `Dead file: ${f.path}`)
|
|
100
|
+
];
|
|
101
|
+
return { issueCount: deadIssues.length, topIssues: deadIssues.slice(0, 3) };
|
|
102
|
+
}
|
|
103
|
+
function summarizePatterns(patterns) {
|
|
104
|
+
const patternIssues = (patterns.violations ?? []).map(
|
|
105
|
+
(v) => `${v.pattern}: ${v.file}`
|
|
106
|
+
);
|
|
107
|
+
return { issueCount: patternIssues.length, topIssues: patternIssues.slice(0, 3) };
|
|
108
|
+
}
|
|
109
|
+
function buildSummaryResponse(report) {
|
|
110
|
+
const summary = {};
|
|
111
|
+
if (report.drift) summary["drift"] = summarizeDrift(report.drift);
|
|
112
|
+
if (report.deadCode) summary["deadCode"] = summarizeDeadCode(report.deadCode);
|
|
113
|
+
if (report.patterns) summary["patterns"] = summarizePatterns(report.patterns);
|
|
114
|
+
const totalIssues = Object.values(summary).reduce((s, c) => s + c.issueCount, 0);
|
|
115
|
+
return {
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "text",
|
|
119
|
+
text: JSON.stringify({ mode: "summary", totalIssues, categories: summary })
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
};
|
|
123
|
+
}
|
|
85
124
|
async function handleDetectEntropy(input) {
|
|
86
125
|
try {
|
|
87
|
-
const { EntropyAnalyzer } = await import("./dist-
|
|
126
|
+
const { EntropyAnalyzer } = await import("./dist-HWXF2C3R.js");
|
|
88
127
|
const typeFilter = input.type ?? "all";
|
|
89
128
|
const analyzer = new EntropyAnalyzer({
|
|
90
129
|
rootDir: sanitizePath(input.path),
|
|
@@ -97,54 +136,13 @@ async function handleDetectEntropy(input) {
|
|
|
97
136
|
const graphOptions = await loadEntropyGraphOptions(sanitizePath(input.path));
|
|
98
137
|
const result = await analyzer.analyze(graphOptions);
|
|
99
138
|
if (input.mode === "summary" && result.ok && !input.autoFix) {
|
|
100
|
-
|
|
101
|
-
const summary = {};
|
|
102
|
-
if (report2.drift) {
|
|
103
|
-
const driftIssues = (report2.drift.drifts ?? []).map(
|
|
104
|
-
(d) => `Drift: ${d.type}${d.file ? ` in ${d.file}` : ""}`
|
|
105
|
-
);
|
|
106
|
-
summary["drift"] = {
|
|
107
|
-
issueCount: driftIssues.length,
|
|
108
|
-
topIssues: driftIssues.slice(0, 3)
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
if (report2.deadCode) {
|
|
112
|
-
const deadIssues = [
|
|
113
|
-
...(report2.deadCode.unusedImports ?? []).map(
|
|
114
|
-
(i) => `Unused import: ${i.specifiers.join(", ")} from ${i.source}`
|
|
115
|
-
),
|
|
116
|
-
...(report2.deadCode.deadExports ?? []).map((e) => `Dead export: ${e.name} in ${e.file}`),
|
|
117
|
-
...(report2.deadCode.deadFiles ?? []).map((f) => `Dead file: ${f.path}`)
|
|
118
|
-
];
|
|
119
|
-
summary["deadCode"] = {
|
|
120
|
-
issueCount: deadIssues.length,
|
|
121
|
-
topIssues: deadIssues.slice(0, 3)
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
if (report2.patterns) {
|
|
125
|
-
const patternIssues = (report2.patterns.violations ?? []).map(
|
|
126
|
-
(v) => `${v.pattern}: ${v.file}`
|
|
127
|
-
);
|
|
128
|
-
summary["patterns"] = {
|
|
129
|
-
issueCount: patternIssues.length,
|
|
130
|
-
topIssues: patternIssues.slice(0, 3)
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
const totalIssues = Object.values(summary).reduce((s, c) => s + c.issueCount, 0);
|
|
134
|
-
return {
|
|
135
|
-
content: [
|
|
136
|
-
{
|
|
137
|
-
type: "text",
|
|
138
|
-
text: JSON.stringify({ mode: "summary", totalIssues, categories: summary })
|
|
139
|
-
}
|
|
140
|
-
]
|
|
141
|
-
};
|
|
139
|
+
return buildSummaryResponse(result.value);
|
|
142
140
|
}
|
|
143
141
|
if (!input.autoFix) {
|
|
144
142
|
return resultToMcpResponse(result);
|
|
145
143
|
}
|
|
146
144
|
if (!result.ok) return resultToMcpResponse(result);
|
|
147
|
-
const { createFixes, applyFixes, generateSuggestions } = await import("./dist-
|
|
145
|
+
const { createFixes, applyFixes, generateSuggestions } = await import("./dist-HWXF2C3R.js");
|
|
148
146
|
const report = result.value;
|
|
149
147
|
const deadCode = report.deadCode;
|
|
150
148
|
const fixTypesConfig = input.fixTypes ? { fixTypes: input.fixTypes } : void 0;
|