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
|
@@ -1,597 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: error-handling
|
|
3
|
-
description: Automatically enforce Result type pattern and consistent error handling throughout the codebase. Use when writing functions that can fail, handling errors, or reviewing error handling consistency.
|
|
4
|
-
allowed-tools: Read, Grep, Glob, AskUserQuestion
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Error Handling Skill
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
Enforce consistent, type-safe error handling using Result pattern:
|
|
12
|
-
1. **Result types everywhere** - No throwing exceptions in business logic
|
|
13
|
-
2. **Explicit error handling** - Force callers to handle errors
|
|
14
|
-
3. **Type-safe errors** - Leverage type system for error cases
|
|
15
|
-
4. **Consistent patterns** - Same approach throughout codebase
|
|
16
|
-
|
|
17
|
-
## When This Skill Activates
|
|
18
|
-
|
|
19
|
-
Automatically triggers when:
|
|
20
|
-
- Functions are being written that can fail
|
|
21
|
-
- Try/catch blocks are being added
|
|
22
|
-
- Error handling code is being modified
|
|
23
|
-
- New error types are being defined
|
|
24
|
-
- Functions are refactored to add error cases
|
|
25
|
-
|
|
26
|
-
## Core Pattern: Result Types
|
|
27
|
-
|
|
28
|
-
**CRITICAL**: Business logic NEVER throws exceptions.
|
|
29
|
-
|
|
30
|
-
### Result Type Definition
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
type Result<T, E = Error> =
|
|
34
|
-
| { ok: true; value: T }
|
|
35
|
-
| { ok: false; error: E };
|
|
36
|
-
|
|
37
|
-
// Helper constructors
|
|
38
|
-
const Ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
|
|
39
|
-
const Err = <E>(error: E): Result<never, E> => ({ ok: false, error });
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Pattern Examples
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
// ❌ VIOLATION: Throwing exceptions in business logic
|
|
46
|
-
function divide(a: number, b: number): number {
|
|
47
|
-
if (b === 0) {
|
|
48
|
-
throw new Error('Division by zero');
|
|
49
|
-
}
|
|
50
|
-
return a / b;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function processOrder(orderId: string): Order {
|
|
54
|
-
const order = findOrder(orderId);
|
|
55
|
-
if (!order) {
|
|
56
|
-
throw new Error('Order not found');
|
|
57
|
-
}
|
|
58
|
-
if (order.status !== 'pending') {
|
|
59
|
-
throw new Error('Order not pending');
|
|
60
|
-
}
|
|
61
|
-
return order;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// ✅ CORRECT: Return Result types
|
|
65
|
-
function divide(a: number, b: number): Result<number, string> {
|
|
66
|
-
if (b === 0) {
|
|
67
|
-
return Err('Division by zero');
|
|
68
|
-
}
|
|
69
|
-
return Ok(a / b);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
type OrderError =
|
|
73
|
-
| { type: 'NotFound'; orderId: string }
|
|
74
|
-
| { type: 'InvalidStatus'; expected: string; actual: string };
|
|
75
|
-
|
|
76
|
-
function processOrder(orderId: string): Result<Order, OrderError> {
|
|
77
|
-
const order = findOrder(orderId);
|
|
78
|
-
if (!order) {
|
|
79
|
-
return Err({ type: 'NotFound', orderId });
|
|
80
|
-
}
|
|
81
|
-
if (order.status !== 'pending') {
|
|
82
|
-
return Err({
|
|
83
|
-
type: 'InvalidStatus',
|
|
84
|
-
expected: 'pending',
|
|
85
|
-
actual: order.status
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
return Ok(order);
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Exception Boundaries
|
|
93
|
-
|
|
94
|
-
Exceptions are ONLY allowed at system boundaries:
|
|
95
|
-
|
|
96
|
-
### Boundary Layer (Allowed)
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
// ✅ API boundary - convert exceptions to HTTP responses
|
|
100
|
-
app.post('/api/orders/:id', async (req, res) => {
|
|
101
|
-
try {
|
|
102
|
-
const result = await processOrder(req.params.id);
|
|
103
|
-
|
|
104
|
-
if (!result.ok) {
|
|
105
|
-
// Handle Result error
|
|
106
|
-
const statusCode = result.error.type === 'NotFound' ? 404 : 400;
|
|
107
|
-
return res.status(statusCode).json({
|
|
108
|
-
error: result.error
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return res.json(result.value);
|
|
113
|
-
} catch (error) {
|
|
114
|
-
// Unexpected errors only (infrastructure failures)
|
|
115
|
-
console.error('Unexpected error:', error);
|
|
116
|
-
return res.status(500).json({ error: 'Internal server error' });
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// ✅ Database boundary - convert DB exceptions to Result
|
|
121
|
-
async function saveOrder(order: Order): Promise<Result<void, DbError>> {
|
|
122
|
-
try {
|
|
123
|
-
await db.orders.insert(order);
|
|
124
|
-
return Ok(undefined);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
// Convert infrastructure exception to Result
|
|
127
|
-
if (error.code === 'UNIQUE_VIOLATION') {
|
|
128
|
-
return Err({ type: 'DuplicateOrder', orderId: order.id });
|
|
129
|
-
}
|
|
130
|
-
return Err({ type: 'DatabaseError', message: error.message });
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// ✅ External API boundary - convert network errors to Result
|
|
135
|
-
async function fetchPaymentStatus(orderId: string): Promise<Result<PaymentStatus, ApiError>> {
|
|
136
|
-
try {
|
|
137
|
-
const response = await fetch(`https://payment-api.com/orders/${orderId}`);
|
|
138
|
-
const data = await response.json();
|
|
139
|
-
|
|
140
|
-
// Validate response
|
|
141
|
-
const validation = PaymentStatusSchema.safeParse(data);
|
|
142
|
-
if (!validation.success) {
|
|
143
|
-
return Err({ type: 'InvalidResponse', details: validation.error });
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return Ok(validation.data);
|
|
147
|
-
} catch (error) {
|
|
148
|
-
// Network/infrastructure errors
|
|
149
|
-
return Err({ type: 'NetworkError', message: error.message });
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### Business Logic (No Exceptions)
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
// ✅ Pure business logic - only Result types
|
|
158
|
-
function calculateDiscount(
|
|
159
|
-
order: Order,
|
|
160
|
-
discountCode: string
|
|
161
|
-
): Result<number, DiscountError> {
|
|
162
|
-
const discount = findDiscount(discountCode);
|
|
163
|
-
|
|
164
|
-
if (!discount) {
|
|
165
|
-
return Err({ type: 'InvalidCode', code: discountCode });
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (isExpired(discount)) {
|
|
169
|
-
return Err({ type: 'ExpiredCode', code: discountCode });
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (order.total < discount.minimumPurchase) {
|
|
173
|
-
return Err({
|
|
174
|
-
type: 'MinimumNotMet',
|
|
175
|
-
required: discount.minimumPurchase,
|
|
176
|
-
actual: order.total
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return Ok(order.total * discount.percentage);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// ✅ Composing Result-returning functions
|
|
184
|
-
function applyDiscountToOrder(
|
|
185
|
-
order: Order,
|
|
186
|
-
discountCode: string
|
|
187
|
-
): Result<Order, DiscountError | OrderError> {
|
|
188
|
-
const discountResult = calculateDiscount(order, discountCode);
|
|
189
|
-
|
|
190
|
-
if (!discountResult.ok) {
|
|
191
|
-
return Err(discountResult.error);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const newTotal = order.total - discountResult.value;
|
|
195
|
-
|
|
196
|
-
if (newTotal < 0) {
|
|
197
|
-
return Err({ type: 'InvalidTotal', total: newTotal });
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return Ok({ ...order, total: newTotal, discount: discountResult.value });
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
## Error Type Design
|
|
205
|
-
|
|
206
|
-
### Discriminated Unions for Errors
|
|
207
|
-
|
|
208
|
-
```typescript
|
|
209
|
-
// ✅ CORRECT: Discriminated union with specific error types
|
|
210
|
-
type UserError =
|
|
211
|
-
| { type: 'NotFound'; userId: string }
|
|
212
|
-
| { type: 'ValidationError'; field: string; message: string }
|
|
213
|
-
| { type: 'DuplicateEmail'; email: string }
|
|
214
|
-
| { type: 'PermissionDenied'; action: string; userId: string };
|
|
215
|
-
|
|
216
|
-
function getUser(userId: string): Result<User, UserError> {
|
|
217
|
-
// Implementation that returns specific error types
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Exhaustive error handling
|
|
221
|
-
const result = getUser('123');
|
|
222
|
-
if (!result.ok) {
|
|
223
|
-
switch (result.error.type) {
|
|
224
|
-
case 'NotFound':
|
|
225
|
-
console.log(`User ${result.error.userId} not found`);
|
|
226
|
-
break;
|
|
227
|
-
case 'ValidationError':
|
|
228
|
-
console.log(`Invalid ${result.error.field}: ${result.error.message}`);
|
|
229
|
-
break;
|
|
230
|
-
case 'DuplicateEmail':
|
|
231
|
-
console.log(`Email ${result.error.email} already exists`);
|
|
232
|
-
break;
|
|
233
|
-
case 'PermissionDenied':
|
|
234
|
-
console.log(`Cannot ${result.error.action} for user ${result.error.userId}`);
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Error Hierarchy
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
// Base error types
|
|
244
|
-
type DbError =
|
|
245
|
-
| { type: 'ConnectionFailed'; details: string }
|
|
246
|
-
| { type: 'QueryFailed'; query: string; details: string }
|
|
247
|
-
| { type: 'DuplicateKey'; table: string; key: string }
|
|
248
|
-
| { type: 'NotFound'; table: string; id: string };
|
|
249
|
-
|
|
250
|
-
type ValidationError =
|
|
251
|
-
| { type: 'RequiredField'; field: string }
|
|
252
|
-
| { type: 'InvalidFormat'; field: string; format: string }
|
|
253
|
-
| { type: 'OutOfRange'; field: string; min: number; max: number };
|
|
254
|
-
|
|
255
|
-
// Domain-specific errors compose base types
|
|
256
|
-
type OrderError =
|
|
257
|
-
| { type: 'InvalidStatus'; expected: string; actual: string }
|
|
258
|
-
| { type: 'InsufficientStock'; productId: string; available: number; requested: number }
|
|
259
|
-
| ValidationError
|
|
260
|
-
| DbError;
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## Error Handling Patterns
|
|
264
|
-
|
|
265
|
-
### Pattern 1: Early Return
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
function processPayment(order: Order, payment: Payment): Result<Receipt, PaymentError> {
|
|
269
|
-
// Validate order
|
|
270
|
-
const orderValidation = validateOrder(order);
|
|
271
|
-
if (!orderValidation.ok) {
|
|
272
|
-
return Err({ type: 'InvalidOrder', details: orderValidation.error });
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// Validate payment
|
|
276
|
-
const paymentValidation = validatePayment(payment);
|
|
277
|
-
if (!paymentValidation.ok) {
|
|
278
|
-
return Err({ type: 'InvalidPayment', details: paymentValidation.error });
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Check balance
|
|
282
|
-
const balanceCheck = checkBalance(payment);
|
|
283
|
-
if (!balanceCheck.ok) {
|
|
284
|
-
return Err(balanceCheck.error);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// All validations passed, process
|
|
288
|
-
const receipt = createReceipt(order, payment);
|
|
289
|
-
return Ok(receipt);
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
### Pattern 2: Result Chaining (Monadic)
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
// Helper for chaining Result-returning functions
|
|
297
|
-
function chain<T, U, E>(
|
|
298
|
-
result: Result<T, E>,
|
|
299
|
-
fn: (value: T) => Result<U, E>
|
|
300
|
-
): Result<U, E> {
|
|
301
|
-
if (!result.ok) {
|
|
302
|
-
return result;
|
|
303
|
-
}
|
|
304
|
-
return fn(result.value);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// Usage
|
|
308
|
-
const result = chain(
|
|
309
|
-
validateOrder(order),
|
|
310
|
-
(validOrder) => chain(
|
|
311
|
-
validatePayment(payment),
|
|
312
|
-
(validPayment) => processPayment(validOrder, validPayment)
|
|
313
|
-
)
|
|
314
|
-
);
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Pattern 3: Collecting Multiple Errors
|
|
318
|
-
|
|
319
|
-
```typescript
|
|
320
|
-
type ValidationResult<T> = Result<T, ValidationError[]>;
|
|
321
|
-
|
|
322
|
-
function validateUser(data: unknown): ValidationResult<User> {
|
|
323
|
-
const errors: ValidationError[] = [];
|
|
324
|
-
|
|
325
|
-
if (!isValidEmail(data.email)) {
|
|
326
|
-
errors.push({ type: 'InvalidFormat', field: 'email', format: 'email' });
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
if (!isValidAge(data.age)) {
|
|
330
|
-
errors.push({ type: 'OutOfRange', field: 'age', min: 0, max: 150 });
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
if (!isValidName(data.name)) {
|
|
334
|
-
errors.push({ type: 'RequiredField', field: 'name' });
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
if (errors.length > 0) {
|
|
338
|
-
return Err(errors);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return Ok({ email: data.email, age: data.age, name: data.name });
|
|
342
|
-
}
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
## Error Handling Report Format
|
|
346
|
-
|
|
347
|
-
```markdown
|
|
348
|
-
⚠️ ERROR HANDLING INCONSISTENCIES DETECTED
|
|
349
|
-
|
|
350
|
-
## 🔴 CRITICAL - Throwing in Business Logic
|
|
351
|
-
**File**: src/services/order.ts:45
|
|
352
|
-
**Issue**: Business logic throws exceptions instead of returning Result
|
|
353
|
-
|
|
354
|
-
**Current Code**:
|
|
355
|
-
```typescript
|
|
356
|
-
function processOrder(orderId: string): Order {
|
|
357
|
-
const order = findOrder(orderId);
|
|
358
|
-
if (!order) {
|
|
359
|
-
throw new Error('Order not found');
|
|
360
|
-
}
|
|
361
|
-
return order;
|
|
362
|
-
}
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
**Required Fix**:
|
|
366
|
-
```typescript
|
|
367
|
-
type OrderError = { type: 'NotFound'; orderId: string };
|
|
368
|
-
|
|
369
|
-
function processOrder(orderId: string): Result<Order, OrderError> {
|
|
370
|
-
const order = findOrder(orderId);
|
|
371
|
-
if (!order) {
|
|
372
|
-
return Err({ type: 'NotFound', orderId });
|
|
373
|
-
}
|
|
374
|
-
return Ok(order);
|
|
375
|
-
}
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
**Impact**: Forces explicit error handling, prevents uncaught exceptions
|
|
379
|
-
|
|
380
|
-
## 🔴 CRITICAL - Inconsistent Error Handling
|
|
381
|
-
**File**: src/services/user.ts
|
|
382
|
-
**Issue**: Some functions return Result, others throw exceptions
|
|
383
|
-
|
|
384
|
-
**Inconsistency**:
|
|
385
|
-
```typescript
|
|
386
|
-
// Function 1: Returns Result
|
|
387
|
-
function getUser(id: string): Result<User, UserError> { ... }
|
|
388
|
-
|
|
389
|
-
// Function 2: Throws exception (inconsistent!)
|
|
390
|
-
function createUser(data: UserData): User {
|
|
391
|
-
if (!valid(data)) {
|
|
392
|
-
throw new Error('Invalid data');
|
|
393
|
-
}
|
|
394
|
-
return user;
|
|
395
|
-
}
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
**Required Fix**:
|
|
399
|
-
```typescript
|
|
400
|
-
// ALL functions in module must use Result
|
|
401
|
-
function createUser(data: unknown): Result<User, UserError> {
|
|
402
|
-
const validation = UserSchema.safeParse(data);
|
|
403
|
-
if (!validation.success) {
|
|
404
|
-
return Err({ type: 'ValidationError', details: validation.error });
|
|
405
|
-
}
|
|
406
|
-
return Ok(createUserFromValid(validation.data));
|
|
407
|
-
}
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
**Impact**: Consistent error handling throughout module
|
|
411
|
-
|
|
412
|
-
## 🟡 HIGH - Missing Error Types
|
|
413
|
-
**File**: src/services/payment.ts:67
|
|
414
|
-
**Issue**: Using generic Error instead of specific error types
|
|
415
|
-
|
|
416
|
-
**Current**:
|
|
417
|
-
```typescript
|
|
418
|
-
function processPayment(payment: Payment): Result<Receipt, Error> {
|
|
419
|
-
if (payment.amount <= 0) {
|
|
420
|
-
return Err(new Error('Invalid amount'));
|
|
421
|
-
}
|
|
422
|
-
// ...
|
|
423
|
-
}
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
**Required Fix**:
|
|
427
|
-
```typescript
|
|
428
|
-
type PaymentError =
|
|
429
|
-
| { type: 'InvalidAmount'; amount: number }
|
|
430
|
-
| { type: 'InsufficientFunds'; required: number; available: number }
|
|
431
|
-
| { type: 'PaymentGatewayError'; details: string };
|
|
432
|
-
|
|
433
|
-
function processPayment(payment: Payment): Result<Receipt, PaymentError> {
|
|
434
|
-
if (payment.amount <= 0) {
|
|
435
|
-
return Err({ type: 'InvalidAmount', amount: payment.amount });
|
|
436
|
-
}
|
|
437
|
-
// ...
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
**Impact**: Type-safe, actionable error handling
|
|
442
|
-
|
|
443
|
-
## 🟡 HIGH - Try/Catch in Business Logic
|
|
444
|
-
**File**: src/utils/calculation.ts:34
|
|
445
|
-
**Issue**: Try/catch used where Result type should be used
|
|
446
|
-
|
|
447
|
-
**Current**:
|
|
448
|
-
```typescript
|
|
449
|
-
function calculateTotal(items: Item[]): number {
|
|
450
|
-
try {
|
|
451
|
-
return items.reduce((sum, item) => {
|
|
452
|
-
if (item.price < 0) {
|
|
453
|
-
throw new Error('Negative price');
|
|
454
|
-
}
|
|
455
|
-
return sum + item.price;
|
|
456
|
-
}, 0);
|
|
457
|
-
} catch (error) {
|
|
458
|
-
return 0; // Swallowing error!
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
**Required Fix**:
|
|
464
|
-
```typescript
|
|
465
|
-
type CalculationError = { type: 'NegativePrice'; itemId: string; price: number };
|
|
466
|
-
|
|
467
|
-
function calculateTotal(items: Item[]): Result<number, CalculationError> {
|
|
468
|
-
let sum = 0;
|
|
469
|
-
|
|
470
|
-
for (const item of items) {
|
|
471
|
-
if (item.price < 0) {
|
|
472
|
-
return Err({ type: 'NegativePrice', itemId: item.id, price: item.price });
|
|
473
|
-
}
|
|
474
|
-
sum += item.price;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return Ok(sum);
|
|
478
|
-
}
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
**Impact**: Explicit error handling, no silent failures
|
|
482
|
-
|
|
483
|
-
## 📊 Summary
|
|
484
|
-
- **Critical**: 12 functions throwing instead of Result
|
|
485
|
-
- **Critical**: 3 modules with inconsistent error handling
|
|
486
|
-
- **High**: 8 functions using generic Error
|
|
487
|
-
- **High**: 5 try/catch blocks in business logic
|
|
488
|
-
- **Files affected**: 15
|
|
489
|
-
|
|
490
|
-
## 🛑 CONSISTENCY CHECK FAILED
|
|
491
|
-
|
|
492
|
-
Error handling is inconsistent across codebase:
|
|
493
|
-
- Some functions use Result pattern
|
|
494
|
-
- Others throw exceptions
|
|
495
|
-
- Generic Error types used instead of specific types
|
|
496
|
-
- Silent error swallowing in several places
|
|
497
|
-
|
|
498
|
-
## ✅ Required Actions
|
|
499
|
-
|
|
500
|
-
**Phase 1: Critical (Stop throwing)**
|
|
501
|
-
1. Convert all business logic to Result types
|
|
502
|
-
2. Remove exception throwing from services
|
|
503
|
-
3. Define error type hierarchies
|
|
504
|
-
|
|
505
|
-
**Phase 2: Consistency**
|
|
506
|
-
4. Ensure entire modules use same pattern
|
|
507
|
-
5. Replace generic Error with specific types
|
|
508
|
-
6. Add discriminated union error types
|
|
509
|
-
|
|
510
|
-
**Phase 3: Boundaries**
|
|
511
|
-
7. Keep try/catch only at system boundaries
|
|
512
|
-
8. Convert exceptions to Result at boundaries
|
|
513
|
-
9. Document boundary vs business logic split
|
|
514
|
-
|
|
515
|
-
## 📚 Implementation Checklist
|
|
516
|
-
|
|
517
|
-
- [ ] Define Result<T, E> type
|
|
518
|
-
- [ ] Define error type hierarchies
|
|
519
|
-
- [ ] Convert throwing functions to Result
|
|
520
|
-
- [ ] Update callers to handle Result
|
|
521
|
-
- [ ] Move try/catch to boundaries only
|
|
522
|
-
- [ ] Add tests for error cases
|
|
523
|
-
- [ ] Document error handling pattern
|
|
524
|
-
|
|
525
|
-
## 🎯 Module Migration Example
|
|
526
|
-
|
|
527
|
-
Before (Inconsistent):
|
|
528
|
-
```typescript
|
|
529
|
-
// Some throw, some return Result
|
|
530
|
-
function getUser(id: string): Result<User, Error> { ... }
|
|
531
|
-
function createUser(data: any): User { throw ... }
|
|
532
|
-
function updateUser(id: string, data: any): User { throw ... }
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
After (Consistent):
|
|
536
|
-
```typescript
|
|
537
|
-
// All use Result with specific errors
|
|
538
|
-
type UserError =
|
|
539
|
-
| { type: 'NotFound'; userId: string }
|
|
540
|
-
| { type: 'ValidationError'; details: unknown }
|
|
541
|
-
| { type: 'DuplicateEmail'; email: string };
|
|
542
|
-
|
|
543
|
-
function getUser(id: string): Result<User, UserError> { ... }
|
|
544
|
-
function createUser(data: unknown): Result<User, UserError> { ... }
|
|
545
|
-
function updateUser(id: string, data: unknown): Result<User, UserError> { ... }
|
|
546
|
-
```
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
## Consistency Rules
|
|
550
|
-
|
|
551
|
-
**Module-level consistency:**
|
|
552
|
-
- If ONE function in a module uses Result, ALL must use Result
|
|
553
|
-
- If ONE function uses specific error types, ALL must use specific types
|
|
554
|
-
- NO mixing of Result and exception throwing in same module
|
|
555
|
-
|
|
556
|
-
**Project-level consistency:**
|
|
557
|
-
- Business logic NEVER throws
|
|
558
|
-
- Boundaries ALWAYS catch and convert to Result
|
|
559
|
-
- Error types ALWAYS use discriminated unions
|
|
560
|
-
- Functions ALWAYS document possible errors in return type
|
|
561
|
-
|
|
562
|
-
## Integration Points
|
|
563
|
-
|
|
564
|
-
This skill works with:
|
|
565
|
-
|
|
566
|
-
**pattern-check**: Part of core pattern enforcement
|
|
567
|
-
**test-design**: Result types simplify test design
|
|
568
|
-
**code-smell**: Catches silent error swallowing
|
|
569
|
-
**input-validation**: Validation returns Result types
|
|
570
|
-
|
|
571
|
-
## Success Criteria
|
|
572
|
-
|
|
573
|
-
Error handling passes when:
|
|
574
|
-
- ✅ No exceptions thrown in business logic
|
|
575
|
-
- ✅ All functions use Result types consistently
|
|
576
|
-
- ✅ Specific error types (discriminated unions)
|
|
577
|
-
- ✅ Try/catch only at boundaries
|
|
578
|
-
- ✅ Boundary functions convert exceptions to Result
|
|
579
|
-
- ✅ Module consistency (all or nothing)
|
|
580
|
-
- ✅ Error cases tested
|
|
581
|
-
- ✅ Type system enforces error handling
|
|
582
|
-
|
|
583
|
-
## Example Scenario
|
|
584
|
-
|
|
585
|
-
```
|
|
586
|
-
User: "Add function to charge customer"
|
|
587
|
-
→ error-handling activates
|
|
588
|
-
→ Analyzes: Function can fail (insufficient funds, invalid card, etc.)
|
|
589
|
-
→ Checks: Does module use Result pattern?
|
|
590
|
-
→ Enforces: Define PaymentError type
|
|
591
|
-
→ Enforces: Return Result<Receipt, PaymentError>
|
|
592
|
-
→ Verifies: No exceptions thrown
|
|
593
|
-
→ Confirms: Callers handle errors
|
|
594
|
-
→ Approves: Consistent with module patterns
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
This ensures every function that can fail has explicit, type-safe error handling.
|