devflow-kit 0.9.0 → 1.1.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 +197 -29
- package/LICENSE +1 -1
- package/README.md +185 -309
- package/dist/cli.js +7 -1
- package/dist/commands/ambient.d.ts +18 -0
- package/dist/commands/ambient.js +136 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.js +393 -571
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/memory.d.ts +22 -0
- package/dist/commands/memory.js +175 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +418 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +169 -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 +80 -0
- package/dist/utils/post-install.js +508 -0
- package/dist/utils/safe-delete-install.d.ts +29 -0
- package/dist/utils/safe-delete-install.js +191 -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-ambient/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-ambient/README.md +49 -0
- package/plugins/devflow-ambient/commands/ambient.md +110 -0
- package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +89 -0
- package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +64 -0
- 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 +28 -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 +138 -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-driven-development/SKILL.md +139 -0
- package/plugins/devflow-core-skills/skills/test-driven-development/references/rationalization-prevention.md +111 -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/ambient-prompt.sh +48 -0
- package/scripts/hooks/background-memory-update.sh +208 -0
- package/scripts/hooks/ensure-memory-gitignore.sh +17 -0
- package/scripts/hooks/pre-compact-memory.sh +87 -0
- package/scripts/hooks/session-start-memory.sh +126 -0
- package/scripts/hooks/stop-update-memory.sh +85 -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/ambient-router/SKILL.md +89 -0
- package/shared/skills/ambient-router/references/skill-catalog.md +64 -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 +138 -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-driven-development/SKILL.md +139 -0
- package/shared/skills/test-driven-development/references/rationalization-prevention.md +111 -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 +160 -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,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,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-driven-development
|
|
3
|
+
description: >-
|
|
4
|
+
Enforce RED-GREEN-REFACTOR cycle during implementation. Write failing tests before
|
|
5
|
+
production code. Distinct from test-patterns (which reviews test quality) — this
|
|
6
|
+
skill enforces the TDD workflow during code generation.
|
|
7
|
+
user-invocable: false
|
|
8
|
+
allowed-tools: Read, Grep, Glob
|
|
9
|
+
activation:
|
|
10
|
+
file-patterns:
|
|
11
|
+
- "**/*.ts"
|
|
12
|
+
- "**/*.tsx"
|
|
13
|
+
- "**/*.js"
|
|
14
|
+
- "**/*.jsx"
|
|
15
|
+
- "**/*.py"
|
|
16
|
+
exclude:
|
|
17
|
+
- "node_modules/**"
|
|
18
|
+
- "dist/**"
|
|
19
|
+
- "**/*.test.*"
|
|
20
|
+
- "**/*.spec.*"
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Test-Driven Development
|
|
24
|
+
|
|
25
|
+
Enforce the RED-GREEN-REFACTOR cycle for all implementation work. Tests define the design. Code satisfies the tests. Refactoring improves the design without changing behavior.
|
|
26
|
+
|
|
27
|
+
## Iron Law
|
|
28
|
+
|
|
29
|
+
> **TESTS FIRST, ALWAYS**
|
|
30
|
+
>
|
|
31
|
+
> Write the failing test before the production code. No exceptions. If you catch
|
|
32
|
+
> yourself writing production code without a failing test, stop immediately, delete
|
|
33
|
+
> the production code, write the test, watch it fail, then write the minimum code
|
|
34
|
+
> to make it pass. The test IS the specification.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## The Cycle
|
|
39
|
+
|
|
40
|
+
### Step 1: RED — Write a Failing Test
|
|
41
|
+
|
|
42
|
+
Write a test that describes the behavior you want. Run it. Watch it fail. The failure message IS your specification.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Describe what the code SHOULD do, not how it does it.
|
|
46
|
+
One behavior per test. One assertion per test (ideally).
|
|
47
|
+
Name tests as sentences: "returns error when email is invalid"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Checkpoint:** The test MUST fail before proceeding. A test that passes immediately proves nothing.
|
|
51
|
+
|
|
52
|
+
### Step 2: GREEN — Write Minimum Code to Pass
|
|
53
|
+
|
|
54
|
+
Write the simplest production code that makes the failing test pass. No more, no less.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Hardcode first if that's simplest. Generalize when the next test forces it.
|
|
58
|
+
Don't write code "you'll need later." Write code the test demands NOW.
|
|
59
|
+
Don't optimize. Don't refactor. Don't clean up. Just pass the test.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Checkpoint:** All tests pass. If any test fails, fix it before moving on.
|
|
63
|
+
|
|
64
|
+
### Step 3: REFACTOR — Improve Without Changing Behavior
|
|
65
|
+
|
|
66
|
+
Now clean up. Extract helpers, rename variables, simplify logic. Tests stay green throughout.
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Run tests after every refactoring step.
|
|
70
|
+
If a test breaks during refactor, undo immediately — you changed behavior.
|
|
71
|
+
Apply DRY, extract patterns, improve readability.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Checkpoint:** All tests still pass. Code is clean. Repeat from Step 1 for next behavior.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Rationalization Prevention
|
|
79
|
+
|
|
80
|
+
These are the excuses developers use to skip TDD. Recognize and reject them.
|
|
81
|
+
|
|
82
|
+
| Excuse | Why It Feels Right | Why It's Wrong | Correct Action |
|
|
83
|
+
|--------|-------------------|---------------|----------------|
|
|
84
|
+
| "I'll write tests after" | Need to see the shape first | Tests ARE the shape — they define the interface before implementation exists | Write the test first |
|
|
85
|
+
| "Too simple to test" | It's just a getter/setter | Getters break, defaults change, edge cases hide in "simple" code | Write it — takes 30 seconds |
|
|
86
|
+
| "I'll refactor later" | Just get it working now | "Later" never comes; technical debt compounds silently | Refactor now in Step 3 |
|
|
87
|
+
| "Test is too hard to write" | Setup is complex, mocking is painful | Hard-to-test code = bad design; the test is telling you the interface is wrong | Simplify the interface first |
|
|
88
|
+
| "Need to see the whole picture" | Can't test what I haven't designed yet | TDD IS design; each test reveals the next piece of the interface | Let the test guide the design |
|
|
89
|
+
| "Tests slow me down" | Faster to just write the code | Faster until the first regression; TDD is faster for anything > 50 lines | Trust the cycle |
|
|
90
|
+
|
|
91
|
+
See `references/rationalization-prevention.md` for extended examples with code.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Process Enforcement
|
|
96
|
+
|
|
97
|
+
When implementing any feature under ambient BUILD/STANDARD:
|
|
98
|
+
|
|
99
|
+
1. **Identify the first behavior** — What is the simplest thing this feature must do?
|
|
100
|
+
2. **Write the test** — Describe that behavior as a failing test
|
|
101
|
+
3. **Run the test** — Confirm it fails (RED)
|
|
102
|
+
4. **Write minimum code** — Just enough to pass (GREEN)
|
|
103
|
+
5. **Refactor** — Clean up while tests stay green (REFACTOR)
|
|
104
|
+
6. **Repeat** — Next behavior, next test, next cycle
|
|
105
|
+
|
|
106
|
+
### File Organization
|
|
107
|
+
|
|
108
|
+
- Test file lives next to production file: `user.ts` → `user.test.ts`
|
|
109
|
+
- Follow project's existing test conventions (Jest, Vitest, pytest, etc.)
|
|
110
|
+
- Import the module under test, not internal helpers
|
|
111
|
+
|
|
112
|
+
### What to Test
|
|
113
|
+
|
|
114
|
+
| Test | Don't Test |
|
|
115
|
+
|------|-----------|
|
|
116
|
+
| Public API behavior | Private implementation details |
|
|
117
|
+
| Error conditions and edge cases | Framework internals |
|
|
118
|
+
| Integration points (boundaries) | Third-party library correctness |
|
|
119
|
+
| State transitions | Getter/setter plumbing (unless non-trivial) |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## When TDD Does Not Apply
|
|
124
|
+
|
|
125
|
+
- **QUICK depth** — Ambient classified as QUICK (chat, exploration, trivial edits)
|
|
126
|
+
- **Non-code tasks** — Documentation, configuration, CI changes
|
|
127
|
+
- **Exploratory prototyping** — User explicitly says "just spike this" or "prototype"
|
|
128
|
+
- **Existing test suite changes** — Modifying tests themselves (test-patterns skill applies instead)
|
|
129
|
+
|
|
130
|
+
When skipping TDD, never rationalize. State clearly: "Skipping TDD because: [specific reason from list above]."
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Integration with Ambient Mode
|
|
135
|
+
|
|
136
|
+
- **BUILD/STANDARD** → TDD enforced. Every new function/method gets test-first treatment.
|
|
137
|
+
- **BUILD/QUICK** → TDD skipped (trivial single-file edit).
|
|
138
|
+
- **BUILD/ESCALATE** → TDD mentioned in nudge toward `/implement`.
|
|
139
|
+
- **DEBUG/STANDARD** → TDD applies to the fix: write a test that reproduces the bug first, then fix.
|