@harness-engineering/cli 1.14.0 → 1.16.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 +355 -45
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +12 -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-product-spec/SKILL.md +5 -5
- 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-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-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 +355 -45
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +12 -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-product-spec/SKILL.md +5 -5
- 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 +1 -0
- package/dist/agents/skills/templates/discipline-template.md +49 -0
- package/dist/agents/skills/tests/schema.ts +1 -1
- package/dist/agents/skills/vitest.config.mts +5 -0
- package/dist/{agents-md-YTYQDA3P.js → agents-md-VYDFPIRW.js} +1 -1
- package/dist/{architecture-JQZYM4US.js → architecture-K5HSRBGB.js} +2 -2
- package/dist/bin/harness-mcp.js +13 -13
- package/dist/bin/harness.js +21 -19
- package/dist/{check-phase-gate-L3RADYWO.js → check-phase-gate-5AS6SXL6.js} +3 -3
- package/dist/{chunk-6KTUUFRN.js → chunk-5ZXHMCPL.js} +1 -1
- package/dist/{chunk-RCWZBSK5.js → chunk-6KWBH4EO.js} +1 -1
- package/dist/{chunk-ABQHQ6I5.js → chunk-ALFKNAZW.js} +2436 -233
- package/dist/{chunk-OXLLOSSR.js → chunk-AV6KMDO5.js} +2 -2
- package/dist/{chunk-7IP4JIFL.js → chunk-C7DTKLPW.js} +4 -4
- package/dist/{chunk-ZOAWBDWU.js → chunk-CJDVBBPB.js} +5 -1
- package/dist/{chunk-YPYGXRDR.js → chunk-DNDBFIZN.js} +18 -4
- package/dist/{chunk-XYLGHKG6.js → chunk-HKUX2X7O.js} +11 -2
- package/dist/{chunk-YZD2MRNQ.js → chunk-JOP2NDNB.js} +684 -142
- package/dist/{chunk-YBJ262QL.js → chunk-LRG3B43J.js} +1 -1
- package/dist/{chunk-AOZRDOIP.js → chunk-M6TIO6NF.js} +1 -1
- package/dist/{chunk-O5OJVPL6.js → chunk-OCDDCGDE.js} +9 -1
- package/dist/{chunk-OSXBPAMK.js → chunk-QDF7COPQ.js} +1 -1
- package/dist/{chunk-TPOTOBR7.js → chunk-RWZPHW4H.js} +3 -3
- package/dist/{chunk-3C2MLBPJ.js → chunk-SFRGPAK6.js} +1 -1
- package/dist/{chunk-XKECDXJS.js → chunk-SHYWICGA.js} +2184 -456
- package/dist/{chunk-S2FXOWOR.js → chunk-TF6ZLHJV.js} +2 -2
- package/dist/{chunk-NLVUVUGD.js → chunk-ZJMU7MEV.js} +1 -1
- package/dist/{ci-workflow-EQZFVX3P.js → ci-workflow-CRWU723U.js} +1 -1
- package/dist/{create-skill-XSWHMSM5.js → create-skill-NDXQSTIK.js} +2 -2
- package/dist/{dist-HWXF2C3R.js → dist-4LPXJYVZ.js} +105 -1
- package/dist/{docs-7ECGYMAV.js → docs-4JRHTLUZ.js} +3 -3
- package/dist/{engine-EG4EH4IX.js → engine-3G3VIM6L.js} +1 -1
- package/dist/{entropy-5USWKLVS.js → entropy-G6CZ2A6P.js} +2 -2
- package/dist/{feedback-UTBXZZHF.js → feedback-QYKQ65HB.js} +1 -1
- package/dist/{generate-agent-definitions-3PM5EU7V.js → generate-agent-definitions-SAAOAPT4.js} +3 -3
- package/dist/index.d.ts +25 -4
- package/dist/index.js +18 -18
- package/dist/{loader-ZPALXIVR.js → loader-VCOK3PF7.js} +1 -1
- package/dist/{mcp-362EZHF4.js → mcp-YENEPHBW.js} +13 -13
- package/dist/{performance-OQAFMJUD.js → performance-UBCFI2UP.js} +4 -2
- package/dist/{review-pipeline-C4GCFVGP.js → review-pipeline-IQAVCWAX.js} +1 -1
- package/dist/{runtime-7YLVK453.js → runtime-PYFFIESU.js} +1 -1
- package/dist/{security-PZOX7AQS.js → security-ZDADTPYW.js} +1 -1
- package/dist/{skill-executor-XZLYZYAK.js → skill-executor-XEVDGXUM.js} +2 -2
- package/dist/{validate-FD3Z6VJD.js → validate-VRTUHALQ.js} +2 -2
- package/dist/{validate-cross-check-WNJM6H2D.js → validate-cross-check-4Y6NHNK3.js} +1 -1
- package/package.json +8 -5
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# Harness Infrastructure as Code
|
|
2
|
+
|
|
3
|
+
> Terraform, CloudFormation, and Pulumi analysis. Module structure, state management, drift prevention, and security posture for infrastructure definitions.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When reviewing or designing Terraform, CloudFormation, or Pulumi configurations
|
|
8
|
+
- When auditing IaC module structure, naming conventions, and state management
|
|
9
|
+
- On PRs that modify infrastructure definitions or add new cloud resources
|
|
10
|
+
- NOT for CI/CD pipeline configuration (use harness-deployment)
|
|
11
|
+
- NOT for container orchestration (use harness-containerization)
|
|
12
|
+
- NOT for application-level security (use harness-security-review)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DETECT -- Identify IaC Tool and Structure
|
|
17
|
+
|
|
18
|
+
1. **Detect IaC tooling.** Scan the project for infrastructure definitions:
|
|
19
|
+
- `*.tf` files -- Terraform (HCL)
|
|
20
|
+
- `terraform/` directory with `.terraform.lock.hcl`
|
|
21
|
+
- `cloudformation/`, `*.template.yaml`, `*.template.json` -- CloudFormation
|
|
22
|
+
- `Pulumi.yaml`, `Pulumi.*.yaml` -- Pulumi
|
|
23
|
+
- `cdk.json`, `cdk.out/` -- AWS CDK
|
|
24
|
+
- `infrastructure/`, `infra/` -- common IaC directories
|
|
25
|
+
|
|
26
|
+
2. **Identify provider and backend.** Parse configuration for:
|
|
27
|
+
- Cloud providers (AWS, GCP, Azure) and their versions
|
|
28
|
+
- State backend (S3, GCS, Azure Blob, Terraform Cloud, local)
|
|
29
|
+
- Provider authentication method (environment variables, profiles, OIDC)
|
|
30
|
+
- Lock file presence and provider version constraints
|
|
31
|
+
|
|
32
|
+
3. **Map module structure.** Build a dependency tree of modules:
|
|
33
|
+
- Root modules and their child module references
|
|
34
|
+
- Module source types (local path, registry, git)
|
|
35
|
+
- Module versioning (pinned vs. unpinned)
|
|
36
|
+
- Input variables and output values per module
|
|
37
|
+
- Shared modules used across multiple root configurations
|
|
38
|
+
|
|
39
|
+
4. **Detect environment separation.** Identify how environments are managed:
|
|
40
|
+
- Workspaces (Terraform workspaces)
|
|
41
|
+
- Directory-per-environment (`environments/dev/`, `environments/prod/`)
|
|
42
|
+
- Variable files per environment (`terraform.tfvars`, `prod.tfvars`)
|
|
43
|
+
- Backend configuration per environment
|
|
44
|
+
|
|
45
|
+
5. **Present detection summary:**
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
IaC Detection:
|
|
49
|
+
Tool: Terraform v1.7
|
|
50
|
+
Provider: AWS (us-east-1, us-west-2)
|
|
51
|
+
Backend: S3 with DynamoDB locking
|
|
52
|
+
Modules: 8 local, 3 registry
|
|
53
|
+
Environments: dev, staging, prod (directory-per-env)
|
|
54
|
+
State files: 3 (one per environment)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Phase 2: ANALYZE -- Evaluate Patterns and Anti-Patterns
|
|
60
|
+
|
|
61
|
+
1. **Check state management.** Verify state is properly configured:
|
|
62
|
+
- Remote backend with locking (not local state for shared infrastructure)
|
|
63
|
+
- State encryption at rest enabled
|
|
64
|
+
- State file does not contain secrets in plain text
|
|
65
|
+
- State is segmented per environment (no single state file for all environments)
|
|
66
|
+
- Backend configuration uses variables, not hardcoded values
|
|
67
|
+
|
|
68
|
+
2. **Evaluate module design.** Check modules for:
|
|
69
|
+
- Single responsibility (one module does one thing)
|
|
70
|
+
- Input validation (variable validation blocks or type constraints)
|
|
71
|
+
- Output completeness (downstream consumers can get what they need)
|
|
72
|
+
- No hardcoded values that should be variables
|
|
73
|
+
- README or documentation for each module
|
|
74
|
+
- Consistent naming conventions across modules
|
|
75
|
+
|
|
76
|
+
3. **Check resource naming and tagging.** Verify:
|
|
77
|
+
- Resources follow a consistent naming convention (e.g., `{project}-{env}-{resource}`)
|
|
78
|
+
- Required tags are present on all taggable resources (environment, team, cost-center)
|
|
79
|
+
- Tag values are consistent (no mix of "prod" and "production")
|
|
80
|
+
- Names do not contain environment-specific values in shared modules
|
|
81
|
+
|
|
82
|
+
4. **Analyze dependency management.** Check for:
|
|
83
|
+
- Provider version constraints (required_providers block)
|
|
84
|
+
- Module version pinning (exact version or range)
|
|
85
|
+
- Lock file committed to version control
|
|
86
|
+
- No circular dependencies between modules
|
|
87
|
+
- Implicit dependencies are made explicit with depends_on where needed
|
|
88
|
+
|
|
89
|
+
5. **Check for common anti-patterns:**
|
|
90
|
+
- Monolithic root modules (everything in one configuration)
|
|
91
|
+
- Hardcoded AMI IDs, account numbers, or region values
|
|
92
|
+
- Resources created outside of IaC (drift risk)
|
|
93
|
+
- Overly permissive IAM policies (wildcards on actions or resources)
|
|
94
|
+
- Missing lifecycle rules (prevent_destroy on critical resources)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### Phase 3: DESIGN -- Recommend Structure and Patterns
|
|
99
|
+
|
|
100
|
+
1. **Recommend module decomposition.** If monolithic configurations are detected:
|
|
101
|
+
- Propose a module hierarchy based on service boundaries
|
|
102
|
+
- Separate networking, compute, storage, and security into distinct modules
|
|
103
|
+
- Design shared modules for common patterns (e.g., tagged S3 bucket, VPC)
|
|
104
|
+
- Provide module interface design (inputs, outputs)
|
|
105
|
+
|
|
106
|
+
2. **Design state management strategy.** Recommend:
|
|
107
|
+
- One state file per environment per service
|
|
108
|
+
- Remote backend with encryption and locking
|
|
109
|
+
- State import plan for any resources created outside IaC
|
|
110
|
+
- Cross-state data sharing via `terraform_remote_state` or SSM parameters
|
|
111
|
+
|
|
112
|
+
3. **Recommend drift detection workflow.** Design a process to catch manual changes:
|
|
113
|
+
- Scheduled `terraform plan` in CI to detect drift
|
|
114
|
+
- Alert on any planned changes that were not initiated by a PR
|
|
115
|
+
- Runbook for reconciling detected drift (import vs. revert)
|
|
116
|
+
- Tag resources as IaC-managed for auditability
|
|
117
|
+
|
|
118
|
+
4. **Design environment promotion.** Recommend a workflow for infrastructure changes:
|
|
119
|
+
- Changes applied to dev first, then promoted to staging, then production
|
|
120
|
+
- Variable files per environment with appropriate overrides
|
|
121
|
+
- Approval gates before production applies
|
|
122
|
+
- Plan output reviewed as part of PR process
|
|
123
|
+
|
|
124
|
+
5. **Recommend security hardening.** For each provider:
|
|
125
|
+
- Least-privilege IAM roles for IaC execution
|
|
126
|
+
- No inline policies (use managed policies or policy documents)
|
|
127
|
+
- Encryption enabled by default on all storage resources
|
|
128
|
+
- Network security groups with explicit deny rules
|
|
129
|
+
- Sensitive variables marked with `sensitive = true`
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### Phase 4: VALIDATE -- Verify Configuration Correctness
|
|
134
|
+
|
|
135
|
+
1. **Run static analysis.** Execute available validation tools:
|
|
136
|
+
- Terraform: `terraform validate`, `terraform fmt -check`
|
|
137
|
+
- CloudFormation: `cfn-lint` or `aws cloudformation validate-template`
|
|
138
|
+
- Pulumi: type checking via the chosen language runtime
|
|
139
|
+
- CDK: `cdk synth` to verify template generation
|
|
140
|
+
- General: `tflint`, `checkov`, or `tfsec` for security checks
|
|
141
|
+
|
|
142
|
+
2. **Verify variable completeness.** For each root module:
|
|
143
|
+
- All declared variables have descriptions
|
|
144
|
+
- Required variables have no default values
|
|
145
|
+
- Optional variables have sensible defaults
|
|
146
|
+
- Variable types are specific (not `any`)
|
|
147
|
+
- Validation blocks exist for constrained values (e.g., allowed regions)
|
|
148
|
+
|
|
149
|
+
3. **Check plan safety.** If a plan output is available:
|
|
150
|
+
- No unexpected resource deletions
|
|
151
|
+
- No changes to resources marked with `prevent_destroy`
|
|
152
|
+
- Replacements are expected (not caused by force-new arguments)
|
|
153
|
+
- Plan matches the intended change described in the PR
|
|
154
|
+
|
|
155
|
+
4. **Verify security posture.** Run security-focused checks:
|
|
156
|
+
- No public S3 buckets or storage accounts
|
|
157
|
+
- No security groups allowing 0.0.0.0/0 on sensitive ports
|
|
158
|
+
- Encryption enabled on RDS, EBS, S3, and other storage
|
|
159
|
+
- IAM policies follow least privilege
|
|
160
|
+
- No credentials or secrets in variable defaults or outputs
|
|
161
|
+
|
|
162
|
+
5. **Generate validation report:**
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
IaC Validation: [PASS/WARN/FAIL]
|
|
166
|
+
|
|
167
|
+
Format check: PASS (all files formatted)
|
|
168
|
+
Validate: PASS (no syntax errors)
|
|
169
|
+
Security scan: WARN (2 findings)
|
|
170
|
+
- modules/storage/main.tf: S3 bucket missing server-side encryption
|
|
171
|
+
- modules/network/main.tf: security group allows 0.0.0.0/0 on port 22
|
|
172
|
+
Module design: WARN (3 modules missing input validation)
|
|
173
|
+
State management: PASS (remote backend with locking)
|
|
174
|
+
|
|
175
|
+
Recommendations:
|
|
176
|
+
1. Add aws_s3_bucket_server_side_encryption_configuration resource
|
|
177
|
+
2. Restrict SSH access to VPN CIDR range
|
|
178
|
+
3. Add variable validation blocks to network, compute, and storage modules
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Harness Integration
|
|
184
|
+
|
|
185
|
+
- **`harness skill run harness-infrastructure-as-code`** -- Primary invocation for IaC analysis.
|
|
186
|
+
- **`harness validate`** -- Run after configuration changes to verify project health.
|
|
187
|
+
- **`harness check-deps`** -- Verify IaC tool dependencies are installed.
|
|
188
|
+
- **`emit_interaction`** -- Present design recommendations and gather decisions on module structure.
|
|
189
|
+
|
|
190
|
+
## Success Criteria
|
|
191
|
+
|
|
192
|
+
- IaC tooling, provider, and backend are correctly identified
|
|
193
|
+
- Module structure is mapped with dependency relationships
|
|
194
|
+
- State management is verified as remote, encrypted, and locked
|
|
195
|
+
- Resource naming and tagging follow consistent conventions
|
|
196
|
+
- Security posture is evaluated with no critical findings unaddressed
|
|
197
|
+
- Static analysis tools pass without errors
|
|
198
|
+
|
|
199
|
+
## Examples
|
|
200
|
+
|
|
201
|
+
### Example: Terraform AWS Multi-Environment Setup
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
Phase 1: DETECT
|
|
205
|
+
Tool: Terraform v1.6.4
|
|
206
|
+
Provider: AWS (hashicorp/aws ~> 5.0)
|
|
207
|
+
Backend: S3 (us-east-1) with DynamoDB locking
|
|
208
|
+
Modules: 5 local (vpc, ecs, rds, s3, iam), 2 registry (datadog, cloudwatch)
|
|
209
|
+
Environments: dev, staging, prod (directory-per-env with shared modules)
|
|
210
|
+
|
|
211
|
+
Phase 2: ANALYZE
|
|
212
|
+
State management: PASS (remote, encrypted, locked, per-env)
|
|
213
|
+
Module design: WARN
|
|
214
|
+
- modules/ecs has 450 lines -- recommend splitting into ecs-cluster
|
|
215
|
+
and ecs-service modules
|
|
216
|
+
- modules/rds missing variable validation for instance_class
|
|
217
|
+
Naming: PASS (consistent {project}-{env}-{resource} pattern)
|
|
218
|
+
Tags: WARN (cost-center tag missing on 3 resources)
|
|
219
|
+
Anti-patterns: 1 hardcoded AMI in modules/ecs/main.tf
|
|
220
|
+
|
|
221
|
+
Phase 3: DESIGN
|
|
222
|
+
1. Split modules/ecs into ecs-cluster and ecs-service
|
|
223
|
+
2. Add data source for AMI lookup instead of hardcoded value
|
|
224
|
+
3. Add variable validation: instance_class must be db.t3.* or db.r6g.*
|
|
225
|
+
4. Add cost-center tag to default_tags in provider configuration
|
|
226
|
+
5. Add scheduled terraform plan for drift detection in CI
|
|
227
|
+
|
|
228
|
+
Phase 4: VALIDATE
|
|
229
|
+
terraform fmt: PASS
|
|
230
|
+
terraform validate: PASS
|
|
231
|
+
tfsec: WARN (2 findings -- see above)
|
|
232
|
+
checkov: PASS
|
|
233
|
+
Result: WARN -- 5 improvements recommended, no blocking issues
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Example: CloudFormation with CDK
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Phase 1: DETECT
|
|
240
|
+
Tool: AWS CDK v2.120 (TypeScript)
|
|
241
|
+
Provider: AWS (us-west-2)
|
|
242
|
+
Backend: CloudFormation (managed by CDK)
|
|
243
|
+
Stacks: 3 (NetworkStack, ComputeStack, StorageStack)
|
|
244
|
+
Environments: dev and prod via CDK context
|
|
245
|
+
|
|
246
|
+
Phase 2: ANALYZE
|
|
247
|
+
Stack design: PASS (clean separation by concern)
|
|
248
|
+
Cross-stack references: PASS (using CfnOutput and Fn::ImportValue)
|
|
249
|
+
Security: WARN
|
|
250
|
+
- ComputeStack: EC2 instance has public IP and open SSH
|
|
251
|
+
- StorageStack: DynamoDB table missing point-in-time recovery
|
|
252
|
+
CDK constructs: Using L2 constructs (good -- higher abstraction)
|
|
253
|
+
|
|
254
|
+
Phase 3: DESIGN
|
|
255
|
+
1. Add bastion host pattern instead of direct SSH to EC2
|
|
256
|
+
2. Enable point-in-time recovery on DynamoDB table
|
|
257
|
+
3. Add cdk-nag for automated security checks in synthesis
|
|
258
|
+
4. Add stack-level tags via Tags.of(stack).add()
|
|
259
|
+
|
|
260
|
+
Phase 4: VALIDATE
|
|
261
|
+
cdk synth: PASS (3 templates generated)
|
|
262
|
+
cfn-lint: PASS (all templates valid)
|
|
263
|
+
Security: WARN (2 findings)
|
|
264
|
+
Result: WARN -- 2 security improvements needed
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Gates
|
|
268
|
+
|
|
269
|
+
- **No local state for shared infrastructure.** Terraform configurations managing shared resources must use a remote backend with locking. Local state is blocking for any non-experimental configuration.
|
|
270
|
+
- **No unpinned provider versions.** Provider version constraints must be explicit. Using `>=` without an upper bound or omitting version constraints entirely is a blocking finding.
|
|
271
|
+
- **No public access to sensitive resources.** S3 buckets, databases, or storage accounts with public access enabled are blocking security findings.
|
|
272
|
+
- **No credentials in IaC files.** Hardcoded access keys, passwords, or tokens in Terraform variables, CloudFormation parameters, or Pulumi configuration are blocking findings.
|
|
273
|
+
|
|
274
|
+
## Escalation
|
|
275
|
+
|
|
276
|
+
- **When state is corrupted or diverged:** Do not attempt automatic recovery. Report the state of divergence, recommend `terraform state pull` for backup, and advise manual reconciliation with a plan review before any apply.
|
|
277
|
+
- **When resources exist outside IaC management:** Recommend a phased import strategy. Provide `terraform import` commands for each resource and note that import does not generate configuration -- the HCL must be written manually.
|
|
278
|
+
- **When module versions are significantly outdated:** Present the version gap and changelog summary. If breaking changes exist, recommend a separate PR for the upgrade with a plan review before applying.
|
|
279
|
+
- **When IaC tool version conflicts exist between team members:** Recommend pinning the tool version in `.terraform-version` (tfenv) or `Pulumi.yaml` and adding version checks to CI.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: harness-infrastructure-as-code
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Terraform, CloudFormation, Pulumi patterns and IaC best practices
|
|
4
|
+
cognitive_mode: advisory-guide
|
|
5
|
+
tier: 3
|
|
6
|
+
internal: false
|
|
7
|
+
keywords:
|
|
8
|
+
- Terraform
|
|
9
|
+
- CloudFormation
|
|
10
|
+
- Pulumi
|
|
11
|
+
- IaC
|
|
12
|
+
- infrastructure
|
|
13
|
+
- HCL
|
|
14
|
+
- CDK
|
|
15
|
+
- AWS
|
|
16
|
+
- GCP
|
|
17
|
+
- Azure
|
|
18
|
+
- state
|
|
19
|
+
- module
|
|
20
|
+
- provider
|
|
21
|
+
- resource
|
|
22
|
+
stack_signals:
|
|
23
|
+
- "*.tf"
|
|
24
|
+
- "terraform/"
|
|
25
|
+
- "cloudformation/"
|
|
26
|
+
- "*.template.yaml"
|
|
27
|
+
- "*.template.json"
|
|
28
|
+
- "Pulumi.yaml"
|
|
29
|
+
- "cdk.json"
|
|
30
|
+
- "infrastructure/"
|
|
31
|
+
triggers:
|
|
32
|
+
- manual
|
|
33
|
+
- on_new_feature
|
|
34
|
+
- on_pr
|
|
35
|
+
platforms:
|
|
36
|
+
- claude-code
|
|
37
|
+
- gemini-cli
|
|
38
|
+
tools:
|
|
39
|
+
- Bash
|
|
40
|
+
- Read
|
|
41
|
+
- Write
|
|
42
|
+
- Edit
|
|
43
|
+
- Glob
|
|
44
|
+
- Grep
|
|
45
|
+
- emit_interaction
|
|
46
|
+
cli:
|
|
47
|
+
command: harness skill run harness-infrastructure-as-code
|
|
48
|
+
args:
|
|
49
|
+
- name: path
|
|
50
|
+
description: Project root path
|
|
51
|
+
required: false
|
|
52
|
+
- name: provider
|
|
53
|
+
description: Cloud provider context (aws, gcp, azure)
|
|
54
|
+
required: false
|
|
55
|
+
- name: tool
|
|
56
|
+
description: IaC tool to focus on (terraform, cloudformation, pulumi, cdk)
|
|
57
|
+
required: false
|
|
58
|
+
mcp:
|
|
59
|
+
tool: run_skill
|
|
60
|
+
input:
|
|
61
|
+
skill: harness-infrastructure-as-code
|
|
62
|
+
path: string
|
|
63
|
+
type: rigid
|
|
64
|
+
phases:
|
|
65
|
+
- name: detect
|
|
66
|
+
description: Identify IaC tool, provider, and module structure
|
|
67
|
+
required: true
|
|
68
|
+
- name: analyze
|
|
69
|
+
description: Evaluate resource definitions, state management, and module patterns
|
|
70
|
+
required: true
|
|
71
|
+
- name: design
|
|
72
|
+
description: Recommend module decomposition, naming, and drift prevention
|
|
73
|
+
required: true
|
|
74
|
+
- name: validate
|
|
75
|
+
description: Verify configuration correctness and security posture
|
|
76
|
+
required: true
|
|
77
|
+
state:
|
|
78
|
+
persistent: false
|
|
79
|
+
files: []
|
|
80
|
+
depends_on: []
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Harness Integration Test
|
|
2
|
+
|
|
3
|
+
> Service boundary testing, API contract verification, and consumer-driven contract validation. Ensures services communicate correctly without requiring full end-to-end infrastructure.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- Testing API endpoints with real HTTP requests against a running service
|
|
8
|
+
- Validating consumer-driven contracts between microservices (Pact, Spring Cloud Contract)
|
|
9
|
+
- Verifying database interactions through repository or data access layers
|
|
10
|
+
- NOT when testing pure business logic with no I/O (use unit tests or harness-tdd instead)
|
|
11
|
+
- NOT when testing full user flows through a browser (use harness-e2e instead)
|
|
12
|
+
- NOT when performing load or stress testing on APIs (use harness-load-testing instead)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DISCOVER -- Map Service Boundaries and Dependencies
|
|
17
|
+
|
|
18
|
+
1. **Identify service boundaries.** Scan the project structure for:
|
|
19
|
+
- API route definitions (Express routers, FastAPI endpoints, Spring controllers, Go HTTP handlers)
|
|
20
|
+
- Service client code (HTTP clients, gRPC stubs, message queue publishers/consumers)
|
|
21
|
+
- Shared type definitions or API schemas (OpenAPI specs, proto files, GraphQL schemas)
|
|
22
|
+
|
|
23
|
+
2. **Map inter-service dependencies.** For each service, catalog:
|
|
24
|
+
- Upstream dependencies: services this service calls
|
|
25
|
+
- Downstream consumers: services that call this service
|
|
26
|
+
- Shared resources: databases, message queues, caches
|
|
27
|
+
|
|
28
|
+
3. **Inventory existing integration tests.** Glob for test files in `tests/integration/`, `__integration__/`, `tests/api/`, and `contract-tests/`. Classify by type:
|
|
29
|
+
- API tests: send HTTP requests and assert responses
|
|
30
|
+
- Contract tests: verify provider/consumer agreements
|
|
31
|
+
- Repository tests: test data access against a real database
|
|
32
|
+
|
|
33
|
+
4. **Identify coverage gaps.** Cross-reference discovered endpoints and service boundaries against existing tests. Flag untested:
|
|
34
|
+
- API endpoints with no request/response validation
|
|
35
|
+
- Service boundaries with no contract tests
|
|
36
|
+
- Error scenarios (4xx responses, timeout handling, retry behavior)
|
|
37
|
+
|
|
38
|
+
5. **Select test strategy.** Based on the architecture:
|
|
39
|
+
- Monolith: API tests with supertest/httptest against the running application
|
|
40
|
+
- Microservices: consumer-driven contract tests with Pact plus API tests per service
|
|
41
|
+
- Event-driven: message contract tests plus async handler integration tests
|
|
42
|
+
|
|
43
|
+
### Phase 2: MOCK -- Configure Test Doubles and Infrastructure
|
|
44
|
+
|
|
45
|
+
1. **Set up test database.** Choose the appropriate strategy:
|
|
46
|
+
- **Testcontainers:** Spin up a real database in Docker for each test suite. Preferred for PostgreSQL, MySQL, MongoDB.
|
|
47
|
+
- **In-memory database:** SQLite in-memory for lightweight tests. Only when schema compatibility is confirmed.
|
|
48
|
+
- **Transaction rollback:** Wrap each test in a transaction and roll back. Fast but requires careful connection management.
|
|
49
|
+
|
|
50
|
+
2. **Configure mock services for external dependencies.** For each upstream dependency:
|
|
51
|
+
- Create a mock server using the framework's built-in tools (Pact mock, WireMock, nock, MSW)
|
|
52
|
+
- Define request/response pairs from the API contract or OpenAPI spec
|
|
53
|
+
- Configure realistic error responses (500, 503, timeout) for error path testing
|
|
54
|
+
|
|
55
|
+
3. **Set up contract broker (if using Pact).** Configure:
|
|
56
|
+
- Pact broker URL and authentication
|
|
57
|
+
- Consumer and provider version tagging strategy
|
|
58
|
+
- Webhook configuration for provider verification on deploy
|
|
59
|
+
|
|
60
|
+
4. **Create test fixtures and seed data.** Generate:
|
|
61
|
+
- Database seed scripts for required reference data
|
|
62
|
+
- Request/response fixtures for common API payloads
|
|
63
|
+
- Factory functions for building test entities with sensible defaults
|
|
64
|
+
|
|
65
|
+
5. **Verify mock infrastructure starts.** Run a smoke test that:
|
|
66
|
+
- Starts the test database and confirms connectivity
|
|
67
|
+
- Starts mock services and confirms they respond
|
|
68
|
+
- Seeds baseline data and confirms it is queryable
|
|
69
|
+
|
|
70
|
+
### Phase 3: IMPLEMENT -- Write Integration Tests
|
|
71
|
+
|
|
72
|
+
1. **Write API endpoint tests.** For each endpoint, test:
|
|
73
|
+
- Happy path: valid request returns expected response with correct status code and body
|
|
74
|
+
- Validation: invalid input returns 400 with descriptive error messages
|
|
75
|
+
- Authentication: unauthenticated requests return 401, unauthorized return 403
|
|
76
|
+
- Not found: requests for non-existent resources return 404
|
|
77
|
+
- Edge cases: empty collections, pagination boundaries, large payloads
|
|
78
|
+
|
|
79
|
+
2. **Write consumer-driven contract tests (when applicable).** For each consumer-provider pair:
|
|
80
|
+
- Consumer side: define interactions (request/response pairs) the consumer expects
|
|
81
|
+
- Provider side: verify the provider satisfies all consumer contracts
|
|
82
|
+
- Use Pact matchers for flexible verification (type matching, regex, array-like)
|
|
83
|
+
|
|
84
|
+
3. **Write repository/data access tests.** For each data access layer:
|
|
85
|
+
- CRUD operations with valid data
|
|
86
|
+
- Constraint violations (unique, foreign key, not-null)
|
|
87
|
+
- Query correctness (filters, sorting, pagination)
|
|
88
|
+
- Transaction behavior (isolation, rollback on error)
|
|
89
|
+
|
|
90
|
+
4. **Write error handling and resilience tests.** Verify:
|
|
91
|
+
- Timeout behavior: service responds within SLA when dependency is slow
|
|
92
|
+
- Retry logic: transient failures trigger retries with backoff
|
|
93
|
+
- Circuit breaker: repeated failures open the circuit and return fallback
|
|
94
|
+
- Graceful degradation: partial dependency failure does not crash the service
|
|
95
|
+
|
|
96
|
+
5. **Organize tests by execution speed.** Tag or separate:
|
|
97
|
+
- Fast integration tests (in-memory mocks, < 5 seconds): run on every commit
|
|
98
|
+
- Slow integration tests (testcontainers, external services, > 5 seconds): run on PR
|
|
99
|
+
|
|
100
|
+
### Phase 4: VALIDATE -- Execute and Verify Contract Compliance
|
|
101
|
+
|
|
102
|
+
1. **Run the full integration test suite.** Execute all tests with verbose output. Collect:
|
|
103
|
+
- Pass/fail counts per test category (API, contract, repository)
|
|
104
|
+
- Execution time per test and per suite
|
|
105
|
+
- Any tests that require external services to be running
|
|
106
|
+
|
|
107
|
+
2. **Verify contract compliance.** If using Pact:
|
|
108
|
+
- Publish consumer pacts to the broker
|
|
109
|
+
- Run provider verification against published pacts
|
|
110
|
+
- Confirm the can-i-deploy check passes for the target environment
|
|
111
|
+
|
|
112
|
+
3. **Validate test isolation.** Run tests in random order (if the framework supports it). Any test that fails only when run after a specific other test has a shared-state bug. Fix immediately.
|
|
113
|
+
|
|
114
|
+
4. **Run `harness validate`.** Confirm the project passes all harness checks including the new integration test infrastructure.
|
|
115
|
+
|
|
116
|
+
5. **Generate coverage report.** Summarize:
|
|
117
|
+
- Endpoints tested vs. total endpoints discovered
|
|
118
|
+
- Contract coverage: consumer-provider pairs with verified contracts
|
|
119
|
+
- Error scenarios covered vs. identified
|
|
120
|
+
- Recommended next steps for remaining gaps
|
|
121
|
+
|
|
122
|
+
### Graph Refresh
|
|
123
|
+
|
|
124
|
+
If a knowledge graph exists at `.harness/graph/`, refresh it after code changes to keep graph queries accurate:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
harness scan [path]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Harness Integration
|
|
131
|
+
|
|
132
|
+
- **`harness validate`** -- Run in VALIDATE phase after all integration tests are implemented. Confirms project-wide health.
|
|
133
|
+
- **`harness check-deps`** -- Run after MOCK phase to verify test infrastructure dependencies do not leak into production bundles.
|
|
134
|
+
- **`emit_interaction`** -- Used at checkpoints to present contract verification results and coverage gaps to the human.
|
|
135
|
+
- **Grep** -- Used in DISCOVER phase to find route definitions, HTTP client usage, and service boundary patterns.
|
|
136
|
+
- **Glob** -- Used to catalog existing integration tests and contract files.
|
|
137
|
+
|
|
138
|
+
## Success Criteria
|
|
139
|
+
|
|
140
|
+
- Every API endpoint has at least one integration test covering the happy path
|
|
141
|
+
- Every consumer-provider boundary has a verified contract (when using microservices)
|
|
142
|
+
- Error scenarios (400, 401, 403, 404, 500, timeout) are tested for all public endpoints
|
|
143
|
+
- All integration tests pass with test doubles -- no dependency on external staging environments for CI
|
|
144
|
+
- Test isolation is verified: tests pass in any execution order
|
|
145
|
+
- `harness validate` passes with the integration test suite in place
|
|
146
|
+
|
|
147
|
+
## Examples
|
|
148
|
+
|
|
149
|
+
### Example: Express API with Supertest and Testcontainers
|
|
150
|
+
|
|
151
|
+
**DISCOVER output:**
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Framework: Express 4.18 with TypeScript
|
|
155
|
+
Database: PostgreSQL via Prisma
|
|
156
|
+
Endpoints: 14 routes across 4 controllers (users, projects, tasks, auth)
|
|
157
|
+
Existing tests: 3 integration tests in tests/integration/ (auth only)
|
|
158
|
+
Coverage gaps: projects CRUD, tasks filtering, user profile update
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**IMPLEMENT -- API endpoint test with supertest:**
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// tests/integration/projects.test.ts
|
|
165
|
+
import request from 'supertest';
|
|
166
|
+
import { app } from '../../src/app';
|
|
167
|
+
import { prisma } from '../../src/db';
|
|
168
|
+
import { createTestUser, generateAuthToken } from '../helpers/auth';
|
|
169
|
+
|
|
170
|
+
describe('POST /api/projects', () => {
|
|
171
|
+
let authToken: string;
|
|
172
|
+
|
|
173
|
+
beforeAll(async () => {
|
|
174
|
+
const user = await createTestUser(prisma);
|
|
175
|
+
authToken = generateAuthToken(user.id);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
afterAll(async () => {
|
|
179
|
+
await prisma.project.deleteMany();
|
|
180
|
+
await prisma.user.deleteMany();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('creates a project with valid data', async () => {
|
|
184
|
+
const response = await request(app)
|
|
185
|
+
.post('/api/projects')
|
|
186
|
+
.set('Authorization', `Bearer ${authToken}`)
|
|
187
|
+
.send({ name: 'Test Project', description: 'Integration test' });
|
|
188
|
+
|
|
189
|
+
expect(response.status).toBe(201);
|
|
190
|
+
expect(response.body).toMatchObject({
|
|
191
|
+
name: 'Test Project',
|
|
192
|
+
description: 'Integration test',
|
|
193
|
+
});
|
|
194
|
+
expect(response.body.id).toBeDefined();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('returns 400 when name is missing', async () => {
|
|
198
|
+
const response = await request(app)
|
|
199
|
+
.post('/api/projects')
|
|
200
|
+
.set('Authorization', `Bearer ${authToken}`)
|
|
201
|
+
.send({ description: 'No name' });
|
|
202
|
+
|
|
203
|
+
expect(response.status).toBe(400);
|
|
204
|
+
expect(response.body.errors).toContainEqual(expect.objectContaining({ field: 'name' }));
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('returns 401 without auth token', async () => {
|
|
208
|
+
const response = await request(app).post('/api/projects').send({ name: 'Unauthorized' });
|
|
209
|
+
|
|
210
|
+
expect(response.status).toBe(401);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Example: Pact Consumer-Driven Contract Test
|
|
216
|
+
|
|
217
|
+
**IMPLEMENT -- Consumer side (frontend):**
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// contract-tests/consumer/project-service.pact.ts
|
|
221
|
+
import { PactV3, MatchersV3 } from '@pact-foundation/pact';
|
|
222
|
+
import { ProjectClient } from '../../src/clients/project-client';
|
|
223
|
+
|
|
224
|
+
const { like, eachLike, uuid } = MatchersV3;
|
|
225
|
+
|
|
226
|
+
const provider = new PactV3({
|
|
227
|
+
consumer: 'Dashboard',
|
|
228
|
+
provider: 'ProjectService',
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
describe('ProjectService contract', () => {
|
|
232
|
+
it('returns a list of projects', async () => {
|
|
233
|
+
await provider
|
|
234
|
+
.given('projects exist for user')
|
|
235
|
+
.uponReceiving('a request for user projects')
|
|
236
|
+
.withRequest({
|
|
237
|
+
method: 'GET',
|
|
238
|
+
path: '/api/projects',
|
|
239
|
+
headers: { Authorization: like('Bearer token-123') },
|
|
240
|
+
})
|
|
241
|
+
.willRespondWith({
|
|
242
|
+
status: 200,
|
|
243
|
+
body: eachLike({
|
|
244
|
+
id: uuid(),
|
|
245
|
+
name: like('Project Alpha'),
|
|
246
|
+
createdAt: like('2026-01-15T10:30:00Z'),
|
|
247
|
+
}),
|
|
248
|
+
})
|
|
249
|
+
.executeTest(async (mockServer) => {
|
|
250
|
+
const client = new ProjectClient(mockServer.url);
|
|
251
|
+
const projects = await client.listProjects('token-123');
|
|
252
|
+
expect(projects).toHaveLength(1);
|
|
253
|
+
expect(projects[0].name).toBe('Project Alpha');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Gates
|
|
260
|
+
|
|
261
|
+
- **No integration tests that require external staging environments for CI.** Every integration test must run with local test doubles (mocks, containers, in-memory databases). Tests that fail without a staging VPN are not integration tests -- they are environment tests.
|
|
262
|
+
- **No shared mutable state between tests.** Each test must set up and tear down its own data. If tests fail when run in random order, shared state exists. Fix it before proceeding.
|
|
263
|
+
- **No testing implementation details.** Integration tests assert on API contracts (status codes, response shapes, headers) and observable data changes -- not on internal function calls or database column values that are not part of the public contract.
|
|
264
|
+
- **Contract changes must be coordinated.** If a provider contract test reveals a breaking change, do not silently update the consumer expectation. Flag it as a coordination point between teams.
|
|
265
|
+
|
|
266
|
+
## Escalation
|
|
267
|
+
|
|
268
|
+
- **When a service dependency has no API documentation or schema:** Cannot write accurate contract tests without knowing the contract. Escalate to the dependency team to provide an OpenAPI spec, proto file, or at minimum a Pact broker with published contracts.
|
|
269
|
+
- **When Testcontainers fails in CI (Docker-in-Docker issues, resource limits):** Fall back to in-memory alternatives where possible. For databases that have no in-memory mode, escalate to DevOps to configure CI runners with Docker support.
|
|
270
|
+
- **When contract verification fails on the provider side:** This indicates a real incompatibility between consumer expectations and provider implementation. Do not adjust the consumer test to match the provider bug. Escalate to the provider team with the failing interaction details.
|
|
271
|
+
- **When integration tests exceed 5 minutes for a single service:** Triage by separating fast tests (mocked dependencies) from slow tests (testcontainers). Run fast tests on every commit, slow tests on PR only.
|