@macpaw/cctk 1.0.0-beta.1
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/License +21 -0
- package/README.md +142 -0
- package/bin/index.js +5 -0
- package/dist/index.js +1 -0
- package/package.json +65 -0
- package/templates/claude/agents/brainstormer.md +113 -0
- package/templates/claude/agents/code-reviewer.md +157 -0
- package/templates/claude/agents/copywriter.md +110 -0
- package/templates/claude/agents/database-admin.md +92 -0
- package/templates/claude/agents/debugger.md +137 -0
- package/templates/claude/agents/docs-manager.md +208 -0
- package/templates/claude/agents/fullstack-developer.md +95 -0
- package/templates/claude/agents/git-manager.md +394 -0
- package/templates/claude/agents/journal-writer.md +113 -0
- package/templates/claude/agents/mcp-manager.md +89 -0
- package/templates/claude/agents/planner.md +108 -0
- package/templates/claude/agents/project-manager.md +125 -0
- package/templates/claude/agents/registry.json +304 -0
- package/templates/claude/agents/researcher.md +37 -0
- package/templates/claude/agents/scout-external.md +140 -0
- package/templates/claude/agents/scout.md +106 -0
- package/templates/claude/agents/tester.md +105 -0
- package/templates/claude/agents/ui-ux-designer.md +208 -0
- package/templates/claude/commands/ask.md +56 -0
- package/templates/claude/commands/bootstrap/auto/fast.md +106 -0
- package/templates/claude/commands/bootstrap/auto/parallel.md +64 -0
- package/templates/claude/commands/bootstrap/auto.md +110 -0
- package/templates/claude/commands/bootstrap.md +130 -0
- package/templates/claude/commands/brainstorm.md +75 -0
- package/templates/claude/commands/code/auto.md +198 -0
- package/templates/claude/commands/code/no-test.md +172 -0
- package/templates/claude/commands/code/parallel.md +100 -0
- package/templates/claude/commands/code.md +197 -0
- package/templates/claude/commands/coding-level.md +37 -0
- package/templates/claude/commands/content/cro.md +41 -0
- package/templates/claude/commands/content/enhance.md +12 -0
- package/templates/claude/commands/content/fast.md +11 -0
- package/templates/claude/commands/content/good.md +14 -0
- package/templates/claude/commands/cook/auto/fast.md +26 -0
- package/templates/claude/commands/cook/auto/parallel.md +49 -0
- package/templates/claude/commands/cook/auto.md +15 -0
- package/templates/claude/commands/cook.md +101 -0
- package/templates/claude/commands/debug.md +13 -0
- package/templates/claude/commands/docs/init.md +37 -0
- package/templates/claude/commands/docs/summarize.md +22 -0
- package/templates/claude/commands/docs/update.md +78 -0
- package/templates/claude/commands/fix/ci.md +17 -0
- package/templates/claude/commands/fix/fast.md +18 -0
- package/templates/claude/commands/fix/hard.md +35 -0
- package/templates/claude/commands/fix/logs.md +26 -0
- package/templates/claude/commands/fix/parallel.md +54 -0
- package/templates/claude/commands/fix/test.md +20 -0
- package/templates/claude/commands/fix/types.md +9 -0
- package/templates/claude/commands/fix/ui.md +33 -0
- package/templates/claude/commands/fix.md +43 -0
- package/templates/claude/commands/git/cm.md +5 -0
- package/templates/claude/commands/git/cp.md +4 -0
- package/templates/claude/commands/git/merge.md +40 -0
- package/templates/claude/commands/git/pr.md +50 -0
- package/templates/claude/commands/journal.md +7 -0
- package/templates/claude/commands/kanban.md +99 -0
- package/templates/claude/commands/plan/archive.md +57 -0
- package/templates/claude/commands/plan/ci.md +33 -0
- package/templates/claude/commands/plan/cro.md +67 -0
- package/templates/claude/commands/plan/fast.md +66 -0
- package/templates/claude/commands/plan/hard.md +92 -0
- package/templates/claude/commands/plan/parallel.md +129 -0
- package/templates/claude/commands/plan/two.md +45 -0
- package/templates/claude/commands/plan/validate.md +117 -0
- package/templates/claude/commands/plan.md +30 -0
- package/templates/claude/commands/preview.md +87 -0
- package/templates/claude/commands/registry.json +313 -0
- package/templates/claude/commands/review/codebase/parallel.md +122 -0
- package/templates/claude/commands/review/codebase.md +47 -0
- package/templates/claude/commands/scout/ext.md +35 -0
- package/templates/claude/commands/scout.md +28 -0
- package/templates/claude/commands/skill/add.md +36 -0
- package/templates/claude/commands/skill/create.md +29 -0
- package/templates/claude/commands/skill/fix-logs.md +22 -0
- package/templates/claude/commands/skill/optimize/auto.md +25 -0
- package/templates/claude/commands/skill/optimize.md +34 -0
- package/templates/claude/commands/skill/plan.md +45 -0
- package/templates/claude/commands/test/ui.md +91 -0
- package/templates/claude/commands/test.md +8 -0
- package/templates/claude/commands/use-mcp.md +34 -0
- package/templates/claude/commands/watzup.md +8 -0
- package/templates/claude/commands/worktree.md +126 -0
- package/templates/claude/hooks/dev-rules-reminder.cjs +258 -0
- package/templates/claude/hooks/docs/README.md +42 -0
- package/templates/claude/hooks/lib/cctk-config-utils.cjs +751 -0
- package/templates/claude/hooks/lib/cctk-paths.cjs +106 -0
- package/templates/claude/hooks/lib/context-tracker.cjs +346 -0
- package/templates/claude/hooks/privacy-block.cjs +289 -0
- package/templates/claude/hooks/registry.json +77 -0
- package/templates/claude/hooks/scout-block/broad-pattern-detector.cjs +293 -0
- package/templates/claude/hooks/scout-block/error-formatter.cjs +156 -0
- package/templates/claude/hooks/scout-block/path-extractor.cjs +359 -0
- package/templates/claude/hooks/scout-block/pattern-matcher.cjs +184 -0
- package/templates/claude/hooks/scout-block/vendor/ignore.js +626 -0
- package/templates/claude/hooks/scout-block.cjs +167 -0
- package/templates/claude/hooks/session-end.cjs +35 -0
- package/templates/claude/hooks/session-init.cjs +214 -0
- package/templates/claude/hooks/subagent-init.cjs +161 -0
- package/templates/claude/hooks/write-compact-marker.cjs +153 -0
- package/templates/claude/output-styles/coding-level-1.md +148 -0
- package/templates/claude/output-styles/coding-level-2.md +159 -0
- package/templates/claude/output-styles/coding-level-3.md +91 -0
- package/templates/claude/scripts/README.md +33 -0
- package/templates/claude/scripts/generate-catalogs.cjs +318 -0
- package/templates/claude/scripts/registry.json +48 -0
- package/templates/claude/scripts/set-active-plan.cjs +45 -0
- package/templates/claude/scripts/validate-docs.cjs +447 -0
- package/templates/claude/scripts/worktree.cjs +658 -0
- package/templates/claude/skills/README.md +112 -0
- package/templates/claude/skills/ai-artist/SKILL.md +75 -0
- package/templates/claude/skills/ai-artist/references/advanced-techniques.md +184 -0
- package/templates/claude/skills/ai-artist/references/domain-code.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-data.md +72 -0
- package/templates/claude/skills/ai-artist/references/domain-marketing.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-patterns.md +33 -0
- package/templates/claude/skills/ai-artist/references/domain-writing.md +68 -0
- package/templates/claude/skills/ai-artist/references/image-prompting.md +141 -0
- package/templates/claude/skills/ai-artist/references/llm-prompting.md +165 -0
- package/templates/claude/skills/ai-artist/references/nano-banana.md +59 -0
- package/templates/claude/skills/ai-artist/references/reasoning-techniques.md +201 -0
- package/templates/claude/skills/backend-development/SKILL.md +95 -0
- package/templates/claude/skills/backend-development/references/backend-api-design.md +495 -0
- package/templates/claude/skills/backend-development/references/backend-architecture.md +454 -0
- package/templates/claude/skills/backend-development/references/backend-authentication.md +338 -0
- package/templates/claude/skills/backend-development/references/backend-code-quality.md +659 -0
- package/templates/claude/skills/backend-development/references/backend-debugging.md +904 -0
- package/templates/claude/skills/backend-development/references/backend-devops.md +494 -0
- package/templates/claude/skills/backend-development/references/backend-mindset.md +387 -0
- package/templates/claude/skills/backend-development/references/backend-performance.md +397 -0
- package/templates/claude/skills/backend-development/references/backend-security.md +290 -0
- package/templates/claude/skills/backend-development/references/backend-technologies.md +256 -0
- package/templates/claude/skills/backend-development/references/backend-testing.md +429 -0
- package/templates/claude/skills/better-auth/SKILL.md +204 -0
- package/templates/claude/skills/better-auth/references/advanced-features.md +553 -0
- package/templates/claude/skills/better-auth/references/database-integration.md +577 -0
- package/templates/claude/skills/better-auth/references/email-password-auth.md +416 -0
- package/templates/claude/skills/better-auth/references/oauth-providers.md +430 -0
- package/templates/claude/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/templates/claude/skills/chrome-devtools/SKILL.md +473 -0
- package/templates/claude/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/templates/claude/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/templates/claude/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/templates/claude/skills/chrome-devtools/scripts/README.md +288 -0
- package/templates/claude/skills/chrome-devtools/scripts/aria-snapshot.js +368 -0
- package/templates/claude/skills/chrome-devtools/scripts/click.js +92 -0
- package/templates/claude/skills/chrome-devtools/scripts/console.js +85 -0
- package/templates/claude/skills/chrome-devtools/scripts/evaluate.js +59 -0
- package/templates/claude/skills/chrome-devtools/scripts/fill.js +84 -0
- package/templates/claude/skills/chrome-devtools/scripts/inject-auth.js +247 -0
- package/templates/claude/skills/chrome-devtools/scripts/install-deps.sh +11 -0
- package/templates/claude/skills/chrome-devtools/scripts/install.sh +36 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/browser.js +335 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/selector.js +183 -0
- package/templates/claude/skills/chrome-devtools/scripts/navigate.js +60 -0
- package/templates/claude/skills/chrome-devtools/scripts/network.js +113 -0
- package/templates/claude/skills/chrome-devtools/scripts/package.json +16 -0
- package/templates/claude/skills/chrome-devtools/scripts/performance.js +159 -0
- package/templates/claude/skills/chrome-devtools/scripts/screenshot.js +212 -0
- package/templates/claude/skills/chrome-devtools/scripts/select-ref.js +151 -0
- package/templates/claude/skills/chrome-devtools/scripts/snapshot.js +143 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-debug.js +47 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-full-debug.js +115 -0
- package/templates/claude/skills/claude-code/references/advanced-features.md +399 -0
- package/templates/claude/skills/claude-code/references/agent-skills.md +399 -0
- package/templates/claude/skills/claude-code/references/api-reference.md +498 -0
- package/templates/claude/skills/claude-code/references/best-practices.md +447 -0
- package/templates/claude/skills/claude-code/references/cicd-integration.md +428 -0
- package/templates/claude/skills/claude-code/references/common-workflows.md +107 -0
- package/templates/claude/skills/claude-code/references/configuration.md +480 -0
- package/templates/claude/skills/claude-code/references/enterprise-features.md +472 -0
- package/templates/claude/skills/claude-code/references/getting-started.md +244 -0
- package/templates/claude/skills/claude-code/references/hooks-and-plugins.md +444 -0
- package/templates/claude/skills/claude-code/references/hooks-comprehensive.md +622 -0
- package/templates/claude/skills/claude-code/references/ide-integration.md +316 -0
- package/templates/claude/skills/claude-code/references/mcp-integration.md +386 -0
- package/templates/claude/skills/claude-code/references/slash-commands.md +460 -0
- package/templates/claude/skills/claude-code/references/troubleshooting.md +455 -0
- package/templates/claude/skills/claude-code/skill.md +60 -0
- package/templates/claude/skills/code-review/SKILL.md +143 -0
- package/templates/claude/skills/code-review/references/code-review-reception.md +209 -0
- package/templates/claude/skills/code-review/references/requesting-code-review.md +105 -0
- package/templates/claude/skills/code-review/references/verification-before-completion.md +139 -0
- package/templates/claude/skills/context-engineering/SKILL.md +86 -0
- package/templates/claude/skills/context-engineering/references/context-compression.md +84 -0
- package/templates/claude/skills/context-engineering/references/context-degradation.md +93 -0
- package/templates/claude/skills/context-engineering/references/context-fundamentals.md +75 -0
- package/templates/claude/skills/context-engineering/references/context-optimization.md +82 -0
- package/templates/claude/skills/context-engineering/references/evaluation.md +89 -0
- package/templates/claude/skills/context-engineering/references/memory-systems.md +88 -0
- package/templates/claude/skills/context-engineering/references/multi-agent-patterns.md +90 -0
- package/templates/claude/skills/context-engineering/references/project-development.md +97 -0
- package/templates/claude/skills/context-engineering/references/tool-design.md +86 -0
- package/templates/claude/skills/context-engineering/scripts/compression_evaluator.py +329 -0
- package/templates/claude/skills/context-engineering/scripts/context_analyzer.py +294 -0
- package/templates/claude/skills/databases/SKILL.md +232 -0
- package/templates/claude/skills/databases/references/mongodb-aggregation.md +447 -0
- package/templates/claude/skills/databases/references/mongodb-atlas.md +465 -0
- package/templates/claude/skills/databases/references/mongodb-crud.md +408 -0
- package/templates/claude/skills/databases/references/mongodb-indexing.md +442 -0
- package/templates/claude/skills/databases/references/postgresql-administration.md +594 -0
- package/templates/claude/skills/databases/references/postgresql-performance.md +527 -0
- package/templates/claude/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/templates/claude/skills/databases/references/postgresql-queries.md +475 -0
- package/templates/claude/skills/databases/scripts/db_backup.py +502 -0
- package/templates/claude/skills/databases/scripts/db_migrate.py +414 -0
- package/templates/claude/skills/databases/scripts/db_performance_check.py +445 -0
- package/templates/claude/skills/debugging/SKILL.md +84 -0
- package/templates/claude/skills/debugging/references/defense-in-depth.md +124 -0
- package/templates/claude/skills/debugging/references/root-cause-tracing.md +122 -0
- package/templates/claude/skills/debugging/references/systematic-debugging.md +102 -0
- package/templates/claude/skills/debugging/references/verification.md +123 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.sh +63 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/templates/claude/skills/devops/SKILL.md +293 -0
- package/templates/claude/skills/devops/references/browser-rendering.md +305 -0
- package/templates/claude/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/templates/claude/skills/devops/references/cloudflare-platform.md +271 -0
- package/templates/claude/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/templates/claude/skills/devops/references/docker-basics.md +297 -0
- package/templates/claude/skills/devops/references/docker-compose.md +292 -0
- package/templates/claude/skills/devops/references/gcloud-platform.md +307 -0
- package/templates/claude/skills/devops/references/gcloud-services.md +304 -0
- package/templates/claude/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/templates/claude/skills/devops/scripts/docker_optimize.py +320 -0
- package/templates/claude/skills/docs-seeker/SKILL.md +95 -0
- package/templates/claude/skills/docs-seeker/package.json +24 -0
- package/templates/claude/skills/docs-seeker/references/advanced.md +78 -0
- package/templates/claude/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/templates/claude/skills/docs-seeker/references/errors.md +68 -0
- package/templates/claude/skills/docs-seeker/scripts/analyze-llms-txt.js +245 -0
- package/templates/claude/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/templates/claude/skills/docs-seeker/scripts/fetch-docs.js +212 -0
- package/templates/claude/skills/docs-seeker/workflows/library-search.md +87 -0
- package/templates/claude/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/templates/claude/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/templates/claude/skills/frontend-design/SKILL.md +85 -0
- package/templates/claude/skills/frontend-design/references/analysis-best-practices.md +80 -0
- package/templates/claude/skills/frontend-design/references/analysis-prompts.md +141 -0
- package/templates/claude/skills/frontend-design/references/analysis-techniques.md +118 -0
- package/templates/claude/skills/frontend-design/references/animejs.md +396 -0
- package/templates/claude/skills/frontend-design/references/design-extraction-overview.md +71 -0
- package/templates/claude/skills/frontend-design/references/extraction-best-practices.md +141 -0
- package/templates/claude/skills/frontend-design/references/extraction-output-templates.md +162 -0
- package/templates/claude/skills/frontend-design/references/extraction-prompts.md +127 -0
- package/templates/claude/skills/frontend-design/references/technical-accessibility.md +119 -0
- package/templates/claude/skills/frontend-design/references/technical-best-practices.md +97 -0
- package/templates/claude/skills/frontend-design/references/technical-optimization.md +44 -0
- package/templates/claude/skills/frontend-design/references/technical-overview.md +90 -0
- package/templates/claude/skills/frontend-design/references/technical-workflows.md +150 -0
- package/templates/claude/skills/frontend-design/references/visual-analysis-overview.md +95 -0
- package/templates/claude/skills/frontend-development/SKILL.md +399 -0
- package/templates/claude/skills/frontend-development/resources/common-patterns.md +331 -0
- package/templates/claude/skills/frontend-development/resources/complete-examples.md +872 -0
- package/templates/claude/skills/frontend-development/resources/component-patterns.md +502 -0
- package/templates/claude/skills/frontend-development/resources/data-fetching.md +767 -0
- package/templates/claude/skills/frontend-development/resources/file-organization.md +502 -0
- package/templates/claude/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/templates/claude/skills/frontend-development/resources/performance.md +406 -0
- package/templates/claude/skills/frontend-development/resources/routing-guide.md +364 -0
- package/templates/claude/skills/frontend-development/resources/styling-guide.md +428 -0
- package/templates/claude/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/templates/claude/skills/markdown-novel-viewer/SKILL.md +272 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/novel-theme.css +872 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/reader.js +378 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/template.html +85 -0
- package/templates/claude/skills/markdown-novel-viewer/package.json +15 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/server.cjs +398 -0
- package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
- package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/templates/claude/skills/mcp-builder/scripts/evaluation.py +381 -0
- package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/templates/claude/skills/mcp-management/README.md +219 -0
- package/templates/claude/skills/mcp-management/SKILL.md +209 -0
- package/templates/claude/skills/mcp-management/assets/tools.json +3146 -0
- package/templates/claude/skills/mcp-management/references/configuration.md +114 -0
- package/templates/claude/skills/mcp-management/references/gemini-cli-integration.md +209 -0
- package/templates/claude/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/templates/claude/skills/mcp-management/scripts/.env.example +10 -0
- package/templates/claude/skills/mcp-management/scripts/cli.ts +202 -0
- package/templates/claude/skills/mcp-management/scripts/mcp-client.ts +247 -0
- package/templates/claude/skills/mcp-management/scripts/package.json +20 -0
- package/templates/claude/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/templates/claude/skills/media-processing/SKILL.md +91 -0
- package/templates/claude/skills/media-processing/references/common-workflows.md +132 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-streaming.md +395 -0
- package/templates/claude/skills/media-processing/references/format-compatibility.md +375 -0
- package/templates/claude/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/templates/claude/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/templates/claude/skills/media-processing/references/rmbg-background-removal.md +66 -0
- package/templates/claude/skills/media-processing/references/troubleshooting.md +109 -0
- package/templates/claude/skills/media-processing/scripts/README.md +102 -0
- package/templates/claude/skills/media-processing/scripts/batch-remove-background.sh +124 -0
- package/templates/claude/skills/media-processing/scripts/batch_resize.py +342 -0
- package/templates/claude/skills/media-processing/scripts/media_convert.py +311 -0
- package/templates/claude/skills/media-processing/scripts/remove-background.sh +96 -0
- package/templates/claude/skills/media-processing/scripts/remove-bg-node.js +181 -0
- package/templates/claude/skills/mermaidjs-v11/SKILL.md +115 -0
- package/templates/claude/skills/mermaidjs-v11/references/cli-usage.md +228 -0
- package/templates/claude/skills/mermaidjs-v11/references/configuration.md +232 -0
- package/templates/claude/skills/mermaidjs-v11/references/diagram-types.md +315 -0
- package/templates/claude/skills/mermaidjs-v11/references/examples.md +344 -0
- package/templates/claude/skills/mermaidjs-v11/references/integration.md +310 -0
- package/templates/claude/skills/planning/SKILL.md +115 -0
- package/templates/claude/skills/planning/references/codebase-understanding.md +62 -0
- package/templates/claude/skills/planning/references/output-standards.md +127 -0
- package/templates/claude/skills/planning/references/plan-organization.md +150 -0
- package/templates/claude/skills/planning/references/research-phase.md +49 -0
- package/templates/claude/skills/planning/references/solution-design.md +63 -0
- package/templates/claude/skills/plans-kanban/SKILL.md +157 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard-template.html +119 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.css +1594 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.js +659 -0
- package/templates/claude/skills/plans-kanban/assets/favicon.png +0 -0
- package/templates/claude/skills/plans-kanban/package.json +13 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +941 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-parser.cjs +194 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-scanner.cjs +277 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
- package/templates/claude/skills/plans-kanban/scripts/server.cjs +249 -0
- package/templates/claude/skills/problem-solving/SKILL.md +96 -0
- package/templates/claude/skills/problem-solving/references/attribution.md +69 -0
- package/templates/claude/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/templates/claude/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/templates/claude/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/templates/claude/skills/problem-solving/references/scale-game.md +95 -0
- package/templates/claude/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/templates/claude/skills/problem-solving/references/when-stuck.md +72 -0
- package/templates/claude/skills/registry.json +258 -0
- package/templates/claude/skills/repomix/SKILL.md +247 -0
- package/templates/claude/skills/repomix/references/configuration.md +211 -0
- package/templates/claude/skills/repomix/references/usage-patterns.md +232 -0
- package/templates/claude/skills/repomix/scripts/README.md +179 -0
- package/templates/claude/skills/repomix/scripts/repomix_batch.py +455 -0
- package/templates/claude/skills/repomix/scripts/repos.example.json +15 -0
- package/templates/claude/skills/research/SKILL.md +168 -0
- package/templates/claude/skills/sequential-thinking/.env.example +8 -0
- package/templates/claude/skills/sequential-thinking/README.md +183 -0
- package/templates/claude/skills/sequential-thinking/SKILL.md +94 -0
- package/templates/claude/skills/sequential-thinking/package.json +31 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/templates/claude/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/templates/claude/skills/sequential-thinking/references/examples-api.md +88 -0
- package/templates/claude/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/templates/claude/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/templates/claude/skills/sequential-thinking/scripts/format-thought.js +182 -0
- package/templates/claude/skills/sequential-thinking/scripts/process-thought.js +252 -0
- package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
- package/templates/claude/skills/skill-creator/SKILL.md +266 -0
- package/templates/claude/skills/skill-creator/references/agent-skills-spec.md +51 -0
- package/templates/claude/skills/skill-creator/scripts/encoding_utils.py +21 -0
- package/templates/claude/skills/skill-creator/scripts/init_skill.py +304 -0
- package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/templates/claude/skills/skill-creator/scripts/quick_validate.py +66 -0
- package/templates/claude/skills/template-skill/SKILL.md +6 -0
- package/templates/claude/skills/vitest/SKILL.md +595 -0
- package/templates/claude/skills/vitest/references/async-patterns.md +82 -0
- package/templates/claude/skills/vitest/references/mock-patterns.md +78 -0
- package/templates/claude/skills/vitest/references/monorepo-setup.md +185 -0
- package/templates/claude/skills/vitest/references/turborepo-setup.md +332 -0
- package/templates/claude/skills/web-frameworks/SKILL.md +324 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/templates/claude/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/templates/claude/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/templates/claude/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/templates/claude/workflows/development-rules.md +40 -0
- package/templates/claude/workflows/documentation-management.md +121 -0
- package/templates/claude/workflows/orchestration-protocol.md +16 -0
- package/templates/claude/workflows/primary-workflow.md +45 -0
- package/templates/claude/workflows/registry.json +37 -0
- package/templates/common/.cct.json +41 -0
- package/templates/common/.cctkignore +22 -0
- package/templates/common/.env.example +39 -0
- package/templates/common/.mcp.json.example +16 -0
- package/templates/common/metadata.json +15 -0
- package/templates/common/settings.json +79 -0
- package/templates/common/statusline.cjs +271 -0
- package/templates/config/.repomixignore +22 -0
- package/templates/config/AGENTS.md +55 -0
- package/templates/config/CLAUDE.md +87 -0
- package/templates/plans/bug-fix-template.md +69 -0
- package/templates/plans/feature-implementation-template.md +84 -0
- package/templates/plans/refactor-template.md +82 -0
- package/templates/plans/template-usage-guide.md +58 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
# Next.js Server Components
|
|
2
|
+
|
|
3
|
+
React Server Components (RSC) architecture, patterns, and best practices.
|
|
4
|
+
|
|
5
|
+
## Core Concepts
|
|
6
|
+
|
|
7
|
+
### Server Components (Default)
|
|
8
|
+
|
|
9
|
+
All components in `app/` directory are Server Components by default:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
// app/posts/page.tsx - Server Component
|
|
13
|
+
async function getPosts() {
|
|
14
|
+
const res = await fetch('https://api.example.com/posts')
|
|
15
|
+
return res.json()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default async function PostsPage() {
|
|
19
|
+
const posts = await getPosts()
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div>
|
|
23
|
+
{posts.map(post => (
|
|
24
|
+
<article key={post.id}>{post.title}</article>
|
|
25
|
+
))}
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Benefits:**
|
|
32
|
+
- Fetch data on server (direct database access)
|
|
33
|
+
- Keep sensitive data/keys on server
|
|
34
|
+
- Reduce client-side JavaScript bundle
|
|
35
|
+
- Improve initial page load and SEO
|
|
36
|
+
- Cache results on server
|
|
37
|
+
- Stream content to client
|
|
38
|
+
|
|
39
|
+
**Limitations:**
|
|
40
|
+
- Cannot use React hooks (useState, useEffect, useContext)
|
|
41
|
+
- Cannot use browser APIs (window, localStorage)
|
|
42
|
+
- Cannot add event listeners (onClick, onChange)
|
|
43
|
+
- Cannot use React class components
|
|
44
|
+
|
|
45
|
+
### Client Components
|
|
46
|
+
|
|
47
|
+
Mark with `'use client'` directive at top of file:
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// components/counter.tsx - Client Component
|
|
51
|
+
'use client'
|
|
52
|
+
|
|
53
|
+
import { useState } from 'react'
|
|
54
|
+
|
|
55
|
+
export function Counter() {
|
|
56
|
+
const [count, setCount] = useState(0)
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<button onClick={() => setCount(count + 1)}>
|
|
60
|
+
Count: {count}
|
|
61
|
+
</button>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Use Client Components for:**
|
|
67
|
+
- Interactive UI (event handlers)
|
|
68
|
+
- State management (useState, useReducer)
|
|
69
|
+
- Effects (useEffect, useLayoutEffect)
|
|
70
|
+
- Browser-only APIs (localStorage, geolocation)
|
|
71
|
+
- Custom React hooks
|
|
72
|
+
- Context consumers
|
|
73
|
+
|
|
74
|
+
## Composition Patterns
|
|
75
|
+
|
|
76
|
+
### Server Component as Wrapper
|
|
77
|
+
|
|
78
|
+
Best practice: Keep Server Components as parent, pass Client Components as children:
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
// app/page.tsx - Server Component
|
|
82
|
+
import { ClientSidebar } from './sidebar'
|
|
83
|
+
import { ClientButton } from './button'
|
|
84
|
+
|
|
85
|
+
export default async function Page() {
|
|
86
|
+
const data = await fetchData() // Server-side data fetch
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div>
|
|
90
|
+
<h1>Server-rendered heading</h1>
|
|
91
|
+
<ClientSidebar />
|
|
92
|
+
<ClientButton />
|
|
93
|
+
<p>More server-rendered content: {data.title}</p>
|
|
94
|
+
</div>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Passing Server Components to Client Components
|
|
100
|
+
|
|
101
|
+
Use children pattern to avoid making entire tree client-side:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
// app/page.tsx - Server Component
|
|
105
|
+
import { ClientProvider } from './client-provider'
|
|
106
|
+
import { ServerContent } from './server-content'
|
|
107
|
+
|
|
108
|
+
export default function Page() {
|
|
109
|
+
return (
|
|
110
|
+
<ClientProvider>
|
|
111
|
+
<ServerContent /> {/* Stays as Server Component */}
|
|
112
|
+
</ClientProvider>
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// client-provider.tsx - Client Component
|
|
117
|
+
'use client'
|
|
118
|
+
|
|
119
|
+
export function ClientProvider({ children }: { children: React.ReactNode }) {
|
|
120
|
+
const [state, setState] = useState()
|
|
121
|
+
|
|
122
|
+
return <div>{children}</div>
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// server-content.tsx - Server Component
|
|
126
|
+
export async function ServerContent() {
|
|
127
|
+
const data = await fetchData()
|
|
128
|
+
return <p>{data.content}</p>
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Sharing Data Between Server Components
|
|
133
|
+
|
|
134
|
+
No need for props or context - just fetch data where needed:
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
// lib/data.ts
|
|
138
|
+
export async function getUser() {
|
|
139
|
+
const res = await fetch('https://api.example.com/user', {
|
|
140
|
+
cache: 'force-cache' // Will dedupe automatically
|
|
141
|
+
})
|
|
142
|
+
return res.json()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// app/header.tsx
|
|
146
|
+
import { getUser } from '@/lib/data'
|
|
147
|
+
|
|
148
|
+
export async function Header() {
|
|
149
|
+
const user = await getUser() // Fetch 1
|
|
150
|
+
return <div>Welcome, {user.name}</div>
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// app/profile.tsx
|
|
154
|
+
import { getUser } from '@/lib/data'
|
|
155
|
+
|
|
156
|
+
export async function Profile() {
|
|
157
|
+
const user = await getUser() // Fetch 2 (deduped automatically)
|
|
158
|
+
return <div>Email: {user.email}</div>
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Next.js automatically dedupes identical fetch requests during render.
|
|
163
|
+
|
|
164
|
+
## Async Components
|
|
165
|
+
|
|
166
|
+
Server Components can be async functions:
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
// app/posts/[id]/page.tsx
|
|
170
|
+
async function getPost(id: string) {
|
|
171
|
+
const res = await fetch(`https://api.example.com/posts/${id}`)
|
|
172
|
+
return res.json()
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function getComments(postId: string) {
|
|
176
|
+
const res = await fetch(`https://api.example.com/posts/${postId}/comments`)
|
|
177
|
+
return res.json()
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export default async function Post({ params }: { params: { id: string } }) {
|
|
181
|
+
// Parallel data fetching
|
|
182
|
+
const [post, comments] = await Promise.all([
|
|
183
|
+
getPost(params.id),
|
|
184
|
+
getComments(params.id)
|
|
185
|
+
])
|
|
186
|
+
|
|
187
|
+
return (
|
|
188
|
+
<article>
|
|
189
|
+
<h1>{post.title}</h1>
|
|
190
|
+
<p>{post.content}</p>
|
|
191
|
+
<CommentsList comments={comments} />
|
|
192
|
+
</article>
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Streaming with Suspense
|
|
198
|
+
|
|
199
|
+
Stream components as they resolve:
|
|
200
|
+
|
|
201
|
+
```tsx
|
|
202
|
+
// app/page.tsx
|
|
203
|
+
import { Suspense } from 'react'
|
|
204
|
+
|
|
205
|
+
async function SlowComponent() {
|
|
206
|
+
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
207
|
+
return <div>Loaded after 3 seconds</div>
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function FastComponent() {
|
|
211
|
+
await new Promise(resolve => setTimeout(resolve, 500))
|
|
212
|
+
return <div>Loaded after 0.5 seconds</div>
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export default function Page() {
|
|
216
|
+
return (
|
|
217
|
+
<div>
|
|
218
|
+
<h1>Instant heading</h1>
|
|
219
|
+
|
|
220
|
+
<Suspense fallback={<div>Loading fast...</div>}>
|
|
221
|
+
<FastComponent />
|
|
222
|
+
</Suspense>
|
|
223
|
+
|
|
224
|
+
<Suspense fallback={<div>Loading slow...</div>}>
|
|
225
|
+
<SlowComponent />
|
|
226
|
+
</Suspense>
|
|
227
|
+
</div>
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Benefits:
|
|
233
|
+
- Fast components render immediately
|
|
234
|
+
- Slow components don't block page
|
|
235
|
+
- Progressive enhancement
|
|
236
|
+
- Better perceived performance
|
|
237
|
+
|
|
238
|
+
## Context in Server/Client Components
|
|
239
|
+
|
|
240
|
+
### Problem: Context Requires Client Components
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
// ❌ Won't work - Server Components can't use context
|
|
244
|
+
import { createContext } from 'react'
|
|
245
|
+
|
|
246
|
+
const ThemeContext = createContext()
|
|
247
|
+
|
|
248
|
+
export default function Layout({ children }) {
|
|
249
|
+
return (
|
|
250
|
+
<ThemeContext.Provider value="dark">
|
|
251
|
+
{children}
|
|
252
|
+
</ThemeContext.Provider>
|
|
253
|
+
)
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Solution: Create Client Component Wrapper
|
|
258
|
+
|
|
259
|
+
```tsx
|
|
260
|
+
// app/providers.tsx - Client Component
|
|
261
|
+
'use client'
|
|
262
|
+
|
|
263
|
+
import { createContext, useContext } from 'react'
|
|
264
|
+
|
|
265
|
+
const ThemeContext = createContext('light')
|
|
266
|
+
|
|
267
|
+
export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
|
268
|
+
return (
|
|
269
|
+
<ThemeContext.Provider value="dark">
|
|
270
|
+
{children}
|
|
271
|
+
</ThemeContext.Provider>
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export function useTheme() {
|
|
276
|
+
return useContext(ThemeContext)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// app/layout.tsx - Server Component
|
|
280
|
+
import { ThemeProvider } from './providers'
|
|
281
|
+
|
|
282
|
+
export default function RootLayout({ children }) {
|
|
283
|
+
return (
|
|
284
|
+
<html>
|
|
285
|
+
<body>
|
|
286
|
+
<ThemeProvider>
|
|
287
|
+
{children}
|
|
288
|
+
</ThemeProvider>
|
|
289
|
+
</body>
|
|
290
|
+
</html>
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Third-Party Component Integration
|
|
296
|
+
|
|
297
|
+
Many third-party components need client-side features:
|
|
298
|
+
|
|
299
|
+
```tsx
|
|
300
|
+
// components/carousel.tsx
|
|
301
|
+
'use client'
|
|
302
|
+
|
|
303
|
+
import 'slick-carousel/slick/slick.css'
|
|
304
|
+
import Slider from 'react-slick'
|
|
305
|
+
|
|
306
|
+
export function Carousel({ children }) {
|
|
307
|
+
return <Slider>{children}</Slider>
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// app/page.tsx - Server Component
|
|
311
|
+
import { Carousel } from '@/components/carousel'
|
|
312
|
+
|
|
313
|
+
export default function Page() {
|
|
314
|
+
return (
|
|
315
|
+
<Carousel>
|
|
316
|
+
<div>Slide 1</div>
|
|
317
|
+
<div>Slide 2</div>
|
|
318
|
+
</Carousel>
|
|
319
|
+
)
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Server Actions
|
|
324
|
+
|
|
325
|
+
Call server-side functions from Client Components:
|
|
326
|
+
|
|
327
|
+
```tsx
|
|
328
|
+
// app/actions.ts
|
|
329
|
+
'use server'
|
|
330
|
+
|
|
331
|
+
import { revalidatePath } from 'next/cache'
|
|
332
|
+
import { db } from '@/lib/db'
|
|
333
|
+
|
|
334
|
+
export async function createPost(formData: FormData) {
|
|
335
|
+
const title = formData.get('title') as string
|
|
336
|
+
const content = formData.get('content') as string
|
|
337
|
+
|
|
338
|
+
await db.post.create({
|
|
339
|
+
data: { title, content }
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
revalidatePath('/posts')
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// app/new-post/page.tsx
|
|
346
|
+
import { createPost } from '@/app/actions'
|
|
347
|
+
|
|
348
|
+
export default function NewPost() {
|
|
349
|
+
return (
|
|
350
|
+
<form action={createPost}>
|
|
351
|
+
<input name="title" required />
|
|
352
|
+
<textarea name="content" required />
|
|
353
|
+
<button type="submit">Create Post</button>
|
|
354
|
+
</form>
|
|
355
|
+
)
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
With Client Component:
|
|
360
|
+
```tsx
|
|
361
|
+
// components/post-form.tsx
|
|
362
|
+
'use client'
|
|
363
|
+
|
|
364
|
+
import { createPost } from '@/app/actions'
|
|
365
|
+
import { useFormStatus } from 'react-dom'
|
|
366
|
+
|
|
367
|
+
function SubmitButton() {
|
|
368
|
+
const { pending } = useFormStatus()
|
|
369
|
+
return (
|
|
370
|
+
<button type="submit" disabled={pending}>
|
|
371
|
+
{pending ? 'Creating...' : 'Create Post'}
|
|
372
|
+
</button>
|
|
373
|
+
)
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
export function PostForm() {
|
|
377
|
+
return (
|
|
378
|
+
<form action={createPost}>
|
|
379
|
+
<input name="title" required />
|
|
380
|
+
<textarea name="content" required />
|
|
381
|
+
<SubmitButton />
|
|
382
|
+
</form>
|
|
383
|
+
)
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## When to Use Each Component Type
|
|
388
|
+
|
|
389
|
+
### Use Server Components When:
|
|
390
|
+
- Fetching data from database or API
|
|
391
|
+
- Accessing backend resources directly
|
|
392
|
+
- Keeping sensitive information on server (tokens, keys)
|
|
393
|
+
- Reducing client-side JavaScript
|
|
394
|
+
- Rendering static content
|
|
395
|
+
- No interactivity needed
|
|
396
|
+
|
|
397
|
+
### Use Client Components When:
|
|
398
|
+
- Adding interactivity (onClick, onChange)
|
|
399
|
+
- Managing state (useState, useReducer)
|
|
400
|
+
- Using lifecycle effects (useEffect)
|
|
401
|
+
- Using browser-only APIs (localStorage, navigator)
|
|
402
|
+
- Using custom React hooks
|
|
403
|
+
- Using React Context
|
|
404
|
+
- Using third-party libraries requiring client features
|
|
405
|
+
|
|
406
|
+
## Best Practices
|
|
407
|
+
|
|
408
|
+
1. **Default to Server Components** - Only use 'use client' when needed
|
|
409
|
+
2. **Move Client Components to leaves** - Keep them as deep as possible in tree
|
|
410
|
+
3. **Pass Server Components as children** - Avoid turning entire trees client-side
|
|
411
|
+
4. **Share data via fetch** - Let Next.js dedupe requests automatically
|
|
412
|
+
5. **Use Suspense for streaming** - Improve perceived performance
|
|
413
|
+
6. **Separate client logic** - Extract client-only code to separate files
|
|
414
|
+
7. **Minimize client bundle** - Less JavaScript = faster page loads
|
|
415
|
+
|
|
416
|
+
## Common Patterns
|
|
417
|
+
|
|
418
|
+
### Protected Content
|
|
419
|
+
|
|
420
|
+
```tsx
|
|
421
|
+
// app/dashboard/page.tsx - Server Component
|
|
422
|
+
import { redirect } from 'next/navigation'
|
|
423
|
+
import { getUser } from '@/lib/auth'
|
|
424
|
+
|
|
425
|
+
export default async function Dashboard() {
|
|
426
|
+
const user = await getUser()
|
|
427
|
+
|
|
428
|
+
if (!user) {
|
|
429
|
+
redirect('/login')
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return <div>Welcome, {user.name}</div>
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### Optimistic Updates
|
|
437
|
+
|
|
438
|
+
```tsx
|
|
439
|
+
// components/like-button.tsx
|
|
440
|
+
'use client'
|
|
441
|
+
|
|
442
|
+
import { useOptimistic } from 'react'
|
|
443
|
+
import { likePost } from '@/app/actions'
|
|
444
|
+
|
|
445
|
+
export function LikeButton({ postId, initialLikes }) {
|
|
446
|
+
const [optimisticLikes, addOptimisticLike] = useOptimistic(
|
|
447
|
+
initialLikes,
|
|
448
|
+
(state, amount) => state + amount
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
return (
|
|
452
|
+
<button
|
|
453
|
+
onClick={async () => {
|
|
454
|
+
addOptimisticLike(1)
|
|
455
|
+
await likePost(postId)
|
|
456
|
+
}}
|
|
457
|
+
>
|
|
458
|
+
Likes: {optimisticLikes}
|
|
459
|
+
</button>
|
|
460
|
+
)
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Loading States with Streaming
|
|
465
|
+
|
|
466
|
+
```tsx
|
|
467
|
+
// app/dashboard/page.tsx
|
|
468
|
+
import { Suspense } from 'react'
|
|
469
|
+
|
|
470
|
+
async function RevenueChart() {
|
|
471
|
+
const data = await fetchRevenue() // Slow query
|
|
472
|
+
return <Chart data={data} />
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
async function RecentSales() {
|
|
476
|
+
const sales = await fetchSales() // Fast query
|
|
477
|
+
return <SalesTable sales={sales} />
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export default function Dashboard() {
|
|
481
|
+
return (
|
|
482
|
+
<div>
|
|
483
|
+
<h1>Dashboard</h1>
|
|
484
|
+
|
|
485
|
+
<Suspense fallback={<ChartSkeleton />}>
|
|
486
|
+
<RevenueChart />
|
|
487
|
+
</Suspense>
|
|
488
|
+
|
|
489
|
+
<Suspense fallback={<TableSkeleton />}>
|
|
490
|
+
<RecentSales />
|
|
491
|
+
</Suspense>
|
|
492
|
+
</div>
|
|
493
|
+
)
|
|
494
|
+
}
|
|
495
|
+
```
|