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,369 @@
|
|
|
1
|
+
# Extended Violation Examples
|
|
2
|
+
|
|
3
|
+
Additional code smell patterns and violations beyond the core examples in SKILL.md.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Result Types - Extended Violations
|
|
8
|
+
|
|
9
|
+
### Try/Catch in Business Logic
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// VIOLATION: Try/catch in business logic
|
|
13
|
+
function calculate(items: Item[]): number {
|
|
14
|
+
try {
|
|
15
|
+
return items.reduce((sum, i) => sum + i.price, 0);
|
|
16
|
+
} catch {
|
|
17
|
+
return 0; // Silent failure - BAD
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// VIOLATION: Nested try/catch
|
|
22
|
+
async function processOrder(id: string): Promise<Order> {
|
|
23
|
+
try {
|
|
24
|
+
const order = await fetchOrder(id);
|
|
25
|
+
try {
|
|
26
|
+
await validateOrder(order);
|
|
27
|
+
} catch {
|
|
28
|
+
// Swallowed validation error
|
|
29
|
+
}
|
|
30
|
+
return order;
|
|
31
|
+
} catch {
|
|
32
|
+
return null; // Silent failure
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// VIOLATION: Error type erasure
|
|
37
|
+
function parseConfig(raw: string): Config {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
throw new Error('Parse failed'); // Lost original error context
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Implicit Error States
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// VIOLATION: Using null/undefined for errors
|
|
50
|
+
function findUser(id: string): User | null {
|
|
51
|
+
// Caller can't distinguish "not found" from "error occurred"
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// VIOLATION: Using sentinel values
|
|
56
|
+
function calculateDiscount(userId: string): number {
|
|
57
|
+
// Returns -1 for errors - magic value
|
|
58
|
+
if (!userId) return -1;
|
|
59
|
+
return computeDiscount(userId);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// VIOLATION: Throwing in async without Result
|
|
63
|
+
async function fetchData(url: string): Promise<Data> {
|
|
64
|
+
const response = await fetch(url);
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
throw new Error('Fetch failed'); // Should return Result
|
|
67
|
+
}
|
|
68
|
+
return response.json();
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Dependency Injection - Extended Violations
|
|
75
|
+
|
|
76
|
+
### Hidden Dependencies
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// VIOLATION: Hidden dependencies via imports
|
|
80
|
+
import { config } from './config'; // Global config
|
|
81
|
+
import { analytics } from './analytics'; // Global analytics
|
|
82
|
+
|
|
83
|
+
class UserService {
|
|
84
|
+
createUser(data: UserData) {
|
|
85
|
+
// Uses global config - can't test with different config
|
|
86
|
+
if (config.features.requireEmailVerification) {
|
|
87
|
+
// ...
|
|
88
|
+
}
|
|
89
|
+
// Uses global analytics - can't mock in tests
|
|
90
|
+
analytics.track('user_created', data);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// VIOLATION: Static method dependencies
|
|
95
|
+
class OrderService {
|
|
96
|
+
processOrder(order: Order) {
|
|
97
|
+
// Can't mock static methods
|
|
98
|
+
const tax = TaxCalculator.calculate(order.total);
|
|
99
|
+
const shipping = ShippingService.getRate(order.address);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// VIOLATION: Service locator anti-pattern
|
|
104
|
+
class PaymentService {
|
|
105
|
+
process(payment: Payment) {
|
|
106
|
+
// Runtime dependency resolution - untestable
|
|
107
|
+
const gateway = ServiceLocator.resolve<PaymentGateway>('paymentGateway');
|
|
108
|
+
return gateway.charge(payment);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Partial Injection
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// VIOLATION: Some dependencies injected, others not
|
|
117
|
+
class ReportService {
|
|
118
|
+
constructor(private db: Database) {} // Injected
|
|
119
|
+
|
|
120
|
+
generate(reportId: string) {
|
|
121
|
+
const data = this.db.query(reportId);
|
|
122
|
+
// But logger is global
|
|
123
|
+
logger.info('Report generated'); // BAD
|
|
124
|
+
// And config is imported
|
|
125
|
+
if (config.features.pdfExport) { // BAD
|
|
126
|
+
// ...
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Immutability - Extended Violations
|
|
135
|
+
|
|
136
|
+
### Array Mutations
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// VIOLATION: In-place array modifications
|
|
140
|
+
function processItems(items: Item[]): Item[] {
|
|
141
|
+
items.push({ id: 'new' }); // BAD - mutates input
|
|
142
|
+
items.splice(0, 1); // BAD - mutates input
|
|
143
|
+
items.reverse(); // BAD - mutates in place
|
|
144
|
+
items.fill({ id: 'default' }); // BAD - mutates in place
|
|
145
|
+
return items;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// VIOLATION: Sorting without copy
|
|
149
|
+
function getSortedUsers(users: User[]): User[] {
|
|
150
|
+
return users.sort((a, b) => a.name.localeCompare(b.name)); // Mutates original!
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// VIOLATION: Using forEach for transformation
|
|
154
|
+
function transformItems(items: Item[]): Item[] {
|
|
155
|
+
items.forEach(item => {
|
|
156
|
+
item.processed = true; // BAD - mutation
|
|
157
|
+
});
|
|
158
|
+
return items;
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Object Mutations
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// VIOLATION: Nested object mutation
|
|
166
|
+
function updateAddress(user: User, city: string): User {
|
|
167
|
+
user.address.city = city; // BAD - nested mutation
|
|
168
|
+
return user;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// VIOLATION: Object.assign mutating first argument
|
|
172
|
+
function mergeConfig(base: Config, overrides: Partial<Config>): Config {
|
|
173
|
+
return Object.assign(base, overrides); // BAD - mutates base
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// VIOLATION: Deleting properties
|
|
177
|
+
function removeField(obj: Record<string, unknown>, field: string) {
|
|
178
|
+
delete obj[field]; // BAD - mutation
|
|
179
|
+
return obj;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Pure Functions - Extended Violations
|
|
186
|
+
|
|
187
|
+
### Side Effect Patterns
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// VIOLATION: Accessing global state
|
|
191
|
+
let counter = 0;
|
|
192
|
+
function getNextId(): string {
|
|
193
|
+
return `id-${counter++}`; // BAD - global state modification
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// VIOLATION: Date/time dependency
|
|
197
|
+
function isExpired(expiry: Date): boolean {
|
|
198
|
+
return new Date() > expiry; // BAD - depends on current time
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// VIOLATION: Random values
|
|
202
|
+
function generateToken(): string {
|
|
203
|
+
return Math.random().toString(36); // BAD - non-deterministic
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// VIOLATION: Environment access
|
|
207
|
+
function getApiUrl(): string {
|
|
208
|
+
return process.env.API_URL || 'http://localhost'; // BAD - env dependency
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Hidden I/O
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// VIOLATION: Caching with side effects
|
|
216
|
+
const cache = new Map();
|
|
217
|
+
function expensiveCalculation(input: string): number {
|
|
218
|
+
if (cache.has(input)) return cache.get(input); // BAD - reads global state
|
|
219
|
+
const result = compute(input);
|
|
220
|
+
cache.set(input, result); // BAD - writes global state
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// VIOLATION: Lazy initialization
|
|
225
|
+
let initialized = false;
|
|
226
|
+
function ensureInitialized(): void {
|
|
227
|
+
if (!initialized) {
|
|
228
|
+
performSetup(); // BAD - side effect
|
|
229
|
+
initialized = true; // BAD - global state
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Type Safety - Extended Violations
|
|
237
|
+
|
|
238
|
+
### Type Assertions Abuse
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// VIOLATION: Unsafe type assertion
|
|
242
|
+
const user = data as User; // No runtime check
|
|
243
|
+
|
|
244
|
+
// VIOLATION: Non-null assertion
|
|
245
|
+
const name = user!.profile!.name!; // Assumes non-null
|
|
246
|
+
|
|
247
|
+
// VIOLATION: Any escape hatch
|
|
248
|
+
function process(data: unknown) {
|
|
249
|
+
return (data as any).property.nested; // BAD
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// VIOLATION: Type assertion to bypass checks
|
|
253
|
+
const items: Item[] = response.data as Item[]; // No validation
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Incomplete Discrimination
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
// VIOLATION: Default case hiding missing patterns
|
|
260
|
+
function handleEvent(event: Event): void {
|
|
261
|
+
switch (event.type) {
|
|
262
|
+
case 'click':
|
|
263
|
+
handleClick(event);
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
// Silently ignores new event types
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// VIOLATION: Using if/else instead of exhaustive switch
|
|
272
|
+
function getLabel(status: Status): string {
|
|
273
|
+
if (status === 'pending') return 'Waiting';
|
|
274
|
+
if (status === 'active') return 'Running';
|
|
275
|
+
return 'Unknown'; // BAD - misses new status types
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Resource Cleanup - Extended Violations
|
|
282
|
+
|
|
283
|
+
### Connection Leaks
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// VIOLATION: Connection not released on error
|
|
287
|
+
async function queryDatabase(sql: string) {
|
|
288
|
+
const conn = await pool.getConnection();
|
|
289
|
+
const result = await conn.query(sql); // If this throws, connection leaks
|
|
290
|
+
conn.release();
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// VIOLATION: Stream not closed
|
|
295
|
+
function readFile(path: string) {
|
|
296
|
+
const stream = fs.createReadStream(path);
|
|
297
|
+
stream.on('data', chunk => process(chunk));
|
|
298
|
+
// No close handler - stream never closed on error
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// VIOLATION: Subscription not unsubscribed
|
|
302
|
+
function setupListener(emitter: EventEmitter) {
|
|
303
|
+
emitter.on('event', handler);
|
|
304
|
+
// No cleanup - memory leak
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Timer Leaks
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
// VIOLATION: Interval not cleared
|
|
312
|
+
function startPolling() {
|
|
313
|
+
setInterval(() => {
|
|
314
|
+
fetchData();
|
|
315
|
+
}, 1000);
|
|
316
|
+
// No way to stop polling
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// VIOLATION: Timeout not cleared on early exit
|
|
320
|
+
async function withTimeout(promise: Promise<unknown>, ms: number) {
|
|
321
|
+
const timeout = setTimeout(() => { throw new Error('Timeout'); }, ms);
|
|
322
|
+
const result = await promise; // If this resolves, timeout still pending
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## API Consistency - Extended Violations
|
|
330
|
+
|
|
331
|
+
### Mixed Error Handling
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// VIOLATION: Mixed error handling in same module
|
|
335
|
+
class UserRepository {
|
|
336
|
+
// Returns null for not found
|
|
337
|
+
findById(id: string): User | null { ... }
|
|
338
|
+
|
|
339
|
+
// Throws for not found
|
|
340
|
+
getById(id: string): User {
|
|
341
|
+
const user = this.findById(id);
|
|
342
|
+
if (!user) throw new NotFoundError(); // Inconsistent!
|
|
343
|
+
return user;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Returns Result
|
|
347
|
+
findByEmail(email: string): Result<User, Error> { ... } // Third pattern!
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Mixed Async Patterns
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
// VIOLATION: Mixing callbacks and promises
|
|
355
|
+
function fetchUser(id: string, callback?: (err: Error, user: User) => void): Promise<User> {
|
|
356
|
+
const promise = api.get(`/users/${id}`);
|
|
357
|
+
if (callback) {
|
|
358
|
+
promise.then(user => callback(null, user)).catch(err => callback(err, null));
|
|
359
|
+
}
|
|
360
|
+
return promise;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// VIOLATION: Fire-and-forget async
|
|
364
|
+
async function processOrder(order: Order) {
|
|
365
|
+
saveOrder(order); // Missing await - fire and forget
|
|
366
|
+
await sendEmail(order.email); // This one awaits
|
|
367
|
+
logAnalytics(order); // Missing await again
|
|
368
|
+
}
|
|
369
|
+
```
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-patterns
|
|
3
|
+
description: Database analysis patterns for code review. Detects missing indexes, slow queries, unsafe migrations, schema design issues, and connection pool misuse. Loaded by Reviewer agent when focus=database.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: Read, Grep, Glob
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Database Patterns
|
|
9
|
+
|
|
10
|
+
Domain expertise for database design and optimization. Use alongside `review-methodology` for complete database reviews.
|
|
11
|
+
|
|
12
|
+
## Iron Law
|
|
13
|
+
|
|
14
|
+
> **EVERY QUERY MUST HAVE AN EXECUTION PLAN**
|
|
15
|
+
>
|
|
16
|
+
> Never deploy a query without understanding its execution plan. Every WHERE clause needs
|
|
17
|
+
> an index analysis. Every JOIN needs cardinality consideration. "It works in dev" is not
|
|
18
|
+
> validation. Production data volumes will expose every missing index and inefficient join.
|
|
19
|
+
|
|
20
|
+
## Database Categories
|
|
21
|
+
|
|
22
|
+
### 1. Schema Design Issues
|
|
23
|
+
|
|
24
|
+
| Issue | Problem | Solution |
|
|
25
|
+
|-------|---------|----------|
|
|
26
|
+
| Missing Foreign Keys | No referential integrity, orphaned records | Add FK with ON DELETE action |
|
|
27
|
+
| Denormalization | Unnecessary duplication, update anomalies | Normalize unless performance requires |
|
|
28
|
+
| Poor Data Types | VARCHAR for everything, lost precision | Use appropriate types (DECIMAL, BOOLEAN, TIMESTAMP) |
|
|
29
|
+
| Missing Constraints | No data validation at DB level | Add NOT NULL, CHECK, UNIQUE constraints |
|
|
30
|
+
|
|
31
|
+
**Example - Missing Constraints:**
|
|
32
|
+
```sql
|
|
33
|
+
-- VIOLATION
|
|
34
|
+
CREATE TABLE products (id SERIAL, name VARCHAR(100), price DECIMAL);
|
|
35
|
+
|
|
36
|
+
-- CORRECT
|
|
37
|
+
CREATE TABLE products (
|
|
38
|
+
id SERIAL PRIMARY KEY,
|
|
39
|
+
name VARCHAR(100) NOT NULL CHECK (LENGTH(TRIM(name)) > 0),
|
|
40
|
+
price DECIMAL(10, 2) NOT NULL CHECK (price >= 0)
|
|
41
|
+
);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2. Query Optimization Issues
|
|
45
|
+
|
|
46
|
+
| Issue | Problem | Solution |
|
|
47
|
+
|-------|---------|----------|
|
|
48
|
+
| N+1 Queries | Query per iteration, O(n) round trips | JOIN or batch with IN/ANY |
|
|
49
|
+
| Missing Indexes | Full table scans on large tables | Add indexes for WHERE/JOIN columns |
|
|
50
|
+
| Full Table Scans | Functions prevent index use | Functional indexes or query rewrite |
|
|
51
|
+
| Inefficient JOINs | Joining before filtering | Filter early, select specific columns |
|
|
52
|
+
|
|
53
|
+
**Example - N+1 Query:**
|
|
54
|
+
```typescript
|
|
55
|
+
// VIOLATION: 101 queries for 100 users
|
|
56
|
+
for (const user of users) {
|
|
57
|
+
user.orders = await db.query('SELECT * FROM orders WHERE user_id = ?', [user.id]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// CORRECT: 2 queries total
|
|
61
|
+
const orders = await db.query('SELECT * FROM orders WHERE user_id = ANY($1)', [userIds]);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Migration Issues
|
|
65
|
+
|
|
66
|
+
| Issue | Problem | Solution |
|
|
67
|
+
|-------|---------|----------|
|
|
68
|
+
| Breaking Changes | Data loss, no recovery path | Phased approach with backups |
|
|
69
|
+
| Data Loss Risk | Type changes truncate data | Validate before changing types |
|
|
70
|
+
| Missing Rollback | Cannot undo migration | Always implement down() method |
|
|
71
|
+
| Performance Impact | Table locks during migration | Add columns nullable, backfill in batches |
|
|
72
|
+
|
|
73
|
+
**Example - Safe Column Addition:**
|
|
74
|
+
```sql
|
|
75
|
+
-- Step 1: Add nullable (instant)
|
|
76
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
|
|
77
|
+
-- Step 2: Backfill in batches
|
|
78
|
+
UPDATE users SET phone = 'UNKNOWN' WHERE phone IS NULL AND id BETWEEN 1 AND 10000;
|
|
79
|
+
-- Step 3: Add constraint after backfill
|
|
80
|
+
ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. Security Issues
|
|
84
|
+
|
|
85
|
+
| Issue | Problem | Solution |
|
|
86
|
+
|-------|---------|----------|
|
|
87
|
+
| SQL Injection | String interpolation in queries | Parameterized queries only |
|
|
88
|
+
| Excessive Privileges | App has GRANT ALL | Minimum required privileges |
|
|
89
|
+
|
|
90
|
+
**Example - SQL Injection:**
|
|
91
|
+
```typescript
|
|
92
|
+
// VULNERABLE
|
|
93
|
+
const query = `SELECT * FROM users WHERE email = '${email}'`;
|
|
94
|
+
|
|
95
|
+
// SECURE
|
|
96
|
+
const query = 'SELECT * FROM users WHERE email = $1';
|
|
97
|
+
await db.query(query, [email]);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Extended References
|
|
103
|
+
|
|
104
|
+
For detailed examples and detection commands, see:
|
|
105
|
+
|
|
106
|
+
- **[references/violations.md](references/violations.md)** - Extended violation examples with explanations
|
|
107
|
+
- **[references/patterns.md](references/patterns.md)** - Correct patterns and migration strategies
|
|
108
|
+
- **[references/detection.md](references/detection.md)** - Automated detection commands
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Severity Guidelines
|
|
113
|
+
|
|
114
|
+
| Severity | Criteria | Examples |
|
|
115
|
+
|----------|----------|----------|
|
|
116
|
+
| **CRITICAL** | Data integrity or severe performance | SQL injection, N+1 unbounded, data loss migrations, missing FK on critical relations |
|
|
117
|
+
| **HIGH** | Significant database issues | Inefficient JOINs, missing constraints, migrations without rollback |
|
|
118
|
+
| **MEDIUM** | Moderate concerns | Minor denormalization, missing non-critical indexes |
|
|
119
|
+
| **LOW** | Minor improvements | Naming conventions, index organization |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Database Checklist
|
|
124
|
+
|
|
125
|
+
Before approving database changes:
|
|
126
|
+
|
|
127
|
+
- [ ] All queries have appropriate indexes
|
|
128
|
+
- [ ] N+1 patterns identified and resolved
|
|
129
|
+
- [ ] Migrations have rollback scripts
|
|
130
|
+
- [ ] Data types are appropriate
|
|
131
|
+
- [ ] Constraints enforce business rules
|
|
132
|
+
- [ ] Foreign keys maintain referential integrity
|
|
133
|
+
- [ ] No SQL injection vulnerabilities
|
|
134
|
+
- [ ] Performance tested with production-like data volume
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Database Issue Detection
|
|
2
|
+
|
|
3
|
+
Commands and patterns for detecting database issues in code reviews.
|
|
4
|
+
|
|
5
|
+
## Automated Detection Commands
|
|
6
|
+
|
|
7
|
+
### SQL Injection Detection
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# String interpolation in queries (JavaScript/TypeScript)
|
|
11
|
+
grep -rn "query.*\`.*\${" --include="*.ts" --include="*.js"
|
|
12
|
+
grep -rn "query.*\(\`.*\${" --include="*.ts" --include="*.js"
|
|
13
|
+
grep -rn 'query.*".*\+' --include="*.ts" --include="*.js"
|
|
14
|
+
grep -rn "query.*'.*\+" --include="*.ts" --include="*.js"
|
|
15
|
+
|
|
16
|
+
# String formatting in queries (Python)
|
|
17
|
+
grep -rn 'execute.*f"' --include="*.py"
|
|
18
|
+
grep -rn 'execute.*%' --include="*.py"
|
|
19
|
+
grep -rn "execute.*\.format" --include="*.py"
|
|
20
|
+
|
|
21
|
+
# Raw SQL with variables (any language)
|
|
22
|
+
grep -rn "WHERE.*=.*'" --include="*.ts" --include="*.py" --include="*.go" | grep -v '\$'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### N+1 Query Detection
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Queries inside loops (TypeScript/JavaScript)
|
|
29
|
+
grep -rn -A 5 "for.*of\|forEach\|\.map(" --include="*.ts" | grep -B 2 "await.*query\|await.*find"
|
|
30
|
+
|
|
31
|
+
# ORM patterns that suggest N+1
|
|
32
|
+
grep -rn "\.find.*{.*where" --include="*.ts" | grep -B 5 "for\|forEach\|map"
|
|
33
|
+
|
|
34
|
+
# Sequential awaits that might be batched
|
|
35
|
+
grep -rn "await.*await.*await" --include="*.ts"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### SELECT * Detection
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Direct SELECT * usage
|
|
42
|
+
grep -rn "SELECT \*" --include="*.ts" --include="*.js" --include="*.sql"
|
|
43
|
+
grep -rn 'SELECT \*' --include="*.py"
|
|
44
|
+
|
|
45
|
+
# ORM patterns that select all columns
|
|
46
|
+
grep -rn "\.find\(\)\|\.findAll\(\)\|\.all\(\)" --include="*.ts"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Missing Index Indicators
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Queries with multiple WHERE conditions (potential composite index)
|
|
53
|
+
grep -rn "WHERE.*AND.*AND" --include="*.ts" --include="*.sql"
|
|
54
|
+
|
|
55
|
+
# Queries with ORDER BY (potential index needed)
|
|
56
|
+
grep -rn "ORDER BY" --include="*.ts" --include="*.sql"
|
|
57
|
+
|
|
58
|
+
# Queries with LIKE patterns
|
|
59
|
+
grep -rn "LIKE.*%" --include="*.ts" --include="*.sql"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Migration Risk Detection
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Dangerous migration operations
|
|
66
|
+
find . -path "*/migrations/*" -o -path "*/migrate/*" | xargs grep -l "DROP\|DELETE\|TRUNCATE\|ALTER.*DROP"
|
|
67
|
+
|
|
68
|
+
# Migrations without down method
|
|
69
|
+
find . -path "*/migrations/*" -name "*.ts" | xargs grep -L "down"
|
|
70
|
+
|
|
71
|
+
# NOT NULL additions (potential lock)
|
|
72
|
+
find . -path "*/migrations/*" | xargs grep -n "NOT NULL"
|
|
73
|
+
|
|
74
|
+
# Type changes
|
|
75
|
+
find . -path "*/migrations/*" | xargs grep -n "ALTER.*TYPE\|MODIFY.*COLUMN"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Security Pattern Detection
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Hardcoded credentials
|
|
82
|
+
grep -rn "password.*=\|PASSWORD.*=\|secret.*=\|SECRET.*=" --include="*.ts" --include="*.env*"
|
|
83
|
+
|
|
84
|
+
# Connection strings with credentials
|
|
85
|
+
grep -rn "postgresql://.*:.*@\|mysql://.*:.*@\|mongodb://.*:.*@" --include="*.ts" --include="*.js"
|
|
86
|
+
|
|
87
|
+
# Excessive privilege grants
|
|
88
|
+
grep -rn "GRANT ALL\|SUPERUSER\|WITH GRANT OPTION" --include="*.sql" --include="*.ts"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Manual Review Patterns
|
|
94
|
+
|
|
95
|
+
### Schema Review Checklist
|
|
96
|
+
|
|
97
|
+
```sql
|
|
98
|
+
-- Check for missing foreign keys
|
|
99
|
+
SELECT
|
|
100
|
+
tc.table_name,
|
|
101
|
+
kcu.column_name
|
|
102
|
+
FROM information_schema.table_constraints tc
|
|
103
|
+
JOIN information_schema.key_column_usage kcu
|
|
104
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
105
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
106
|
+
AND kcu.column_name LIKE '%_id'
|
|
107
|
+
AND NOT EXISTS (
|
|
108
|
+
SELECT 1 FROM information_schema.referential_constraints rc
|
|
109
|
+
WHERE rc.constraint_name = tc.constraint_name
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
-- Check for missing NOT NULL on required fields
|
|
113
|
+
SELECT table_name, column_name, data_type
|
|
114
|
+
FROM information_schema.columns
|
|
115
|
+
WHERE is_nullable = 'YES'
|
|
116
|
+
AND column_name IN ('email', 'name', 'status', 'created_at')
|
|
117
|
+
ORDER BY table_name;
|
|
118
|
+
|
|
119
|
+
-- Check for VARCHAR without length limit
|
|
120
|
+
SELECT table_name, column_name
|
|
121
|
+
FROM information_schema.columns
|
|
122
|
+
WHERE data_type = 'character varying'
|
|
123
|
+
AND character_maximum_length IS NULL;
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Index Review Checklist
|
|
127
|
+
|
|
128
|
+
```sql
|
|
129
|
+
-- Tables without primary key
|
|
130
|
+
SELECT table_name
|
|
131
|
+
FROM information_schema.tables t
|
|
132
|
+
WHERE table_type = 'BASE TABLE'
|
|
133
|
+
AND NOT EXISTS (
|
|
134
|
+
SELECT 1 FROM information_schema.table_constraints tc
|
|
135
|
+
WHERE tc.table_name = t.table_name
|
|
136
|
+
AND tc.constraint_type = 'PRIMARY KEY'
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
-- Foreign key columns without index
|
|
140
|
+
SELECT
|
|
141
|
+
tc.table_name,
|
|
142
|
+
kcu.column_name
|
|
143
|
+
FROM information_schema.table_constraints tc
|
|
144
|
+
JOIN information_schema.key_column_usage kcu
|
|
145
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
146
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
147
|
+
AND NOT EXISTS (
|
|
148
|
+
SELECT 1 FROM pg_indexes
|
|
149
|
+
WHERE tablename = tc.table_name
|
|
150
|
+
AND indexdef LIKE '%' || kcu.column_name || '%'
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
-- Unused indexes (PostgreSQL)
|
|
154
|
+
SELECT
|
|
155
|
+
schemaname,
|
|
156
|
+
tablename,
|
|
157
|
+
indexname,
|
|
158
|
+
idx_scan
|
|
159
|
+
FROM pg_stat_user_indexes
|
|
160
|
+
WHERE idx_scan = 0
|
|
161
|
+
AND indexname NOT LIKE '%pkey%'
|
|
162
|
+
ORDER BY pg_relation_size(indexrelid) DESC;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Query Performance Review
|
|
166
|
+
|
|
167
|
+
```sql
|
|
168
|
+
-- Check execution plan for specific query
|
|
169
|
+
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
|
|
170
|
+
SELECT * FROM orders WHERE customer_id = 123;
|
|
171
|
+
|
|
172
|
+
-- Expected good plan indicators:
|
|
173
|
+
-- - Index Scan or Index Only Scan
|
|
174
|
+
-- - Low cost estimates
|
|
175
|
+
-- - Small row estimates matching actual
|
|
176
|
+
|
|
177
|
+
-- Red flags in execution plans:
|
|
178
|
+
-- - Seq Scan on large tables
|
|
179
|
+
-- - Nested Loop with high row counts
|
|
180
|
+
-- - Sort operations without index
|
|
181
|
+
-- - Hash Join with large tables
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Code Review Triggers
|
|
187
|
+
|
|
188
|
+
When reviewing code, flag for database review if you see:
|
|
189
|
+
|
|
190
|
+
### High Priority (Always Review)
|
|
191
|
+
|
|
192
|
+
1. **New migration files** - Check for data loss risk, rollback strategy
|
|
193
|
+
2. **Raw SQL queries** - Check for injection, parameterization
|
|
194
|
+
3. **Loops with database calls** - Check for N+1 patterns
|
|
195
|
+
4. **Schema changes** - Check for breaking changes, constraints
|
|
196
|
+
|
|
197
|
+
### Medium Priority (Sample Review)
|
|
198
|
+
|
|
199
|
+
1. **ORM model changes** - Verify schema alignment
|
|
200
|
+
2. **New query methods** - Check for efficiency
|
|
201
|
+
3. **Bulk operations** - Check for batching
|
|
202
|
+
4. **Transaction usage** - Check for proper isolation
|
|
203
|
+
|
|
204
|
+
### Low Priority (Spot Check)
|
|
205
|
+
|
|
206
|
+
1. **Read-only queries** - Verify index usage
|
|
207
|
+
2. **Logging of database data** - Check for sensitive data exposure
|
|
208
|
+
3. **Error handling** - Check for proper connection cleanup
|