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,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
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Test Pattern Violations - Extended Examples
|
|
2
|
+
|
|
3
|
+
Reference examples for common test quality violations across both design and review contexts.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Complex Setup Violations
|
|
8
|
+
|
|
9
|
+
### Multi-Dependency Service Setup
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// VIOLATION: Complex setup indicates design problem
|
|
13
|
+
describe('UserService', () => {
|
|
14
|
+
let service: UserService;
|
|
15
|
+
let mockDb: MockDatabase;
|
|
16
|
+
let mockCache: MockCache;
|
|
17
|
+
let mockLogger: MockLogger;
|
|
18
|
+
let mockConfig: MockConfig;
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
mockDb = new MockDatabase();
|
|
22
|
+
await mockDb.connect();
|
|
23
|
+
await mockDb.seed();
|
|
24
|
+
mockCache = new MockCache();
|
|
25
|
+
mockCache.clear();
|
|
26
|
+
mockLogger = new MockLogger();
|
|
27
|
+
mockConfig = new MockConfig();
|
|
28
|
+
mockConfig.set('env', 'test');
|
|
29
|
+
// ... 10+ more lines
|
|
30
|
+
service = new UserService(mockDb, mockCache, mockLogger, mockConfig);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should create user', async () => {
|
|
34
|
+
const result = await service.createUser({ name: 'test' });
|
|
35
|
+
expect(result.ok).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Root Cause**: UserService has too many dependencies (6+ injected services)
|
|
41
|
+
|
|
42
|
+
**Solution**: Split into focused services with single responsibility
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Repetitive Boilerplate Violations
|
|
47
|
+
|
|
48
|
+
### Try/Catch Pattern Repetition
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// VIOLATION: Repetitive error handling indicates API problem
|
|
52
|
+
describe('API endpoints', () => {
|
|
53
|
+
it('should handle user creation error', async () => {
|
|
54
|
+
try {
|
|
55
|
+
await api.createUser(invalidData);
|
|
56
|
+
fail('Should have thrown');
|
|
57
|
+
} catch (error) {
|
|
58
|
+
expect(error.status).toBe(400);
|
|
59
|
+
expect(error.message).toContain('validation');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// ... repeated pattern 10+ times
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Root Cause**: API throws exceptions instead of returning Results
|
|
68
|
+
|
|
69
|
+
**Solution**: Migrate API to Result pattern
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Difficult Mocking Violations
|
|
74
|
+
|
|
75
|
+
### Nested Mock Object Structures
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// VIOLATION: Complex mocking indicates tight coupling
|
|
79
|
+
beforeEach(() => {
|
|
80
|
+
mockDb = {
|
|
81
|
+
transaction: jest.fn((callback) => callback(mockDb)),
|
|
82
|
+
orders: { create: jest.fn(), update: jest.fn(), findById: jest.fn() },
|
|
83
|
+
users: { findById: jest.fn(), update: jest.fn() },
|
|
84
|
+
inventory: { decrement: jest.fn(), check: jest.fn(), reserve: jest.fn() }
|
|
85
|
+
};
|
|
86
|
+
// 5+ more mock objects...
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Root Cause**: OrderProcessor directly depends on too many external systems
|
|
91
|
+
|
|
92
|
+
**Solution**: Separate pure business logic from I/O; use composition
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Implementation Testing Violations
|
|
97
|
+
|
|
98
|
+
### Spying on Private Methods
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// VIOLATION: Testing implementation details
|
|
102
|
+
it('should call updateTotal after addItem', () => {
|
|
103
|
+
const cart = new ShoppingCart();
|
|
104
|
+
const spy = jest.spyOn(cart as any, 'updateTotal');
|
|
105
|
+
cart.addItem({ id: '1', price: 10 });
|
|
106
|
+
expect(spy).toHaveBeenCalled(); // Testing implementation!
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Root Cause**: Tests coupled to implementation details
|
|
111
|
+
|
|
112
|
+
**Solution**: Test observable behavior only
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Coverage Violations
|
|
117
|
+
|
|
118
|
+
### Missing Edge Cases
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// INCOMPLETE TESTS
|
|
122
|
+
describe('divide', () => {
|
|
123
|
+
it('divides two numbers', () => {
|
|
124
|
+
expect(divide(10, 2)).toBe(5); // Happy path only
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// COMPLETE TESTS
|
|
129
|
+
describe('divide', () => {
|
|
130
|
+
it('divides two positive numbers', () => { expect(divide(10, 2)).toBe(5); });
|
|
131
|
+
it('handles division by zero', () => { expect(divide(10, 0)).toBe(Infinity); });
|
|
132
|
+
it('handles negative numbers', () => { expect(divide(-10, 2)).toBe(-5); });
|
|
133
|
+
it('handles decimal results', () => { expect(divide(10, 3)).toBeCloseTo(3.333, 2); });
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Unclear Test Names
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// UNCLEAR: What does this test?
|
|
141
|
+
it('test1', () => { /* ... */ });
|
|
142
|
+
it('should work', () => { /* ... */ });
|
|
143
|
+
|
|
144
|
+
// CLEAR: Describes behavior
|
|
145
|
+
it('validates email format on creation', () => { /* ... */ });
|
|
146
|
+
it('rejects passwords shorter than 8 characters', () => { /* ... */ });
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Test Design Violations
|
|
152
|
+
|
|
153
|
+
### Slow Tests (Real Delays)
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// SLOW: Real delays
|
|
157
|
+
const result = await fetchWithRetry(); // Waits real 1000ms
|
|
158
|
+
|
|
159
|
+
// FAST: Mock timers
|
|
160
|
+
jest.useFakeTimers();
|
|
161
|
+
const promise = fetchWithRetry();
|
|
162
|
+
jest.advanceTimersByTime(1000);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Flaky Tests (Timing Dependencies)
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
// FLAKY: Race condition
|
|
169
|
+
subscribe(callback);
|
|
170
|
+
emit('update', { value: 1 });
|
|
171
|
+
expect(callback).toHaveBeenCalled(); // Might not have fired yet
|
|
172
|
+
|
|
173
|
+
// STABLE: Explicit waiting
|
|
174
|
+
const received = new Promise(resolve => { subscribe(data => resolve(data)); });
|
|
175
|
+
emit('update', { value: 1 });
|
|
176
|
+
const data = await received;
|
|
177
|
+
expect(data.value).toBe(1);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Over-Mocking
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// OVER-MOCKED: Tests nothing real
|
|
184
|
+
const mockValidator = { validate: jest.fn().mockReturnValue(true) };
|
|
185
|
+
const mockHasher = { hash: jest.fn().mockReturnValue('hashed') };
|
|
186
|
+
const mockRepo = { create: jest.fn().mockResolvedValue({ id: '1' }) };
|
|
187
|
+
// What did we actually test? Just that mocks were called.
|
|
188
|
+
|
|
189
|
+
// BETTER: Use real implementations where possible
|
|
190
|
+
const repo = new InMemoryUserRepo();
|
|
191
|
+
const service = new UserService(new RealValidator(), new RealHasher(), repo);
|
|
192
|
+
const saved = await repo.findByEmail('test@test.com');
|
|
193
|
+
expect(await bcrypt.compare('password', saved.password)).toBe(true);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Environment & Database Violations
|
|
199
|
+
|
|
200
|
+
### Environment Manipulation
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// VIOLATION: Tests modifying environment
|
|
204
|
+
beforeEach(() => {
|
|
205
|
+
process.env = { ...process.env, DATABASE_URL: 'postgres://test', API_KEY: 'test-key' };
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Solution**: Inject configuration as a dependency
|
|
210
|
+
|
|
211
|
+
### Database State Dependencies
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// VIOLATION: Tests depend on specific seeded data
|
|
215
|
+
beforeAll(async () => {
|
|
216
|
+
await db.users.insert([/* ... */]);
|
|
217
|
+
await db.orders.insert([/* ... */]);
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Solution**: Separate data access from business logic; test calculation separately
|