@harness-engineering/cli 1.15.0 → 1.17.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/commands/codex/AGENTS.md +39 -0
- package/dist/agents/commands/codex/harness/add-harness-component/SKILL.md +195 -0
- package/dist/agents/commands/codex/harness/add-harness-component/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/cleanup-dead-code/SKILL.md +248 -0
- package/dist/agents/commands/codex/harness/cleanup-dead-code/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/detect-doc-drift/SKILL.md +182 -0
- package/dist/agents/commands/codex/harness/detect-doc-drift/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/enforce-architecture/SKILL.md +299 -0
- package/dist/agents/commands/codex/harness/enforce-architecture/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-architecture-advisor/SKILL.md +452 -0
- package/dist/agents/commands/codex/harness/harness-architecture-advisor/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-autopilot/SKILL.md +919 -0
- package/dist/agents/commands/codex/harness/harness-autopilot/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-brainstorming/SKILL.md +409 -0
- package/dist/agents/commands/codex/harness/harness-brainstorming/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-code-review/SKILL.md +860 -0
- package/dist/agents/commands/codex/harness/harness-code-review/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-codebase-cleanup/SKILL.md +227 -0
- package/dist/agents/commands/codex/harness/harness-codebase-cleanup/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-debugging/SKILL.md +369 -0
- package/dist/agents/commands/codex/harness/harness-debugging/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-dependency-health/SKILL.md +182 -0
- package/dist/agents/commands/codex/harness/harness-dependency-health/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-docs-pipeline/SKILL.md +463 -0
- package/dist/agents/commands/codex/harness/harness-docs-pipeline/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-execution/SKILL.md +513 -0
- package/dist/agents/commands/codex/harness/harness-execution/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-hotspot-detector/SKILL.md +164 -0
- package/dist/agents/commands/codex/harness/harness-hotspot-detector/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-impact-analysis/SKILL.md +187 -0
- package/dist/agents/commands/codex/harness/harness-impact-analysis/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-integrity/SKILL.md +170 -0
- package/dist/agents/commands/codex/harness/harness-integrity/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-onboarding/SKILL.md +291 -0
- package/dist/agents/commands/codex/harness/harness-onboarding/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-perf/SKILL.md +263 -0
- package/dist/agents/commands/codex/harness/harness-perf/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-planning/SKILL.md +582 -0
- package/dist/agents/commands/codex/harness/harness-planning/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-refactoring/SKILL.md +172 -0
- package/dist/agents/commands/codex/harness/harness-refactoring/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-release-readiness/SKILL.md +692 -0
- package/dist/agents/commands/codex/harness/harness-release-readiness/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-roadmap/SKILL.md +598 -0
- package/dist/agents/commands/codex/harness/harness-roadmap/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-security-scan/SKILL.md +157 -0
- package/dist/agents/commands/codex/harness/harness-security-scan/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-skill-authoring/SKILL.md +295 -0
- package/dist/agents/commands/codex/harness/harness-skill-authoring/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-soundness-review/SKILL.md +1270 -0
- package/dist/agents/commands/codex/harness/harness-soundness-review/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-supply-chain-audit/SKILL.md +247 -0
- package/dist/agents/commands/codex/harness/harness-supply-chain-audit/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-tdd/SKILL.md +180 -0
- package/dist/agents/commands/codex/harness/harness-tdd/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-test-advisor/SKILL.md +163 -0
- package/dist/agents/commands/codex/harness/harness-test-advisor/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-verification/SKILL.md +424 -0
- package/dist/agents/commands/codex/harness/harness-verification/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/harness-verify/SKILL.md +162 -0
- package/dist/agents/commands/codex/harness/harness-verify/agents/openai.yaml +3 -0
- package/dist/agents/commands/codex/harness/initialize-harness-project/SKILL.md +235 -0
- package/dist/agents/commands/codex/harness/initialize-harness-project/agents/openai.yaml +3 -0
- package/dist/agents/commands/cursor/harness/add-harness-component.mdc +200 -0
- package/dist/agents/commands/cursor/harness/cleanup-dead-code.mdc +253 -0
- package/dist/agents/commands/cursor/harness/detect-doc-drift.mdc +187 -0
- package/dist/agents/commands/cursor/harness/enforce-architecture.mdc +304 -0
- package/dist/agents/commands/cursor/harness/harness-architecture-advisor.mdc +457 -0
- package/dist/agents/commands/cursor/harness/harness-autopilot.mdc +924 -0
- package/dist/agents/commands/cursor/harness/harness-brainstorming.mdc +414 -0
- package/dist/agents/commands/cursor/harness/harness-code-review.mdc +865 -0
- package/dist/agents/commands/cursor/harness/harness-codebase-cleanup.mdc +232 -0
- package/dist/agents/commands/cursor/harness/harness-debugging.mdc +374 -0
- package/dist/agents/commands/cursor/harness/harness-dependency-health.mdc +187 -0
- package/dist/agents/commands/cursor/harness/harness-docs-pipeline.mdc +468 -0
- package/dist/agents/commands/cursor/harness/harness-execution.mdc +518 -0
- package/dist/agents/commands/cursor/harness/harness-hotspot-detector.mdc +169 -0
- package/dist/agents/commands/cursor/harness/harness-impact-analysis.mdc +192 -0
- package/dist/agents/commands/cursor/harness/harness-integrity.mdc +175 -0
- package/dist/agents/commands/cursor/harness/harness-onboarding.mdc +296 -0
- package/dist/agents/commands/cursor/harness/harness-perf.mdc +268 -0
- package/dist/agents/commands/cursor/harness/harness-planning.mdc +587 -0
- package/dist/agents/commands/cursor/harness/harness-refactoring.mdc +177 -0
- package/dist/agents/commands/cursor/harness/harness-release-readiness.mdc +697 -0
- package/dist/agents/commands/cursor/harness/harness-roadmap.mdc +603 -0
- package/dist/agents/commands/cursor/harness/harness-security-scan.mdc +162 -0
- package/dist/agents/commands/cursor/harness/harness-skill-authoring.mdc +300 -0
- package/dist/agents/commands/cursor/harness/harness-soundness-review.mdc +1275 -0
- package/dist/agents/commands/cursor/harness/harness-supply-chain-audit.mdc +252 -0
- package/dist/agents/commands/cursor/harness/harness-tdd.mdc +185 -0
- package/dist/agents/commands/cursor/harness/harness-test-advisor.mdc +168 -0
- package/dist/agents/commands/cursor/harness/harness-verification.mdc +429 -0
- package/dist/agents/commands/cursor/harness/harness-verify.mdc +167 -0
- package/dist/agents/commands/cursor/harness/initialize-harness-project.mdc +240 -0
- package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-auth/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +123 -14
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +97 -3
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +2 -4
- package/dist/agents/skills/claude-code/harness-database/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +99 -3
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/SKILL.md +1 -1
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +27 -7
- package/dist/agents/skills/claude-code/harness-security-scan/SKILL.md +52 -0
- package/dist/agents/skills/claude-code/harness-supply-chain-audit/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-supply-chain-audit/skill.yaml +51 -0
- package/dist/agents/skills/codex/add-harness-component/SKILL.md +192 -0
- package/dist/agents/skills/codex/add-harness-component/skill.yaml +33 -0
- package/dist/agents/skills/codex/align-documentation/SKILL.md +213 -0
- package/dist/agents/skills/codex/align-documentation/skill.yaml +32 -0
- package/dist/agents/skills/codex/check-mechanical-constraints/SKILL.md +191 -0
- package/dist/agents/skills/codex/check-mechanical-constraints/skill.yaml +33 -0
- package/dist/agents/skills/codex/cleanup-dead-code/SKILL.md +245 -0
- package/dist/agents/skills/codex/cleanup-dead-code/skill.yaml +34 -0
- package/dist/agents/skills/codex/detect-doc-drift/SKILL.md +179 -0
- package/dist/agents/skills/codex/detect-doc-drift/skill.yaml +31 -0
- package/dist/agents/skills/codex/enforce-architecture/SKILL.md +296 -0
- package/dist/agents/skills/codex/enforce-architecture/skill.yaml +35 -0
- package/dist/agents/skills/codex/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/codex/harness-accessibility/skill.yaml +52 -0
- package/dist/agents/skills/codex/harness-api-design/SKILL.md +356 -0
- package/dist/agents/skills/codex/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +449 -0
- package/dist/agents/skills/codex/harness-architecture-advisor/skill.yaml +49 -0
- package/dist/agents/skills/codex/harness-auth/SKILL.md +331 -0
- package/dist/agents/skills/codex/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/codex/harness-autopilot/SKILL.md +916 -0
- package/dist/agents/skills/codex/harness-autopilot/skill.yaml +67 -0
- package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +406 -0
- package/dist/agents/skills/codex/harness-brainstorming/skill.yaml +50 -0
- package/dist/agents/skills/codex/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/codex/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/codex/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/codex/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/codex/harness-code-review/SKILL.md +857 -0
- package/dist/agents/skills/codex/harness-code-review/skill.yaml +52 -0
- package/dist/agents/skills/codex/harness-codebase-cleanup/SKILL.md +224 -0
- package/dist/agents/skills/codex/harness-codebase-cleanup/skill.yaml +65 -0
- package/dist/agents/skills/codex/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/codex/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/codex/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/codex/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/codex/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/codex/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/codex/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/codex/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/codex/harness-database/SKILL.md +310 -0
- package/dist/agents/skills/codex/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/codex/harness-debugging/SKILL.md +366 -0
- package/dist/agents/skills/codex/harness-debugging/skill.yaml +48 -0
- package/dist/agents/skills/codex/harness-dependency-health/SKILL.md +179 -0
- package/dist/agents/skills/codex/harness-dependency-health/skill.yaml +42 -0
- package/dist/agents/skills/codex/harness-deployment/SKILL.md +307 -0
- package/dist/agents/skills/codex/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/codex/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/codex/harness-design/skill.yaml +54 -0
- package/dist/agents/skills/codex/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/codex/harness-design-mobile/skill.yaml +50 -0
- package/dist/agents/skills/codex/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/codex/harness-design-system/skill.yaml +51 -0
- package/dist/agents/skills/codex/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/codex/harness-design-web/skill.yaml +53 -0
- package/dist/agents/skills/codex/harness-diagnostics/SKILL.md +318 -0
- package/dist/agents/skills/codex/harness-diagnostics/skill.yaml +51 -0
- package/dist/agents/skills/codex/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/codex/harness-docs-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/codex/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/codex/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/codex/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/codex/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/codex/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/codex/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/codex/harness-execution/SKILL.md +510 -0
- package/dist/agents/skills/codex/harness-execution/skill.yaml +52 -0
- package/dist/agents/skills/codex/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/codex/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +268 -0
- package/dist/agents/skills/codex/harness-git-workflow/skill.yaml +32 -0
- package/dist/agents/skills/codex/harness-hotspot-detector/SKILL.md +161 -0
- package/dist/agents/skills/codex/harness-hotspot-detector/skill.yaml +45 -0
- package/dist/agents/skills/codex/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/codex/harness-i18n/skill.yaml +55 -0
- package/dist/agents/skills/codex/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/codex/harness-i18n-process/skill.yaml +44 -0
- package/dist/agents/skills/codex/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/codex/harness-i18n-workflow/skill.yaml +54 -0
- package/dist/agents/skills/codex/harness-impact-analysis/SKILL.md +184 -0
- package/dist/agents/skills/codex/harness-impact-analysis/skill.yaml +45 -0
- package/dist/agents/skills/codex/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/codex/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/codex/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/codex/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/codex/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/codex/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/codex/harness-integrity/SKILL.md +167 -0
- package/dist/agents/skills/codex/harness-integrity/skill.yaml +48 -0
- package/dist/agents/skills/codex/harness-knowledge-mapper/SKILL.md +195 -0
- package/dist/agents/skills/codex/harness-knowledge-mapper/skill.yaml +50 -0
- package/dist/agents/skills/codex/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/codex/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/codex/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/codex/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/codex/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/codex/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/codex/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/codex/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/codex/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/codex/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/codex/harness-onboarding/SKILL.md +288 -0
- package/dist/agents/skills/codex/harness-onboarding/skill.yaml +31 -0
- package/dist/agents/skills/codex/harness-parallel-agents/SKILL.md +256 -0
- package/dist/agents/skills/codex/harness-parallel-agents/skill.yaml +34 -0
- package/dist/agents/skills/codex/harness-perf/SKILL.md +260 -0
- package/dist/agents/skills/codex/harness-perf/skill.yaml +51 -0
- package/dist/agents/skills/codex/harness-perf-tdd/SKILL.md +249 -0
- package/dist/agents/skills/codex/harness-perf-tdd/skill.yaml +48 -0
- package/dist/agents/skills/codex/harness-planning/SKILL.md +579 -0
- package/dist/agents/skills/codex/harness-planning/skill.yaml +56 -0
- package/dist/agents/skills/codex/harness-pre-commit-review/SKILL.md +324 -0
- package/dist/agents/skills/codex/harness-pre-commit-review/skill.yaml +34 -0
- package/dist/agents/skills/codex/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/codex/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/codex/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/codex/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/codex/harness-refactoring/SKILL.md +169 -0
- package/dist/agents/skills/codex/harness-refactoring/skill.yaml +34 -0
- package/dist/agents/skills/codex/harness-release-readiness/SKILL.md +689 -0
- package/dist/agents/skills/codex/harness-release-readiness/skill.yaml +58 -0
- package/dist/agents/skills/codex/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/codex/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/codex/harness-roadmap/SKILL.md +595 -0
- package/dist/agents/skills/codex/harness-roadmap/skill.yaml +44 -0
- package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/codex/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/codex/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/codex/harness-security-review/SKILL.md +260 -0
- package/dist/agents/skills/codex/harness-security-review/skill.yaml +53 -0
- package/dist/agents/skills/codex/harness-security-scan/SKILL.md +154 -0
- package/dist/agents/skills/codex/harness-security-scan/skill.yaml +42 -0
- package/dist/agents/skills/codex/harness-skill-authoring/SKILL.md +292 -0
- package/dist/agents/skills/codex/harness-skill-authoring/skill.yaml +33 -0
- package/dist/agents/skills/codex/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/codex/harness-soundness-review/skill.yaml +49 -0
- package/dist/agents/skills/codex/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/codex/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/codex/harness-state-management/SKILL.md +309 -0
- package/dist/agents/skills/codex/harness-state-management/skill.yaml +33 -0
- package/dist/agents/skills/codex/harness-supply-chain-audit/SKILL.md +281 -0
- package/dist/agents/skills/codex/harness-supply-chain-audit/skill.yaml +51 -0
- package/dist/agents/skills/codex/harness-tdd/SKILL.md +177 -0
- package/dist/agents/skills/codex/harness-tdd/skill.yaml +49 -0
- package/dist/agents/skills/codex/harness-test-advisor/SKILL.md +160 -0
- package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +45 -0
- package/dist/agents/skills/codex/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/codex/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/codex/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/codex/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/codex/harness-verification/SKILL.md +421 -0
- package/dist/agents/skills/codex/harness-verification/skill.yaml +43 -0
- package/dist/agents/skills/codex/harness-verify/SKILL.md +159 -0
- package/dist/agents/skills/codex/harness-verify/skill.yaml +41 -0
- package/dist/agents/skills/codex/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/codex/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +232 -0
- package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +32 -0
- package/dist/agents/skills/codex/validate-context-engineering/SKILL.md +150 -0
- package/dist/agents/skills/codex/validate-context-engineering/skill.yaml +32 -0
- package/dist/agents/skills/cursor/add-harness-component/SKILL.md +192 -0
- package/dist/agents/skills/cursor/add-harness-component/skill.yaml +33 -0
- package/dist/agents/skills/cursor/align-documentation/SKILL.md +213 -0
- package/dist/agents/skills/cursor/align-documentation/skill.yaml +32 -0
- package/dist/agents/skills/cursor/check-mechanical-constraints/SKILL.md +191 -0
- package/dist/agents/skills/cursor/check-mechanical-constraints/skill.yaml +33 -0
- package/dist/agents/skills/cursor/cleanup-dead-code/SKILL.md +245 -0
- package/dist/agents/skills/cursor/cleanup-dead-code/skill.yaml +34 -0
- package/dist/agents/skills/cursor/detect-doc-drift/SKILL.md +179 -0
- package/dist/agents/skills/cursor/detect-doc-drift/skill.yaml +31 -0
- package/dist/agents/skills/cursor/enforce-architecture/SKILL.md +296 -0
- package/dist/agents/skills/cursor/enforce-architecture/skill.yaml +35 -0
- package/dist/agents/skills/cursor/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/cursor/harness-accessibility/skill.yaml +52 -0
- package/dist/agents/skills/cursor/harness-api-design/SKILL.md +356 -0
- package/dist/agents/skills/cursor/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +449 -0
- package/dist/agents/skills/cursor/harness-architecture-advisor/skill.yaml +49 -0
- package/dist/agents/skills/cursor/harness-auth/SKILL.md +331 -0
- package/dist/agents/skills/cursor/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +916 -0
- package/dist/agents/skills/cursor/harness-autopilot/skill.yaml +67 -0
- package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +406 -0
- package/dist/agents/skills/cursor/harness-brainstorming/skill.yaml +50 -0
- package/dist/agents/skills/cursor/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/cursor/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/cursor/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/cursor/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/cursor/harness-code-review/SKILL.md +857 -0
- package/dist/agents/skills/cursor/harness-code-review/skill.yaml +52 -0
- package/dist/agents/skills/cursor/harness-codebase-cleanup/SKILL.md +224 -0
- package/dist/agents/skills/cursor/harness-codebase-cleanup/skill.yaml +65 -0
- package/dist/agents/skills/cursor/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/cursor/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/cursor/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/cursor/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/cursor/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/cursor/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/cursor/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/cursor/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/cursor/harness-database/SKILL.md +310 -0
- package/dist/agents/skills/cursor/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/cursor/harness-debugging/SKILL.md +366 -0
- package/dist/agents/skills/cursor/harness-debugging/skill.yaml +48 -0
- package/dist/agents/skills/cursor/harness-dependency-health/SKILL.md +179 -0
- package/dist/agents/skills/cursor/harness-dependency-health/skill.yaml +42 -0
- package/dist/agents/skills/cursor/harness-deployment/SKILL.md +307 -0
- package/dist/agents/skills/cursor/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/cursor/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/cursor/harness-design/skill.yaml +54 -0
- package/dist/agents/skills/cursor/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/cursor/harness-design-mobile/skill.yaml +50 -0
- package/dist/agents/skills/cursor/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/cursor/harness-design-system/skill.yaml +51 -0
- package/dist/agents/skills/cursor/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/cursor/harness-design-web/skill.yaml +53 -0
- package/dist/agents/skills/cursor/harness-diagnostics/SKILL.md +318 -0
- package/dist/agents/skills/cursor/harness-diagnostics/skill.yaml +51 -0
- package/dist/agents/skills/cursor/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/cursor/harness-docs-pipeline/skill.yaml +70 -0
- package/dist/agents/skills/cursor/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/cursor/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/cursor/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/cursor/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/cursor/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/cursor/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/cursor/harness-execution/SKILL.md +510 -0
- package/dist/agents/skills/cursor/harness-execution/skill.yaml +52 -0
- package/dist/agents/skills/cursor/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/cursor/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +268 -0
- package/dist/agents/skills/cursor/harness-git-workflow/skill.yaml +32 -0
- package/dist/agents/skills/cursor/harness-hotspot-detector/SKILL.md +161 -0
- package/dist/agents/skills/cursor/harness-hotspot-detector/skill.yaml +45 -0
- package/dist/agents/skills/cursor/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/cursor/harness-i18n/skill.yaml +55 -0
- package/dist/agents/skills/cursor/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/cursor/harness-i18n-process/skill.yaml +44 -0
- package/dist/agents/skills/cursor/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/cursor/harness-i18n-workflow/skill.yaml +54 -0
- package/dist/agents/skills/cursor/harness-impact-analysis/SKILL.md +184 -0
- package/dist/agents/skills/cursor/harness-impact-analysis/skill.yaml +45 -0
- package/dist/agents/skills/cursor/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/cursor/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/cursor/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/cursor/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/cursor/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/cursor/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/cursor/harness-integrity/SKILL.md +167 -0
- package/dist/agents/skills/cursor/harness-integrity/skill.yaml +48 -0
- package/dist/agents/skills/cursor/harness-knowledge-mapper/SKILL.md +195 -0
- package/dist/agents/skills/cursor/harness-knowledge-mapper/skill.yaml +50 -0
- package/dist/agents/skills/cursor/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/cursor/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/cursor/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/cursor/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/cursor/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/cursor/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/cursor/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/cursor/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/cursor/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/cursor/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +288 -0
- package/dist/agents/skills/cursor/harness-onboarding/skill.yaml +31 -0
- package/dist/agents/skills/cursor/harness-parallel-agents/SKILL.md +256 -0
- package/dist/agents/skills/cursor/harness-parallel-agents/skill.yaml +34 -0
- package/dist/agents/skills/cursor/harness-perf/SKILL.md +260 -0
- package/dist/agents/skills/cursor/harness-perf/skill.yaml +51 -0
- package/dist/agents/skills/cursor/harness-perf-tdd/SKILL.md +249 -0
- package/dist/agents/skills/cursor/harness-perf-tdd/skill.yaml +48 -0
- package/dist/agents/skills/cursor/harness-planning/SKILL.md +579 -0
- package/dist/agents/skills/cursor/harness-planning/skill.yaml +56 -0
- package/dist/agents/skills/cursor/harness-pre-commit-review/SKILL.md +324 -0
- package/dist/agents/skills/cursor/harness-pre-commit-review/skill.yaml +34 -0
- package/dist/agents/skills/cursor/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/cursor/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/cursor/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/cursor/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/cursor/harness-refactoring/SKILL.md +169 -0
- package/dist/agents/skills/cursor/harness-refactoring/skill.yaml +34 -0
- package/dist/agents/skills/cursor/harness-release-readiness/SKILL.md +689 -0
- package/dist/agents/skills/cursor/harness-release-readiness/skill.yaml +58 -0
- package/dist/agents/skills/cursor/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/cursor/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +595 -0
- package/dist/agents/skills/cursor/harness-roadmap/skill.yaml +44 -0
- package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/cursor/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/cursor/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/cursor/harness-security-review/SKILL.md +260 -0
- package/dist/agents/skills/cursor/harness-security-review/skill.yaml +53 -0
- package/dist/agents/skills/cursor/harness-security-scan/SKILL.md +154 -0
- package/dist/agents/skills/cursor/harness-security-scan/skill.yaml +42 -0
- package/dist/agents/skills/cursor/harness-skill-authoring/SKILL.md +292 -0
- package/dist/agents/skills/cursor/harness-skill-authoring/skill.yaml +33 -0
- package/dist/agents/skills/cursor/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/cursor/harness-soundness-review/skill.yaml +49 -0
- package/dist/agents/skills/cursor/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/cursor/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/cursor/harness-state-management/SKILL.md +309 -0
- package/dist/agents/skills/cursor/harness-state-management/skill.yaml +33 -0
- package/dist/agents/skills/cursor/harness-supply-chain-audit/SKILL.md +281 -0
- package/dist/agents/skills/cursor/harness-supply-chain-audit/skill.yaml +51 -0
- package/dist/agents/skills/cursor/harness-tdd/SKILL.md +177 -0
- package/dist/agents/skills/cursor/harness-tdd/skill.yaml +49 -0
- package/dist/agents/skills/cursor/harness-test-advisor/SKILL.md +160 -0
- package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +45 -0
- package/dist/agents/skills/cursor/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/cursor/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/cursor/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/cursor/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/cursor/harness-verification/SKILL.md +421 -0
- package/dist/agents/skills/cursor/harness-verification/skill.yaml +43 -0
- package/dist/agents/skills/cursor/harness-verify/SKILL.md +159 -0
- package/dist/agents/skills/cursor/harness-verify/skill.yaml +41 -0
- package/dist/agents/skills/cursor/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/cursor/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +232 -0
- package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +32 -0
- package/dist/agents/skills/cursor/validate-context-engineering/SKILL.md +150 -0
- package/dist/agents/skills/cursor/validate-context-engineering/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +123 -14
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +97 -3
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +2 -4
- package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +99 -3
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/SKILL.md +1 -1
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +204 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +52 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +27 -7
- package/dist/agents/skills/gemini-cli/harness-security-scan/SKILL.md +52 -0
- package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/skill.yaml +51 -0
- package/dist/agents/skills/package.json +5 -5
- package/dist/agents/skills/templates/discipline-template.md +49 -0
- package/dist/agents/skills/tests/schema.ts +1 -1
- package/dist/{agents-md-ZGNIDWAF.js → agents-md-DUYNKHJZ.js} +1 -1
- package/dist/{architecture-ZLIH5533.js → architecture-UBO5KKUV.js} +2 -2
- package/dist/bin/harness-mcp.js +14 -14
- package/dist/bin/harness.js +20 -20
- package/dist/{check-phase-gate-ZOXVBDCN.js → check-phase-gate-OSHN2AEL.js} +3 -3
- package/dist/{chunk-NNHDDXYT.js → chunk-2DMIQ35P.js} +486 -132
- package/dist/{chunk-OFXQSFOW.js → chunk-5FM64G6D.js} +2 -2
- package/dist/{chunk-RCWZBSK5.js → chunk-6KWBH4EO.js} +1 -1
- package/dist/{chunk-LGYBN7Y6.js → chunk-ABQUCXRE.js} +2 -1
- package/dist/{chunk-VEPAJXBW.js → chunk-APNPXLB2.js} +4 -4
- package/dist/{chunk-ZOAWBDWU.js → chunk-CJDVBBPB.js} +5 -1
- package/dist/{chunk-FTMXDOR6.js → chunk-CZZXE6BL.js} +1 -1
- package/dist/{chunk-N25INEIX.js → chunk-GWXP3JVA.js} +3 -3
- package/dist/{chunk-XYLGHKG6.js → chunk-HKUX2X7O.js} +11 -2
- package/dist/{chunk-YBJ262QL.js → chunk-LRG3B43J.js} +1 -1
- package/dist/{chunk-AOZRDOIP.js → chunk-M6TIO6NF.js} +1 -1
- package/dist/{chunk-J4RAX7YB.js → chunk-OA3MOZGG.js} +1683 -507
- package/dist/{chunk-YLXFKVJE.js → chunk-OHZVGIPE.js} +9 -9
- package/dist/{chunk-2BKLWLY6.js → chunk-QSRRBNLY.js} +8 -8
- package/dist/{chunk-3ZZKVN62.js → chunk-TG7IUJ3J.js} +1 -1
- package/dist/{chunk-EDXIVMAP.js → chunk-TZIHFNEG.js} +20 -6
- package/dist/{chunk-ND2ENWDM.js → chunk-UX3JHYEA.js} +1 -1
- package/dist/{chunk-Z2OOPXJO.js → chunk-VF23UTNB.js} +1771 -164
- package/dist/{chunk-7MJAPE3Z.js → chunk-YLN34N65.js} +1 -0
- package/dist/{chunk-B2HKP423.js → chunk-ZA2I7S3E.js} +28 -1
- package/dist/{ci-workflow-765LSHRD.js → ci-workflow-FJZMNZPT.js} +1 -1
- package/dist/{create-skill-XSWHMSM5.js → create-skill-NDXQSTIK.js} +2 -2
- package/dist/{dist-ALQDD67R.js → dist-MF5BK5AD.js} +77 -1
- package/dist/{dist-B26DFXMP.js → dist-U7EAO6T2.js} +110 -60
- package/dist/{docs-NRMQCOJ6.js → docs-WZHW4N4P.js} +3 -3
- package/dist/{engine-3RB7MXPP.js → engine-VS6ZJ2VZ.js} +2 -2
- package/dist/{entropy-6AGX2ZUN.js → entropy-FCIGJIIT.js} +2 -2
- package/dist/{feedback-MY4QZIFD.js → feedback-O3FYTZIE.js} +1 -1
- package/dist/{generate-agent-definitions-ZAE726AU.js → generate-agent-definitions-EYG263XD.js} +3 -3
- package/dist/{graph-loader-2M2HXDQI.js → graph-loader-KMHDQYDT.js} +1 -1
- package/dist/index.d.ts +95 -15
- package/dist/index.js +20 -20
- package/dist/{loader-UUTVMQCC.js → loader-B4XWX4K6.js} +1 -1
- package/dist/{mcp-VU5FMO52.js → mcp-DVVUODN7.js} +14 -14
- package/dist/{performance-2D7G6NMJ.js → performance-NMJDV6HF.js} +4 -2
- package/dist/{review-pipeline-RAQ55ISU.js → review-pipeline-MSEJWTKM.js} +1 -1
- package/dist/{runtime-BCK5RRZQ.js → runtime-YHVLJNPG.js} +1 -1
- package/dist/{security-2RPQEN62.js → security-HTDKKGMX.js} +1 -1
- package/dist/{skill-executor-XZLYZYAK.js → skill-executor-XEVDGXUM.js} +2 -2
- package/dist/{validate-KBYQAEWE.js → validate-SPSTH2YW.js} +2 -2
- package/dist/{validate-cross-check-OABMREW4.js → validate-cross-check-YTDWIMFI.js} +1 -1
- package/package.json +20 -20
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
detectEntropyDefinition,
|
|
3
3
|
handleDetectEntropy
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-APNPXLB2.js";
|
|
5
5
|
import {
|
|
6
6
|
checkPerformanceDefinition,
|
|
7
7
|
getCriticalPathsDefinition,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
handleGetPerfBaselines,
|
|
12
12
|
handleUpdatePerfBaselines,
|
|
13
13
|
updatePerfBaselinesDefinition
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-TZIHFNEG.js";
|
|
15
15
|
import {
|
|
16
16
|
analyzeDiffDefinition,
|
|
17
17
|
createSelfReviewDefinition,
|
|
@@ -19,43 +19,46 @@ import {
|
|
|
19
19
|
handleCreateSelfReview,
|
|
20
20
|
handleRequestPeerReview,
|
|
21
21
|
requestPeerReviewDefinition
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-OHZVGIPE.js";
|
|
23
23
|
import {
|
|
24
24
|
handleRunSecurityScan,
|
|
25
25
|
runSecurityScanDefinition
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-TG7IUJ3J.js";
|
|
27
27
|
import {
|
|
28
28
|
handleRunCodeReview,
|
|
29
29
|
runCodeReviewDefinition
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-UX3JHYEA.js";
|
|
31
31
|
import {
|
|
32
32
|
GENERATED_HEADER_CLAUDE,
|
|
33
|
+
GENERATED_HEADER_CODEX,
|
|
34
|
+
GENERATED_HEADER_CURSOR,
|
|
33
35
|
GENERATED_HEADER_GEMINI,
|
|
34
36
|
VALID_PLATFORMS,
|
|
35
37
|
applySyncPlan,
|
|
36
38
|
computeSyncPlan
|
|
37
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-CJDVBBPB.js";
|
|
38
40
|
import {
|
|
39
41
|
handleValidateProject,
|
|
40
42
|
validateToolDefinition
|
|
41
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-5FM64G6D.js";
|
|
42
44
|
import {
|
|
43
45
|
loadGraphStore
|
|
44
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-CZZXE6BL.js";
|
|
45
47
|
import {
|
|
46
48
|
checkDependenciesDefinition,
|
|
47
49
|
handleCheckDependencies
|
|
48
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-GWXP3JVA.js";
|
|
49
51
|
import {
|
|
50
52
|
resolveProjectConfig
|
|
51
53
|
} from "./chunk-H7Y5CKTM.js";
|
|
52
54
|
import {
|
|
53
55
|
checkDocsDefinition,
|
|
54
56
|
handleCheckDocs
|
|
55
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-QSRRBNLY.js";
|
|
56
58
|
import {
|
|
59
|
+
TrackerConfigSchema,
|
|
57
60
|
resolveConfig
|
|
58
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-ZA2I7S3E.js";
|
|
59
62
|
import {
|
|
60
63
|
resultToMcpResponse
|
|
61
64
|
} from "./chunk-IDZNPTYD.js";
|
|
@@ -78,7 +81,13 @@ import {
|
|
|
78
81
|
} from "./chunk-3WGJMBKH.js";
|
|
79
82
|
import {
|
|
80
83
|
SkillMetadataSchema
|
|
81
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-HKUX2X7O.js";
|
|
85
|
+
import {
|
|
86
|
+
DESTRUCTIVE_BASH,
|
|
87
|
+
checkTaint,
|
|
88
|
+
scanForInjection,
|
|
89
|
+
writeTaint
|
|
90
|
+
} from "./chunk-VF23UTNB.js";
|
|
82
91
|
import {
|
|
83
92
|
Err,
|
|
84
93
|
Ok
|
|
@@ -94,6 +103,123 @@ import {
|
|
|
94
103
|
ReadResourceRequestSchema
|
|
95
104
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
96
105
|
|
|
106
|
+
// src/mcp/middleware/injection-guard.ts
|
|
107
|
+
import { realpathSync } from "fs";
|
|
108
|
+
import { resolve } from "path";
|
|
109
|
+
function isDestructiveBash(command) {
|
|
110
|
+
return DESTRUCTIVE_BASH.some((p) => p.test(command));
|
|
111
|
+
}
|
|
112
|
+
function isOutsideWorkspace(filePath, workspaceRoot) {
|
|
113
|
+
if (!filePath || !workspaceRoot) return false;
|
|
114
|
+
const resolved = resolve(workspaceRoot, filePath);
|
|
115
|
+
let realResolved = resolved;
|
|
116
|
+
try {
|
|
117
|
+
realResolved = realpathSync(resolved);
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
120
|
+
return !realResolved.startsWith(workspaceRoot);
|
|
121
|
+
}
|
|
122
|
+
var INPUT_EXTRACTORS = {
|
|
123
|
+
Bash: (input) => input?.command ?? "",
|
|
124
|
+
Write: (input) => input?.content ?? "",
|
|
125
|
+
Edit: (input) => `${input?.old_string ?? ""}
|
|
126
|
+
${input?.new_string ?? ""}`,
|
|
127
|
+
Read: (input) => input?.file_path ?? ""
|
|
128
|
+
};
|
|
129
|
+
function extractInputText(toolName, toolInput) {
|
|
130
|
+
const extractor = INPUT_EXTRACTORS[toolName];
|
|
131
|
+
if (extractor) return extractor(toolInput);
|
|
132
|
+
const parts = Object.values(toolInput || {}).filter((v) => typeof v === "string");
|
|
133
|
+
return parts.length > 0 ? parts.join("\n") : null;
|
|
134
|
+
}
|
|
135
|
+
function extractResultText(result) {
|
|
136
|
+
return result.content.filter((c) => c.type === "text").map((c) => c.text).join("\n");
|
|
137
|
+
}
|
|
138
|
+
function isDestructiveOperation(toolName, toolInput, workspaceRoot) {
|
|
139
|
+
const normalized = toolName.toLowerCase().replace(/_/g, "");
|
|
140
|
+
if (normalized === "bash") {
|
|
141
|
+
const command = toolInput?.command ?? "";
|
|
142
|
+
return isDestructiveBash(command);
|
|
143
|
+
}
|
|
144
|
+
if (normalized === "write" || normalized === "edit") {
|
|
145
|
+
const filePath = toolInput?.file_path ?? "";
|
|
146
|
+
return isOutsideWorkspace(filePath, workspaceRoot);
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function wrapWithInjectionGuard(toolName, handler, options = {}) {
|
|
151
|
+
const projectRoot = options.projectRoot ?? process.cwd();
|
|
152
|
+
const sessionId = options.sessionId ?? "default";
|
|
153
|
+
return async (input) => {
|
|
154
|
+
try {
|
|
155
|
+
const taintCheck = checkTaint(projectRoot, sessionId);
|
|
156
|
+
if (taintCheck.tainted && isDestructiveOperation(toolName, input, projectRoot)) {
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: `BLOCKED by Sentinel: "${toolName}" blocked during tainted session. Destructive operations are restricted. Run "harness taint clear" to lift.`
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
isError: true
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const textToScan = extractInputText(toolName, input);
|
|
168
|
+
if (textToScan) {
|
|
169
|
+
const findings = scanForInjection(textToScan);
|
|
170
|
+
const actionable = findings.filter(
|
|
171
|
+
(f) => f.severity === "high" || f.severity === "medium"
|
|
172
|
+
);
|
|
173
|
+
if (actionable.length > 0) {
|
|
174
|
+
writeTaint(
|
|
175
|
+
projectRoot,
|
|
176
|
+
sessionId,
|
|
177
|
+
`Injection pattern detected in MCP:${toolName} input`,
|
|
178
|
+
actionable,
|
|
179
|
+
`MCP:${toolName}`
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const result = await handler(input);
|
|
184
|
+
const outputText = extractResultText(result);
|
|
185
|
+
if (outputText) {
|
|
186
|
+
const outputFindings = scanForInjection(outputText);
|
|
187
|
+
const actionableOutput = outputFindings.filter(
|
|
188
|
+
(f) => f.severity === "high" || f.severity === "medium"
|
|
189
|
+
);
|
|
190
|
+
if (actionableOutput.length > 0) {
|
|
191
|
+
writeTaint(
|
|
192
|
+
projectRoot,
|
|
193
|
+
sessionId,
|
|
194
|
+
`Injection pattern detected in MCP:${toolName} result`,
|
|
195
|
+
actionableOutput,
|
|
196
|
+
`MCP:${toolName}:output`
|
|
197
|
+
);
|
|
198
|
+
const warningLines = actionableOutput.map(
|
|
199
|
+
(f) => `Sentinel [${f.severity}] ${f.ruleId}: detected in ${toolName} output`
|
|
200
|
+
);
|
|
201
|
+
result.content.push({
|
|
202
|
+
type: "text",
|
|
203
|
+
text: `
|
|
204
|
+
---
|
|
205
|
+
Sentinel Warning: ${warningLines.join("; ")}`
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return result;
|
|
210
|
+
} catch {
|
|
211
|
+
return handler(input);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function applyInjectionGuard(handlers, options = {}) {
|
|
216
|
+
const wrapped = {};
|
|
217
|
+
for (const [name, handler] of Object.entries(handlers)) {
|
|
218
|
+
wrapped[name] = wrapWithInjectionGuard(name, handler, options);
|
|
219
|
+
}
|
|
220
|
+
return wrapped;
|
|
221
|
+
}
|
|
222
|
+
|
|
97
223
|
// src/mcp/tools/linter.ts
|
|
98
224
|
var generateLinterDefinition = {
|
|
99
225
|
name: "generate_linter",
|
|
@@ -428,7 +554,7 @@ ${skippedMsg}`
|
|
|
428
554
|
async function handleInitProject(input) {
|
|
429
555
|
const i = input;
|
|
430
556
|
try {
|
|
431
|
-
const { TemplateEngine } = await import("./engine-
|
|
557
|
+
const { TemplateEngine } = await import("./engine-VS6ZJ2VZ.js");
|
|
432
558
|
const engine = new TemplateEngine(resolveTemplatesDir());
|
|
433
559
|
const safePath = sanitizePath(i.path);
|
|
434
560
|
const detected = tryDetectFramework(engine, safePath, i);
|
|
@@ -449,7 +575,7 @@ var listPersonasDefinition = {
|
|
|
449
575
|
inputSchema: { type: "object", properties: {} }
|
|
450
576
|
};
|
|
451
577
|
async function handleListPersonas() {
|
|
452
|
-
const { listPersonas } = await import("./loader-
|
|
578
|
+
const { listPersonas } = await import("./loader-B4XWX4K6.js");
|
|
453
579
|
const result = listPersonas(resolvePersonasDir());
|
|
454
580
|
return resultToMcpResponse(result);
|
|
455
581
|
}
|
|
@@ -473,10 +599,10 @@ async function handleGeneratePersonaArtifacts(input) {
|
|
|
473
599
|
if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.name)) {
|
|
474
600
|
return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.name}`)));
|
|
475
601
|
}
|
|
476
|
-
const { loadPersona } = await import("./loader-
|
|
477
|
-
const { generateRuntime } = await import("./runtime-
|
|
478
|
-
const { generateAgentsMd } = await import("./agents-md-
|
|
479
|
-
const { generateCIWorkflow } = await import("./ci-workflow-
|
|
602
|
+
const { loadPersona } = await import("./loader-B4XWX4K6.js");
|
|
603
|
+
const { generateRuntime } = await import("./runtime-YHVLJNPG.js");
|
|
604
|
+
const { generateAgentsMd } = await import("./agents-md-DUYNKHJZ.js");
|
|
605
|
+
const { generateCIWorkflow } = await import("./ci-workflow-FJZMNZPT.js");
|
|
480
606
|
const personasDir = resolvePersonasDir();
|
|
481
607
|
const filePath = path3.join(personasDir, `${input.name}.yaml`);
|
|
482
608
|
if (!filePath.startsWith(personasDir)) {
|
|
@@ -531,9 +657,9 @@ async function handleRunPersona(input) {
|
|
|
531
657
|
if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.persona)) {
|
|
532
658
|
return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.persona}`)));
|
|
533
659
|
}
|
|
534
|
-
const { loadPersona } = await import("./loader-
|
|
660
|
+
const { loadPersona } = await import("./loader-B4XWX4K6.js");
|
|
535
661
|
const { runPersona } = await import("./runner-VMYLHWOC.js");
|
|
536
|
-
const { executeSkill } = await import("./skill-executor-
|
|
662
|
+
const { executeSkill } = await import("./skill-executor-XEVDGXUM.js");
|
|
537
663
|
const personasDir = resolvePersonasDir();
|
|
538
664
|
const filePath = path3.join(personasDir, `${input.persona}.yaml`);
|
|
539
665
|
if (!filePath.startsWith(personasDir)) {
|
|
@@ -944,8 +1070,8 @@ var runSkillDefinition = {
|
|
|
944
1070
|
path: { type: "string", description: "Path to project root for state context injection" },
|
|
945
1071
|
complexity: {
|
|
946
1072
|
type: "string",
|
|
947
|
-
enum: ["
|
|
948
|
-
description: "
|
|
1073
|
+
enum: ["fast", "standard", "thorough"],
|
|
1074
|
+
description: "Rigor level: fast (minimal), standard (default), thorough (full)"
|
|
949
1075
|
},
|
|
950
1076
|
phase: { type: "string", description: "Start at a specific phase (re-entry)" },
|
|
951
1077
|
party: { type: "boolean", description: "Enable multi-perspective evaluation" }
|
|
@@ -1031,7 +1157,7 @@ var createSkillDefinition = {
|
|
|
1031
1157
|
};
|
|
1032
1158
|
async function handleCreateSkill(input) {
|
|
1033
1159
|
try {
|
|
1034
|
-
const { generateSkillFiles } = await import("./create-skill-
|
|
1160
|
+
const { generateSkillFiles } = await import("./create-skill-NDXQSTIK.js");
|
|
1035
1161
|
const result = generateSkillFiles({
|
|
1036
1162
|
name: input.name,
|
|
1037
1163
|
description: input.description,
|
|
@@ -1149,18 +1275,62 @@ async function autoSyncRoadmap(projectPath) {
|
|
|
1149
1275
|
try {
|
|
1150
1276
|
const roadmapFile = path11.join(projectPath, "docs", "roadmap.md");
|
|
1151
1277
|
if (!fs10.existsSync(roadmapFile)) return;
|
|
1152
|
-
const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-
|
|
1278
|
+
const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
|
|
1153
1279
|
const raw = fs10.readFileSync(roadmapFile, "utf-8");
|
|
1154
1280
|
const parseResult = parseRoadmap(raw);
|
|
1155
1281
|
if (!parseResult.ok) return;
|
|
1156
1282
|
const roadmap = parseResult.value;
|
|
1157
1283
|
const syncResult = syncRoadmap({ projectPath, roadmap });
|
|
1158
|
-
if (!syncResult.ok || syncResult.value.length === 0)
|
|
1284
|
+
if (!syncResult.ok || syncResult.value.length === 0) {
|
|
1285
|
+
await triggerExternalSync(projectPath, roadmapFile);
|
|
1286
|
+
return;
|
|
1287
|
+
}
|
|
1159
1288
|
applySyncChanges(roadmap, syncResult.value);
|
|
1160
1289
|
fs10.writeFileSync(roadmapFile, serializeRoadmap(roadmap), "utf-8");
|
|
1290
|
+
await triggerExternalSync(projectPath, roadmapFile);
|
|
1161
1291
|
} catch {
|
|
1162
1292
|
}
|
|
1163
1293
|
}
|
|
1294
|
+
async function triggerExternalSync(projectPath, roadmapFile) {
|
|
1295
|
+
try {
|
|
1296
|
+
const trackerConfig = loadTrackerConfig(projectPath);
|
|
1297
|
+
if (!trackerConfig) return;
|
|
1298
|
+
const token = process.env.GITHUB_TOKEN;
|
|
1299
|
+
if (!token) return;
|
|
1300
|
+
const { fullSync, GitHubIssuesSyncAdapter } = await import("./dist-MF5BK5AD.js");
|
|
1301
|
+
const adapter = new GitHubIssuesSyncAdapter({
|
|
1302
|
+
token,
|
|
1303
|
+
config: trackerConfig
|
|
1304
|
+
});
|
|
1305
|
+
const result = await fullSync(roadmapFile, adapter, trackerConfig);
|
|
1306
|
+
if (result.errors.length > 0) {
|
|
1307
|
+
for (const err of result.errors) {
|
|
1308
|
+
console.error(
|
|
1309
|
+
`[roadmap-sync] External sync error for ${err.featureOrId}: ${err.error.message}`
|
|
1310
|
+
);
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
} catch (error) {
|
|
1314
|
+
console.error(
|
|
1315
|
+
`[roadmap-sync] External sync failed: ${error instanceof Error ? error.message : String(error)}`
|
|
1316
|
+
);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
function loadTrackerConfig(projectPath) {
|
|
1320
|
+
try {
|
|
1321
|
+
const configPath = path11.join(projectPath, "harness.config.json");
|
|
1322
|
+
if (!fs10.existsSync(configPath)) return null;
|
|
1323
|
+
const raw = fs10.readFileSync(configPath, "utf-8");
|
|
1324
|
+
const config = JSON.parse(raw);
|
|
1325
|
+
const trackerRaw = config.roadmap?.tracker;
|
|
1326
|
+
if (!trackerRaw) return null;
|
|
1327
|
+
const parsed = TrackerConfigSchema.safeParse(trackerRaw);
|
|
1328
|
+
if (!parsed.success) return null;
|
|
1329
|
+
return parsed.data;
|
|
1330
|
+
} catch {
|
|
1331
|
+
return null;
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1164
1334
|
|
|
1165
1335
|
// src/mcp/utils.ts
|
|
1166
1336
|
function mcpError(text) {
|
|
@@ -1190,7 +1360,11 @@ var manageStateDefinition = {
|
|
|
1190
1360
|
"update_entry_status",
|
|
1191
1361
|
"read_section",
|
|
1192
1362
|
"read_sections",
|
|
1193
|
-
"archive_session"
|
|
1363
|
+
"archive_session",
|
|
1364
|
+
"task-start",
|
|
1365
|
+
"task-complete",
|
|
1366
|
+
"phase-start",
|
|
1367
|
+
"phase-complete"
|
|
1194
1368
|
],
|
|
1195
1369
|
description: "Action to perform"
|
|
1196
1370
|
},
|
|
@@ -1235,12 +1409,12 @@ var manageStateDefinition = {
|
|
|
1235
1409
|
}
|
|
1236
1410
|
};
|
|
1237
1411
|
async function handleShow(projectPath, input) {
|
|
1238
|
-
const { loadState } = await import("./dist-
|
|
1412
|
+
const { loadState } = await import("./dist-MF5BK5AD.js");
|
|
1239
1413
|
return resultToMcpResponse(await loadState(projectPath, input.stream, input.session));
|
|
1240
1414
|
}
|
|
1241
1415
|
async function handleLearn(projectPath, input) {
|
|
1242
1416
|
if (!input.learning) return mcpError("Error: learning is required for learn action");
|
|
1243
|
-
const { appendLearning } = await import("./dist-
|
|
1417
|
+
const { appendLearning } = await import("./dist-MF5BK5AD.js");
|
|
1244
1418
|
const result = await appendLearning(
|
|
1245
1419
|
projectPath,
|
|
1246
1420
|
input.learning,
|
|
@@ -1255,7 +1429,7 @@ async function handleLearn(projectPath, input) {
|
|
|
1255
1429
|
async function handleFailure(projectPath, input) {
|
|
1256
1430
|
if (!input.description) return mcpError("Error: description is required for failure action");
|
|
1257
1431
|
if (!input.failureType) return mcpError("Error: failureType is required for failure action");
|
|
1258
|
-
const { appendFailure } = await import("./dist-
|
|
1432
|
+
const { appendFailure } = await import("./dist-MF5BK5AD.js");
|
|
1259
1433
|
const result = await appendFailure(
|
|
1260
1434
|
projectPath,
|
|
1261
1435
|
input.description,
|
|
@@ -1268,24 +1442,24 @@ async function handleFailure(projectPath, input) {
|
|
|
1268
1442
|
return resultToMcpResponse(Ok({ recorded: true }));
|
|
1269
1443
|
}
|
|
1270
1444
|
async function handleArchive(projectPath, input) {
|
|
1271
|
-
const { archiveFailures } = await import("./dist-
|
|
1445
|
+
const { archiveFailures } = await import("./dist-MF5BK5AD.js");
|
|
1272
1446
|
const result = await archiveFailures(projectPath, input.stream, input.session);
|
|
1273
1447
|
if (!result.ok) return resultToMcpResponse(result);
|
|
1274
1448
|
return resultToMcpResponse(Ok({ archived: true }));
|
|
1275
1449
|
}
|
|
1276
1450
|
async function handleReset(projectPath, input) {
|
|
1277
|
-
const { saveState, DEFAULT_STATE } = await import("./dist-
|
|
1451
|
+
const { saveState, DEFAULT_STATE } = await import("./dist-MF5BK5AD.js");
|
|
1278
1452
|
const result = await saveState(projectPath, { ...DEFAULT_STATE }, input.stream, input.session);
|
|
1279
1453
|
if (!result.ok) return resultToMcpResponse(result);
|
|
1280
1454
|
return resultToMcpResponse(Ok({ reset: true }));
|
|
1281
1455
|
}
|
|
1282
1456
|
async function handleGate(projectPath, _input) {
|
|
1283
|
-
const { runMechanicalGate } = await import("./dist-
|
|
1457
|
+
const { runMechanicalGate } = await import("./dist-MF5BK5AD.js");
|
|
1284
1458
|
return resultToMcpResponse(await runMechanicalGate(projectPath));
|
|
1285
1459
|
}
|
|
1286
1460
|
async function handleSaveHandoff(projectPath, input) {
|
|
1287
1461
|
if (!input.handoff) return mcpError("Error: handoff is required for save-handoff action");
|
|
1288
|
-
const { saveHandoff } = await import("./dist-
|
|
1462
|
+
const { saveHandoff } = await import("./dist-MF5BK5AD.js");
|
|
1289
1463
|
const result = await saveHandoff(
|
|
1290
1464
|
projectPath,
|
|
1291
1465
|
input.handoff,
|
|
@@ -1297,7 +1471,7 @@ async function handleSaveHandoff(projectPath, input) {
|
|
|
1297
1471
|
return resultToMcpResponse(Ok({ saved: true }));
|
|
1298
1472
|
}
|
|
1299
1473
|
async function handleLoadHandoff(projectPath, input) {
|
|
1300
|
-
const { loadHandoff } = await import("./dist-
|
|
1474
|
+
const { loadHandoff } = await import("./dist-MF5BK5AD.js");
|
|
1301
1475
|
return resultToMcpResponse(await loadHandoff(projectPath, input.stream, input.session));
|
|
1302
1476
|
}
|
|
1303
1477
|
async function handleAppendEntry(projectPath, input) {
|
|
@@ -1305,7 +1479,7 @@ async function handleAppendEntry(projectPath, input) {
|
|
|
1305
1479
|
if (!input.section) return mcpError("Error: section is required for append_entry action");
|
|
1306
1480
|
if (!input.authorSkill) return mcpError("Error: authorSkill is required for append_entry action");
|
|
1307
1481
|
if (!input.content) return mcpError("Error: content is required for append_entry action");
|
|
1308
|
-
const { appendSessionEntry } = await import("./dist-
|
|
1482
|
+
const { appendSessionEntry } = await import("./dist-MF5BK5AD.js");
|
|
1309
1483
|
const result = await appendSessionEntry(
|
|
1310
1484
|
projectPath,
|
|
1311
1485
|
input.session,
|
|
@@ -1321,7 +1495,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
|
|
|
1321
1495
|
if (!input.entryId) return mcpError("Error: entryId is required for update_entry_status action");
|
|
1322
1496
|
if (!input.newStatus)
|
|
1323
1497
|
return mcpError("Error: newStatus is required for update_entry_status action");
|
|
1324
|
-
const { updateSessionEntryStatus } = await import("./dist-
|
|
1498
|
+
const { updateSessionEntryStatus } = await import("./dist-MF5BK5AD.js");
|
|
1325
1499
|
const result = await updateSessionEntryStatus(
|
|
1326
1500
|
projectPath,
|
|
1327
1501
|
input.session,
|
|
@@ -1334,7 +1508,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
|
|
|
1334
1508
|
async function handleReadSection(projectPath, input) {
|
|
1335
1509
|
if (!input.session) return mcpError("Error: session is required for read_section action");
|
|
1336
1510
|
if (!input.section) return mcpError("Error: section is required for read_section action");
|
|
1337
|
-
const { readSessionSection } = await import("./dist-
|
|
1511
|
+
const { readSessionSection } = await import("./dist-MF5BK5AD.js");
|
|
1338
1512
|
const result = await readSessionSection(
|
|
1339
1513
|
projectPath,
|
|
1340
1514
|
input.session,
|
|
@@ -1344,18 +1518,34 @@ async function handleReadSection(projectPath, input) {
|
|
|
1344
1518
|
}
|
|
1345
1519
|
async function handleReadSections(projectPath, input) {
|
|
1346
1520
|
if (!input.session) return mcpError("Error: session is required for read_sections action");
|
|
1347
|
-
const { readSessionSections } = await import("./dist-
|
|
1521
|
+
const { readSessionSections } = await import("./dist-MF5BK5AD.js");
|
|
1348
1522
|
const result = await readSessionSections(projectPath, input.session);
|
|
1349
1523
|
return resultToMcpResponse(result);
|
|
1350
1524
|
}
|
|
1351
1525
|
async function handleArchiveSession(projectPath, input) {
|
|
1352
1526
|
if (!input.session) return mcpError("Error: session is required for archive_session action");
|
|
1353
|
-
const { archiveSession } = await import("./dist-
|
|
1527
|
+
const { archiveSession } = await import("./dist-MF5BK5AD.js");
|
|
1354
1528
|
const result = await archiveSession(projectPath, input.session);
|
|
1355
1529
|
if (!result.ok) return resultToMcpResponse(result);
|
|
1356
1530
|
await autoSyncRoadmap(projectPath);
|
|
1357
1531
|
return resultToMcpResponse(Ok({ archived: true }));
|
|
1358
1532
|
}
|
|
1533
|
+
async function handleTaskStart(projectPath, _input) {
|
|
1534
|
+
await autoSyncRoadmap(projectPath);
|
|
1535
|
+
return resultToMcpResponse(Ok({ synced: true, trigger: "task-start" }));
|
|
1536
|
+
}
|
|
1537
|
+
async function handleTaskComplete(projectPath, _input) {
|
|
1538
|
+
await autoSyncRoadmap(projectPath);
|
|
1539
|
+
return resultToMcpResponse(Ok({ synced: true, trigger: "task-complete" }));
|
|
1540
|
+
}
|
|
1541
|
+
async function handlePhaseStart(projectPath, _input) {
|
|
1542
|
+
await autoSyncRoadmap(projectPath);
|
|
1543
|
+
return resultToMcpResponse(Ok({ synced: true, trigger: "phase-start" }));
|
|
1544
|
+
}
|
|
1545
|
+
async function handlePhaseComplete(projectPath, _input) {
|
|
1546
|
+
await autoSyncRoadmap(projectPath);
|
|
1547
|
+
return resultToMcpResponse(Ok({ synced: true, trigger: "phase-complete" }));
|
|
1548
|
+
}
|
|
1359
1549
|
var ACTION_HANDLERS = {
|
|
1360
1550
|
show: handleShow,
|
|
1361
1551
|
learn: handleLearn,
|
|
@@ -1369,7 +1559,11 @@ var ACTION_HANDLERS = {
|
|
|
1369
1559
|
update_entry_status: handleUpdateEntryStatus,
|
|
1370
1560
|
read_section: handleReadSection,
|
|
1371
1561
|
read_sections: handleReadSections,
|
|
1372
|
-
archive_session: handleArchiveSession
|
|
1562
|
+
archive_session: handleArchiveSession,
|
|
1563
|
+
"task-start": handleTaskStart,
|
|
1564
|
+
"task-complete": handleTaskComplete,
|
|
1565
|
+
"phase-start": handlePhaseStart,
|
|
1566
|
+
"phase-complete": handlePhaseComplete
|
|
1373
1567
|
};
|
|
1374
1568
|
async function handleManageState(input) {
|
|
1375
1569
|
try {
|
|
@@ -1394,7 +1588,7 @@ var listStreamsDefinition = {
|
|
|
1394
1588
|
};
|
|
1395
1589
|
async function handleListStreams(input) {
|
|
1396
1590
|
try {
|
|
1397
|
-
const { listStreams, loadStreamIndex } = await import("./dist-
|
|
1591
|
+
const { listStreams, loadStreamIndex } = await import("./dist-MF5BK5AD.js");
|
|
1398
1592
|
const projectPath = sanitizePath(input.path);
|
|
1399
1593
|
const indexResult = await loadStreamIndex(projectPath);
|
|
1400
1594
|
const streamsResult = await listStreams(projectPath);
|
|
@@ -1432,7 +1626,7 @@ var checkPhaseGateDefinition = {
|
|
|
1432
1626
|
};
|
|
1433
1627
|
async function handleCheckPhaseGate(input) {
|
|
1434
1628
|
try {
|
|
1435
|
-
const { runCheckPhaseGate } = await import("./check-phase-gate-
|
|
1629
|
+
const { runCheckPhaseGate } = await import("./check-phase-gate-OSHN2AEL.js");
|
|
1436
1630
|
const result = await runCheckPhaseGate({ cwd: sanitizePath(input.path) });
|
|
1437
1631
|
if (result.ok) {
|
|
1438
1632
|
return { content: [{ type: "text", text: JSON.stringify(result.value) }] };
|
|
@@ -1488,7 +1682,7 @@ async function handleValidateCrossCheck(input) {
|
|
|
1488
1682
|
};
|
|
1489
1683
|
}
|
|
1490
1684
|
try {
|
|
1491
|
-
const { runCrossCheck } = await import("./validate-cross-check-
|
|
1685
|
+
const { runCrossCheck } = await import("./validate-cross-check-YTDWIMFI.js");
|
|
1492
1686
|
const specsDir = path12.resolve(projectPath, input.specsDir ?? "docs/specs");
|
|
1493
1687
|
if (!specsDir.startsWith(projectPath)) {
|
|
1494
1688
|
return {
|
|
@@ -1527,8 +1721,8 @@ async function handleValidateCrossCheck(input) {
|
|
|
1527
1721
|
|
|
1528
1722
|
// src/commands/generate-slash-commands.ts
|
|
1529
1723
|
import { Command } from "commander";
|
|
1530
|
-
import
|
|
1531
|
-
import
|
|
1724
|
+
import fs13 from "fs";
|
|
1725
|
+
import path15 from "path";
|
|
1532
1726
|
import os from "os";
|
|
1533
1727
|
import readline from "readline";
|
|
1534
1728
|
|
|
@@ -1560,8 +1754,12 @@ function readSkillYaml(yamlPath) {
|
|
|
1560
1754
|
}
|
|
1561
1755
|
return SkillMetadataSchema.safeParse(parse3(raw));
|
|
1562
1756
|
}
|
|
1757
|
+
var DERIVED_FROM_CLAUDE_CODE = ["cursor", "codex"];
|
|
1563
1758
|
function shouldSkipSkill(meta, platforms) {
|
|
1564
|
-
const
|
|
1759
|
+
const effectivePlatforms = platforms.map(
|
|
1760
|
+
(p) => DERIVED_FROM_CLAUDE_CODE.includes(p) ? "claude-code" : p
|
|
1761
|
+
);
|
|
1762
|
+
const matchesPlatform = effectivePlatforms.some((p) => meta.platforms.includes(p));
|
|
1565
1763
|
if (!matchesPlatform) return true;
|
|
1566
1764
|
if (meta.tier === 3 || meta.internal) return true;
|
|
1567
1765
|
return false;
|
|
@@ -1642,6 +1840,7 @@ function buildSpec(meta, normalized, entry, skillsDir, source) {
|
|
|
1642
1840
|
sourceDir: entry.name,
|
|
1643
1841
|
skillsBaseDir: skillsDir,
|
|
1644
1842
|
source,
|
|
1843
|
+
...meta.cursor ? { cursor: meta.cursor } : {},
|
|
1645
1844
|
prompt: {
|
|
1646
1845
|
context: buildContextLines(meta).join("\n"),
|
|
1647
1846
|
objective: buildObjectiveLines(meta).join("\n"),
|
|
@@ -1766,27 +1965,140 @@ function renderGemini(spec, skillMdContent, skillYamlContent) {
|
|
|
1766
1965
|
return lines.join("\n");
|
|
1767
1966
|
}
|
|
1768
1967
|
|
|
1968
|
+
// src/slash-commands/render-cursor.ts
|
|
1969
|
+
function renderCursor(spec, skillMdContent, cursorConfig) {
|
|
1970
|
+
const lines = ["---"];
|
|
1971
|
+
lines.push(`description: ${spec.description}`);
|
|
1972
|
+
if (cursorConfig?.globs && cursorConfig.globs.length > 0) {
|
|
1973
|
+
lines.push("globs:");
|
|
1974
|
+
for (const glob of cursorConfig.globs) {
|
|
1975
|
+
lines.push(` - ${glob}`);
|
|
1976
|
+
}
|
|
1977
|
+
}
|
|
1978
|
+
const alwaysApply = cursorConfig?.alwaysApply ?? false;
|
|
1979
|
+
lines.push(`alwaysApply: ${alwaysApply}`);
|
|
1980
|
+
lines.push("---");
|
|
1981
|
+
lines.push("");
|
|
1982
|
+
lines.push(GENERATED_HEADER_CURSOR);
|
|
1983
|
+
lines.push("");
|
|
1984
|
+
lines.push(skillMdContent);
|
|
1985
|
+
lines.push("");
|
|
1986
|
+
return lines.join("\n");
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1989
|
+
// src/slash-commands/render-codex.ts
|
|
1990
|
+
function renderCodexSkill(skillMdContent) {
|
|
1991
|
+
return `<!-- ${GENERATED_HEADER_CODEX.replace(/<!--\s*|\s*-->/g, "").trim()} -->
|
|
1992
|
+
|
|
1993
|
+
${skillMdContent}
|
|
1994
|
+
`;
|
|
1995
|
+
}
|
|
1996
|
+
function renderCodexOpenaiYaml(spec) {
|
|
1997
|
+
return [
|
|
1998
|
+
"# Reserved for Phase B native integration",
|
|
1999
|
+
`name: ${spec.skillYamlName}`,
|
|
2000
|
+
`version: "1.0.0"`,
|
|
2001
|
+
""
|
|
2002
|
+
].join("\n");
|
|
2003
|
+
}
|
|
2004
|
+
function renderCodexAgentsMd(specs) {
|
|
2005
|
+
const lines = [];
|
|
2006
|
+
lines.push(`<!-- ${GENERATED_HEADER_CODEX.replace(/<!--\s*|\s*-->/g, "").trim()} -->`);
|
|
2007
|
+
lines.push("");
|
|
2008
|
+
lines.push("# Harness Skills");
|
|
2009
|
+
lines.push("");
|
|
2010
|
+
lines.push(
|
|
2011
|
+
"This file bootstraps harness context for Codex CLI. Each skill is available as a structured workflow in the `harness/` directory."
|
|
2012
|
+
);
|
|
2013
|
+
lines.push("");
|
|
2014
|
+
lines.push("## Available Skills");
|
|
2015
|
+
lines.push("");
|
|
2016
|
+
for (const spec of specs) {
|
|
2017
|
+
lines.push(`- **${spec.skillYamlName}** \u2014 ${spec.description}`);
|
|
2018
|
+
}
|
|
2019
|
+
lines.push("");
|
|
2020
|
+
return lines.join("\n");
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2023
|
+
// src/slash-commands/sync-codex.ts
|
|
2024
|
+
import fs12 from "fs";
|
|
2025
|
+
import path14 from "path";
|
|
2026
|
+
function computeCodexSync(outputDir, specs, dryRun) {
|
|
2027
|
+
const added = [];
|
|
2028
|
+
const updated = [];
|
|
2029
|
+
const unchanged = [];
|
|
2030
|
+
const specSkillNames = /* @__PURE__ */ new Set();
|
|
2031
|
+
for (const spec of specs) {
|
|
2032
|
+
const mdPath = path14.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
|
|
2033
|
+
const skillMd = fs12.existsSync(mdPath) ? fs12.readFileSync(mdPath, "utf-8") : "";
|
|
2034
|
+
const skillDir = path14.join(outputDir, spec.skillYamlName);
|
|
2035
|
+
specSkillNames.add(spec.skillYamlName);
|
|
2036
|
+
const renderedSkillMd = renderCodexSkill(skillMd);
|
|
2037
|
+
const renderedOpenaiYaml = renderCodexOpenaiYaml(spec);
|
|
2038
|
+
const existingSkillMdPath = path14.join(skillDir, "SKILL.md");
|
|
2039
|
+
const existingOpenaiYamlPath = path14.join(skillDir, "agents", "openai.yaml");
|
|
2040
|
+
if (!fs12.existsSync(skillDir)) {
|
|
2041
|
+
added.push(spec.skillYamlName);
|
|
2042
|
+
} else {
|
|
2043
|
+
const existingSkillMd = fs12.existsSync(existingSkillMdPath) ? fs12.readFileSync(existingSkillMdPath, "utf-8") : "";
|
|
2044
|
+
const existingOpenaiYaml = fs12.existsSync(existingOpenaiYamlPath) ? fs12.readFileSync(existingOpenaiYamlPath, "utf-8") : "";
|
|
2045
|
+
if (existingSkillMd === renderedSkillMd && existingOpenaiYaml === renderedOpenaiYaml) {
|
|
2046
|
+
unchanged.push(spec.skillYamlName);
|
|
2047
|
+
} else {
|
|
2048
|
+
updated.push(spec.skillYamlName);
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
if (!dryRun && !unchanged.includes(spec.skillYamlName)) {
|
|
2052
|
+
const agentsSubDir = path14.join(skillDir, "agents");
|
|
2053
|
+
fs12.mkdirSync(agentsSubDir, { recursive: true });
|
|
2054
|
+
fs12.writeFileSync(existingSkillMdPath, renderedSkillMd, "utf-8");
|
|
2055
|
+
fs12.writeFileSync(existingOpenaiYamlPath, renderedOpenaiYaml, "utf-8");
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
const removed = detectCodexOrphans(outputDir, specSkillNames);
|
|
2059
|
+
return { added, updated, removed, unchanged };
|
|
2060
|
+
}
|
|
2061
|
+
function detectCodexOrphans(outputDir, specSkillNames) {
|
|
2062
|
+
const removed = [];
|
|
2063
|
+
if (!fs12.existsSync(outputDir)) return removed;
|
|
2064
|
+
const existingDirs = fs12.readdirSync(outputDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
2065
|
+
for (const dirName of existingDirs) {
|
|
2066
|
+
if (specSkillNames.has(dirName)) continue;
|
|
2067
|
+
const skillMdPath = path14.join(outputDir, dirName, "SKILL.md");
|
|
2068
|
+
if (fs12.existsSync(skillMdPath)) {
|
|
2069
|
+
const content = fs12.readFileSync(skillMdPath, "utf-8");
|
|
2070
|
+
if (content.includes(GENERATED_HEADER_CODEX)) {
|
|
2071
|
+
removed.push(dirName);
|
|
2072
|
+
}
|
|
2073
|
+
}
|
|
2074
|
+
}
|
|
2075
|
+
return removed;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
1769
2078
|
// src/commands/generate-slash-commands.ts
|
|
1770
2079
|
function resolveOutputDir(platform, opts) {
|
|
1771
2080
|
if (opts.output) {
|
|
1772
|
-
return
|
|
2081
|
+
return path15.join(opts.output, "harness");
|
|
1773
2082
|
}
|
|
1774
2083
|
if (opts.global) {
|
|
1775
2084
|
const home = os.homedir();
|
|
1776
|
-
|
|
2085
|
+
if (platform === "claude-code") return path15.join(home, ".claude", "commands", "harness");
|
|
2086
|
+
if (platform === "gemini-cli") return path15.join(home, ".gemini", "commands", "harness");
|
|
2087
|
+
if (platform === "cursor") return path15.join(home, ".cursor", "rules", "harness");
|
|
2088
|
+
return path15.join(home, ".codex", "harness");
|
|
1777
2089
|
}
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
return
|
|
2090
|
+
if (platform === "claude-code") return path15.join("agents", "commands", "claude-code", "harness");
|
|
2091
|
+
if (platform === "gemini-cli") return path15.join("agents", "commands", "gemini-cli", "harness");
|
|
2092
|
+
if (platform === "cursor") return path15.join("agents", "commands", "cursor", "harness");
|
|
2093
|
+
return path15.join("agents", "commands", "codex", "harness");
|
|
1782
2094
|
}
|
|
1783
2095
|
async function confirmDeletion(files) {
|
|
1784
2096
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1785
|
-
return new Promise((
|
|
2097
|
+
return new Promise((resolve3) => {
|
|
1786
2098
|
rl.question(`
|
|
1787
2099
|
Remove ${files.length} orphaned command(s)? (y/N) `, (answer) => {
|
|
1788
2100
|
rl.close();
|
|
1789
|
-
|
|
2101
|
+
resolve3(answer.toLowerCase() === "y");
|
|
1790
2102
|
});
|
|
1791
2103
|
});
|
|
1792
2104
|
}
|
|
@@ -1800,12 +2112,12 @@ function resolveSkillSources(opts) {
|
|
|
1800
2112
|
sources.push({ dir: projectDir, source: "project" });
|
|
1801
2113
|
}
|
|
1802
2114
|
const communityDir = resolveCommunitySkillsDir();
|
|
1803
|
-
if (
|
|
2115
|
+
if (fs13.existsSync(communityDir)) {
|
|
1804
2116
|
sources.push({ dir: communityDir, source: "community" });
|
|
1805
2117
|
}
|
|
1806
2118
|
if (opts.includeGlobal || sources.length === 0) {
|
|
1807
2119
|
const globalDir = resolveGlobalSkillsDir();
|
|
1808
|
-
if (!projectDir ||
|
|
2120
|
+
if (!projectDir || path15.resolve(globalDir) !== path15.resolve(projectDir)) {
|
|
1809
2121
|
sources.push({ dir: globalDir, source: "global" });
|
|
1810
2122
|
}
|
|
1811
2123
|
}
|
|
@@ -1817,12 +2129,26 @@ function generateSlashCommands(opts) {
|
|
|
1817
2129
|
const results = [];
|
|
1818
2130
|
for (const platform of opts.platforms) {
|
|
1819
2131
|
const outputDir = resolveOutputDir(platform, opts);
|
|
1820
|
-
const ext = fileExtension(platform);
|
|
1821
2132
|
const useAbsolutePaths = opts.global;
|
|
1822
2133
|
const rendered = /* @__PURE__ */ new Map();
|
|
2134
|
+
if (platform === "codex") {
|
|
2135
|
+
const codexSync = computeCodexSync(outputDir, specs, opts.dryRun);
|
|
2136
|
+
const codexRoot = path15.dirname(outputDir);
|
|
2137
|
+
if (!opts.dryRun) {
|
|
2138
|
+
fs13.mkdirSync(codexRoot, { recursive: true });
|
|
2139
|
+
fs13.writeFileSync(path15.join(codexRoot, "AGENTS.md"), renderCodexAgentsMd(specs), "utf-8");
|
|
2140
|
+
}
|
|
2141
|
+
results.push({ platform, ...codexSync, outputDir });
|
|
2142
|
+
continue;
|
|
2143
|
+
}
|
|
1823
2144
|
for (const spec of specs) {
|
|
1824
|
-
|
|
1825
|
-
|
|
2145
|
+
if (platform === "cursor") {
|
|
2146
|
+
const filename = `${spec.skillYamlName}.mdc`;
|
|
2147
|
+
const mdPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
|
|
2148
|
+
const skillMd = fs13.existsSync(mdPath) ? fs13.readFileSync(mdPath, "utf-8") : "";
|
|
2149
|
+
rendered.set(filename, renderCursor(spec, skillMd, spec.cursor));
|
|
2150
|
+
} else if (platform === "claude-code") {
|
|
2151
|
+
const filename = `${spec.name}.md`;
|
|
1826
2152
|
const renderSpec = useAbsolutePaths ? {
|
|
1827
2153
|
...spec,
|
|
1828
2154
|
prompt: {
|
|
@@ -1830,7 +2156,7 @@ function generateSlashCommands(opts) {
|
|
|
1830
2156
|
executionContext: spec.prompt.executionContext.split("\n").map((line) => {
|
|
1831
2157
|
if (line.startsWith("@")) {
|
|
1832
2158
|
const relPath = line.slice(1);
|
|
1833
|
-
return `@${
|
|
2159
|
+
return `@${path15.resolve(relPath)}`;
|
|
1834
2160
|
}
|
|
1835
2161
|
return line;
|
|
1836
2162
|
}).join("\n")
|
|
@@ -1838,10 +2164,11 @@ function generateSlashCommands(opts) {
|
|
|
1838
2164
|
} : spec;
|
|
1839
2165
|
rendered.set(filename, renderClaudeCode(renderSpec));
|
|
1840
2166
|
} else {
|
|
1841
|
-
const
|
|
1842
|
-
const
|
|
1843
|
-
const
|
|
1844
|
-
const
|
|
2167
|
+
const filename = `${spec.name}.toml`;
|
|
2168
|
+
const mdPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "SKILL.md");
|
|
2169
|
+
const yamlPath = path15.join(spec.skillsBaseDir, spec.sourceDir, "skill.yaml");
|
|
2170
|
+
const mdContent = fs13.existsSync(mdPath) ? fs13.readFileSync(mdPath, "utf-8") : "";
|
|
2171
|
+
const yamlContent = fs13.existsSync(yamlPath) ? fs13.readFileSync(yamlPath, "utf-8") : "";
|
|
1845
2172
|
rendered.set(filename, renderGemini(spec, mdContent, yamlContent));
|
|
1846
2173
|
}
|
|
1847
2174
|
}
|
|
@@ -1867,9 +2194,14 @@ async function handleOrphanDeletion(results, opts) {
|
|
|
1867
2194
|
const shouldDelete = opts.yes || await confirmDeletion(result.removed);
|
|
1868
2195
|
if (shouldDelete) {
|
|
1869
2196
|
for (const filename of result.removed) {
|
|
1870
|
-
const filePath =
|
|
1871
|
-
if (
|
|
1872
|
-
|
|
2197
|
+
const filePath = path15.join(result.outputDir, filename);
|
|
2198
|
+
if (fs13.existsSync(filePath)) {
|
|
2199
|
+
const stat = fs13.statSync(filePath);
|
|
2200
|
+
if (stat.isDirectory()) {
|
|
2201
|
+
fs13.rmSync(filePath, { recursive: true, force: true });
|
|
2202
|
+
} else {
|
|
2203
|
+
fs13.unlinkSync(filePath);
|
|
2204
|
+
}
|
|
1873
2205
|
}
|
|
1874
2206
|
}
|
|
1875
2207
|
}
|
|
@@ -1877,7 +2209,7 @@ async function handleOrphanDeletion(results, opts) {
|
|
|
1877
2209
|
}
|
|
1878
2210
|
function createGenerateSlashCommandsCommand() {
|
|
1879
2211
|
return new Command("generate-slash-commands").description(
|
|
1880
|
-
"Generate native
|
|
2212
|
+
"Generate native commands for Claude Code, Gemini CLI, Codex CLI, and Cursor from skill metadata"
|
|
1881
2213
|
).option("--platforms <list>", "Target platforms (comma-separated)", "claude-code,gemini-cli").option("--global", "Write to global config directories", false).option("--include-global", "Include built-in global skills alongside project skills", false).option("--output <dir>", "Custom output directory").option("--skills-dir <path>", "Skills directory to scan").option("--dry-run", "Show what would change without writing", false).option("--yes", "Skip deletion confirmation prompts", false).action(async (opts, cmd) => {
|
|
1882
2214
|
const globalOpts = cmd.optsWithGlobals();
|
|
1883
2215
|
const platforms = opts.platforms.split(",").map((p) => p.trim());
|
|
@@ -1995,7 +2327,7 @@ async function handleGenerateSlashCommands(input) {
|
|
|
1995
2327
|
// src/mcp/resources/state.ts
|
|
1996
2328
|
async function getStateResource(projectRoot) {
|
|
1997
2329
|
try {
|
|
1998
|
-
const { loadState, migrateToStreams } = await import("./dist-
|
|
2330
|
+
const { loadState, migrateToStreams } = await import("./dist-MF5BK5AD.js");
|
|
1999
2331
|
await migrateToStreams(projectRoot);
|
|
2000
2332
|
const result = await loadState(projectRoot);
|
|
2001
2333
|
if (result.ok) {
|
|
@@ -2083,7 +2415,7 @@ async function handleQueryGraph(input) {
|
|
|
2083
2415
|
const projectPath = sanitizePath(input.path);
|
|
2084
2416
|
const store = await loadGraphStore(projectPath);
|
|
2085
2417
|
if (!store) return graphNotFoundError();
|
|
2086
|
-
const { ContextQL } = await import("./dist-
|
|
2418
|
+
const { ContextQL } = await import("./dist-U7EAO6T2.js");
|
|
2087
2419
|
const cql = new ContextQL(store);
|
|
2088
2420
|
const result = cql.execute({
|
|
2089
2421
|
rootNodeIds: input.rootNodeIds,
|
|
@@ -2174,7 +2506,7 @@ async function handleSearchSimilar(input) {
|
|
|
2174
2506
|
const projectPath = sanitizePath(input.path);
|
|
2175
2507
|
const store = await loadGraphStore(projectPath);
|
|
2176
2508
|
if (!store) return graphNotFoundError();
|
|
2177
|
-
const { FusionLayer } = await import("./dist-
|
|
2509
|
+
const { FusionLayer } = await import("./dist-U7EAO6T2.js");
|
|
2178
2510
|
const fusion = new FusionLayer(store);
|
|
2179
2511
|
const results = fusion.search(input.query, input.topK ?? 10);
|
|
2180
2512
|
if (input.mode === "summary") {
|
|
@@ -2229,7 +2561,7 @@ async function handleFindContextFor(input) {
|
|
|
2229
2561
|
const projectPath = sanitizePath(input.path);
|
|
2230
2562
|
const store = await loadGraphStore(projectPath);
|
|
2231
2563
|
if (!store) return graphNotFoundError();
|
|
2232
|
-
const { FusionLayer, ContextQL } = await import("./dist-
|
|
2564
|
+
const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
|
|
2233
2565
|
const fusion = new FusionLayer(store);
|
|
2234
2566
|
const cql = new ContextQL(store);
|
|
2235
2567
|
const tokenBudget = input.tokenBudget ?? 4e3;
|
|
@@ -2325,7 +2657,7 @@ async function handleGetRelationships(input) {
|
|
|
2325
2657
|
const projectPath = sanitizePath(input.path);
|
|
2326
2658
|
const store = await loadGraphStore(projectPath);
|
|
2327
2659
|
if (!store) return graphNotFoundError();
|
|
2328
|
-
const { ContextQL } = await import("./dist-
|
|
2660
|
+
const { ContextQL } = await import("./dist-U7EAO6T2.js");
|
|
2329
2661
|
const cql = new ContextQL(store);
|
|
2330
2662
|
const direction = input.direction ?? "both";
|
|
2331
2663
|
const bidirectional = direction === "both" || direction === "inbound";
|
|
@@ -2431,7 +2763,7 @@ async function handleGetImpact(input) {
|
|
|
2431
2763
|
const projectPath = sanitizePath(input.path);
|
|
2432
2764
|
const store = await loadGraphStore(projectPath);
|
|
2433
2765
|
if (!store) return graphNotFoundError();
|
|
2434
|
-
const { ContextQL } = await import("./dist-
|
|
2766
|
+
const { ContextQL } = await import("./dist-U7EAO6T2.js");
|
|
2435
2767
|
let targetNodeId = input.nodeId;
|
|
2436
2768
|
if (!targetNodeId && input.filePath) {
|
|
2437
2769
|
const fileNodes = store.findNodes({ type: "file" });
|
|
@@ -2542,7 +2874,7 @@ async function handleGetImpact(input) {
|
|
|
2542
2874
|
}
|
|
2543
2875
|
|
|
2544
2876
|
// src/mcp/tools/graph/ingest-source.ts
|
|
2545
|
-
import * as
|
|
2877
|
+
import * as path16 from "path";
|
|
2546
2878
|
var ingestSourceDefinition = {
|
|
2547
2879
|
name: "ingest_source",
|
|
2548
2880
|
description: "Ingest sources into the project knowledge graph. Supports code analysis, knowledge documents, git history, or all at once.",
|
|
@@ -2562,10 +2894,10 @@ var ingestSourceDefinition = {
|
|
|
2562
2894
|
async function handleIngestSource(input) {
|
|
2563
2895
|
try {
|
|
2564
2896
|
const projectPath = sanitizePath(input.path);
|
|
2565
|
-
const graphDir =
|
|
2566
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-
|
|
2567
|
-
const
|
|
2568
|
-
await
|
|
2897
|
+
const graphDir = path16.join(projectPath, ".harness", "graph");
|
|
2898
|
+
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-U7EAO6T2.js");
|
|
2899
|
+
const fs16 = await import("fs/promises");
|
|
2900
|
+
await fs16.mkdir(graphDir, { recursive: true });
|
|
2569
2901
|
const store = new GraphStore();
|
|
2570
2902
|
await store.load(graphDir);
|
|
2571
2903
|
const results = [];
|
|
@@ -2638,7 +2970,7 @@ async function handleDetectAnomalies(input) {
|
|
|
2638
2970
|
const projectPath = sanitizePath(input.path);
|
|
2639
2971
|
const store = await loadGraphStore(projectPath);
|
|
2640
2972
|
if (!store) return graphNotFoundError();
|
|
2641
|
-
const { GraphAnomalyAdapter } = await import("./dist-
|
|
2973
|
+
const { GraphAnomalyAdapter } = await import("./dist-U7EAO6T2.js");
|
|
2642
2974
|
const adapter = new GraphAnomalyAdapter(store);
|
|
2643
2975
|
const report = adapter.detect({
|
|
2644
2976
|
...input.threshold !== void 0 && { threshold: input.threshold },
|
|
@@ -2678,7 +3010,7 @@ async function handleAskGraph(input) {
|
|
|
2678
3010
|
const projectPath = sanitizePath(input.path);
|
|
2679
3011
|
const store = await loadGraphStore(projectPath);
|
|
2680
3012
|
if (!store) return graphNotFoundError();
|
|
2681
|
-
const { askGraph } = await import("./dist-
|
|
3013
|
+
const { askGraph } = await import("./dist-U7EAO6T2.js");
|
|
2682
3014
|
const result = await askGraph(store, input.question);
|
|
2683
3015
|
return {
|
|
2684
3016
|
content: [{ type: "text", text: JSON.stringify(result) }]
|
|
@@ -2697,8 +3029,8 @@ async function handleAskGraph(input) {
|
|
|
2697
3029
|
}
|
|
2698
3030
|
|
|
2699
3031
|
// src/mcp/resources/graph.ts
|
|
2700
|
-
import * as
|
|
2701
|
-
import * as
|
|
3032
|
+
import * as fs14 from "fs/promises";
|
|
3033
|
+
import * as path17 from "path";
|
|
2702
3034
|
var MAX_ITEMS = 5e3;
|
|
2703
3035
|
function formatStaleness(isoTimestamp) {
|
|
2704
3036
|
const then = new Date(isoTimestamp).getTime();
|
|
@@ -2721,11 +3053,11 @@ async function getGraphResource(projectRoot) {
|
|
|
2721
3053
|
message: "No knowledge graph found. Run harness scan to build one."
|
|
2722
3054
|
});
|
|
2723
3055
|
}
|
|
2724
|
-
const graphDir =
|
|
2725
|
-
const metadataPath =
|
|
3056
|
+
const graphDir = path17.join(projectRoot, ".harness", "graph");
|
|
3057
|
+
const metadataPath = path17.join(graphDir, "metadata.json");
|
|
2726
3058
|
let lastScanTimestamp = null;
|
|
2727
3059
|
try {
|
|
2728
|
-
const raw = JSON.parse(await
|
|
3060
|
+
const raw = JSON.parse(await fs14.readFile(metadataPath, "utf-8"));
|
|
2729
3061
|
lastScanTimestamp = raw.lastScanTimestamp ?? null;
|
|
2730
3062
|
} catch {
|
|
2731
3063
|
}
|
|
@@ -2814,7 +3146,7 @@ var generateAgentDefinitionsDefinition = {
|
|
|
2814
3146
|
}
|
|
2815
3147
|
};
|
|
2816
3148
|
async function handleGenerateAgentDefinitions(input) {
|
|
2817
|
-
const { generateAgentDefinitions } = await import("./generate-agent-definitions-
|
|
3149
|
+
const { generateAgentDefinitions } = await import("./generate-agent-definitions-EYG263XD.js");
|
|
2818
3150
|
const platforms = input.platform === "all" || !input.platform ? ["claude-code", "gemini-cli"] : [input.platform];
|
|
2819
3151
|
const results = generateAgentDefinitions({
|
|
2820
3152
|
platforms: [...platforms],
|
|
@@ -2825,8 +3157,8 @@ async function handleGenerateAgentDefinitions(input) {
|
|
|
2825
3157
|
}
|
|
2826
3158
|
|
|
2827
3159
|
// src/mcp/tools/roadmap.ts
|
|
2828
|
-
import * as
|
|
2829
|
-
import * as
|
|
3160
|
+
import * as fs15 from "fs";
|
|
3161
|
+
import * as path18 from "path";
|
|
2830
3162
|
var manageRoadmapDefinition = {
|
|
2831
3163
|
name: "manage_roadmap",
|
|
2832
3164
|
description: "Manage the project roadmap: show, add, update, remove, sync features, or query by filter. Reads and writes docs/roadmap.md.",
|
|
@@ -2881,21 +3213,21 @@ var manageRoadmapDefinition = {
|
|
|
2881
3213
|
}
|
|
2882
3214
|
};
|
|
2883
3215
|
function roadmapPath(projectRoot) {
|
|
2884
|
-
return
|
|
3216
|
+
return path18.join(projectRoot, "docs", "roadmap.md");
|
|
2885
3217
|
}
|
|
2886
3218
|
function readRoadmapFile(projectRoot) {
|
|
2887
3219
|
const filePath = roadmapPath(projectRoot);
|
|
2888
3220
|
try {
|
|
2889
|
-
return
|
|
3221
|
+
return fs15.readFileSync(filePath, "utf-8");
|
|
2890
3222
|
} catch {
|
|
2891
3223
|
return null;
|
|
2892
3224
|
}
|
|
2893
3225
|
}
|
|
2894
3226
|
function writeRoadmapFile(projectRoot, content) {
|
|
2895
3227
|
const filePath = roadmapPath(projectRoot);
|
|
2896
|
-
const dir =
|
|
2897
|
-
|
|
2898
|
-
|
|
3228
|
+
const dir = path18.dirname(filePath);
|
|
3229
|
+
fs15.mkdirSync(dir, { recursive: true });
|
|
3230
|
+
fs15.writeFileSync(filePath, content, "utf-8");
|
|
2899
3231
|
}
|
|
2900
3232
|
function roadmapNotFoundError() {
|
|
2901
3233
|
return {
|
|
@@ -2982,7 +3314,10 @@ function handleAdd(projectPath, input, deps) {
|
|
|
2982
3314
|
spec: input.spec ?? null,
|
|
2983
3315
|
plans: input.plans ?? [],
|
|
2984
3316
|
blockedBy: input.blocked_by ?? [],
|
|
2985
|
-
summary: input.summary
|
|
3317
|
+
summary: input.summary,
|
|
3318
|
+
assignee: null,
|
|
3319
|
+
priority: null,
|
|
3320
|
+
externalId: null
|
|
2986
3321
|
});
|
|
2987
3322
|
roadmap.frontmatter.lastManualEdit = (/* @__PURE__ */ new Date()).toISOString();
|
|
2988
3323
|
writeRoadmapFile(projectPath, serializeRoadmap(roadmap));
|
|
@@ -3108,7 +3443,7 @@ function handleSync(projectPath, input, deps) {
|
|
|
3108
3443
|
}
|
|
3109
3444
|
async function handleManageRoadmap(input) {
|
|
3110
3445
|
try {
|
|
3111
|
-
const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-
|
|
3446
|
+
const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
|
|
3112
3447
|
const { Ok: Ok2 } = await import("./dist-USY2C5JL.js");
|
|
3113
3448
|
const projectPath = sanitizePath(input.path);
|
|
3114
3449
|
const deps = { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges, Ok: Ok2 };
|
|
@@ -3536,7 +3871,7 @@ async function handleTransition(validInput, projectPath, id) {
|
|
|
3536
3871
|
const transition = transitionResult.data;
|
|
3537
3872
|
const prompt = renderTransition(transition);
|
|
3538
3873
|
try {
|
|
3539
|
-
const { saveHandoff } = await import("./dist-
|
|
3874
|
+
const { saveHandoff } = await import("./dist-MF5BK5AD.js");
|
|
3540
3875
|
await saveHandoff(
|
|
3541
3876
|
projectPath,
|
|
3542
3877
|
{
|
|
@@ -3606,7 +3941,7 @@ async function handleEmitInteraction(input) {
|
|
|
3606
3941
|
}
|
|
3607
3942
|
async function recordInteraction(projectPath, id, type, decision, stream) {
|
|
3608
3943
|
try {
|
|
3609
|
-
const { loadState, saveState } = await import("./dist-
|
|
3944
|
+
const { loadState, saveState } = await import("./dist-MF5BK5AD.js");
|
|
3610
3945
|
const stateResult = await loadState(projectPath, stream);
|
|
3611
3946
|
if (stateResult.ok) {
|
|
3612
3947
|
const state = stateResult.value;
|
|
@@ -3695,10 +4030,10 @@ async function handleGatherContext(input) {
|
|
|
3695
4030
|
input.include ?? ["state", "learnings", "handoff", "graph", "validation"]
|
|
3696
4031
|
);
|
|
3697
4032
|
const errors = [];
|
|
3698
|
-
const statePromise = includeSet.has("state") ? import("./dist-
|
|
4033
|
+
const statePromise = includeSet.has("state") ? import("./dist-MF5BK5AD.js").then(
|
|
3699
4034
|
(core) => core.loadState(projectPath, void 0, input.session)
|
|
3700
4035
|
) : Promise.resolve(null);
|
|
3701
|
-
const learningsPromise = includeSet.has("learnings") ? import("./dist-
|
|
4036
|
+
const learningsPromise = includeSet.has("learnings") ? import("./dist-MF5BK5AD.js").then(
|
|
3702
4037
|
(core) => core.loadBudgetedLearnings(projectPath, {
|
|
3703
4038
|
intent: input.intent,
|
|
3704
4039
|
tokenBudget: input.learningsBudget ?? 1e3,
|
|
@@ -3707,14 +4042,14 @@ async function handleGatherContext(input) {
|
|
|
3707
4042
|
...input.depth !== void 0 && { depth: input.depth }
|
|
3708
4043
|
})
|
|
3709
4044
|
) : Promise.resolve(null);
|
|
3710
|
-
const handoffPromise = includeSet.has("handoff") ? import("./dist-
|
|
4045
|
+
const handoffPromise = includeSet.has("handoff") ? import("./dist-MF5BK5AD.js").then(
|
|
3711
4046
|
(core) => core.loadHandoff(projectPath, void 0, input.session)
|
|
3712
4047
|
) : Promise.resolve(null);
|
|
3713
4048
|
const graphPromise = includeSet.has("graph") ? (async () => {
|
|
3714
|
-
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-
|
|
4049
|
+
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
|
|
3715
4050
|
const store = await loadGraphStore2(projectPath);
|
|
3716
4051
|
if (!store) return null;
|
|
3717
|
-
const { FusionLayer, ContextQL } = await import("./dist-
|
|
4052
|
+
const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
|
|
3718
4053
|
const fusion = new FusionLayer(store);
|
|
3719
4054
|
const cql = new ContextQL(store);
|
|
3720
4055
|
const tokenBudget = input.tokenBudget ?? 4e3;
|
|
@@ -3751,11 +4086,11 @@ async function handleGatherContext(input) {
|
|
|
3751
4086
|
context: contextBlocks
|
|
3752
4087
|
};
|
|
3753
4088
|
})() : Promise.resolve(null);
|
|
3754
|
-
const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-
|
|
4089
|
+
const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-MF5BK5AD.js").then(
|
|
3755
4090
|
(core) => core.readSessionSections(projectPath, input.session)
|
|
3756
4091
|
) : Promise.resolve(null);
|
|
3757
4092
|
const shouldIncludeEvents = input.includeEvents !== void 0 ? input.includeEvents : includeSet.has("events") || !!input.session && !input.include;
|
|
3758
|
-
const eventsPromise = shouldIncludeEvents ? import("./dist-
|
|
4093
|
+
const eventsPromise = shouldIncludeEvents ? import("./dist-MF5BK5AD.js").then(async (core) => {
|
|
3759
4094
|
const result = await core.loadEvents(projectPath, {
|
|
3760
4095
|
session: input.session
|
|
3761
4096
|
});
|
|
@@ -3763,7 +4098,7 @@ async function handleGatherContext(input) {
|
|
|
3763
4098
|
return core.formatEventTimeline(result.value);
|
|
3764
4099
|
}) : Promise.resolve(null);
|
|
3765
4100
|
const validationPromise = includeSet.has("validation") ? (async () => {
|
|
3766
|
-
const { handleValidateProject: handleValidateProject2 } = await import("./validate-
|
|
4101
|
+
const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
|
|
3767
4102
|
const result = await handleValidateProject2({ path: projectPath });
|
|
3768
4103
|
const first = result.content[0];
|
|
3769
4104
|
return first ? JSON.parse(first.text) : null;
|
|
@@ -3857,7 +4192,7 @@ async function handleGatherContext(input) {
|
|
|
3857
4192
|
};
|
|
3858
4193
|
if (input.session) {
|
|
3859
4194
|
try {
|
|
3860
|
-
const core = await import("./dist-
|
|
4195
|
+
const core = await import("./dist-MF5BK5AD.js");
|
|
3861
4196
|
core.updateSessionIndex(
|
|
3862
4197
|
projectPath,
|
|
3863
4198
|
input.session,
|
|
@@ -3927,7 +4262,7 @@ async function handleAssessProject(input) {
|
|
|
3927
4262
|
let validateResult = null;
|
|
3928
4263
|
if (checksToRun.has("validate")) {
|
|
3929
4264
|
try {
|
|
3930
|
-
const { handleValidateProject: handleValidateProject2 } = await import("./validate-
|
|
4265
|
+
const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
|
|
3931
4266
|
const result = await handleValidateProject2({ path: projectPath });
|
|
3932
4267
|
const first = result.content[0];
|
|
3933
4268
|
const parsed = first ? JSON.parse(first.text) : {};
|
|
@@ -3952,7 +4287,7 @@ async function handleAssessProject(input) {
|
|
|
3952
4287
|
parallelChecks.push(
|
|
3953
4288
|
(async () => {
|
|
3954
4289
|
try {
|
|
3955
|
-
const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-
|
|
4290
|
+
const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-UBO5KKUV.js");
|
|
3956
4291
|
const result = await handleCheckDependencies2({ path: projectPath });
|
|
3957
4292
|
const first = result.content[0];
|
|
3958
4293
|
const parsed = first ? JSON.parse(first.text) : {};
|
|
@@ -3979,7 +4314,7 @@ async function handleAssessProject(input) {
|
|
|
3979
4314
|
parallelChecks.push(
|
|
3980
4315
|
(async () => {
|
|
3981
4316
|
try {
|
|
3982
|
-
const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-
|
|
4317
|
+
const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-WZHW4N4P.js");
|
|
3983
4318
|
const result = await handleCheckDocs2({ path: projectPath, scope: "coverage" });
|
|
3984
4319
|
const first = result.content[0];
|
|
3985
4320
|
const parsed = first ? JSON.parse(first.text) : {};
|
|
@@ -4006,7 +4341,7 @@ async function handleAssessProject(input) {
|
|
|
4006
4341
|
parallelChecks.push(
|
|
4007
4342
|
(async () => {
|
|
4008
4343
|
try {
|
|
4009
|
-
const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-
|
|
4344
|
+
const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-FCIGJIIT.js");
|
|
4010
4345
|
const result = await handleDetectEntropy2({ path: projectPath, type: "all" });
|
|
4011
4346
|
const first = result.content[0];
|
|
4012
4347
|
const parsed = first ? JSON.parse(first.text) : {};
|
|
@@ -4033,7 +4368,7 @@ async function handleAssessProject(input) {
|
|
|
4033
4368
|
parallelChecks.push(
|
|
4034
4369
|
(async () => {
|
|
4035
4370
|
try {
|
|
4036
|
-
const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-
|
|
4371
|
+
const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-HTDKKGMX.js");
|
|
4037
4372
|
const result = await handleRunSecurityScan2({ path: projectPath });
|
|
4038
4373
|
const first = result.content[0];
|
|
4039
4374
|
const parsed = first ? JSON.parse(first.text) : {};
|
|
@@ -4065,14 +4400,28 @@ async function handleAssessProject(input) {
|
|
|
4065
4400
|
parallelChecks.push(
|
|
4066
4401
|
(async () => {
|
|
4067
4402
|
try {
|
|
4068
|
-
const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-
|
|
4403
|
+
const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-NMJDV6HF.js");
|
|
4069
4404
|
const result = await handleCheckPerformance2({ path: projectPath });
|
|
4405
|
+
if ("isError" in result && result.isError) {
|
|
4406
|
+
const msg = result.content[0]?.text ?? "Performance check failed";
|
|
4407
|
+
return { name: "perf", passed: false, issueCount: 1, topIssue: msg };
|
|
4408
|
+
}
|
|
4070
4409
|
const first = result.content[0];
|
|
4071
|
-
|
|
4410
|
+
let parsed = {};
|
|
4411
|
+
try {
|
|
4412
|
+
parsed = first ? JSON.parse(first.text) : {};
|
|
4413
|
+
} catch {
|
|
4414
|
+
return {
|
|
4415
|
+
name: "perf",
|
|
4416
|
+
passed: false,
|
|
4417
|
+
issueCount: 1,
|
|
4418
|
+
topIssue: first?.text ?? "Invalid perf output"
|
|
4419
|
+
};
|
|
4420
|
+
}
|
|
4072
4421
|
const issues = parsed.violations?.length ?? parsed.issues?.length ?? 0;
|
|
4073
4422
|
return {
|
|
4074
4423
|
name: "perf",
|
|
4075
|
-
passed:
|
|
4424
|
+
passed: issues === 0,
|
|
4076
4425
|
issueCount: issues,
|
|
4077
4426
|
...issues > 0 ? { topIssue: "Performance issues detected" } : {},
|
|
4078
4427
|
...mode === "detailed" ? { detailed: parsed } : {}
|
|
@@ -4254,7 +4603,7 @@ async function handleReviewChanges(input) {
|
|
|
4254
4603
|
}
|
|
4255
4604
|
}
|
|
4256
4605
|
async function runQuickReview(projectPath, diff, diffLines, downgraded) {
|
|
4257
|
-
const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-
|
|
4606
|
+
const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-O3FYTZIE.js");
|
|
4258
4607
|
const result = await handleAnalyzeDiff2({ diff, path: projectPath });
|
|
4259
4608
|
const firstContent = result.content[0];
|
|
4260
4609
|
if (!firstContent) throw new Error("Empty analyze_diff response");
|
|
@@ -4285,7 +4634,7 @@ function extractFileCount(diffParsed) {
|
|
|
4285
4634
|
return files?.length ?? 0;
|
|
4286
4635
|
}
|
|
4287
4636
|
async function runStandardReview(projectPath, diff, diffLines, downgraded) {
|
|
4288
|
-
const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-
|
|
4637
|
+
const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-O3FYTZIE.js");
|
|
4289
4638
|
const [diffResult, reviewResult] = await Promise.all([
|
|
4290
4639
|
handleAnalyzeDiff2({ diff, path: projectPath }),
|
|
4291
4640
|
handleCreateSelfReview2({ path: projectPath, diff })
|
|
@@ -4317,7 +4666,7 @@ async function runStandardReview(projectPath, diff, diffLines, downgraded) {
|
|
|
4317
4666
|
};
|
|
4318
4667
|
}
|
|
4319
4668
|
async function runDeepReview(projectPath, diff, diffLines, _downgraded) {
|
|
4320
|
-
const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-
|
|
4669
|
+
const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-MSEJWTKM.js");
|
|
4321
4670
|
const result = await handleRunCodeReview2({ path: projectPath, diff });
|
|
4322
4671
|
const deepContent = result.content[0];
|
|
4323
4672
|
if (!deepContent) throw new Error("Empty code review response");
|
|
@@ -4388,7 +4737,7 @@ async function handleCheckTaskIndependence(input) {
|
|
|
4388
4737
|
try {
|
|
4389
4738
|
const projectPath = sanitizePath(input.path);
|
|
4390
4739
|
const store = await loadGraphStore(projectPath);
|
|
4391
|
-
const { TaskIndependenceAnalyzer } = await import("./dist-
|
|
4740
|
+
const { TaskIndependenceAnalyzer } = await import("./dist-U7EAO6T2.js");
|
|
4392
4741
|
const analyzer = new TaskIndependenceAnalyzer(store ?? void 0);
|
|
4393
4742
|
const result = analyzer.analyze({
|
|
4394
4743
|
tasks: input.tasks,
|
|
@@ -4476,7 +4825,7 @@ async function handlePredictConflicts(input) {
|
|
|
4476
4825
|
try {
|
|
4477
4826
|
const projectPath = sanitizePath(input.path);
|
|
4478
4827
|
const store = await loadGraphStore(projectPath);
|
|
4479
|
-
const { ConflictPredictor } = await import("./dist-
|
|
4828
|
+
const { ConflictPredictor } = await import("./dist-U7EAO6T2.js");
|
|
4480
4829
|
const predictor = new ConflictPredictor(store ?? void 0);
|
|
4481
4830
|
const result = predictor.predict({
|
|
4482
4831
|
tasks: input.tasks,
|
|
@@ -4582,7 +4931,7 @@ async function handleDetectStaleConstraints(input) {
|
|
|
4582
4931
|
isError: true
|
|
4583
4932
|
};
|
|
4584
4933
|
}
|
|
4585
|
-
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-
|
|
4934
|
+
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
|
|
4586
4935
|
const store = await loadGraphStore2(projectPath);
|
|
4587
4936
|
if (!store) {
|
|
4588
4937
|
return {
|
|
@@ -4603,7 +4952,7 @@ async function handleDetectStaleConstraints(input) {
|
|
|
4603
4952
|
]
|
|
4604
4953
|
};
|
|
4605
4954
|
}
|
|
4606
|
-
const { detectStaleConstraints } = await import("./dist-
|
|
4955
|
+
const { detectStaleConstraints } = await import("./dist-MF5BK5AD.js");
|
|
4607
4956
|
const result = detectStaleConstraints(
|
|
4608
4957
|
store,
|
|
4609
4958
|
windowDays,
|
|
@@ -4735,7 +5084,7 @@ async function handleCodeOutline(input) {
|
|
|
4735
5084
|
};
|
|
4736
5085
|
}
|
|
4737
5086
|
try {
|
|
4738
|
-
const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-
|
|
5087
|
+
const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-MF5BK5AD.js");
|
|
4739
5088
|
const { stat } = await import("fs/promises");
|
|
4740
5089
|
const stats = await stat(targetPath).catch(() => null);
|
|
4741
5090
|
if (stats?.isFile()) {
|
|
@@ -4815,7 +5164,7 @@ async function handleCodeSearch(input) {
|
|
|
4815
5164
|
};
|
|
4816
5165
|
}
|
|
4817
5166
|
try {
|
|
4818
|
-
const { searchSymbols } = await import("./dist-
|
|
5167
|
+
const { searchSymbols } = await import("./dist-MF5BK5AD.js");
|
|
4819
5168
|
const result = await searchSymbols(input.query, directory, input.glob);
|
|
4820
5169
|
const lines = [`Search: "${result.query}" \u2014 ${result.matches.length} matches`];
|
|
4821
5170
|
for (const match of result.matches) {
|
|
@@ -4884,7 +5233,7 @@ async function handleCodeUnfold(input) {
|
|
|
4884
5233
|
}
|
|
4885
5234
|
try {
|
|
4886
5235
|
if (input.symbol) {
|
|
4887
|
-
const { unfoldSymbol } = await import("./dist-
|
|
5236
|
+
const { unfoldSymbol } = await import("./dist-MF5BK5AD.js");
|
|
4888
5237
|
const result = await unfoldSymbol(filePath, input.symbol);
|
|
4889
5238
|
const header = result.warning ? `${result.file}:${result.startLine}-${result.endLine} ${result.warning}
|
|
4890
5239
|
` : `${result.file}:${result.startLine}-${result.endLine}
|
|
@@ -4892,7 +5241,7 @@ async function handleCodeUnfold(input) {
|
|
|
4892
5241
|
return { content: [{ type: "text", text: header + result.content }] };
|
|
4893
5242
|
}
|
|
4894
5243
|
if (input.startLine != null && input.endLine != null) {
|
|
4895
|
-
const { unfoldRange } = await import("./dist-
|
|
5244
|
+
const { unfoldRange } = await import("./dist-MF5BK5AD.js");
|
|
4896
5245
|
const result = await unfoldRange(filePath, input.startLine, input.endLine);
|
|
4897
5246
|
const header = `${result.file}:${result.startLine}-${result.endLine}
|
|
4898
5247
|
`;
|
|
@@ -5107,7 +5456,7 @@ async function appendUpdateNotification(result, resolvedRoot) {
|
|
|
5107
5456
|
shouldRunCheck,
|
|
5108
5457
|
readCheckState,
|
|
5109
5458
|
spawnBackgroundCheck
|
|
5110
|
-
} = await import("./dist-
|
|
5459
|
+
} = await import("./dist-MF5BK5AD.js");
|
|
5111
5460
|
const { CLI_VERSION } = await import("./version-KFFPOQAX.js");
|
|
5112
5461
|
const configInterval = readConfigInterval(resolvedRoot);
|
|
5113
5462
|
const DEFAULT_INTERVAL = 864e5;
|
|
@@ -5125,19 +5474,24 @@ ${notification}` });
|
|
|
5125
5474
|
} catch {
|
|
5126
5475
|
}
|
|
5127
5476
|
}
|
|
5128
|
-
function createHarnessServer(projectRoot) {
|
|
5477
|
+
function createHarnessServer(projectRoot, toolFilter) {
|
|
5129
5478
|
const resolvedRoot = projectRoot ?? process.cwd();
|
|
5130
5479
|
let sessionChecked = false;
|
|
5480
|
+
const filteredDefinitions = toolFilter ? TOOL_DEFINITIONS.filter((t) => toolFilter.includes(t.name)) : TOOL_DEFINITIONS;
|
|
5481
|
+
const filteredHandlers = toolFilter ? Object.fromEntries(
|
|
5482
|
+
Object.entries(TOOL_HANDLERS).filter(([name]) => toolFilter.includes(name))
|
|
5483
|
+
) : TOOL_HANDLERS;
|
|
5131
5484
|
const server = new Server(
|
|
5132
5485
|
{ name: "harness-engineering", version: "0.1.0" },
|
|
5133
5486
|
{ capabilities: { tools: {}, resources: {} } }
|
|
5134
5487
|
);
|
|
5135
5488
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
5136
|
-
tools:
|
|
5489
|
+
tools: filteredDefinitions
|
|
5137
5490
|
}));
|
|
5491
|
+
const guardedHandlers = applyInjectionGuard(filteredHandlers, { projectRoot: resolvedRoot });
|
|
5138
5492
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
5139
5493
|
const { name, arguments: args } = request.params;
|
|
5140
|
-
const handler =
|
|
5494
|
+
const handler = guardedHandlers[name];
|
|
5141
5495
|
if (!handler) {
|
|
5142
5496
|
return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
|
|
5143
5497
|
}
|
|
@@ -5166,8 +5520,8 @@ function createHarnessServer(projectRoot) {
|
|
|
5166
5520
|
});
|
|
5167
5521
|
return server;
|
|
5168
5522
|
}
|
|
5169
|
-
async function startServer() {
|
|
5170
|
-
const server = createHarnessServer();
|
|
5523
|
+
async function startServer(toolFilter) {
|
|
5524
|
+
const server = createHarnessServer(void 0, toolFilter);
|
|
5171
5525
|
const transport = new StdioServerTransport();
|
|
5172
5526
|
await server.connect(transport);
|
|
5173
5527
|
}
|