devflow-kit 0.8.1 → 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 +185 -29
- package/LICENSE +1 -1
- package/README.md +179 -308
- package/dist/cli.js +3 -1
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.js +311 -575
- 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/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -423
- 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/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -269
- 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,565 @@
|
|
|
1
|
+
# React Violation Examples
|
|
2
|
+
|
|
3
|
+
Extended violation patterns for React reviews. Reference from main SKILL.md.
|
|
4
|
+
|
|
5
|
+
## Vercel Performance Violations
|
|
6
|
+
|
|
7
|
+
### Sequential Fetches
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
// VIOLATION: Sequential fetches (waterfall)
|
|
11
|
+
async function loadDashboard(userId: string) {
|
|
12
|
+
const user = await fetchUser(userId);
|
|
13
|
+
const orders = await fetchOrders(userId); // Waits for user
|
|
14
|
+
const prefs = await fetchPreferences(userId); // Waits for orders
|
|
15
|
+
return { user, orders, prefs };
|
|
16
|
+
}
|
|
17
|
+
// Total time: T(user) + T(orders) + T(prefs)
|
|
18
|
+
// Should be: max(T(user), T(orders), T(prefs))
|
|
19
|
+
|
|
20
|
+
// VIOLATION: Sequential in useEffect
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
async function load() {
|
|
23
|
+
setUser(await fetchUser(id));
|
|
24
|
+
setOrders(await fetchOrders(id)); // Sequential
|
|
25
|
+
setStats(await fetchStats(id)); // Sequential
|
|
26
|
+
}
|
|
27
|
+
load();
|
|
28
|
+
}, [id]);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Barrel Import Anti-Patterns
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
// VIOLATION: Barrel import pulls entire library
|
|
35
|
+
import { Button } from '@/components';
|
|
36
|
+
import { formatDate, formatCurrency, formatNumber } from '@/utils';
|
|
37
|
+
import { IconHome, IconUser } from '@/icons';
|
|
38
|
+
|
|
39
|
+
// VIOLATION: Named imports from large packages
|
|
40
|
+
import { debounce } from 'lodash'; // Imports entire lodash
|
|
41
|
+
import { Button, Input, Select } from 'antd'; // Large bundle
|
|
42
|
+
|
|
43
|
+
// VIOLATION: Not lazy loading heavy dependencies
|
|
44
|
+
import Editor from '@monaco-editor/react'; // 2MB+ bundle
|
|
45
|
+
import { Chart } from 'chart.js'; // Heavy charting library
|
|
46
|
+
|
|
47
|
+
function Dashboard() {
|
|
48
|
+
const [showChart, setShowChart] = useState(false);
|
|
49
|
+
return (
|
|
50
|
+
<div>
|
|
51
|
+
{showChart && <Chart />} {/* Loaded even when not shown */}
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Re-render Causing Patterns
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
// VIOLATION: Object literal in deps (new ref every render)
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
fetchData(config);
|
|
63
|
+
}, [{ page: 1, limit: 10 }]); // Always "changed"
|
|
64
|
+
|
|
65
|
+
// VIOLATION: Array in deps
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
updateFilters(filters);
|
|
68
|
+
}, [[filter1, filter2, filter3]]); // New array every render
|
|
69
|
+
|
|
70
|
+
// VIOLATION: Inline callback to memoized child
|
|
71
|
+
const MemoChild = memo(Child);
|
|
72
|
+
|
|
73
|
+
function Parent() {
|
|
74
|
+
return (
|
|
75
|
+
<MemoChild
|
|
76
|
+
onClick={() => console.log('clicked')} // New fn = re-render
|
|
77
|
+
style={{ color: 'blue' }} // New object = re-render
|
|
78
|
+
/>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// VIOLATION: Computed value in render without memo
|
|
83
|
+
function FilteredList({ items, filter }: Props) {
|
|
84
|
+
const filtered = items.filter(i => i.includes(filter)); // Every render
|
|
85
|
+
return <List items={filtered} />;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Unoptimized Images
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
// VIOLATION: No dimensions (causes layout shift)
|
|
93
|
+
<img src={url} alt={alt} />
|
|
94
|
+
|
|
95
|
+
// VIOLATION: No lazy loading (loads all images immediately)
|
|
96
|
+
{images.map(img => <img src={img.src} alt={img.alt} />)}
|
|
97
|
+
|
|
98
|
+
// VIOLATION: No aspect ratio (jumps on load)
|
|
99
|
+
<img
|
|
100
|
+
src={url}
|
|
101
|
+
width={400}
|
|
102
|
+
height={300}
|
|
103
|
+
// Missing: style={{ aspectRatio: '4/3' }}
|
|
104
|
+
/>
|
|
105
|
+
|
|
106
|
+
// VIOLATION: Eager loading below fold
|
|
107
|
+
<img
|
|
108
|
+
src={heroImage}
|
|
109
|
+
alt="Hero"
|
|
110
|
+
loading="eager" // Should be lazy for non-critical images
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Inefficient Data Structures
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
// VIOLATION: Array.includes for frequent checks (O(n))
|
|
118
|
+
function SelectableList({ items, selected }: Props) {
|
|
119
|
+
return (
|
|
120
|
+
<ul>
|
|
121
|
+
{items.map(item => (
|
|
122
|
+
<li className={selected.includes(item.id) ? 'selected' : ''}>
|
|
123
|
+
{/* O(n) check on every item render */}
|
|
124
|
+
{item.name}
|
|
125
|
+
</li>
|
|
126
|
+
))}
|
|
127
|
+
</ul>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// VIOLATION: Array.find for lookups (O(n))
|
|
132
|
+
function UserDisplay({ userId, users }: Props) {
|
|
133
|
+
const user = users.find(u => u.id === userId); // O(n) every render
|
|
134
|
+
return <span>{user?.name}</span>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// VIOLATION: Filter + map in render (double iteration)
|
|
138
|
+
function ActiveUsers({ users }: Props) {
|
|
139
|
+
return (
|
|
140
|
+
<ul>
|
|
141
|
+
{users
|
|
142
|
+
.filter(u => u.active)
|
|
143
|
+
.map(u => <li key={u.id}>{u.name}</li>)
|
|
144
|
+
}
|
|
145
|
+
</ul>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// VIOLATION: Recreating Set every render
|
|
150
|
+
function Tags({ tags, selected }: Props) {
|
|
151
|
+
const selectedSet = new Set(selected); // Created every render
|
|
152
|
+
return tags.map(tag => (
|
|
153
|
+
<Tag selected={selectedSet.has(tag)} />
|
|
154
|
+
));
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Component Violations
|
|
161
|
+
|
|
162
|
+
### Prop Drilling
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
// VIOLATION: Passing data through multiple intermediate components
|
|
166
|
+
function App() {
|
|
167
|
+
const [user, setUser] = useState<User | null>(null);
|
|
168
|
+
|
|
169
|
+
return (
|
|
170
|
+
<Layout user={user}>
|
|
171
|
+
<Sidebar user={user}>
|
|
172
|
+
<Navigation user={user}>
|
|
173
|
+
<UserMenu user={user} /> {/* Props drilled through 3 levels */}
|
|
174
|
+
</Navigation>
|
|
175
|
+
</Sidebar>
|
|
176
|
+
</Layout>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Rigid Component Structure
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
// VIOLATION: Too many props, no composition
|
|
185
|
+
function Card({
|
|
186
|
+
title,
|
|
187
|
+
subtitle,
|
|
188
|
+
content,
|
|
189
|
+
footer,
|
|
190
|
+
headerIcon,
|
|
191
|
+
showCloseButton,
|
|
192
|
+
onClose,
|
|
193
|
+
variant,
|
|
194
|
+
size,
|
|
195
|
+
className
|
|
196
|
+
}: CardProps) {
|
|
197
|
+
return (
|
|
198
|
+
<div className={className}>
|
|
199
|
+
<header>
|
|
200
|
+
{headerIcon && <Icon name={headerIcon} />}
|
|
201
|
+
<h2>{title}</h2>
|
|
202
|
+
<p>{subtitle}</p>
|
|
203
|
+
{showCloseButton && <button onClick={onClose}>X</button>}
|
|
204
|
+
</header>
|
|
205
|
+
<div>{content}</div>
|
|
206
|
+
<footer>{footer}</footer>
|
|
207
|
+
</div>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Direct State Mutation
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
// VIOLATION: Mutating state directly
|
|
216
|
+
function UserList() {
|
|
217
|
+
const [users, setUsers] = useState<User[]>([]);
|
|
218
|
+
|
|
219
|
+
const updateUser = (index: number, name: string) => {
|
|
220
|
+
users[index].name = name; // BAD: Direct mutation
|
|
221
|
+
setUsers(users); // Won't trigger re-render
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Missing Keys
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
// VIOLATION: Index as key causes reconciliation issues
|
|
230
|
+
{items.map((item, index) => (
|
|
231
|
+
<Item key={index} {...item} /> // Index key breaks reordering
|
|
232
|
+
))}
|
|
233
|
+
|
|
234
|
+
// VIOLATION: Missing key entirely
|
|
235
|
+
{items.map((item) => (
|
|
236
|
+
<Item {...item} /> // React warning, poor performance
|
|
237
|
+
))}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Hooks Violations
|
|
243
|
+
|
|
244
|
+
### Missing Dependencies
|
|
245
|
+
|
|
246
|
+
```tsx
|
|
247
|
+
// VIOLATION: Missing dependency causes stale closure
|
|
248
|
+
function SearchResults({ query }: { query: string }) {
|
|
249
|
+
const [results, setResults] = useState<Result[]>([]);
|
|
250
|
+
|
|
251
|
+
useEffect(() => {
|
|
252
|
+
fetchResults(query).then(setResults);
|
|
253
|
+
}, []); // BAD: Missing 'query' dependency
|
|
254
|
+
|
|
255
|
+
return <ResultsList results={results} />;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Conditional Hooks
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
// VIOLATION: Hook called conditionally
|
|
263
|
+
function UserProfile({ user }: { user: User | null }) {
|
|
264
|
+
if (!user) {
|
|
265
|
+
return <LoginPrompt />;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// BAD: Hook called after conditional return
|
|
269
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
270
|
+
|
|
271
|
+
return <ProfileEditor user={user} isEditing={isEditing} />;
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Stale Closure in Callbacks
|
|
276
|
+
|
|
277
|
+
```tsx
|
|
278
|
+
// VIOLATION: Callback captures stale state
|
|
279
|
+
function Counter() {
|
|
280
|
+
const [count, setCount] = useState(0);
|
|
281
|
+
|
|
282
|
+
useEffect(() => {
|
|
283
|
+
const interval = setInterval(() => {
|
|
284
|
+
setCount(count + 1); // BAD: Always references initial count (0)
|
|
285
|
+
}, 1000);
|
|
286
|
+
|
|
287
|
+
return () => clearInterval(interval);
|
|
288
|
+
}, []); // Missing count dependency
|
|
289
|
+
|
|
290
|
+
return <span>{count}</span>;
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Effects Without Cleanup
|
|
295
|
+
|
|
296
|
+
```tsx
|
|
297
|
+
// VIOLATION: Event listener never removed
|
|
298
|
+
function WindowSize() {
|
|
299
|
+
const [size, setSize] = useState({ width: 0, height: 0 });
|
|
300
|
+
|
|
301
|
+
useEffect(() => {
|
|
302
|
+
const handleResize = () => {
|
|
303
|
+
setSize({ width: window.innerWidth, height: window.innerHeight });
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
window.addEventListener('resize', handleResize);
|
|
307
|
+
// BAD: Missing cleanup - memory leak
|
|
308
|
+
}, []);
|
|
309
|
+
|
|
310
|
+
return <span>{size.width} x {size.height}</span>;
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Derived State in useState
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
// VIOLATION: Storing computed value in state
|
|
318
|
+
function ProductList({ products, filter }: Props) {
|
|
319
|
+
const [filteredProducts, setFilteredProducts] = useState<Product[]>([]);
|
|
320
|
+
|
|
321
|
+
useEffect(() => {
|
|
322
|
+
setFilteredProducts(products.filter(p => p.category === filter));
|
|
323
|
+
}, [products, filter]); // BAD: Unnecessary state and effect
|
|
324
|
+
|
|
325
|
+
return <List items={filteredProducts} />;
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Forms Violations
|
|
332
|
+
|
|
333
|
+
### Uncontrolled to Controlled Switch
|
|
334
|
+
|
|
335
|
+
```tsx
|
|
336
|
+
// VIOLATION: Switching from uncontrolled to controlled
|
|
337
|
+
function SearchInput() {
|
|
338
|
+
const [value, setValue] = useState<string>(); // undefined initially
|
|
339
|
+
|
|
340
|
+
return (
|
|
341
|
+
<input
|
|
342
|
+
value={value} // BAD: undefined -> string causes warning
|
|
343
|
+
onChange={(e) => setValue(e.target.value)}
|
|
344
|
+
/>
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Missing Form Validation
|
|
350
|
+
|
|
351
|
+
```tsx
|
|
352
|
+
// VIOLATION: No validation, direct submission
|
|
353
|
+
function LoginForm({ onSubmit }: Props) {
|
|
354
|
+
const [email, setEmail] = useState('');
|
|
355
|
+
const [password, setPassword] = useState('');
|
|
356
|
+
|
|
357
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
358
|
+
e.preventDefault();
|
|
359
|
+
onSubmit({ email, password }); // BAD: No validation
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
return (
|
|
363
|
+
<form onSubmit={handleSubmit}>
|
|
364
|
+
<input value={email} onChange={(e) => setEmail(e.target.value)} />
|
|
365
|
+
<input value={password} onChange={(e) => setPassword(e.target.value)} />
|
|
366
|
+
<button type="submit">Login</button>
|
|
367
|
+
</form>
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Missing Accessibility Attributes
|
|
373
|
+
|
|
374
|
+
```tsx
|
|
375
|
+
// VIOLATION: Form inputs without proper accessibility
|
|
376
|
+
function ContactForm() {
|
|
377
|
+
return (
|
|
378
|
+
<form>
|
|
379
|
+
{/* BAD: No labels, no aria attributes, no error announcements */}
|
|
380
|
+
<input placeholder="Email" />
|
|
381
|
+
{error && <span style={{ color: 'red' }}>{error}</span>}
|
|
382
|
+
<button>Submit</button>
|
|
383
|
+
</form>
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Form State Not Reset After Submit
|
|
389
|
+
|
|
390
|
+
```tsx
|
|
391
|
+
// VIOLATION: Form keeps stale data after successful submit
|
|
392
|
+
function CommentForm({ onSubmit }: Props) {
|
|
393
|
+
const [comment, setComment] = useState('');
|
|
394
|
+
|
|
395
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
396
|
+
e.preventDefault();
|
|
397
|
+
await onSubmit(comment);
|
|
398
|
+
// BAD: Missing state reset after successful submit
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
return (
|
|
402
|
+
<form onSubmit={handleSubmit}>
|
|
403
|
+
<textarea value={comment} onChange={(e) => setComment(e.target.value)} />
|
|
404
|
+
<button type="submit">Post</button>
|
|
405
|
+
</form>
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Error Handling Violations
|
|
413
|
+
|
|
414
|
+
### Missing Error Boundaries
|
|
415
|
+
|
|
416
|
+
```tsx
|
|
417
|
+
// VIOLATION: No error boundary around risky component
|
|
418
|
+
function App() {
|
|
419
|
+
return (
|
|
420
|
+
<div>
|
|
421
|
+
<Header />
|
|
422
|
+
<main>
|
|
423
|
+
<UserProfile userId={userId} /> {/* If this crashes, entire app crashes */}
|
|
424
|
+
<OrderHistory userId={userId} />
|
|
425
|
+
</main>
|
|
426
|
+
<Footer />
|
|
427
|
+
</div>
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Swallowed Errors
|
|
433
|
+
|
|
434
|
+
```tsx
|
|
435
|
+
// VIOLATION: Error caught but not handled
|
|
436
|
+
function DataLoader({ url }: { url: string }) {
|
|
437
|
+
const [data, setData] = useState(null);
|
|
438
|
+
|
|
439
|
+
useEffect(() => {
|
|
440
|
+
fetch(url)
|
|
441
|
+
.then(res => res.json())
|
|
442
|
+
.then(setData)
|
|
443
|
+
.catch(() => {}); // BAD: Silently swallows error
|
|
444
|
+
}, [url]);
|
|
445
|
+
|
|
446
|
+
return data ? <DataDisplay data={data} /> : <Spinner />;
|
|
447
|
+
}
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### No Loading/Error States
|
|
451
|
+
|
|
452
|
+
```tsx
|
|
453
|
+
// VIOLATION: Only handles success case
|
|
454
|
+
function UserProfile({ userId }: { userId: string }) {
|
|
455
|
+
const [user, setUser] = useState<User | null>(null);
|
|
456
|
+
|
|
457
|
+
useEffect(() => {
|
|
458
|
+
fetchUser(userId).then(setUser);
|
|
459
|
+
}, [userId]);
|
|
460
|
+
|
|
461
|
+
// BAD: No loading spinner, no error handling
|
|
462
|
+
return user ? <Profile user={user} /> : null;
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Error State Not Cleared
|
|
467
|
+
|
|
468
|
+
```tsx
|
|
469
|
+
// VIOLATION: Error persists after retry
|
|
470
|
+
function DataFetcher({ url }: { url: string }) {
|
|
471
|
+
const [data, setData] = useState(null);
|
|
472
|
+
const [error, setError] = useState<Error | null>(null);
|
|
473
|
+
|
|
474
|
+
const fetchData = async () => {
|
|
475
|
+
try {
|
|
476
|
+
const result = await fetch(url).then(r => r.json());
|
|
477
|
+
setData(result);
|
|
478
|
+
// BAD: Error state not cleared on success
|
|
479
|
+
} catch (e) {
|
|
480
|
+
setError(e as Error);
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
return (
|
|
485
|
+
<div>
|
|
486
|
+
{error && <ErrorMessage error={error} />}
|
|
487
|
+
<button onClick={fetchData}>Retry</button>
|
|
488
|
+
</div>
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## Performance Violations
|
|
496
|
+
|
|
497
|
+
### Inline Objects in JSX
|
|
498
|
+
|
|
499
|
+
```tsx
|
|
500
|
+
// VIOLATION: New reference every render
|
|
501
|
+
<Component
|
|
502
|
+
options={{ show: true, animate: false }} // New object each render
|
|
503
|
+
items={[1, 2, 3]} // New array each render
|
|
504
|
+
/>
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Inline Arrow Functions in JSX
|
|
508
|
+
|
|
509
|
+
```tsx
|
|
510
|
+
// VIOLATION: New function every render
|
|
511
|
+
<Button onClick={() => handleClick(item.id)} />
|
|
512
|
+
|
|
513
|
+
// Also creates new function each render
|
|
514
|
+
{items.map(item => (
|
|
515
|
+
<Item
|
|
516
|
+
key={item.id}
|
|
517
|
+
onClick={() => onSelect(item)} // New function per item per render
|
|
518
|
+
/>
|
|
519
|
+
))}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Missing useMemo for Expensive Computations
|
|
523
|
+
|
|
524
|
+
```tsx
|
|
525
|
+
// VIOLATION: Recalculates on every render
|
|
526
|
+
function Dashboard({ data }: { data: DataPoint[] }) {
|
|
527
|
+
const stats = computeExpensiveStats(data); // Runs every render
|
|
528
|
+
const chartData = transformForChart(data); // Also runs every render
|
|
529
|
+
|
|
530
|
+
return (
|
|
531
|
+
<div>
|
|
532
|
+
<Stats data={stats} />
|
|
533
|
+
<Chart data={chartData} />
|
|
534
|
+
</div>
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### State Updates in Render
|
|
540
|
+
|
|
541
|
+
```tsx
|
|
542
|
+
// VIOLATION: Causes infinite loop
|
|
543
|
+
function Sync({ value }: { value: string }) {
|
|
544
|
+
const [state, setState] = useState(value);
|
|
545
|
+
|
|
546
|
+
if (value !== state) {
|
|
547
|
+
setState(value); // BAD: State update during render
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
return <span>{state}</span>;
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Unthrottled Event Handlers
|
|
555
|
+
|
|
556
|
+
```tsx
|
|
557
|
+
// VIOLATION: Fires on every scroll pixel
|
|
558
|
+
function ParallaxEffect() {
|
|
559
|
+
useEffect(() => {
|
|
560
|
+
window.addEventListener('scroll', () => {
|
|
561
|
+
updateParallax(); // 60+ calls per second
|
|
562
|
+
});
|
|
563
|
+
}, []);
|
|
564
|
+
}
|
|
565
|
+
```
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: regression-patterns
|
|
3
|
+
description: Regression analysis patterns for code review. Detects lost functionality, removed exports, changed signatures, and behavioral changes that break existing consumers. Loaded by Reviewer agent when focus=regression.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: Read, Grep, Glob
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Regression Patterns
|
|
9
|
+
|
|
10
|
+
Domain expertise for detecting functionality regressions and validating implementation intent. Use alongside `review-methodology` for complete regression reviews.
|
|
11
|
+
|
|
12
|
+
## Iron Law
|
|
13
|
+
|
|
14
|
+
> **WHAT WORKED BEFORE MUST WORK AFTER**
|
|
15
|
+
>
|
|
16
|
+
> Every change carries regression risk. Removed exports break consumers. Changed signatures
|
|
17
|
+
> break callers. Modified behavior breaks expectations. The burden of proof is on the change:
|
|
18
|
+
> demonstrate no regression, or document the intentional breaking change.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Regression Categories
|
|
23
|
+
|
|
24
|
+
### 1. Lost Functionality
|
|
25
|
+
|
|
26
|
+
Features, exports, or capabilities that existed before but are missing after.
|
|
27
|
+
|
|
28
|
+
| Type | Risk | Detection |
|
|
29
|
+
|------|------|-----------|
|
|
30
|
+
| Removed exports | Breaks consumers | Compare `export` statements |
|
|
31
|
+
| Removed CLI options | Breaks scripts | Compare option definitions |
|
|
32
|
+
| Removed API endpoints | Breaks clients | Compare route handlers |
|
|
33
|
+
| Removed event handlers | Breaks integrations | Compare `.on()` calls |
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// VIOLATION: Export removed without deprecation
|
|
37
|
+
// BEFORE: export function deleteUser(id: string): void { }
|
|
38
|
+
// AFTER: (removed) - consumers will break!
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 2. Broken Behavior
|
|
42
|
+
|
|
43
|
+
Code still exists but behaves differently in breaking ways.
|
|
44
|
+
|
|
45
|
+
| Type | Risk | Detection |
|
|
46
|
+
|------|------|-----------|
|
|
47
|
+
| Changed return types | Null dereference | Compare function signatures |
|
|
48
|
+
| Changed defaults | Unexpected behavior | Compare default values |
|
|
49
|
+
| Removed side effects | Missing events/logs | Compare emit/log calls |
|
|
50
|
+
| Changed error handling | Uncaught errors | Compare throw/return patterns |
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// VIOLATION: Return type widened without migration
|
|
54
|
+
// BEFORE: function getUser(id: string): User { }
|
|
55
|
+
// AFTER: function getUser(id: string): User | null { }
|
|
56
|
+
// Callers assuming non-null will break!
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 3. Intent vs Reality Mismatch
|
|
60
|
+
|
|
61
|
+
Commit message promises one thing, code does another.
|
|
62
|
+
|
|
63
|
+
| Type | Risk | Detection |
|
|
64
|
+
|------|------|-----------|
|
|
65
|
+
| Commit says X, code does Y | False confidence | Compare message to diff |
|
|
66
|
+
| Partial implementation | Incomplete feature | Check all stated changes |
|
|
67
|
+
| Missing edge cases | Fragile code | Verify claimed coverage |
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// VIOLATION: Commit says "Add retry logic" but no retry implemented
|
|
71
|
+
async function fetchData(): Promise<Data> {
|
|
72
|
+
return api.get('/data'); // No retry!
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 4. Incomplete Migrations
|
|
77
|
+
|
|
78
|
+
Old API deprecated but not all consumers updated.
|
|
79
|
+
|
|
80
|
+
| Type | Risk | Detection |
|
|
81
|
+
|------|------|-----------|
|
|
82
|
+
| Some call sites updated | Mixed behavior | Search for old API usage |
|
|
83
|
+
| Consumers not updated | Type errors | Check all importers |
|
|
84
|
+
| Tests not updated | False passes | Compare test coverage |
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// VIOLATION: Migration incomplete
|
|
88
|
+
// file1.ts: newFunction({ a, b }) // Updated
|
|
89
|
+
// file2.ts: oldFunction(a, b) // NOT updated!
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Quick Detection Commands
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Find removed exports
|
|
98
|
+
git diff main...HEAD | grep "^-export"
|
|
99
|
+
|
|
100
|
+
# Find removed files
|
|
101
|
+
git diff main...HEAD --name-status | grep "^D"
|
|
102
|
+
|
|
103
|
+
# Find incomplete migration (old API still used)
|
|
104
|
+
grep -r "oldFunction" src/ --include="*.ts"
|
|
105
|
+
|
|
106
|
+
# Find new TODOs (incomplete work)
|
|
107
|
+
git diff main...HEAD | grep "^\+.*TODO"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Extended References
|
|
113
|
+
|
|
114
|
+
For extended examples and detection techniques:
|
|
115
|
+
|
|
116
|
+
- **[violations.md](references/violations.md)** - Detailed violation examples for each category
|
|
117
|
+
- **[patterns.md](references/patterns.md)** - Correct patterns for regression-safe changes
|
|
118
|
+
- **[detection.md](references/detection.md)** - Comprehensive bash commands for detection
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Severity Guidelines
|
|
123
|
+
|
|
124
|
+
| Severity | Criteria | Examples |
|
|
125
|
+
|----------|----------|----------|
|
|
126
|
+
| **CRITICAL** | Breaking changes without migration | Public exports removed, return types incompatible, required params added |
|
|
127
|
+
| **HIGH** | Significant behavior changes | Defaults changed, error handling changed, side effects removed |
|
|
128
|
+
| **MEDIUM** | Moderate regression risk | Internal APIs changed, logging reduced, performance changed |
|
|
129
|
+
| **LOW** | Minor concerns | Documentation drift, internal refactoring |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Regression Checklist
|
|
134
|
+
|
|
135
|
+
Before approving changes:
|
|
136
|
+
|
|
137
|
+
- [ ] No exports removed without deprecation
|
|
138
|
+
- [ ] Return types backward compatible
|
|
139
|
+
- [ ] Default values unchanged (or documented)
|
|
140
|
+
- [ ] Side effects preserved (events, logging)
|
|
141
|
+
- [ ] All consumers of changed code updated
|
|
142
|
+
- [ ] Migration complete across codebase
|
|
143
|
+
- [ ] CLI options preserved or deprecated
|
|
144
|
+
- [ ] API endpoints preserved or versioned
|
|
145
|
+
- [ ] Commit message matches implementation
|
|
146
|
+
- [ ] Breaking changes documented in CHANGELOG
|