devflow-kit 0.9.0 → 1.0.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/CHANGELOG.md +167 -29
- package/LICENSE +1 -1
- package/README.md +179 -310
- package/dist/cli.js +3 -1
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.js +311 -576
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +351 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +162 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +68 -0
- package/dist/utils/post-install.js +427 -0
- package/dist/utils/safe-delete-install.d.ts +22 -0
- package/dist/utils/safe-delete-install.js +156 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +27 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +134 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/background-memory-update.sh +167 -0
- package/scripts/hooks/pre-compact-memory.sh +81 -0
- package/scripts/hooks/session-start-memory.sh +84 -0
- package/scripts/hooks/stop-update-memory.sh +81 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +134 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +146 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/get-issue.md +0 -286
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -493
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/get-issue.md +0 -16
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -20
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-patterns
|
|
3
|
+
description: This skill should be used when the user asks to "write tests", "fix failing tests", "improve test coverage", "add integration tests", "debug a flaky test", or reviews test quality. Provides behavior-focused testing patterns, coverage analysis, and detection of brittle test anti-patterns like implementation coupling and non-deterministic assertions.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: Read, Grep, Glob, AskUserQuestion
|
|
6
|
+
activation:
|
|
7
|
+
file-patterns:
|
|
8
|
+
- "**/*.test.*"
|
|
9
|
+
- "**/*.spec.*"
|
|
10
|
+
- "**/test/**"
|
|
11
|
+
- "**/tests/**"
|
|
12
|
+
- "**/__tests__/**"
|
|
13
|
+
exclude:
|
|
14
|
+
- "node_modules/**"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Test Patterns
|
|
18
|
+
|
|
19
|
+
## Iron Law
|
|
20
|
+
|
|
21
|
+
> **TESTS VALIDATE BEHAVIOR, NOT IMPLEMENTATION**
|
|
22
|
+
>
|
|
23
|
+
> A test should fail when behavior breaks, not when implementation changes. If refactoring
|
|
24
|
+
> breaks tests without changing behavior, the tests are wrong. Mock boundaries, not internals.
|
|
25
|
+
> Test the contract, not the code. If tests are hard to write, the design is wrong — fix the
|
|
26
|
+
> architecture, not the tests.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Test Design Red Flags
|
|
31
|
+
|
|
32
|
+
### 1. Complex Setup
|
|
33
|
+
|
|
34
|
+
**RED FLAG**: Test setup >10 lines means the design is wrong.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// VIOLATION: Too many dependencies
|
|
38
|
+
beforeEach(async () => {
|
|
39
|
+
mockDb = new MockDatabase();
|
|
40
|
+
await mockDb.connect();
|
|
41
|
+
mockCache = new MockCache();
|
|
42
|
+
// ... 10+ more lines
|
|
43
|
+
service = new UserService(mockDb, mockCache, mockLogger, mockConfig);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// CORRECT: Simple setup
|
|
47
|
+
it('should return Ok with valid data', () => {
|
|
48
|
+
const result = createUser({ name: 'test', email: 'test@example.com' });
|
|
49
|
+
expect(result.ok).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Detection**: `beforeEach` >10 lines, multiple mocks, async setup, database seeding
|
|
54
|
+
|
|
55
|
+
### 2. Repetitive Boilerplate
|
|
56
|
+
|
|
57
|
+
**RED FLAG**: Same pattern repeated >3 times means the API is wrong.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// VIOLATION: Try/catch everywhere
|
|
61
|
+
try { await api.createUser(data); fail(); } catch (e) { expect(e.status).toBe(400); }
|
|
62
|
+
|
|
63
|
+
// CORRECT: Result types eliminate repetition
|
|
64
|
+
const result = createUser(invalidData);
|
|
65
|
+
expect(result.ok).toBe(false);
|
|
66
|
+
expect(result.error.type).toBe('ValidationError');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Difficult Mocking
|
|
70
|
+
|
|
71
|
+
**RED FLAG**: Mock setup >20 lines means dependencies are wrong.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// VIOLATION: Nested mock structures
|
|
75
|
+
mockDb = { transaction: jest.fn(), orders: { create: jest.fn(), update: jest.fn() } };
|
|
76
|
+
|
|
77
|
+
// CORRECT: Pure functions need no mocking
|
|
78
|
+
const result = processOrder(order);
|
|
79
|
+
expect(result.ok).toBe(true);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 4. Implementation Testing
|
|
83
|
+
|
|
84
|
+
**RED FLAG**: Testing internals means tests are fragile.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// VIOLATION: Spying on private methods
|
|
88
|
+
const spy = jest.spyOn(cart as any, 'updateTotal');
|
|
89
|
+
expect(spy).toHaveBeenCalled();
|
|
90
|
+
|
|
91
|
+
// CORRECT: Test observable behavior
|
|
92
|
+
expect(cart.getTotal()).toBe(10);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Coverage & Review
|
|
98
|
+
|
|
99
|
+
### Coverage Issues
|
|
100
|
+
|
|
101
|
+
- **Untested new code**: New functions/branches without corresponding tests
|
|
102
|
+
- **Missing edge cases**: Only happy path tested, no error paths
|
|
103
|
+
- **Missing error paths**: `throw`/`reject` in source without matching test assertions
|
|
104
|
+
|
|
105
|
+
### Test Quality Issues
|
|
106
|
+
|
|
107
|
+
- **Brittle tests**: Testing HOW (mock call verification) not WHAT (outcome)
|
|
108
|
+
- **Unclear test names**: `it('test1')` instead of `it('validates email format on creation')`
|
|
109
|
+
- **Missing AAA structure**: Mixed arrange/act/assert without clear separation
|
|
110
|
+
|
|
111
|
+
### Mocking Issues
|
|
112
|
+
|
|
113
|
+
- **Over-mocking**: Everything mocked, nothing actually tested
|
|
114
|
+
- **Mocking third-party internals**: Mock at your own interface boundary instead
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Severity Guidelines
|
|
119
|
+
|
|
120
|
+
| Severity | Criteria |
|
|
121
|
+
|----------|----------|
|
|
122
|
+
| **CRITICAL** | Tests pass but don't verify behavior; critical paths untested; tests mock everything |
|
|
123
|
+
| **HIGH** | Missing error path coverage; flaky tests; extremely slow (>10s); >10 line setup |
|
|
124
|
+
| **MEDIUM** | Some edge cases missing; weak assertions; unclear structure |
|
|
125
|
+
| **LOW** | Organization could improve; naming could be clearer |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Test Suite Safety
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
// vitest.config.ts / jest.config.js
|
|
133
|
+
{ fileParallelism: false, maxWorkers: 1, testTimeout: 10000 }
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
NODE_OPTIONS="--max-old-space-size=512" npm test
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Extended References
|
|
143
|
+
|
|
144
|
+
For comprehensive examples and detection patterns:
|
|
145
|
+
|
|
146
|
+
| Reference | Contents |
|
|
147
|
+
|-----------|----------|
|
|
148
|
+
| `references/violations.md` | Full violation examples for all categories |
|
|
149
|
+
| `references/patterns.md` | Correct test patterns and organization |
|
|
150
|
+
| `references/detection.md` | Bash commands for automated detection |
|
|
151
|
+
| `references/report-template.md` | Full report format for documenting issues |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Quality Gates
|
|
156
|
+
|
|
157
|
+
Tests pass design review when:
|
|
158
|
+
- [ ] Setup code <10 lines per test file
|
|
159
|
+
- [ ] No repetitive try/catch or error handling patterns
|
|
160
|
+
- [ ] Mocking requires <5 lines of setup
|
|
161
|
+
- [ ] No spying on private methods or internal state
|
|
162
|
+
- [ ] Tests verify behavior, not implementation details
|
|
163
|
+
- [ ] Pure business logic testable without mocks
|
|
164
|
+
- [ ] New code has corresponding tests
|
|
165
|
+
- [ ] All branches covered (happy path + errors + edge cases)
|
|
166
|
+
- [ ] Test names describe expected behavior
|
|
167
|
+
- [ ] Tests follow Arrange-Act-Assert structure
|
|
168
|
+
- [ ] No real delays (use mocked timers)
|
|
169
|
+
- [ ] No flaky patterns (race conditions, timing dependencies)
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Review Checklist
|
|
174
|
+
|
|
175
|
+
- [ ] New code has corresponding tests
|
|
176
|
+
- [ ] All branches covered (happy path + errors + edge cases)
|
|
177
|
+
- [ ] Tests verify behavior, not implementation
|
|
178
|
+
- [ ] Test names describe expected behavior
|
|
179
|
+
- [ ] Tests follow Arrange-Act-Assert structure
|
|
180
|
+
- [ ] No real delays (use mocked timers)
|
|
181
|
+
- [ ] Assertions are specific and meaningful
|
|
182
|
+
- [ ] Mocking limited to boundaries (not internals)
|
|
183
|
+
- [ ] No flaky patterns (race conditions, timing dependencies)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Test Issue Detection
|
|
2
|
+
|
|
3
|
+
Commands and patterns for detecting test quality issues.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Coverage Detection
|
|
8
|
+
|
|
9
|
+
### Find Untested Functions
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# List exported functions in source
|
|
13
|
+
grep -rn "export function\|export async function" --include="*.ts" src/ | cut -d: -f1,3 | sort
|
|
14
|
+
|
|
15
|
+
# List tested functions
|
|
16
|
+
grep -rn "describe\|it\(" --include="*.test.ts" | grep -oE "'[^']+'" | sort -u
|
|
17
|
+
|
|
18
|
+
# Compare to find gaps (manual comparison needed)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Find Missing Error Tests
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Count error-throwing code in source
|
|
25
|
+
grep -rn "throw\|reject\|Error" --include="*.ts" src/ | grep -v test | wc -l
|
|
26
|
+
|
|
27
|
+
# Count error test assertions
|
|
28
|
+
grep -rn "rejects.toThrow\|toThrow\|toThrowError" --include="*.test.ts" | wc -l
|
|
29
|
+
|
|
30
|
+
# Large discrepancy indicates missing error tests
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Quality Detection
|
|
36
|
+
|
|
37
|
+
### Tests Without Assertions
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Find test blocks that may lack assertions
|
|
41
|
+
grep -rn "it\(.*=>" --include="*.test.ts" -A20 | grep -v "expect" | head -50
|
|
42
|
+
|
|
43
|
+
# Find empty test blocks
|
|
44
|
+
grep -rn "it\(.*{\s*}\)" --include="*.test.ts"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Weak Assertions
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Find overly permissive assertions
|
|
51
|
+
grep -rn "toBeDefined\|toBeTruthy\|not.toBeNull\|not.toBeUndefined" --include="*.test.ts"
|
|
52
|
+
|
|
53
|
+
# Count for comparison with strong assertions
|
|
54
|
+
grep -rn "toEqual\|toMatchObject\|toHaveLength\|toBe(" --include="*.test.ts" | wc -l
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Implementation Testing
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Find tests that verify mock calls (may indicate implementation testing)
|
|
61
|
+
grep -rn "toHaveBeenCalledWith\|toHaveBeenCalled\|toHaveBeenCalledTimes" --include="*.test.ts"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Design Detection
|
|
67
|
+
|
|
68
|
+
### Slow Tests
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Find tests with long timeouts (>5000ms)
|
|
72
|
+
grep -rn "}, [0-9][0-9][0-9][0-9][0-9])" --include="*.test.ts"
|
|
73
|
+
|
|
74
|
+
# Find real delays in tests
|
|
75
|
+
grep -rn "setTimeout\|sleep\|delay" --include="*.test.ts"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Complex Setup
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Find tests with many mock objects
|
|
82
|
+
grep -rn "jest.fn\|sinon.stub\|mock" --include="*.test.ts" | cut -d: -f1 | uniq -c | sort -rn | head -10
|
|
83
|
+
|
|
84
|
+
# Find long beforeEach blocks
|
|
85
|
+
grep -rn "beforeEach" --include="*.test.ts" -A30 | head -100
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Mocking Detection
|
|
91
|
+
|
|
92
|
+
### Over-Mocking
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Count mocks per test file
|
|
96
|
+
for f in $(find . -name "*.test.ts" -type f); do
|
|
97
|
+
count=$(grep -c "jest.fn\|mock" "$f" 2>/dev/null || echo 0)
|
|
98
|
+
echo "$count $f"
|
|
99
|
+
done | sort -rn | head -20
|
|
100
|
+
|
|
101
|
+
# Files with >20 mocks may be over-mocked
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Third-Party Library Mocking
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Find jest.mock of node_modules
|
|
108
|
+
grep -rn "jest.mock\(['\"]" --include="*.test.ts" | grep -v "\./" | grep -v "\.\./"
|
|
109
|
+
|
|
110
|
+
# These should be wrapped in interfaces instead
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Summary Report Script
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
#!/bin/bash
|
|
119
|
+
# test-health-check.sh - Quick test quality assessment
|
|
120
|
+
|
|
121
|
+
echo "=== Test Health Check ==="
|
|
122
|
+
echo ""
|
|
123
|
+
|
|
124
|
+
echo "Coverage Indicators:"
|
|
125
|
+
echo " Source functions: $(grep -rn 'export function' --include='*.ts' src/ 2>/dev/null | wc -l)"
|
|
126
|
+
echo " Test blocks: $(grep -rn 'it\(' --include='*.test.ts' 2>/dev/null | wc -l)"
|
|
127
|
+
echo ""
|
|
128
|
+
|
|
129
|
+
echo "Quality Indicators:"
|
|
130
|
+
echo " Strong assertions: $(grep -rn 'toEqual\|toMatchObject' --include='*.test.ts' 2>/dev/null | wc -l)"
|
|
131
|
+
echo " Weak assertions: $(grep -rn 'toBeDefined\|toBeTruthy' --include='*.test.ts' 2>/dev/null | wc -l)"
|
|
132
|
+
echo ""
|
|
133
|
+
|
|
134
|
+
echo "Design Indicators:"
|
|
135
|
+
echo " Long timeouts: $(grep -rn '}, [0-9]\{5,\})' --include='*.test.ts' 2>/dev/null | wc -l)"
|
|
136
|
+
echo " Mock count: $(grep -rn 'jest.fn\|mock' --include='*.test.ts' 2>/dev/null | wc -l)"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Test Coverage Guidelines
|
|
142
|
+
|
|
143
|
+
| Code Type | Required Coverage | Test Type |
|
|
144
|
+
|-----------|-------------------|-----------|
|
|
145
|
+
| Business logic | 90%+ | Unit tests |
|
|
146
|
+
| API endpoints | 80%+ | Integration tests |
|
|
147
|
+
| UI components | 70%+ | Component tests |
|
|
148
|
+
| Utilities | 100% | Unit tests |
|
|
149
|
+
| Error paths | 100% | Unit tests |
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Test Patterns - Correct Examples
|
|
2
|
+
|
|
3
|
+
Reference for proper test patterns and approaches.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Simple Setup Patterns
|
|
8
|
+
|
|
9
|
+
### Pure Function Testing
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// CORRECT: Simple setup indicates good design
|
|
13
|
+
describe('createUser', () => {
|
|
14
|
+
it('should return Ok with valid data', () => {
|
|
15
|
+
const result = createUser({ name: 'test', email: 'test@example.com' });
|
|
16
|
+
expect(result.ok).toBe(true);
|
|
17
|
+
expect(result.value.name).toBe('test');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should return Err with invalid email', () => {
|
|
21
|
+
const result = createUser({ name: 'test', email: 'invalid' });
|
|
22
|
+
expect(result.ok).toBe(false);
|
|
23
|
+
expect(result.error.type).toBe('ValidationError');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Minimal Mocking Patterns
|
|
31
|
+
|
|
32
|
+
### Single Dependency Injection
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// CORRECT: Single mock for focused test
|
|
36
|
+
describe('OrderCalculator', () => {
|
|
37
|
+
it('should calculate total with tax', () => {
|
|
38
|
+
const taxService = { getRate: () => 0.1 }; // Simple mock
|
|
39
|
+
const calculator = new OrderCalculator(taxService);
|
|
40
|
+
const result = calculator.calculateTotal([
|
|
41
|
+
{ price: 100, quantity: 2 },
|
|
42
|
+
{ price: 50, quantity: 1 },
|
|
43
|
+
]);
|
|
44
|
+
expect(result).toBe(275);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Behavior-Focused Testing
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// CORRECT: Testing behavior, not implementation
|
|
55
|
+
describe('ShoppingCart', () => {
|
|
56
|
+
it('should calculate correct total after adding items', () => {
|
|
57
|
+
const cart = new ShoppingCart();
|
|
58
|
+
cart.addItem({ id: '1', price: 10 });
|
|
59
|
+
cart.addItem({ id: '2', price: 20 });
|
|
60
|
+
expect(cart.getTotal()).toBe(30);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should be empty after clearing', () => {
|
|
64
|
+
const cart = new ShoppingCart();
|
|
65
|
+
cart.addItem({ id: '1', price: 10 });
|
|
66
|
+
cart.clear();
|
|
67
|
+
expect(cart.getItems()).toEqual([]);
|
|
68
|
+
expect(cart.getTotal()).toBe(0);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Coverage Patterns
|
|
76
|
+
|
|
77
|
+
### Branch Coverage
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
describe('calculateDiscount', () => {
|
|
81
|
+
it('returns 10% for regular customers', () => {
|
|
82
|
+
expect(calculateDiscount(100, 'regular')).toBe(10);
|
|
83
|
+
});
|
|
84
|
+
it('returns 20% for premium customers', () => {
|
|
85
|
+
expect(calculateDiscount(100, 'premium')).toBe(20);
|
|
86
|
+
});
|
|
87
|
+
it('returns 30% for VIP customers', () => {
|
|
88
|
+
expect(calculateDiscount(100, 'vip')).toBe(30);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Error Path Coverage
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
describe('fetchUser', () => {
|
|
97
|
+
it('returns user data on success', async () => { /* ... */ });
|
|
98
|
+
it('throws ApiError on 404', async () => {
|
|
99
|
+
api.get.mockResolvedValue({ ok: false, status: 404 });
|
|
100
|
+
await expect(fetchUser('123')).rejects.toThrow(ApiError);
|
|
101
|
+
});
|
|
102
|
+
it('handles network errors', async () => {
|
|
103
|
+
api.get.mockRejectedValue(new Error('Network error'));
|
|
104
|
+
await expect(fetchUser('123')).rejects.toThrow('Network error');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Separation of Concerns Testing
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// CORRECT: Business logic tested without I/O
|
|
115
|
+
describe('OrderPricing (pure logic)', () => {
|
|
116
|
+
it('should calculate subtotal', () => {
|
|
117
|
+
const items = [{ price: 100, quantity: 2 }, { price: 50, quantity: 1 }];
|
|
118
|
+
expect(calculateSubtotal(items)).toBe(250);
|
|
119
|
+
});
|
|
120
|
+
it('should apply percentage discount', () => {
|
|
121
|
+
expect(applyDiscount(100, { type: 'percent', value: 20 })).toBe(80);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Integration test for I/O wrapper
|
|
126
|
+
describe('OrderService (integration)', () => {
|
|
127
|
+
it('should persist order and return result', async () => {
|
|
128
|
+
const mockRepo = { save: jest.fn().mockResolvedValue({ id: '1' }) };
|
|
129
|
+
const service = new OrderService(mockRepo);
|
|
130
|
+
const result = await service.createOrder({ items: [{ price: 100, quantity: 1 }] });
|
|
131
|
+
expect(result.ok).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Parameterized Testing
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
describe('validateEmail', () => {
|
|
142
|
+
const validEmails = ['test@example.com', 'user.name@domain.org', 'user+tag@example.co.uk'];
|
|
143
|
+
const invalidEmails = ['', 'invalid', '@nodomain.com', 'spaces in@email.com'];
|
|
144
|
+
|
|
145
|
+
test.each(validEmails)('should accept valid email: %s', (email) => {
|
|
146
|
+
expect(validateEmail(email).ok).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test.each(invalidEmails)('should reject invalid email: %s', (email) => {
|
|
150
|
+
expect(validateEmail(email).ok).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Boundary Mocking
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// CORRECT: Wrap third-party libraries in your own interface
|
|
161
|
+
interface HttpClient {
|
|
162
|
+
get<T>(url: string): Promise<T>;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
class MockHttpClient implements HttpClient {
|
|
166
|
+
private responses: Map<string, any> = new Map();
|
|
167
|
+
mockResponse(url: string, data: any) { this.responses.set(url, data); }
|
|
168
|
+
async get<T>(url: string): Promise<T> { return this.responses.get(url); }
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Tests use MockHttpClient, production uses AxiosHttpClient
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Test Organization
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
describe('UserService', () => {
|
|
180
|
+
let service: UserService;
|
|
181
|
+
let repo: InMemoryUserRepo;
|
|
182
|
+
|
|
183
|
+
beforeEach(() => {
|
|
184
|
+
repo = new InMemoryUserRepo();
|
|
185
|
+
service = new UserService(repo);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('create', () => {
|
|
189
|
+
it('creates user with valid data', async () => { /* ... */ });
|
|
190
|
+
it('rejects invalid email', async () => { /* ... */ });
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe('update', () => {
|
|
194
|
+
it('updates existing user', async () => { /* ... */ });
|
|
195
|
+
it('returns error for non-existent user', async () => { /* ... */ });
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Test Data Factories
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// CORRECT: Factories for test data, not test setup
|
|
206
|
+
const createTestUser = (overrides = {}): User => ({
|
|
207
|
+
id: 'test-id',
|
|
208
|
+
name: 'Test User',
|
|
209
|
+
email: 'test@example.com',
|
|
210
|
+
role: 'user',
|
|
211
|
+
...overrides,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
describe('UserPermissions', () => {
|
|
215
|
+
it('should allow admin to delete users', () => {
|
|
216
|
+
const admin = createTestUser({ role: 'admin' });
|
|
217
|
+
expect(canDeleteUser(admin)).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Test Quality Report Template
|
|
2
|
+
|
|
3
|
+
Use this template when reporting test design issues.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Report Format
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
## Test Design Issues Detected
|
|
11
|
+
|
|
12
|
+
## [SEVERITY] - [Category] ([Root Cause Type])
|
|
13
|
+
**File**: path/to/file.test.ts:line-range
|
|
14
|
+
**Issue**: Brief description of the problem
|
|
15
|
+
**Root Cause**: What architectural issue causes this
|
|
16
|
+
**Symptom**:
|
|
17
|
+
```code
|
|
18
|
+
// The problematic code snippet
|
|
19
|
+
```
|
|
20
|
+
**Correct Design**:
|
|
21
|
+
```code
|
|
22
|
+
// What good design looks like
|
|
23
|
+
```
|
|
24
|
+
**Action Required**: Specific action to fix
|
|
25
|
+
|
|
26
|
+
## Summary
|
|
27
|
+
- **Critical**: N issues (block implementation)
|
|
28
|
+
- **High**: N issues (refactor needed)
|
|
29
|
+
- **Files affected**: N test files
|
|
30
|
+
- **Root cause**: Brief architectural diagnosis
|
|
31
|
+
|
|
32
|
+
## STOP - Design Issues Detected
|
|
33
|
+
|
|
34
|
+
[List fundamental design flaws discovered]
|
|
35
|
+
|
|
36
|
+
**DO NOT work around these issues in tests.**
|
|
37
|
+
**DO NOT add more complex test helpers.**
|
|
38
|
+
**DO NOT mock more things to make tests pass.**
|
|
39
|
+
|
|
40
|
+
## Next Steps
|
|
41
|
+
|
|
42
|
+
1. **STOP writing tests** - Current design cannot be tested simply
|
|
43
|
+
2. **ANALYZE root cause** - Identify architectural issue
|
|
44
|
+
3. **PROPOSE redesign** - Show correct pattern
|
|
45
|
+
4. **GET APPROVAL** - User confirms design changes
|
|
46
|
+
5. **IMPLEMENT redesign** - Fix architecture first
|
|
47
|
+
6. **WRITE SIMPLE TESTS** - Tests should be trivial after redesign
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Severity Levels
|
|
53
|
+
|
|
54
|
+
| Severity | Use For | Examples |
|
|
55
|
+
|----------|---------|---------|
|
|
56
|
+
| **CRITICAL** | Fundamental design flaws | Complex setup >10 lines, repetitive boilerplate >3 times, mock objects >5 methods, testing private methods |
|
|
57
|
+
| **HIGH** | Maintenance complications | Difficult mocking >20 lines, implementation testing, environment manipulation, database seeding |
|
|
58
|
+
| **MEDIUM** | Reduced clarity | Test helper abuse, inconsistent assertion patterns, missing edge case coverage |
|
|
59
|
+
| **LOW** | Minor improvements | Organization, naming clarity |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Category Labels
|
|
64
|
+
|
|
65
|
+
| Category | Root Cause Type | Indicates |
|
|
66
|
+
|----------|-----------------|-----------|
|
|
67
|
+
| Complex Setup | Design Problem | Too many dependencies |
|
|
68
|
+
| Repetitive Boilerplate | API Problem | Inconsistent error handling |
|
|
69
|
+
| Difficult Mocking | Coupling Problem | Tight coupling to externals |
|
|
70
|
+
| Implementation Testing | Fragile Tests | Tests coupled to internals |
|
|
71
|
+
| Environment Manipulation | DI Problem | Direct environment access |
|
|
72
|
+
| Database Seeding | Separation Problem | Logic mixed with data access |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Test Suite Safety Configuration
|
|
77
|
+
|
|
78
|
+
### Full Configuration Examples
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// vitest.config.ts
|
|
82
|
+
export default defineConfig({
|
|
83
|
+
test: {
|
|
84
|
+
fileParallelism: false,
|
|
85
|
+
maxWorkers: 1,
|
|
86
|
+
pool: 'forks',
|
|
87
|
+
testTimeout: 10000,
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// jest.config.js
|
|
92
|
+
module.exports = {
|
|
93
|
+
maxWorkers: 1,
|
|
94
|
+
runInBand: true,
|
|
95
|
+
testTimeout: 10000,
|
|
96
|
+
};
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Memory limits
|
|
101
|
+
NODE_OPTIONS="--max-old-space-size=512" npm test
|
|
102
|
+
|
|
103
|
+
# Go
|
|
104
|
+
go test -p 1 ./...
|
|
105
|
+
|
|
106
|
+
# Rust
|
|
107
|
+
cargo test -- --test-threads=1
|
|
108
|
+
```
|