devflow-kit 0.9.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +197 -29
- package/LICENSE +1 -1
- package/README.md +185 -309
- package/dist/cli.js +7 -1
- package/dist/commands/ambient.d.ts +18 -0
- package/dist/commands/ambient.js +136 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.js +393 -571
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/memory.d.ts +22 -0
- package/dist/commands/memory.js +175 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +418 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +169 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +80 -0
- package/dist/utils/post-install.js +508 -0
- package/dist/utils/safe-delete-install.d.ts +29 -0
- package/dist/utils/safe-delete-install.js +191 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-ambient/README.md +49 -0
- package/plugins/devflow-ambient/commands/ambient.md +110 -0
- package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +89 -0
- package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +64 -0
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +28 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +138 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +139 -0
- package/plugins/devflow-core-skills/skills/test-driven-development/references/rationalization-prevention.md +111 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/ambient-prompt.sh +48 -0
- package/scripts/hooks/background-memory-update.sh +208 -0
- package/scripts/hooks/ensure-memory-gitignore.sh +17 -0
- package/scripts/hooks/pre-compact-memory.sh +87 -0
- package/scripts/hooks/session-start-memory.sh +126 -0
- package/scripts/hooks/stop-update-memory.sh +85 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/ambient-router/SKILL.md +89 -0
- package/shared/skills/ambient-router/references/skill-catalog.md +64 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +138 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-driven-development/SKILL.md +139 -0
- package/shared/skills/test-driven-development/references/rationalization-prevention.md +111 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +160 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/get-issue.md +0 -286
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -493
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/get-issue.md +0 -16
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -20
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
# Complexity Resolution Patterns
|
|
2
|
+
|
|
3
|
+
Correct patterns for addressing complexity issues.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Deep Nesting Solutions
|
|
8
|
+
|
|
9
|
+
### Early Returns
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// Extract nested conditionals with early returns
|
|
13
|
+
function processOrder(order: Order) {
|
|
14
|
+
if (!order?.items) return;
|
|
15
|
+
|
|
16
|
+
for (const item of order.items) {
|
|
17
|
+
processItem(item);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function processItem(item: OrderItem) {
|
|
22
|
+
if (item.quantity <= 0) return;
|
|
23
|
+
if (!item.product?.inStock) return;
|
|
24
|
+
|
|
25
|
+
// Actual logic at top level
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Guard Clauses
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// Validate preconditions first
|
|
33
|
+
async function updateUser(userId: string, data: UpdateData) {
|
|
34
|
+
// Guards at the top
|
|
35
|
+
if (!userId) return Err({ type: 'InvalidInput', field: 'userId' });
|
|
36
|
+
if (!data) return Err({ type: 'InvalidInput', field: 'data' });
|
|
37
|
+
|
|
38
|
+
const user = await userRepo.findById(userId);
|
|
39
|
+
if (!user) return Err({ type: 'NotFound', id: userId });
|
|
40
|
+
if (!user.canBeUpdated) return Err({ type: 'Forbidden' });
|
|
41
|
+
|
|
42
|
+
// Happy path at normal indentation
|
|
43
|
+
const updated = { ...user, ...data };
|
|
44
|
+
return Ok(await userRepo.save(updated));
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Extract and Compose
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// Break nested try-catch into composed functions
|
|
52
|
+
async function fetchAndProcess(url: string): Promise<Result<void, Error>> {
|
|
53
|
+
const response = await safeFetch(url);
|
|
54
|
+
if (!response.ok) return response;
|
|
55
|
+
|
|
56
|
+
const data = await safeParseJson(response.value);
|
|
57
|
+
if (!data.ok) return data;
|
|
58
|
+
|
|
59
|
+
return processItems(data.value.items);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function safeFetch(url: string): Promise<Result<Response, Error>> {
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(url);
|
|
65
|
+
if (!response.ok) return Err(new Error(`HTTP ${response.status}`));
|
|
66
|
+
return Ok(response);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
return Err(error as Error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Long Function Solutions
|
|
76
|
+
|
|
77
|
+
### Extract Logical Units
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Break monolithic function into composed steps
|
|
81
|
+
async function handleCheckout(cart: Cart, user: User) {
|
|
82
|
+
const validated = validateCart(cart);
|
|
83
|
+
const priced = calculatePricing(validated);
|
|
84
|
+
const reserved = await reserveInventory(priced);
|
|
85
|
+
const payment = await processPayment(reserved, user);
|
|
86
|
+
await sendNotifications(payment);
|
|
87
|
+
trackAnalytics(payment);
|
|
88
|
+
return payment;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Pipeline Pattern
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Chain transformations clearly
|
|
96
|
+
async function userRegistrationFlow(formData: FormData): Promise<Result<User, Error>> {
|
|
97
|
+
return pipe(
|
|
98
|
+
formData,
|
|
99
|
+
validateFormData,
|
|
100
|
+
sanitizeInput,
|
|
101
|
+
checkForDuplicates,
|
|
102
|
+
hashPassword,
|
|
103
|
+
createUserRecord,
|
|
104
|
+
sendVerificationEmail,
|
|
105
|
+
createSession
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Command Pattern
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// Encapsulate each step as a command
|
|
114
|
+
class CheckoutProcessor {
|
|
115
|
+
private steps: CheckoutStep[] = [
|
|
116
|
+
new ValidateCartStep(),
|
|
117
|
+
new CalculatePricingStep(),
|
|
118
|
+
new ReserveInventoryStep(),
|
|
119
|
+
new ProcessPaymentStep(),
|
|
120
|
+
new SendNotificationsStep(),
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
async process(cart: Cart, user: User): Promise<CheckoutResult> {
|
|
124
|
+
let context = { cart, user };
|
|
125
|
+
for (const step of this.steps) {
|
|
126
|
+
const result = await step.execute(context);
|
|
127
|
+
if (!result.ok) return result;
|
|
128
|
+
context = result.value;
|
|
129
|
+
}
|
|
130
|
+
return Ok(context);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## High Cyclomatic Complexity Solutions
|
|
138
|
+
|
|
139
|
+
### Data-Driven Approach
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Replace decision tree with lookup
|
|
143
|
+
const categoryRules: Record<string, (item: Item) => string> = {
|
|
144
|
+
'A': categorizeTypeA,
|
|
145
|
+
'B': categorizeTypeB,
|
|
146
|
+
'C': categorizeTypeC,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
function categorize(item: Item): string {
|
|
150
|
+
const handler = categoryRules[item.type];
|
|
151
|
+
return handler ? handler(item) : 'unknown';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function categorizeTypeA(item: Item): string {
|
|
155
|
+
const size = item.size > 10 ? 'large' : 'small';
|
|
156
|
+
const color = item.color || 'other';
|
|
157
|
+
return `A-${size}-${color}`;
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Strategy Pattern
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// Encapsulate variants in classes
|
|
165
|
+
interface EventHandler {
|
|
166
|
+
canHandle(event: Event): boolean;
|
|
167
|
+
handle(event: Event): Promise<void>;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
class UserCreatedHandler implements EventHandler {
|
|
171
|
+
canHandle(event: Event) { return event.type === 'USER_CREATED'; }
|
|
172
|
+
async handle(event: Event) { /* focused logic */ }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
class EventProcessor {
|
|
176
|
+
constructor(private handlers: EventHandler[]) {}
|
|
177
|
+
|
|
178
|
+
async process(event: Event) {
|
|
179
|
+
const handler = this.handlers.find(h => h.canHandle(event));
|
|
180
|
+
if (handler) await handler.handle(event);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Polymorphism
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// Use type system to eliminate conditionals
|
|
189
|
+
abstract class User {
|
|
190
|
+
abstract getPermissions(): Permission[];
|
|
191
|
+
abstract canAccessResource(resource: Resource): boolean;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
class AdminUser extends User {
|
|
195
|
+
getPermissions() { return ALL_PERMISSIONS; }
|
|
196
|
+
canAccessResource() { return true; }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
class RegularUser extends User {
|
|
200
|
+
getPermissions() { return BASIC_PERMISSIONS; }
|
|
201
|
+
canAccessResource(resource: Resource) {
|
|
202
|
+
return resource.isPublic || this.owns(resource);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Magic Value Solutions
|
|
210
|
+
|
|
211
|
+
### Named Constants
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// Extract literals to named constants
|
|
215
|
+
const OrderStatus = {
|
|
216
|
+
PENDING: 1,
|
|
217
|
+
PROCESSING: 2,
|
|
218
|
+
COMPLETED: 3,
|
|
219
|
+
} as const;
|
|
220
|
+
|
|
221
|
+
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
222
|
+
const MAX_RETRIES = 5;
|
|
223
|
+
|
|
224
|
+
if (status === OrderStatus.COMPLETED) {
|
|
225
|
+
setTimeout(callback, ONE_DAY_MS);
|
|
226
|
+
retry(MAX_RETRIES);
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Configuration Objects
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// Centralize business rules
|
|
234
|
+
const ShippingRates = {
|
|
235
|
+
HEAVY_ITEM_THRESHOLD: 50, // kg
|
|
236
|
+
LONG_DISTANCE_THRESHOLD: 500, // km
|
|
237
|
+
rates: {
|
|
238
|
+
heavy: 29.99,
|
|
239
|
+
longDistance: 19.99,
|
|
240
|
+
bulky: 24.99,
|
|
241
|
+
standard: 9.99,
|
|
242
|
+
}
|
|
243
|
+
} as const;
|
|
244
|
+
|
|
245
|
+
function calculateShipping(weight: number, distance: number): number {
|
|
246
|
+
if (weight > ShippingRates.HEAVY_ITEM_THRESHOLD) return ShippingRates.rates.heavy;
|
|
247
|
+
if (distance > ShippingRates.LONG_DISTANCE_THRESHOLD) return ShippingRates.rates.longDistance;
|
|
248
|
+
return ShippingRates.rates.standard;
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Complex Expression Solutions
|
|
255
|
+
|
|
256
|
+
### Break Into Named Steps
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
// Replace chained operations with named steps
|
|
260
|
+
const activePremiumUsers = data.filter(isActivePremium);
|
|
261
|
+
const withScores = activePremiumUsers.map(calculateScore);
|
|
262
|
+
const topScore = findHighestScore(withScores);
|
|
263
|
+
|
|
264
|
+
function isActivePremium(user: User) {
|
|
265
|
+
return user.active && user.type === 'premium';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function calculateScore(user: User) {
|
|
269
|
+
const multiplier = user.bonus ? 1.5 : 1;
|
|
270
|
+
return { ...user, score: (user.points * multiplier) / user.level };
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function findHighestScore(users: ScoredUser[]) {
|
|
274
|
+
return users.sort((a, b) => b.score - a.score)[0]?.score ?? 0;
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Replace Ternary Chains
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// Use mapping or switch for multiple conditions
|
|
282
|
+
function getUserStatus(user: User): string {
|
|
283
|
+
if (user.isAdmin) return 'admin';
|
|
284
|
+
if (user.isModerator) return 'moderator';
|
|
285
|
+
if (user.isVerified) return 'verified';
|
|
286
|
+
if (user.isPending) return 'pending';
|
|
287
|
+
return 'guest';
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Or use a lookup
|
|
291
|
+
const statusPriority = [
|
|
292
|
+
{ check: (u: User) => u.isAdmin, status: 'admin' },
|
|
293
|
+
{ check: (u: User) => u.isModerator, status: 'moderator' },
|
|
294
|
+
{ check: (u: User) => u.isVerified, status: 'verified' },
|
|
295
|
+
{ check: (u: User) => u.isPending, status: 'pending' },
|
|
296
|
+
];
|
|
297
|
+
|
|
298
|
+
function getUserStatus(user: User): string {
|
|
299
|
+
return statusPriority.find(p => p.check(user))?.status ?? 'guest';
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Naming Solutions
|
|
306
|
+
|
|
307
|
+
### Descriptive Names
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
// Replace cryptic with descriptive
|
|
311
|
+
const now = new Date();
|
|
312
|
+
const oneDayAgo = now.getTime() - ONE_DAY_MS;
|
|
313
|
+
const recentItems = items.filter(item => item.timestamp > oneDayAgo);
|
|
314
|
+
const totalPrice = recentItems.reduce((sum, item) => sum + item.price, 0);
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Intent-Revealing Names
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
// Name functions by what they do
|
|
321
|
+
function findOverdueInvoices(invoices: Invoice[]): Invoice[] {
|
|
322
|
+
const thirtyDaysAgo = subDays(new Date(), 30);
|
|
323
|
+
return invoices.filter(inv => inv.dueDate < thirtyDaysAgo && !inv.paid);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Not: function process(data) or function filter(items)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Code Duplication Solutions
|
|
332
|
+
|
|
333
|
+
### Generic Validation Framework
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
// Extract common pattern
|
|
337
|
+
type ValidationRule<T> = (value: T) => string | null;
|
|
338
|
+
|
|
339
|
+
function validate<T>(value: T, rules: ValidationRule<T>[]): ValidationResult {
|
|
340
|
+
for (const rule of rules) {
|
|
341
|
+
const error = rule(value);
|
|
342
|
+
if (error) return { valid: false, error };
|
|
343
|
+
}
|
|
344
|
+
return { valid: true, error: null };
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const required = (v: string) => v ? null : 'Required';
|
|
348
|
+
const minLength = (n: number) => (v: string) => v.length >= n ? null : 'Too short';
|
|
349
|
+
const isEmail = (v: string) => v.includes('@') ? null : 'Invalid format';
|
|
350
|
+
|
|
351
|
+
const validateEmail = (email: string) => validate(email, [required, isEmail]);
|
|
352
|
+
const validateUsername = (name: string) => validate(name, [required, minLength(3)]);
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Generic Resource Handler
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// Abstract the common pattern
|
|
359
|
+
function createResourceHandler<T>(
|
|
360
|
+
tableName: string,
|
|
361
|
+
findById: (id: string) => Promise<T | null>
|
|
362
|
+
) {
|
|
363
|
+
return async (req: Request, res: Response) => {
|
|
364
|
+
try {
|
|
365
|
+
const entity = await findById(req.params.id);
|
|
366
|
+
if (!entity) return res.status(404).json({ error: 'Not found' });
|
|
367
|
+
res.json(entity);
|
|
368
|
+
} catch (error) {
|
|
369
|
+
res.status(500).json({ error: 'Internal error' });
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
app.get('/users/:id', createResourceHandler('users', db.users.findById));
|
|
375
|
+
app.get('/orders/:id', createResourceHandler('orders', db.orders.findById));
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Parameter List Solutions
|
|
381
|
+
|
|
382
|
+
### Object Parameter
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// Group related parameters
|
|
386
|
+
interface CreateUserParams {
|
|
387
|
+
name: string;
|
|
388
|
+
email: string;
|
|
389
|
+
password: string;
|
|
390
|
+
role: string;
|
|
391
|
+
department: string;
|
|
392
|
+
manager?: string;
|
|
393
|
+
startDate: Date;
|
|
394
|
+
salary: number;
|
|
395
|
+
benefits?: string[];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function createUser(params: CreateUserParams) {
|
|
399
|
+
// ...
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Options Object for Booleans
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
// Replace boolean flags with named options
|
|
407
|
+
interface FormatOptions {
|
|
408
|
+
includeHeader?: boolean;
|
|
409
|
+
includeFooter?: boolean;
|
|
410
|
+
useColor?: boolean;
|
|
411
|
+
landscape?: boolean;
|
|
412
|
+
doubleSided?: boolean;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function formatDocument(doc: Document, options: FormatOptions = {}) {
|
|
416
|
+
// ...
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Call site is clear:
|
|
420
|
+
formatDocument(doc, { useColor: true, doubleSided: true });
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## Boolean Complexity Solutions
|
|
426
|
+
|
|
427
|
+
### Extract Named Predicates
|
|
428
|
+
|
|
429
|
+
```typescript
|
|
430
|
+
// Replace complex boolean with readable function
|
|
431
|
+
const canModerate = (user: User): boolean => {
|
|
432
|
+
if (!user.active || user.deleted) return false;
|
|
433
|
+
if (!['admin', 'moderator'].includes(user.role)) return false;
|
|
434
|
+
if (!user.verified) return false;
|
|
435
|
+
if (user.suspended && user.suspendedUntil >= Date.now()) return false;
|
|
436
|
+
return true;
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
if (canModerate(user)) {
|
|
440
|
+
// ...
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Positive Conditions
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
// Eliminate double negatives
|
|
448
|
+
// Before: if (!user.isNotActive && !items.isEmpty())
|
|
449
|
+
// After:
|
|
450
|
+
if (user.isActive && items.length > 0) {
|
|
451
|
+
// ...
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Apply De Morgan's law and simplify
|
|
455
|
+
// Before: if (!(a && !b) || !(!c || d))
|
|
456
|
+
// After:
|
|
457
|
+
if (!a || b || (c && !d)) {
|
|
458
|
+
// ...
|
|
459
|
+
}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## Shotgun Surgery Solutions
|
|
465
|
+
|
|
466
|
+
### Encapsulate Variation
|
|
467
|
+
|
|
468
|
+
```typescript
|
|
469
|
+
// Adding new type = one new class
|
|
470
|
+
interface UserTypeHandler {
|
|
471
|
+
validate(data: UserData): ValidationResult;
|
|
472
|
+
serialize(user: User): SerializedUser;
|
|
473
|
+
getPermissions(): Permission[];
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
class AdminUserHandler implements UserTypeHandler { /* ... */ }
|
|
477
|
+
class RegularUserHandler implements UserTypeHandler { /* ... */ }
|
|
478
|
+
class GuestUserHandler implements UserTypeHandler { /* ... */ }
|
|
479
|
+
|
|
480
|
+
// Registry for handlers
|
|
481
|
+
const handlers = new Map<UserType, UserTypeHandler>();
|
|
482
|
+
handlers.set('admin', new AdminUserHandler());
|
|
483
|
+
handlers.set('regular', new RegularUserHandler());
|
|
484
|
+
handlers.set('guest', new GuestUserHandler());
|
|
485
|
+
|
|
486
|
+
// Adding new type: just add one new class and register it
|
|
487
|
+
```
|