@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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logger
|
|
3
|
+
} from "./chunk-EBJQ6N4M.js";
|
|
4
|
+
import {
|
|
5
|
+
resolveConfig
|
|
6
|
+
} from "./chunk-O5OJVPL6.js";
|
|
7
|
+
import {
|
|
8
|
+
ExitCode
|
|
9
|
+
} from "./chunk-3WGJMBKH.js";
|
|
10
|
+
import {
|
|
11
|
+
Ok
|
|
12
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/check-phase-gate.ts
|
|
15
|
+
import { Command } from "commander";
|
|
16
|
+
import * as path from "path";
|
|
17
|
+
import * as fs from "fs";
|
|
18
|
+
|
|
19
|
+
// src/utils/files.ts
|
|
20
|
+
import { glob } from "glob";
|
|
21
|
+
async function findFiles(pattern, cwd = process.cwd()) {
|
|
22
|
+
return glob(pattern, { cwd, absolute: true });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/output/formatter.ts
|
|
26
|
+
import chalk from "chalk";
|
|
27
|
+
var OutputMode = {
|
|
28
|
+
/** Output as formatted JSON */
|
|
29
|
+
JSON: "json",
|
|
30
|
+
/** Output as human-readable text */
|
|
31
|
+
TEXT: "text",
|
|
32
|
+
/** Minimal output, only errors and successes */
|
|
33
|
+
QUIET: "quiet",
|
|
34
|
+
/** Full output with detailed context and suggestions */
|
|
35
|
+
VERBOSE: "verbose"
|
|
36
|
+
};
|
|
37
|
+
var OutputFormatter = class {
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new OutputFormatter.
|
|
40
|
+
*
|
|
41
|
+
* @param mode - The output mode to use. Defaults to TEXT.
|
|
42
|
+
*/
|
|
43
|
+
constructor(mode = OutputMode.TEXT) {
|
|
44
|
+
this.mode = mode;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Formats raw data for output.
|
|
48
|
+
*
|
|
49
|
+
* @param data - The data to format.
|
|
50
|
+
* @returns A string representation of the data based on the current mode.
|
|
51
|
+
*/
|
|
52
|
+
format(data) {
|
|
53
|
+
if (this.mode === OutputMode.JSON) {
|
|
54
|
+
return JSON.stringify(data, null, 2);
|
|
55
|
+
}
|
|
56
|
+
return String(data);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Formats a validation result into a user-friendly string.
|
|
60
|
+
*
|
|
61
|
+
* @param result - The validation result to format.
|
|
62
|
+
* @returns A formatted string containing the validation status and any issues.
|
|
63
|
+
*/
|
|
64
|
+
formatValidation(result) {
|
|
65
|
+
if (this.mode === OutputMode.JSON) {
|
|
66
|
+
return JSON.stringify(result, null, 2);
|
|
67
|
+
}
|
|
68
|
+
if (this.mode === OutputMode.QUIET) {
|
|
69
|
+
if (result.valid) return "";
|
|
70
|
+
return result.issues.map((i) => `${i.file ?? ""}: ${i.message}`).join("\n");
|
|
71
|
+
}
|
|
72
|
+
const lines = [];
|
|
73
|
+
if (result.valid) {
|
|
74
|
+
lines.push(chalk.green("v validation passed"));
|
|
75
|
+
} else {
|
|
76
|
+
lines.push(chalk.red(`x Validation failed (${result.issues.length} issues)`));
|
|
77
|
+
lines.push("");
|
|
78
|
+
for (const issue of result.issues) {
|
|
79
|
+
const location = issue.file ? issue.line ? `${issue.file}:${issue.line}` : issue.file : "unknown";
|
|
80
|
+
lines.push(` ${chalk.yellow("*")} ${chalk.dim(location)}`);
|
|
81
|
+
lines.push(` ${issue.message}`);
|
|
82
|
+
if (issue.suggestion && this.mode === OutputMode.VERBOSE) {
|
|
83
|
+
lines.push(` ${chalk.dim("->")} ${issue.suggestion}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return lines.join("\n");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Formats a summary line with a success/failure icon and label.
|
|
91
|
+
*
|
|
92
|
+
* @param label - The name of the field to summarize.
|
|
93
|
+
* @param value - The value to display.
|
|
94
|
+
* @param success - Whether the summary represents a success or failure state.
|
|
95
|
+
* @returns A formatted summary string, or an empty string in JSON or QUIET modes.
|
|
96
|
+
*/
|
|
97
|
+
formatSummary(label, value, success) {
|
|
98
|
+
if (this.mode === OutputMode.JSON || this.mode === OutputMode.QUIET) {
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
const icon = success ? chalk.green("v") : chalk.red("x");
|
|
102
|
+
return `${icon} ${label}: ${value}`;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// src/commands/check-phase-gate.ts
|
|
107
|
+
function resolveSpecPath(implFile, implPattern, specPattern, cwd) {
|
|
108
|
+
const relImpl = path.relative(cwd, implFile).replace(/\\/g, "/");
|
|
109
|
+
const implBase = (implPattern.split("*")[0] ?? "").replace(/\/+$/, "");
|
|
110
|
+
const afterBase = relImpl.startsWith(implBase + "/") ? relImpl.slice(implBase.length + 1) : relImpl;
|
|
111
|
+
const segments = afterBase.split("/");
|
|
112
|
+
const firstSegment = segments[0] ?? "";
|
|
113
|
+
const feature = segments.length > 1 ? firstSegment : path.basename(firstSegment, path.extname(firstSegment));
|
|
114
|
+
const specRelative = specPattern.replace("{feature}", feature);
|
|
115
|
+
return path.resolve(cwd, specRelative);
|
|
116
|
+
}
|
|
117
|
+
async function runCheckPhaseGate(options) {
|
|
118
|
+
const configResult = resolveConfig(options.configPath);
|
|
119
|
+
if (!configResult.ok) {
|
|
120
|
+
return configResult;
|
|
121
|
+
}
|
|
122
|
+
const config = configResult.value;
|
|
123
|
+
const cwd = options.cwd ?? (options.configPath ? path.dirname(path.resolve(options.configPath)) : process.cwd());
|
|
124
|
+
if (!config.phaseGates?.enabled) {
|
|
125
|
+
return Ok({
|
|
126
|
+
pass: true,
|
|
127
|
+
skipped: true,
|
|
128
|
+
missingSpecs: [],
|
|
129
|
+
checkedFiles: 0
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const phaseGates = config.phaseGates;
|
|
133
|
+
const missingSpecs = [];
|
|
134
|
+
let checkedFiles = 0;
|
|
135
|
+
for (const mapping of phaseGates.mappings) {
|
|
136
|
+
const implFiles = await findFiles(mapping.implPattern, cwd);
|
|
137
|
+
for (const implFile of implFiles) {
|
|
138
|
+
checkedFiles++;
|
|
139
|
+
const expectedSpec = resolveSpecPath(implFile, mapping.implPattern, mapping.specPattern, cwd);
|
|
140
|
+
if (!fs.existsSync(expectedSpec)) {
|
|
141
|
+
missingSpecs.push({
|
|
142
|
+
implFile: path.relative(cwd, implFile).replace(/\\/g, "/"),
|
|
143
|
+
expectedSpec: path.relative(cwd, expectedSpec).replace(/\\/g, "/")
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const pass = missingSpecs.length === 0;
|
|
149
|
+
return Ok({
|
|
150
|
+
pass,
|
|
151
|
+
skipped: false,
|
|
152
|
+
severity: phaseGates.severity,
|
|
153
|
+
missingSpecs,
|
|
154
|
+
checkedFiles
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function createCheckPhaseGateCommand() {
|
|
158
|
+
const command = new Command("check-phase-gate").description("Verify that implementation files have matching spec documents").action(async (_opts, cmd) => {
|
|
159
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
160
|
+
const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : globalOpts.verbose ? OutputMode.VERBOSE : OutputMode.TEXT;
|
|
161
|
+
const formatter = new OutputFormatter(mode);
|
|
162
|
+
const result = await runCheckPhaseGate({
|
|
163
|
+
configPath: globalOpts.config,
|
|
164
|
+
json: globalOpts.json,
|
|
165
|
+
verbose: globalOpts.verbose,
|
|
166
|
+
quiet: globalOpts.quiet
|
|
167
|
+
});
|
|
168
|
+
if (!result.ok) {
|
|
169
|
+
if (mode === OutputMode.JSON) {
|
|
170
|
+
console.log(JSON.stringify({ error: result.error.message }));
|
|
171
|
+
} else {
|
|
172
|
+
logger.error(result.error.message);
|
|
173
|
+
}
|
|
174
|
+
process.exit(result.error.exitCode);
|
|
175
|
+
}
|
|
176
|
+
const value = result.value;
|
|
177
|
+
if (value.skipped) {
|
|
178
|
+
if (mode === OutputMode.JSON) {
|
|
179
|
+
console.log(formatter.format(value));
|
|
180
|
+
} else if (mode !== OutputMode.QUIET) {
|
|
181
|
+
logger.dim("Phase gates not enabled, skipping.");
|
|
182
|
+
}
|
|
183
|
+
process.exit(ExitCode.SUCCESS);
|
|
184
|
+
}
|
|
185
|
+
const output = formatter.formatValidation({
|
|
186
|
+
valid: value.pass,
|
|
187
|
+
issues: value.missingSpecs.map((m) => ({
|
|
188
|
+
file: m.implFile,
|
|
189
|
+
message: `Missing spec: ${m.expectedSpec}`
|
|
190
|
+
}))
|
|
191
|
+
});
|
|
192
|
+
if (output) {
|
|
193
|
+
console.log(output);
|
|
194
|
+
}
|
|
195
|
+
const summary = formatter.formatSummary(
|
|
196
|
+
"Phase gate check",
|
|
197
|
+
`${value.checkedFiles} files checked, ${value.missingSpecs.length} missing specs`,
|
|
198
|
+
value.pass
|
|
199
|
+
);
|
|
200
|
+
if (summary) {
|
|
201
|
+
console.log(summary);
|
|
202
|
+
}
|
|
203
|
+
if (!value.pass && value.severity === "error") {
|
|
204
|
+
process.exit(ExitCode.VALIDATION_FAILED);
|
|
205
|
+
}
|
|
206
|
+
process.exit(ExitCode.SUCCESS);
|
|
207
|
+
});
|
|
208
|
+
return command;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export {
|
|
212
|
+
OutputMode,
|
|
213
|
+
OutputFormatter,
|
|
214
|
+
findFiles,
|
|
215
|
+
runCheckPhaseGate,
|
|
216
|
+
createCheckPhaseGateCommand
|
|
217
|
+
};
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
findConfigFile,
|
|
3
|
+
loadConfig
|
|
4
|
+
} from "./chunk-O5OJVPL6.js";
|
|
1
5
|
import {
|
|
2
6
|
resultToMcpResponse
|
|
3
7
|
} from "./chunk-IDZNPTYD.js";
|
|
@@ -6,10 +10,20 @@ import {
|
|
|
6
10
|
} from "./chunk-W6Y7ZW3Y.js";
|
|
7
11
|
import {
|
|
8
12
|
Ok
|
|
9
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
10
14
|
|
|
11
15
|
// src/mcp/tools/docs.ts
|
|
12
16
|
import * as path from "path";
|
|
17
|
+
function resolveDocsDir(projectPath) {
|
|
18
|
+
const configResult = findConfigFile(projectPath);
|
|
19
|
+
if (configResult.ok) {
|
|
20
|
+
const config = loadConfig(configResult.value);
|
|
21
|
+
if (config.ok) {
|
|
22
|
+
return path.resolve(projectPath, config.value.docsDir);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return path.resolve(projectPath, "docs");
|
|
26
|
+
}
|
|
13
27
|
var checkDocsDefinition = {
|
|
14
28
|
name: "check_docs",
|
|
15
29
|
description: "Analyze documentation coverage and/or validate knowledge map integrity",
|
|
@@ -32,18 +46,18 @@ async function handleCheckDocs(input) {
|
|
|
32
46
|
const projectPath = sanitizePath(input.path);
|
|
33
47
|
const scope = input.scope ?? "coverage";
|
|
34
48
|
if (scope === "integrity") {
|
|
35
|
-
const { validateKnowledgeMap } = await import("./dist-
|
|
49
|
+
const { validateKnowledgeMap } = await import("./dist-HWXF2C3R.js");
|
|
36
50
|
const result2 = await validateKnowledgeMap(projectPath);
|
|
37
51
|
return resultToMcpResponse(result2);
|
|
38
52
|
}
|
|
39
53
|
if (scope === "all") {
|
|
40
|
-
const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-
|
|
54
|
+
const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-HWXF2C3R.js");
|
|
41
55
|
const domain2 = input.domain ?? "src";
|
|
42
|
-
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-
|
|
56
|
+
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
|
|
43
57
|
const store2 = await loadGraphStore2(projectPath);
|
|
44
58
|
let graphCoverage2;
|
|
45
59
|
if (store2) {
|
|
46
|
-
const { Assembler } = await import("./dist-
|
|
60
|
+
const { Assembler } = await import("./dist-B26DFXMP.js");
|
|
47
61
|
const assembler = new Assembler(store2);
|
|
48
62
|
const report = assembler.checkCoverage();
|
|
49
63
|
graphCoverage2 = {
|
|
@@ -55,7 +69,7 @@ async function handleCheckDocs(input) {
|
|
|
55
69
|
const [coverageResult, integrityResult] = await Promise.allSettled([
|
|
56
70
|
checkDocCoverage2(domain2, {
|
|
57
71
|
sourceDir: path.resolve(projectPath, "src"),
|
|
58
|
-
docsDir:
|
|
72
|
+
docsDir: resolveDocsDir(projectPath),
|
|
59
73
|
...graphCoverage2 !== void 0 && { graphCoverage: graphCoverage2 }
|
|
60
74
|
}),
|
|
61
75
|
validateKnowledgeMap(projectPath)
|
|
@@ -76,13 +90,13 @@ async function handleCheckDocs(input) {
|
|
|
76
90
|
}
|
|
77
91
|
return resultToMcpResponse(Ok({ coverage, integrity }));
|
|
78
92
|
}
|
|
79
|
-
const { checkDocCoverage } = await import("./dist-
|
|
93
|
+
const { checkDocCoverage } = await import("./dist-HWXF2C3R.js");
|
|
80
94
|
const domain = input.domain ?? "src";
|
|
81
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
95
|
+
const { loadGraphStore } = await import("./graph-loader-2M2HXDQI.js");
|
|
82
96
|
const store = await loadGraphStore(projectPath);
|
|
83
97
|
let graphCoverage;
|
|
84
98
|
if (store) {
|
|
85
|
-
const { Assembler } = await import("./dist-
|
|
99
|
+
const { Assembler } = await import("./dist-B26DFXMP.js");
|
|
86
100
|
const assembler = new Assembler(store);
|
|
87
101
|
const report = assembler.checkCoverage();
|
|
88
102
|
graphCoverage = {
|
|
@@ -93,7 +107,7 @@ async function handleCheckDocs(input) {
|
|
|
93
107
|
}
|
|
94
108
|
const result = await checkDocCoverage(domain, {
|
|
95
109
|
sourceDir: path.resolve(projectPath, "src"),
|
|
96
|
-
docsDir:
|
|
110
|
+
docsDir: resolveDocsDir(projectPath),
|
|
97
111
|
...graphCoverage !== void 0 && { graphCoverage }
|
|
98
112
|
});
|
|
99
113
|
return resultToMcpResponse(result);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Err,
|
|
3
3
|
Ok
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
5
5
|
|
|
6
6
|
// src/templates/engine.ts
|
|
7
7
|
import * as fs from "fs";
|
|
@@ -10,6 +10,19 @@ import Handlebars from "handlebars";
|
|
|
10
10
|
|
|
11
11
|
// src/templates/schema.ts
|
|
12
12
|
import { z } from "zod";
|
|
13
|
+
var LanguageEnum = z.enum(["typescript", "python", "go", "rust", "java"]);
|
|
14
|
+
var ToolingSchema = z.object({
|
|
15
|
+
packageManager: z.string().optional(),
|
|
16
|
+
linter: z.string().optional(),
|
|
17
|
+
formatter: z.string().optional(),
|
|
18
|
+
buildTool: z.string().optional(),
|
|
19
|
+
testRunner: z.string().optional(),
|
|
20
|
+
lockFile: z.string().optional()
|
|
21
|
+
});
|
|
22
|
+
var DetectPatternSchema = z.object({
|
|
23
|
+
file: z.string(),
|
|
24
|
+
contains: z.string().optional()
|
|
25
|
+
});
|
|
13
26
|
var MergeStrategySchema = z.object({
|
|
14
27
|
json: z.enum(["deep-merge", "overlay-wins"]).default("deep-merge"),
|
|
15
28
|
files: z.literal("overlay-wins").default("overlay-wins")
|
|
@@ -21,7 +34,10 @@ var TemplateMetadataSchema = z.object({
|
|
|
21
34
|
framework: z.string().optional(),
|
|
22
35
|
extends: z.string().optional(),
|
|
23
36
|
mergeStrategy: MergeStrategySchema.default({}),
|
|
24
|
-
version: z.literal(1)
|
|
37
|
+
version: z.literal(1),
|
|
38
|
+
language: LanguageEnum.optional(),
|
|
39
|
+
tooling: ToolingSchema.optional(),
|
|
40
|
+
detect: z.array(DetectPatternSchema).optional()
|
|
25
41
|
});
|
|
26
42
|
|
|
27
43
|
// src/templates/merger.ts
|
|
@@ -64,6 +80,57 @@ function mergePackageJson(base, overlay) {
|
|
|
64
80
|
}
|
|
65
81
|
|
|
66
82
|
// src/templates/engine.ts
|
|
83
|
+
var NON_JSON_PACKAGE_CONFIGS = /* @__PURE__ */ new Set(["pyproject.toml", "go.mod", "Cargo.toml", "pom.xml"]);
|
|
84
|
+
function scoreDetectPatterns(targetDir, patterns) {
|
|
85
|
+
let score = 0;
|
|
86
|
+
for (const pattern of patterns) {
|
|
87
|
+
const filePath = path.join(targetDir, pattern.file);
|
|
88
|
+
if (!fs.existsSync(filePath)) continue;
|
|
89
|
+
if (!pattern.contains) {
|
|
90
|
+
score++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const fd = fs.openSync(filePath, "r");
|
|
94
|
+
try {
|
|
95
|
+
const buf = Buffer.alloc(65536);
|
|
96
|
+
const bytesRead = fs.readSync(fd, buf, 0, 65536, 0);
|
|
97
|
+
const content = buf.toString("utf-8", 0, bytesRead);
|
|
98
|
+
if (content.includes(pattern.contains)) score++;
|
|
99
|
+
} finally {
|
|
100
|
+
fs.closeSync(fd);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return score;
|
|
104
|
+
}
|
|
105
|
+
function applyLanguageDefaults(context) {
|
|
106
|
+
return {
|
|
107
|
+
...context,
|
|
108
|
+
...context.language === "python" && context.pythonMinVersion === void 0 && { pythonMinVersion: "3.10" },
|
|
109
|
+
...context.language === "go" && context.goModulePath === void 0 && {
|
|
110
|
+
goModulePath: `github.com/example/${context.projectName}`
|
|
111
|
+
},
|
|
112
|
+
...context.language === "java" && context.javaGroupId === void 0 && {
|
|
113
|
+
javaGroupId: `com.example.${context.projectName.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()}`
|
|
114
|
+
},
|
|
115
|
+
...context.language === "rust" && context.rustEdition === void 0 && { rustEdition: "2021" }
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function mergeJsonBuffers(jsonBuffers) {
|
|
119
|
+
try {
|
|
120
|
+
const results = [];
|
|
121
|
+
for (const [outputPath, jsons] of jsonBuffers) {
|
|
122
|
+
let merged = {};
|
|
123
|
+
for (const json of jsons) {
|
|
124
|
+
merged = outputPath === "package.json" ? mergePackageJson(merged, json) : deepMergeJson(merged, json);
|
|
125
|
+
}
|
|
126
|
+
results.push({ relativePath: outputPath, content: JSON.stringify(merged, null, 2) });
|
|
127
|
+
}
|
|
128
|
+
return Ok(results);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
131
|
+
return Err(new Error(`JSON merge failed: ${msg}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
67
134
|
var TemplateEngine = class {
|
|
68
135
|
constructor(templatesDir) {
|
|
69
136
|
this.templatesDir = templatesDir;
|
|
@@ -89,7 +156,13 @@ var TemplateEngine = class {
|
|
|
89
156
|
);
|
|
90
157
|
}
|
|
91
158
|
}
|
|
92
|
-
resolveTemplate(level, framework) {
|
|
159
|
+
resolveTemplate(level, framework, language) {
|
|
160
|
+
if (language && language !== "typescript") {
|
|
161
|
+
return this.resolveLanguageTemplate(language, framework);
|
|
162
|
+
}
|
|
163
|
+
if (!level) {
|
|
164
|
+
return Err(new Error("Level is required for TypeScript/JavaScript templates"));
|
|
165
|
+
}
|
|
93
166
|
const levelDir = this.findTemplateDir(level, "level");
|
|
94
167
|
if (!levelDir) return Err(new Error(`Template not found for level: ${level}`));
|
|
95
168
|
const metaPath = path.join(levelDir, "template.json");
|
|
@@ -122,69 +195,60 @@ var TemplateEngine = class {
|
|
|
122
195
|
return Ok(resolved);
|
|
123
196
|
}
|
|
124
197
|
render(template, context) {
|
|
198
|
+
const effectiveContext = applyLanguageDefaults(context);
|
|
125
199
|
const rendered = [];
|
|
126
200
|
const jsonBuffers = /* @__PURE__ */ new Map();
|
|
127
201
|
for (const file of template.files) {
|
|
128
|
-
const
|
|
129
|
-
if (
|
|
130
|
-
|
|
131
|
-
const raw = fs.readFileSync(file.absolutePath, "utf-8");
|
|
132
|
-
const compiled = Handlebars.compile(raw, { strict: true });
|
|
133
|
-
const content = compiled(context);
|
|
134
|
-
if (outputPath.endsWith(".json") && file.relativePath.endsWith(".json.hbs")) {
|
|
135
|
-
if (!jsonBuffers.has(outputPath)) jsonBuffers.set(outputPath, []);
|
|
136
|
-
jsonBuffers.get(outputPath).push(JSON.parse(content));
|
|
137
|
-
} else {
|
|
138
|
-
rendered.push({ relativePath: outputPath, content });
|
|
139
|
-
}
|
|
140
|
-
} catch (error) {
|
|
141
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
142
|
-
return Err(
|
|
143
|
-
new Error(
|
|
144
|
-
`Template render failed in ${file.sourceTemplate}/${file.relativePath}: ${msg}`
|
|
145
|
-
)
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
} else {
|
|
149
|
-
try {
|
|
150
|
-
const content = fs.readFileSync(file.absolutePath, "utf-8");
|
|
151
|
-
rendered.push({ relativePath: file.relativePath, content });
|
|
152
|
-
} catch (error) {
|
|
153
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
154
|
-
return Err(
|
|
155
|
-
new Error(
|
|
156
|
-
`Template render failed in ${file.sourceTemplate}/${file.relativePath}: ${msg}`
|
|
157
|
-
)
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
202
|
+
const result = this.renderFile(file, effectiveContext, jsonBuffers);
|
|
203
|
+
if (!result.ok) return result;
|
|
204
|
+
if (result.value) rendered.push(result.value);
|
|
161
205
|
}
|
|
206
|
+
const mergeResult = mergeJsonBuffers(jsonBuffers);
|
|
207
|
+
if (!mergeResult.ok) return mergeResult;
|
|
208
|
+
rendered.push(...mergeResult.value);
|
|
209
|
+
return Ok({ files: rendered });
|
|
210
|
+
}
|
|
211
|
+
renderFile(file, context, jsonBuffers) {
|
|
212
|
+
const outputPath = file.relativePath.replace(/\.hbs$/, "");
|
|
162
213
|
try {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
214
|
+
if (file.isHandlebars) {
|
|
215
|
+
const raw = fs.readFileSync(file.absolutePath, "utf-8");
|
|
216
|
+
const compiled = Handlebars.compile(raw, { strict: true });
|
|
217
|
+
const content2 = compiled(context);
|
|
218
|
+
if (outputPath.endsWith(".json") && file.relativePath.endsWith(".json.hbs")) {
|
|
219
|
+
if (!jsonBuffers.has(outputPath)) jsonBuffers.set(outputPath, []);
|
|
220
|
+
jsonBuffers.get(outputPath).push(JSON.parse(content2));
|
|
221
|
+
return Ok(null);
|
|
167
222
|
}
|
|
168
|
-
|
|
223
|
+
return Ok({ relativePath: outputPath, content: content2 });
|
|
169
224
|
}
|
|
225
|
+
const content = fs.readFileSync(file.absolutePath, "utf-8");
|
|
226
|
+
return Ok({ relativePath: file.relativePath, content });
|
|
170
227
|
} catch (error) {
|
|
171
228
|
const msg = error instanceof Error ? error.message : String(error);
|
|
172
|
-
return Err(
|
|
229
|
+
return Err(
|
|
230
|
+
new Error(`Template render failed in ${file.sourceTemplate}/${file.relativePath}: ${msg}`)
|
|
231
|
+
);
|
|
173
232
|
}
|
|
174
|
-
return Ok({ files: rendered });
|
|
175
233
|
}
|
|
176
234
|
write(files, targetDir, options) {
|
|
177
235
|
try {
|
|
178
236
|
const written = [];
|
|
237
|
+
const skippedConfigs = [];
|
|
238
|
+
const isNonJsLanguage = options.language && options.language !== "typescript";
|
|
179
239
|
for (const file of files.files) {
|
|
180
240
|
const targetPath = path.join(targetDir, file.relativePath);
|
|
181
241
|
const dir = path.dirname(targetPath);
|
|
242
|
+
if (!options.overwrite && isNonJsLanguage && NON_JSON_PACKAGE_CONFIGS.has(file.relativePath) && fs.existsSync(targetPath)) {
|
|
243
|
+
skippedConfigs.push(file.relativePath);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
182
246
|
if (!options.overwrite && fs.existsSync(targetPath)) continue;
|
|
183
247
|
fs.mkdirSync(dir, { recursive: true });
|
|
184
248
|
fs.writeFileSync(targetPath, file.content);
|
|
185
249
|
written.push(file.relativePath);
|
|
186
250
|
}
|
|
187
|
-
return Ok(written);
|
|
251
|
+
return Ok({ written, skippedConfigs });
|
|
188
252
|
} catch (error) {
|
|
189
253
|
return Err(
|
|
190
254
|
new Error(
|
|
@@ -193,6 +257,61 @@ var TemplateEngine = class {
|
|
|
193
257
|
);
|
|
194
258
|
}
|
|
195
259
|
}
|
|
260
|
+
detectFramework(targetDir) {
|
|
261
|
+
try {
|
|
262
|
+
const templatesResult = this.listTemplates();
|
|
263
|
+
if (!templatesResult.ok) return Err(templatesResult.error);
|
|
264
|
+
const candidates = [];
|
|
265
|
+
for (const meta of templatesResult.value) {
|
|
266
|
+
if (!meta.detect || meta.detect.length === 0) continue;
|
|
267
|
+
if (!meta.framework || !meta.language) continue;
|
|
268
|
+
const score = scoreDetectPatterns(targetDir, meta.detect);
|
|
269
|
+
if (score > 0) {
|
|
270
|
+
candidates.push({
|
|
271
|
+
framework: meta.framework,
|
|
272
|
+
language: meta.language,
|
|
273
|
+
score,
|
|
274
|
+
templateName: meta.name
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
279
|
+
return Ok(candidates);
|
|
280
|
+
} catch (error) {
|
|
281
|
+
return Err(
|
|
282
|
+
new Error(
|
|
283
|
+
`Framework detection failed: ${error instanceof Error ? error.message : String(error)}`
|
|
284
|
+
)
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
resolveLanguageTemplate(language, framework) {
|
|
289
|
+
const baseName = `${language}-base`;
|
|
290
|
+
const baseDir = this.findTemplateDir(baseName, "name");
|
|
291
|
+
if (!baseDir) return Err(new Error(`Language base template not found: ${baseName}`));
|
|
292
|
+
const metaPath = path.join(baseDir, "template.json");
|
|
293
|
+
const metaRaw = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
|
294
|
+
const metaResult = TemplateMetadataSchema.safeParse(metaRaw);
|
|
295
|
+
if (!metaResult.success)
|
|
296
|
+
return Err(new Error(`Invalid template.json in ${baseName}: ${metaResult.error.message}`));
|
|
297
|
+
const metadata = metaResult.data;
|
|
298
|
+
let files = this.collectFiles(baseDir, baseName);
|
|
299
|
+
let overlayMetadata;
|
|
300
|
+
if (framework) {
|
|
301
|
+
const frameworkDir = this.findTemplateDir(framework, "framework");
|
|
302
|
+
if (!frameworkDir) return Err(new Error(`Framework template not found: ${framework}`));
|
|
303
|
+
const fMetaPath = path.join(frameworkDir, "template.json");
|
|
304
|
+
const fMetaRaw = JSON.parse(fs.readFileSync(fMetaPath, "utf-8"));
|
|
305
|
+
const fMetaResult = TemplateMetadataSchema.safeParse(fMetaRaw);
|
|
306
|
+
if (fMetaResult.success) overlayMetadata = fMetaResult.data;
|
|
307
|
+
const frameworkFiles = this.collectFiles(frameworkDir, framework);
|
|
308
|
+
files = this.mergeFileLists(files, frameworkFiles);
|
|
309
|
+
}
|
|
310
|
+
files = files.filter((f) => f.relativePath !== "template.json");
|
|
311
|
+
const resolved = { metadata, files };
|
|
312
|
+
if (overlayMetadata !== void 0) resolved.overlayMetadata = overlayMetadata;
|
|
313
|
+
return Ok(resolved);
|
|
314
|
+
}
|
|
196
315
|
findTemplateDir(name, type) {
|
|
197
316
|
const entries = fs.readdirSync(this.templatesDir, { withFileTypes: true });
|
|
198
317
|
for (const entry of entries) {
|
|
@@ -202,11 +321,8 @@ var TemplateEngine = class {
|
|
|
202
321
|
const raw = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
|
203
322
|
const parsed = TemplateMetadataSchema.safeParse(raw);
|
|
204
323
|
if (!parsed.success) continue;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
if (type === "framework" && parsed.data.framework === name)
|
|
208
|
-
return path.join(this.templatesDir, entry.name);
|
|
209
|
-
if (parsed.data.name === name) return path.join(this.templatesDir, entry.name);
|
|
324
|
+
const fieldValue = parsed.data[type];
|
|
325
|
+
if (fieldValue === name) return path.join(this.templatesDir, entry.name);
|
|
210
326
|
}
|
|
211
327
|
return null;
|
|
212
328
|
}
|