devflow-kit 0.9.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +167 -29
- package/LICENSE +1 -1
- package/README.md +179 -310
- package/dist/cli.js +3 -1
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.js +311 -576
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +351 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +162 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +68 -0
- package/dist/utils/post-install.js +427 -0
- package/dist/utils/safe-delete-install.d.ts +22 -0
- package/dist/utils/safe-delete-install.js +156 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +27 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +134 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/background-memory-update.sh +167 -0
- package/scripts/hooks/pre-compact-memory.sh +81 -0
- package/scripts/hooks/session-start-memory.sh +84 -0
- package/scripts/hooks/stop-update-memory.sh +81 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +134 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +146 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/get-issue.md +0 -286
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -493
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/get-issue.md +0 -16
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -20
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
# Implementation Violation Examples
|
|
2
|
+
|
|
3
|
+
Extended violation patterns for implementation reviews. Reference from main SKILL.md.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## CRUD Violations
|
|
8
|
+
|
|
9
|
+
### Missing Validation
|
|
10
|
+
|
|
11
|
+
**No Input Validation Before Persist**
|
|
12
|
+
```typescript
|
|
13
|
+
// VIOLATION: Saving unvalidated data
|
|
14
|
+
async function createUser(input: any): Promise<User> {
|
|
15
|
+
const user = { id: generateId(), ...input }; // No validation!
|
|
16
|
+
return await userRepository.save(user);
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Trusting External Data**
|
|
21
|
+
```typescript
|
|
22
|
+
// VIOLATION: Using input directly without parsing
|
|
23
|
+
async function updateUser(id: string, body: any): Promise<User> {
|
|
24
|
+
return await db.users.update(id, body); // Body could have extra fields
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Inconsistent Error Handling
|
|
29
|
+
|
|
30
|
+
**Mixed Error Styles**
|
|
31
|
+
```typescript
|
|
32
|
+
// VIOLATION: Throws in some cases, returns null in others
|
|
33
|
+
async function getUser(id: string): Promise<User | null> {
|
|
34
|
+
if (!id) throw new Error('Invalid ID'); // Throws
|
|
35
|
+
const user = await db.users.findById(id);
|
|
36
|
+
return user || null; // Returns null for not found
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Silent Failures**
|
|
41
|
+
```typescript
|
|
42
|
+
// VIOLATION: Error swallowed with empty catch
|
|
43
|
+
async function deleteUser(id: string): Promise<void> {
|
|
44
|
+
try {
|
|
45
|
+
await userRepository.delete(id);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
// Silently ignore deletion failures
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### N+1 Query Patterns
|
|
53
|
+
|
|
54
|
+
**Loop Query**
|
|
55
|
+
```typescript
|
|
56
|
+
// VIOLATION: N queries in loop
|
|
57
|
+
async function listUsersWithOrders(userIds: string[]): Promise<UserWithOrders[]> {
|
|
58
|
+
return Promise.all(
|
|
59
|
+
userIds.map(async (id) => {
|
|
60
|
+
const user = await db.users.findById(id);
|
|
61
|
+
const orders = await db.orders.findByUserId(id); // N queries!
|
|
62
|
+
return { ...user, orders };
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Missing Join/Include**
|
|
69
|
+
```typescript
|
|
70
|
+
// VIOLATION: Separate query for related data
|
|
71
|
+
async function getOrderDetails(orderId: string): Promise<OrderDetails> {
|
|
72
|
+
const order = await db.orders.findById(orderId);
|
|
73
|
+
const items = await db.orderItems.findByOrderId(orderId); // Second query
|
|
74
|
+
const customer = await db.customers.findById(order.customerId); // Third query
|
|
75
|
+
return { order, items, customer };
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Missing Existence Check
|
|
80
|
+
|
|
81
|
+
**Update Without Checking Exists**
|
|
82
|
+
```typescript
|
|
83
|
+
// VIOLATION: No existence check before update
|
|
84
|
+
async function updateUser(id: string, data: UpdateData): Promise<User> {
|
|
85
|
+
return await db.users.update(id, data); // Fails silently or throws generic error
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Delete Without Constraints Check**
|
|
90
|
+
```typescript
|
|
91
|
+
// VIOLATION: No cascade/constraint check
|
|
92
|
+
async function deleteCategory(id: string): Promise<void> {
|
|
93
|
+
await db.categories.delete(id); // Orphans products referencing this category
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## API Violations
|
|
100
|
+
|
|
101
|
+
### Missing Auth Checks
|
|
102
|
+
|
|
103
|
+
**No Authentication**
|
|
104
|
+
```typescript
|
|
105
|
+
// VIOLATION: Endpoint without auth
|
|
106
|
+
app.delete('/api/users/:id', async (req, res) => {
|
|
107
|
+
await deleteUser(req.params.id); // Anyone can delete users!
|
|
108
|
+
res.status(204).send();
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**No Authorization**
|
|
113
|
+
```typescript
|
|
114
|
+
// VIOLATION: Auth but no authorization check
|
|
115
|
+
app.put('/api/users/:id', authenticate, async (req, res) => {
|
|
116
|
+
const result = await updateUser(req.params.id, req.body); // Can update any user
|
|
117
|
+
res.json(result);
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Inconsistent Response Format
|
|
122
|
+
|
|
123
|
+
**Mixed Response Shapes**
|
|
124
|
+
```typescript
|
|
125
|
+
// VIOLATION: Different error formats across endpoints
|
|
126
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
127
|
+
const user = await getUser(req.params.id);
|
|
128
|
+
if (!user) res.status(404).send('Not found'); // String
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
app.get('/api/orders/:id', async (req, res) => {
|
|
132
|
+
const order = await getOrder(req.params.id);
|
|
133
|
+
if (!order) res.status(404).json({ error: 'Order not found' }); // Object
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Leaking Internal Errors**
|
|
138
|
+
```typescript
|
|
139
|
+
// VIOLATION: Exposing stack traces
|
|
140
|
+
app.post('/api/users', async (req, res) => {
|
|
141
|
+
try {
|
|
142
|
+
const user = await createUser(req.body);
|
|
143
|
+
res.json(user);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
res.status(500).json({ error: error.stack }); // Security risk!
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Poor Error Messages
|
|
151
|
+
|
|
152
|
+
**Generic Messages**
|
|
153
|
+
```typescript
|
|
154
|
+
// VIOLATION: Unhelpful error response
|
|
155
|
+
function handleError(error: Error, res: Response) {
|
|
156
|
+
res.status(400).json({ error: 'Something went wrong' }); // No actionable info
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Missing Field Context**
|
|
161
|
+
```typescript
|
|
162
|
+
// VIOLATION: No field-level validation errors
|
|
163
|
+
app.post('/api/users', async (req, res) => {
|
|
164
|
+
if (!req.body.email || !req.body.name) {
|
|
165
|
+
res.status(400).json({ error: 'Invalid request' }); // Which field?
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Missing Request Validation
|
|
171
|
+
|
|
172
|
+
**No Path Parameter Validation**
|
|
173
|
+
```typescript
|
|
174
|
+
// VIOLATION: Using params without validation
|
|
175
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
176
|
+
const user = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
|
|
177
|
+
// id could be malformed or SQL injection
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**No Body Validation**
|
|
182
|
+
```typescript
|
|
183
|
+
// VIOLATION: No schema validation
|
|
184
|
+
app.post('/api/orders', async (req, res) => {
|
|
185
|
+
const order = await createOrder(req.body); // Could be anything
|
|
186
|
+
res.json(order);
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Event Handler Violations
|
|
193
|
+
|
|
194
|
+
### Lost Events
|
|
195
|
+
|
|
196
|
+
**Fire and Forget Without ACK**
|
|
197
|
+
```typescript
|
|
198
|
+
// VIOLATION: Processing not confirmed
|
|
199
|
+
async function handleMessage(message: Message): Promise<void> {
|
|
200
|
+
processMessage(message); // Not awaited!
|
|
201
|
+
// Message may not be processed but considered handled
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**No Retry Mechanism**
|
|
206
|
+
```typescript
|
|
207
|
+
// VIOLATION: Single attempt, then lost
|
|
208
|
+
async function handleOrderCreated(event: OrderEvent): Promise<void> {
|
|
209
|
+
try {
|
|
210
|
+
await notifyWarehouse(event);
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error('Failed to notify', error);
|
|
213
|
+
// Event lost, no retry
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Race Conditions
|
|
219
|
+
|
|
220
|
+
**Concurrent Updates Without Locking**
|
|
221
|
+
```typescript
|
|
222
|
+
// VIOLATION: Read-modify-write without protection
|
|
223
|
+
async function handleInventoryUpdate(event: InventoryEvent): Promise<void> {
|
|
224
|
+
const current = await db.inventory.get(event.productId);
|
|
225
|
+
const newQuantity = current.quantity - event.quantity;
|
|
226
|
+
await db.inventory.update(event.productId, { quantity: newQuantity });
|
|
227
|
+
// Two concurrent events can read same quantity, lose an update
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Non-Idempotent Processing**
|
|
232
|
+
```typescript
|
|
233
|
+
// VIOLATION: No idempotency check
|
|
234
|
+
async function handlePaymentReceived(event: PaymentEvent): Promise<void> {
|
|
235
|
+
await creditUserAccount(event.userId, event.amount);
|
|
236
|
+
await sendReceipt(event.userId);
|
|
237
|
+
// Redelivery credits user twice!
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Missing Error Handling
|
|
242
|
+
|
|
243
|
+
**Unhandled Promise Rejection**
|
|
244
|
+
```typescript
|
|
245
|
+
// VIOLATION: No error handling in handler
|
|
246
|
+
eventBus.on('user.created', async (event) => {
|
|
247
|
+
await sendWelcomeEmail(event.user); // Unhandled rejection if email fails
|
|
248
|
+
await createAuditLog(event);
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Partial Processing**
|
|
253
|
+
```typescript
|
|
254
|
+
// VIOLATION: Stops on first error
|
|
255
|
+
async function handleBatchEvent(events: Event[]): Promise<void> {
|
|
256
|
+
for (const event of events) {
|
|
257
|
+
await processEvent(event); // One failure stops all remaining
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Missing Event Context
|
|
263
|
+
|
|
264
|
+
**No Correlation ID**
|
|
265
|
+
```typescript
|
|
266
|
+
// VIOLATION: Can't trace event through system
|
|
267
|
+
async function publishEvent(type: string, payload: object): Promise<void> {
|
|
268
|
+
await eventBus.publish({
|
|
269
|
+
type,
|
|
270
|
+
payload,
|
|
271
|
+
timestamp: new Date(),
|
|
272
|
+
// No correlationId, requestId, or traceId
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Configuration Violations
|
|
280
|
+
|
|
281
|
+
### Hardcoded Values
|
|
282
|
+
|
|
283
|
+
**Magic Numbers/Strings**
|
|
284
|
+
```typescript
|
|
285
|
+
// VIOLATION: Hardcoded configuration
|
|
286
|
+
async function fetchWithRetry(url: string) {
|
|
287
|
+
const maxRetries = 3; // Magic number
|
|
288
|
+
const timeout = 5000; // Magic number
|
|
289
|
+
const apiKey = 'sk-abc123...'; // Hardcoded secret!
|
|
290
|
+
// ...
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Environment-Specific Branching**
|
|
295
|
+
```typescript
|
|
296
|
+
// VIOLATION: Scattered environment checks
|
|
297
|
+
function getApiUrl(): string {
|
|
298
|
+
if (process.env.NODE_ENV === 'production') {
|
|
299
|
+
return 'https://api.example.com';
|
|
300
|
+
} else if (process.env.NODE_ENV === 'staging') {
|
|
301
|
+
return 'https://staging-api.example.com';
|
|
302
|
+
} else {
|
|
303
|
+
return 'http://localhost:3000';
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Missing Validation
|
|
309
|
+
|
|
310
|
+
**No Schema Validation**
|
|
311
|
+
```typescript
|
|
312
|
+
// VIOLATION: Trusting environment variables
|
|
313
|
+
const config = {
|
|
314
|
+
port: process.env.PORT, // Could be undefined or 'abc'
|
|
315
|
+
dbUrl: process.env.DATABASE_URL, // Could be malformed
|
|
316
|
+
timeout: process.env.TIMEOUT, // String, not number
|
|
317
|
+
};
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Silent Defaults**
|
|
321
|
+
```typescript
|
|
322
|
+
// VIOLATION: Defaulting without warning
|
|
323
|
+
const port = process.env.PORT || 3000; // No indication of fallback
|
|
324
|
+
const dbUrl = process.env.DATABASE_URL || 'localhost:5432'; // Insecure default
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Insecure Defaults
|
|
328
|
+
|
|
329
|
+
**Debug Mode in Production**
|
|
330
|
+
```typescript
|
|
331
|
+
// VIOLATION: Debug enabled by default
|
|
332
|
+
const config = {
|
|
333
|
+
debug: process.env.DEBUG !== 'false', // Default true!
|
|
334
|
+
verboseLogging: true, // Always verbose
|
|
335
|
+
};
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Missing Required Secrets**
|
|
339
|
+
```typescript
|
|
340
|
+
// VIOLATION: Optional secret with fallback
|
|
341
|
+
const jwtSecret = process.env.JWT_SECRET || 'default-secret'; // Insecure!
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Mutable Configuration
|
|
345
|
+
|
|
346
|
+
**Writable Config Object**
|
|
347
|
+
```typescript
|
|
348
|
+
// VIOLATION: Config can be mutated at runtime
|
|
349
|
+
export const config = {
|
|
350
|
+
port: 3000,
|
|
351
|
+
debug: false,
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// Elsewhere in code
|
|
355
|
+
config.debug = true; // Mutation!
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Logging Violations
|
|
361
|
+
|
|
362
|
+
### Missing Context
|
|
363
|
+
|
|
364
|
+
**No Request Identifier**
|
|
365
|
+
```typescript
|
|
366
|
+
// VIOLATION: Can't correlate logs
|
|
367
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
368
|
+
console.log('Fetching user'); // Which request?
|
|
369
|
+
const user = await getUser(req.params.id);
|
|
370
|
+
console.log('User found'); // Can't trace to request
|
|
371
|
+
res.json(user);
|
|
372
|
+
});
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**No Operation Context**
|
|
376
|
+
```typescript
|
|
377
|
+
// VIOLATION: Logs without context
|
|
378
|
+
async function processOrder(order: Order): Promise<void> {
|
|
379
|
+
console.log('Processing'); // What order? Who requested?
|
|
380
|
+
await validateOrder(order);
|
|
381
|
+
console.log('Validated');
|
|
382
|
+
await saveOrder(order);
|
|
383
|
+
console.log('Done');
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Sensitive Data Exposure
|
|
388
|
+
|
|
389
|
+
**Logging Credentials**
|
|
390
|
+
```typescript
|
|
391
|
+
// VIOLATION: Passwords in logs
|
|
392
|
+
async function login(credentials: Credentials): Promise<Result<User, Error>> {
|
|
393
|
+
logger.info('Login attempt', { credentials }); // Logs password!
|
|
394
|
+
// ...
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**PII in Logs**
|
|
399
|
+
```typescript
|
|
400
|
+
// VIOLATION: Personal data exposed
|
|
401
|
+
async function createUser(user: UserInput): Promise<User> {
|
|
402
|
+
logger.info('Creating user', {
|
|
403
|
+
email: user.email,
|
|
404
|
+
ssn: user.ssn, // PII!
|
|
405
|
+
creditCard: user.paymentInfo, // PCI data!
|
|
406
|
+
});
|
|
407
|
+
// ...
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### Inconsistent Levels
|
|
412
|
+
|
|
413
|
+
**Wrong Log Levels**
|
|
414
|
+
```typescript
|
|
415
|
+
// VIOLATION: Using wrong severity
|
|
416
|
+
function processPayment(payment: Payment): void {
|
|
417
|
+
console.log('Payment failed!'); // Should be error
|
|
418
|
+
console.error('Processing payment'); // Not an error
|
|
419
|
+
console.warn('Payment successful'); // Not a warning
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Debug Logs in Production**
|
|
424
|
+
```typescript
|
|
425
|
+
// VIOLATION: Verbose logging without level check
|
|
426
|
+
function complexCalculation(data: Data): number {
|
|
427
|
+
console.log('Input:', JSON.stringify(data)); // Always logs, even in production
|
|
428
|
+
const result = calculate(data);
|
|
429
|
+
console.log('Intermediate:', intermediate); // Noise in production
|
|
430
|
+
console.log('Output:', result);
|
|
431
|
+
return result;
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Unstructured Logging
|
|
436
|
+
|
|
437
|
+
**String Interpolation**
|
|
438
|
+
```typescript
|
|
439
|
+
// VIOLATION: Not machine-parseable
|
|
440
|
+
console.log(`User ${userId} created order ${orderId} at ${timestamp}`);
|
|
441
|
+
// Can't query or aggregate these logs
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
**Console.log in Production**
|
|
445
|
+
```typescript
|
|
446
|
+
// VIOLATION: No structured output
|
|
447
|
+
console.log('Error:', error); // Not JSON, no metadata
|
|
448
|
+
console.log('Request received'); // No timestamp, level, or context
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Missing Error Details
|
|
452
|
+
|
|
453
|
+
**Logging Without Stack**
|
|
454
|
+
```typescript
|
|
455
|
+
// VIOLATION: Lost debugging info
|
|
456
|
+
try {
|
|
457
|
+
await riskyOperation();
|
|
458
|
+
} catch (error) {
|
|
459
|
+
logger.error('Operation failed'); // No error details!
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
**Catching and Re-logging**
|
|
464
|
+
```typescript
|
|
465
|
+
// VIOLATION: Duplicate logs
|
|
466
|
+
async function outerFunction() {
|
|
467
|
+
try {
|
|
468
|
+
await innerFunction();
|
|
469
|
+
} catch (error) {
|
|
470
|
+
logger.error('Outer failed', { error }); // Double logged
|
|
471
|
+
throw error;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
async function innerFunction() {
|
|
476
|
+
try {
|
|
477
|
+
await riskyThing();
|
|
478
|
+
} catch (error) {
|
|
479
|
+
logger.error('Inner failed', { error }); // First log
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: input-validation
|
|
3
|
+
description: This skill should be used when the user asks to "validate input", "parse request data", "handle form data", "add Zod schema", "sanitize user input", or creates API endpoints and system boundaries. Provides parse-don't-validate patterns with Zod schemas for type-safe boundary validation and hostile input defense.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: Read, Grep, Glob, AskUserQuestion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Input Validation Skill
|
|
9
|
+
|
|
10
|
+
## Iron Law
|
|
11
|
+
|
|
12
|
+
> **ALL EXTERNAL DATA IS HOSTILE**
|
|
13
|
+
>
|
|
14
|
+
> Validate at boundaries, trust inside. Every piece of data from outside the system
|
|
15
|
+
> (user input, API responses, environment variables) is potentially malicious until
|
|
16
|
+
> validated with a schema. No exceptions. No "I trust this source." Validate everything.
|
|
17
|
+
|
|
18
|
+
## When This Skill Activates
|
|
19
|
+
|
|
20
|
+
- Creating API endpoints or routes
|
|
21
|
+
- Processing user-submitted data
|
|
22
|
+
- Integrating with external APIs
|
|
23
|
+
- Accepting environment variables
|
|
24
|
+
- Handling database queries with user input
|
|
25
|
+
|
|
26
|
+
## Core Principle: Parse, Don't Validate
|
|
27
|
+
|
|
28
|
+
Use schema validation libraries, not manual checks.
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// VIOLATION: Manual validation
|
|
32
|
+
function createUser(data: any): User {
|
|
33
|
+
if (!data.email || typeof data.email !== 'string') throw new Error('Invalid');
|
|
34
|
+
// ... scattered checks
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// CORRECT: Schema validation at boundary
|
|
38
|
+
const UserSchema = z.object({
|
|
39
|
+
email: z.string().email().max(255),
|
|
40
|
+
age: z.number().int().min(0).max(150),
|
|
41
|
+
name: z.string().min(1).max(100)
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
function createUser(data: unknown): Result<User, ValidationError> {
|
|
45
|
+
const validation = UserSchema.safeParse(data);
|
|
46
|
+
if (!validation.success) {
|
|
47
|
+
return { ok: false, error: new ValidationError('Invalid', validation.error) };
|
|
48
|
+
}
|
|
49
|
+
return { ok: true, value: validation.data };
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Boundary Examples
|
|
54
|
+
|
|
55
|
+
### API Endpoint
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
app.post('/api/users', async (req, res) => {
|
|
59
|
+
const validation = UserSchema.safeParse(req.body);
|
|
60
|
+
if (!validation.success) {
|
|
61
|
+
return res.status(400).json({ error: validation.error.issues });
|
|
62
|
+
}
|
|
63
|
+
const result = await createUser(validation.data);
|
|
64
|
+
// ... handle result
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### External API Response
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
async function fetchUserData(userId: string): Promise<Result<UserData, Error>> {
|
|
72
|
+
const response = await fetch(`https://api.example.com/users/${userId}`);
|
|
73
|
+
const validation = ExternalUserSchema.safeParse(await response.json());
|
|
74
|
+
if (!validation.success) {
|
|
75
|
+
return { ok: false, error: new Error('External API returned invalid data') };
|
|
76
|
+
}
|
|
77
|
+
return { ok: true, value: validation.data };
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Environment Variables
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const ConfigSchema = z.object({
|
|
85
|
+
port: z.string().regex(/^\d+$/).transform(Number),
|
|
86
|
+
dbUrl: z.string().url().startsWith('postgresql://'),
|
|
87
|
+
apiKey: z.string().min(32)
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const configResult = ConfigSchema.safeParse(process.env);
|
|
91
|
+
if (!configResult.success) {
|
|
92
|
+
console.error('Invalid configuration:', configResult.error);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Database Queries (SQL Injection Prevention)
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const EmailSchema = z.string().email().max(255);
|
|
101
|
+
|
|
102
|
+
async function getUserByEmail(email: unknown): Promise<Result<User, Error>> {
|
|
103
|
+
const validation = EmailSchema.safeParse(email);
|
|
104
|
+
if (!validation.success) {
|
|
105
|
+
return { ok: false, error: new Error('Invalid email format') };
|
|
106
|
+
}
|
|
107
|
+
// Parameterized query prevents SQL injection
|
|
108
|
+
const user = await db.query('SELECT * FROM users WHERE email = $1', [validation.data]);
|
|
109
|
+
return { ok: true, value: user };
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Validation Libraries
|
|
114
|
+
|
|
115
|
+
| Language | Recommended |
|
|
116
|
+
|----------|-------------|
|
|
117
|
+
| TypeScript/JavaScript | Zod, Yup, joi |
|
|
118
|
+
| Python | Pydantic, marshmallow |
|
|
119
|
+
| Go | go-playground/validator |
|
|
120
|
+
| Rust | serde + validator |
|
|
121
|
+
|
|
122
|
+
## Security Principles
|
|
123
|
+
|
|
124
|
+
1. **Trust Nothing**: All external data is potentially malicious
|
|
125
|
+
2. **Validate Once**: At the boundary, then trust typed data
|
|
126
|
+
3. **Fail Secure**: Invalid input = reject, not accept with warning
|
|
127
|
+
4. **No Bypass**: No "skip validation" flags or backdoors
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Extended References
|
|
132
|
+
|
|
133
|
+
For extended examples and detection patterns, see:
|
|
134
|
+
- `references/violations.md` - Extended violation examples
|
|
135
|
+
- `references/patterns.md` - Extended correct patterns
|
|
136
|
+
- `references/detection.md` - Grep patterns and report templates
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Success Criteria
|
|
141
|
+
|
|
142
|
+
- [ ] All boundaries identified and validated
|
|
143
|
+
- [ ] Schema validation used (not manual checks)
|
|
144
|
+
- [ ] No SQL injection risks
|
|
145
|
+
- [ ] External data validated before use
|
|
146
|
+
- [ ] Configuration validated on startup
|
|
147
|
+
- [ ] Validation errors return Result types
|
|
148
|
+
- [ ] Tests cover invalid input scenarios
|