devflow-kit 0.9.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +167 -29
- package/LICENSE +1 -1
- package/README.md +179 -310
- package/dist/cli.js +3 -1
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.js +311 -576
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/uninstall.d.ts +10 -0
- package/dist/commands/uninstall.js +351 -78
- package/dist/plugins.d.ts +46 -0
- package/dist/plugins.js +162 -0
- package/dist/utils/cli.d.ts +5 -0
- package/dist/utils/cli.js +14 -0
- package/dist/utils/installer.d.ts +41 -0
- package/dist/utils/installer.js +177 -0
- package/dist/utils/paths.d.ts +10 -0
- package/dist/utils/paths.js +23 -3
- package/dist/utils/post-install.d.ts +68 -0
- package/dist/utils/post-install.js +427 -0
- package/dist/utils/safe-delete-install.d.ts +22 -0
- package/dist/utils/safe-delete-install.js +156 -0
- package/dist/utils/safe-delete.d.ts +12 -0
- package/dist/utils/safe-delete.js +83 -0
- package/package.json +18 -8
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-audit-claude/README.md +46 -0
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
- package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
- package/plugins/devflow-code-review/README.md +73 -0
- package/plugins/devflow-code-review/agents/git.md +272 -0
- package/plugins/devflow-code-review/agents/reviewer.md +119 -0
- package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
- package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
- package/plugins/devflow-code-review/commands/code-review.md +141 -0
- package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
- package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
- package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
- package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
- package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
- package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
- package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
- package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
- package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
- package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +27 -0
- package/plugins/devflow-core-skills/README.md +50 -0
- package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +134 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
- package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
- package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
- package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
- package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
- package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
- package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
- package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
- package/plugins/devflow-debug/README.md +65 -0
- package/plugins/devflow-debug/agents/git.md +272 -0
- package/plugins/devflow-debug/commands/debug-teams.md +231 -0
- package/plugins/devflow-debug/commands/debug.md +160 -0
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
- package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
- package/plugins/devflow-implement/README.md +71 -0
- package/plugins/devflow-implement/agents/coder.md +122 -0
- package/plugins/devflow-implement/agents/git.md +272 -0
- package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
- package/plugins/devflow-implement/agents/shepherd.md +94 -0
- package/plugins/devflow-implement/agents/simplifier.md +62 -0
- package/plugins/devflow-implement/agents/skimmer.md +88 -0
- package/plugins/devflow-implement/agents/synthesizer.md +204 -0
- package/plugins/devflow-implement/agents/validator.md +86 -0
- package/plugins/devflow-implement/commands/implement-teams.md +608 -0
- package/plugins/devflow-implement/commands/implement.md +426 -0
- package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
- package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
- package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
- package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
- package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
- package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
- package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
- package/plugins/devflow-resolve/README.md +65 -0
- package/plugins/devflow-resolve/agents/git.md +272 -0
- package/plugins/devflow-resolve/agents/resolver.md +131 -0
- package/plugins/devflow-resolve/agents/simplifier.md +62 -0
- package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
- package/plugins/devflow-resolve/commands/resolve.md +237 -0
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
- package/plugins/devflow-self-review/README.md +38 -0
- package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
- package/plugins/devflow-self-review/agents/simplifier.md +62 -0
- package/plugins/devflow-self-review/agents/validator.md +86 -0
- package/plugins/devflow-self-review/commands/self-review.md +126 -0
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
- package/plugins/devflow-specify/README.md +46 -0
- package/plugins/devflow-specify/agents/skimmer.md +88 -0
- package/plugins/devflow-specify/agents/synthesizer.md +204 -0
- package/plugins/devflow-specify/commands/specify-teams.md +314 -0
- package/plugins/devflow-specify/commands/specify.md +179 -0
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
- package/scripts/hooks/background-memory-update.sh +167 -0
- package/scripts/hooks/pre-compact-memory.sh +81 -0
- package/scripts/hooks/session-start-memory.sh +84 -0
- package/scripts/hooks/stop-update-memory.sh +81 -0
- package/shared/agents/coder.md +122 -0
- package/shared/agents/git.md +272 -0
- package/shared/agents/resolver.md +131 -0
- package/shared/agents/reviewer.md +119 -0
- package/shared/agents/scrutinizer.md +80 -0
- package/shared/agents/shepherd.md +94 -0
- package/shared/agents/simplifier.md +62 -0
- package/shared/agents/skimmer.md +88 -0
- package/shared/agents/synthesizer.md +204 -0
- package/shared/agents/validator.md +86 -0
- package/shared/skills/accessibility/SKILL.md +229 -0
- package/shared/skills/accessibility/references/detection.md +171 -0
- package/shared/skills/accessibility/references/patterns.md +670 -0
- package/shared/skills/accessibility/references/violations.md +419 -0
- package/shared/skills/agent-teams/SKILL.md +124 -0
- package/shared/skills/agent-teams/references/cleanup.md +104 -0
- package/shared/skills/agent-teams/references/communication.md +122 -0
- package/shared/skills/agent-teams/references/team-patterns.md +217 -0
- package/shared/skills/architecture-patterns/SKILL.md +153 -0
- package/shared/skills/architecture-patterns/references/detection.md +337 -0
- package/shared/skills/architecture-patterns/references/patterns.md +873 -0
- package/shared/skills/architecture-patterns/references/violations.md +575 -0
- package/shared/skills/complexity-patterns/SKILL.md +143 -0
- package/shared/skills/complexity-patterns/references/detection.md +264 -0
- package/shared/skills/complexity-patterns/references/patterns.md +487 -0
- package/shared/skills/complexity-patterns/references/violations.md +361 -0
- package/shared/skills/consistency-patterns/SKILL.md +140 -0
- package/shared/skills/consistency-patterns/references/detection.md +207 -0
- package/shared/skills/consistency-patterns/references/patterns.md +202 -0
- package/shared/skills/consistency-patterns/references/violations.md +213 -0
- package/shared/skills/core-patterns/SKILL.md +162 -0
- package/shared/skills/core-patterns/references/checklist.md +276 -0
- package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
- package/shared/skills/core-patterns/references/detection.md +303 -0
- package/shared/skills/core-patterns/references/patterns.md +576 -0
- package/shared/skills/core-patterns/references/violations.md +369 -0
- package/shared/skills/database-patterns/SKILL.md +134 -0
- package/shared/skills/database-patterns/references/detection.md +208 -0
- package/shared/skills/database-patterns/references/patterns.md +394 -0
- package/shared/skills/database-patterns/references/violations.md +332 -0
- package/shared/skills/dependencies-patterns/SKILL.md +141 -0
- package/shared/skills/dependencies-patterns/references/detection.md +181 -0
- package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
- package/shared/skills/dependencies-patterns/references/violations.md +247 -0
- package/shared/skills/docs-framework/SKILL.md +134 -0
- package/shared/skills/docs-framework/references/patterns.md +346 -0
- package/shared/skills/docs-framework/references/violations.md +221 -0
- package/shared/skills/documentation-patterns/SKILL.md +125 -0
- package/shared/skills/documentation-patterns/references/detection.md +190 -0
- package/shared/skills/documentation-patterns/references/patterns.md +189 -0
- package/shared/skills/documentation-patterns/references/violations.md +163 -0
- package/shared/skills/frontend-design/SKILL.md +254 -0
- package/shared/skills/frontend-design/references/detection.md +184 -0
- package/shared/skills/frontend-design/references/patterns.md +511 -0
- package/shared/skills/frontend-design/references/violations.md +453 -0
- package/shared/skills/git-safety/SKILL.md +122 -0
- package/shared/skills/git-safety/references/detection.md +290 -0
- package/shared/skills/git-safety/references/patterns.md +289 -0
- package/shared/skills/git-safety/references/violations.md +18 -0
- package/shared/skills/git-workflow/SKILL.md +158 -0
- package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
- package/shared/skills/git-workflow/references/commit-violations.md +77 -0
- package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
- package/shared/skills/git-workflow/references/pr-violations.md +96 -0
- package/shared/skills/github-patterns/SKILL.md +153 -0
- package/shared/skills/github-patterns/references/patterns.md +572 -0
- package/shared/skills/github-patterns/references/violations.md +298 -0
- package/shared/skills/implementation-patterns/SKILL.md +162 -0
- package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
- package/shared/skills/implementation-patterns/references/violations.md +483 -0
- package/shared/skills/input-validation/SKILL.md +148 -0
- package/shared/skills/input-validation/references/detection.md +283 -0
- package/shared/skills/input-validation/references/patterns.md +361 -0
- package/shared/skills/input-validation/references/violations.md +224 -0
- package/shared/skills/performance-patterns/SKILL.md +154 -0
- package/shared/skills/performance-patterns/references/detection.md +351 -0
- package/shared/skills/performance-patterns/references/patterns.md +503 -0
- package/shared/skills/performance-patterns/references/violations.md +354 -0
- package/shared/skills/react/SKILL.md +276 -0
- package/shared/skills/react/references/patterns.md +1331 -0
- package/shared/skills/react/references/violations.md +565 -0
- package/shared/skills/regression-patterns/SKILL.md +146 -0
- package/shared/skills/regression-patterns/references/detection.md +237 -0
- package/shared/skills/regression-patterns/references/patterns.md +226 -0
- package/shared/skills/regression-patterns/references/violations.md +225 -0
- package/shared/skills/review-methodology/SKILL.md +119 -0
- package/shared/skills/review-methodology/references/patterns.md +186 -0
- package/shared/skills/review-methodology/references/report-template.md +142 -0
- package/shared/skills/review-methodology/references/violations.md +125 -0
- package/shared/skills/security-patterns/SKILL.md +156 -0
- package/shared/skills/security-patterns/references/detection.md +287 -0
- package/shared/skills/security-patterns/references/patterns.md +507 -0
- package/shared/skills/security-patterns/references/violations.md +237 -0
- package/shared/skills/self-review/SKILL.md +149 -0
- package/shared/skills/self-review/references/patterns.md +405 -0
- package/shared/skills/self-review/references/report-template.md +253 -0
- package/shared/skills/self-review/references/violations.md +308 -0
- package/shared/skills/test-patterns/SKILL.md +183 -0
- package/shared/skills/test-patterns/references/detection.md +149 -0
- package/shared/skills/test-patterns/references/patterns.md +220 -0
- package/shared/skills/test-patterns/references/report-template.md +108 -0
- package/shared/skills/test-patterns/references/violations.md +221 -0
- package/shared/skills/typescript/SKILL.md +176 -0
- package/shared/skills/typescript/references/patterns.md +1105 -0
- package/shared/skills/typescript/references/violations.md +433 -0
- package/src/templates/claudeignore.template +188 -0
- package/src/templates/managed-settings.json +146 -0
- package/src/templates/settings.json +59 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/src/claude/CLAUDE.md +0 -400
- package/src/claude/agents/devflow/audit-architecture.md +0 -132
- package/src/claude/agents/devflow/audit-complexity.md +0 -132
- package/src/claude/agents/devflow/audit-database.md +0 -132
- package/src/claude/agents/devflow/audit-dependencies.md +0 -132
- package/src/claude/agents/devflow/audit-documentation.md +0 -132
- package/src/claude/agents/devflow/audit-performance.md +0 -256
- package/src/claude/agents/devflow/audit-security.md +0 -259
- package/src/claude/agents/devflow/audit-tests.md +0 -132
- package/src/claude/agents/devflow/audit-typescript.md +0 -132
- package/src/claude/agents/devflow/brainstorm.md +0 -279
- package/src/claude/agents/devflow/catch-up.md +0 -345
- package/src/claude/agents/devflow/code-review.md +0 -307
- package/src/claude/agents/devflow/commit.md +0 -380
- package/src/claude/agents/devflow/debug.md +0 -476
- package/src/claude/agents/devflow/design.md +0 -491
- package/src/claude/agents/devflow/get-issue.md +0 -286
- package/src/claude/agents/devflow/pr-comments.md +0 -285
- package/src/claude/agents/devflow/project-state.md +0 -419
- package/src/claude/agents/devflow/pull-request.md +0 -493
- package/src/claude/agents/devflow/release.md +0 -1137
- package/src/claude/agents/devflow/tech-debt.md +0 -338
- package/src/claude/commands/devflow/brainstorm.md +0 -68
- package/src/claude/commands/devflow/breakdown.md +0 -125
- package/src/claude/commands/devflow/catch-up.md +0 -29
- package/src/claude/commands/devflow/code-review.md +0 -237
- package/src/claude/commands/devflow/commit.md +0 -17
- package/src/claude/commands/devflow/debug.md +0 -56
- package/src/claude/commands/devflow/design.md +0 -82
- package/src/claude/commands/devflow/devlog.md +0 -408
- package/src/claude/commands/devflow/get-issue.md +0 -16
- package/src/claude/commands/devflow/implement.md +0 -100
- package/src/claude/commands/devflow/plan.md +0 -223
- package/src/claude/commands/devflow/pull-request.md +0 -20
- package/src/claude/commands/devflow/release.md +0 -251
- package/src/claude/commands/devflow/resolve-comments.md +0 -583
- package/src/claude/scripts/statusline.sh +0 -47
- package/src/claude/settings.json +0 -6
- package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
- package/src/claude/skills/devflow/debug/SKILL.md +0 -119
- package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
- package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
- package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
- package/src/claude/skills/devflow/research/SKILL.md +0 -138
- package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
# Performance Correct Patterns
|
|
2
|
+
|
|
3
|
+
Extended correct patterns for performance optimization. Reference from main SKILL.md.
|
|
4
|
+
|
|
5
|
+
## Algorithmic Solutions
|
|
6
|
+
|
|
7
|
+
### N+1 Query Solutions
|
|
8
|
+
|
|
9
|
+
**ORM Eager Loading**
|
|
10
|
+
```typescript
|
|
11
|
+
// CORRECT: Include related data in single query
|
|
12
|
+
const posts = await Post.findAll({
|
|
13
|
+
include: [
|
|
14
|
+
{ model: User, as: 'author' },
|
|
15
|
+
{ model: Comment, limit: 10 }
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**GraphQL DataLoader**
|
|
21
|
+
```typescript
|
|
22
|
+
// CORRECT: Batch and cache with DataLoader
|
|
23
|
+
const userLoader = new DataLoader(async (ids) => {
|
|
24
|
+
const users = await db.users.findAll({ where: { id: ids } });
|
|
25
|
+
return ids.map(id => users.find(u => u.id === id));
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const resolvers = {
|
|
29
|
+
Post: {
|
|
30
|
+
author: (post) => userLoader.load(post.authorId) // Batched!
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Batch Query with Map**
|
|
36
|
+
```typescript
|
|
37
|
+
// CORRECT: Single query, map results
|
|
38
|
+
async function enrichOrders(orders: Order[]) {
|
|
39
|
+
const customerIds = [...new Set(orders.map(o => o.customerId))];
|
|
40
|
+
const customers = await db.customers.findByIds(customerIds);
|
|
41
|
+
const customerMap = new Map(customers.map(c => [c.id, c]));
|
|
42
|
+
|
|
43
|
+
return orders.map(o => ({
|
|
44
|
+
...o,
|
|
45
|
+
customer: customerMap.get(o.customerId)
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Efficient Algorithm Patterns
|
|
51
|
+
|
|
52
|
+
**Set for Lookup**
|
|
53
|
+
```typescript
|
|
54
|
+
// CORRECT: O(n+m) instead of O(n*m)
|
|
55
|
+
function findCommon(list1: string[], list2: string[]) {
|
|
56
|
+
const set = new Set(list2);
|
|
57
|
+
return list1.filter(item => set.has(item));
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Map for Grouping**
|
|
62
|
+
```typescript
|
|
63
|
+
// CORRECT: Single pass grouping
|
|
64
|
+
function groupBy<T, K extends string>(items: T[], keyFn: (item: T) => K) {
|
|
65
|
+
const groups = new Map<K, T[]>();
|
|
66
|
+
for (const item of items) {
|
|
67
|
+
const key = keyFn(item);
|
|
68
|
+
const group = groups.get(key) || [];
|
|
69
|
+
group.push(item);
|
|
70
|
+
groups.set(key, group);
|
|
71
|
+
}
|
|
72
|
+
return groups;
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Efficient String Building**
|
|
77
|
+
```typescript
|
|
78
|
+
// CORRECT: Array join instead of string concat
|
|
79
|
+
function buildCsv(rows: string[][]): string {
|
|
80
|
+
return rows.map(row => row.join(',')).join('\n');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Or for very large data: streaming
|
|
84
|
+
function* streamCsv(rows: string[][]): Generator<string> {
|
|
85
|
+
for (const row of rows) {
|
|
86
|
+
yield row.join(',') + '\n';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Proper Queue Implementation**
|
|
92
|
+
```typescript
|
|
93
|
+
// CORRECT: O(1) dequeue with circular buffer or linked list
|
|
94
|
+
class Queue<T> {
|
|
95
|
+
private items: T[] = [];
|
|
96
|
+
private head = 0;
|
|
97
|
+
|
|
98
|
+
enqueue(item: T): void {
|
|
99
|
+
this.items.push(item);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
dequeue(): T | undefined {
|
|
103
|
+
if (this.head >= this.items.length) return undefined;
|
|
104
|
+
const item = this.items[this.head];
|
|
105
|
+
this.items[this.head] = undefined as any; // Allow GC
|
|
106
|
+
this.head++;
|
|
107
|
+
|
|
108
|
+
// Compact when half empty
|
|
109
|
+
if (this.head > this.items.length / 2) {
|
|
110
|
+
this.items = this.items.slice(this.head);
|
|
111
|
+
this.head = 0;
|
|
112
|
+
}
|
|
113
|
+
return item;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Database Solutions
|
|
121
|
+
|
|
122
|
+
### Indexing Strategies
|
|
123
|
+
|
|
124
|
+
**Composite Index for Range Queries**
|
|
125
|
+
```sql
|
|
126
|
+
-- CORRECT: Index supports both equality and range
|
|
127
|
+
CREATE INDEX idx_orders_customer_date ON orders(customer_id, created_at DESC);
|
|
128
|
+
|
|
129
|
+
-- Efficient query
|
|
130
|
+
SELECT * FROM orders
|
|
131
|
+
WHERE customer_id = 123
|
|
132
|
+
ORDER BY created_at DESC
|
|
133
|
+
LIMIT 10;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Covering Index**
|
|
137
|
+
```sql
|
|
138
|
+
-- CORRECT: Index includes all needed columns
|
|
139
|
+
CREATE INDEX idx_users_status_email ON users(status) INCLUDE (email, name);
|
|
140
|
+
|
|
141
|
+
-- Query satisfied entirely from index
|
|
142
|
+
SELECT email, name FROM users WHERE status = 'active';
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Partial Index for Common Filters**
|
|
146
|
+
```sql
|
|
147
|
+
-- CORRECT: Index only relevant rows
|
|
148
|
+
CREATE INDEX idx_orders_pending ON orders(created_at)
|
|
149
|
+
WHERE status = 'pending';
|
|
150
|
+
|
|
151
|
+
-- Efficient for common query pattern
|
|
152
|
+
SELECT * FROM orders WHERE status = 'pending' ORDER BY created_at;
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Efficient Query Patterns
|
|
156
|
+
|
|
157
|
+
**Select Specific Columns**
|
|
158
|
+
```typescript
|
|
159
|
+
// CORRECT: Only fetch needed data
|
|
160
|
+
const users = await db.query(
|
|
161
|
+
'SELECT id, name, email FROM users WHERE status = ?',
|
|
162
|
+
['active']
|
|
163
|
+
);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Cursor-Based Pagination**
|
|
167
|
+
```typescript
|
|
168
|
+
// CORRECT: Efficient for large datasets
|
|
169
|
+
async function getOrdersPage(cursor?: string, limit = 20) {
|
|
170
|
+
const query = cursor
|
|
171
|
+
? 'SELECT * FROM orders WHERE id > ? ORDER BY id LIMIT ?'
|
|
172
|
+
: 'SELECT * FROM orders ORDER BY id LIMIT ?';
|
|
173
|
+
|
|
174
|
+
const params = cursor ? [cursor, limit + 1] : [limit + 1];
|
|
175
|
+
const rows = await db.query(query, params);
|
|
176
|
+
|
|
177
|
+
const hasMore = rows.length > limit;
|
|
178
|
+
const items = hasMore ? rows.slice(0, -1) : rows;
|
|
179
|
+
const nextCursor = hasMore ? items[items.length - 1].id : null;
|
|
180
|
+
|
|
181
|
+
return { items, nextCursor, hasMore };
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Batch Processing Large Tables**
|
|
186
|
+
```typescript
|
|
187
|
+
// CORRECT: Process in chunks to avoid memory issues
|
|
188
|
+
async function processAllOrders(batchSize = 1000) {
|
|
189
|
+
let cursor: string | null = null;
|
|
190
|
+
|
|
191
|
+
do {
|
|
192
|
+
const { items, nextCursor } = await getOrdersPage(cursor, batchSize);
|
|
193
|
+
await Promise.all(items.map(processOrder));
|
|
194
|
+
cursor = nextCursor;
|
|
195
|
+
} while (cursor);
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Memory Solutions
|
|
202
|
+
|
|
203
|
+
### Cleanup Patterns
|
|
204
|
+
|
|
205
|
+
**Event Listener Cleanup**
|
|
206
|
+
```typescript
|
|
207
|
+
// CORRECT: Track and cleanup listeners
|
|
208
|
+
class Component {
|
|
209
|
+
private cleanupFns: (() => void)[] = [];
|
|
210
|
+
|
|
211
|
+
mount() {
|
|
212
|
+
const handler = (e: Event) => this.handleResize(e);
|
|
213
|
+
window.addEventListener('resize', handler);
|
|
214
|
+
this.cleanupFns.push(() => window.removeEventListener('resize', handler));
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
unmount() {
|
|
218
|
+
this.cleanupFns.forEach(fn => fn());
|
|
219
|
+
this.cleanupFns = [];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**AbortController for Async Cleanup**
|
|
225
|
+
```typescript
|
|
226
|
+
// CORRECT: Cancel pending operations
|
|
227
|
+
class DataFetcher {
|
|
228
|
+
private controller?: AbortController;
|
|
229
|
+
|
|
230
|
+
async fetch(url: string) {
|
|
231
|
+
this.controller?.abort();
|
|
232
|
+
this.controller = new AbortController();
|
|
233
|
+
|
|
234
|
+
const response = await fetch(url, { signal: this.controller.signal });
|
|
235
|
+
return response.json();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
cancel() {
|
|
239
|
+
this.controller?.abort();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Weak References for Caches**
|
|
245
|
+
```typescript
|
|
246
|
+
// CORRECT: Allow GC to reclaim cached objects
|
|
247
|
+
const cache = new WeakMap<object, ComputedResult>();
|
|
248
|
+
|
|
249
|
+
function getOrCompute(key: object): ComputedResult {
|
|
250
|
+
let result = cache.get(key);
|
|
251
|
+
if (!result) {
|
|
252
|
+
result = computeExpensive(key);
|
|
253
|
+
cache.set(key, result);
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Allocation Optimization
|
|
260
|
+
|
|
261
|
+
**Efficient Object Accumulation**
|
|
262
|
+
```typescript
|
|
263
|
+
// CORRECT: Direct property assignment
|
|
264
|
+
function indexById<T extends { id: string }>(items: T[]): Record<string, T> {
|
|
265
|
+
const result: Record<string, T> = {};
|
|
266
|
+
for (const item of items) {
|
|
267
|
+
result[item.id] = item; // No spreading
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Pre-allocated Arrays**
|
|
274
|
+
```typescript
|
|
275
|
+
// CORRECT: Single allocation when size known
|
|
276
|
+
function processItems(items: Item[]): ProcessedItem[] {
|
|
277
|
+
const results = new Array<ProcessedItem>(items.length);
|
|
278
|
+
for (let i = 0; i < items.length; i++) {
|
|
279
|
+
results[i] = process(items[i]);
|
|
280
|
+
}
|
|
281
|
+
return results;
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Streaming for Large Data**
|
|
286
|
+
```typescript
|
|
287
|
+
// CORRECT: Process without loading all into memory
|
|
288
|
+
async function* readLargeFile(path: string): AsyncGenerator<string> {
|
|
289
|
+
const stream = createReadStream(path);
|
|
290
|
+
const rl = readline.createInterface({ input: stream });
|
|
291
|
+
|
|
292
|
+
for await (const line of rl) {
|
|
293
|
+
yield line;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Usage
|
|
298
|
+
for await (const line of readLargeFile('huge.csv')) {
|
|
299
|
+
processLine(line); // Constant memory usage
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## I/O Solutions
|
|
306
|
+
|
|
307
|
+
### Async Patterns
|
|
308
|
+
|
|
309
|
+
**Async File Operations**
|
|
310
|
+
```typescript
|
|
311
|
+
// CORRECT: Non-blocking I/O
|
|
312
|
+
import fs from 'fs/promises';
|
|
313
|
+
|
|
314
|
+
async function readConfig() {
|
|
315
|
+
return JSON.parse(await fs.readFile('./config.json', 'utf-8'));
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Worker Threads for CPU-Intensive**
|
|
320
|
+
```typescript
|
|
321
|
+
// CORRECT: Offload to worker
|
|
322
|
+
import { Worker } from 'worker_threads';
|
|
323
|
+
|
|
324
|
+
async function hashPassword(password: string): Promise<string> {
|
|
325
|
+
return new Promise((resolve, reject) => {
|
|
326
|
+
const worker = new Worker('./hash-worker.js', {
|
|
327
|
+
workerData: { password }
|
|
328
|
+
});
|
|
329
|
+
worker.on('message', resolve);
|
|
330
|
+
worker.on('error', reject);
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Parallelism Patterns
|
|
336
|
+
|
|
337
|
+
**Promise.all for Independent Operations**
|
|
338
|
+
```typescript
|
|
339
|
+
// CORRECT: Parallel independent fetches
|
|
340
|
+
async function loadDashboard(userId: string) {
|
|
341
|
+
const [user, orders, notifications] = await Promise.all([
|
|
342
|
+
getUser(userId),
|
|
343
|
+
getOrders(userId),
|
|
344
|
+
getNotifications(userId)
|
|
345
|
+
]);
|
|
346
|
+
return { user, orders, notifications };
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**Controlled Concurrency**
|
|
351
|
+
```typescript
|
|
352
|
+
// CORRECT: Limit parallel operations
|
|
353
|
+
async function processAll(items: Item[], concurrency = 5) {
|
|
354
|
+
const results: Result[] = [];
|
|
355
|
+
const executing: Promise<void>[] = [];
|
|
356
|
+
|
|
357
|
+
for (const item of items) {
|
|
358
|
+
const promise = process(item).then(r => {
|
|
359
|
+
results.push(r);
|
|
360
|
+
executing.splice(executing.indexOf(promise), 1);
|
|
361
|
+
});
|
|
362
|
+
executing.push(promise);
|
|
363
|
+
|
|
364
|
+
if (executing.length >= concurrency) {
|
|
365
|
+
await Promise.race(executing);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
await Promise.all(executing);
|
|
370
|
+
return results;
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**Promise.allSettled for Fault Tolerance**
|
|
375
|
+
```typescript
|
|
376
|
+
// CORRECT: Continue despite failures
|
|
377
|
+
async function fetchAllWithFallback(urls: string[]) {
|
|
378
|
+
const results = await Promise.allSettled(urls.map(url => fetch(url)));
|
|
379
|
+
|
|
380
|
+
return results.map((result, i) => ({
|
|
381
|
+
url: urls[i],
|
|
382
|
+
success: result.status === 'fulfilled',
|
|
383
|
+
data: result.status === 'fulfilled' ? result.value : null,
|
|
384
|
+
error: result.status === 'rejected' ? result.reason : null
|
|
385
|
+
}));
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Frontend Solutions
|
|
392
|
+
|
|
393
|
+
### React Optimization Patterns
|
|
394
|
+
|
|
395
|
+
**Memoized Callbacks**
|
|
396
|
+
```tsx
|
|
397
|
+
// CORRECT: Stable function reference
|
|
398
|
+
function UserList({ users, onSelect }: Props) {
|
|
399
|
+
const handleSelect = useCallback((userId: string) => {
|
|
400
|
+
onSelect(userId);
|
|
401
|
+
}, [onSelect]);
|
|
402
|
+
|
|
403
|
+
return <List items={users} onSelect={handleSelect} />;
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Memoized Computed Values**
|
|
408
|
+
```tsx
|
|
409
|
+
// CORRECT: Only recompute when dependencies change
|
|
410
|
+
function Dashboard({ data }: Props) {
|
|
411
|
+
const stats = useMemo(() => computeExpensiveStats(data), [data]);
|
|
412
|
+
return <Stats data={stats} />;
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Component Memoization**
|
|
417
|
+
```tsx
|
|
418
|
+
// CORRECT: Skip re-render if props unchanged
|
|
419
|
+
const UserCard = memo(function UserCard({ user }: Props) {
|
|
420
|
+
return (
|
|
421
|
+
<div>
|
|
422
|
+
<h3>{user.name}</h3>
|
|
423
|
+
<p>{user.email}</p>
|
|
424
|
+
</div>
|
|
425
|
+
);
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Lazy Loading**
|
|
430
|
+
```tsx
|
|
431
|
+
// CORRECT: Load on demand
|
|
432
|
+
const HeavyChart = lazy(() => import('./HeavyChart'));
|
|
433
|
+
|
|
434
|
+
function Dashboard() {
|
|
435
|
+
const [showChart, setShowChart] = useState(false);
|
|
436
|
+
|
|
437
|
+
return (
|
|
438
|
+
<div>
|
|
439
|
+
<button onClick={() => setShowChart(true)}>Show Chart</button>
|
|
440
|
+
{showChart && (
|
|
441
|
+
<Suspense fallback={<Spinner />}>
|
|
442
|
+
<HeavyChart />
|
|
443
|
+
</Suspense>
|
|
444
|
+
)}
|
|
445
|
+
</div>
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**Virtualized Lists**
|
|
451
|
+
```tsx
|
|
452
|
+
// CORRECT: Only render visible items
|
|
453
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
454
|
+
|
|
455
|
+
function VirtualList({ items }: Props) {
|
|
456
|
+
const parentRef = useRef<HTMLDivElement>(null);
|
|
457
|
+
|
|
458
|
+
const virtualizer = useVirtualizer({
|
|
459
|
+
count: items.length,
|
|
460
|
+
getScrollElement: () => parentRef.current,
|
|
461
|
+
estimateSize: () => 35
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
return (
|
|
465
|
+
<div ref={parentRef} style={{ height: '400px', overflow: 'auto' }}>
|
|
466
|
+
<div style={{ height: virtualizer.getTotalSize() }}>
|
|
467
|
+
{virtualizer.getVirtualItems().map(virtualRow => (
|
|
468
|
+
<div
|
|
469
|
+
key={virtualRow.key}
|
|
470
|
+
style={{
|
|
471
|
+
position: 'absolute',
|
|
472
|
+
top: virtualRow.start,
|
|
473
|
+
height: virtualRow.size
|
|
474
|
+
}}
|
|
475
|
+
>
|
|
476
|
+
{items[virtualRow.index].name}
|
|
477
|
+
</div>
|
|
478
|
+
))}
|
|
479
|
+
</div>
|
|
480
|
+
</div>
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**Debounced Input**
|
|
486
|
+
```tsx
|
|
487
|
+
// CORRECT: Debounce expensive operations
|
|
488
|
+
function SearchInput({ onSearch }: Props) {
|
|
489
|
+
const [value, setValue] = useState('');
|
|
490
|
+
|
|
491
|
+
const debouncedSearch = useMemo(
|
|
492
|
+
() => debounce((term: string) => onSearch(term), 300),
|
|
493
|
+
[onSearch]
|
|
494
|
+
);
|
|
495
|
+
|
|
496
|
+
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
|
|
497
|
+
setValue(e.target.value);
|
|
498
|
+
debouncedSearch(e.target.value);
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
return <input value={value} onChange={handleChange} />;
|
|
502
|
+
}
|
|
503
|
+
```
|