@harness-engineering/cli 1.13.0 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
- package/dist/{agents-md-P2RHSUV7.js → agents-md-XU3BHE22.js} +1 -1
- package/dist/{architecture-ESOOE26S.js → architecture-2R5Z4ZAF.js} +2 -2
- package/dist/bin/harness-mcp.js +14 -13
- package/dist/bin/harness.js +22 -21
- package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-2OFZ7OWW.js} +3 -2
- package/dist/{chunk-LD3DKUK5.js → chunk-4ZMOCPYO.js} +1 -1
- package/dist/{chunk-5VY23YK3.js → chunk-65FRIL4D.js} +2 -2
- package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
- package/dist/{chunk-MACVXDZK.js → chunk-DZS7CJKL.js} +4 -4
- package/dist/{chunk-7PZWR4LI.js → chunk-IM32EEDM.js} +9 -9
- package/dist/{chunk-2YPZKGAG.js → chunk-IMFVFNJE.js} +1 -1
- package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
- package/dist/{chunk-MI5XJQDY.js → chunk-ND6PNADU.js} +23 -9
- package/dist/{chunk-7KQSUZVG.js → chunk-NERR4TAO.js} +729 -436
- package/dist/{chunk-PSNN4LWX.js → chunk-NOPU4RZ4.js} +2 -2
- package/dist/{chunk-KELT6K6M.js → chunk-PQ5YK4AY.js} +287 -258
- package/dist/{chunk-WPPDRIJL.js → chunk-QY4T6YAZ.js} +3 -3
- package/dist/{chunk-RZSUJBZZ.js → chunk-SSKDAOX5.js} +31 -28
- package/dist/{chunk-2VU4MFM3.js → chunk-TKJZKICB.js} +6 -6
- package/dist/{chunk-GNGELAXY.js → chunk-TS3XWPW5.js} +1 -1
- package/dist/chunk-UAX4I5ZE.js +217 -0
- package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
- package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
- package/dist/{chunk-3KOLLWWE.js → chunk-Z77YQRQT.js} +11 -207
- package/dist/{ci-workflow-4NYBUG6R.js → ci-workflow-EHV65NQB.js} +1 -1
- package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
- package/dist/{dist-WF4C7A4A.js → dist-2B363XUH.js} +1 -1
- package/dist/{dist-M6BQODWC.js → dist-HXHWB7SV.js} +2 -2
- package/dist/{docs-BPYCN2DR.js → docs-FZOPM4GK.js} +4 -2
- package/dist/{engine-LXLIWQQ3.js → engine-OL4T6NZS.js} +1 -1
- package/dist/{entropy-4VDVV5CR.js → entropy-LVHJMFGH.js} +2 -2
- package/dist/{feedback-63QB5RCA.js → feedback-IHLVLMRD.js} +1 -1
- package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-64S3CLEZ.js} +3 -3
- package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
- package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-GJZ4FN4Y.js} +1 -1
- package/dist/index.d.ts +35 -8
- package/dist/index.js +23 -21
- package/dist/{loader-Z2IT7QX3.js → loader-DPYFB6R6.js} +1 -1
- package/dist/{mcp-KQHEL5IF.js → mcp-JQUI7BVZ.js} +14 -13
- package/dist/{performance-26BH47O4.js → performance-ZTVSUANN.js} +2 -2
- package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-76JHKGSV.js} +1 -1
- package/dist/{runtime-PDWD7UIK.js → runtime-X7U6SC7K.js} +1 -1
- package/dist/{security-UQFUZXEN.js → security-FWQZF2IZ.js} +1 -1
- package/dist/skill-executor-XZLYZYAK.js +8 -0
- package/dist/{validate-N7QJOKFZ.js → validate-GCHZJIL7.js} +2 -2
- package/dist/{validate-cross-check-EDQ5QGTM.js → validate-cross-check-STFHYMAZ.js} +1 -1
- package/package.json +3 -3
- package/dist/skill-executor-RG45LUO5.js +0 -8
|
@@ -38,7 +38,7 @@ async function handleCheckDependencies(input) {
|
|
|
38
38
|
const configResult = resolveProjectConfig(projectPath);
|
|
39
39
|
if (!configResult.ok) return resultToMcpResponse(configResult);
|
|
40
40
|
try {
|
|
41
|
-
const { validateDependencies, TypeScriptParser } = await import("./dist-
|
|
41
|
+
const { validateDependencies, TypeScriptParser } = await import("./dist-2B363XUH.js");
|
|
42
42
|
const config = configResult.value;
|
|
43
43
|
const rawLayers = Array.isArray(config.layers) ? config.layers : [];
|
|
44
44
|
const layers = rawLayers.map((l) => ({
|
|
@@ -47,11 +47,11 @@ async function handleCheckDependencies(input) {
|
|
|
47
47
|
allowedDependencies: l.allowedDependencies
|
|
48
48
|
}));
|
|
49
49
|
const parser = new TypeScriptParser();
|
|
50
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
50
|
+
const { loadGraphStore } = await import("./graph-loader-GJZ4FN4Y.js");
|
|
51
51
|
const store = await loadGraphStore(projectPath);
|
|
52
52
|
let graphDependencyData;
|
|
53
53
|
if (store) {
|
|
54
|
-
const { GraphConstraintAdapter } = await import("./dist-
|
|
54
|
+
const { GraphConstraintAdapter } = await import("./dist-HXHWB7SV.js");
|
|
55
55
|
const adapter = new GraphConstraintAdapter(store);
|
|
56
56
|
const graphData = adapter.computeDependencyGraph();
|
|
57
57
|
graphDependencyData = {
|
|
@@ -5,14 +5,12 @@ import {
|
|
|
5
5
|
OutputFormatter,
|
|
6
6
|
OutputMode,
|
|
7
7
|
createCheckPhaseGateCommand,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
resolveConfig
|
|
11
|
-
} from "./chunk-3KOLLWWE.js";
|
|
8
|
+
findFiles
|
|
9
|
+
} from "./chunk-UAX4I5ZE.js";
|
|
12
10
|
import {
|
|
13
11
|
createGenerateAgentDefinitionsCommand,
|
|
14
12
|
generateAgentDefinitions
|
|
15
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TS3XWPW5.js";
|
|
16
14
|
import {
|
|
17
15
|
listPersonas,
|
|
18
16
|
loadPersona
|
|
@@ -22,13 +20,13 @@ import {
|
|
|
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";
|
|
@@ -50,17 +48,21 @@ import {
|
|
|
50
48
|
generateSlashCommands,
|
|
51
49
|
handleGetImpact,
|
|
52
50
|
handleOrphanDeletion
|
|
53
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-NERR4TAO.js";
|
|
54
52
|
import {
|
|
55
53
|
VALID_PLATFORMS
|
|
56
54
|
} from "./chunk-ZOAWBDWU.js";
|
|
55
|
+
import {
|
|
56
|
+
findConfigFile,
|
|
57
|
+
resolveConfig
|
|
58
|
+
} from "./chunk-Z77YQRQT.js";
|
|
57
59
|
import {
|
|
58
60
|
resolveGlobalSkillsDir,
|
|
59
61
|
resolvePersonasDir,
|
|
60
62
|
resolveProjectSkillsDir,
|
|
61
63
|
resolveSkillsDir,
|
|
62
64
|
resolveTemplatesDir
|
|
63
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-N5G5QMS3.js";
|
|
64
66
|
import {
|
|
65
67
|
CLIError,
|
|
66
68
|
ExitCode,
|
|
@@ -68,7 +70,7 @@ import {
|
|
|
68
70
|
} from "./chunk-3WGJMBKH.js";
|
|
69
71
|
import {
|
|
70
72
|
SkillMetadataSchema
|
|
71
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-XYLGHKG6.js";
|
|
72
74
|
import {
|
|
73
75
|
CLI_VERSION
|
|
74
76
|
} from "./chunk-BM3PWGXQ.js";
|
|
@@ -123,7 +125,7 @@ import {
|
|
|
123
125
|
validateKnowledgeMap,
|
|
124
126
|
writeConfig,
|
|
125
127
|
writeLockfile
|
|
126
|
-
} from "./chunk-
|
|
128
|
+
} from "./chunk-PQ5YK4AY.js";
|
|
127
129
|
import {
|
|
128
130
|
Err,
|
|
129
131
|
Ok
|
|
@@ -209,7 +211,7 @@ function createValidateCommand() {
|
|
|
209
211
|
process.exit(result.error.exitCode);
|
|
210
212
|
}
|
|
211
213
|
if (opts.crossCheck) {
|
|
212
|
-
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-
|
|
214
|
+
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-STFHYMAZ.js");
|
|
213
215
|
const cwd = process.cwd();
|
|
214
216
|
const specsDir = path.join(cwd, "docs", "specs");
|
|
215
217
|
const plansDir = path.join(cwd, "docs", "plans");
|
|
@@ -567,7 +569,7 @@ function createPerfCommand() {
|
|
|
567
569
|
perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob, _opts, cmd) => {
|
|
568
570
|
const globalOpts = cmd.optsWithGlobals();
|
|
569
571
|
const cwd = process.cwd();
|
|
570
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
572
|
+
const { BenchmarkRunner } = await import("./dist-2B363XUH.js");
|
|
571
573
|
const runner = new BenchmarkRunner();
|
|
572
574
|
const benchFiles = runner.discover(cwd, glob);
|
|
573
575
|
if (benchFiles.length === 0) {
|
|
@@ -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-2B363XUH.js");
|
|
640
642
|
const runner = new BenchmarkRunner();
|
|
641
643
|
const manager = new BaselineManager(cwd);
|
|
642
644
|
logger.info("Running benchmarks to update baselines...");
|
|
@@ -664,7 +666,7 @@ Results (${result.results.length} benchmarks):`);
|
|
|
664
666
|
perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
|
|
665
667
|
const globalOpts = cmd.optsWithGlobals();
|
|
666
668
|
const cwd = process.cwd();
|
|
667
|
-
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-
|
|
669
|
+
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-2B363XUH.js");
|
|
668
670
|
const analyzer = new EntropyAnalyzer2({
|
|
669
671
|
rootDir: path5.resolve(cwd),
|
|
670
672
|
analyze: { complexity: true, coupling: true }
|
|
@@ -1607,7 +1609,8 @@ async function runAdd(componentType, name, options) {
|
|
|
1607
1609
|
break;
|
|
1608
1610
|
}
|
|
1609
1611
|
case "doc": {
|
|
1610
|
-
const
|
|
1612
|
+
const configDocsDir = configResult.ok ? configResult.value.docsDir : "./docs";
|
|
1613
|
+
const docsDir = path12.resolve(cwd, configDocsDir);
|
|
1611
1614
|
if (!fs3.existsSync(docsDir)) {
|
|
1612
1615
|
fs3.mkdirSync(docsDir, { recursive: true });
|
|
1613
1616
|
}
|
|
@@ -1616,11 +1619,11 @@ async function runAdd(componentType, name, options) {
|
|
|
1616
1619
|
return Err(new CLIError(`Doc ${name} already exists`, ExitCode.ERROR));
|
|
1617
1620
|
}
|
|
1618
1621
|
fs3.writeFileSync(docPath, DOC_TEMPLATE(name));
|
|
1619
|
-
created.push(
|
|
1622
|
+
created.push(`${configDocsDir.replace(/^\.[\\/]/, "")}/${name}.md`);
|
|
1620
1623
|
break;
|
|
1621
1624
|
}
|
|
1622
1625
|
case "skill": {
|
|
1623
|
-
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-
|
|
1626
|
+
const { generateSkillFiles: generateSkillFiles2 } = await import("./create-skill-XSWHMSM5.js");
|
|
1624
1627
|
generateSkillFiles2({
|
|
1625
1628
|
name,
|
|
1626
1629
|
description: `${name} skill`,
|
|
@@ -3028,8 +3031,8 @@ function createResetCommand() {
|
|
|
3028
3031
|
}
|
|
3029
3032
|
if (!opts.yes) {
|
|
3030
3033
|
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] ",
|
|
3034
|
+
const answer = await new Promise((resolve29) => {
|
|
3035
|
+
rl.question("Reset project state? This cannot be undone. [y/N] ", resolve29);
|
|
3033
3036
|
});
|
|
3034
3037
|
rl.close();
|
|
3035
3038
|
if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
|
|
@@ -3436,10 +3439,10 @@ function prompt(question) {
|
|
|
3436
3439
|
input: process.stdin,
|
|
3437
3440
|
output: process.stdout
|
|
3438
3441
|
});
|
|
3439
|
-
return new Promise((
|
|
3442
|
+
return new Promise((resolve29) => {
|
|
3440
3443
|
rl.question(question, (answer) => {
|
|
3441
3444
|
rl.close();
|
|
3442
|
-
|
|
3445
|
+
resolve29(answer.trim().toLowerCase());
|
|
3443
3446
|
});
|
|
3444
3447
|
});
|
|
3445
3448
|
}
|
|
@@ -3579,7 +3582,7 @@ function createGenerateCommand3() {
|
|
|
3579
3582
|
import { Command as Command39 } from "commander";
|
|
3580
3583
|
import * as path29 from "path";
|
|
3581
3584
|
async function runScan(projectPath) {
|
|
3582
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-
|
|
3585
|
+
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-HXHWB7SV.js");
|
|
3583
3586
|
const store = new GraphStore();
|
|
3584
3587
|
const start = Date.now();
|
|
3585
3588
|
await new CodeIngestor(store).ingest(projectPath);
|
|
@@ -3660,7 +3663,7 @@ async function runIngest(projectPath, source, opts) {
|
|
|
3660
3663
|
SyncManager,
|
|
3661
3664
|
JiraConnector,
|
|
3662
3665
|
SlackConnector
|
|
3663
|
-
} = await import("./dist-
|
|
3666
|
+
} = await import("./dist-HXHWB7SV.js");
|
|
3664
3667
|
const graphDir = path30.join(projectPath, ".harness", "graph");
|
|
3665
3668
|
const store = new GraphStore();
|
|
3666
3669
|
await store.load(graphDir);
|
|
@@ -3753,7 +3756,7 @@ function createIngestCommand() {
|
|
|
3753
3756
|
import { Command as Command41 } from "commander";
|
|
3754
3757
|
import * as path31 from "path";
|
|
3755
3758
|
async function runQuery(projectPath, rootNodeId, opts) {
|
|
3756
|
-
const { GraphStore, ContextQL } = await import("./dist-
|
|
3759
|
+
const { GraphStore, ContextQL } = await import("./dist-HXHWB7SV.js");
|
|
3757
3760
|
const store = new GraphStore();
|
|
3758
3761
|
const graphDir = path31.join(projectPath, ".harness", "graph");
|
|
3759
3762
|
const loaded = await store.load(graphDir);
|
|
@@ -3802,7 +3805,7 @@ import { Command as Command42 } from "commander";
|
|
|
3802
3805
|
// src/commands/graph/status.ts
|
|
3803
3806
|
import * as path32 from "path";
|
|
3804
3807
|
async function runGraphStatus(projectPath) {
|
|
3805
|
-
const { GraphStore } = await import("./dist-
|
|
3808
|
+
const { GraphStore } = await import("./dist-HXHWB7SV.js");
|
|
3806
3809
|
const graphDir = path32.join(projectPath, ".harness", "graph");
|
|
3807
3810
|
const store = new GraphStore();
|
|
3808
3811
|
const loaded = await store.load(graphDir);
|
|
@@ -3842,7 +3845,7 @@ async function runGraphStatus(projectPath) {
|
|
|
3842
3845
|
// src/commands/graph/export.ts
|
|
3843
3846
|
import * as path33 from "path";
|
|
3844
3847
|
async function runGraphExport(projectPath, format) {
|
|
3845
|
-
const { GraphStore } = await import("./dist-
|
|
3848
|
+
const { GraphStore } = await import("./dist-HXHWB7SV.js");
|
|
3846
3849
|
const graphDir = path33.join(projectPath, ".harness", "graph");
|
|
3847
3850
|
const store = new GraphStore();
|
|
3848
3851
|
const loaded = await store.load(graphDir);
|
|
@@ -3921,7 +3924,7 @@ function createGraphCommand() {
|
|
|
3921
3924
|
import { Command as Command43 } from "commander";
|
|
3922
3925
|
function createMcpCommand() {
|
|
3923
3926
|
return new Command43("mcp").description("Start the MCP (Model Context Protocol) server on stdio").action(async () => {
|
|
3924
|
-
const { startServer: startServer2 } = await import("./mcp-
|
|
3927
|
+
const { startServer: startServer2 } = await import("./mcp-JQUI7BVZ.js");
|
|
3925
3928
|
await startServer2();
|
|
3926
3929
|
});
|
|
3927
3930
|
}
|
|
@@ -27,7 +27,7 @@ var checkPerformanceDefinition = {
|
|
|
27
27
|
};
|
|
28
28
|
async function handleCheckPerformance(input) {
|
|
29
29
|
try {
|
|
30
|
-
const { EntropyAnalyzer } = await import("./dist-
|
|
30
|
+
const { EntropyAnalyzer } = await import("./dist-2B363XUH.js");
|
|
31
31
|
const typeFilter = input.type ?? "all";
|
|
32
32
|
const projectPath = sanitizePath(input.path);
|
|
33
33
|
const analyzer = new EntropyAnalyzer({
|
|
@@ -40,10 +40,10 @@ async function handleCheckPerformance(input) {
|
|
|
40
40
|
});
|
|
41
41
|
let graphOptions;
|
|
42
42
|
try {
|
|
43
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
43
|
+
const { loadGraphStore } = await import("./graph-loader-GJZ4FN4Y.js");
|
|
44
44
|
const store = await loadGraphStore(projectPath);
|
|
45
45
|
if (store) {
|
|
46
|
-
const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-
|
|
46
|
+
const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-HXHWB7SV.js");
|
|
47
47
|
const complexityAdapter = new GraphComplexityAdapter(store);
|
|
48
48
|
const couplingAdapter = new GraphCouplingAdapter(store);
|
|
49
49
|
graphOptions = {
|
|
@@ -80,7 +80,7 @@ var getPerfBaselinesDefinition = {
|
|
|
80
80
|
};
|
|
81
81
|
async function handleGetPerfBaselines(input) {
|
|
82
82
|
try {
|
|
83
|
-
const { BaselineManager } = await import("./dist-
|
|
83
|
+
const { BaselineManager } = await import("./dist-2B363XUH.js");
|
|
84
84
|
const manager = new BaselineManager(sanitizePath(input.path));
|
|
85
85
|
const baselines = manager.load();
|
|
86
86
|
return resultToMcpResponse(
|
|
@@ -128,7 +128,7 @@ var updatePerfBaselinesDefinition = {
|
|
|
128
128
|
};
|
|
129
129
|
async function handleUpdatePerfBaselines(input) {
|
|
130
130
|
try {
|
|
131
|
-
const { BaselineManager } = await import("./dist-
|
|
131
|
+
const { BaselineManager } = await import("./dist-2B363XUH.js");
|
|
132
132
|
const manager = new BaselineManager(sanitizePath(input.path));
|
|
133
133
|
manager.save(input.results, input.commitHash);
|
|
134
134
|
const updated = manager.load();
|
|
@@ -158,7 +158,7 @@ var getCriticalPathsDefinition = {
|
|
|
158
158
|
};
|
|
159
159
|
async function handleGetCriticalPaths(input) {
|
|
160
160
|
try {
|
|
161
|
-
const { CriticalPathResolver } = await import("./dist-
|
|
161
|
+
const { CriticalPathResolver } = await import("./dist-2B363XUH.js");
|
|
162
162
|
const resolver = new CriticalPathResolver(sanitizePath(input.path));
|
|
163
163
|
const result = await resolver.resolve();
|
|
164
164
|
return resultToMcpResponse(Ok(result));
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logger
|
|
3
|
+
} from "./chunk-EBJQ6N4M.js";
|
|
4
|
+
import {
|
|
5
|
+
resolveConfig
|
|
6
|
+
} from "./chunk-Z77YQRQT.js";
|
|
7
|
+
import {
|
|
8
|
+
ExitCode
|
|
9
|
+
} from "./chunk-3WGJMBKH.js";
|
|
10
|
+
import {
|
|
11
|
+
Ok
|
|
12
|
+
} from "./chunk-MHBMTPW7.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
|
+
};
|
|
@@ -59,7 +59,11 @@ var SkillMetadataSchema = z.object({
|
|
|
59
59
|
phases: z.array(SkillPhaseSchema).optional(),
|
|
60
60
|
state: SkillStateSchema.default({}),
|
|
61
61
|
depends_on: z.array(z.string()).default([]),
|
|
62
|
-
repository: z.string().url().optional()
|
|
62
|
+
repository: z.string().url().optional(),
|
|
63
|
+
tier: z.number().int().min(1).max(3).optional(),
|
|
64
|
+
internal: z.boolean().default(false),
|
|
65
|
+
keywords: z.array(z.string()).default([]),
|
|
66
|
+
stack_signals: z.array(z.string()).default([])
|
|
63
67
|
});
|
|
64
68
|
|
|
65
69
|
export {
|