devflow-kit 0.8.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +185 -29
- package/LICENSE +1 -1
- package/README.md +179 -308
- package/dist/cli.js +3 -1
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.js +311 -575
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +351 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +162 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +68 -0
- package/dist/utils/post-install.js +427 -0
- package/dist/utils/safe-delete-install.d.ts +22 -0
- package/dist/utils/safe-delete-install.js +156 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +27 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +134 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/background-memory-update.sh +167 -0
- package/scripts/hooks/pre-compact-memory.sh +81 -0
- package/scripts/hooks/session-start-memory.sh +84 -0
- package/scripts/hooks/stop-update-memory.sh +81 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +134 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +146 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -423
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -269
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
# Extended Correct Pattern Examples
|
|
2
|
+
|
|
3
|
+
Additional examples of correct implementations beyond the core examples in SKILL.md.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Result Types - Extended Patterns
|
|
8
|
+
|
|
9
|
+
### Chaining Results
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// Chain multiple Result operations
|
|
13
|
+
function processUserOrder(
|
|
14
|
+
userId: string,
|
|
15
|
+
orderId: string
|
|
16
|
+
): Result<Receipt, ProcessError> {
|
|
17
|
+
const userResult = getUser(userId);
|
|
18
|
+
if (!userResult.ok) return userResult;
|
|
19
|
+
|
|
20
|
+
const orderResult = getOrder(orderId);
|
|
21
|
+
if (!orderResult.ok) return orderResult;
|
|
22
|
+
|
|
23
|
+
const validationResult = validateOrder(orderResult.value, userResult.value);
|
|
24
|
+
if (!validationResult.ok) return validationResult;
|
|
25
|
+
|
|
26
|
+
return processPayment(orderResult.value);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Using pipe helper
|
|
30
|
+
const pipe = <T, E>(...fns: Array<(r: Result<T, E>) => Result<T, E>>) =>
|
|
31
|
+
(initial: Result<T, E>) => fns.reduce((r, fn) => r.ok ? fn(r) : r, initial);
|
|
32
|
+
|
|
33
|
+
// Map over Result
|
|
34
|
+
const map = <T, U, E>(fn: (value: T) => U) =>
|
|
35
|
+
(result: Result<T, E>): Result<U, E> =>
|
|
36
|
+
result.ok ? Ok(fn(result.value)) : result;
|
|
37
|
+
|
|
38
|
+
// FlatMap for Result chains
|
|
39
|
+
const flatMap = <T, U, E>(fn: (value: T) => Result<U, E>) =>
|
|
40
|
+
(result: Result<T, E>): Result<U, E> =>
|
|
41
|
+
result.ok ? fn(result.value) : result;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Async Result Patterns
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Async function returning Result
|
|
48
|
+
async function fetchUser(id: string): Promise<Result<User, FetchError>> {
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(`/api/users/${id}`);
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
return Err({ type: 'HttpError', status: response.status });
|
|
53
|
+
}
|
|
54
|
+
const user = await response.json();
|
|
55
|
+
return Ok(user);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
return Err({ type: 'NetworkError', message: error.message });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Collecting multiple async Results
|
|
62
|
+
async function fetchAllUsers(ids: string[]): Promise<Result<User[], FetchError>> {
|
|
63
|
+
const results = await Promise.all(ids.map(fetchUser));
|
|
64
|
+
|
|
65
|
+
for (const result of results) {
|
|
66
|
+
if (!result.ok) return result; // Return first error
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return Ok(results.map(r => r.value));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Parallel with partial success
|
|
73
|
+
async function fetchUsersPartial(ids: string[]): Promise<{
|
|
74
|
+
successes: User[];
|
|
75
|
+
failures: Array<{ id: string; error: FetchError }>;
|
|
76
|
+
}> {
|
|
77
|
+
const results = await Promise.all(
|
|
78
|
+
ids.map(async id => ({ id, result: await fetchUser(id) }))
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
successes: results.filter(r => r.result.ok).map(r => r.result.value),
|
|
83
|
+
failures: results
|
|
84
|
+
.filter(r => !r.result.ok)
|
|
85
|
+
.map(r => ({ id: r.id, error: r.result.error }))
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Dependency Injection - Extended Patterns
|
|
93
|
+
|
|
94
|
+
### Factory Pattern with DI
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// Factory that creates configured instances
|
|
98
|
+
interface ServiceFactory {
|
|
99
|
+
createUserService(): UserService;
|
|
100
|
+
createOrderService(): OrderService;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
class ProductionServiceFactory implements ServiceFactory {
|
|
104
|
+
constructor(
|
|
105
|
+
private db: Database,
|
|
106
|
+
private emailer: EmailService,
|
|
107
|
+
private logger: Logger
|
|
108
|
+
) {}
|
|
109
|
+
|
|
110
|
+
createUserService(): UserService {
|
|
111
|
+
return new UserService(this.db, this.emailer, this.logger);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
createOrderService(): OrderService {
|
|
115
|
+
return new OrderService(this.db, this.logger);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Test factory with mocks
|
|
120
|
+
class TestServiceFactory implements ServiceFactory {
|
|
121
|
+
createUserService(): UserService {
|
|
122
|
+
return new UserService(mockDb, mockEmailer, mockLogger);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
createOrderService(): OrderService {
|
|
126
|
+
return new OrderService(mockDb, mockLogger);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Functional DI Pattern
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// Dependencies as function parameters
|
|
135
|
+
type CreateUser = (
|
|
136
|
+
db: Database,
|
|
137
|
+
emailer: EmailService
|
|
138
|
+
) => (data: UserData) => Promise<Result<User, Error>>;
|
|
139
|
+
|
|
140
|
+
const createUser: CreateUser = (db, emailer) => async (data) => {
|
|
141
|
+
const validation = validateUserData(data);
|
|
142
|
+
if (!validation.ok) return validation;
|
|
143
|
+
|
|
144
|
+
const user = await db.users.create(data);
|
|
145
|
+
await emailer.sendWelcome(user.email);
|
|
146
|
+
return Ok(user);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Partial application for context
|
|
150
|
+
const createUserWithDeps = createUser(productionDb, productionEmailer);
|
|
151
|
+
const result = await createUserWithDeps(userData);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Interface Segregation
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// Small, focused interfaces
|
|
158
|
+
interface UserReader {
|
|
159
|
+
findById(id: string): Promise<User | null>;
|
|
160
|
+
findByEmail(email: string): Promise<User | null>;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
interface UserWriter {
|
|
164
|
+
create(data: UserData): Promise<User>;
|
|
165
|
+
update(id: string, data: Partial<UserData>): Promise<User>;
|
|
166
|
+
delete(id: string): Promise<void>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Service depends only on what it needs
|
|
170
|
+
class UserQueryService {
|
|
171
|
+
constructor(private reader: UserReader) {} // Only needs read operations
|
|
172
|
+
|
|
173
|
+
async getUser(id: string): Promise<Result<User, NotFoundError>> {
|
|
174
|
+
const user = await this.reader.findById(id);
|
|
175
|
+
return user ? Ok(user) : Err({ type: 'NotFound', id });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
class UserCommandService {
|
|
180
|
+
constructor(
|
|
181
|
+
private reader: UserReader,
|
|
182
|
+
private writer: UserWriter
|
|
183
|
+
) {} // Needs both for validation and writing
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Immutability - Extended Patterns
|
|
190
|
+
|
|
191
|
+
### Deep Updates
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
// Immutable deep update
|
|
195
|
+
function updateNestedAddress(
|
|
196
|
+
user: User,
|
|
197
|
+
city: string
|
|
198
|
+
): User {
|
|
199
|
+
return {
|
|
200
|
+
...user,
|
|
201
|
+
address: {
|
|
202
|
+
...user.address,
|
|
203
|
+
city
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Using immer for complex updates
|
|
209
|
+
import { produce } from 'immer';
|
|
210
|
+
|
|
211
|
+
function updateOrderItem(
|
|
212
|
+
order: Order,
|
|
213
|
+
itemId: string,
|
|
214
|
+
quantity: number
|
|
215
|
+
): Order {
|
|
216
|
+
return produce(order, draft => {
|
|
217
|
+
const item = draft.items.find(i => i.id === itemId);
|
|
218
|
+
if (item) item.quantity = quantity;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Immutable Collections
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// Immutable array operations
|
|
227
|
+
function removeItem<T>(items: T[], index: number): T[] {
|
|
228
|
+
return [...items.slice(0, index), ...items.slice(index + 1)];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function insertItem<T>(items: T[], index: number, item: T): T[] {
|
|
232
|
+
return [...items.slice(0, index), item, ...items.slice(index)];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function updateItem<T>(items: T[], index: number, item: T): T[] {
|
|
236
|
+
return items.map((existing, i) => i === index ? item : existing);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Immutable object operations
|
|
240
|
+
function omit<T extends object, K extends keyof T>(
|
|
241
|
+
obj: T,
|
|
242
|
+
...keys: K[]
|
|
243
|
+
): Omit<T, K> {
|
|
244
|
+
const result = { ...obj };
|
|
245
|
+
for (const key of keys) {
|
|
246
|
+
delete result[key];
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function pick<T extends object, K extends keyof T>(
|
|
252
|
+
obj: T,
|
|
253
|
+
...keys: K[]
|
|
254
|
+
): Pick<T, K> {
|
|
255
|
+
const result = {} as Pick<T, K>;
|
|
256
|
+
for (const key of keys) {
|
|
257
|
+
result[key] = obj[key];
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Pure Functions - Extended Patterns
|
|
266
|
+
|
|
267
|
+
### Dependency Injection for Impurity
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
// Inject impure dependencies
|
|
271
|
+
interface Clock {
|
|
272
|
+
now(): Date;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
interface RandomGenerator {
|
|
276
|
+
next(): number;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Function becomes pure relative to its inputs
|
|
280
|
+
function generateToken(random: RandomGenerator, length: number): string {
|
|
281
|
+
return Array.from({ length }, () =>
|
|
282
|
+
Math.floor(random.next() * 36).toString(36)
|
|
283
|
+
).join('');
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Easy to test
|
|
287
|
+
const mockRandom: RandomGenerator = {
|
|
288
|
+
next: () => 0.5 // Deterministic
|
|
289
|
+
};
|
|
290
|
+
const token = generateToken(mockRandom, 10); // Always same result
|
|
291
|
+
|
|
292
|
+
// Production usage
|
|
293
|
+
const productionRandom: RandomGenerator = {
|
|
294
|
+
next: () => Math.random()
|
|
295
|
+
};
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Separating Pure Logic
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
// Pure: business logic
|
|
302
|
+
function calculateOrderTotal(
|
|
303
|
+
items: OrderItem[],
|
|
304
|
+
discount: Discount | null,
|
|
305
|
+
taxRate: number
|
|
306
|
+
): OrderTotal {
|
|
307
|
+
const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
308
|
+
const discountAmount = discount ? applyDiscount(subtotal, discount) : 0;
|
|
309
|
+
const taxableAmount = subtotal - discountAmount;
|
|
310
|
+
const tax = taxableAmount * taxRate;
|
|
311
|
+
|
|
312
|
+
return {
|
|
313
|
+
subtotal,
|
|
314
|
+
discount: discountAmount,
|
|
315
|
+
tax,
|
|
316
|
+
total: taxableAmount + tax
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Impure: I/O wrapper
|
|
321
|
+
async function processOrder(orderId: string): Promise<Result<Order, Error>> {
|
|
322
|
+
// I/O: fetch data
|
|
323
|
+
const order = await orderRepository.findById(orderId);
|
|
324
|
+
if (!order) return Err({ type: 'NotFound' });
|
|
325
|
+
|
|
326
|
+
const discount = await discountService.getActive(order.customerId);
|
|
327
|
+
const taxRate = await taxService.getRate(order.shippingAddress);
|
|
328
|
+
|
|
329
|
+
// Pure: calculation
|
|
330
|
+
const total = calculateOrderTotal(order.items, discount, taxRate);
|
|
331
|
+
|
|
332
|
+
// I/O: persist
|
|
333
|
+
const updated = await orderRepository.update(orderId, { total });
|
|
334
|
+
return Ok(updated);
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Error Types - Extended Patterns
|
|
341
|
+
|
|
342
|
+
### Hierarchical Error Types
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// Base error type
|
|
346
|
+
type AppError =
|
|
347
|
+
| ValidationError
|
|
348
|
+
| BusinessError
|
|
349
|
+
| InfrastructureError;
|
|
350
|
+
|
|
351
|
+
// Validation errors
|
|
352
|
+
type ValidationError =
|
|
353
|
+
| { type: 'RequiredField'; field: string }
|
|
354
|
+
| { type: 'InvalidFormat'; field: string; expected: string }
|
|
355
|
+
| { type: 'OutOfRange'; field: string; min?: number; max?: number };
|
|
356
|
+
|
|
357
|
+
// Business errors
|
|
358
|
+
type BusinessError =
|
|
359
|
+
| { type: 'InsufficientFunds'; available: number; required: number }
|
|
360
|
+
| { type: 'ItemOutOfStock'; itemId: string; available: number }
|
|
361
|
+
| { type: 'OrderCancelled'; orderId: string; reason: string };
|
|
362
|
+
|
|
363
|
+
// Infrastructure errors
|
|
364
|
+
type InfrastructureError =
|
|
365
|
+
| { type: 'DatabaseError'; operation: string; message: string }
|
|
366
|
+
| { type: 'NetworkError'; endpoint: string; status?: number }
|
|
367
|
+
| { type: 'TimeoutError'; operation: string; durationMs: number };
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Error Conversion
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
// Convert between error types at boundaries
|
|
374
|
+
function toHttpError(error: AppError): HttpError {
|
|
375
|
+
switch (error.type) {
|
|
376
|
+
// Validation -> 400
|
|
377
|
+
case 'RequiredField':
|
|
378
|
+
case 'InvalidFormat':
|
|
379
|
+
case 'OutOfRange':
|
|
380
|
+
return { status: 400, message: formatValidationError(error) };
|
|
381
|
+
|
|
382
|
+
// Business -> 422
|
|
383
|
+
case 'InsufficientFunds':
|
|
384
|
+
case 'ItemOutOfStock':
|
|
385
|
+
case 'OrderCancelled':
|
|
386
|
+
return { status: 422, message: formatBusinessError(error) };
|
|
387
|
+
|
|
388
|
+
// Infrastructure -> 500/503
|
|
389
|
+
case 'DatabaseError':
|
|
390
|
+
case 'NetworkError':
|
|
391
|
+
return { status: 503, message: 'Service temporarily unavailable' };
|
|
392
|
+
case 'TimeoutError':
|
|
393
|
+
return { status: 504, message: 'Request timed out' };
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Resource Cleanup - Extended Patterns
|
|
401
|
+
|
|
402
|
+
### Resource Pool Pattern
|
|
403
|
+
|
|
404
|
+
```typescript
|
|
405
|
+
// Connection pool with proper cleanup
|
|
406
|
+
class ConnectionPool {
|
|
407
|
+
private connections: DbConnection[] = [];
|
|
408
|
+
private available: DbConnection[] = [];
|
|
409
|
+
|
|
410
|
+
async acquire(): Promise<DbConnection> {
|
|
411
|
+
if (this.available.length > 0) {
|
|
412
|
+
return this.available.pop()!;
|
|
413
|
+
}
|
|
414
|
+
const conn = await this.createConnection();
|
|
415
|
+
this.connections.push(conn);
|
|
416
|
+
return conn;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
release(conn: DbConnection): void {
|
|
420
|
+
this.available.push(conn);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async close(): Promise<void> {
|
|
424
|
+
await Promise.all(this.connections.map(c => c.close()));
|
|
425
|
+
this.connections = [];
|
|
426
|
+
this.available = [];
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Usage with automatic release
|
|
431
|
+
async function withConnection<T>(
|
|
432
|
+
pool: ConnectionPool,
|
|
433
|
+
fn: (conn: DbConnection) => Promise<T>
|
|
434
|
+
): Promise<T> {
|
|
435
|
+
const conn = await pool.acquire();
|
|
436
|
+
try {
|
|
437
|
+
return await fn(conn);
|
|
438
|
+
} finally {
|
|
439
|
+
pool.release(conn);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Subscription Management
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
// Subscription manager for cleanup
|
|
448
|
+
class SubscriptionManager {
|
|
449
|
+
private subscriptions: Array<() => void> = [];
|
|
450
|
+
|
|
451
|
+
add(unsubscribe: () => void): void {
|
|
452
|
+
this.subscriptions.push(unsubscribe);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
cleanup(): void {
|
|
456
|
+
for (const unsub of this.subscriptions) {
|
|
457
|
+
unsub();
|
|
458
|
+
}
|
|
459
|
+
this.subscriptions = [];
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Usage in component/service lifecycle
|
|
464
|
+
class DataService {
|
|
465
|
+
private subscriptions = new SubscriptionManager();
|
|
466
|
+
|
|
467
|
+
initialize(): void {
|
|
468
|
+
this.subscriptions.add(
|
|
469
|
+
eventBus.on('user-updated', this.handleUserUpdate)
|
|
470
|
+
);
|
|
471
|
+
this.subscriptions.add(
|
|
472
|
+
socket.on('message', this.handleMessage)
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
dispose(): void {
|
|
477
|
+
this.subscriptions.cleanup();
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## Language-Specific Patterns
|
|
485
|
+
|
|
486
|
+
### Python Result Pattern
|
|
487
|
+
|
|
488
|
+
```python
|
|
489
|
+
from dataclasses import dataclass
|
|
490
|
+
from typing import Generic, TypeVar, Union
|
|
491
|
+
|
|
492
|
+
T = TypeVar('T')
|
|
493
|
+
E = TypeVar('E')
|
|
494
|
+
|
|
495
|
+
@dataclass(frozen=True)
|
|
496
|
+
class Ok(Generic[T]):
|
|
497
|
+
value: T
|
|
498
|
+
ok: bool = True
|
|
499
|
+
|
|
500
|
+
@dataclass(frozen=True)
|
|
501
|
+
class Err(Generic[E]):
|
|
502
|
+
error: E
|
|
503
|
+
ok: bool = False
|
|
504
|
+
|
|
505
|
+
Result = Union[Ok[T], Err[E]]
|
|
506
|
+
|
|
507
|
+
def create_user(data: dict) -> Result[User, ValidationError]:
|
|
508
|
+
validation = validate(data)
|
|
509
|
+
if not validation.ok:
|
|
510
|
+
return Err(ValidationError(validation.errors))
|
|
511
|
+
return Ok(User(**data))
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Go Result Pattern
|
|
515
|
+
|
|
516
|
+
```go
|
|
517
|
+
// Using tuple returns (idiomatic Go)
|
|
518
|
+
func CreateUser(data UserData) (*User, error) {
|
|
519
|
+
if err := validate(data); err != nil {
|
|
520
|
+
return nil, fmt.Errorf("validation failed: %w", err)
|
|
521
|
+
}
|
|
522
|
+
user := buildUser(data)
|
|
523
|
+
return &user, nil
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Custom Result type for complex cases
|
|
527
|
+
type Result[T any] struct {
|
|
528
|
+
Value T
|
|
529
|
+
Err error
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
func (r Result[T]) IsOk() bool {
|
|
533
|
+
return r.Err == nil
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
func Ok[T any](value T) Result[T] {
|
|
537
|
+
return Result[T]{Value: value}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
func Fail[T any](err error) Result[T] {
|
|
541
|
+
return Result[T]{Err: err}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Rust Result Pattern
|
|
546
|
+
|
|
547
|
+
```rust
|
|
548
|
+
use std::result::Result;
|
|
549
|
+
|
|
550
|
+
#[derive(Debug)]
|
|
551
|
+
enum UserError {
|
|
552
|
+
ValidationFailed(String),
|
|
553
|
+
NotFound(String),
|
|
554
|
+
DatabaseError(String),
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
fn create_user(data: &UserData) -> Result<User, UserError> {
|
|
558
|
+
validate(data).map_err(|e| UserError::ValidationFailed(e.to_string()))?;
|
|
559
|
+
|
|
560
|
+
let user = User::from(data);
|
|
561
|
+
Ok(user)
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// With custom error trait
|
|
565
|
+
impl std::error::Error for UserError {}
|
|
566
|
+
|
|
567
|
+
impl std::fmt::Display for UserError {
|
|
568
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
569
|
+
match self {
|
|
570
|
+
UserError::ValidationFailed(msg) => write!(f, "Validation failed: {}", msg),
|
|
571
|
+
UserError::NotFound(id) => write!(f, "User not found: {}", id),
|
|
572
|
+
UserError::DatabaseError(msg) => write!(f, "Database error: {}", msg),
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
```
|