@harness-engineering/cli 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents-md-YTYQDA3P.js +8 -0
- package/dist/{architecture-ESOOE26S.js → architecture-JQZYM4US.js} +4 -4
- package/dist/bin/harness-mcp.js +16 -15
- package/dist/bin/harness.js +31 -30
- package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-L3RADYWO.js} +4 -3
- package/dist/{chunk-WPPDRIJL.js → chunk-3C2MLBPJ.js} +4 -4
- package/dist/chunk-6KTUUFRN.js +217 -0
- package/dist/{chunk-MI5XJQDY.js → chunk-7IP4JIFL.js} +24 -10
- package/dist/{chunk-C2ERUR3L.js → chunk-7MJAPE3Z.js} +165 -49
- package/dist/{chunk-KELT6K6M.js → chunk-ABQHQ6I5.js} +1861 -1418
- package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
- package/dist/{chunk-QPEH2QPG.js → chunk-DBSOCI3G.js} +53 -54
- package/dist/{chunk-MHBMTPW7.js → chunk-ERS5EVUZ.js} +9 -0
- package/dist/{chunk-JSTQ3AWB.js → chunk-FIAPHX37.js} +1 -1
- package/dist/{chunk-2YPZKGAG.js → chunk-FTMXDOR6.js} +1 -1
- package/dist/{chunk-72GHBOL2.js → chunk-GZKSBLQL.js} +1 -1
- package/dist/{chunk-K6XAPGML.js → chunk-H7Y5CKTM.js} +1 -1
- package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
- package/dist/{chunk-LD3DKUK5.js → chunk-NLVUVUGD.js} +1 -1
- package/dist/{chunk-3KOLLWWE.js → chunk-O5OJVPL6.js} +26 -211
- package/dist/{chunk-NKDM3FMH.js → chunk-OD3S2NHN.js} +1 -1
- package/dist/{chunk-5VY23YK3.js → chunk-OSXBPAMK.js} +2 -2
- package/dist/{chunk-MACVXDZK.js → chunk-OXLLOSSR.js} +45 -47
- package/dist/{chunk-GNGELAXY.js → chunk-RCWZBSK5.js} +2 -2
- package/dist/{chunk-PSNN4LWX.js → chunk-S2FXOWOR.js} +3 -3
- package/dist/{chunk-VUCPTQ6G.js → chunk-SD3SQOZ2.js} +1 -1
- package/dist/{chunk-7PZWR4LI.js → chunk-TPOTOBR7.js} +9 -9
- package/dist/{chunk-RZSUJBZZ.js → chunk-XKECDXJS.js} +452 -353
- package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
- package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
- package/dist/{chunk-2VU4MFM3.js → chunk-YPYGXRDR.js} +7 -7
- package/dist/{chunk-Q6AB7W5Z.js → chunk-YQ6KC6TE.js} +1 -1
- package/dist/{chunk-7KQSUZVG.js → chunk-YZD2MRNQ.js} +1528 -1010
- package/dist/ci-workflow-EQZFVX3P.js +8 -0
- package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
- package/dist/{dist-M6BQODWC.js → dist-B26DFXMP.js} +573 -480
- package/dist/{dist-L7LAAQAS.js → dist-DZ63LLUD.js} +1 -1
- package/dist/{dist-WF4C7A4A.js → dist-HWXF2C3R.js} +18 -2
- package/dist/{dist-D4RYGUZE.js → dist-USY2C5JL.js} +3 -1
- package/dist/{docs-BPYCN2DR.js → docs-7ECGYMAV.js} +5 -3
- package/dist/engine-EG4EH4IX.js +8 -0
- package/dist/{entropy-4VDVV5CR.js → entropy-5USWKLVS.js} +3 -3
- package/dist/{feedback-63QB5RCA.js → feedback-UTBXZZHF.js} +1 -1
- package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-3PM5EU7V.js} +5 -5
- package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
- package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-2M2HXDQI.js} +1 -1
- package/dist/index.d.ts +183 -17
- package/dist/index.js +32 -30
- package/dist/loader-ZPALXIVR.js +10 -0
- package/dist/mcp-362EZHF4.js +35 -0
- package/dist/{performance-26BH47O4.js → performance-OQAFMJUD.js} +3 -3
- package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-C4GCFVGP.js} +1 -1
- package/dist/runtime-7YLVK453.js +9 -0
- package/dist/{security-UQFUZXEN.js → security-PZOX7AQS.js} +1 -1
- package/dist/skill-executor-XZLYZYAK.js +8 -0
- package/dist/templates/axum/Cargo.toml.hbs +8 -0
- package/dist/templates/axum/src/main.rs +12 -0
- package/dist/templates/axum/template.json +16 -0
- package/dist/templates/django/manage.py.hbs +19 -0
- package/dist/templates/django/requirements.txt.hbs +1 -0
- package/dist/templates/django/src/settings.py.hbs +44 -0
- package/dist/templates/django/src/urls.py +6 -0
- package/dist/templates/django/src/wsgi.py.hbs +9 -0
- package/dist/templates/django/template.json +21 -0
- package/dist/templates/express/package.json.hbs +15 -0
- package/dist/templates/express/src/app.ts +12 -0
- package/dist/templates/express/src/lib/.gitkeep +0 -0
- package/dist/templates/express/template.json +16 -0
- package/dist/templates/fastapi/requirements.txt.hbs +2 -0
- package/dist/templates/fastapi/src/main.py +8 -0
- package/dist/templates/fastapi/template.json +20 -0
- package/dist/templates/gin/go.mod.hbs +5 -0
- package/dist/templates/gin/main.go +15 -0
- package/dist/templates/gin/template.json +19 -0
- package/dist/templates/go-base/.golangci.yml +16 -0
- package/dist/templates/go-base/AGENTS.md.hbs +35 -0
- package/dist/templates/go-base/go.mod.hbs +3 -0
- package/dist/templates/go-base/harness.config.json.hbs +17 -0
- package/dist/templates/go-base/main.go +7 -0
- package/dist/templates/go-base/template.json +14 -0
- package/dist/templates/java-base/AGENTS.md.hbs +35 -0
- package/dist/templates/java-base/checkstyle.xml +20 -0
- package/dist/templates/java-base/harness.config.json.hbs +16 -0
- package/dist/templates/java-base/pom.xml.hbs +39 -0
- package/dist/templates/java-base/src/main/java/App.java.hbs +5 -0
- package/dist/templates/java-base/template.json +13 -0
- package/dist/templates/nestjs/nest-cli.json +5 -0
- package/dist/templates/nestjs/package.json.hbs +18 -0
- package/dist/templates/nestjs/src/app.module.ts +8 -0
- package/dist/templates/nestjs/src/lib/.gitkeep +0 -0
- package/dist/templates/nestjs/src/main.ts +11 -0
- package/dist/templates/nestjs/template.json +16 -0
- package/dist/templates/nextjs/template.json +15 -1
- package/dist/templates/python-base/.python-version +1 -0
- package/dist/templates/python-base/AGENTS.md.hbs +32 -0
- package/dist/templates/python-base/harness.config.json.hbs +16 -0
- package/dist/templates/python-base/pyproject.toml.hbs +18 -0
- package/dist/templates/python-base/ruff.toml +5 -0
- package/dist/templates/python-base/src/__init__.py +0 -0
- package/dist/templates/python-base/template.json +13 -0
- package/dist/templates/react-vite/index.html +12 -0
- package/dist/templates/react-vite/package.json.hbs +18 -0
- package/dist/templates/react-vite/src/App.tsx +7 -0
- package/dist/templates/react-vite/src/lib/.gitkeep +0 -0
- package/dist/templates/react-vite/src/main.tsx +9 -0
- package/dist/templates/react-vite/template.json +19 -0
- package/dist/templates/react-vite/vite.config.ts +6 -0
- package/dist/templates/rust-base/AGENTS.md.hbs +35 -0
- package/dist/templates/rust-base/Cargo.toml.hbs +6 -0
- package/dist/templates/rust-base/clippy.toml +2 -0
- package/dist/templates/rust-base/harness.config.json.hbs +17 -0
- package/dist/templates/rust-base/src/main.rs +3 -0
- package/dist/templates/rust-base/template.json +14 -0
- package/dist/templates/spring-boot/pom.xml.hbs +50 -0
- package/dist/templates/spring-boot/src/main/java/Application.java.hbs +19 -0
- package/dist/templates/spring-boot/template.json +15 -0
- package/dist/templates/vue/index.html +12 -0
- package/dist/templates/vue/package.json.hbs +16 -0
- package/dist/templates/vue/src/App.vue +7 -0
- package/dist/templates/vue/src/lib/.gitkeep +0 -0
- package/dist/templates/vue/src/main.ts +4 -0
- package/dist/templates/vue/template.json +19 -0
- package/dist/templates/vue/vite.config.ts +6 -0
- package/dist/{validate-N7QJOKFZ.js → validate-FD3Z6VJD.js} +4 -4
- package/dist/validate-cross-check-WNJM6H2D.js +8 -0
- package/package.json +6 -6
- package/dist/agents-md-P2RHSUV7.js +0 -8
- package/dist/ci-workflow-4NYBUG6R.js +0 -8
- package/dist/engine-LXLIWQQ3.js +0 -8
- package/dist/loader-Z2IT7QX3.js +0 -10
- package/dist/mcp-KQHEL5IF.js +0 -34
- package/dist/runtime-PDWD7UIK.js +0 -9
- package/dist/skill-executor-RG45LUO5.js +0 -8
- package/dist/validate-cross-check-EDQ5QGTM.js +0 -8
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Harness Database
|
|
2
|
+
|
|
3
|
+
> Advisory guide for schema design, migrations, ORM patterns, and migration safety. Detects your ORM, analyzes schema health, produces safe migrations, and validates backward compatibility.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When designing a new database schema for a feature
|
|
8
|
+
- When writing or reviewing migration files (Prisma, Drizzle, Knex, TypeORM, Sequelize, raw SQL)
|
|
9
|
+
- When evaluating schema normalization, indexing, or relationship design
|
|
10
|
+
- When checking migration safety before deploying to production
|
|
11
|
+
- When adding a new model or entity to an existing ORM setup
|
|
12
|
+
- When troubleshooting slow queries caused by missing indexes or poor schema design
|
|
13
|
+
- NOT for API endpoint design that exposes database models (use harness-api-design for that)
|
|
14
|
+
- NOT for caching layers in front of the database (use harness-caching for Redis/Memcached strategy)
|
|
15
|
+
- NOT for data validation at the application layer (use harness-data-validation for Zod/Joi schemas)
|
|
16
|
+
- NOT for event sourcing storage patterns (use harness-event-driven for event store design)
|
|
17
|
+
|
|
18
|
+
## Process
|
|
19
|
+
|
|
20
|
+
### Phase 1: DETECT -- Identify Database Engine and ORM
|
|
21
|
+
|
|
22
|
+
1. **Identify the ORM or query builder.** Scan for stack signals: `prisma/schema.prisma` for Prisma, `drizzle.config.*` for Drizzle, `knexfile.*` for Knex, `typeorm.config.*` or `ormconfig.*` for TypeORM, `sequelize.config.*` or `.sequelizerc` for Sequelize. If the `--orm` argument is provided, use that instead of auto-detection.
|
|
23
|
+
|
|
24
|
+
2. **Identify the database engine.** Parse the ORM configuration for the connection string or provider field. Detect PostgreSQL, MySQL, SQLite, MongoDB, or SQL Server. Record the engine version if specified in the config or docker-compose file.
|
|
25
|
+
|
|
26
|
+
3. **Map existing schema.** For Prisma, parse `schema.prisma` for models, relations, and indexes. For Drizzle, parse table definitions in `src/**/schema.*`. For Knex/raw SQL, scan the `migrations/` directory and reconstruct the current schema state. For TypeORM/Sequelize, scan entity or model files.
|
|
27
|
+
|
|
28
|
+
4. **Assess migration state.** List pending migrations (not yet applied). Check for migration gaps (missing sequence numbers) or conflicts (multiple migrations with the same timestamp). WHERE a migration history table is accessible, THEN compare applied vs. on-disk migrations.
|
|
29
|
+
|
|
30
|
+
5. **Catalog existing patterns.** Record naming conventions (snake_case vs camelCase for columns), soft-delete patterns (`deletedAt` column), audit patterns (`createdAt`, `updatedAt`), and relationship styles (join tables vs embedded references). These become the baseline for new schema work.
|
|
31
|
+
|
|
32
|
+
### Phase 2: ANALYZE -- Evaluate Schema Design
|
|
33
|
+
|
|
34
|
+
1. **Check normalization.** Identify denormalized data that may cause update anomalies. Flag tables with repeated groups of columns (e.g., `address1`, `address2`, `address3`) that should be a separate table. Distinguish intentional denormalization (for read performance) from accidental duplication.
|
|
35
|
+
|
|
36
|
+
2. **Evaluate indexing.** For every foreign key column, verify an index exists. For columns used in WHERE clauses or ORDER BY (inferred from query patterns in the codebase), check for supporting indexes. Flag tables with more than 8 indexes (write performance concern) or zero indexes beyond the primary key.
|
|
37
|
+
|
|
38
|
+
3. **Analyze relationships.** Verify that every foreign key has a corresponding ON DELETE action (CASCADE, SET NULL, or RESTRICT). Flag orphan risk where ON DELETE is not specified. Check for circular references that may complicate migrations or deletes.
|
|
39
|
+
|
|
40
|
+
4. **Review data types.** Flag columns using overly broad types (e.g., `TEXT` where `VARCHAR(255)` suffices, `FLOAT` for monetary values instead of `DECIMAL`). Check for missing NOT NULL constraints on fields that should never be null. Verify ENUM types are used appropriately.
|
|
41
|
+
|
|
42
|
+
5. **Check for N+1 query patterns.** Scan ORM usage in the codebase for eager vs lazy loading configuration. WHERE a model is loaded in a loop without includes/joins, THEN flag the N+1 risk with a specific file and line reference.
|
|
43
|
+
|
|
44
|
+
### Phase 3: ADVISE -- Produce Schema Changes and Migrations
|
|
45
|
+
|
|
46
|
+
1. **Generate schema changes.** Based on the feature requirements and phase 2 analysis, produce the schema modifications. For Prisma, write the `schema.prisma` model additions. For Drizzle, write the table definition. For Knex, write the migration `up` and `down` functions. Match the project's existing conventions.
|
|
47
|
+
|
|
48
|
+
2. **Write migration files.** Generate the migration in the ORM's native format. For Prisma: `npx prisma migrate dev --name <name>`. For Drizzle: `npx drizzle-kit generate`. For Knex: `npx knex migrate:make <name>`. Include both `up` (apply) and `down` (rollback) logic.
|
|
49
|
+
|
|
50
|
+
3. **Add indexes for the new schema.** For every foreign key in the new schema, include an index. For columns that will be used in filters or sorting (based on the feature requirements), include a covering index. Justify each index with the expected query pattern.
|
|
51
|
+
|
|
52
|
+
4. **Handle seed data.** WHERE the new schema requires initial data (enum lookup tables, default configuration rows), THEN include a seed script or migration data insertion. Separate structural migrations from data migrations.
|
|
53
|
+
|
|
54
|
+
5. **Produce ORM pattern recommendations.** For the new models, recommend the query patterns: which relations to eager-load by default, where to use transactions, and how to handle optimistic locking if the feature requires concurrent writes.
|
|
55
|
+
|
|
56
|
+
### Phase 4: VALIDATE -- Verify Migration Safety
|
|
57
|
+
|
|
58
|
+
1. **Check backward compatibility.** WHERE the migration drops a column, renames a table, or changes a column type, THEN flag it as a destructive migration. Destructive migrations require a multi-step deployment: add new column, backfill data, deploy code using new column, drop old column.
|
|
59
|
+
|
|
60
|
+
2. **Verify rollback safety.** Run the `down` migration mentally (or actually if a test database is available). Confirm that rolling back does not lose data. WHERE the `up` migration drops a column, THEN the `down` migration cannot restore it -- flag this as an irreversible migration.
|
|
61
|
+
|
|
62
|
+
3. **Check for long-running locks.** WHERE the migration adds a NOT NULL column to a large table without a default value, THEN flag it: the database will lock the table for a full rewrite. Recommend adding the column as nullable first, backfilling, then adding the constraint. WHERE the migration creates an index on a large table, THEN recommend `CREATE INDEX CONCURRENTLY` (PostgreSQL) or equivalent.
|
|
63
|
+
|
|
64
|
+
4. **Validate constraint additions.** WHERE a new UNIQUE constraint is added, THEN verify existing data will not violate it. WHERE a new FOREIGN KEY is added, THEN verify the referenced table and column exist and have an index. WHERE a CHECK constraint is added, THEN verify the expression syntax is valid for the target engine.
|
|
65
|
+
|
|
66
|
+
5. **Run migration dry-run.** WHERE a test database connection is available, THEN run the migration in a transaction and roll it back. Report success or failure. WHERE no database is available, THEN validate the migration SQL syntax against the target engine's dialect.
|
|
67
|
+
|
|
68
|
+
## Harness Integration
|
|
69
|
+
|
|
70
|
+
- **`harness validate`** -- Run after generating migrations to confirm project health
|
|
71
|
+
- **`harness scan`** -- Refresh the knowledge graph after adding new model files
|
|
72
|
+
- **`query_graph`** -- Trace which services depend on a table before modifying it
|
|
73
|
+
- **`get_impact`** -- Understand blast radius when modifying a shared schema table
|
|
74
|
+
|
|
75
|
+
## Success Criteria
|
|
76
|
+
|
|
77
|
+
- ORM and database engine were correctly detected or explicitly specified
|
|
78
|
+
- Existing schema conventions were identified and followed in new designs
|
|
79
|
+
- Every new table has appropriate indexes, constraints, and foreign key actions
|
|
80
|
+
- Migration files include both `up` and `down` logic
|
|
81
|
+
- Destructive migrations are flagged and a safe multi-step deployment plan is provided
|
|
82
|
+
- No long-running table locks are introduced without explicit warning
|
|
83
|
+
- N+1 query risks are identified for new models
|
|
84
|
+
- Migration SQL syntax is valid for the target database engine
|
|
85
|
+
|
|
86
|
+
## Examples
|
|
87
|
+
|
|
88
|
+
### Example: Prisma Schema Addition for a Comments Feature
|
|
89
|
+
|
|
90
|
+
**Input:** "Add a comments model to our Prisma/PostgreSQL app."
|
|
91
|
+
|
|
92
|
+
**Phase 1 -- DETECT:**
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
ORM: Prisma 5.x
|
|
96
|
+
Engine: PostgreSQL 15 (from DATABASE_URL in .env.example)
|
|
97
|
+
Existing models: User, Post, Category
|
|
98
|
+
Conventions: camelCase fields, @updatedAt on all models, soft deletes (deletedAt DateTime?)
|
|
99
|
+
Migrations: 12 applied, 0 pending, no gaps
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Phase 2 -- ANALYZE:**
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Normalization: PASS -- no denormalized data detected
|
|
106
|
+
Indexing: WARN -- Post.authorId has no index (FK without index)
|
|
107
|
+
Relationships: PASS -- all FKs have onDelete specified
|
|
108
|
+
Data types: PASS
|
|
109
|
+
N+1 risk: WARN -- src/routes/posts.ts:42 loads post.author in a loop without include
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Phase 3 -- ADVISE:**
|
|
113
|
+
|
|
114
|
+
```prisma
|
|
115
|
+
model Comment {
|
|
116
|
+
id String @id @default(cuid())
|
|
117
|
+
body String
|
|
118
|
+
postId String
|
|
119
|
+
post Post @relation(fields: [postId], references: [id], onDelete: Cascade)
|
|
120
|
+
authorId String
|
|
121
|
+
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
122
|
+
parentId String?
|
|
123
|
+
parent Comment? @relation("CommentReplies", fields: [parentId], references: [id], onDelete: Cascade)
|
|
124
|
+
replies Comment[] @relation("CommentReplies")
|
|
125
|
+
createdAt DateTime @default(now())
|
|
126
|
+
updatedAt DateTime @updatedAt
|
|
127
|
+
deletedAt DateTime?
|
|
128
|
+
|
|
129
|
+
@@index([postId])
|
|
130
|
+
@@index([authorId])
|
|
131
|
+
@@index([parentId])
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Migration generated: `npx prisma migrate dev --name add-comments`
|
|
136
|
+
|
|
137
|
+
**Phase 4 -- VALIDATE:**
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
Backward compatibility: PASS -- additive change only
|
|
141
|
+
Rollback safety: PASS -- dropping Comment table is safe (no data loss for existing tables)
|
|
142
|
+
Lock risk: PASS -- new table, no ALTER on existing tables
|
|
143
|
+
Constraints: PASS -- all FK targets exist and are indexed
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Example: Knex Migration Safety Check
|
|
147
|
+
|
|
148
|
+
**Input:** "Review this migration that adds a required email column to the users table."
|
|
149
|
+
|
|
150
|
+
**Phase 1 -- DETECT:**
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
ORM: Knex 3.x
|
|
154
|
+
Engine: PostgreSQL 14
|
|
155
|
+
Existing schema: users (id, name, created_at), posts (id, user_id, title, body)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Phase 4 -- VALIDATE (fast-path for --check-migrations):**
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
DANGER: Migration adds NOT NULL column 'email' to users table without a default value.
|
|
162
|
+
|
|
163
|
+
Impact: PostgreSQL will attempt to rewrite the entire users table, acquiring an
|
|
164
|
+
ACCESS EXCLUSIVE lock. If the users table has >10K rows, this will block all
|
|
165
|
+
reads and writes for the duration.
|
|
166
|
+
|
|
167
|
+
Existing rows will fail the NOT NULL constraint, causing the migration to abort.
|
|
168
|
+
|
|
169
|
+
Recommended safe approach (3-step migration):
|
|
170
|
+
|
|
171
|
+
Step 1 (migration: add-email-nullable):
|
|
172
|
+
exports.up = (knex) => knex.schema.alterTable('users', (t) => {
|
|
173
|
+
t.string('email', 255); // nullable first
|
|
174
|
+
t.index('email');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
Step 2 (data migration: backfill-emails):
|
|
178
|
+
exports.up = async (knex) => {
|
|
179
|
+
await knex.raw(`
|
|
180
|
+
UPDATE users SET email = name || '@placeholder.example'
|
|
181
|
+
WHERE email IS NULL
|
|
182
|
+
`);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
Step 3 (migration: enforce-email-not-null):
|
|
186
|
+
exports.up = (knex) => knex.schema.alterTable('users', (t) => {
|
|
187
|
+
t.string('email', 255).notNullable().alter();
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Example: Drizzle Schema for Multi-Tenant SaaS
|
|
192
|
+
|
|
193
|
+
**Input:** "Design a multi-tenant schema with row-level security for our Drizzle/PostgreSQL app."
|
|
194
|
+
|
|
195
|
+
**Phase 1 -- DETECT:**
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
ORM: Drizzle 0.30.x
|
|
199
|
+
Engine: PostgreSQL 16
|
|
200
|
+
Config: drizzle.config.ts (schema: ./src/db/schema.ts)
|
|
201
|
+
Existing tables: none (greenfield)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Phase 3 -- ADVISE:**
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
// src/db/schema.ts
|
|
208
|
+
import { pgTable, text, timestamp, uuid, index } from 'drizzle-orm/pg-core';
|
|
209
|
+
|
|
210
|
+
export const tenants = pgTable('tenants', {
|
|
211
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
212
|
+
name: text('name').notNull(),
|
|
213
|
+
slug: text('slug').notNull().unique(),
|
|
214
|
+
createdAt: timestamp('created_at').defaultNow().notNull(),
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
export const users = pgTable(
|
|
218
|
+
'users',
|
|
219
|
+
{
|
|
220
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
221
|
+
tenantId: uuid('tenant_id')
|
|
222
|
+
.notNull()
|
|
223
|
+
.references(() => tenants.id, { onDelete: 'cascade' }),
|
|
224
|
+
email: text('email').notNull(),
|
|
225
|
+
name: text('name').notNull(),
|
|
226
|
+
role: text('role', { enum: ['owner', 'admin', 'member'] })
|
|
227
|
+
.notNull()
|
|
228
|
+
.default('member'),
|
|
229
|
+
createdAt: timestamp('created_at').defaultNow().notNull(),
|
|
230
|
+
},
|
|
231
|
+
(table) => ({
|
|
232
|
+
tenantIdx: index('users_tenant_id_idx').on(table.tenantId),
|
|
233
|
+
emailTenantUnique: index('users_email_tenant_unique').on(table.email, table.tenantId).unique(),
|
|
234
|
+
})
|
|
235
|
+
);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Row-level security policy:
|
|
239
|
+
|
|
240
|
+
```sql
|
|
241
|
+
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
|
|
242
|
+
CREATE POLICY tenant_isolation ON users
|
|
243
|
+
USING (tenant_id = current_setting('app.current_tenant_id')::uuid);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Gates
|
|
247
|
+
|
|
248
|
+
- **Destructive migrations must not proceed without flagging.** WHERE a migration drops a column, drops a table, renames a column, or changes a column type, THEN the skill must halt and present a safe multi-step alternative. Silently executing destructive DDL against production is not recoverable.
|
|
249
|
+
- **Every foreign key must have an ON DELETE action.** No foreign key may be created without an explicit `onDelete` (CASCADE, SET NULL, or RESTRICT). The database default (NO ACTION) creates orphan rows and constraint violation errors during deletes.
|
|
250
|
+
- **Migration files must include rollback logic.** Every `up` function must have a corresponding `down` function. WHERE a migration is irreversible (data loss on rollback), THEN it must be explicitly marked as such with a comment explaining why.
|
|
251
|
+
- **No migrations that lock large tables without warning.** WHERE a migration performs an ALTER TABLE that acquires an ACCESS EXCLUSIVE lock on a table estimated to have more than 10,000 rows, THEN the skill must flag the lock risk and suggest a non-locking alternative.
|
|
252
|
+
|
|
253
|
+
## Escalation
|
|
254
|
+
|
|
255
|
+
- **Production data at risk:** When a migration would delete or overwrite existing data (DROP COLUMN, column type change that truncates), report: "This migration will permanently delete data in column `X`. Provide a data backup confirmation or approve a non-destructive alternative (add new column, backfill, drop old) before proceeding."
|
|
256
|
+
- **ORM auto-detection fails:** When no ORM configuration file is found and no `--orm` flag is provided, report: "No ORM detected. Found raw `.sql` files in `migrations/`. Specify the ORM with `--orm` or confirm this is a raw SQL migration project."
|
|
257
|
+
- **Schema conflicts between team members:** When two pending migrations modify the same table, report: "Migrations `20240315_add_email` and `20240316_add_phone` both ALTER the `users` table. These must be reviewed together to avoid lock contention and ordering issues. Recommend merging into a single migration."
|
|
258
|
+
- **Database engine feature not available:** When the recommended approach uses a feature not available in the detected engine version (e.g., `CREATE INDEX CONCURRENTLY` is PostgreSQL-only), report: "The recommended non-locking index creation is not available in MySQL 5.7. Alternative: schedule the migration during a maintenance window or upgrade to MySQL 8.0+ which supports `ALGORITHM=INPLACE`."
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: harness-database
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Schema design, migrations, ORM patterns, and migration safety checks
|
|
4
|
+
cognitive_mode: advisory-guide
|
|
5
|
+
triggers:
|
|
6
|
+
- manual
|
|
7
|
+
- on_new_feature
|
|
8
|
+
platforms:
|
|
9
|
+
- claude-code
|
|
10
|
+
- gemini-cli
|
|
11
|
+
tools:
|
|
12
|
+
- Bash
|
|
13
|
+
- Read
|
|
14
|
+
- Write
|
|
15
|
+
- Edit
|
|
16
|
+
- Glob
|
|
17
|
+
- Grep
|
|
18
|
+
cli:
|
|
19
|
+
command: harness skill run harness-database
|
|
20
|
+
args:
|
|
21
|
+
- name: path
|
|
22
|
+
description: Project root path
|
|
23
|
+
required: false
|
|
24
|
+
- name: orm
|
|
25
|
+
description: "ORM/query builder: prisma, drizzle, knex, typeorm, sequelize. Auto-detected when omitted."
|
|
26
|
+
required: false
|
|
27
|
+
- name: check-migrations
|
|
28
|
+
description: Run migration safety analysis on pending migrations
|
|
29
|
+
required: false
|
|
30
|
+
mcp:
|
|
31
|
+
tool: run_skill
|
|
32
|
+
input:
|
|
33
|
+
skill: harness-database
|
|
34
|
+
path: string
|
|
35
|
+
type: rigid
|
|
36
|
+
tier: 3
|
|
37
|
+
internal: false
|
|
38
|
+
keywords:
|
|
39
|
+
- database
|
|
40
|
+
- migration
|
|
41
|
+
- schema
|
|
42
|
+
- ORM
|
|
43
|
+
- prisma
|
|
44
|
+
- knex
|
|
45
|
+
- drizzle
|
|
46
|
+
- typeorm
|
|
47
|
+
- sequelize
|
|
48
|
+
- SQL
|
|
49
|
+
- DDL
|
|
50
|
+
- postgresql
|
|
51
|
+
- mysql
|
|
52
|
+
- sqlite
|
|
53
|
+
- mongodb
|
|
54
|
+
stack_signals:
|
|
55
|
+
- "prisma/schema.prisma"
|
|
56
|
+
- "drizzle.config.*"
|
|
57
|
+
- "knexfile.*"
|
|
58
|
+
- "migrations/"
|
|
59
|
+
- "*.sql"
|
|
60
|
+
- "typeorm.config.*"
|
|
61
|
+
- "sequelize.config.*"
|
|
62
|
+
- "src/**/models/**"
|
|
63
|
+
- "src/**/entities/**"
|
|
64
|
+
phases:
|
|
65
|
+
- name: detect
|
|
66
|
+
description: Identify database engine, ORM, existing schema, and migration state
|
|
67
|
+
required: true
|
|
68
|
+
- name: analyze
|
|
69
|
+
description: Evaluate schema design, indexing, relationships, and normalization
|
|
70
|
+
required: true
|
|
71
|
+
- name: advise
|
|
72
|
+
description: Produce schema changes, migration scripts, and ORM pattern recommendations
|
|
73
|
+
required: true
|
|
74
|
+
- name: validate
|
|
75
|
+
description: Verify migration safety, backward compatibility, and data integrity
|
|
76
|
+
required: true
|
|
77
|
+
state:
|
|
78
|
+
persistent: false
|
|
79
|
+
files: []
|
|
80
|
+
depends_on: []
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Harness Deployment
|
|
2
|
+
|
|
3
|
+
> CI/CD pipeline analysis, deployment strategy design, and environment management. From commit to production with confidence.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When setting up or reviewing CI/CD pipelines for a new or existing project
|
|
8
|
+
- When evaluating deployment strategies (blue-green, canary, rolling) for a service
|
|
9
|
+
- When auditing environment separation and promotion workflows
|
|
10
|
+
- NOT for container image building or registry management (use harness-containerization)
|
|
11
|
+
- NOT for infrastructure provisioning (use harness-infrastructure-as-code)
|
|
12
|
+
- NOT for application performance under load (use harness-perf)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DETECT -- Identify Pipeline and Environment Configuration
|
|
17
|
+
|
|
18
|
+
1. **Scan for CI/CD configuration files.** Search the project root for pipeline definitions:
|
|
19
|
+
- `.github/workflows/*.yml` -- GitHub Actions
|
|
20
|
+
- `.gitlab-ci.yml` -- GitLab CI
|
|
21
|
+
- `Jenkinsfile` -- Jenkins
|
|
22
|
+
- `.circleci/config.yml` -- CircleCI
|
|
23
|
+
- `bitbucket-pipelines.yml` -- Bitbucket Pipelines
|
|
24
|
+
- `azure-pipelines.yml` -- Azure DevOps
|
|
25
|
+
- `deploy/`, `scripts/deploy*` -- custom deployment scripts
|
|
26
|
+
|
|
27
|
+
2. **Identify deployment targets.** Parse pipeline files for deployment steps and extract:
|
|
28
|
+
- Target environments (dev, staging, production)
|
|
29
|
+
- Deployment mechanisms (kubectl apply, aws ecs update-service, serverless deploy, rsync)
|
|
30
|
+
- Cloud provider and region information
|
|
31
|
+
- Container registry references
|
|
32
|
+
|
|
33
|
+
3. **Detect environment configuration.** Look for environment-specific config:
|
|
34
|
+
- `.env.production`, `.env.staging` files
|
|
35
|
+
- Environment variable injection in pipeline definitions
|
|
36
|
+
- Secret references (GitHub Secrets, GitLab CI variables, Vault paths)
|
|
37
|
+
- Feature flag provider configuration per environment
|
|
38
|
+
|
|
39
|
+
4. **Map the deployment topology.** Build a summary of what gets deployed where:
|
|
40
|
+
- Service name, pipeline file, target environment, deployment mechanism
|
|
41
|
+
- Dependencies between services (deploy order constraints)
|
|
42
|
+
- Manual approval gates vs. automatic promotion
|
|
43
|
+
|
|
44
|
+
5. **Present detection summary.** Output the discovered topology before proceeding:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Deployment Topology:
|
|
48
|
+
Platform: GitHub Actions
|
|
49
|
+
Pipelines: 3 workflow files
|
|
50
|
+
Environments: dev, staging, production
|
|
51
|
+
Strategy: Rolling (detected from kubectl rolling-update)
|
|
52
|
+
Approval gates: production (manual)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Phase 2: ANALYZE -- Evaluate Pipeline Quality and Gaps
|
|
58
|
+
|
|
59
|
+
1. **Check pipeline stage completeness.** A mature pipeline includes these stages. Flag any that are missing:
|
|
60
|
+
- Build and compile
|
|
61
|
+
- Unit tests
|
|
62
|
+
- Integration tests
|
|
63
|
+
- Security scan (SAST/DAST)
|
|
64
|
+
- Artifact packaging
|
|
65
|
+
- Deploy to staging
|
|
66
|
+
- Smoke tests post-deploy
|
|
67
|
+
- Deploy to production
|
|
68
|
+
- Post-deploy verification
|
|
69
|
+
|
|
70
|
+
2. **Evaluate environment isolation.** Verify that environments are properly separated:
|
|
71
|
+
- Staging and production use different credentials
|
|
72
|
+
- Environment-specific variables are not shared across environments
|
|
73
|
+
- Database connections point to the correct environment
|
|
74
|
+
- No hardcoded production URLs in non-production configs
|
|
75
|
+
|
|
76
|
+
3. **Check deployment safety mechanisms.** Verify the pipeline includes:
|
|
77
|
+
- Rollback procedures (automatic or documented manual)
|
|
78
|
+
- Health checks after deployment
|
|
79
|
+
- Timeout configuration on deployment steps
|
|
80
|
+
- Concurrency controls (prevent parallel deploys to the same environment)
|
|
81
|
+
- Branch protection rules that gate production deploys
|
|
82
|
+
|
|
83
|
+
4. **Analyze pipeline performance.** Identify bottlenecks:
|
|
84
|
+
- Steps that could run in parallel but are sequential
|
|
85
|
+
- Missing caching (dependencies, build artifacts, Docker layers)
|
|
86
|
+
- Redundant steps across workflows
|
|
87
|
+
- Total pipeline duration from commit to production
|
|
88
|
+
|
|
89
|
+
5. **Check secret hygiene in pipelines.** Verify:
|
|
90
|
+
- No secrets hardcoded in pipeline files
|
|
91
|
+
- Secrets are scoped to the minimum required environment
|
|
92
|
+
- Secret rotation is possible without pipeline changes
|
|
93
|
+
- OIDC or workload identity is used where available instead of long-lived credentials
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### Phase 3: DESIGN -- Recommend Strategy Improvements
|
|
98
|
+
|
|
99
|
+
1. **Recommend deployment strategy.** Based on the service characteristics:
|
|
100
|
+
- **Rolling** -- suitable for stateless services with backward-compatible changes
|
|
101
|
+
- **Blue-green** -- suitable when zero-downtime cutover is required and rollback must be instant
|
|
102
|
+
- **Canary** -- suitable for high-traffic services where gradual validation reduces blast radius
|
|
103
|
+
- **Recreate** -- suitable only for development environments or when downtime is acceptable
|
|
104
|
+
|
|
105
|
+
2. **Design missing pipeline stages.** For each gap identified in Phase 2, provide:
|
|
106
|
+
- The stage definition in the project's CI/CD platform syntax
|
|
107
|
+
- Where it fits in the pipeline order
|
|
108
|
+
- What tools or services it requires
|
|
109
|
+
- Example configuration snippet
|
|
110
|
+
|
|
111
|
+
3. **Recommend environment promotion workflow.** Design the path from commit to production:
|
|
112
|
+
- Automatic promotion from dev to staging after tests pass
|
|
113
|
+
- Manual approval gate before production (with notification to the team channel)
|
|
114
|
+
- Smoke test suite that runs post-deploy in each environment
|
|
115
|
+
- Rollback trigger conditions (error rate spike, health check failure)
|
|
116
|
+
|
|
117
|
+
4. **Design rollback procedure.** Every deployment must have a documented rollback:
|
|
118
|
+
- For container deployments: revert to previous image tag
|
|
119
|
+
- For serverless: revert to previous function version
|
|
120
|
+
- For database migrations: backward-compatible migration strategy
|
|
121
|
+
- Maximum rollback time target (e.g., under 5 minutes)
|
|
122
|
+
|
|
123
|
+
5. **Recommend monitoring integration.** Connect deployment events to observability:
|
|
124
|
+
- Deploy markers in APM tools (Datadog, New Relic, Grafana)
|
|
125
|
+
- Automated alerts on error rate increase after deploy
|
|
126
|
+
- Deployment frequency and lead time tracking
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### Phase 4: VALIDATE -- Verify Pipeline Correctness
|
|
131
|
+
|
|
132
|
+
1. **Lint pipeline configuration.** Run syntax validation:
|
|
133
|
+
- GitHub Actions: `actionlint` or YAML schema validation
|
|
134
|
+
- GitLab CI: `gitlab-ci-lint` API endpoint
|
|
135
|
+
- Jenkinsfile: Groovy syntax check
|
|
136
|
+
- General: YAML structure validation for all config files
|
|
137
|
+
|
|
138
|
+
2. **Verify environment variable completeness.** For each environment:
|
|
139
|
+
- All required variables are defined
|
|
140
|
+
- No placeholder values remain (TODO, CHANGEME, xxx)
|
|
141
|
+
- Variables referenced in code exist in the pipeline configuration
|
|
142
|
+
|
|
143
|
+
3. **Verify branch protection alignment.** Confirm that:
|
|
144
|
+
- Production deploy pipelines only trigger from protected branches
|
|
145
|
+
- Required status checks match the pipeline stages
|
|
146
|
+
- Force-push is disabled on deployment branches
|
|
147
|
+
|
|
148
|
+
4. **Generate deployment readiness report.** Summarize findings:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
Deployment Readiness: [PASS/WARN/FAIL]
|
|
152
|
+
|
|
153
|
+
Pipeline stages: 7/9 present (missing: security scan, smoke tests)
|
|
154
|
+
Environment isolation: PASS
|
|
155
|
+
Rollback procedure: WARN (documented but not automated)
|
|
156
|
+
Secret hygiene: PASS
|
|
157
|
+
Pipeline performance: 12m avg (recommend parallelizing test stages)
|
|
158
|
+
|
|
159
|
+
Recommendations:
|
|
160
|
+
1. Add SAST scan stage between build and deploy
|
|
161
|
+
2. Add post-deploy smoke test stage
|
|
162
|
+
3. Automate rollback on health check failure
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
5. **Present results.** Use `emit_interaction` to deliver the report and ask whether to proceed with implementing recommendations.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Harness Integration
|
|
170
|
+
|
|
171
|
+
- **`harness skill run harness-deployment`** -- Primary invocation for deployment analysis.
|
|
172
|
+
- **`harness validate`** -- Run after any pipeline configuration changes to verify project health.
|
|
173
|
+
- **`harness check-deps`** -- Verify deployment script dependencies are available.
|
|
174
|
+
- **`emit_interaction`** -- Present deployment readiness report and gather decisions on strategy.
|
|
175
|
+
|
|
176
|
+
## Success Criteria
|
|
177
|
+
|
|
178
|
+
- All CI/CD configuration files in the project are identified and cataloged
|
|
179
|
+
- Pipeline stage completeness is assessed against the standard checklist
|
|
180
|
+
- Environment isolation is verified with no cross-environment credential leakage
|
|
181
|
+
- A deployment strategy recommendation is provided with rationale
|
|
182
|
+
- Rollback procedures are documented or flagged as missing
|
|
183
|
+
- Pipeline lint passes without errors
|
|
184
|
+
|
|
185
|
+
## Examples
|
|
186
|
+
|
|
187
|
+
### Example: Node.js API with GitHub Actions
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
Phase 1: DETECT
|
|
191
|
+
Found: .github/workflows/ci.yml, .github/workflows/deploy.yml
|
|
192
|
+
Environments: staging (auto), production (manual dispatch)
|
|
193
|
+
Strategy: Rolling (kubectl set image)
|
|
194
|
+
Registry: ghcr.io/org/api-server
|
|
195
|
+
|
|
196
|
+
Phase 2: ANALYZE
|
|
197
|
+
Missing stages: security scan, post-deploy smoke tests
|
|
198
|
+
Environment isolation: PASS
|
|
199
|
+
Secret hygiene: WARN -- AWS_ACCESS_KEY_ID used instead of OIDC
|
|
200
|
+
Pipeline duration: 18m (test and lint run sequentially)
|
|
201
|
+
|
|
202
|
+
Phase 3: DESIGN
|
|
203
|
+
Recommendation: Add trivy scan after Docker build
|
|
204
|
+
Recommendation: Switch to AWS OIDC for keyless authentication
|
|
205
|
+
Recommendation: Parallelize lint and test jobs (saves ~4m)
|
|
206
|
+
Recommendation: Add smoke test job after deploy-staging
|
|
207
|
+
|
|
208
|
+
Phase 4: VALIDATE
|
|
209
|
+
actionlint: PASS
|
|
210
|
+
Environment variables: PASS
|
|
211
|
+
Branch protection: WARN -- main branch allows force-push
|
|
212
|
+
Result: WARN -- 3 recommendations, 1 security improvement needed
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Example: Python Service with GitLab CI and Canary Deploy
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Phase 1: DETECT
|
|
219
|
+
Found: .gitlab-ci.yml with 5 stages
|
|
220
|
+
Environments: dev, staging, production
|
|
221
|
+
Strategy: Canary (Istio VirtualService weight shifting)
|
|
222
|
+
Registry: registry.gitlab.com/org/service
|
|
223
|
+
|
|
224
|
+
Phase 2: ANALYZE
|
|
225
|
+
All 9 standard stages present
|
|
226
|
+
Environment isolation: PASS
|
|
227
|
+
Canary configuration: 5% -> 25% -> 75% -> 100% over 30 minutes
|
|
228
|
+
Rollback: Automatic on 5xx rate > 1%
|
|
229
|
+
|
|
230
|
+
Phase 3: DESIGN
|
|
231
|
+
Current strategy is well-configured. Minor recommendations:
|
|
232
|
+
- Add canary duration metrics to Grafana dashboard
|
|
233
|
+
- Add deployment event annotation to Prometheus
|
|
234
|
+
- Consider adding a manual gate between 75% and 100%
|
|
235
|
+
|
|
236
|
+
Phase 4: VALIDATE
|
|
237
|
+
GitLab CI lint: PASS
|
|
238
|
+
Environment variables: PASS
|
|
239
|
+
Branch protection: PASS
|
|
240
|
+
Result: PASS -- pipeline is production-ready
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Gates
|
|
244
|
+
|
|
245
|
+
- **No production deploy without staging validation.** If the pipeline allows direct-to-production deployment without a prior staging step, flag as a blocking issue.
|
|
246
|
+
- **No long-lived credentials in pipelines.** Hardcoded secrets or long-lived access keys in pipeline files are blocking findings. OIDC or short-lived tokens must be used.
|
|
247
|
+
- **No deploy without rollback.** Every deployment target must have a documented or automated rollback mechanism. Missing rollback is a blocking warning.
|
|
248
|
+
- **No skipping pipeline lint.** Pipeline configuration must pass syntax validation before recommendations are made.
|
|
249
|
+
|
|
250
|
+
## Escalation
|
|
251
|
+
|
|
252
|
+
- **When the CI/CD platform is unsupported:** Report which platform was detected and that analysis is limited to general best practices. Recommend the user provide platform-specific documentation for deeper analysis.
|
|
253
|
+
- **When secrets are found hardcoded in pipeline files:** Immediately flag as a critical finding. Do not proceed with strategy recommendations until secrets are remediated. Recommend rotating the exposed credentials.
|
|
254
|
+
- **When multiple deployment strategies are mixed across environments:** This is valid (e.g., rolling for staging, canary for production). Analyze each independently and verify the promotion workflow handles the strategy transition.
|
|
255
|
+
- **When pipeline configuration is generated by a tool (Terraform, Pulumi):** Analyze the generated output but note that fixes must be applied to the generator configuration, not the output files.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: harness-deployment
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: CI/CD pipelines, blue-green, canary, and environment management
|
|
4
|
+
cognitive_mode: advisory-guide
|
|
5
|
+
tier: 3
|
|
6
|
+
internal: false
|
|
7
|
+
keywords:
|
|
8
|
+
- deployment
|
|
9
|
+
- CI/CD
|
|
10
|
+
- pipeline
|
|
11
|
+
- GitHub Actions
|
|
12
|
+
- GitLab CI
|
|
13
|
+
- Jenkins
|
|
14
|
+
- blue-green
|
|
15
|
+
- canary
|
|
16
|
+
- rolling
|
|
17
|
+
- environment
|
|
18
|
+
- staging
|
|
19
|
+
- production
|
|
20
|
+
- CD
|
|
21
|
+
stack_signals:
|
|
22
|
+
- ".github/workflows/"
|
|
23
|
+
- ".gitlab-ci.yml"
|
|
24
|
+
- "Jenkinsfile"
|
|
25
|
+
- "deploy/"
|
|
26
|
+
- "infrastructure/"
|
|
27
|
+
- ".circleci/"
|
|
28
|
+
- "bitbucket-pipelines.yml"
|
|
29
|
+
triggers:
|
|
30
|
+
- manual
|
|
31
|
+
- on_new_feature
|
|
32
|
+
platforms:
|
|
33
|
+
- claude-code
|
|
34
|
+
- gemini-cli
|
|
35
|
+
tools:
|
|
36
|
+
- Bash
|
|
37
|
+
- Read
|
|
38
|
+
- Write
|
|
39
|
+
- Edit
|
|
40
|
+
- Glob
|
|
41
|
+
- Grep
|
|
42
|
+
- emit_interaction
|
|
43
|
+
cli:
|
|
44
|
+
command: harness skill run harness-deployment
|
|
45
|
+
args:
|
|
46
|
+
- name: path
|
|
47
|
+
description: Project root path
|
|
48
|
+
required: false
|
|
49
|
+
- name: strategy
|
|
50
|
+
description: Deployment strategy to evaluate (blue-green, canary, rolling)
|
|
51
|
+
required: false
|
|
52
|
+
- name: platform
|
|
53
|
+
description: Target CI/CD platform (github-actions, gitlab-ci, jenkins)
|
|
54
|
+
required: false
|
|
55
|
+
mcp:
|
|
56
|
+
tool: run_skill
|
|
57
|
+
input:
|
|
58
|
+
skill: harness-deployment
|
|
59
|
+
path: string
|
|
60
|
+
type: rigid
|
|
61
|
+
phases:
|
|
62
|
+
- name: detect
|
|
63
|
+
description: Identify existing CI/CD configuration and deployment targets
|
|
64
|
+
required: true
|
|
65
|
+
- name: analyze
|
|
66
|
+
description: Evaluate pipeline structure, stages, and environment separation
|
|
67
|
+
required: true
|
|
68
|
+
- name: design
|
|
69
|
+
description: Recommend deployment strategy improvements and missing stages
|
|
70
|
+
required: true
|
|
71
|
+
- name: validate
|
|
72
|
+
description: Verify pipeline correctness and environment isolation
|
|
73
|
+
required: true
|
|
74
|
+
state:
|
|
75
|
+
persistent: false
|
|
76
|
+
files: []
|
|
77
|
+
depends_on: []
|