claude-code-orchestrator-kit 1.4.1 → 1.4.16
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/.claude/agents/business/workers/lead-research-assistant.md +199 -0
- package/.claude/agents/database/workers/api-builder.md +8 -0
- package/.claude/agents/database/workers/database-architect.md +11 -3
- package/.claude/agents/database/workers/supabase-auditor.md +7 -7
- package/.claude/agents/database/workers/supabase-fixer.md +825 -0
- package/.claude/agents/database/workers/supabase-realtime-optimizer.md +1086 -0
- package/.claude/agents/database/workers/supabase-storage-optimizer.md +1187 -0
- package/.claude/agents/development/workers/code-reviewer.md +17 -2
- package/.claude/agents/development/workers/code-structure-refactorer.md +771 -0
- package/.claude/agents/development/workers/judge-specialist.md +3275 -0
- package/.claude/agents/development/workers/langgraph-specialist.md +1343 -0
- package/.claude/agents/development/workers/stage-pipeline-specialist.md +1173 -0
- package/.claude/agents/frontend/workers/fullstack-nextjs-specialist.md +10 -0
- package/.claude/agents/frontend/workers/nextjs-ui-designer.md +30 -0
- package/.claude/agents/health/workers/bug-fixer.md +31 -3
- package/.claude/agents/health/workers/bug-hunter.md +0 -1
- package/.claude/agents/health/workers/dead-code-hunter.md +167 -75
- package/.claude/agents/health/workers/dead-code-remover.md +217 -66
- package/.claude/agents/health/workers/dependency-auditor.md +83 -24
- package/.claude/agents/health/workers/dependency-updater.md +0 -1
- package/.claude/agents/health/workers/security-scanner.md +0 -1
- package/.claude/agents/infrastructure/workers/bullmq-worker-specialist.md +748 -0
- package/.claude/agents/infrastructure/workers/deployment-engineer.md +446 -0
- package/.claude/agents/infrastructure/workers/infrastructure-specialist.md +2 -2
- package/.claude/agents/infrastructure/workers/rag-specialist.md +799 -0
- package/.claude/agents/infrastructure/workers/server-hardening-specialist.md +1128 -0
- package/.claude/agents/integrations/workers/lms-integration-specialist.md +866 -0
- package/.claude/agents/meta/workers/meta-agent-v3.md +22 -0
- package/.claude/agents/testing/workers/integration-tester.md +1 -1
- package/.claude/agents/testing/workers/test-writer.md +16 -0
- package/.claude/commands/health-bugs.md +14 -281
- package/.claude/commands/health-cleanup.md +14 -281
- package/.claude/commands/health-deps.md +14 -281
- package/.claude/commands/health-metrics.md +51 -709
- package/.claude/commands/health-reuse.md +14 -311
- package/.claude/commands/health-security.md +14 -281
- package/.claude/commands/push.md +17 -3
- package/.claude/commands/speckit.implement.md +0 -11
- package/.claude/commands/supabase-performance-optimizer.md +73 -0
- package/.claude/commands/ultra-think.md +158 -0
- package/.claude/commands/worktree.md +150 -0
- package/.claude/scripts/gates/check-bundle-size.sh +0 -0
- package/.claude/scripts/gates/check-coverage.sh +0 -0
- package/.claude/scripts/gates/check-security.sh +0 -0
- package/.claude/scripts/release.sh +469 -94
- package/.claude/skills/algorithmic-art/LICENSE.txt +202 -0
- package/.claude/skills/algorithmic-art/SKILL.md +405 -0
- package/.claude/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/.claude/skills/algorithmic-art/templates/viewer.html +599 -0
- package/.claude/skills/artifacts-builder/LICENSE.txt +202 -0
- package/.claude/skills/artifacts-builder/SKILL.md +74 -0
- package/.claude/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/.claude/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
- package/.claude/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/.claude/skills/bug-health-inline/SKILL.md +221 -0
- package/.claude/skills/bug-health-inline/references/worker-prompts.md +182 -0
- package/.claude/skills/canvas-design/LICENSE.txt +202 -0
- package/.claude/skills/canvas-design/SKILL.md +130 -0
- package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/.claude/skills/changelog-generator/SKILL.md +104 -0
- package/.claude/skills/cleanup-health-inline/SKILL.md +224 -0
- package/.claude/skills/code-reviewer/SKILL.md +209 -0
- package/.claude/skills/code-reviewer/references/code_review_checklist.md +103 -0
- package/.claude/skills/code-reviewer/references/coding_standards.md +103 -0
- package/.claude/skills/code-reviewer/references/common_antipatterns.md +103 -0
- package/.claude/skills/code-reviewer/scripts/code_quality_checker.py +114 -0
- package/.claude/skills/code-reviewer/scripts/pr_analyzer.py +114 -0
- package/.claude/skills/code-reviewer/scripts/review_report_generator.py +114 -0
- package/.claude/skills/content-research-writer/SKILL.md +538 -0
- package/.claude/skills/deps-health-inline/SKILL.md +227 -0
- package/.claude/skills/frontend-aesthetics/SKILL.md +51 -396
- package/.claude/skills/git-commit-helper/SKILL.md +203 -0
- package/.claude/skills/lead-research-assistant/SKILL.md +199 -0
- package/.claude/skills/reuse-health-inline/SKILL.md +248 -0
- package/.claude/skills/rollback-changes/SKILL.md +50 -524
- package/.claude/skills/run-quality-gate/SKILL.md +36 -346
- package/.claude/skills/security-health-inline/SKILL.md +224 -0
- package/.claude/skills/senior-architect/SKILL.md +209 -0
- package/.claude/skills/senior-architect/references/architecture_patterns.md +755 -0
- package/.claude/skills/senior-architect/references/system_design_workflows.md +749 -0
- package/.claude/skills/senior-architect/references/tech_decision_guide.md +612 -0
- package/.claude/skills/senior-architect/scripts/architecture_diagram_generator.py +114 -0
- package/.claude/skills/senior-architect/scripts/dependency_analyzer.py +114 -0
- package/.claude/skills/senior-architect/scripts/project_architect.py +114 -0
- package/.claude/skills/senior-devops/SKILL.md +209 -0
- package/.claude/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
- package/.claude/skills/senior-devops/references/deployment_strategies.md +103 -0
- package/.claude/skills/senior-devops/references/infrastructure_as_code.md +103 -0
- package/.claude/skills/senior-devops/scripts/deployment_manager.py +114 -0
- package/.claude/skills/senior-devops/scripts/pipeline_generator.py +114 -0
- package/.claude/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
- package/.claude/skills/senior-prompt-engineer/SKILL.md +226 -0
- package/.claude/skills/senior-prompt-engineer/references/agentic_system_design.md +80 -0
- package/.claude/skills/senior-prompt-engineer/references/llm_evaluation_frameworks.md +80 -0
- package/.claude/skills/senior-prompt-engineer/references/prompt_engineering_patterns.md +80 -0
- package/.claude/skills/senior-prompt-engineer/scripts/agent_orchestrator.py +100 -0
- package/.claude/skills/senior-prompt-engineer/scripts/prompt_optimizer.py +100 -0
- package/.claude/skills/senior-prompt-engineer/scripts/rag_evaluator.py +100 -0
- package/.claude/skills/setup-knip/SKILL.md +372 -0
- package/.claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/.claude/skills/systematic-debugging/SKILL.md +296 -0
- package/.claude/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/.claude/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/.claude/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/.claude/skills/systematic-debugging/find-polluter.sh +63 -0
- package/.claude/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/.claude/skills/systematic-debugging/test-academic.md +14 -0
- package/.claude/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/.claude/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/.claude/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/.claude/skills/theme-factory/LICENSE.txt +202 -0
- package/.claude/skills/theme-factory/SKILL.md +59 -0
- package/.claude/skills/theme-factory/theme-showcase.pdf +0 -0
- package/.claude/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/.claude/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/.claude/skills/theme-factory/themes/desert-rose.md +19 -0
- package/.claude/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/.claude/skills/theme-factory/themes/golden-hour.md +19 -0
- package/.claude/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/.claude/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/.claude/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/.claude/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/.claude/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/.claude/skills/ui-design-system/SKILL.md +32 -0
- package/.claude/skills/ui-design-system/scripts/design_token_generator.py +529 -0
- package/.claude/skills/ux-researcher-designer/SKILL.md +30 -0
- package/.claude/skills/ux-researcher-designer/scripts/persona_generator.py +508 -0
- package/.claude/skills/webapp-testing/LICENSE.txt +202 -0
- package/.claude/skills/webapp-testing/SKILL.md +96 -0
- package/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
- package/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
- package/.gitignore +4 -0
- package/README.md +492 -1093
- package/README.ru.md +719 -0
- package/docs/Agents Ecosystem/AGENT-ORCHESTRATION.md +2 -2
- package/docs/COMMANDS-GUIDE.md +0 -15
- package/docs/reports/skills/new-skills-analysis-2025-12.md +331 -0
- package/package.json +11 -3
- package/.claude/agents/health/orchestrators/bug-orchestrator.md +0 -1084
- package/.claude/agents/health/orchestrators/dead-code-orchestrator.md +0 -1064
- package/.claude/agents/health/orchestrators/dependency-orchestrator.md +0 -1064
- package/.claude/agents/health/orchestrators/reuse-orchestrator.md +0 -1112
- package/.claude/agents/health/orchestrators/security-orchestrator.md +0 -1064
- package/.claude/commands/worktree-cleanup.md +0 -382
- package/.claude/commands/worktree-create.md +0 -287
- package/.claude/commands/worktree-list.md +0 -239
- package/.claude/commands/worktree-remove.md +0 -339
- package/.claude/project-index.md +0 -75
- package/.claude/skills/load-project-context/SKILL.md +0 -89
- package/.claude/skills/resume-session/SKILL.md +0 -164
- package/.claude/skills/save-session-context/SKILL.md +0 -123
- package/.claude/templates/project-index.template.md +0 -67
- package/.claude/templates/session/context.template.md +0 -40
- package/.claude/templates/session/log.template.md +0 -72
- package/.github/BRANCH_PROTECTION.md +0 -137
- package/.github/workflows/build.yml +0 -70
- package/.github/workflows/deploy-staging.yml +0 -90
- package/.github/workflows/test.yml +0 -104
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
# Tech Decision Guide
|
|
2
|
+
|
|
3
|
+
Decision frameworks and comparison matrices for choosing technologies in the MegaCampusAI stack.
|
|
4
|
+
|
|
5
|
+
## Database Selection
|
|
6
|
+
|
|
7
|
+
### Comparison Matrix
|
|
8
|
+
|
|
9
|
+
| Criteria | PostgreSQL (Supabase) | MongoDB | Redis | SQLite |
|
|
10
|
+
|----------|----------------------|---------|-------|--------|
|
|
11
|
+
| **ACID compliance** | ✅ Full | ⚠️ Limited | ❌ No | ✅ Full |
|
|
12
|
+
| **Schema flexibility** | ⚠️ Rigid | ✅ Very flexible | ✅ Schemaless | ⚠️ Rigid |
|
|
13
|
+
| **Query performance** | ✅ Excellent | ✅ Good | ✅ Excellent | ✅ Good |
|
|
14
|
+
| **Scalability** | ✅ Vertical + Horizontal | ✅ Horizontal | ✅ Horizontal | ❌ Single file |
|
|
15
|
+
| **RLS (Row Level Security)** | ✅ Native | ❌ No | ❌ No | ❌ No |
|
|
16
|
+
| **Full-text search** | ✅ Built-in | ✅ Built-in | ❌ No | ✅ FTS5 |
|
|
17
|
+
| **JSON support** | ✅ JSONB | ✅ Native | ✅ JSON | ✅ JSON1 |
|
|
18
|
+
| **Real-time subscriptions** | ✅ Supabase | ✅ Change streams | ✅ Pub/Sub | ❌ No |
|
|
19
|
+
| **Cost (managed)** | $$ | $$ | $ | Free (self-hosted) |
|
|
20
|
+
|
|
21
|
+
### Decision Tree
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Do you need ACID transactions?
|
|
25
|
+
├─ YES → PostgreSQL or SQLite
|
|
26
|
+
│ └─ Do you need multi-tenant security (RLS)?
|
|
27
|
+
│ ├─ YES → PostgreSQL (Supabase)
|
|
28
|
+
│ └─ NO → SQLite (local) or PostgreSQL
|
|
29
|
+
│
|
|
30
|
+
└─ NO → MongoDB or Redis
|
|
31
|
+
└─ Do you need persistence?
|
|
32
|
+
├─ YES → MongoDB
|
|
33
|
+
└─ NO → Redis (cache/sessions)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Use Cases
|
|
37
|
+
|
|
38
|
+
**PostgreSQL (Supabase)** - Current choice ✅
|
|
39
|
+
- Multi-tenant applications
|
|
40
|
+
- Relational data (courses, lessons, organizations)
|
|
41
|
+
- Row-level security required
|
|
42
|
+
- ACID transactions needed
|
|
43
|
+
- Real-time subscriptions
|
|
44
|
+
|
|
45
|
+
**Redis** - For caching
|
|
46
|
+
- Session storage
|
|
47
|
+
- Rate limiting
|
|
48
|
+
- Caching API responses
|
|
49
|
+
- Pub/sub messaging
|
|
50
|
+
- Temporary data
|
|
51
|
+
|
|
52
|
+
**MongoDB** - Not recommended for this project
|
|
53
|
+
- Rapidly changing schema
|
|
54
|
+
- Document-oriented data
|
|
55
|
+
- No complex joins needed
|
|
56
|
+
|
|
57
|
+
**SQLite** - For local development
|
|
58
|
+
- Embedded databases
|
|
59
|
+
- Mobile apps
|
|
60
|
+
- Single-user applications
|
|
61
|
+
|
|
62
|
+
## State Management (Frontend)
|
|
63
|
+
|
|
64
|
+
### Comparison Matrix
|
|
65
|
+
|
|
66
|
+
| Criteria | Zustand | Redux Toolkit | React Context | Jotai | Valtio |
|
|
67
|
+
|----------|---------|---------------|---------------|-------|--------|
|
|
68
|
+
| **Bundle size** | 1.2 KB | 11 KB | 0 KB | 3 KB | 4 KB |
|
|
69
|
+
| **Learning curve** | Low | High | Low | Medium | Low |
|
|
70
|
+
| **DevTools** | ✅ Yes | ✅ Excellent | ❌ No | ✅ Yes | ✅ Yes |
|
|
71
|
+
| **TypeScript** | ✅ Excellent | ✅ Good | ✅ Good | ✅ Excellent | ✅ Good |
|
|
72
|
+
| **Boilerplate** | Minimal | High | Minimal | Minimal | Minimal |
|
|
73
|
+
| **Performance** | ✅ Excellent | ✅ Good | ⚠️ Re-render issues | ✅ Excellent | ✅ Good |
|
|
74
|
+
| **Middleware** | ✅ Yes | ✅ Yes | ❌ No | ⚠️ Limited | ⚠️ Limited |
|
|
75
|
+
| **Immer support** | ✅ Native | ✅ Built-in | ❌ Manual | ✅ Via plugin | ✅ Built-in |
|
|
76
|
+
|
|
77
|
+
### Decision Tree
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
What type of state are you managing?
|
|
81
|
+
│
|
|
82
|
+
├─ Server state (API data)
|
|
83
|
+
│ └─ Use: TanStack Query (React Query) + Zustand for UI state
|
|
84
|
+
│
|
|
85
|
+
├─ Form state
|
|
86
|
+
│ └─ Use: React Hook Form + Zod validation
|
|
87
|
+
│
|
|
88
|
+
├─ Simple UI state (modals, toggles)
|
|
89
|
+
│ └─ Use: React Context or useState
|
|
90
|
+
│
|
|
91
|
+
└─ Complex UI state (navigation, multi-step)
|
|
92
|
+
└─ Use: Zustand + Immer
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Use Cases
|
|
96
|
+
|
|
97
|
+
**Zustand + Immer** - Current choice ✅
|
|
98
|
+
```typescript
|
|
99
|
+
// When to use:
|
|
100
|
+
// - Complex nested state
|
|
101
|
+
// - Navigation stacks
|
|
102
|
+
// - Inspector panels
|
|
103
|
+
// - Multi-step forms
|
|
104
|
+
|
|
105
|
+
import { create } from 'zustand';
|
|
106
|
+
import { immer } from 'zustand/middleware/immer';
|
|
107
|
+
|
|
108
|
+
const useStore = create<State>()(
|
|
109
|
+
immer((set) => ({
|
|
110
|
+
history: [],
|
|
111
|
+
openDetail: (id) => set((state) => {
|
|
112
|
+
state.history.push(state.current);
|
|
113
|
+
state.current = { view: 'detail', id };
|
|
114
|
+
}),
|
|
115
|
+
}))
|
|
116
|
+
);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**React Context** - For simple cases
|
|
120
|
+
```typescript
|
|
121
|
+
// When to use:
|
|
122
|
+
// - Theme switching
|
|
123
|
+
// - i18n (internationalization)
|
|
124
|
+
// - User authentication state
|
|
125
|
+
// - Simple toggles/flags
|
|
126
|
+
|
|
127
|
+
const ThemeContext = createContext<Theme>('light');
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**TanStack Query** - For server state
|
|
131
|
+
```typescript
|
|
132
|
+
// When to use:
|
|
133
|
+
// - API data fetching
|
|
134
|
+
// - Caching server responses
|
|
135
|
+
// - Optimistic updates
|
|
136
|
+
// - Pagination/infinite scroll
|
|
137
|
+
|
|
138
|
+
const { data } = useQuery({
|
|
139
|
+
queryKey: ['courses'],
|
|
140
|
+
queryFn: () => trpc.courses.list.query(),
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Redux Toolkit** - Not recommended unless:
|
|
145
|
+
- Team already familiar
|
|
146
|
+
- Need time-travel debugging
|
|
147
|
+
- Complex state machine logic
|
|
148
|
+
|
|
149
|
+
## API Architecture
|
|
150
|
+
|
|
151
|
+
### Comparison Matrix
|
|
152
|
+
|
|
153
|
+
| Criteria | tRPC | GraphQL | REST | gRPC |
|
|
154
|
+
|----------|------|---------|------|------|
|
|
155
|
+
| **Type safety** | ✅ End-to-end | ⚠️ Codegen needed | ❌ Manual | ✅ Protobuf |
|
|
156
|
+
| **Learning curve** | Low | High | Low | High |
|
|
157
|
+
| **Tooling** | Good | Excellent | Excellent | Good |
|
|
158
|
+
| **Caching** | Manual | Built-in | Manual | Manual |
|
|
159
|
+
| **Batching** | ✅ Yes | ✅ Yes | ❌ No | ✅ Yes |
|
|
160
|
+
| **Real-time** | ⚠️ Via WebSocket | ✅ Subscriptions | ⚠️ SSE/WebSocket | ✅ Streaming |
|
|
161
|
+
| **Bundle size** | Small | Large | N/A | Medium |
|
|
162
|
+
| **Public API** | ❌ No | ✅ Yes | ✅ Yes | ⚠️ Limited |
|
|
163
|
+
|
|
164
|
+
### Decision Tree
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
Do you control both client and server?
|
|
168
|
+
│
|
|
169
|
+
├─ YES (Full-stack TypeScript)
|
|
170
|
+
│ └─ Use: tRPC (current choice ✅)
|
|
171
|
+
│ - End-to-end type safety
|
|
172
|
+
│ - Zero code generation
|
|
173
|
+
│ - Minimal boilerplate
|
|
174
|
+
│
|
|
175
|
+
└─ NO (Public API or multiple clients)
|
|
176
|
+
└─ Do clients need flexible queries?
|
|
177
|
+
├─ YES → GraphQL
|
|
178
|
+
│ - Mobile apps with limited bandwidth
|
|
179
|
+
│ - Complex data requirements
|
|
180
|
+
│
|
|
181
|
+
└─ NO → REST
|
|
182
|
+
- Simple CRUD operations
|
|
183
|
+
- Standard HTTP tooling
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Use Cases
|
|
187
|
+
|
|
188
|
+
**tRPC** - Current choice ✅
|
|
189
|
+
```typescript
|
|
190
|
+
// When to use:
|
|
191
|
+
// - Monorepo with shared TypeScript
|
|
192
|
+
// - Internal APIs
|
|
193
|
+
// - Full control over client/server
|
|
194
|
+
|
|
195
|
+
// Backend
|
|
196
|
+
export const coursesRouter = router({
|
|
197
|
+
list: publicProcedure.query(async () => { ... }),
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Frontend (auto-typed)
|
|
201
|
+
const { data } = trpc.courses.list.useQuery();
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**REST** - For public APIs
|
|
205
|
+
```typescript
|
|
206
|
+
// When to use:
|
|
207
|
+
// - Public API endpoints
|
|
208
|
+
// - Third-party integrations
|
|
209
|
+
// - Standard HTTP tooling needed
|
|
210
|
+
|
|
211
|
+
// Next.js API route
|
|
212
|
+
export async function GET(request: Request) {
|
|
213
|
+
return Response.json({ courses: [] });
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**GraphQL** - Not recommended unless:
|
|
218
|
+
- Complex nested data requirements
|
|
219
|
+
- Mobile clients with bandwidth constraints
|
|
220
|
+
- Need for real-time subscriptions
|
|
221
|
+
|
|
222
|
+
## Package Manager
|
|
223
|
+
|
|
224
|
+
### Comparison Matrix
|
|
225
|
+
|
|
226
|
+
| Criteria | pnpm | npm | yarn | bun |
|
|
227
|
+
|----------|------|-----|------|-----|
|
|
228
|
+
| **Disk usage** | ✅ Minimal | ❌ High | ⚠️ Medium | ✅ Minimal |
|
|
229
|
+
| **Install speed** | ✅ Fast | ⚠️ Slow | ✅ Fast | ✅ Very fast |
|
|
230
|
+
| **Monorepo** | ✅ Excellent | ⚠️ Workspaces | ✅ Good | ✅ Good |
|
|
231
|
+
| **Node compatibility** | ✅ Excellent | ✅ Excellent | ✅ Excellent | ⚠️ Good |
|
|
232
|
+
| **Lock file merge** | ✅ Easy | ⚠️ Conflicts | ⚠️ Conflicts | ✅ Easy |
|
|
233
|
+
| **Stability** | ✅ Stable | ✅ Stable | ✅ Stable | ⚠️ Beta |
|
|
234
|
+
|
|
235
|
+
### Use Cases
|
|
236
|
+
|
|
237
|
+
**pnpm** - Current choice ✅
|
|
238
|
+
```bash
|
|
239
|
+
# Why we chose pnpm:
|
|
240
|
+
# 1. Monorepo support (workspace:* protocol)
|
|
241
|
+
# 2. Fast installs (content-addressable storage)
|
|
242
|
+
# 3. Strict node_modules (prevents phantom dependencies)
|
|
243
|
+
# 4. Easy lock file merges
|
|
244
|
+
|
|
245
|
+
# Monorepo commands
|
|
246
|
+
pnpm --filter web add react
|
|
247
|
+
pnpm -r type-check
|
|
248
|
+
pnpm add -D -w prettier
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Validation Libraries
|
|
252
|
+
|
|
253
|
+
### Comparison Matrix
|
|
254
|
+
|
|
255
|
+
| Criteria | Zod | Yup | Joi | io-ts |
|
|
256
|
+
|----------|-----|-----|-----|-------|
|
|
257
|
+
| **TypeScript** | ✅ Native | ⚠️ TS support | ⚠️ TS support | ✅ Native |
|
|
258
|
+
| **Type inference** | ✅ Excellent | ⚠️ Manual | ⚠️ Manual | ✅ Good |
|
|
259
|
+
| **Bundle size** | 8 KB | 16 KB | 160 KB | 12 KB |
|
|
260
|
+
| **Error messages** | ✅ Good | ✅ Good | ✅ Good | ⚠️ Verbose |
|
|
261
|
+
| **Schema composition** | ✅ Excellent | ✅ Good | ✅ Good | ✅ Good |
|
|
262
|
+
| **Runtime safety** | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
|
|
263
|
+
|
|
264
|
+
### Use Cases
|
|
265
|
+
|
|
266
|
+
**Zod** - Current choice ✅
|
|
267
|
+
```typescript
|
|
268
|
+
// Why we chose Zod:
|
|
269
|
+
// 1. TypeScript-first design
|
|
270
|
+
// 2. Type inference (no duplication)
|
|
271
|
+
// 3. Composable schemas
|
|
272
|
+
// 4. tRPC integration
|
|
273
|
+
|
|
274
|
+
import { z } from 'zod';
|
|
275
|
+
|
|
276
|
+
// Define schema
|
|
277
|
+
const CreateCourseSchema = z.object({
|
|
278
|
+
title: z.string().min(3).max(100),
|
|
279
|
+
organizationId: z.string().uuid(),
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// Infer type (no duplication!)
|
|
283
|
+
type CreateCourseInput = z.infer<typeof CreateCourseSchema>;
|
|
284
|
+
|
|
285
|
+
// Use in tRPC
|
|
286
|
+
publicProcedure
|
|
287
|
+
.input(CreateCourseSchema)
|
|
288
|
+
.mutation(async ({ input }) => { ... });
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Styling Solutions
|
|
292
|
+
|
|
293
|
+
### Comparison Matrix
|
|
294
|
+
|
|
295
|
+
| Criteria | Tailwind CSS | CSS Modules | Styled Components | Emotion | Vanilla CSS |
|
|
296
|
+
|----------|--------------|-------------|-------------------|---------|-------------|
|
|
297
|
+
| **Bundle size** | ⚠️ Medium | ✅ None | ❌ Large | ⚠️ Medium | ✅ None |
|
|
298
|
+
| **Runtime overhead** | ✅ None | ✅ None | ❌ Yes | ⚠️ Small | ✅ None |
|
|
299
|
+
| **Type safety** | ❌ No | ❌ No | ✅ Yes | ✅ Yes | ❌ No |
|
|
300
|
+
| **Themability** | ✅ Good | ⚠️ Manual | ✅ Excellent | ✅ Excellent | ⚠️ Manual |
|
|
301
|
+
| **Developer UX** | ✅ Excellent | ✅ Good | ✅ Good | ✅ Good | ⚠️ Verbose |
|
|
302
|
+
| **SSR support** | ✅ Yes | ✅ Yes | ⚠️ Config needed | ⚠️ Config needed | ✅ Yes |
|
|
303
|
+
|
|
304
|
+
### Use Cases
|
|
305
|
+
|
|
306
|
+
**Tailwind CSS** - Current choice ✅
|
|
307
|
+
```typescript
|
|
308
|
+
// Why we chose Tailwind:
|
|
309
|
+
// 1. Utility-first (fast development)
|
|
310
|
+
// 2. No runtime overhead
|
|
311
|
+
// 3. Built-in responsive design
|
|
312
|
+
// 4. Easy to purge unused styles
|
|
313
|
+
|
|
314
|
+
<div className="flex items-center gap-4 p-4 bg-white rounded-lg shadow">
|
|
315
|
+
<Image src="/logo.png" className="w-12 h-12" />
|
|
316
|
+
<h2 className="text-lg font-semibold">Course Title</h2>
|
|
317
|
+
</div>
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**CSS Modules** - For component-specific styles
|
|
321
|
+
```css
|
|
322
|
+
/* CourseCard.module.css */
|
|
323
|
+
.card {
|
|
324
|
+
display: flex;
|
|
325
|
+
padding: 1rem;
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Styled Components** - Not recommended unless:
|
|
330
|
+
- Need runtime theming
|
|
331
|
+
- Component library development
|
|
332
|
+
|
|
333
|
+
## Testing Frameworks
|
|
334
|
+
|
|
335
|
+
### Comparison Matrix
|
|
336
|
+
|
|
337
|
+
| Criteria | Vitest | Jest | Playwright | Cypress |
|
|
338
|
+
|----------|--------|------|------------|---------|
|
|
339
|
+
| **Speed** | ✅ Very fast | ⚠️ Slower | ✅ Fast | ⚠️ Slower |
|
|
340
|
+
| **Vite support** | ✅ Native | ❌ Config needed | N/A | N/A |
|
|
341
|
+
| **TypeScript** | ✅ Native | ⚠️ Config needed | ✅ Good | ✅ Good |
|
|
342
|
+
| **Watch mode** | ✅ Excellent | ✅ Good | ❌ No | ⚠️ Limited |
|
|
343
|
+
| **E2E testing** | ❌ No | ❌ No | ✅ Excellent | ✅ Good |
|
|
344
|
+
| **Parallel tests** | ✅ Yes | ✅ Yes | ✅ Yes | ⚠️ Limited |
|
|
345
|
+
|
|
346
|
+
### Use Cases
|
|
347
|
+
|
|
348
|
+
**Vitest** - For unit/integration tests
|
|
349
|
+
```typescript
|
|
350
|
+
// Why we chose Vitest:
|
|
351
|
+
// 1. Vite-native (no config)
|
|
352
|
+
// 2. Fast (ESM + HMR)
|
|
353
|
+
// 3. Jest-compatible API
|
|
354
|
+
|
|
355
|
+
import { describe, it, expect } from 'vitest';
|
|
356
|
+
|
|
357
|
+
describe('createCourse', () => {
|
|
358
|
+
it('should create course with valid input', async () => {
|
|
359
|
+
const result = await createCourse({ title: 'Test' });
|
|
360
|
+
expect(result).toHaveProperty('id');
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Playwright** - For E2E tests
|
|
366
|
+
```typescript
|
|
367
|
+
// Why we chose Playwright:
|
|
368
|
+
// 1. Multiple browser support
|
|
369
|
+
// 2. Parallel execution
|
|
370
|
+
// 3. Auto-waiting
|
|
371
|
+
|
|
372
|
+
import { test, expect } from '@playwright/test';
|
|
373
|
+
|
|
374
|
+
test('create course flow', async ({ page }) => {
|
|
375
|
+
await page.goto('/courses');
|
|
376
|
+
await page.click('button:text("New Course")');
|
|
377
|
+
await page.fill('input[name="title"]', 'Test Course');
|
|
378
|
+
await page.click('button:text("Create")');
|
|
379
|
+
await expect(page.locator('h1')).toHaveText('Test Course');
|
|
380
|
+
});
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Deployment Platforms
|
|
384
|
+
|
|
385
|
+
### Comparison Matrix
|
|
386
|
+
|
|
387
|
+
| Criteria | Vercel | Netlify | AWS | Railway | Fly.io |
|
|
388
|
+
|----------|--------|---------|-----|---------|--------|
|
|
389
|
+
| **Next.js optimization** | ✅ Native | ✅ Good | ⚠️ Manual | ✅ Good | ✅ Good |
|
|
390
|
+
| **Edge functions** | ✅ Yes | ✅ Yes | ✅ Lambda@Edge | ⚠️ Limited | ✅ Yes |
|
|
391
|
+
| **Database hosting** | ❌ No | ❌ No | ✅ RDS | ✅ Postgres | ✅ Postgres |
|
|
392
|
+
| **Cost (hobby)** | Free | Free | Pay-as-go | Free tier | Free tier |
|
|
393
|
+
| **Automatic SSL** | ✅ Yes | ✅ Yes | ⚠️ ACM | ✅ Yes | ✅ Yes |
|
|
394
|
+
| **Preview deployments** | ✅ Excellent | ✅ Good | ⚠️ Manual | ✅ Good | ✅ Good |
|
|
395
|
+
|
|
396
|
+
### Use Cases
|
|
397
|
+
|
|
398
|
+
**Vercel** - For Next.js frontend
|
|
399
|
+
```bash
|
|
400
|
+
# Why Vercel:
|
|
401
|
+
# 1. Native Next.js support
|
|
402
|
+
# 2. Edge functions
|
|
403
|
+
# 3. Preview deployments
|
|
404
|
+
# 4. Automatic optimization
|
|
405
|
+
|
|
406
|
+
vercel --prod
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Railway** - For Node.js backend
|
|
410
|
+
```bash
|
|
411
|
+
# Why Railway:
|
|
412
|
+
# 1. Simple deployment
|
|
413
|
+
# 2. Postgres hosting
|
|
414
|
+
# 3. Environment variables
|
|
415
|
+
# 4. Good free tier
|
|
416
|
+
|
|
417
|
+
railway up
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Supabase** - For database + auth
|
|
421
|
+
```bash
|
|
422
|
+
# Why Supabase:
|
|
423
|
+
# 1. Managed Postgres
|
|
424
|
+
# 2. Built-in auth
|
|
425
|
+
# 3. Real-time subscriptions
|
|
426
|
+
# 4. RLS (Row Level Security)
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Caching Strategies
|
|
430
|
+
|
|
431
|
+
### Comparison Matrix
|
|
432
|
+
|
|
433
|
+
| Strategy | Use Case | Invalidation | Complexity |
|
|
434
|
+
|----------|----------|--------------|------------|
|
|
435
|
+
| **Redis** | Session, rate limiting | TTL + manual | Medium |
|
|
436
|
+
| **CDN** | Static assets | Cache-Control headers | Low |
|
|
437
|
+
| **React Query** | API responses | Time-based + manual | Low |
|
|
438
|
+
| **Next.js ISR** | Static pages | Revalidate interval | Medium |
|
|
439
|
+
| **Service Worker** | Offline support | Version-based | High |
|
|
440
|
+
|
|
441
|
+
### Decision Tree
|
|
442
|
+
|
|
443
|
+
```
|
|
444
|
+
What are you caching?
|
|
445
|
+
│
|
|
446
|
+
├─ API responses → React Query (5-10 min stale time)
|
|
447
|
+
│
|
|
448
|
+
├─ Static assets (images, CSS) → CDN + long-lived headers
|
|
449
|
+
│
|
|
450
|
+
├─ Session data → Redis (30 min TTL)
|
|
451
|
+
│
|
|
452
|
+
├─ Rate limiting → Redis (1-60 min TTL)
|
|
453
|
+
│
|
|
454
|
+
└─ Static pages → Next.js ISR (60s revalidate)
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
## Authentication Strategies
|
|
458
|
+
|
|
459
|
+
### Comparison Matrix
|
|
460
|
+
|
|
461
|
+
| Solution | Implementation | Security | Flexibility |
|
|
462
|
+
|----------|---------------|----------|-------------|
|
|
463
|
+
| **Supabase Auth** | Managed | ✅ Excellent | ⚠️ Limited |
|
|
464
|
+
| **NextAuth.js** | Self-hosted | ✅ Good | ✅ Excellent |
|
|
465
|
+
| **Auth0** | Managed | ✅ Excellent | ✅ Good |
|
|
466
|
+
| **Clerk** | Managed | ✅ Excellent | ⚠️ Limited |
|
|
467
|
+
| **Custom JWT** | Self-hosted | ⚠️ Complex | ✅ Full control |
|
|
468
|
+
|
|
469
|
+
### Use Cases
|
|
470
|
+
|
|
471
|
+
**Supabase Auth** - Current choice ✅
|
|
472
|
+
```typescript
|
|
473
|
+
// Why Supabase Auth:
|
|
474
|
+
// 1. Integrated with database (RLS)
|
|
475
|
+
// 2. Social providers built-in
|
|
476
|
+
// 3. Row-level security
|
|
477
|
+
// 4. Email/password + OAuth
|
|
478
|
+
|
|
479
|
+
const { data, error } = await supabase.auth.signInWithPassword({
|
|
480
|
+
email: 'user@example.com',
|
|
481
|
+
password: 'password',
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// RLS automatically filters based on auth.uid()
|
|
485
|
+
const { data } = await supabase
|
|
486
|
+
.from('courses')
|
|
487
|
+
.select('*'); // Only returns user's accessible courses
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## Performance Metrics Targets
|
|
491
|
+
|
|
492
|
+
### Frontend (Web Vitals)
|
|
493
|
+
|
|
494
|
+
| Metric | Target | Threshold |
|
|
495
|
+
|--------|--------|-----------|
|
|
496
|
+
| **FCP** (First Contentful Paint) | < 1.8s | < 3s |
|
|
497
|
+
| **LCP** (Largest Contentful Paint) | < 2.5s | < 4s |
|
|
498
|
+
| **FID** (First Input Delay) | < 100ms | < 300ms |
|
|
499
|
+
| **CLS** (Cumulative Layout Shift) | < 0.1 | < 0.25 |
|
|
500
|
+
| **TTFB** (Time to First Byte) | < 600ms | < 1.8s |
|
|
501
|
+
|
|
502
|
+
### Backend (API)
|
|
503
|
+
|
|
504
|
+
| Metric | Target | Threshold |
|
|
505
|
+
|--------|--------|-----------|
|
|
506
|
+
| **Response time** (p95) | < 200ms | < 500ms |
|
|
507
|
+
| **Database query time** (avg) | < 50ms | < 100ms |
|
|
508
|
+
| **Cache hit rate** | > 80% | > 60% |
|
|
509
|
+
| **Error rate** | < 0.1% | < 1% |
|
|
510
|
+
| **Availability** | > 99.9% | > 99% |
|
|
511
|
+
|
|
512
|
+
### Database
|
|
513
|
+
|
|
514
|
+
| Metric | Target | Action |
|
|
515
|
+
|--------|--------|--------|
|
|
516
|
+
| **Query time > 100ms** | 0 queries | Add index |
|
|
517
|
+
| **Connection pool** | < 80% used | Scale up |
|
|
518
|
+
| **Disk usage** | < 70% | Archive old data |
|
|
519
|
+
| **Replication lag** | < 1s | Investigate |
|
|
520
|
+
|
|
521
|
+
## Troubleshooting Guide
|
|
522
|
+
|
|
523
|
+
### Common Issues
|
|
524
|
+
|
|
525
|
+
#### Issue: Slow API responses
|
|
526
|
+
|
|
527
|
+
**Diagnosis:**
|
|
528
|
+
```bash
|
|
529
|
+
# 1. Check database query performance
|
|
530
|
+
EXPLAIN ANALYZE SELECT * FROM courses WHERE organization_id = 'uuid';
|
|
531
|
+
|
|
532
|
+
# 2. Check for N+1 queries
|
|
533
|
+
# Enable query logging in Supabase
|
|
534
|
+
|
|
535
|
+
# 3. Check Redis cache hit rate
|
|
536
|
+
redis-cli INFO stats | grep hit_rate
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
**Solutions:**
|
|
540
|
+
```sql
|
|
541
|
+
-- Add index
|
|
542
|
+
CREATE INDEX idx_courses_org_id ON courses(organization_id);
|
|
543
|
+
|
|
544
|
+
-- Use joins instead of N+1
|
|
545
|
+
SELECT courses.*, lessons.*
|
|
546
|
+
FROM courses
|
|
547
|
+
LEFT JOIN lessons ON lessons.course_id = courses.id;
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
#### Issue: High memory usage (frontend)
|
|
551
|
+
|
|
552
|
+
**Diagnosis:**
|
|
553
|
+
```typescript
|
|
554
|
+
// Chrome DevTools -> Memory tab
|
|
555
|
+
// Take heap snapshot, look for detached DOM nodes
|
|
556
|
+
|
|
557
|
+
// React DevTools -> Profiler
|
|
558
|
+
// Identify components with high render time
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
**Solutions:**
|
|
562
|
+
```typescript
|
|
563
|
+
// 1. Memoize expensive computations
|
|
564
|
+
const value = useMemo(() => expensiveCalc(data), [data]);
|
|
565
|
+
|
|
566
|
+
// 2. Use pagination/virtualization
|
|
567
|
+
import { FixedSizeList } from 'react-window';
|
|
568
|
+
|
|
569
|
+
// 3. Clean up subscriptions
|
|
570
|
+
useEffect(() => {
|
|
571
|
+
const subscription = observable.subscribe();
|
|
572
|
+
return () => subscription.unsubscribe();
|
|
573
|
+
}, []);
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
#### Issue: Type errors after database migration
|
|
577
|
+
|
|
578
|
+
**Diagnosis:**
|
|
579
|
+
```bash
|
|
580
|
+
# Database types out of sync
|
|
581
|
+
pnpm type-check
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
**Solution:**
|
|
585
|
+
```bash
|
|
586
|
+
# Regenerate types from database
|
|
587
|
+
pnpm supabase gen types typescript --project-id PROJECT_REF \
|
|
588
|
+
> packages/shared-types/src/database.types.ts
|
|
589
|
+
|
|
590
|
+
# Rebuild packages
|
|
591
|
+
pnpm type-check
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
## Conclusion
|
|
595
|
+
|
|
596
|
+
Technology decisions should be based on:
|
|
597
|
+
|
|
598
|
+
1. **Project requirements** - Current and future needs
|
|
599
|
+
2. **Team expertise** - Learning curve vs productivity
|
|
600
|
+
3. **Ecosystem** - Tooling, community, documentation
|
|
601
|
+
4. **Performance** - Bundle size, runtime overhead
|
|
602
|
+
5. **Maintainability** - Long-term support, upgrade path
|
|
603
|
+
|
|
604
|
+
Current stack rationale:
|
|
605
|
+
- **PostgreSQL (Supabase)**: Multi-tenant RLS, ACID, type-safe
|
|
606
|
+
- **tRPC**: End-to-end type safety, zero codegen
|
|
607
|
+
- **Zustand + Immer**: Minimal boilerplate, excellent DX
|
|
608
|
+
- **Zod**: Type inference, tRPC integration
|
|
609
|
+
- **Tailwind**: Fast development, zero runtime
|
|
610
|
+
- **pnpm**: Monorepo support, fast installs
|
|
611
|
+
- **Vitest**: Vite-native, fast tests
|
|
612
|
+
- **Vercel**: Next.js optimization, edge functions
|