@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,268 @@
|
|
|
1
|
+
# Harness Test Data
|
|
2
|
+
|
|
3
|
+
> Test factories, fixtures, database seeding, and test data isolation. Establishes patterns for creating realistic, composable test data without coupling tests to specific database states.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- Setting up test data factories for a new domain model or entity
|
|
8
|
+
- Migrating from shared test fixtures to isolated factory-based test data
|
|
9
|
+
- Establishing database seeding for development, staging, or test environments
|
|
10
|
+
- NOT when writing the tests themselves (use harness-tdd or harness-e2e instead)
|
|
11
|
+
- NOT when designing the database schema (use harness-database instead)
|
|
12
|
+
- NOT when testing data pipeline transformations (use harness-data-validation instead)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DETECT -- Identify Models and Existing Patterns
|
|
17
|
+
|
|
18
|
+
1. **Catalog domain models.** Scan for:
|
|
19
|
+
- ORM model definitions (Prisma schema, TypeORM entities, Django models, SQLAlchemy models)
|
|
20
|
+
- Database migration files that reveal table structures and relationships
|
|
21
|
+
- TypeScript/Python type definitions for domain objects
|
|
22
|
+
|
|
23
|
+
2. **Map model relationships.** For each model, identify:
|
|
24
|
+
- Required fields and their types
|
|
25
|
+
- Foreign key relationships and cardinality (one-to-one, one-to-many, many-to-many)
|
|
26
|
+
- Unique constraints, enums, and validation rules
|
|
27
|
+
- Default values and auto-generated fields (IDs, timestamps)
|
|
28
|
+
|
|
29
|
+
3. **Inventory existing test data patterns.** Search for:
|
|
30
|
+
- Factory files (fishery, factory-bot, factory_boy, rosie)
|
|
31
|
+
- Fixture files (JSON, YAML, SQL seed files)
|
|
32
|
+
- Inline test data (objects constructed directly in test files)
|
|
33
|
+
- Shared test setup files (beforeAll/beforeEach with data creation)
|
|
34
|
+
|
|
35
|
+
4. **Identify test data problems.** Flag:
|
|
36
|
+
- Tests that share mutable data (one test's setup affects another)
|
|
37
|
+
- Hardcoded IDs or magic values that break when database is reset
|
|
38
|
+
- Missing cleanup leading to test pollution
|
|
39
|
+
- Overly complex setup that obscures test intent
|
|
40
|
+
|
|
41
|
+
5. **Report findings.** Summarize: models found, existing patterns, and specific problems to address.
|
|
42
|
+
|
|
43
|
+
### Phase 2: DESIGN -- Choose Patterns and Plan Structure
|
|
44
|
+
|
|
45
|
+
1. **Select the factory pattern.** Based on the project's language and conventions:
|
|
46
|
+
- **TypeScript/JavaScript:** fishery (type-safe factories with traits), or a custom builder pattern
|
|
47
|
+
- **Python:** factory_boy (Django/SQLAlchemy integration), or Faker-based builders
|
|
48
|
+
- **Go:** custom builder functions with functional options pattern
|
|
49
|
+
- **Ruby:** factory_bot with traits and transient attributes
|
|
50
|
+
|
|
51
|
+
2. **Design the factory API.** Each factory must support:
|
|
52
|
+
- Default creation: `UserFactory.build()` returns a valid object with sensible defaults
|
|
53
|
+
- Override: `UserFactory.build({ name: 'Custom' })` overrides specific fields
|
|
54
|
+
- Traits: `UserFactory.build({ trait: 'admin' })` applies a named set of overrides
|
|
55
|
+
- Associations: `ProjectFactory.build()` automatically creates a related `User` owner
|
|
56
|
+
- Batch creation: `UserFactory.buildList(5)` returns an array
|
|
57
|
+
|
|
58
|
+
3. **Plan data relationships.** Define how factories handle foreign keys:
|
|
59
|
+
- Lazy association: create the related record only when needed
|
|
60
|
+
- Explicit association: pass an existing related record to avoid duplicates
|
|
61
|
+
- Transient attributes: factory parameters that control behavior but are not persisted
|
|
62
|
+
|
|
63
|
+
4. **Design cleanup strategy.** Choose based on test infrastructure:
|
|
64
|
+
- **Transaction rollback:** wrap each test in a transaction (fastest, requires framework support)
|
|
65
|
+
- **Truncation:** truncate tables between tests in dependency order
|
|
66
|
+
- **Deletion:** delete records created by the test using tracked IDs
|
|
67
|
+
- **Database recreation:** drop and recreate the test database per suite (slowest, most isolated)
|
|
68
|
+
|
|
69
|
+
5. **Define seed data tiers.** Separate:
|
|
70
|
+
- Reference data: enums, categories, roles -- loaded once, read-only
|
|
71
|
+
- Scenario data: realistic datasets for development and demos
|
|
72
|
+
- Test data: minimal data created per-test via factories
|
|
73
|
+
|
|
74
|
+
### Phase 3: SCAFFOLD -- Generate Factories and Seed Scripts
|
|
75
|
+
|
|
76
|
+
1. **Create the factory directory structure.** Follow the project's conventions:
|
|
77
|
+
- `tests/factories/` or `src/__tests__/factories/` for unit/integration test factories
|
|
78
|
+
- `seeds/` or `prisma/seed.ts` for database seeding scripts
|
|
79
|
+
- `tests/fixtures/` for static fixture data (JSON, YAML)
|
|
80
|
+
|
|
81
|
+
2. **Generate a factory for each domain model.** Each factory file contains:
|
|
82
|
+
- Default attribute definitions using realistic fake data (Faker for names, emails, dates)
|
|
83
|
+
- Traits for common variations (active/inactive, admin/member, draft/published)
|
|
84
|
+
- Association handling for required relationships
|
|
85
|
+
- Type safety: factory output matches the model type definition
|
|
86
|
+
|
|
87
|
+
3. **Generate a factory index.** Create a barrel file that exports all factories for easy importing:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
import { UserFactory, ProjectFactory, TaskFactory } from '../factories';
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
4. **Create seed scripts.** Generate:
|
|
94
|
+
- Reference data seeder: loads enums, categories, and lookup tables
|
|
95
|
+
- Development seeder: creates a realistic dataset for local development
|
|
96
|
+
- Test seeder: minimal baseline data required by most tests
|
|
97
|
+
|
|
98
|
+
5. **Create cleanup utilities.** Generate:
|
|
99
|
+
- Database cleanup function that truncates or deletes in correct dependency order
|
|
100
|
+
- Test lifecycle hooks (beforeEach/afterEach) that integrate cleanup
|
|
101
|
+
- Transaction wrapper for test isolation (if supported by the ORM)
|
|
102
|
+
|
|
103
|
+
6. **Verify factories produce valid data.** Write a smoke test that builds one instance of every factory and validates it against the model schema.
|
|
104
|
+
|
|
105
|
+
### Phase 4: VALIDATE -- Verify Isolation, Composability, and Correctness
|
|
106
|
+
|
|
107
|
+
1. **Test factory defaults.** For each factory, verify:
|
|
108
|
+
- `build()` returns a valid object that passes model validation
|
|
109
|
+
- Required fields are populated with realistic values
|
|
110
|
+
- Unique fields generate unique values across multiple builds
|
|
111
|
+
- Associations are created when needed and reused when provided
|
|
112
|
+
|
|
113
|
+
2. **Test factory composition.** Verify:
|
|
114
|
+
- Traits compose correctly: `UserFactory.build({ traits: ['admin', 'verified'] })` applies both
|
|
115
|
+
- Overrides take precedence over defaults and traits
|
|
116
|
+
- Batch creation produces distinct records with unique identifiers
|
|
117
|
+
|
|
118
|
+
3. **Test data isolation.** Run the test suite with factory-generated data and verify:
|
|
119
|
+
- Tests pass in any execution order (run with randomized order flag)
|
|
120
|
+
- No test reads data created by another test
|
|
121
|
+
- Cleanup runs correctly between tests (no orphaned records)
|
|
122
|
+
|
|
123
|
+
4. **Test seed scripts.** Verify:
|
|
124
|
+
- Seed scripts are idempotent (running twice does not create duplicates)
|
|
125
|
+
- Reference data seeder can run against an empty database
|
|
126
|
+
- Development seeder creates a realistic, navigable dataset
|
|
127
|
+
|
|
128
|
+
5. **Run `harness validate`.** Confirm the project passes all harness checks with factory infrastructure in place.
|
|
129
|
+
|
|
130
|
+
### Graph Refresh
|
|
131
|
+
|
|
132
|
+
If a knowledge graph exists at `.harness/graph/`, refresh it after code changes to keep graph queries accurate:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
harness scan [path]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Harness Integration
|
|
139
|
+
|
|
140
|
+
- **`harness validate`** -- Run in VALIDATE phase after all factories and seed scripts are created. Confirms project health.
|
|
141
|
+
- **`harness check-deps`** -- Run after SCAFFOLD phase to ensure test factory dependencies (Faker, fishery) are in devDependencies, not dependencies.
|
|
142
|
+
- **`emit_interaction`** -- Used at design checkpoints to present factory pattern options and cleanup strategy choices to the human.
|
|
143
|
+
- **Grep** -- Used in DETECT phase to find inline test data, hardcoded IDs, and existing factory patterns.
|
|
144
|
+
- **Glob** -- Used to catalog model definitions, migration files, and existing fixture files.
|
|
145
|
+
|
|
146
|
+
## Success Criteria
|
|
147
|
+
|
|
148
|
+
- Every domain model has a corresponding factory with sensible defaults
|
|
149
|
+
- Factories produce valid objects that pass model validation without any overrides
|
|
150
|
+
- No test file contains inline object construction for domain models (all use factories)
|
|
151
|
+
- Tests pass in any execution order, confirming data isolation
|
|
152
|
+
- Seed scripts are idempotent and documented
|
|
153
|
+
- Cleanup runs between tests with no orphaned records
|
|
154
|
+
- `harness validate` passes with factory infrastructure in place
|
|
155
|
+
|
|
156
|
+
## Examples
|
|
157
|
+
|
|
158
|
+
### Example: Fishery Factories for a TypeScript Project
|
|
159
|
+
|
|
160
|
+
**SCAFFOLD -- User factory with traits:**
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// tests/factories/user.factory.ts
|
|
164
|
+
import { Factory } from 'fishery';
|
|
165
|
+
import { faker } from '@faker-js/faker';
|
|
166
|
+
import { User } from '../../src/types/user';
|
|
167
|
+
|
|
168
|
+
export const UserFactory = Factory.define<User>(({ sequence, params, transientParams }) => ({
|
|
169
|
+
id: `user-${sequence}`,
|
|
170
|
+
email: params.email ?? faker.internet.email(),
|
|
171
|
+
name: params.name ?? faker.person.fullName(),
|
|
172
|
+
role: params.role ?? 'member',
|
|
173
|
+
status: params.status ?? 'active',
|
|
174
|
+
createdAt: params.createdAt ?? faker.date.past(),
|
|
175
|
+
updatedAt: new Date(),
|
|
176
|
+
}));
|
|
177
|
+
|
|
178
|
+
// Traits
|
|
179
|
+
export const AdminUser = UserFactory.params({ role: 'admin' });
|
|
180
|
+
export const InactiveUser = UserFactory.params({ status: 'inactive' });
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**SCAFFOLD -- Project factory with association:**
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
// tests/factories/project.factory.ts
|
|
187
|
+
import { Factory } from 'fishery';
|
|
188
|
+
import { faker } from '@faker-js/faker';
|
|
189
|
+
import { Project } from '../../src/types/project';
|
|
190
|
+
import { UserFactory } from './user.factory';
|
|
191
|
+
|
|
192
|
+
export const ProjectFactory = Factory.define<Project>(({ sequence, associations }) => ({
|
|
193
|
+
id: `project-${sequence}`,
|
|
194
|
+
name: faker.commerce.productName(),
|
|
195
|
+
description: faker.lorem.sentence(),
|
|
196
|
+
owner: associations.owner ?? UserFactory.build(),
|
|
197
|
+
ownerId: associations.owner?.id ?? `user-${sequence}`,
|
|
198
|
+
status: 'active',
|
|
199
|
+
createdAt: faker.date.past(),
|
|
200
|
+
}));
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Example: factory_boy for a Django Project
|
|
204
|
+
|
|
205
|
+
**SCAFFOLD -- Django model factories:**
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
# tests/factories.py
|
|
209
|
+
import factory
|
|
210
|
+
from factory.django import DjangoModelFactory
|
|
211
|
+
from faker import Faker
|
|
212
|
+
from myapp.models import User, Organization, Project
|
|
213
|
+
|
|
214
|
+
fake = Faker()
|
|
215
|
+
|
|
216
|
+
class OrganizationFactory(DjangoModelFactory):
|
|
217
|
+
class Meta:
|
|
218
|
+
model = Organization
|
|
219
|
+
|
|
220
|
+
name = factory.LazyFunction(lambda: fake.company())
|
|
221
|
+
slug = factory.LazyAttribute(lambda o: o.name.lower().replace(' ', '-'))
|
|
222
|
+
|
|
223
|
+
class UserFactory(DjangoModelFactory):
|
|
224
|
+
class Meta:
|
|
225
|
+
model = User
|
|
226
|
+
|
|
227
|
+
email = factory.LazyFunction(lambda: fake.unique.email())
|
|
228
|
+
name = factory.LazyFunction(lambda: fake.name())
|
|
229
|
+
organization = factory.SubFactory(OrganizationFactory)
|
|
230
|
+
|
|
231
|
+
class Params:
|
|
232
|
+
admin = factory.Trait(is_staff=True, is_superuser=True)
|
|
233
|
+
|
|
234
|
+
class ProjectFactory(DjangoModelFactory):
|
|
235
|
+
class Meta:
|
|
236
|
+
model = Project
|
|
237
|
+
|
|
238
|
+
name = factory.LazyFunction(lambda: fake.catch_phrase())
|
|
239
|
+
owner = factory.SubFactory(UserFactory)
|
|
240
|
+
organization = factory.LazyAttribute(lambda p: p.owner.organization)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Usage in tests:**
|
|
244
|
+
|
|
245
|
+
```python
|
|
246
|
+
def test_project_belongs_to_owner_organization():
|
|
247
|
+
project = ProjectFactory.create()
|
|
248
|
+
assert project.organization == project.owner.organization
|
|
249
|
+
|
|
250
|
+
def test_admin_can_delete_any_project():
|
|
251
|
+
admin = UserFactory.create(admin=True)
|
|
252
|
+
project = ProjectFactory.create()
|
|
253
|
+
assert admin.has_perm('delete_project', project)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Gates
|
|
257
|
+
|
|
258
|
+
- **No hardcoded IDs in factories.** Factories must generate unique IDs per instance. Hardcoded IDs cause collision failures when tests run in parallel. Use sequences or UUIDs.
|
|
259
|
+
- **No production data in test fixtures.** Test data must be synthetic. If a fixture file contains real customer names, emails, or PII, it must be replaced with Faker-generated data before merging.
|
|
260
|
+
- **Factories must produce valid objects.** A factory `build()` with zero overrides must return an object that passes model validation. If it requires manual overrides to be valid, the defaults are wrong.
|
|
261
|
+
- **Cleanup must be explicit.** Do not rely on test framework teardown happening "eventually." Every test or test suite that creates database records must have an explicit cleanup step that runs even when tests fail.
|
|
262
|
+
|
|
263
|
+
## Escalation
|
|
264
|
+
|
|
265
|
+
- **When models have circular dependencies (User has Projects, Project has Owner User):** Use lazy evaluation or two-pass creation. Create the User first without Projects, create the Project with the User, then optionally update the User. Document the pattern in the factory file.
|
|
266
|
+
- **When the database schema is too complex for factories (50+ models):** Prioritize factories for the models that appear most frequently in tests. Use a tiered approach: core factories first, then add factories for secondary models as tests demand them.
|
|
267
|
+
- **When seed data conflicts with migration state:** Seed scripts must be updated whenever migrations change the schema. If seeds fail after a migration, fix the seeds immediately -- do not skip seeding.
|
|
268
|
+
- **When test isolation requires database-level features (row-level security, multi-tenancy):** Factory cleanup may need tenant-aware truncation. Escalate to ensure the cleanup strategy respects the application's multi-tenancy model.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: harness-test-data
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Test factories, fixtures, database seeding, and test data isolation
|
|
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
|
+
- emit_interaction
|
|
19
|
+
cli:
|
|
20
|
+
command: harness skill run harness-test-data
|
|
21
|
+
args:
|
|
22
|
+
- name: path
|
|
23
|
+
description: Project root path
|
|
24
|
+
required: false
|
|
25
|
+
- name: pattern
|
|
26
|
+
description: "Data pattern: factory, fixture, builder, or seed. Auto-detected when omitted."
|
|
27
|
+
required: false
|
|
28
|
+
- name: model
|
|
29
|
+
description: "Target model or entity name for focused factory generation."
|
|
30
|
+
required: false
|
|
31
|
+
mcp:
|
|
32
|
+
tool: run_skill
|
|
33
|
+
input:
|
|
34
|
+
skill: harness-test-data
|
|
35
|
+
path: string
|
|
36
|
+
type: rigid
|
|
37
|
+
tier: 3
|
|
38
|
+
internal: false
|
|
39
|
+
keywords:
|
|
40
|
+
- test data
|
|
41
|
+
- factory
|
|
42
|
+
- fixture
|
|
43
|
+
- seed
|
|
44
|
+
- faker
|
|
45
|
+
- test database
|
|
46
|
+
- isolation
|
|
47
|
+
- cleanup
|
|
48
|
+
- test container
|
|
49
|
+
- builder pattern
|
|
50
|
+
- mother object
|
|
51
|
+
stack_signals:
|
|
52
|
+
- "tests/factories/"
|
|
53
|
+
- "tests/fixtures/"
|
|
54
|
+
- "src/**/factories/**"
|
|
55
|
+
- "seeds/"
|
|
56
|
+
- "test-data/"
|
|
57
|
+
- "src/**/__fixtures__/"
|
|
58
|
+
phases:
|
|
59
|
+
- name: detect
|
|
60
|
+
description: Identify data models, existing test data patterns, and database schema
|
|
61
|
+
required: true
|
|
62
|
+
- name: design
|
|
63
|
+
description: Choose factory pattern, define builder interfaces, and plan data relationships
|
|
64
|
+
required: true
|
|
65
|
+
- name: scaffold
|
|
66
|
+
description: Generate factories, fixtures, seed scripts, and cleanup utilities
|
|
67
|
+
required: true
|
|
68
|
+
- name: validate
|
|
69
|
+
description: Verify data isolation, cleanup correctness, and factory composability
|
|
70
|
+
required: true
|
|
71
|
+
state:
|
|
72
|
+
persistent: false
|
|
73
|
+
files: []
|
|
74
|
+
depends_on: []
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Harness UX Copy
|
|
2
|
+
|
|
3
|
+
> Audit microcopy, error messages, and UI strings for voice/tone consistency, clarity, and actionability. Produces a structured report with specific rewrites and a project voice guide when none exists.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When reviewing a PR that adds or changes user-facing text (labels, error messages, tooltips, onboarding flows)
|
|
8
|
+
- When establishing or enforcing a voice/tone guide across a product
|
|
9
|
+
- When error messages are vague, blame the user, or lack actionable next steps
|
|
10
|
+
- NOT for internationalization string extraction (use harness-i18n)
|
|
11
|
+
- NOT for accessibility auditing of non-text elements (use harness-accessibility)
|
|
12
|
+
- NOT for marketing copy or landing page content outside the application
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DISCOVER -- Locate UI String Sources
|
|
17
|
+
|
|
18
|
+
1. **Resolve project root.** Use provided path or cwd.
|
|
19
|
+
|
|
20
|
+
2. **Locate voice/tone guide.** Search for `VOICE.md`, `STYLE.md`, `docs/voice-guide.md`, `docs/tone.md`, or a `voice` section in `harness.config.json`. If no guide is found, flag this as a gap and use sensible defaults (clear, concise, respectful, action-oriented).
|
|
21
|
+
|
|
22
|
+
3. **Identify string sources.** Scan the project for UI text using multiple strategies:
|
|
23
|
+
- Component files: `src/**/components/**/*.{tsx,jsx,vue,svelte}` for inline text
|
|
24
|
+
- String constants: `src/**/strings*`, `src/**/messages*`, `src/**/copy*` for centralized copy
|
|
25
|
+
- i18n files: `src/**/i18n/**`, `locales/`, `translations/` for translation keys
|
|
26
|
+
- Error definitions: files containing `throw new Error`, `toast.error`, `setError`, `addNotification`
|
|
27
|
+
- Form labels: files containing `label=`, `placeholder=`, `aria-label=`, `helperText=`
|
|
28
|
+
|
|
29
|
+
4. **Determine audit scope.** If `--scope` is provided, filter to the specified category. If triggered by a PR, scope to changed files only using `git diff --name-only`.
|
|
30
|
+
|
|
31
|
+
5. **Build string inventory.** Extract all user-facing strings with their source location, category (error, label, help, onboarding, confirmation, empty-state), and surrounding context.
|
|
32
|
+
|
|
33
|
+
6. **Report discovery summary.** Output the count of strings found by category and source type:
|
|
34
|
+
```
|
|
35
|
+
Discovery: 142 strings found
|
|
36
|
+
Errors: 23 | Labels: 48 | Help text: 31 | Onboarding: 12 | Empty states: 8 | Other: 20
|
|
37
|
+
Sources: 18 components, 3 string files, 2 i18n bundles
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### Phase 2: AUDIT -- Evaluate Copy Quality
|
|
43
|
+
|
|
44
|
+
1. **Check error messages against quality rules.** Every error message must satisfy:
|
|
45
|
+
- **What happened:** Describe the problem without technical jargon
|
|
46
|
+
- **Why it happened:** Provide context when possible (not "An error occurred")
|
|
47
|
+
- **What to do next:** Include an actionable recovery step
|
|
48
|
+
- **No blame language:** Avoid "you failed to," "invalid input," "wrong password" -- prefer "we couldn't," "please check," "that password didn't match"
|
|
49
|
+
|
|
50
|
+
2. **Check labels and form text.** Evaluate:
|
|
51
|
+
- **Clarity:** Can the user understand what is expected without additional context?
|
|
52
|
+
- **Consistency:** Are similar fields labeled the same way across the app? (e.g., "Email" vs "Email address" vs "E-mail")
|
|
53
|
+
- **Brevity:** Are labels concise without sacrificing clarity?
|
|
54
|
+
- **Placeholder misuse:** Are placeholders being used as labels? (accessibility anti-pattern)
|
|
55
|
+
|
|
56
|
+
3. **Check voice/tone alignment.** Compare strings against the voice guide (or defaults):
|
|
57
|
+
- **Formality level:** Is the tone consistent? (e.g., mixing "gonna" with "We regret to inform you")
|
|
58
|
+
- **Pronoun usage:** Is first/second person used consistently? ("your account" vs "the account")
|
|
59
|
+
- **Technical jargon:** Are technical terms exposed to non-technical users?
|
|
60
|
+
- **Emotional tone:** Are error states empathetic? Are success states appropriately celebratory?
|
|
61
|
+
|
|
62
|
+
4. **Check empty states and onboarding.** Evaluate:
|
|
63
|
+
- Do empty states explain what will appear and how to get started?
|
|
64
|
+
- Do onboarding flows use progressive disclosure?
|
|
65
|
+
- Are CTAs clear and specific? ("Add your first project" vs "Get started")
|
|
66
|
+
|
|
67
|
+
5. **Check confirmation dialogs.** Evaluate:
|
|
68
|
+
- Is the consequence of the action clearly stated?
|
|
69
|
+
- Are button labels specific? ("Delete project" vs "OK")
|
|
70
|
+
- Is the destructive action visually distinct?
|
|
71
|
+
|
|
72
|
+
6. **Classify findings by severity:**
|
|
73
|
+
- **Error:** Misleading text, blame language, missing recovery steps, accessibility violations
|
|
74
|
+
- **Warning:** Inconsistent terminology, vague CTAs, jargon exposure
|
|
75
|
+
- **Info:** Style preferences, minor tone adjustments, punctuation inconsistencies
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### Phase 3: GUIDE -- Produce Recommendations
|
|
80
|
+
|
|
81
|
+
1. **Generate specific rewrites.** For every error and warning finding, provide:
|
|
82
|
+
- The current string (with file location)
|
|
83
|
+
- The recommended rewrite
|
|
84
|
+
- The rule that triggered the finding
|
|
85
|
+
- A brief rationale
|
|
86
|
+
|
|
87
|
+
2. **Produce consistency patches.** When terminology is inconsistent (e.g., "Sign in" vs "Log in"), recommend a single canonical term and list all locations that need updating.
|
|
88
|
+
|
|
89
|
+
3. **Generate voice guide draft.** If no voice guide was found in Phase 1, produce a draft `VOICE.md` covering:
|
|
90
|
+
- Brand voice attributes (3-5 adjectives with examples)
|
|
91
|
+
- Tone spectrum (how voice changes by context: error, success, onboarding, help)
|
|
92
|
+
- Word list (preferred terms and terms to avoid)
|
|
93
|
+
- Punctuation and capitalization rules
|
|
94
|
+
- Example patterns for common UI scenarios
|
|
95
|
+
|
|
96
|
+
4. **Produce error message template.** Generate a reusable template for error messages:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
[What happened]. [Why / context]. [What to do next].
|
|
100
|
+
Example: "We couldn't save your changes. The file may have been modified by someone else. Try refreshing the page and saving again."
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
5. **Prioritize recommendations.** Order by impact: error-severity findings first, then warnings grouped by frequency (most repeated patterns first), then informational suggestions.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### Phase 4: VALIDATE -- Verify Recommendations
|
|
108
|
+
|
|
109
|
+
1. **Check rewrites preserve meaning.** Verify each recommended rewrite conveys the same information as the original. Flag any rewrite that changes the semantic meaning.
|
|
110
|
+
|
|
111
|
+
2. **Check i18n compatibility.** If the project uses i18n:
|
|
112
|
+
- Verify recommended strings do not break interpolation variables (`{count}`, `{{name}}`)
|
|
113
|
+
- Verify string key references remain valid
|
|
114
|
+
- Flag any rewrites that would require translator review
|
|
115
|
+
|
|
116
|
+
3. **Check length constraints.** Verify rewrites fit within UI constraints:
|
|
117
|
+
- Button labels: typically under 25 characters
|
|
118
|
+
- Toast messages: typically under 100 characters
|
|
119
|
+
- Form labels: typically under 40 characters
|
|
120
|
+
- Flag any rewrite that significantly increases string length
|
|
121
|
+
|
|
122
|
+
4. **Output structured report.** Present findings in a format suitable for PR review:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
UX Copy Audit: [PASS/NEEDS_ATTENTION/FAIL]
|
|
126
|
+
Strings audited: N
|
|
127
|
+
Findings: E errors, W warnings, I info
|
|
128
|
+
|
|
129
|
+
ERRORS:
|
|
130
|
+
[UXC-ERR-001] src/components/LoginForm.tsx:42
|
|
131
|
+
Current: "Invalid credentials"
|
|
132
|
+
Recommended: "That email and password combination didn't match. Please try again or reset your password."
|
|
133
|
+
Rule: error-missing-recovery-step
|
|
134
|
+
|
|
135
|
+
WARNINGS:
|
|
136
|
+
[UXC-WARN-001] Inconsistent terminology: "Sign in" (4 occurrences) vs "Log in" (2 occurrences)
|
|
137
|
+
Recommendation: Standardize on "Sign in" across all 6 locations.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
5. **Verify voice guide completeness.** If a voice guide was generated, confirm it covers all required sections and includes at least 3 examples per section.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Harness Integration
|
|
145
|
+
|
|
146
|
+
- **`harness skill run harness-ux-copy`** -- Primary command for running the UX copy audit.
|
|
147
|
+
- **`harness validate`** -- Run after applying recommended changes to verify project health.
|
|
148
|
+
- **`Glob`** -- Used to locate string sources, component files, and voice guides.
|
|
149
|
+
- **`Grep`** -- Used to extract inline strings, error patterns, and label attributes from source files.
|
|
150
|
+
- **`Read`** -- Used to read voice guides, component files, and string constant files.
|
|
151
|
+
- **`Write`** -- Used to generate voice guide drafts when none exists.
|
|
152
|
+
- **`emit_interaction`** -- Used to present findings and request confirmation on bulk terminology changes.
|
|
153
|
+
|
|
154
|
+
## Success Criteria
|
|
155
|
+
|
|
156
|
+
- All user-facing strings in scope are audited
|
|
157
|
+
- Every error message is evaluated for what-happened, why, and what-to-do-next
|
|
158
|
+
- Terminology inconsistencies are identified with canonical term recommendations
|
|
159
|
+
- Specific rewrites are provided for every error and warning finding
|
|
160
|
+
- Rewrites preserve semantic meaning and i18n compatibility
|
|
161
|
+
- Voice guide exists (found or generated) with actionable patterns
|
|
162
|
+
- Report follows structured format with severity classification
|
|
163
|
+
|
|
164
|
+
## Examples
|
|
165
|
+
|
|
166
|
+
### Example: React Application with Vague Error Messages
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
Phase 1: DISCOVER
|
|
170
|
+
Scanned: 34 components, 2 string files, 1 i18n bundle
|
|
171
|
+
Found: 89 strings (18 errors, 32 labels, 14 help text, 25 other)
|
|
172
|
+
Voice guide: not found (will generate draft)
|
|
173
|
+
|
|
174
|
+
Phase 2: AUDIT
|
|
175
|
+
[UXC-ERR-001] src/components/CheckoutForm.tsx:78
|
|
176
|
+
"Payment failed" -- missing context and recovery step
|
|
177
|
+
[UXC-ERR-002] src/components/SignupForm.tsx:33
|
|
178
|
+
"Invalid email" -- blame language, no guidance
|
|
179
|
+
[UXC-WARN-001] Terminology inconsistency:
|
|
180
|
+
"Shopping cart" (3 files) vs "Cart" (5 files) vs "Basket" (1 file)
|
|
181
|
+
[UXC-WARN-002] src/components/EmptyOrders.tsx:12
|
|
182
|
+
"No orders" -- empty state missing guidance on what to do
|
|
183
|
+
|
|
184
|
+
Phase 3: GUIDE
|
|
185
|
+
Rewrite: "Payment failed" ->
|
|
186
|
+
"Your payment didn't go through. Please check your card details and try again, or use a different payment method."
|
|
187
|
+
Rewrite: "Invalid email" ->
|
|
188
|
+
"Please enter a valid email address, like name@example.com."
|
|
189
|
+
Terminology: Standardize on "Cart" (most frequent, shortest)
|
|
190
|
+
Generated: VOICE.md draft with friendly-professional tone
|
|
191
|
+
|
|
192
|
+
Phase 4: VALIDATE
|
|
193
|
+
All rewrites preserve original meaning: YES
|
|
194
|
+
i18n interpolation variables intact: YES
|
|
195
|
+
Length constraints met: 1 warning (payment rewrite exceeds toast limit, suggest truncated variant)
|
|
196
|
+
Result: NEEDS_ATTENTION -- 2 errors, 2 warnings
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Example: Vue.js SaaS Dashboard with Existing Voice Guide
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
Phase 1: DISCOVER
|
|
203
|
+
Voice guide found: docs/VOICE.md (professional, empathetic, action-oriented)
|
|
204
|
+
Scanned: 52 components, 4 string files
|
|
205
|
+
Scope: PR diff (8 changed files, 14 new/modified strings)
|
|
206
|
+
|
|
207
|
+
Phase 2: AUDIT
|
|
208
|
+
[UXC-ERR-001] src/views/Settings.vue:145
|
|
209
|
+
"Error: 403 Forbidden" -- exposes HTTP status, no user context
|
|
210
|
+
[UXC-WARN-001] src/views/Dashboard.vue:67
|
|
211
|
+
"Click here to learn more" -- vague CTA, accessibility concern
|
|
212
|
+
[UXC-INFO-001] src/components/Sidebar.vue:23
|
|
213
|
+
"Organisations" -- British spelling, rest of app uses American English
|
|
214
|
+
|
|
215
|
+
Phase 3: GUIDE
|
|
216
|
+
Rewrite: "Error: 403 Forbidden" ->
|
|
217
|
+
"You don't have permission to change these settings. Ask your workspace admin to update your role."
|
|
218
|
+
Rewrite: "Click here to learn more" ->
|
|
219
|
+
"Learn how to configure integrations"
|
|
220
|
+
Consistency: Standardize on American English per voice guide
|
|
221
|
+
|
|
222
|
+
Phase 4: VALIDATE
|
|
223
|
+
All rewrites align with VOICE.md tone: YES
|
|
224
|
+
Result: NEEDS_ATTENTION -- 1 error, 1 warning, 1 info
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Example: Next.js E-commerce with i18n (next-intl)
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
Phase 1: DISCOVER
|
|
231
|
+
i18n framework: next-intl (detected via next.config.js and messages/ directory)
|
|
232
|
+
Locales: en, es, fr, de
|
|
233
|
+
Scanned: messages/en.json (312 keys)
|
|
234
|
+
Scope: --scope errors
|
|
235
|
+
|
|
236
|
+
Phase 2: AUDIT
|
|
237
|
+
[UXC-ERR-001] messages/en.json -> errors.generic
|
|
238
|
+
"Something went wrong" -- no context, no recovery
|
|
239
|
+
[UXC-ERR-002] messages/en.json -> errors.network
|
|
240
|
+
"Network error" -- technical, no user action
|
|
241
|
+
[UXC-ERR-003] messages/en.json -> checkout.cardDeclined
|
|
242
|
+
"Your card was declined" -- blame language
|
|
243
|
+
|
|
244
|
+
Phase 3: GUIDE
|
|
245
|
+
Rewrite: errors.generic ->
|
|
246
|
+
"Something unexpected happened on our end. Please try again, or contact support if the problem continues."
|
|
247
|
+
Rewrite: errors.network ->
|
|
248
|
+
"We're having trouble connecting. Please check your internet connection and try again."
|
|
249
|
+
Rewrite: checkout.cardDeclined ->
|
|
250
|
+
"This card couldn't be processed. Please try a different card or contact your bank."
|
|
251
|
+
Note: All rewrites use {variable} interpolation compatible with next-intl
|
|
252
|
+
|
|
253
|
+
Phase 4: VALIDATE
|
|
254
|
+
Interpolation variables preserved: YES (no variables in affected keys)
|
|
255
|
+
Translator review needed: YES (3 keys modified, flag for es/fr/de update)
|
|
256
|
+
Result: NEEDS_ATTENTION -- 3 errors requiring translator coordination
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Gates
|
|
260
|
+
|
|
261
|
+
- **No rewrite may change semantic meaning.** If a recommended rewrite alters what the user understands about the situation or available actions, it is rejected. Rewrites improve clarity and tone, not content.
|
|
262
|
+
- **No breaking i18n interpolation.** Rewrites must preserve all interpolation variables exactly as they appear in the original string. A rewrite that drops `{count}` or renames `{{userName}}` is invalid.
|
|
263
|
+
- **No applying bulk changes without confirmation.** When a terminology standardization affects more than 5 files, present the change list and wait for human confirmation before recommending the batch edit.
|
|
264
|
+
- **No generating a voice guide that contradicts an existing one.** If a voice guide exists, recommendations must align with it. If the guide itself has problems, flag them separately rather than overriding.
|
|
265
|
+
|
|
266
|
+
## Escalation
|
|
267
|
+
|
|
268
|
+
- **When the voice guide conflicts with accessibility best practices:** Flag the conflict. Accessibility requirements take precedence over voice guide preferences. Example: the guide says "use playful language for errors" but playful error messages can confuse screen reader users. Recommend a voice guide amendment.
|
|
269
|
+
- **When terminology standardization has brand implications:** If the inconsistency involves brand-specific terms (product names, feature names), do not auto-recommend. Present the variants and escalate to the product team: "Found 3 variants of the product tier name. This needs a product decision."
|
|
270
|
+
- **When rewrites significantly increase string length:** If a rewrite exceeds UI constraints and cannot be shortened without losing critical information, flag the constraint: "This error message needs more space than the current toast component allows. Consider using an inline error or expanding the toast max-width."
|
|
271
|
+
- **When error messages require backend changes:** If an error message improvement requires the backend to send more specific error codes or context, document the dependency: "Improving this message requires the API to distinguish between 'card declined' and 'card expired' -- currently both return PAYMENT_FAILED."
|