@su-record/vibe 2.8.52 → 2.8.53
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/.env.example +37 -37
- package/CLAUDE.md +169 -169
- package/LICENSE +21 -21
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/event/event-comms.md +78 -78
- package/agents/event/event-content.md +68 -68
- package/agents/event/event-image.md +95 -95
- package/agents/event/event-ops.md +84 -84
- package/agents/event/event-scheduler.md +69 -69
- package/agents/event/event-speaker.md +86 -86
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/qa/qa-coordinator.md +131 -131
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +102 -102
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +379 -379
- package/commands/vibe.docs.md +32 -32
- package/commands/vibe.event.md +163 -163
- package/commands/vibe.figma.md +69 -69
- package/commands/vibe.review.md +686 -686
- package/commands/vibe.run.md +2276 -2276
- package/commands/vibe.spec.md +1195 -1195
- package/commands/vibe.spec.review.md +609 -609
- package/commands/vibe.trace.md +259 -259
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +510 -510
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/config.js +9 -9
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/figma.js +20 -20
- package/dist/cli/commands/info.js +53 -53
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/stats.js +6 -6
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/TokenBudgetTracker.d.ts +13 -0
- package/dist/infra/lib/TokenBudgetTracker.d.ts.map +1 -1
- package/dist/infra/lib/TokenBudgetTracker.js +44 -3
- package/dist/infra/lib/TokenBudgetTracker.js.map +1 -1
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/ParityTester.js +57 -57
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +174 -174
- package/hooks/scripts/__tests__/keyword-detector.test.js +199 -199
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +286 -286
- package/hooks/scripts/__tests__/sentinel-guard.test.js +210 -210
- package/hooks/scripts/auto-commit.js +97 -97
- package/hooks/scripts/auto-format.js +64 -64
- package/hooks/scripts/auto-test.js +81 -81
- package/hooks/scripts/code-check.js +268 -268
- package/hooks/scripts/codex-detect.js +46 -46
- package/hooks/scripts/codex-review-gate.js +80 -80
- package/hooks/scripts/command-log.js +32 -32
- package/hooks/scripts/context-save.js +353 -353
- package/hooks/scripts/evolution-engine.js +91 -91
- package/hooks/scripts/figma-extract.js +635 -477
- package/hooks/scripts/hud-status.js +321 -321
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +572 -572
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pr-test-gate.js +52 -52
- package/hooks/scripts/pre-tool-guard.js +214 -159
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +131 -131
- package/hooks/scripts/session-start.js +177 -177
- package/hooks/scripts/skill-injector.js +83 -83
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +243 -243
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +101 -101
- package/skills/agents-md/SKILL.md +121 -121
- package/skills/agents-md/rubrics/what-to-keep.md +49 -49
- package/skills/agents-md/templates/agents-md.md +36 -36
- package/skills/arch-guard/SKILL.md +181 -181
- package/skills/arch-guard/agents/detector.md +48 -48
- package/skills/arch-guard/agents/reporter.md +48 -48
- package/skills/arch-guard/agents/rule-generator.md +49 -49
- package/skills/arch-guard/agents/violation-checker.md +51 -51
- package/skills/arch-guard/frameworks/clean-architecture.md +108 -108
- package/skills/arch-guard/frameworks/solid.md +102 -102
- package/skills/arch-guard/scripts/check-boundaries.js +90 -90
- package/skills/arch-guard/templates/arch-rules.json +47 -47
- package/skills/arch-guard/templates/violation-report.md +53 -53
- package/skills/brand-assets/SKILL.md +147 -147
- package/skills/brand-assets/rubrics/asset-checklist.md +98 -98
- package/skills/brand-assets/templates/brand-guide.md +161 -161
- package/skills/capability-loop/SKILL.md +168 -168
- package/skills/capability-loop/agents/capability-designer.md +61 -61
- package/skills/capability-loop/agents/failure-analyst.md +55 -55
- package/skills/capability-loop/agents/implementer.md +50 -50
- package/skills/capability-loop/agents/tester.md +53 -53
- package/skills/capability-loop/templates/capability-spec.md +118 -118
- package/skills/capability-loop/templates/failure-analysis.md +118 -118
- package/skills/characterization-test/SKILL.md +207 -207
- package/skills/characterization-test/agents/behavior-capturer.md +50 -50
- package/skills/characterization-test/agents/coverage-checker.md +54 -54
- package/skills/characterization-test/agents/reporter.md +50 -50
- package/skills/characterization-test/agents/test-writer.md +49 -49
- package/skills/characterization-test/rubrics/coverage-criteria.md +53 -53
- package/skills/characterization-test/templates/test-template.ts +101 -101
- package/skills/chub-usage/SKILL.md +139 -139
- package/skills/claude-md-guide/SKILL.md +351 -351
- package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -88
- package/skills/claude-md-guide/templates/claude-md.md +54 -54
- package/skills/commerce-patterns/SKILL.md +64 -64
- package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -48
- package/skills/commerce-patterns/templates/product-schema.md +85 -85
- package/skills/commit-push-pr/SKILL.md +77 -77
- package/skills/commit-push-pr/agents/change-analyzer.md +55 -55
- package/skills/commit-push-pr/agents/message-writer.md +50 -50
- package/skills/commit-push-pr/agents/pr-writer.md +58 -58
- package/skills/commit-push-pr/agents/reviewer.md +52 -52
- package/skills/commit-push-pr/rubrics/commit-message.md +73 -73
- package/skills/commit-push-pr/templates/pr-body.md +63 -63
- package/skills/context7-usage/SKILL.md +106 -106
- package/skills/context7-usage/rubrics/when-to-use.md +50 -50
- package/skills/create-prd/SKILL.md +90 -90
- package/skills/create-prd/agents/edge-case-finder.md +48 -48
- package/skills/create-prd/agents/prioritizer.md +60 -60
- package/skills/create-prd/agents/requirements-writer.md +48 -48
- package/skills/create-prd/agents/researcher.md +55 -55
- package/skills/create-prd/agents/reviewer.md +54 -54
- package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -96
- package/skills/create-prd/frameworks/rice-scoring.md +97 -97
- package/skills/create-prd/orchestrator.md +70 -70
- package/skills/create-prd/rubrics/completeness.md +58 -58
- package/skills/create-prd/templates/prd.md +139 -139
- package/skills/design-audit/SKILL.md +152 -152
- package/skills/design-audit/agents/a11y-auditor.md +43 -43
- package/skills/design-audit/agents/performance-auditor.md +46 -46
- package/skills/design-audit/agents/responsive-auditor.md +46 -46
- package/skills/design-audit/agents/scorer.md +47 -47
- package/skills/design-audit/agents/slop-detector.md +47 -47
- package/skills/design-audit/frameworks/core-web-vitals.md +107 -107
- package/skills/design-audit/frameworks/wcag-checklist.md +64 -64
- package/skills/design-audit/orchestrator.md +64 -64
- package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -83
- package/skills/design-audit/rubrics/scoring.md +63 -63
- package/skills/design-audit/templates/report.md +88 -88
- package/skills/design-critique/SKILL.md +139 -139
- package/skills/design-critique/rubrics/ux-heuristics.md +143 -143
- package/skills/design-critique/templates/critique-report.md +86 -86
- package/skills/design-distill/SKILL.md +130 -130
- package/skills/design-distill/templates/design-system.md +132 -132
- package/skills/design-normalize/SKILL.md +133 -133
- package/skills/design-normalize/rubrics/token-naming.md +117 -117
- package/skills/design-normalize/templates/token-audit.md +89 -89
- package/skills/design-polish/SKILL.md +131 -131
- package/skills/design-polish/rubrics/polish-checklist.md +68 -68
- package/skills/design-polish/templates/polish-report.md +64 -64
- package/skills/design-teach/SKILL.md +182 -182
- package/skills/design-teach/rubrics/brand-personality.md +73 -73
- package/skills/design-teach/templates/design-context.json +36 -36
- package/skills/e2e-commerce/SKILL.md +62 -62
- package/skills/e2e-commerce/templates/test-scenarios.md +170 -170
- package/skills/event-comms/SKILL.md +162 -162
- package/skills/event-comms/templates/email-invite.md +99 -99
- package/skills/event-comms/templates/sns-post.md +133 -133
- package/skills/event-ops/SKILL.md +198 -198
- package/skills/event-ops/rubrics/contingency.md +85 -85
- package/skills/event-ops/templates/d-day-checklist.md +65 -65
- package/skills/event-planning/SKILL.md +132 -132
- package/skills/event-planning/rubrics/timeline.md +70 -70
- package/skills/event-planning/templates/event-plan.md +91 -91
- package/skills/exec-plan/SKILL.md +149 -149
- package/skills/exec-plan/agents/decomposer.md +47 -47
- package/skills/exec-plan/agents/dependency-mapper.md +44 -44
- package/skills/exec-plan/agents/estimator.md +43 -43
- package/skills/exec-plan/agents/validator.md +55 -55
- package/skills/exec-plan/orchestrator.md +70 -70
- package/skills/exec-plan/rubrics/complexity-scoring.md +75 -75
- package/skills/exec-plan/templates/plan.md +147 -147
- package/skills/git-worktree/SKILL.md +73 -73
- package/skills/git-worktree/rubrics/when-to-use.md +55 -55
- package/skills/handoff/SKILL.md +110 -110
- package/skills/handoff/agents/context-summarizer.md +51 -51
- package/skills/handoff/agents/document-writer.md +63 -63
- package/skills/handoff/agents/state-collector.md +53 -53
- package/skills/handoff/agents/verifier.md +48 -48
- package/skills/handoff/rubrics/completeness.md +62 -62
- package/skills/handoff/templates/handoff.md +107 -107
- package/skills/parallel-research/SKILL.md +89 -89
- package/skills/parallel-research/agents/best-practices.md +43 -43
- package/skills/parallel-research/agents/codebase-patterns.md +46 -46
- package/skills/parallel-research/agents/framework-docs.md +45 -45
- package/skills/parallel-research/agents/security-advisory.md +46 -46
- package/skills/parallel-research/agents/synthesizer.md +52 -52
- package/skills/parallel-research/experts/best-practices.md +50 -50
- package/skills/parallel-research/experts/codebase-patterns.md +70 -70
- package/skills/parallel-research/experts/framework-docs.md +65 -65
- package/skills/parallel-research/experts/security-advisory.md +69 -69
- package/skills/parallel-research/orchestrator.md +65 -65
- package/skills/parallel-research/templates/synthesis.md +101 -101
- package/skills/prioritization-frameworks/SKILL.md +87 -87
- package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -79
- package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -69
- package/skills/priority-todos/SKILL.md +64 -64
- package/skills/priority-todos/rubrics/prioritization.md +70 -70
- package/skills/priority-todos/templates/todo-board.md +59 -59
- package/skills/seo-checklist/SKILL.md +58 -58
- package/skills/seo-checklist/frameworks/structured-data.md +153 -153
- package/skills/seo-checklist/rubrics/content-seo.md +42 -42
- package/skills/seo-checklist/rubrics/technical-seo.md +48 -48
- package/skills/techdebt/SKILL.md +124 -124
- package/skills/techdebt/agents/analyzer.md +50 -50
- package/skills/techdebt/agents/fixer.md +41 -41
- package/skills/techdebt/agents/reviewer.md +47 -47
- package/skills/techdebt/agents/scanner.md +44 -44
- package/skills/techdebt/orchestrator.md +70 -70
- package/skills/techdebt/rubrics/severity.md +51 -51
- package/skills/techdebt/scripts/scan.js +90 -90
- package/skills/techdebt/templates/report.md +86 -86
- package/skills/tool-fallback/SKILL.md +104 -104
- package/skills/tool-fallback/rubrics/fallback-chain.md +58 -58
- package/skills/typescript-advanced-types/SKILL.md +67 -67
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -109
- package/skills/ui-ux-pro-max/SKILL.md +236 -236
- package/skills/ui-ux-pro-max/reference/color-and-contrast.md +517 -517
- package/skills/ui-ux-pro-max/reference/interaction-design.md +544 -544
- package/skills/ui-ux-pro-max/reference/motion-design.md +591 -591
- package/skills/ui-ux-pro-max/reference/responsive-design.md +463 -463
- package/skills/ui-ux-pro-max/reference/spatial-design.md +390 -390
- package/skills/ui-ux-pro-max/reference/typography.md +455 -455
- package/skills/ui-ux-pro-max/reference/ux-writing.md +469 -469
- package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -83
- package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -99
- package/skills/user-personas/SKILL.md +75 -75
- package/skills/user-personas/rubrics/research-methods.md +56 -56
- package/skills/user-personas/templates/persona.md +89 -89
- package/skills/vercel-react-best-practices/SKILL.md +60 -60
- package/skills/vercel-react-best-practices/rubrics/performance.md +82 -82
- package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -86
- package/skills/vibe.docs/SKILL.md +171 -171
- package/skills/vibe.docs/templates/architecture.md +80 -80
- package/skills/vibe.docs/templates/readme.md +84 -84
- package/skills/vibe.docs/templates/release-notes.md +74 -74
- package/skills/vibe.figma/SKILL.md +215 -982
- package/skills/vibe.figma/rubrics/extraction-checklist.md +51 -51
- package/skills/vibe.figma/templates/component-index.md +126 -126
- package/skills/vibe.figma/templates/figma-handoff.md +100 -100
- package/skills/vibe.figma/templates/remapped-tree.md +277 -277
- package/skills/vibe.figma.convert/SKILL.md +188 -511
- package/skills/vibe.figma.convert/rubrics/conversion-rules.md +129 -113
- package/skills/vibe.figma.convert/templates/component.md +140 -140
- package/skills/vibe.figma.extract/SKILL.md +179 -300
- package/skills/vibe.figma.extract/rubrics/image-rules.md +145 -137
- package/skills/video-production/SKILL.md +52 -52
- package/skills/video-production/rubrics/quality-checklist.md +58 -58
- package/skills/video-production/templates/production-plan.md +104 -104
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- package/vibe/ui-ux-data/web-interface.csv +31 -31
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
# User Persona: {{PERSONA_NAME}}
|
|
2
|
-
|
|
3
|
-
> Product: {{PRODUCT_NAME}} | Research basis: {{DATA_SOURCE}} | Created: {{DATE}}
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Identity
|
|
8
|
-
|
|
9
|
-
| Field | Value |
|
|
10
|
-
|-------|-------|
|
|
11
|
-
| Name (fictional) | {{PERSONA_NAME}} |
|
|
12
|
-
| Age range | {{AGE_RANGE}} |
|
|
13
|
-
| Role / Title | {{ROLE}} |
|
|
14
|
-
| Company size | {{COMPANY_SIZE}} (if B2B) |
|
|
15
|
-
| Location | {{LOCATION}} |
|
|
16
|
-
| Tech comfort | {{LOW / MEDIUM / HIGH}} |
|
|
17
|
-
|
|
18
|
-
**In their own words**: "{{REPRESENTATIVE_QUOTE_FROM_RESEARCH}}"
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Primary Job-to-be-Done
|
|
23
|
-
|
|
24
|
-
> {{THE CORE OUTCOME THIS PERSONA IS TRYING TO ACHIEVE}}
|
|
25
|
-
|
|
26
|
-
**Context**: {{WHEN AND HOW OFTEN DOES THIS JOB ARISE?}}
|
|
27
|
-
**Definition of done**: {{HOW DOES THIS PERSONA KNOW THEY SUCCEEDED?}}
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Top 3 Pain Points
|
|
32
|
-
|
|
33
|
-
| # | Pain | Impact | Severity |
|
|
34
|
-
|---|------|--------|----------|
|
|
35
|
-
| 1 | {{PAIN_1}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
36
|
-
| 2 | {{PAIN_2}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
37
|
-
| 3 | {{PAIN_3}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Top 3 Desired Gains
|
|
42
|
-
|
|
43
|
-
| # | Gain | How They Measure It |
|
|
44
|
-
|---|------|---------------------|
|
|
45
|
-
| 1 | {{GAIN_1}} | {{METRIC_OR_FEELING}} |
|
|
46
|
-
| 2 | {{GAIN_2}} | {{METRIC_OR_FEELING}} |
|
|
47
|
-
| 3 | {{GAIN_3}} | {{METRIC_OR_FEELING}} |
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Unexpected Insight
|
|
52
|
-
|
|
53
|
-
> {{A COUNTERINTUITIVE BEHAVIORAL PATTERN OR MOTIVATION FROM RESEARCH DATA}}
|
|
54
|
-
|
|
55
|
-
**Why it matters for product decisions**: {{IMPLICATION}}
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Current Alternatives
|
|
60
|
-
|
|
61
|
-
How does this persona solve the problem today?
|
|
62
|
-
|
|
63
|
-
| Alternative | Why they use it | What frustrates them |
|
|
64
|
-
|-------------|----------------|----------------------|
|
|
65
|
-
| {{ALT_1}} | {{REASON}} | {{FRUSTRATION}} |
|
|
66
|
-
| {{ALT_2}} | {{REASON}} | {{FRUSTRATION}} |
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Product Fit Assessment
|
|
71
|
-
|
|
72
|
-
**How {{PRODUCT_NAME}} addresses their needs**:
|
|
73
|
-
- {{FIT_POINT_1}}
|
|
74
|
-
- {{FIT_POINT_2}}
|
|
75
|
-
|
|
76
|
-
**Potential friction points**:
|
|
77
|
-
- {{FRICTION_1}}
|
|
78
|
-
- {{FRICTION_2}}
|
|
79
|
-
|
|
80
|
-
**Unmet needs (future opportunities)**:
|
|
81
|
-
- {{UNMET_NEED_1}}
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Data Sources
|
|
86
|
-
|
|
87
|
-
- {{SOURCE_1}} (e.g., "10 user interviews, March 2026")
|
|
88
|
-
- {{SOURCE_2}} (e.g., "NPS survey, n=142")
|
|
89
|
-
- **Data gaps**: {{WHAT WE DON'T KNOW YET}}
|
|
1
|
+
# User Persona: {{PERSONA_NAME}}
|
|
2
|
+
|
|
3
|
+
> Product: {{PRODUCT_NAME}} | Research basis: {{DATA_SOURCE}} | Created: {{DATE}}
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Identity
|
|
8
|
+
|
|
9
|
+
| Field | Value |
|
|
10
|
+
|-------|-------|
|
|
11
|
+
| Name (fictional) | {{PERSONA_NAME}} |
|
|
12
|
+
| Age range | {{AGE_RANGE}} |
|
|
13
|
+
| Role / Title | {{ROLE}} |
|
|
14
|
+
| Company size | {{COMPANY_SIZE}} (if B2B) |
|
|
15
|
+
| Location | {{LOCATION}} |
|
|
16
|
+
| Tech comfort | {{LOW / MEDIUM / HIGH}} |
|
|
17
|
+
|
|
18
|
+
**In their own words**: "{{REPRESENTATIVE_QUOTE_FROM_RESEARCH}}"
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Primary Job-to-be-Done
|
|
23
|
+
|
|
24
|
+
> {{THE CORE OUTCOME THIS PERSONA IS TRYING TO ACHIEVE}}
|
|
25
|
+
|
|
26
|
+
**Context**: {{WHEN AND HOW OFTEN DOES THIS JOB ARISE?}}
|
|
27
|
+
**Definition of done**: {{HOW DOES THIS PERSONA KNOW THEY SUCCEEDED?}}
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Top 3 Pain Points
|
|
32
|
+
|
|
33
|
+
| # | Pain | Impact | Severity |
|
|
34
|
+
|---|------|--------|----------|
|
|
35
|
+
| 1 | {{PAIN_1}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
36
|
+
| 2 | {{PAIN_2}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
37
|
+
| 3 | {{PAIN_3}} | {{CONSEQUENCE}} | High / Med / Low |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Top 3 Desired Gains
|
|
42
|
+
|
|
43
|
+
| # | Gain | How They Measure It |
|
|
44
|
+
|---|------|---------------------|
|
|
45
|
+
| 1 | {{GAIN_1}} | {{METRIC_OR_FEELING}} |
|
|
46
|
+
| 2 | {{GAIN_2}} | {{METRIC_OR_FEELING}} |
|
|
47
|
+
| 3 | {{GAIN_3}} | {{METRIC_OR_FEELING}} |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Unexpected Insight
|
|
52
|
+
|
|
53
|
+
> {{A COUNTERINTUITIVE BEHAVIORAL PATTERN OR MOTIVATION FROM RESEARCH DATA}}
|
|
54
|
+
|
|
55
|
+
**Why it matters for product decisions**: {{IMPLICATION}}
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Current Alternatives
|
|
60
|
+
|
|
61
|
+
How does this persona solve the problem today?
|
|
62
|
+
|
|
63
|
+
| Alternative | Why they use it | What frustrates them |
|
|
64
|
+
|-------------|----------------|----------------------|
|
|
65
|
+
| {{ALT_1}} | {{REASON}} | {{FRUSTRATION}} |
|
|
66
|
+
| {{ALT_2}} | {{REASON}} | {{FRUSTRATION}} |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Product Fit Assessment
|
|
71
|
+
|
|
72
|
+
**How {{PRODUCT_NAME}} addresses their needs**:
|
|
73
|
+
- {{FIT_POINT_1}}
|
|
74
|
+
- {{FIT_POINT_2}}
|
|
75
|
+
|
|
76
|
+
**Potential friction points**:
|
|
77
|
+
- {{FRICTION_1}}
|
|
78
|
+
- {{FRICTION_2}}
|
|
79
|
+
|
|
80
|
+
**Unmet needs (future opportunities)**:
|
|
81
|
+
- {{UNMET_NEED_1}}
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Data Sources
|
|
86
|
+
|
|
87
|
+
- {{SOURCE_1}} (e.g., "10 user interviews, March 2026")
|
|
88
|
+
- {{SOURCE_2}} (e.g., "NPS survey, n=142")
|
|
89
|
+
- **Data gaps**: {{WHAT WE DON'T KNOW YET}}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: vercel-react-best-practices
|
|
3
|
-
tier: core
|
|
4
|
-
description: "React/Next.js performance gotchas from Vercel engineering. Non-intuitive pitfalls that LLMs commonly miss."
|
|
5
|
-
triggers: [react, next.js, performance, optimization, vercel, component, rendering]
|
|
6
|
-
priority: 60
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Vercel React Best Practices
|
|
10
|
-
|
|
11
|
-
## Pre-check (K1)
|
|
12
|
-
|
|
13
|
-
> Is this a React/Next.js performance issue? Standard React patterns (useState, useEffect, components) don't need this skill. Activate only for performance optimization or code review.
|
|
14
|
-
|
|
15
|
-
## CRITICAL Gotchas
|
|
16
|
-
|
|
17
|
-
### Waterfall Elimination
|
|
18
|
-
|
|
19
|
-
| Gotcha | Why Non-obvious |
|
|
20
|
-
|--------|----------------|
|
|
21
|
-
| **Sequential awaits** | `const a = await f1(); const b = await f2();` creates waterfall. Use `Promise.all([f1(), f2()])` for independent ops |
|
|
22
|
-
| **Await placement** | Move `await` to the branch where value is actually used, not at declaration |
|
|
23
|
-
| **Missing Suspense** | Wrap slow server components in `<Suspense>` to stream — don't block entire page |
|
|
24
|
-
|
|
25
|
-
### Bundle Size
|
|
26
|
-
|
|
27
|
-
| Gotcha | Why Non-obvious |
|
|
28
|
-
|--------|----------------|
|
|
29
|
-
| **Barrel imports** | `import { Button } from "@/components"` pulls entire barrel. Use `import { Button } from "@/components/Button"` |
|
|
30
|
-
| **Third-party in initial bundle** | Load analytics/logging AFTER hydration with `next/dynamic` or lazy `useEffect` |
|
|
31
|
-
| **Heavy components** | Charts, editors, maps → `next/dynamic` with `{ ssr: false }` |
|
|
32
|
-
|
|
33
|
-
## HIGH Gotchas
|
|
34
|
-
|
|
35
|
-
### Server-side
|
|
36
|
-
|
|
37
|
-
| Gotcha | Fix |
|
|
38
|
-
|--------|-----|
|
|
39
|
-
| Duplicate DB calls across server components | Wrap with `React.cache()` for per-request dedup |
|
|
40
|
-
| Large data serialized to client | Pick only needed fields before passing to client components |
|
|
41
|
-
| Blocking post-processing (logging, analytics) | Use `after()` for non-blocking tasks |
|
|
42
|
-
|
|
43
|
-
## MEDIUM Gotchas
|
|
44
|
-
|
|
45
|
-
| Gotcha | Fix |
|
|
46
|
-
|--------|-----|
|
|
47
|
-
| Expensive computation re-runs on parent re-render | Isolate in `memo()` wrapped component |
|
|
48
|
-
| Static JSX recreated every render | Hoist outside component: `const HEADER = <header>...</header>` |
|
|
49
|
-
| Long lists render all items | `content-visibility: auto; contain-intrinsic-size: 0 80px;` on list items |
|
|
50
|
-
| `{count && <Item />}` renders `0` | Use ternary: `{count > 0 ? <Item /> : null}` |
|
|
51
|
-
| Event handler changes every render → effect re-runs | Store handlers in `useRef` for stable effects |
|
|
52
|
-
| Object in useEffect deps | Use primitive values (id, not entire object) as dependencies |
|
|
53
|
-
|
|
54
|
-
## Done Criteria (K4)
|
|
55
|
-
|
|
56
|
-
- [ ] No sequential awaits for independent operations
|
|
57
|
-
- [ ] No barrel imports for tree-shakeable modules
|
|
58
|
-
- [ ] Server component data is `React.cache()`-wrapped where reused
|
|
59
|
-
- [ ] Heavy third-party loaded after hydration
|
|
60
|
-
- [ ] Long lists use `content-visibility: auto`
|
|
1
|
+
---
|
|
2
|
+
name: vercel-react-best-practices
|
|
3
|
+
tier: core
|
|
4
|
+
description: "React/Next.js performance gotchas from Vercel engineering. Non-intuitive pitfalls that LLMs commonly miss."
|
|
5
|
+
triggers: [react, next.js, performance, optimization, vercel, component, rendering]
|
|
6
|
+
priority: 60
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Vercel React Best Practices
|
|
10
|
+
|
|
11
|
+
## Pre-check (K1)
|
|
12
|
+
|
|
13
|
+
> Is this a React/Next.js performance issue? Standard React patterns (useState, useEffect, components) don't need this skill. Activate only for performance optimization or code review.
|
|
14
|
+
|
|
15
|
+
## CRITICAL Gotchas
|
|
16
|
+
|
|
17
|
+
### Waterfall Elimination
|
|
18
|
+
|
|
19
|
+
| Gotcha | Why Non-obvious |
|
|
20
|
+
|--------|----------------|
|
|
21
|
+
| **Sequential awaits** | `const a = await f1(); const b = await f2();` creates waterfall. Use `Promise.all([f1(), f2()])` for independent ops |
|
|
22
|
+
| **Await placement** | Move `await` to the branch where value is actually used, not at declaration |
|
|
23
|
+
| **Missing Suspense** | Wrap slow server components in `<Suspense>` to stream — don't block entire page |
|
|
24
|
+
|
|
25
|
+
### Bundle Size
|
|
26
|
+
|
|
27
|
+
| Gotcha | Why Non-obvious |
|
|
28
|
+
|--------|----------------|
|
|
29
|
+
| **Barrel imports** | `import { Button } from "@/components"` pulls entire barrel. Use `import { Button } from "@/components/Button"` |
|
|
30
|
+
| **Third-party in initial bundle** | Load analytics/logging AFTER hydration with `next/dynamic` or lazy `useEffect` |
|
|
31
|
+
| **Heavy components** | Charts, editors, maps → `next/dynamic` with `{ ssr: false }` |
|
|
32
|
+
|
|
33
|
+
## HIGH Gotchas
|
|
34
|
+
|
|
35
|
+
### Server-side
|
|
36
|
+
|
|
37
|
+
| Gotcha | Fix |
|
|
38
|
+
|--------|-----|
|
|
39
|
+
| Duplicate DB calls across server components | Wrap with `React.cache()` for per-request dedup |
|
|
40
|
+
| Large data serialized to client | Pick only needed fields before passing to client components |
|
|
41
|
+
| Blocking post-processing (logging, analytics) | Use `after()` for non-blocking tasks |
|
|
42
|
+
|
|
43
|
+
## MEDIUM Gotchas
|
|
44
|
+
|
|
45
|
+
| Gotcha | Fix |
|
|
46
|
+
|--------|-----|
|
|
47
|
+
| Expensive computation re-runs on parent re-render | Isolate in `memo()` wrapped component |
|
|
48
|
+
| Static JSX recreated every render | Hoist outside component: `const HEADER = <header>...</header>` |
|
|
49
|
+
| Long lists render all items | `content-visibility: auto; contain-intrinsic-size: 0 80px;` on list items |
|
|
50
|
+
| `{count && <Item />}` renders `0` | Use ternary: `{count > 0 ? <Item /> : null}` |
|
|
51
|
+
| Event handler changes every render → effect re-runs | Store handlers in `useRef` for stable effects |
|
|
52
|
+
| Object in useEffect deps | Use primitive values (id, not entire object) as dependencies |
|
|
53
|
+
|
|
54
|
+
## Done Criteria (K4)
|
|
55
|
+
|
|
56
|
+
- [ ] No sequential awaits for independent operations
|
|
57
|
+
- [ ] No barrel imports for tree-shakeable modules
|
|
58
|
+
- [ ] Server component data is `React.cache()`-wrapped where reused
|
|
59
|
+
- [ ] Heavy third-party loaded after hydration
|
|
60
|
+
- [ ] Long lists use `content-visibility: auto`
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
# React Performance Patterns
|
|
2
|
-
|
|
3
|
-
## memo — Skip Re-render
|
|
4
|
-
|
|
5
|
-
Wrap components that receive stable props but re-render from parent updates.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
const ItemRow = memo(function ItemRow({ item }: { item: Item }) {
|
|
9
|
-
return <tr>{item.name}</tr>;
|
|
10
|
-
});
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
**When to use**: Pure display components in long lists, or children of frequently-updating parents.
|
|
14
|
-
**When NOT to use**: Components that almost always re-render anyway (memo check costs CPU too).
|
|
15
|
-
|
|
16
|
-
## useMemo — Cache Expensive Computation
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
// Expensive filter/sort that depends on list + query
|
|
20
|
-
const filtered = useMemo(
|
|
21
|
-
() => items.filter(i => i.name.includes(query)).sort(byDate),
|
|
22
|
-
[items, query]
|
|
23
|
-
);
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Rule**: Only memoize when the computation is genuinely expensive (> 1ms). Measuring before adding is best practice.
|
|
27
|
-
|
|
28
|
-
**Gotcha**: Object/array deps break memoization — use primitive values:
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
// Bad: new object reference every render breaks memo
|
|
32
|
-
useMemo(() => compute(config), [config]);
|
|
33
|
-
|
|
34
|
-
// Good: primitive values stay stable
|
|
35
|
-
useMemo(() => compute(config), [config.id, config.mode]);
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## useCallback — Stable Function References
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
// Without useCallback: new function ref → effect re-runs every render
|
|
42
|
-
const handleSubmit = useCallback(
|
|
43
|
-
(e: FormEvent) => { submitForm(formData); },
|
|
44
|
-
[formData]
|
|
45
|
-
);
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
**Use when**: passing callbacks to memo-wrapped children, or as useEffect dependencies.
|
|
49
|
-
**Skip when**: the component receiving it is not memoized (no benefit).
|
|
50
|
-
|
|
51
|
-
## Suspense — Stream Slow Components
|
|
52
|
-
|
|
53
|
-
```tsx
|
|
54
|
-
// Without Suspense: entire page waits for slowComponent
|
|
55
|
-
// With Suspense: page streams, slot renders when ready
|
|
56
|
-
<Suspense fallback={<Skeleton />}>
|
|
57
|
-
<SlowDataComponent /> {/* server component with slow fetch */}
|
|
58
|
-
</Suspense>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**Gotcha**: Suspense boundaries must be placed at the **component that fetches**, not a parent.
|
|
62
|
-
|
|
63
|
-
## useTransition — Keep UI Responsive
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
const [isPending, startTransition] = useTransition();
|
|
67
|
-
|
|
68
|
-
// Mark state update as non-urgent — keeps input responsive
|
|
69
|
-
startTransition(() => setSearchQuery(inputValue));
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Use for filtering, sorting, navigation — updates that can briefly lag without hurting UX.
|
|
73
|
-
|
|
74
|
-
## Quick Reference
|
|
75
|
-
|
|
76
|
-
| Pattern | Use Case | Skip When |
|
|
77
|
-
|---------|----------|-----------|
|
|
78
|
-
| `memo` | Pure component in updating tree | Almost always re-renders anyway |
|
|
79
|
-
| `useMemo` | Expensive calculation | Fast computation (< 1ms) |
|
|
80
|
-
| `useCallback` | Stable dep for memo/effect | Recipient is not memoized |
|
|
81
|
-
| `Suspense` | Slow async data in subtree | Synchronous rendering |
|
|
82
|
-
| `useTransition` | Non-urgent state updates | Critical/immediate feedback |
|
|
1
|
+
# React Performance Patterns
|
|
2
|
+
|
|
3
|
+
## memo — Skip Re-render
|
|
4
|
+
|
|
5
|
+
Wrap components that receive stable props but re-render from parent updates.
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
const ItemRow = memo(function ItemRow({ item }: { item: Item }) {
|
|
9
|
+
return <tr>{item.name}</tr>;
|
|
10
|
+
});
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**When to use**: Pure display components in long lists, or children of frequently-updating parents.
|
|
14
|
+
**When NOT to use**: Components that almost always re-render anyway (memo check costs CPU too).
|
|
15
|
+
|
|
16
|
+
## useMemo — Cache Expensive Computation
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// Expensive filter/sort that depends on list + query
|
|
20
|
+
const filtered = useMemo(
|
|
21
|
+
() => items.filter(i => i.name.includes(query)).sort(byDate),
|
|
22
|
+
[items, query]
|
|
23
|
+
);
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Rule**: Only memoize when the computation is genuinely expensive (> 1ms). Measuring before adding is best practice.
|
|
27
|
+
|
|
28
|
+
**Gotcha**: Object/array deps break memoization — use primitive values:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// Bad: new object reference every render breaks memo
|
|
32
|
+
useMemo(() => compute(config), [config]);
|
|
33
|
+
|
|
34
|
+
// Good: primitive values stay stable
|
|
35
|
+
useMemo(() => compute(config), [config.id, config.mode]);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## useCallback — Stable Function References
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// Without useCallback: new function ref → effect re-runs every render
|
|
42
|
+
const handleSubmit = useCallback(
|
|
43
|
+
(e: FormEvent) => { submitForm(formData); },
|
|
44
|
+
[formData]
|
|
45
|
+
);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Use when**: passing callbacks to memo-wrapped children, or as useEffect dependencies.
|
|
49
|
+
**Skip when**: the component receiving it is not memoized (no benefit).
|
|
50
|
+
|
|
51
|
+
## Suspense — Stream Slow Components
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
// Without Suspense: entire page waits for slowComponent
|
|
55
|
+
// With Suspense: page streams, slot renders when ready
|
|
56
|
+
<Suspense fallback={<Skeleton />}>
|
|
57
|
+
<SlowDataComponent /> {/* server component with slow fetch */}
|
|
58
|
+
</Suspense>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Gotcha**: Suspense boundaries must be placed at the **component that fetches**, not a parent.
|
|
62
|
+
|
|
63
|
+
## useTransition — Keep UI Responsive
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
const [isPending, startTransition] = useTransition();
|
|
67
|
+
|
|
68
|
+
// Mark state update as non-urgent — keeps input responsive
|
|
69
|
+
startTransition(() => setSearchQuery(inputValue));
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Use for filtering, sorting, navigation — updates that can briefly lag without hurting UX.
|
|
73
|
+
|
|
74
|
+
## Quick Reference
|
|
75
|
+
|
|
76
|
+
| Pattern | Use Case | Skip When |
|
|
77
|
+
|---------|----------|-----------|
|
|
78
|
+
| `memo` | Pure component in updating tree | Almost always re-renders anyway |
|
|
79
|
+
| `useMemo` | Expensive calculation | Fast computation (< 1ms) |
|
|
80
|
+
| `useCallback` | Stable dep for memo/effect | Recipient is not memoized |
|
|
81
|
+
| `Suspense` | Slow async data in subtree | Synchronous rendering |
|
|
82
|
+
| `useTransition` | Non-urgent state updates | Critical/immediate feedback |
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
# Server vs Client Component Decision Guide
|
|
2
|
-
|
|
3
|
-
## Decision Tree
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
Does this component need any of the following?
|
|
7
|
-
│
|
|
8
|
-
├─ useState / useReducer → Client
|
|
9
|
-
├─ useEffect / lifecycle hooks → Client
|
|
10
|
-
├─ Browser APIs (window, document, localStorage) → Client
|
|
11
|
-
├─ Event handlers (onClick, onChange, onSubmit) → Client
|
|
12
|
-
├─ Third-party hooks (useRouter, useForm, etc.) → Client
|
|
13
|
-
│
|
|
14
|
-
└─ None of the above? → Server (default)
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Default: Server Component
|
|
18
|
-
|
|
19
|
-
Next.js App Router defaults all components to Server. Only add `"use client"` when required.
|
|
20
|
-
|
|
21
|
-
**Server components can:**
|
|
22
|
-
- Fetch data directly (no useEffect needed)
|
|
23
|
-
- Access backend resources (DB, filesystem, env secrets)
|
|
24
|
-
- Reduce client bundle size (zero JS shipped)
|
|
25
|
-
- Use `async/await` at the component level
|
|
26
|
-
|
|
27
|
-
```tsx
|
|
28
|
-
// Server component — no directive needed
|
|
29
|
-
async function UserProfile({ id }: { id: string }) {
|
|
30
|
-
const user = await db.user.findUnique({ where: { id } });
|
|
31
|
-
return <div>{user?.name}</div>;
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Client Component
|
|
36
|
-
|
|
37
|
-
Add `"use client"` at the top of the file.
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
"use client";
|
|
41
|
-
import { useState } from "react";
|
|
42
|
-
|
|
43
|
-
export function Counter() {
|
|
44
|
-
const [count, setCount] = useState(0);
|
|
45
|
-
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Composition Pattern: Push Client Down
|
|
50
|
-
|
|
51
|
-
Keep client boundary as low as possible. Wrap only the interactive slice, not the whole page.
|
|
52
|
-
|
|
53
|
-
```tsx
|
|
54
|
-
// Bad: entire section becomes client
|
|
55
|
-
"use client";
|
|
56
|
-
async function ProductPage({ id }: { id: string }) { ... }
|
|
57
|
-
|
|
58
|
-
// Good: server fetches, client handles interaction
|
|
59
|
-
async function ProductPage({ id }: { id: string }) {
|
|
60
|
-
const product = await getProduct(id);
|
|
61
|
-
return (
|
|
62
|
-
<div>
|
|
63
|
-
<ProductDetails product={product} /> {/* server */}
|
|
64
|
-
<AddToCartButton productId={id} /> {/* client — small, isolated */}
|
|
65
|
-
</div>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Gotchas
|
|
71
|
-
|
|
72
|
-
| Mistake | Effect | Fix |
|
|
73
|
-
|---------|--------|-----|
|
|
74
|
-
| Importing a Client component into a Server component that passes a non-serializable prop | Runtime error | Only pass serializable data (string, number, plain object) |
|
|
75
|
-
| `"use client"` on a file that only uses server features | Unnecessary client bundle | Remove directive |
|
|
76
|
-
| `async` component without Suspense wrapper | Blocks entire parent render | Wrap in `<Suspense fallback={...}>` |
|
|
77
|
-
| Calling `React.cache()` in a Client component | No effect — cache is server-only | Move data fetching to Server component |
|
|
78
|
-
| Secrets in Client component | Exposed to browser | Move fetch to Server component or API route |
|
|
79
|
-
|
|
80
|
-
## Data Fetching Boundary
|
|
81
|
-
|
|
82
|
-
| Where | Pattern |
|
|
83
|
-
|-------|---------|
|
|
84
|
-
| Server component | `await fetch()` / direct DB call |
|
|
85
|
-
| Client component | `useEffect` + fetch, or SWR/React Query |
|
|
86
|
-
| Shared across server components | Wrap with `React.cache()` for per-request dedup |
|
|
1
|
+
# Server vs Client Component Decision Guide
|
|
2
|
+
|
|
3
|
+
## Decision Tree
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Does this component need any of the following?
|
|
7
|
+
│
|
|
8
|
+
├─ useState / useReducer → Client
|
|
9
|
+
├─ useEffect / lifecycle hooks → Client
|
|
10
|
+
├─ Browser APIs (window, document, localStorage) → Client
|
|
11
|
+
├─ Event handlers (onClick, onChange, onSubmit) → Client
|
|
12
|
+
├─ Third-party hooks (useRouter, useForm, etc.) → Client
|
|
13
|
+
│
|
|
14
|
+
└─ None of the above? → Server (default)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Default: Server Component
|
|
18
|
+
|
|
19
|
+
Next.js App Router defaults all components to Server. Only add `"use client"` when required.
|
|
20
|
+
|
|
21
|
+
**Server components can:**
|
|
22
|
+
- Fetch data directly (no useEffect needed)
|
|
23
|
+
- Access backend resources (DB, filesystem, env secrets)
|
|
24
|
+
- Reduce client bundle size (zero JS shipped)
|
|
25
|
+
- Use `async/await` at the component level
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
// Server component — no directive needed
|
|
29
|
+
async function UserProfile({ id }: { id: string }) {
|
|
30
|
+
const user = await db.user.findUnique({ where: { id } });
|
|
31
|
+
return <div>{user?.name}</div>;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Client Component
|
|
36
|
+
|
|
37
|
+
Add `"use client"` at the top of the file.
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
"use client";
|
|
41
|
+
import { useState } from "react";
|
|
42
|
+
|
|
43
|
+
export function Counter() {
|
|
44
|
+
const [count, setCount] = useState(0);
|
|
45
|
+
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Composition Pattern: Push Client Down
|
|
50
|
+
|
|
51
|
+
Keep client boundary as low as possible. Wrap only the interactive slice, not the whole page.
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
// Bad: entire section becomes client
|
|
55
|
+
"use client";
|
|
56
|
+
async function ProductPage({ id }: { id: string }) { ... }
|
|
57
|
+
|
|
58
|
+
// Good: server fetches, client handles interaction
|
|
59
|
+
async function ProductPage({ id }: { id: string }) {
|
|
60
|
+
const product = await getProduct(id);
|
|
61
|
+
return (
|
|
62
|
+
<div>
|
|
63
|
+
<ProductDetails product={product} /> {/* server */}
|
|
64
|
+
<AddToCartButton productId={id} /> {/* client — small, isolated */}
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Gotchas
|
|
71
|
+
|
|
72
|
+
| Mistake | Effect | Fix |
|
|
73
|
+
|---------|--------|-----|
|
|
74
|
+
| Importing a Client component into a Server component that passes a non-serializable prop | Runtime error | Only pass serializable data (string, number, plain object) |
|
|
75
|
+
| `"use client"` on a file that only uses server features | Unnecessary client bundle | Remove directive |
|
|
76
|
+
| `async` component without Suspense wrapper | Blocks entire parent render | Wrap in `<Suspense fallback={...}>` |
|
|
77
|
+
| Calling `React.cache()` in a Client component | No effect — cache is server-only | Move data fetching to Server component |
|
|
78
|
+
| Secrets in Client component | Exposed to browser | Move fetch to Server component or API route |
|
|
79
|
+
|
|
80
|
+
## Data Fetching Boundary
|
|
81
|
+
|
|
82
|
+
| Where | Pattern |
|
|
83
|
+
|-------|---------|
|
|
84
|
+
| Server component | `await fetch()` / direct DB call |
|
|
85
|
+
| Client component | `useEffect` + fetch, or SWR/React Query |
|
|
86
|
+
| Shared across server components | Wrap with `React.cache()` for per-request dedup |
|