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,108 @@
|
|
|
1
|
+
# Test Quality Report Template
|
|
2
|
+
|
|
3
|
+
Use this template when reporting test design issues.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Report Format
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
## Test Design Issues Detected
|
|
11
|
+
|
|
12
|
+
## [SEVERITY] - [Category] ([Root Cause Type])
|
|
13
|
+
**File**: path/to/file.test.ts:line-range
|
|
14
|
+
**Issue**: Brief description of the problem
|
|
15
|
+
**Root Cause**: What architectural issue causes this
|
|
16
|
+
**Symptom**:
|
|
17
|
+
```code
|
|
18
|
+
// The problematic code snippet
|
|
19
|
+
```
|
|
20
|
+
**Correct Design**:
|
|
21
|
+
```code
|
|
22
|
+
// What good design looks like
|
|
23
|
+
```
|
|
24
|
+
**Action Required**: Specific action to fix
|
|
25
|
+
|
|
26
|
+
## Summary
|
|
27
|
+
- **Critical**: N issues (block implementation)
|
|
28
|
+
- **High**: N issues (refactor needed)
|
|
29
|
+
- **Files affected**: N test files
|
|
30
|
+
- **Root cause**: Brief architectural diagnosis
|
|
31
|
+
|
|
32
|
+
## STOP - Design Issues Detected
|
|
33
|
+
|
|
34
|
+
[List fundamental design flaws discovered]
|
|
35
|
+
|
|
36
|
+
**DO NOT work around these issues in tests.**
|
|
37
|
+
**DO NOT add more complex test helpers.**
|
|
38
|
+
**DO NOT mock more things to make tests pass.**
|
|
39
|
+
|
|
40
|
+
## Next Steps
|
|
41
|
+
|
|
42
|
+
1. **STOP writing tests** - Current design cannot be tested simply
|
|
43
|
+
2. **ANALYZE root cause** - Identify architectural issue
|
|
44
|
+
3. **PROPOSE redesign** - Show correct pattern
|
|
45
|
+
4. **GET APPROVAL** - User confirms design changes
|
|
46
|
+
5. **IMPLEMENT redesign** - Fix architecture first
|
|
47
|
+
6. **WRITE SIMPLE TESTS** - Tests should be trivial after redesign
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Severity Levels
|
|
53
|
+
|
|
54
|
+
| Severity | Use For | Examples |
|
|
55
|
+
|----------|---------|---------|
|
|
56
|
+
| **CRITICAL** | Fundamental design flaws | Complex setup >10 lines, repetitive boilerplate >3 times, mock objects >5 methods, testing private methods |
|
|
57
|
+
| **HIGH** | Maintenance complications | Difficult mocking >20 lines, implementation testing, environment manipulation, database seeding |
|
|
58
|
+
| **MEDIUM** | Reduced clarity | Test helper abuse, inconsistent assertion patterns, missing edge case coverage |
|
|
59
|
+
| **LOW** | Minor improvements | Organization, naming clarity |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Category Labels
|
|
64
|
+
|
|
65
|
+
| Category | Root Cause Type | Indicates |
|
|
66
|
+
|----------|-----------------|-----------|
|
|
67
|
+
| Complex Setup | Design Problem | Too many dependencies |
|
|
68
|
+
| Repetitive Boilerplate | API Problem | Inconsistent error handling |
|
|
69
|
+
| Difficult Mocking | Coupling Problem | Tight coupling to externals |
|
|
70
|
+
| Implementation Testing | Fragile Tests | Tests coupled to internals |
|
|
71
|
+
| Environment Manipulation | DI Problem | Direct environment access |
|
|
72
|
+
| Database Seeding | Separation Problem | Logic mixed with data access |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Test Suite Safety Configuration
|
|
77
|
+
|
|
78
|
+
### Full Configuration Examples
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// vitest.config.ts
|
|
82
|
+
export default defineConfig({
|
|
83
|
+
test: {
|
|
84
|
+
fileParallelism: false,
|
|
85
|
+
maxWorkers: 1,
|
|
86
|
+
pool: 'forks',
|
|
87
|
+
testTimeout: 10000,
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// jest.config.js
|
|
92
|
+
module.exports = {
|
|
93
|
+
maxWorkers: 1,
|
|
94
|
+
runInBand: true,
|
|
95
|
+
testTimeout: 10000,
|
|
96
|
+
};
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Memory limits
|
|
101
|
+
NODE_OPTIONS="--max-old-space-size=512" npm test
|
|
102
|
+
|
|
103
|
+
# Go
|
|
104
|
+
go test -p 1 ./...
|
|
105
|
+
|
|
106
|
+
# Rust
|
|
107
|
+
cargo test -- --test-threads=1
|
|
108
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Test Pattern Violations - Extended Examples
|
|
2
|
+
|
|
3
|
+
Reference examples for common test quality violations across both design and review contexts.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Complex Setup Violations
|
|
8
|
+
|
|
9
|
+
### Multi-Dependency Service Setup
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// VIOLATION: Complex setup indicates design problem
|
|
13
|
+
describe('UserService', () => {
|
|
14
|
+
let service: UserService;
|
|
15
|
+
let mockDb: MockDatabase;
|
|
16
|
+
let mockCache: MockCache;
|
|
17
|
+
let mockLogger: MockLogger;
|
|
18
|
+
let mockConfig: MockConfig;
|
|
19
|
+
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
mockDb = new MockDatabase();
|
|
22
|
+
await mockDb.connect();
|
|
23
|
+
await mockDb.seed();
|
|
24
|
+
mockCache = new MockCache();
|
|
25
|
+
mockCache.clear();
|
|
26
|
+
mockLogger = new MockLogger();
|
|
27
|
+
mockConfig = new MockConfig();
|
|
28
|
+
mockConfig.set('env', 'test');
|
|
29
|
+
// ... 10+ more lines
|
|
30
|
+
service = new UserService(mockDb, mockCache, mockLogger, mockConfig);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should create user', async () => {
|
|
34
|
+
const result = await service.createUser({ name: 'test' });
|
|
35
|
+
expect(result.ok).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Root Cause**: UserService has too many dependencies (6+ injected services)
|
|
41
|
+
|
|
42
|
+
**Solution**: Split into focused services with single responsibility
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Repetitive Boilerplate Violations
|
|
47
|
+
|
|
48
|
+
### Try/Catch Pattern Repetition
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// VIOLATION: Repetitive error handling indicates API problem
|
|
52
|
+
describe('API endpoints', () => {
|
|
53
|
+
it('should handle user creation error', async () => {
|
|
54
|
+
try {
|
|
55
|
+
await api.createUser(invalidData);
|
|
56
|
+
fail('Should have thrown');
|
|
57
|
+
} catch (error) {
|
|
58
|
+
expect(error.status).toBe(400);
|
|
59
|
+
expect(error.message).toContain('validation');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// ... repeated pattern 10+ times
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Root Cause**: API throws exceptions instead of returning Results
|
|
68
|
+
|
|
69
|
+
**Solution**: Migrate API to Result pattern
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Difficult Mocking Violations
|
|
74
|
+
|
|
75
|
+
### Nested Mock Object Structures
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// VIOLATION: Complex mocking indicates tight coupling
|
|
79
|
+
beforeEach(() => {
|
|
80
|
+
mockDb = {
|
|
81
|
+
transaction: jest.fn((callback) => callback(mockDb)),
|
|
82
|
+
orders: { create: jest.fn(), update: jest.fn(), findById: jest.fn() },
|
|
83
|
+
users: { findById: jest.fn(), update: jest.fn() },
|
|
84
|
+
inventory: { decrement: jest.fn(), check: jest.fn(), reserve: jest.fn() }
|
|
85
|
+
};
|
|
86
|
+
// 5+ more mock objects...
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Root Cause**: OrderProcessor directly depends on too many external systems
|
|
91
|
+
|
|
92
|
+
**Solution**: Separate pure business logic from I/O; use composition
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Implementation Testing Violations
|
|
97
|
+
|
|
98
|
+
### Spying on Private Methods
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// VIOLATION: Testing implementation details
|
|
102
|
+
it('should call updateTotal after addItem', () => {
|
|
103
|
+
const cart = new ShoppingCart();
|
|
104
|
+
const spy = jest.spyOn(cart as any, 'updateTotal');
|
|
105
|
+
cart.addItem({ id: '1', price: 10 });
|
|
106
|
+
expect(spy).toHaveBeenCalled(); // Testing implementation!
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Root Cause**: Tests coupled to implementation details
|
|
111
|
+
|
|
112
|
+
**Solution**: Test observable behavior only
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Coverage Violations
|
|
117
|
+
|
|
118
|
+
### Missing Edge Cases
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// INCOMPLETE TESTS
|
|
122
|
+
describe('divide', () => {
|
|
123
|
+
it('divides two numbers', () => {
|
|
124
|
+
expect(divide(10, 2)).toBe(5); // Happy path only
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// COMPLETE TESTS
|
|
129
|
+
describe('divide', () => {
|
|
130
|
+
it('divides two positive numbers', () => { expect(divide(10, 2)).toBe(5); });
|
|
131
|
+
it('handles division by zero', () => { expect(divide(10, 0)).toBe(Infinity); });
|
|
132
|
+
it('handles negative numbers', () => { expect(divide(-10, 2)).toBe(-5); });
|
|
133
|
+
it('handles decimal results', () => { expect(divide(10, 3)).toBeCloseTo(3.333, 2); });
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Unclear Test Names
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// UNCLEAR: What does this test?
|
|
141
|
+
it('test1', () => { /* ... */ });
|
|
142
|
+
it('should work', () => { /* ... */ });
|
|
143
|
+
|
|
144
|
+
// CLEAR: Describes behavior
|
|
145
|
+
it('validates email format on creation', () => { /* ... */ });
|
|
146
|
+
it('rejects passwords shorter than 8 characters', () => { /* ... */ });
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Test Design Violations
|
|
152
|
+
|
|
153
|
+
### Slow Tests (Real Delays)
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// SLOW: Real delays
|
|
157
|
+
const result = await fetchWithRetry(); // Waits real 1000ms
|
|
158
|
+
|
|
159
|
+
// FAST: Mock timers
|
|
160
|
+
jest.useFakeTimers();
|
|
161
|
+
const promise = fetchWithRetry();
|
|
162
|
+
jest.advanceTimersByTime(1000);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Flaky Tests (Timing Dependencies)
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
// FLAKY: Race condition
|
|
169
|
+
subscribe(callback);
|
|
170
|
+
emit('update', { value: 1 });
|
|
171
|
+
expect(callback).toHaveBeenCalled(); // Might not have fired yet
|
|
172
|
+
|
|
173
|
+
// STABLE: Explicit waiting
|
|
174
|
+
const received = new Promise(resolve => { subscribe(data => resolve(data)); });
|
|
175
|
+
emit('update', { value: 1 });
|
|
176
|
+
const data = await received;
|
|
177
|
+
expect(data.value).toBe(1);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Over-Mocking
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// OVER-MOCKED: Tests nothing real
|
|
184
|
+
const mockValidator = { validate: jest.fn().mockReturnValue(true) };
|
|
185
|
+
const mockHasher = { hash: jest.fn().mockReturnValue('hashed') };
|
|
186
|
+
const mockRepo = { create: jest.fn().mockResolvedValue({ id: '1' }) };
|
|
187
|
+
// What did we actually test? Just that mocks were called.
|
|
188
|
+
|
|
189
|
+
// BETTER: Use real implementations where possible
|
|
190
|
+
const repo = new InMemoryUserRepo();
|
|
191
|
+
const service = new UserService(new RealValidator(), new RealHasher(), repo);
|
|
192
|
+
const saved = await repo.findByEmail('test@test.com');
|
|
193
|
+
expect(await bcrypt.compare('password', saved.password)).toBe(true);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Environment & Database Violations
|
|
199
|
+
|
|
200
|
+
### Environment Manipulation
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// VIOLATION: Tests modifying environment
|
|
204
|
+
beforeEach(() => {
|
|
205
|
+
process.env = { ...process.env, DATABASE_URL: 'postgres://test', API_KEY: 'test-key' };
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Solution**: Inject configuration as a dependency
|
|
210
|
+
|
|
211
|
+
### Database State Dependencies
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// VIOLATION: Tests depend on specific seeded data
|
|
215
|
+
beforeAll(async () => {
|
|
216
|
+
await db.users.insert([/* ... */]);
|
|
217
|
+
await db.orders.insert([/* ... */]);
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Solution**: Separate data access from business logic; test calculation separately
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript
|
|
3
|
+
description: This skill should be used when the user works with TypeScript files (.ts/.tsx), asks about "generics", "type guards", "utility types", "strict typing", "discriminated unions", or discusses type safety and inference. Provides patterns for Result types, exhaustive checks, branded types, and type-safe API contracts.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: Read, Grep, Glob
|
|
6
|
+
activation:
|
|
7
|
+
file-patterns:
|
|
8
|
+
- "**/*.ts"
|
|
9
|
+
- "**/*.tsx"
|
|
10
|
+
exclude:
|
|
11
|
+
- "node_modules/**"
|
|
12
|
+
- "**/*.d.ts"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# TypeScript Patterns
|
|
16
|
+
|
|
17
|
+
Reference for TypeScript-specific patterns, type safety, and idioms.
|
|
18
|
+
|
|
19
|
+
## Iron Law
|
|
20
|
+
|
|
21
|
+
> **UNKNOWN OVER ANY**
|
|
22
|
+
>
|
|
23
|
+
> Never use `any`. Use `unknown` with type guards instead. `any` disables TypeScript's
|
|
24
|
+
> entire value proposition. If you need flexibility, use generics. If you need to handle
|
|
25
|
+
> arbitrary data, use `unknown` and validate. `any` is giving up.
|
|
26
|
+
|
|
27
|
+
## When This Skill Activates
|
|
28
|
+
|
|
29
|
+
- Working with TypeScript codebases
|
|
30
|
+
- Designing type-safe APIs
|
|
31
|
+
- Using generics and utility types
|
|
32
|
+
- Creating type guards
|
|
33
|
+
- Handling strict mode requirements
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Type Safety Fundamentals
|
|
38
|
+
|
|
39
|
+
### Prefer Unknown Over Any
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// BAD: function parse(json: string): any { return JSON.parse(json); }
|
|
43
|
+
|
|
44
|
+
// GOOD: unknown requires type checking
|
|
45
|
+
function parse(json: string): unknown { return JSON.parse(json); }
|
|
46
|
+
if (isUser(data)) console.log(data.name); // Type-safe after guard
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Strict Null Checks
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// BAD: function getName(user: User | null): string { return user.name; }
|
|
53
|
+
// GOOD: function getName(user: User | null): string { return user?.name ?? 'Anonymous'; }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Exhaustive Checks
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
type Status = 'pending' | 'running' | 'completed' | 'failed';
|
|
60
|
+
function handleStatus(status: Status): string {
|
|
61
|
+
switch (status) {
|
|
62
|
+
case 'pending': return 'Waiting...';
|
|
63
|
+
case 'running': return 'In progress...';
|
|
64
|
+
case 'completed': return 'Done!';
|
|
65
|
+
case 'failed': return 'Error occurred';
|
|
66
|
+
default:
|
|
67
|
+
const _exhaustive: never = status;
|
|
68
|
+
throw new Error(`Unhandled: ${_exhaustive}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Generic Patterns
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Basic generic function
|
|
79
|
+
function first<T>(items: T[]): T | undefined { return items[0]; }
|
|
80
|
+
|
|
81
|
+
// With constraints
|
|
82
|
+
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }
|
|
83
|
+
|
|
84
|
+
// Generic interface
|
|
85
|
+
interface Repository<T, ID = string> {
|
|
86
|
+
findById(id: ID): Promise<T | null>;
|
|
87
|
+
save(entity: T): Promise<T>;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Utility Types
|
|
94
|
+
|
|
95
|
+
| Type | Usage |
|
|
96
|
+
|------|-------|
|
|
97
|
+
| `Partial<T>` | All properties optional |
|
|
98
|
+
| `Required<T>` | All properties required |
|
|
99
|
+
| `Pick<T, K>` | Select specific properties |
|
|
100
|
+
| `Omit<T, K>` | Exclude properties |
|
|
101
|
+
| `Record<K, V>` | Object with key/value types |
|
|
102
|
+
| `Readonly<T>` | Immutable properties |
|
|
103
|
+
| `NonNullable<T>` | Remove null/undefined |
|
|
104
|
+
| `ReturnType<F>` | Function return type |
|
|
105
|
+
| `Parameters<F>` | Function parameter types |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Type Guards
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// typeof guard
|
|
113
|
+
function process(value: string | number): string {
|
|
114
|
+
if (typeof value === 'string') return value.toUpperCase();
|
|
115
|
+
return value.toFixed(2);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Custom type guard
|
|
119
|
+
interface Admin { type: 'admin'; permissions: string[]; }
|
|
120
|
+
interface User { type: 'user'; }
|
|
121
|
+
type Person = User | Admin;
|
|
122
|
+
|
|
123
|
+
function isAdmin(person: Person): person is Admin {
|
|
124
|
+
return person.type === 'admin';
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Discriminated Unions
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
type Result<T, E> =
|
|
134
|
+
| { ok: true; value: T }
|
|
135
|
+
| { ok: false; error: E };
|
|
136
|
+
|
|
137
|
+
function handleResult<T>(result: Result<T, Error>): T {
|
|
138
|
+
if (result.ok) return result.value;
|
|
139
|
+
throw result.error;
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Anti-Patterns
|
|
146
|
+
|
|
147
|
+
| Pattern | Bad | Good |
|
|
148
|
+
|---------|-----|------|
|
|
149
|
+
| Using `any` | `data: any` | `data: unknown` or generics |
|
|
150
|
+
| Unsafe assertion | `data as User` | Type guard: `if (isUser(data))` |
|
|
151
|
+
| Non-null abuse | `user!.name!` | `user?.name` with check |
|
|
152
|
+
| Unsafe index | `obj[key]` | `obj[key as keyof typeof obj]` |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Extended References
|
|
157
|
+
|
|
158
|
+
For additional patterns and examples:
|
|
159
|
+
- `references/patterns.md` - Extended TypeScript patterns
|
|
160
|
+
- `references/utility-types.md` - Custom utility type examples
|
|
161
|
+
- `references/type-guards.md` - Advanced type guard patterns
|
|
162
|
+
- `references/async.md` - Async TypeScript patterns
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Checklist
|
|
167
|
+
|
|
168
|
+
- [ ] No `any` types (use `unknown` or generics)
|
|
169
|
+
- [ ] All null/undefined handled explicitly
|
|
170
|
+
- [ ] Discriminated unions for state/variants
|
|
171
|
+
- [ ] Type guards for runtime type checking
|
|
172
|
+
- [ ] Exhaustive switch statements
|
|
173
|
+
- [ ] Proper generic constraints
|
|
174
|
+
- [ ] Type-only imports for types
|
|
175
|
+
- [ ] Readonly for immutable data
|
|
176
|
+
- [ ] Strict tsconfig options enabled
|