@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
|
@@ -1,66 +1,70 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generateCIWorkflow
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SD3SQOZ2.js";
|
|
4
4
|
import {
|
|
5
5
|
OutputFormatter,
|
|
6
6
|
OutputMode,
|
|
7
7
|
createCheckPhaseGateCommand,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
resolveConfig
|
|
11
|
-
} from "./chunk-3KOLLWWE.js";
|
|
8
|
+
findFiles
|
|
9
|
+
} from "./chunk-6KTUUFRN.js";
|
|
12
10
|
import {
|
|
13
11
|
createGenerateAgentDefinitionsCommand,
|
|
14
12
|
generateAgentDefinitions
|
|
15
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RCWZBSK5.js";
|
|
16
14
|
import {
|
|
17
15
|
listPersonas,
|
|
18
16
|
loadPersona
|
|
19
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-YQ6KC6TE.js";
|
|
20
18
|
import {
|
|
21
19
|
runPersona
|
|
22
20
|
} from "./chunk-TRAPF4IX.js";
|
|
23
21
|
import {
|
|
24
22
|
executeSkill
|
|
25
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-AOZRDOIP.js";
|
|
26
24
|
import {
|
|
27
25
|
ALLOWED_PERSONA_COMMANDS
|
|
28
26
|
} from "./chunk-TEFCFC4H.js";
|
|
29
27
|
import {
|
|
30
28
|
createCreateSkillCommand
|
|
31
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-YBJ262QL.js";
|
|
32
30
|
import {
|
|
33
31
|
logger
|
|
34
32
|
} from "./chunk-EBJQ6N4M.js";
|
|
35
33
|
import {
|
|
36
34
|
generate,
|
|
37
35
|
validate
|
|
38
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-DBSOCI3G.js";
|
|
39
37
|
import {
|
|
40
38
|
generateRuntime
|
|
41
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-FIAPHX37.js";
|
|
42
40
|
import {
|
|
43
41
|
toKebabCase
|
|
44
42
|
} from "./chunk-KET4QQZB.js";
|
|
45
43
|
import {
|
|
46
44
|
generateAgentsMd
|
|
47
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-OD3S2NHN.js";
|
|
48
46
|
import {
|
|
47
|
+
appendFrameworkAgents,
|
|
49
48
|
createGenerateSlashCommandsCommand,
|
|
50
49
|
generateSlashCommands,
|
|
51
50
|
handleGetImpact,
|
|
52
|
-
handleOrphanDeletion
|
|
53
|
-
|
|
51
|
+
handleOrphanDeletion,
|
|
52
|
+
persistToolingConfig
|
|
53
|
+
} from "./chunk-YZD2MRNQ.js";
|
|
54
54
|
import {
|
|
55
55
|
VALID_PLATFORMS
|
|
56
56
|
} from "./chunk-ZOAWBDWU.js";
|
|
57
|
+
import {
|
|
58
|
+
findConfigFile,
|
|
59
|
+
resolveConfig
|
|
60
|
+
} from "./chunk-O5OJVPL6.js";
|
|
57
61
|
import {
|
|
58
62
|
resolveGlobalSkillsDir,
|
|
59
63
|
resolvePersonasDir,
|
|
60
64
|
resolveProjectSkillsDir,
|
|
61
65
|
resolveSkillsDir,
|
|
62
66
|
resolveTemplatesDir
|
|
63
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-N5G5QMS3.js";
|
|
64
68
|
import {
|
|
65
69
|
CLIError,
|
|
66
70
|
ExitCode,
|
|
@@ -68,13 +72,13 @@ import {
|
|
|
68
72
|
} from "./chunk-3WGJMBKH.js";
|
|
69
73
|
import {
|
|
70
74
|
SkillMetadataSchema
|
|
71
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-XYLGHKG6.js";
|
|
72
76
|
import {
|
|
73
77
|
CLI_VERSION
|
|
74
78
|
} from "./chunk-BM3PWGXQ.js";
|
|
75
79
|
import {
|
|
76
80
|
TemplateEngine
|
|
77
|
-
} from "./chunk-
|
|
81
|
+
} from "./chunk-7MJAPE3Z.js";
|
|
78
82
|
import {
|
|
79
83
|
ArchBaselineManager,
|
|
80
84
|
ArchConfigSchema,
|
|
@@ -123,11 +127,11 @@ import {
|
|
|
123
127
|
validateKnowledgeMap,
|
|
124
128
|
writeConfig,
|
|
125
129
|
writeLockfile
|
|
126
|
-
} from "./chunk-
|
|
130
|
+
} from "./chunk-ABQHQ6I5.js";
|
|
127
131
|
import {
|
|
128
132
|
Err,
|
|
129
133
|
Ok
|
|
130
|
-
} from "./chunk-
|
|
134
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
131
135
|
|
|
132
136
|
// src/index.ts
|
|
133
137
|
import { Command as Command55 } from "commander";
|
|
@@ -209,7 +213,7 @@ function createValidateCommand() {
|
|
|
209
213
|
process.exit(result.error.exitCode);
|
|
210
214
|
}
|
|
211
215
|
if (opts.crossCheck) {
|
|
212
|
-
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-
|
|
216
|
+
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-WNJM6H2D.js");
|
|
213
217
|
const cwd = process.cwd();
|
|
214
218
|
const specsDir = path.join(cwd, "docs", "specs");
|
|
215
219
|
const plansDir = path.join(cwd, "docs", "plans");
|
|
@@ -562,12 +566,11 @@ function createCheckSecurityCommand() {
|
|
|
562
566
|
// src/commands/perf.ts
|
|
563
567
|
import { Command as Command5 } from "commander";
|
|
564
568
|
import * as path5 from "path";
|
|
565
|
-
function
|
|
566
|
-
const perf = new Command5("perf").description("Performance benchmark and baseline management");
|
|
569
|
+
function registerBenchCommand(perf) {
|
|
567
570
|
perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
|
|
568
571
|
const globalOpts = cmd.optsWithGlobals();
|
|
569
572
|
const cwd = process.cwd();
|
|
570
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
573
|
+
const { BenchmarkRunner } = await import("./dist-HWXF2C3R.js");
|
|
571
574
|
const runner = new BenchmarkRunner();
|
|
572
575
|
const benchFiles = runner.discover(cwd, glob);
|
|
573
576
|
if (benchFiles.length === 0) {
|
|
@@ -578,48 +581,47 @@ function createPerfCommand() {
|
|
|
578
581
|
}
|
|
579
582
|
return;
|
|
580
583
|
}
|
|
581
|
-
|
|
582
|
-
logger.info(`Found ${benchFiles.length} benchmark file(s). Running...`);
|
|
583
|
-
} else {
|
|
584
|
-
logger.info(`Found ${benchFiles.length} benchmark file(s):`);
|
|
585
|
-
for (const f of benchFiles) {
|
|
586
|
-
logger.info(` ${f}`);
|
|
587
|
-
}
|
|
588
|
-
logger.info("Running benchmarks...");
|
|
589
|
-
}
|
|
584
|
+
logBenchDiscovery(globalOpts.json, benchFiles);
|
|
590
585
|
const result = await runner.run(glob ? { cwd, glob } : { cwd });
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
586
|
+
outputBenchResults(globalOpts.json, result);
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
function logBenchDiscovery(json, benchFiles) {
|
|
590
|
+
if (json) {
|
|
591
|
+
logger.info(`Found ${benchFiles.length} benchmark file(s). Running...`);
|
|
592
|
+
} else {
|
|
593
|
+
logger.info(`Found ${benchFiles.length} benchmark file(s):`);
|
|
594
|
+
for (const f of benchFiles) logger.info(` ${f}`);
|
|
595
|
+
logger.info("Running benchmarks...");
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
function outputBenchResults(json, result) {
|
|
599
|
+
if (json) {
|
|
600
|
+
console.log(JSON.stringify({ results: result.results, success: result.success }));
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
if (result.success && result.results.length > 0) {
|
|
604
|
+
logger.info(`
|
|
596
605
|
Results (${result.results.length} benchmarks):`);
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
` ${r.file}::${r.name}: ${r.opsPerSec} ops/s (mean: ${r.meanMs.toFixed(2)}ms)`
|
|
600
|
-
);
|
|
601
|
-
}
|
|
602
|
-
logger.info("\nTo save as baselines: harness perf baselines update");
|
|
603
|
-
} else {
|
|
604
|
-
logger.info("Benchmark run completed. Check output above for details.");
|
|
605
|
-
if (result.rawOutput) {
|
|
606
|
-
console.log(result.rawOutput);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
606
|
+
for (const r of result.results) {
|
|
607
|
+
logger.info(` ${r.file}::${r.name}: ${r.opsPerSec} ops/s (mean: ${r.meanMs.toFixed(2)}ms)`);
|
|
609
608
|
}
|
|
610
|
-
|
|
609
|
+
logger.info("\nTo save as baselines: harness perf baselines update");
|
|
610
|
+
} else {
|
|
611
|
+
logger.info("Benchmark run completed. Check output above for details.");
|
|
612
|
+
if (result.rawOutput) console.log(result.rawOutput);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
function registerBaselinesCommands(perf) {
|
|
611
616
|
const baselines = perf.command("baselines").description("Manage performance baselines");
|
|
612
617
|
baselines.command("show").description("Display current baselines").action(async (_opts, cmd) => {
|
|
613
618
|
const globalOpts = cmd.optsWithGlobals();
|
|
614
|
-
const
|
|
615
|
-
const manager = new BaselineManager(cwd);
|
|
619
|
+
const manager = new BaselineManager(process.cwd());
|
|
616
620
|
const data = manager.load();
|
|
617
621
|
if (!data) {
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
logger.info("No baselines file found at .harness/perf/baselines.json");
|
|
622
|
-
}
|
|
622
|
+
console.log(
|
|
623
|
+
globalOpts.json ? JSON.stringify({ baselines: null, message: "No baselines file found" }) : "No baselines file found at .harness/perf/baselines.json"
|
|
624
|
+
);
|
|
623
625
|
return;
|
|
624
626
|
}
|
|
625
627
|
if (globalOpts.json) {
|
|
@@ -636,7 +638,7 @@ Results (${result.results.length} benchmarks):`);
|
|
|
636
638
|
baselines.command("update").description("Update baselines from latest benchmark run").action(async (_opts, cmd) => {
|
|
637
639
|
const globalOpts = cmd.optsWithGlobals();
|
|
638
640
|
const cwd = process.cwd();
|
|
639
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
641
|
+
const { BenchmarkRunner } = await import("./dist-HWXF2C3R.js");
|
|
640
642
|
const runner = new BenchmarkRunner();
|
|
641
643
|
const manager = new BaselineManager(cwd);
|
|
642
644
|
logger.info("Running benchmarks to update baselines...");
|
|
@@ -647,12 +649,7 @@ Results (${result.results.length} benchmarks):`);
|
|
|
647
649
|
);
|
|
648
650
|
return;
|
|
649
651
|
}
|
|
650
|
-
|
|
651
|
-
try {
|
|
652
|
-
const { execSync: execSync5 } = await import("child_process");
|
|
653
|
-
commitHash = execSync5("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
|
|
654
|
-
} catch {
|
|
655
|
-
}
|
|
652
|
+
const commitHash = await getCommitHash(cwd);
|
|
656
653
|
manager.save(benchResult.results, commitHash);
|
|
657
654
|
if (globalOpts.json) {
|
|
658
655
|
console.log(JSON.stringify({ updated: benchResult.results.length, commitHash }));
|
|
@@ -661,10 +658,20 @@ Results (${result.results.length} benchmarks):`);
|
|
|
661
658
|
logger.info("Baselines saved to .harness/perf/baselines.json");
|
|
662
659
|
}
|
|
663
660
|
});
|
|
661
|
+
}
|
|
662
|
+
async function getCommitHash(cwd) {
|
|
663
|
+
try {
|
|
664
|
+
const { execSync: execSync5 } = await import("child_process");
|
|
665
|
+
return execSync5("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
|
|
666
|
+
} catch {
|
|
667
|
+
return "unknown";
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
function registerReportCommand(perf) {
|
|
664
671
|
perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
|
|
665
672
|
const globalOpts = cmd.optsWithGlobals();
|
|
666
673
|
const cwd = process.cwd();
|
|
667
|
-
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-
|
|
674
|
+
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-HWXF2C3R.js");
|
|
668
675
|
const analyzer = new EntropyAnalyzer2({
|
|
669
676
|
rootDir: path5.resolve(cwd),
|
|
670
677
|
analyze: { complexity: true, coupling: true }
|
|
@@ -701,10 +708,11 @@ Results (${result.results.length} benchmarks):`);
|
|
|
701
708
|
}
|
|
702
709
|
}
|
|
703
710
|
});
|
|
711
|
+
}
|
|
712
|
+
function registerCriticalPathsCommand(perf) {
|
|
704
713
|
perf.command("critical-paths").description("Show resolved critical path set (annotations + graph inference)").action(async (_opts, cmd) => {
|
|
705
714
|
const globalOpts = cmd.optsWithGlobals();
|
|
706
|
-
const
|
|
707
|
-
const resolver = new CriticalPathResolver(cwd);
|
|
715
|
+
const resolver = new CriticalPathResolver(process.cwd());
|
|
708
716
|
const result = await resolver.resolve();
|
|
709
717
|
if (globalOpts.json) {
|
|
710
718
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -719,12 +727,29 @@ Results (${result.results.length} benchmarks):`);
|
|
|
719
727
|
}
|
|
720
728
|
}
|
|
721
729
|
});
|
|
730
|
+
}
|
|
731
|
+
function createPerfCommand() {
|
|
732
|
+
const perf = new Command5("perf").description("Performance benchmark and baseline management");
|
|
733
|
+
registerBenchCommand(perf);
|
|
734
|
+
registerBaselinesCommands(perf);
|
|
735
|
+
registerReportCommand(perf);
|
|
736
|
+
registerCriticalPathsCommand(perf);
|
|
722
737
|
return perf;
|
|
723
738
|
}
|
|
724
739
|
|
|
725
740
|
// src/commands/check-docs.ts
|
|
726
741
|
import { Command as Command6 } from "commander";
|
|
727
742
|
import * as path6 from "path";
|
|
743
|
+
|
|
744
|
+
// src/utils/output.ts
|
|
745
|
+
function resolveOutputMode(globalOpts) {
|
|
746
|
+
if (globalOpts.json) return OutputMode.JSON;
|
|
747
|
+
if (globalOpts.quiet) return OutputMode.QUIET;
|
|
748
|
+
if (globalOpts.verbose) return OutputMode.VERBOSE;
|
|
749
|
+
return OutputMode.TEXT;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// src/commands/check-docs.ts
|
|
728
753
|
async function runCheckDocs(options) {
|
|
729
754
|
const cwd = options.cwd ?? process.cwd();
|
|
730
755
|
const minCoverage = options.minCoverage ?? 80;
|
|
@@ -775,7 +800,7 @@ async function runCheckDocs(options) {
|
|
|
775
800
|
function createCheckDocsCommand() {
|
|
776
801
|
const command = new Command6("check-docs").description("Check documentation coverage").option("--min-coverage <percent>", "Minimum coverage percentage", "80").action(async (opts, cmd) => {
|
|
777
802
|
const globalOpts = cmd.optsWithGlobals();
|
|
778
|
-
const mode = globalOpts
|
|
803
|
+
const mode = resolveOutputMode(globalOpts);
|
|
779
804
|
const formatter = new OutputFormatter(mode);
|
|
780
805
|
const result = await runCheckDocs({
|
|
781
806
|
configPath: globalOpts.config,
|
|
@@ -945,7 +970,6 @@ function createSetupMcpCommand() {
|
|
|
945
970
|
async function runInit(options) {
|
|
946
971
|
const cwd = options.cwd ?? process.cwd();
|
|
947
972
|
const name = options.name ?? path8.basename(cwd);
|
|
948
|
-
const level = options.level ?? "basic";
|
|
949
973
|
const force = options.force ?? false;
|
|
950
974
|
const configPath = path8.join(cwd, "harness.config.json");
|
|
951
975
|
if (!force && fs2.existsSync(configPath)) {
|
|
@@ -953,33 +977,82 @@ async function runInit(options) {
|
|
|
953
977
|
new CLIError("Project already initialized. Use --force to overwrite.", ExitCode.ERROR)
|
|
954
978
|
);
|
|
955
979
|
}
|
|
956
|
-
const
|
|
957
|
-
const
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
|
|
980
|
+
const engine = new TemplateEngine(resolveTemplatesDir());
|
|
981
|
+
const templates = engine.listTemplates();
|
|
982
|
+
const templateList = templates.ok ? templates.value : [];
|
|
983
|
+
const validationError = validateFrameworkLanguage(options, templateList);
|
|
984
|
+
if (validationError) return Err(validationError);
|
|
985
|
+
const detected = tryAutoDetect(engine, cwd, options);
|
|
986
|
+
if (detected) return Ok(detected);
|
|
987
|
+
const language = resolveLanguage(options, templateList);
|
|
988
|
+
return scaffoldProject(engine, { cwd, name, force, language, options });
|
|
989
|
+
}
|
|
990
|
+
function validateFrameworkLanguage(options, templateList) {
|
|
991
|
+
if (!options.framework || !options.language) return null;
|
|
992
|
+
const fwTemplate = templateList.find((t) => t.framework === options.framework);
|
|
993
|
+
if (fwTemplate?.language && fwTemplate.language !== options.language) {
|
|
994
|
+
return new CLIError(
|
|
995
|
+
`Framework "${options.framework}" is a ${fwTemplate.language} framework, but --language ${options.language} was specified. Remove --language or use --language ${fwTemplate.language}.`,
|
|
996
|
+
ExitCode.ERROR
|
|
997
|
+
);
|
|
961
998
|
}
|
|
999
|
+
return null;
|
|
1000
|
+
}
|
|
1001
|
+
function tryAutoDetect(engine, cwd, options) {
|
|
1002
|
+
if (options.framework || options.language) return null;
|
|
1003
|
+
const detectResult = engine.detectFramework(cwd);
|
|
1004
|
+
if (detectResult.ok && detectResult.value.length > 0) {
|
|
1005
|
+
return { filesCreated: [], skippedConfigs: [], detectedFrameworks: detectResult.value };
|
|
1006
|
+
}
|
|
1007
|
+
return null;
|
|
1008
|
+
}
|
|
1009
|
+
function resolveLanguage(options, templateList) {
|
|
1010
|
+
if (options.language) return options.language;
|
|
1011
|
+
if (options.framework) {
|
|
1012
|
+
const fwTemplate = templateList.find((t) => t.framework === options.framework);
|
|
1013
|
+
if (fwTemplate?.language) return fwTemplate.language;
|
|
1014
|
+
}
|
|
1015
|
+
return void 0;
|
|
1016
|
+
}
|
|
1017
|
+
function scaffoldProject(engine, ctx) {
|
|
1018
|
+
const { cwd, name, force, language, options } = ctx;
|
|
1019
|
+
const isNonJs = language && language !== "typescript";
|
|
1020
|
+
const level = isNonJs ? void 0 : options.level ?? "basic";
|
|
1021
|
+
const resolveResult = engine.resolveTemplate(level, options.framework, language);
|
|
1022
|
+
if (!resolveResult.ok) return Err(new CLIError(resolveResult.error.message, ExitCode.ERROR));
|
|
962
1023
|
const renderResult = engine.render(resolveResult.value, {
|
|
963
1024
|
projectName: name,
|
|
964
|
-
level,
|
|
965
|
-
...options.framework !== void 0 && { framework: options.framework }
|
|
1025
|
+
level: level ?? "",
|
|
1026
|
+
...options.framework !== void 0 && { framework: options.framework },
|
|
1027
|
+
...language !== void 0 && { language }
|
|
966
1028
|
});
|
|
967
|
-
if (!renderResult.ok)
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
1029
|
+
if (!renderResult.ok) return Err(new CLIError(renderResult.error.message, ExitCode.ERROR));
|
|
1030
|
+
const writeResult = engine.write(renderResult.value, cwd, {
|
|
1031
|
+
overwrite: force,
|
|
1032
|
+
...language !== void 0 && { language }
|
|
1033
|
+
});
|
|
1034
|
+
if (!writeResult.ok) return Err(new CLIError(writeResult.error.message, ExitCode.ERROR));
|
|
1035
|
+
if (writeResult.value.skippedConfigs.length > 0) {
|
|
1036
|
+
logger.warn("Skipped existing package config files:");
|
|
1037
|
+
for (const file of writeResult.value.skippedConfigs) {
|
|
1038
|
+
logger.info(` - ${file} (add harness dependencies manually)`);
|
|
1039
|
+
}
|
|
973
1040
|
}
|
|
974
|
-
|
|
1041
|
+
persistToolingConfig(cwd, resolveResult.value, options.framework);
|
|
1042
|
+
appendFrameworkAgents(cwd, options.framework, language);
|
|
1043
|
+
return Ok({
|
|
1044
|
+
filesCreated: writeResult.value.written,
|
|
1045
|
+
skippedConfigs: writeResult.value.skippedConfigs
|
|
1046
|
+
});
|
|
975
1047
|
}
|
|
976
1048
|
function createInitCommand() {
|
|
977
|
-
const command = new Command8("init").description("Initialize a new harness-engineering project").option("-n, --name <name>", "Project name").option("-l, --level <level>", "Adoption level (basic, intermediate, advanced)", "basic").option("--framework <framework>", "Framework overlay (nextjs)").option("-f, --force", "Overwrite existing files").option("-y, --yes", "Use defaults without prompting").action(async (opts, cmd) => {
|
|
1049
|
+
const command = new Command8("init").description("Initialize a new harness-engineering project").option("-n, --name <name>", "Project name").option("-l, --level <level>", "Adoption level (basic, intermediate, advanced)", "basic").option("--framework <framework>", "Framework overlay (nextjs)").option("--language <language>", "Target language (typescript, python, go, rust, java)").option("-f, --force", "Overwrite existing files").option("-y, --yes", "Use defaults without prompting").action(async (opts, cmd) => {
|
|
978
1050
|
const globalOpts = cmd.optsWithGlobals();
|
|
979
1051
|
const result = await runInit({
|
|
980
1052
|
name: opts.name,
|
|
981
1053
|
level: opts.level,
|
|
982
1054
|
framework: opts.framework,
|
|
1055
|
+
language: opts.language,
|
|
983
1056
|
force: opts.force
|
|
984
1057
|
});
|
|
985
1058
|
if (!result.ok) {
|
|
@@ -1075,10 +1148,39 @@ async function runCleanup(options) {
|
|
|
1075
1148
|
result.totalIssues = result.driftIssues.length + result.deadCode.length + result.patternViolations.length;
|
|
1076
1149
|
return Ok(result);
|
|
1077
1150
|
}
|
|
1151
|
+
function printCleanupResult(value, formatter) {
|
|
1152
|
+
console.log(
|
|
1153
|
+
formatter.formatSummary("Entropy issues", value.totalIssues.toString(), value.totalIssues === 0)
|
|
1154
|
+
);
|
|
1155
|
+
if (value.driftIssues.length > 0) {
|
|
1156
|
+
console.log("\nDocumentation drift:");
|
|
1157
|
+
for (const issue of value.driftIssues) {
|
|
1158
|
+
console.log(` - ${issue.file}: ${issue.issue}`);
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
if (value.deadCode.length > 0) {
|
|
1162
|
+
console.log("\nDead code:");
|
|
1163
|
+
for (const item of value.deadCode.slice(0, 10)) {
|
|
1164
|
+
console.log(` - ${item.file}${item.symbol ? `: ${item.symbol}` : ""}`);
|
|
1165
|
+
}
|
|
1166
|
+
if (value.deadCode.length > 10) {
|
|
1167
|
+
console.log(` ... and ${value.deadCode.length - 10} more`);
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
if (value.patternViolations.length > 0) {
|
|
1171
|
+
console.log("\nPattern violations:");
|
|
1172
|
+
for (const violation of value.patternViolations.slice(0, 10)) {
|
|
1173
|
+
console.log(` - ${violation.file} [${violation.pattern}]: ${violation.message}`);
|
|
1174
|
+
}
|
|
1175
|
+
if (value.patternViolations.length > 10) {
|
|
1176
|
+
console.log(` ... and ${value.patternViolations.length - 10} more`);
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1078
1180
|
function createCleanupCommand() {
|
|
1079
1181
|
const command = new Command9("cleanup").description("Detect entropy issues (doc drift, dead code, patterns)").option("-t, --type <type>", "Issue type: drift, dead-code, patterns, all", "all").action(async (opts, cmd) => {
|
|
1080
1182
|
const globalOpts = cmd.optsWithGlobals();
|
|
1081
|
-
const mode = globalOpts
|
|
1183
|
+
const mode = resolveOutputMode(globalOpts);
|
|
1082
1184
|
const formatter = new OutputFormatter(mode);
|
|
1083
1185
|
const result = await runCleanup({
|
|
1084
1186
|
configPath: globalOpts.config,
|
|
@@ -1098,37 +1200,7 @@ function createCleanupCommand() {
|
|
|
1098
1200
|
if (mode === OutputMode.JSON) {
|
|
1099
1201
|
console.log(JSON.stringify(result.value, null, 2));
|
|
1100
1202
|
} else if (mode !== OutputMode.QUIET || result.value.totalIssues > 0) {
|
|
1101
|
-
|
|
1102
|
-
formatter.formatSummary(
|
|
1103
|
-
"Entropy issues",
|
|
1104
|
-
result.value.totalIssues.toString(),
|
|
1105
|
-
result.value.totalIssues === 0
|
|
1106
|
-
)
|
|
1107
|
-
);
|
|
1108
|
-
if (result.value.driftIssues.length > 0) {
|
|
1109
|
-
console.log("\nDocumentation drift:");
|
|
1110
|
-
for (const issue of result.value.driftIssues) {
|
|
1111
|
-
console.log(` - ${issue.file}: ${issue.issue}`);
|
|
1112
|
-
}
|
|
1113
|
-
}
|
|
1114
|
-
if (result.value.deadCode.length > 0) {
|
|
1115
|
-
console.log("\nDead code:");
|
|
1116
|
-
for (const item of result.value.deadCode.slice(0, 10)) {
|
|
1117
|
-
console.log(` - ${item.file}${item.symbol ? `: ${item.symbol}` : ""}`);
|
|
1118
|
-
}
|
|
1119
|
-
if (result.value.deadCode.length > 10) {
|
|
1120
|
-
console.log(` ... and ${result.value.deadCode.length - 10} more`);
|
|
1121
|
-
}
|
|
1122
|
-
}
|
|
1123
|
-
if (result.value.patternViolations.length > 0) {
|
|
1124
|
-
console.log("\nPattern violations:");
|
|
1125
|
-
for (const violation of result.value.patternViolations.slice(0, 10)) {
|
|
1126
|
-
console.log(` - ${violation.file} [${violation.pattern}]: ${violation.message}`);
|
|
1127
|
-
}
|
|
1128
|
-
if (result.value.patternViolations.length > 10) {
|
|
1129
|
-
console.log(` ... and ${result.value.patternViolations.length - 10} more`);
|
|
1130
|
-
}
|
|
1131
|
-
}
|
|
1203
|
+
printCleanupResult(result.value, formatter);
|
|
1132
1204
|
}
|
|
1133
1205
|
process.exit(result.value.totalIssues === 0 ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
|
|
1134
1206
|
});
|
|
@@ -1236,10 +1308,42 @@ async function runFixDrift(options) {
|
|
|
1236
1308
|
};
|
|
1237
1309
|
return Ok(result);
|
|
1238
1310
|
}
|
|
1311
|
+
function printFixDriftResult(value, mode, formatter) {
|
|
1312
|
+
const statusMessage = value.dryRun ? "(dry-run)" : "";
|
|
1313
|
+
console.log(
|
|
1314
|
+
formatter.formatSummary(
|
|
1315
|
+
`Fix drift ${statusMessage}`,
|
|
1316
|
+
`${value.fixes.length} fixes, ${value.suggestions.length} suggestions`,
|
|
1317
|
+
value.fixes.length === 0 && value.suggestions.length === 0
|
|
1318
|
+
)
|
|
1319
|
+
);
|
|
1320
|
+
if (value.fixes.length > 0) {
|
|
1321
|
+
console.log("\nFixes:");
|
|
1322
|
+
for (const fix of value.fixes.slice(0, 10)) {
|
|
1323
|
+
const status = fix.applied ? "[applied]" : "[pending]";
|
|
1324
|
+
console.log(` ${status} ${fix.action}: ${fix.file}`);
|
|
1325
|
+
}
|
|
1326
|
+
if (value.fixes.length > 10) {
|
|
1327
|
+
console.log(` ... and ${value.fixes.length - 10} more`);
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
if (value.suggestions.length > 0 && (mode === OutputMode.VERBOSE || value.fixes.length === 0)) {
|
|
1331
|
+
console.log("\nSuggestions:");
|
|
1332
|
+
for (const suggestion of value.suggestions.slice(0, 10)) {
|
|
1333
|
+
console.log(` - ${suggestion.file}: ${suggestion.suggestion}`);
|
|
1334
|
+
}
|
|
1335
|
+
if (value.suggestions.length > 10) {
|
|
1336
|
+
console.log(` ... and ${value.suggestions.length - 10} more`);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
if (value.dryRun && value.fixes.length > 0) {
|
|
1340
|
+
console.log("\nRun with --no-dry-run to apply fixes.");
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1239
1343
|
function createFixDriftCommand() {
|
|
1240
1344
|
const command = new Command10("fix-drift").description("Auto-fix entropy issues (doc drift, dead code)").option("--no-dry-run", "Actually apply fixes (default is dry-run mode)").action(async (opts, cmd) => {
|
|
1241
1345
|
const globalOpts = cmd.optsWithGlobals();
|
|
1242
|
-
const mode = globalOpts
|
|
1346
|
+
const mode = resolveOutputMode(globalOpts);
|
|
1243
1347
|
const formatter = new OutputFormatter(mode);
|
|
1244
1348
|
const result = await runFixDrift({
|
|
1245
1349
|
configPath: globalOpts.config,
|
|
@@ -1259,37 +1363,7 @@ function createFixDriftCommand() {
|
|
|
1259
1363
|
if (mode === OutputMode.JSON) {
|
|
1260
1364
|
console.log(JSON.stringify(result.value, null, 2));
|
|
1261
1365
|
} else if (mode !== OutputMode.QUIET || result.value.fixes.length > 0 || result.value.suggestions.length > 0) {
|
|
1262
|
-
|
|
1263
|
-
const statusMessage = value.dryRun ? "(dry-run)" : "";
|
|
1264
|
-
console.log(
|
|
1265
|
-
formatter.formatSummary(
|
|
1266
|
-
`Fix drift ${statusMessage}`,
|
|
1267
|
-
`${value.fixes.length} fixes, ${value.suggestions.length} suggestions`,
|
|
1268
|
-
value.fixes.length === 0 && value.suggestions.length === 0
|
|
1269
|
-
)
|
|
1270
|
-
);
|
|
1271
|
-
if (value.fixes.length > 0) {
|
|
1272
|
-
console.log("\nFixes:");
|
|
1273
|
-
for (const fix of value.fixes.slice(0, 10)) {
|
|
1274
|
-
const status = fix.applied ? "[applied]" : "[pending]";
|
|
1275
|
-
console.log(` ${status} ${fix.action}: ${fix.file}`);
|
|
1276
|
-
}
|
|
1277
|
-
if (value.fixes.length > 10) {
|
|
1278
|
-
console.log(` ... and ${value.fixes.length - 10} more`);
|
|
1279
|
-
}
|
|
1280
|
-
}
|
|
1281
|
-
if (value.suggestions.length > 0 && (mode === OutputMode.VERBOSE || value.fixes.length === 0)) {
|
|
1282
|
-
console.log("\nSuggestions:");
|
|
1283
|
-
for (const suggestion of value.suggestions.slice(0, 10)) {
|
|
1284
|
-
console.log(` - ${suggestion.file}: ${suggestion.suggestion}`);
|
|
1285
|
-
}
|
|
1286
|
-
if (value.suggestions.length > 10) {
|
|
1287
|
-
console.log(` ... and ${value.suggestions.length - 10} more`);
|
|
1288
|
-
}
|
|
1289
|
-
}
|
|
1290
|
-
if (value.dryRun && value.fixes.length > 0) {
|
|
1291
|
-
console.log("\nRun with --no-dry-run to apply fixes.");
|
|
1292
|
-
}
|
|
1366
|
+
printFixDriftResult(result.value, mode, formatter);
|
|
1293
1367
|
}
|
|
1294
1368
|
process.exit(ExitCode.SUCCESS);
|
|
1295
1369
|
});
|
|
@@ -1354,49 +1428,54 @@ var VALID_TRIGGERS = /* @__PURE__ */ new Set([
|
|
|
1354
1428
|
"on_plan_approved",
|
|
1355
1429
|
"auto"
|
|
1356
1430
|
]);
|
|
1431
|
+
function resolveTrigger(triggerOpt) {
|
|
1432
|
+
if (triggerOpt === "auto") return "auto";
|
|
1433
|
+
return VALID_TRIGGERS.has(triggerOpt) ? triggerOpt : "manual";
|
|
1434
|
+
}
|
|
1435
|
+
function createCommandExecutor() {
|
|
1436
|
+
return async (command) => {
|
|
1437
|
+
if (!ALLOWED_PERSONA_COMMANDS.has(command)) {
|
|
1438
|
+
return Err(new Error(`Unknown harness command: ${command}`));
|
|
1439
|
+
}
|
|
1440
|
+
try {
|
|
1441
|
+
childProcess.execFileSync("npx", ["harness", command], { stdio: "inherit" });
|
|
1442
|
+
return Ok(null);
|
|
1443
|
+
} catch (error) {
|
|
1444
|
+
return Err(new Error(error instanceof Error ? error.message : String(error)));
|
|
1445
|
+
}
|
|
1446
|
+
};
|
|
1447
|
+
}
|
|
1448
|
+
async function runPersonaMode(opts, quiet) {
|
|
1449
|
+
const personasDir = resolvePersonasDir();
|
|
1450
|
+
const filePath = path11.join(personasDir, `${opts.persona}.yaml`);
|
|
1451
|
+
const personaResult = loadPersona(filePath);
|
|
1452
|
+
if (!personaResult.ok) {
|
|
1453
|
+
logger.error(personaResult.error.message);
|
|
1454
|
+
process.exit(ExitCode.ERROR);
|
|
1455
|
+
}
|
|
1456
|
+
const report = await runPersona(personaResult.value, {
|
|
1457
|
+
trigger: resolveTrigger(opts.trigger),
|
|
1458
|
+
commandExecutor: createCommandExecutor(),
|
|
1459
|
+
skillExecutor: executeSkill,
|
|
1460
|
+
projectPath: process.cwd()
|
|
1461
|
+
});
|
|
1462
|
+
if (!quiet) {
|
|
1463
|
+
logger.info(`Persona '${report.persona}' status: ${report.status}`);
|
|
1464
|
+
for (const s of report.steps) {
|
|
1465
|
+
const icon = s.status === "pass" ? "v" : s.status === "fail" ? "x" : "-";
|
|
1466
|
+
const typeTag = s.type === "skill" ? " [skill]" : "";
|
|
1467
|
+
console.log(` [${icon}] ${s.name}${typeTag} (${s.durationMs}ms)`);
|
|
1468
|
+
if (s.artifactPath) console.log(` artifact: ${s.artifactPath}`);
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
|
|
1472
|
+
}
|
|
1357
1473
|
function createRunCommand() {
|
|
1358
1474
|
return new Command11("run").description("Run an agent task").argument("[task]", "Task to run (review, doc-review, test-review)").option("--timeout <ms>", "Timeout in milliseconds", "300000").option("--persona <name>", "Run a persona by name").option("--trigger <context>", "Trigger context (auto, on_pr, on_commit, manual)", "auto").action(async (task, opts, cmd) => {
|
|
1359
1475
|
const globalOpts = cmd.optsWithGlobals();
|
|
1360
1476
|
if (opts.persona) {
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
const personaResult = loadPersona(filePath);
|
|
1364
|
-
if (!personaResult.ok) {
|
|
1365
|
-
logger.error(personaResult.error.message);
|
|
1366
|
-
process.exit(ExitCode.ERROR);
|
|
1367
|
-
}
|
|
1368
|
-
const persona = personaResult.value;
|
|
1369
|
-
const projectPath = process.cwd();
|
|
1370
|
-
const trigger = opts.trigger === "auto" ? "auto" : VALID_TRIGGERS.has(opts.trigger) ? opts.trigger : "manual";
|
|
1371
|
-
const commandExecutor = async (command) => {
|
|
1372
|
-
if (!ALLOWED_PERSONA_COMMANDS.has(command)) {
|
|
1373
|
-
return Err(new Error(`Unknown harness command: ${command}`));
|
|
1374
|
-
}
|
|
1375
|
-
try {
|
|
1376
|
-
childProcess.execFileSync("npx", ["harness", command], { stdio: "inherit" });
|
|
1377
|
-
return Ok(null);
|
|
1378
|
-
} catch (error) {
|
|
1379
|
-
return Err(new Error(error instanceof Error ? error.message : String(error)));
|
|
1380
|
-
}
|
|
1381
|
-
};
|
|
1382
|
-
const report = await runPersona(persona, {
|
|
1383
|
-
trigger,
|
|
1384
|
-
commandExecutor,
|
|
1385
|
-
skillExecutor: executeSkill,
|
|
1386
|
-
projectPath
|
|
1387
|
-
});
|
|
1388
|
-
if (!globalOpts.quiet) {
|
|
1389
|
-
logger.info(`Persona '${report.persona}' status: ${report.status}`);
|
|
1390
|
-
for (const s of report.steps) {
|
|
1391
|
-
const icon = s.status === "pass" ? "v" : s.status === "fail" ? "x" : "-";
|
|
1392
|
-
const typeTag = s.type === "skill" ? " [skill]" : "";
|
|
1393
|
-
console.log(` [${icon}] ${s.name}${typeTag} (${s.durationMs}ms)`);
|
|
1394
|
-
if (s.artifactPath) {
|
|
1395
|
-
console.log(` artifact: ${s.artifactPath}`);
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1398
|
-
}
|
|
1399
|
-
process.exit(report.status === "fail" ? ExitCode.ERROR : ExitCode.SUCCESS);
|
|
1477
|
+
await runPersonaMode(opts, globalOpts.quiet);
|
|
1478
|
+
return;
|
|
1400
1479
|
}
|
|
1401
1480
|
if (!task) {
|
|
1402
1481
|
logger.error("Either a task argument or --persona flag is required.");
|
|
@@ -1607,7 +1686,8 @@ async function runAdd(componentType, name, options) {
|
|
|
1607
1686
|
break;
|
|
1608
1687
|
}
|
|
1609
1688
|
case "doc": {
|
|
1610
|
-
const
|
|
1689
|
+
const configDocsDir = configResult.ok ? configResult.value.docsDir : "./docs";
|
|
1690
|
+
const docsDir = path12.resolve(cwd, configDocsDir);
|
|
1611
1691
|
if (!fs3.existsSync(docsDir)) {
|
|
1612
1692
|
fs3.mkdirSync(docsDir, { recursive: true });
|
|
1613
1693
|
}
|
|
@@ -1616,11 +1696,11 @@ async function runAdd(componentType, name, options) {
|
|
|
1616
1696
|
return Err(new CLIError(`Doc ${name} already exists`, ExitCode.ERROR));
|
|
1617
1697
|
}
|
|
1618
1698
|
fs3.writeFileSync(docPath, DOC_TEMPLATE(name));
|
|
1619
|
-
created.push(
|
|
1699
|
+
created.push(`${configDocsDir.replace(/^\.[\\/]/, "")}/${name}.md`);
|
|
1620
1700
|
break;
|
|
1621
1701
|
}
|
|
1622
1702
|
case "skill": {
|
|
1623
|
-
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-
|
|
1703
|
+
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-XSWHMSM5.js");
|
|
1624
1704
|
generateSkillFiles2({
|
|
1625
1705
|
name,
|
|
1626
1706
|
description: `${name} skill`,
|
|
@@ -1984,6 +2064,33 @@ function scanDirectory(dirPath, source) {
|
|
|
1984
2064
|
}
|
|
1985
2065
|
return skills;
|
|
1986
2066
|
}
|
|
2067
|
+
function collectCommunitySkills(seen, allSkills) {
|
|
2068
|
+
const globalDir = resolveGlobalSkillsDir();
|
|
2069
|
+
const skillsDir = path15.dirname(globalDir);
|
|
2070
|
+
const communityBase = path15.join(skillsDir, "community");
|
|
2071
|
+
const communityPlatformDir = path15.join(communityBase, "claude-code");
|
|
2072
|
+
const lockfilePath = path15.join(communityBase, "skills-lock.json");
|
|
2073
|
+
const lockfile = readLockfile2(lockfilePath);
|
|
2074
|
+
const communitySkills = scanDirectory(communityPlatformDir, "community");
|
|
2075
|
+
for (const skill of communitySkills) {
|
|
2076
|
+
const lockEntry = lockfile.skills[`@harness-skills/${skill.name}`];
|
|
2077
|
+
if (lockEntry) skill.version = lockEntry.version;
|
|
2078
|
+
}
|
|
2079
|
+
for (const [pkgName, entry] of Object.entries(lockfile.skills)) {
|
|
2080
|
+
const shortName = pkgName.replace("@harness-skills/", "");
|
|
2081
|
+
if (!seen.has(shortName)) {
|
|
2082
|
+
seen.add(shortName);
|
|
2083
|
+
allSkills.push({
|
|
2084
|
+
name: shortName,
|
|
2085
|
+
description: "",
|
|
2086
|
+
type: "",
|
|
2087
|
+
source: "community",
|
|
2088
|
+
version: entry.version
|
|
2089
|
+
});
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
return communitySkills;
|
|
2093
|
+
}
|
|
1987
2094
|
function collectSkills(opts) {
|
|
1988
2095
|
const seen = /* @__PURE__ */ new Set();
|
|
1989
2096
|
const allSkills = [];
|
|
@@ -2002,34 +2109,7 @@ function collectSkills(opts) {
|
|
|
2002
2109
|
}
|
|
2003
2110
|
}
|
|
2004
2111
|
if (opts.filter === "all" || opts.filter === "installed") {
|
|
2005
|
-
|
|
2006
|
-
const skillsDir = path15.dirname(globalDir);
|
|
2007
|
-
const communityBase = path15.join(skillsDir, "community");
|
|
2008
|
-
const communityPlatformDir = path15.join(communityBase, "claude-code");
|
|
2009
|
-
const lockfilePath = path15.join(communityBase, "skills-lock.json");
|
|
2010
|
-
const lockfile = readLockfile2(lockfilePath);
|
|
2011
|
-
const communitySkills = scanDirectory(communityPlatformDir, "community");
|
|
2012
|
-
for (const skill of communitySkills) {
|
|
2013
|
-
const pkgName = `@harness-skills/${skill.name}`;
|
|
2014
|
-
const lockEntry = lockfile.skills[pkgName];
|
|
2015
|
-
if (lockEntry) {
|
|
2016
|
-
skill.version = lockEntry.version;
|
|
2017
|
-
}
|
|
2018
|
-
}
|
|
2019
|
-
addUnique(communitySkills);
|
|
2020
|
-
for (const [pkgName, entry] of Object.entries(lockfile.skills)) {
|
|
2021
|
-
const shortName = pkgName.replace("@harness-skills/", "");
|
|
2022
|
-
if (!seen.has(shortName)) {
|
|
2023
|
-
seen.add(shortName);
|
|
2024
|
-
allSkills.push({
|
|
2025
|
-
name: shortName,
|
|
2026
|
-
description: "",
|
|
2027
|
-
type: "",
|
|
2028
|
-
source: "community",
|
|
2029
|
-
version: entry.version
|
|
2030
|
-
});
|
|
2031
|
-
}
|
|
2032
|
-
}
|
|
2112
|
+
addUnique(collectCommunitySkills(seen, allSkills));
|
|
2033
2113
|
}
|
|
2034
2114
|
if (opts.filter === "all") {
|
|
2035
2115
|
const globalDir = resolveGlobalSkillsDir();
|
|
@@ -2163,6 +2243,69 @@ ${options.priorState}`);
|
|
|
2163
2243
|
}
|
|
2164
2244
|
|
|
2165
2245
|
// src/commands/skill/run.ts
|
|
2246
|
+
function loadSkillMetadata(skillDir) {
|
|
2247
|
+
const yamlPath = path16.join(skillDir, "skill.yaml");
|
|
2248
|
+
if (!fs7.existsSync(yamlPath)) return null;
|
|
2249
|
+
try {
|
|
2250
|
+
const result = SkillMetadataSchema.safeParse(parse2(fs7.readFileSync(yamlPath, "utf-8")));
|
|
2251
|
+
return result.success ? result.data : null;
|
|
2252
|
+
} catch {
|
|
2253
|
+
return null;
|
|
2254
|
+
}
|
|
2255
|
+
}
|
|
2256
|
+
function resolveComplexity(metadata, requested, projectPath) {
|
|
2257
|
+
if (!metadata?.phases || metadata.phases.length === 0) return void 0;
|
|
2258
|
+
if (requested === "auto") return detectComplexity(projectPath);
|
|
2259
|
+
return requested;
|
|
2260
|
+
}
|
|
2261
|
+
function loadPrinciples(projectPath) {
|
|
2262
|
+
const principlesPath = path16.join(projectPath, "docs", "principles.md");
|
|
2263
|
+
return fs7.existsSync(principlesPath) ? fs7.readFileSync(principlesPath, "utf-8") : void 0;
|
|
2264
|
+
}
|
|
2265
|
+
function readMostRecentFileInDir(dirPath) {
|
|
2266
|
+
const files = fs7.readdirSync(dirPath).map((f) => ({ name: f, mtime: fs7.statSync(path16.join(dirPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
|
|
2267
|
+
if (files.length > 0) return fs7.readFileSync(path16.join(dirPath, files[0].name), "utf-8");
|
|
2268
|
+
return void 0;
|
|
2269
|
+
}
|
|
2270
|
+
function loadPriorState(metadata, projectPath) {
|
|
2271
|
+
if (!metadata?.state.persistent || metadata.state.files.length === 0) return void 0;
|
|
2272
|
+
for (const stateFilePath of metadata.state.files) {
|
|
2273
|
+
const fullPath = path16.join(projectPath, stateFilePath);
|
|
2274
|
+
if (!fs7.existsSync(fullPath)) continue;
|
|
2275
|
+
const stat = fs7.statSync(fullPath);
|
|
2276
|
+
if (stat.isDirectory()) return readMostRecentFileInDir(fullPath);
|
|
2277
|
+
return fs7.readFileSync(fullPath, "utf-8");
|
|
2278
|
+
}
|
|
2279
|
+
return void 0;
|
|
2280
|
+
}
|
|
2281
|
+
function validatePhaseName(metadata, phase) {
|
|
2282
|
+
if (!metadata?.phases) return true;
|
|
2283
|
+
return metadata.phases.map((p) => p.name).includes(phase);
|
|
2284
|
+
}
|
|
2285
|
+
function resolvePhaseState(metadata, projectPath, phase) {
|
|
2286
|
+
if (!validatePhaseName(metadata, phase)) {
|
|
2287
|
+
const validPhases = metadata.phases.map((p) => p.name);
|
|
2288
|
+
logger.error(`Unknown phase: ${phase}. Valid phases: ${validPhases.join(", ")}`);
|
|
2289
|
+
return null;
|
|
2290
|
+
}
|
|
2291
|
+
const priorState = loadPriorState(metadata, projectPath);
|
|
2292
|
+
const stateWarning = !priorState && metadata?.state.persistent ? "No prior phase data found. Earlier phases have not been completed. Proceed with caution." : void 0;
|
|
2293
|
+
return { priorState, stateWarning };
|
|
2294
|
+
}
|
|
2295
|
+
function appendProjectState(content, metadata, projectPath, hasPathOpt) {
|
|
2296
|
+
if (!metadata?.state.persistent || !hasPathOpt) return content;
|
|
2297
|
+
const stateFile = path16.join(projectPath, ".harness", "state.json");
|
|
2298
|
+
if (!fs7.existsSync(stateFile)) return content;
|
|
2299
|
+
const stateContent = fs7.readFileSync(stateFile, "utf-8");
|
|
2300
|
+
return content + `
|
|
2301
|
+
|
|
2302
|
+
---
|
|
2303
|
+
## Project State
|
|
2304
|
+
\`\`\`json
|
|
2305
|
+
${stateContent}
|
|
2306
|
+
\`\`\`
|
|
2307
|
+
`;
|
|
2308
|
+
}
|
|
2166
2309
|
function createRunCommand2() {
|
|
2167
2310
|
return new Command22("run").description("Run a skill (outputs SKILL.md content with context preamble)").argument("<name>", "Skill name (e.g., harness-tdd)").option("--path <path>", "Project root path for context injection").option("--complexity <level>", "Complexity: auto, light, full", "auto").option("--phase <name>", "Start at a specific phase (for re-entry)").option("--party", "Enable multi-perspective evaluation").action(async (name, opts, _cmd) => {
|
|
2168
2311
|
const skillsDir = resolveSkillsDir();
|
|
@@ -2172,64 +2315,24 @@ function createRunCommand2() {
|
|
|
2172
2315
|
process.exit(ExitCode.ERROR);
|
|
2173
2316
|
return;
|
|
2174
2317
|
}
|
|
2175
|
-
const
|
|
2176
|
-
let metadata = null;
|
|
2177
|
-
if (fs7.existsSync(yamlPath)) {
|
|
2178
|
-
try {
|
|
2179
|
-
const raw = fs7.readFileSync(yamlPath, "utf-8");
|
|
2180
|
-
const parsed = parse2(raw);
|
|
2181
|
-
const result = SkillMetadataSchema.safeParse(parsed);
|
|
2182
|
-
if (result.success) metadata = result.data;
|
|
2183
|
-
} catch {
|
|
2184
|
-
}
|
|
2185
|
-
}
|
|
2186
|
-
let complexity;
|
|
2187
|
-
if (metadata?.phases && metadata.phases.length > 0) {
|
|
2188
|
-
const requested = opts.complexity ?? "auto";
|
|
2189
|
-
if (requested === "auto") {
|
|
2190
|
-
const projectPath2 = opts.path ? path16.resolve(opts.path) : process.cwd();
|
|
2191
|
-
complexity = detectComplexity(projectPath2);
|
|
2192
|
-
} else {
|
|
2193
|
-
complexity = requested;
|
|
2194
|
-
}
|
|
2195
|
-
}
|
|
2196
|
-
let principles;
|
|
2318
|
+
const metadata = loadSkillMetadata(skillDir);
|
|
2197
2319
|
const projectPath = opts.path ? path16.resolve(opts.path) : process.cwd();
|
|
2198
|
-
const
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2320
|
+
const complexity = resolveComplexity(
|
|
2321
|
+
metadata,
|
|
2322
|
+
opts.complexity ?? "auto",
|
|
2323
|
+
projectPath
|
|
2324
|
+
);
|
|
2325
|
+
const principles = loadPrinciples(projectPath);
|
|
2202
2326
|
let priorState;
|
|
2203
2327
|
let stateWarning;
|
|
2204
2328
|
if (opts.phase) {
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
process.exit(ExitCode.ERROR);
|
|
2210
|
-
return;
|
|
2211
|
-
}
|
|
2212
|
-
}
|
|
2213
|
-
if (metadata?.state.persistent && metadata.state.files.length > 0) {
|
|
2214
|
-
for (const stateFilePath of metadata.state.files) {
|
|
2215
|
-
const fullPath = path16.join(projectPath, stateFilePath);
|
|
2216
|
-
if (fs7.existsSync(fullPath)) {
|
|
2217
|
-
const stat = fs7.statSync(fullPath);
|
|
2218
|
-
if (stat.isDirectory()) {
|
|
2219
|
-
const files = fs7.readdirSync(fullPath).map((f) => ({ name: f, mtime: fs7.statSync(path16.join(fullPath, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
|
|
2220
|
-
if (files.length > 0) {
|
|
2221
|
-
priorState = fs7.readFileSync(path16.join(fullPath, files[0].name), "utf-8");
|
|
2222
|
-
}
|
|
2223
|
-
} else {
|
|
2224
|
-
priorState = fs7.readFileSync(fullPath, "utf-8");
|
|
2225
|
-
}
|
|
2226
|
-
break;
|
|
2227
|
-
}
|
|
2228
|
-
}
|
|
2229
|
-
if (!priorState) {
|
|
2230
|
-
stateWarning = "No prior phase data found. Earlier phases have not been completed. Proceed with caution.";
|
|
2231
|
-
}
|
|
2329
|
+
const phaseResult = resolvePhaseState(metadata, projectPath, opts.phase);
|
|
2330
|
+
if (!phaseResult) {
|
|
2331
|
+
process.exit(ExitCode.ERROR);
|
|
2332
|
+
return;
|
|
2232
2333
|
}
|
|
2334
|
+
priorState = phaseResult.priorState;
|
|
2335
|
+
stateWarning = phaseResult.stateWarning;
|
|
2233
2336
|
}
|
|
2234
2337
|
const preamble = buildPreamble({
|
|
2235
2338
|
...complexity !== void 0 && { complexity },
|
|
@@ -2246,21 +2349,12 @@ function createRunCommand2() {
|
|
|
2246
2349
|
process.exit(ExitCode.ERROR);
|
|
2247
2350
|
return;
|
|
2248
2351
|
}
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
---
|
|
2257
|
-
## Project State
|
|
2258
|
-
\`\`\`json
|
|
2259
|
-
${stateContent}
|
|
2260
|
-
\`\`\`
|
|
2261
|
-
`;
|
|
2262
|
-
}
|
|
2263
|
-
}
|
|
2352
|
+
const content = appendProjectState(
|
|
2353
|
+
fs7.readFileSync(skillMdPath, "utf-8"),
|
|
2354
|
+
metadata,
|
|
2355
|
+
projectPath,
|
|
2356
|
+
!!opts.path
|
|
2357
|
+
);
|
|
2264
2358
|
process.stdout.write(preamble + content);
|
|
2265
2359
|
process.exit(ExitCode.SUCCESS);
|
|
2266
2360
|
});
|
|
@@ -2278,6 +2372,48 @@ var REQUIRED_SECTIONS = [
|
|
|
2278
2372
|
"## Success Criteria",
|
|
2279
2373
|
"## Examples"
|
|
2280
2374
|
];
|
|
2375
|
+
function validateSkillMd(name, skillMdPath, skillType, errors) {
|
|
2376
|
+
if (!fs8.existsSync(skillMdPath)) {
|
|
2377
|
+
errors.push(`${name}: missing SKILL.md`);
|
|
2378
|
+
return;
|
|
2379
|
+
}
|
|
2380
|
+
const mdContent = fs8.readFileSync(skillMdPath, "utf-8");
|
|
2381
|
+
for (const section of REQUIRED_SECTIONS) {
|
|
2382
|
+
if (!mdContent.includes(section)) {
|
|
2383
|
+
errors.push(`${name}/SKILL.md: missing section "${section}"`);
|
|
2384
|
+
}
|
|
2385
|
+
}
|
|
2386
|
+
if (!mdContent.trim().startsWith("# ")) {
|
|
2387
|
+
errors.push(`${name}/SKILL.md: must start with an h1 heading`);
|
|
2388
|
+
}
|
|
2389
|
+
if (skillType === "rigid") {
|
|
2390
|
+
if (!mdContent.includes("## Gates"))
|
|
2391
|
+
errors.push(`${name}/SKILL.md: rigid skill missing "## Gates" section`);
|
|
2392
|
+
if (!mdContent.includes("## Escalation"))
|
|
2393
|
+
errors.push(`${name}/SKILL.md: rigid skill missing "## Escalation" section`);
|
|
2394
|
+
}
|
|
2395
|
+
}
|
|
2396
|
+
function validateSkillEntry(name, skillsDir, errors) {
|
|
2397
|
+
const skillDir = path17.join(skillsDir, name);
|
|
2398
|
+
const yamlPath = path17.join(skillDir, "skill.yaml");
|
|
2399
|
+
if (!fs8.existsSync(yamlPath)) {
|
|
2400
|
+
errors.push(`${name}: missing skill.yaml`);
|
|
2401
|
+
return false;
|
|
2402
|
+
}
|
|
2403
|
+
try {
|
|
2404
|
+
const raw = fs8.readFileSync(yamlPath, "utf-8");
|
|
2405
|
+
const result = SkillMetadataSchema.safeParse(parse3(raw));
|
|
2406
|
+
if (!result.success) {
|
|
2407
|
+
errors.push(`${name}/skill.yaml: ${result.error.message}`);
|
|
2408
|
+
return false;
|
|
2409
|
+
}
|
|
2410
|
+
validateSkillMd(name, path17.join(skillDir, "SKILL.md"), result.data.type, errors);
|
|
2411
|
+
return true;
|
|
2412
|
+
} catch (e) {
|
|
2413
|
+
errors.push(`${name}: parse error \u2014 ${e instanceof Error ? e.message : String(e)}`);
|
|
2414
|
+
return false;
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2281
2417
|
function createValidateCommand3() {
|
|
2282
2418
|
return new Command23("validate").description("Validate all skill.yaml files and SKILL.md structure").action(async (_opts, cmd) => {
|
|
2283
2419
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -2291,46 +2427,7 @@ function createValidateCommand3() {
|
|
|
2291
2427
|
const errors = [];
|
|
2292
2428
|
let validated = 0;
|
|
2293
2429
|
for (const name of entries) {
|
|
2294
|
-
|
|
2295
|
-
const yamlPath = path17.join(skillDir, "skill.yaml");
|
|
2296
|
-
const skillMdPath = path17.join(skillDir, "SKILL.md");
|
|
2297
|
-
if (!fs8.existsSync(yamlPath)) {
|
|
2298
|
-
errors.push(`${name}: missing skill.yaml`);
|
|
2299
|
-
continue;
|
|
2300
|
-
}
|
|
2301
|
-
try {
|
|
2302
|
-
const raw = fs8.readFileSync(yamlPath, "utf-8");
|
|
2303
|
-
const parsed = parse3(raw);
|
|
2304
|
-
const result = SkillMetadataSchema.safeParse(parsed);
|
|
2305
|
-
if (!result.success) {
|
|
2306
|
-
errors.push(`${name}/skill.yaml: ${result.error.message}`);
|
|
2307
|
-
continue;
|
|
2308
|
-
}
|
|
2309
|
-
if (fs8.existsSync(skillMdPath)) {
|
|
2310
|
-
const mdContent = fs8.readFileSync(skillMdPath, "utf-8");
|
|
2311
|
-
for (const section of REQUIRED_SECTIONS) {
|
|
2312
|
-
if (!mdContent.includes(section)) {
|
|
2313
|
-
errors.push(`${name}/SKILL.md: missing section "${section}"`);
|
|
2314
|
-
}
|
|
2315
|
-
}
|
|
2316
|
-
if (!mdContent.trim().startsWith("# ")) {
|
|
2317
|
-
errors.push(`${name}/SKILL.md: must start with an h1 heading`);
|
|
2318
|
-
}
|
|
2319
|
-
if (result.data.type === "rigid") {
|
|
2320
|
-
if (!mdContent.includes("## Gates")) {
|
|
2321
|
-
errors.push(`${name}/SKILL.md: rigid skill missing "## Gates" section`);
|
|
2322
|
-
}
|
|
2323
|
-
if (!mdContent.includes("## Escalation")) {
|
|
2324
|
-
errors.push(`${name}/SKILL.md: rigid skill missing "## Escalation" section`);
|
|
2325
|
-
}
|
|
2326
|
-
}
|
|
2327
|
-
} else {
|
|
2328
|
-
errors.push(`${name}: missing SKILL.md`);
|
|
2329
|
-
}
|
|
2330
|
-
validated++;
|
|
2331
|
-
} catch (e) {
|
|
2332
|
-
errors.push(`${name}: parse error \u2014 ${e instanceof Error ? e.message : String(e)}`);
|
|
2333
|
-
}
|
|
2430
|
+
if (validateSkillEntry(name, skillsDir, errors)) validated++;
|
|
2334
2431
|
}
|
|
2335
2432
|
if (globalOpts.json) {
|
|
2336
2433
|
logger.raw({ validated, errors });
|
|
@@ -3028,8 +3125,8 @@ function createResetCommand() {
|
|
|
3028
3125
|
}
|
|
3029
3126
|
if (!opts.yes) {
|
|
3030
3127
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
3031
|
-
const answer = await new Promise((
|
|
3032
|
-
rl.question("Reset project state? This cannot be undone. [y/N] ",
|
|
3128
|
+
const answer = await new Promise((resolve29) => {
|
|
3129
|
+
rl.question("Reset project state? This cannot be undone. [y/N] ", resolve29);
|
|
3033
3130
|
});
|
|
3034
3131
|
rl.close();
|
|
3035
3132
|
if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
|
|
@@ -3189,7 +3286,7 @@ function parseFailOn(failOn) {
|
|
|
3189
3286
|
function createCheckCommand() {
|
|
3190
3287
|
return new Command34("check").description("Run all harness checks for CI (validate, deps, docs, entropy, phase-gate, arch)").option("--skip <checks>", "Comma-separated checks to skip (e.g., entropy,docs)").option("--fail-on <severity>", "Fail on severity level: error (default) or warning", "error").action(async (opts, cmd) => {
|
|
3191
3288
|
const globalOpts = cmd.optsWithGlobals();
|
|
3192
|
-
const mode = globalOpts
|
|
3289
|
+
const mode = resolveOutputMode(globalOpts);
|
|
3193
3290
|
const skip = parseSkip(opts.skip);
|
|
3194
3291
|
const failOn = parseFailOn(opts.failOn);
|
|
3195
3292
|
const result = await runCICheck({
|
|
@@ -3436,13 +3533,28 @@ function prompt(question) {
|
|
|
3436
3533
|
input: process.stdin,
|
|
3437
3534
|
output: process.stdout
|
|
3438
3535
|
});
|
|
3439
|
-
return new Promise((
|
|
3536
|
+
return new Promise((resolve29) => {
|
|
3440
3537
|
rl.question(question, (answer) => {
|
|
3441
3538
|
rl.close();
|
|
3442
|
-
|
|
3539
|
+
resolve29(answer.trim().toLowerCase());
|
|
3443
3540
|
});
|
|
3444
3541
|
});
|
|
3445
3542
|
}
|
|
3543
|
+
async function offerRegeneration() {
|
|
3544
|
+
console.log("");
|
|
3545
|
+
const regenAnswer = await prompt("Regenerate slash commands and agent definitions? (Y/n) ");
|
|
3546
|
+
if (regenAnswer === "n" || regenAnswer === "no") return;
|
|
3547
|
+
const scopeAnswer = await prompt("Generate for (G)lobal or (l)ocal project? (G/l) ");
|
|
3548
|
+
const isGlobal = scopeAnswer !== "l" && scopeAnswer !== "local";
|
|
3549
|
+
try {
|
|
3550
|
+
execFileSync4("harness", ["generate", ...isGlobal ? ["--global"] : []], {
|
|
3551
|
+
stdio: "inherit"
|
|
3552
|
+
});
|
|
3553
|
+
} catch {
|
|
3554
|
+
logger.warn("Generation failed. Run manually:");
|
|
3555
|
+
console.log(` ${chalk3.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
|
|
3556
|
+
}
|
|
3557
|
+
}
|
|
3446
3558
|
function createUpdateCommand() {
|
|
3447
3559
|
return new Command37("update").description("Update all @harness-engineering packages to the latest version").option("--version <semver>", "Pin @harness-engineering/cli to a specific version").action(async (opts, cmd) => {
|
|
3448
3560
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -3496,20 +3608,7 @@ function createUpdateCommand() {
|
|
|
3496
3608
|
console.log(` ${chalk3.cyan(installCmd)}`);
|
|
3497
3609
|
process.exit(ExitCode.ERROR);
|
|
3498
3610
|
}
|
|
3499
|
-
|
|
3500
|
-
const regenAnswer = await prompt("Regenerate slash commands and agent definitions? (Y/n) ");
|
|
3501
|
-
if (regenAnswer !== "n" && regenAnswer !== "no") {
|
|
3502
|
-
const scopeAnswer = await prompt("Generate for (G)lobal or (l)ocal project? (G/l) ");
|
|
3503
|
-
const isGlobal = scopeAnswer !== "l" && scopeAnswer !== "local";
|
|
3504
|
-
try {
|
|
3505
|
-
execFileSync4("harness", ["generate", ...isGlobal ? ["--global"] : []], {
|
|
3506
|
-
stdio: "inherit"
|
|
3507
|
-
});
|
|
3508
|
-
} catch {
|
|
3509
|
-
logger.warn("Generation failed. Run manually:");
|
|
3510
|
-
console.log(` ${chalk3.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
|
|
3511
|
-
}
|
|
3512
|
-
}
|
|
3611
|
+
await offerRegeneration();
|
|
3513
3612
|
process.exit(ExitCode.SUCCESS);
|
|
3514
3613
|
});
|
|
3515
3614
|
}
|
|
@@ -3579,7 +3678,7 @@ function createGenerateCommand3() {
|
|
|
3579
3678
|
import { Command as Command39 } from "commander";
|
|
3580
3679
|
import * as path29 from "path";
|
|
3581
3680
|
async function runScan(projectPath) {
|
|
3582
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-
|
|
3681
|
+
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-B26DFXMP.js");
|
|
3583
3682
|
const store = new GraphStore();
|
|
3584
3683
|
const start = Date.now();
|
|
3585
3684
|
await new CodeIngestor(store).ingest(projectPath);
|
|
@@ -3660,7 +3759,7 @@ async function runIngest(projectPath, source, opts) {
|
|
|
3660
3759
|
SyncManager,
|
|
3661
3760
|
JiraConnector,
|
|
3662
3761
|
SlackConnector
|
|
3663
|
-
} = await import("./dist-
|
|
3762
|
+
} = await import("./dist-B26DFXMP.js");
|
|
3664
3763
|
const graphDir = path30.join(projectPath, ".harness", "graph");
|
|
3665
3764
|
const store = new GraphStore();
|
|
3666
3765
|
await store.load(graphDir);
|
|
@@ -3753,7 +3852,7 @@ function createIngestCommand() {
|
|
|
3753
3852
|
import { Command as Command41 } from "commander";
|
|
3754
3853
|
import * as path31 from "path";
|
|
3755
3854
|
async function runQuery(projectPath, rootNodeId, opts) {
|
|
3756
|
-
const { GraphStore, ContextQL } = await import("./dist-
|
|
3855
|
+
const { GraphStore, ContextQL } = await import("./dist-B26DFXMP.js");
|
|
3757
3856
|
const store = new GraphStore();
|
|
3758
3857
|
const graphDir = path31.join(projectPath, ".harness", "graph");
|
|
3759
3858
|
const loaded = await store.load(graphDir);
|
|
@@ -3802,7 +3901,7 @@ import { Command as Command42 } from "commander";
|
|
|
3802
3901
|
// src/commands/graph/status.ts
|
|
3803
3902
|
import * as path32 from "path";
|
|
3804
3903
|
async function runGraphStatus(projectPath) {
|
|
3805
|
-
const { GraphStore } = await import("./dist-
|
|
3904
|
+
const { GraphStore } = await import("./dist-B26DFXMP.js");
|
|
3806
3905
|
const graphDir = path32.join(projectPath, ".harness", "graph");
|
|
3807
3906
|
const store = new GraphStore();
|
|
3808
3907
|
const loaded = await store.load(graphDir);
|
|
@@ -3842,7 +3941,7 @@ async function runGraphStatus(projectPath) {
|
|
|
3842
3941
|
// src/commands/graph/export.ts
|
|
3843
3942
|
import * as path33 from "path";
|
|
3844
3943
|
async function runGraphExport(projectPath, format) {
|
|
3845
|
-
const { GraphStore } = await import("./dist-
|
|
3944
|
+
const { GraphStore } = await import("./dist-B26DFXMP.js");
|
|
3846
3945
|
const graphDir = path33.join(projectPath, ".harness", "graph");
|
|
3847
3946
|
const store = new GraphStore();
|
|
3848
3947
|
const loaded = await store.load(graphDir);
|
|
@@ -3921,7 +4020,7 @@ function createGraphCommand() {
|
|
|
3921
4020
|
import { Command as Command43 } from "commander";
|
|
3922
4021
|
function createMcpCommand() {
|
|
3923
4022
|
return new Command43("mcp").description("Start the MCP (Model Context Protocol) server on stdio").action(async () => {
|
|
3924
|
-
const { startServer: startServer2 } = await import("./mcp-
|
|
4023
|
+
const { startServer: startServer2 } = await import("./mcp-362EZHF4.js");
|
|
3925
4024
|
await startServer2();
|
|
3926
4025
|
});
|
|
3927
4026
|
}
|
|
@@ -4138,7 +4237,7 @@ function createImpactPreviewCommand() {
|
|
|
4138
4237
|
// src/commands/check-arch.ts
|
|
4139
4238
|
import { Command as Command45 } from "commander";
|
|
4140
4239
|
import { execSync as execSync4 } from "child_process";
|
|
4141
|
-
function
|
|
4240
|
+
function getCommitHash2(cwd) {
|
|
4142
4241
|
try {
|
|
4143
4242
|
return execSync4("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).toString().trim();
|
|
4144
4243
|
} catch {
|
|
@@ -4186,7 +4285,7 @@ async function runCheckArch(options) {
|
|
|
4186
4285
|
}
|
|
4187
4286
|
const manager = new ArchBaselineManager(cwd, archConfig.baselinePath);
|
|
4188
4287
|
if (options.updateBaseline) {
|
|
4189
|
-
const commitHash =
|
|
4288
|
+
const commitHash = getCommitHash2(cwd);
|
|
4190
4289
|
const baseline2 = manager.capture(results, commitHash);
|
|
4191
4290
|
manager.save(baseline2);
|
|
4192
4291
|
return Ok({
|