memory-journal-mcp 7.7.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: next-best-practices
|
|
3
|
+
description: Next.js and React performance optimization best practices - file conventions, RSC boundaries, data patterns, async APIs, Core Web Vitals, and bundle size. NOT for granular component caching strategies (use next-cache-components).
|
|
4
|
+
user-invocable: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Next.js Best Practices
|
|
8
|
+
|
|
9
|
+
Apply these rules when writing or reviewing Next.js code.
|
|
10
|
+
|
|
11
|
+
## Auto-Load Mechanism
|
|
12
|
+
|
|
13
|
+
This skill is configured with `user-invocable: false` to avoid trigger collisions with other Next.js/React skills. It acts as an implicit dependency that provides detailed file convention and RSC rules when navigating Next.js architectures.
|
|
14
|
+
|
|
15
|
+
## 1. File Conventions & Routing
|
|
16
|
+
|
|
17
|
+
- **App Router**: Always use the `app/` directory.
|
|
18
|
+
- **Middleware**: Use `middleware.ts` at the root for routing logic.
|
|
19
|
+
- **Parallel/Intercepting**: Use `@folder` for parallel routes and `(.)` for intercepting routes (e.g. modals).
|
|
20
|
+
- **Default**: Use `default.tsx` for fallbacks in parallel routes.
|
|
21
|
+
|
|
22
|
+
## 2. RSC Boundaries & Directives
|
|
23
|
+
|
|
24
|
+
- **Directives**: Use `'use client'` strictly at the boundary where client interactivity/hooks are required. Use `'use server'` for Server Actions.
|
|
25
|
+
- **Caching**: Use `'use cache'` (Next.js 15+) for caching functions or components.
|
|
26
|
+
- **Async Client Components**: Async React Client Components are invalid. You cannot `await` inside a Client Component; use `use(promise)` instead.
|
|
27
|
+
- **Serialization**: Props passed from Server to Client components must be serializable (no classes/functions without Server Actions).
|
|
28
|
+
|
|
29
|
+
## 3. Async APIs (Next.js 15+)
|
|
30
|
+
|
|
31
|
+
- **Dynamic APIs**: `params`, `searchParams`, `cookies()`, and `headers()` are now ASYNC and must be `await`ed before use.
|
|
32
|
+
- **Route Handlers**: The `request` object in Route Handlers should be used carefully; prefer Server Actions for mutations.
|
|
33
|
+
|
|
34
|
+
## 4. Functions & Error Handling
|
|
35
|
+
|
|
36
|
+
- **Navigation**: Use `useRouter()`, `usePathname()`, `useSearchParams()`, `useParams()` from `next/navigation`.
|
|
37
|
+
- **Errors**: Use `error.tsx` for React error boundaries. Use `redirect()` or `notFound()` for control flow.
|
|
38
|
+
- **Catch Blocks**: Use `unstable_rethrow` inside generic catch blocks to avoid catching internal Next.js thrown errors (like redirect).
|
|
39
|
+
|
|
40
|
+
## 5. Data Patterns
|
|
41
|
+
|
|
42
|
+
- **Waterfalls**: Avoid data waterfalls by using `Promise.all()` for independent fetches, or preloading data.
|
|
43
|
+
- **Client Fetching**: Use SWR or React Query for client-side data fetching. Do not use `useEffect` for data fetching.
|
|
44
|
+
|
|
45
|
+
## 6. Optimizations
|
|
46
|
+
|
|
47
|
+
- **Images**: Always use `next/image` (`<Image>`) with `sizes` for responsiveness and `priority` for LCP images.
|
|
48
|
+
- **Fonts**: Use `next/font/google` or `next/font/local` to avoid CLS.
|
|
49
|
+
- **Scripts**: Use `next/script` (`<Script>`) with appropriate `strategy` (e.g. `afterInteractive`).
|
|
50
|
+
- **Bundling**: Avoid barrel files (`index.ts` re-exporting everything) to improve bundle size and tree-shaking.
|
|
51
|
+
|
|
52
|
+
## 7. Security (Critical)
|
|
53
|
+
|
|
54
|
+
- **SSRF Prevention**: Never pass unsanitized user input directly to `fetch()` URLs in Server Components or Route Handlers. Always validate and sanitize input, and construct URLs using the `URL` API.
|
|
55
|
+
- **Cache Data Leaks**: Be extremely careful with Next.js aggressive caching. Never use `fetch()` without `{ cache: 'no-store' }` or similar cache opt-outs when fetching user-specific or sensitive data.
|
|
56
|
+
- **Server Actions**: Always verify authorization and re-validate inputs inside Server Actions. They are public API endpoints, even if they look like internal functions.
|
|
57
|
+
|
|
58
|
+
## 8. React Performance Guidelines (Vercel)
|
|
59
|
+
|
|
60
|
+
Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.
|
|
61
|
+
|
|
62
|
+
### Priority 1: Eliminating Waterfalls (CRITICAL)
|
|
63
|
+
|
|
64
|
+
- **`async-defer-await`**: Move `await` into branches where the data is actually used. Do not block the rendering of an entire component tree if only a deeply nested child requires the awaited data.
|
|
65
|
+
|
|
66
|
+
### Priority 2: Bundle Size Optimization (CRITICAL)
|
|
67
|
+
|
|
68
|
+
- **`bundle-barrel-imports`**: Avoid barrel files (`index.ts`). Import directly from submodules (e.g., `import { Button } from '@/components/ui/button'` instead of `import { Button } from '@/components'`).
|
|
69
|
+
|
|
70
|
+
### Priority 3: Server-Side Performance (HIGH)
|
|
71
|
+
|
|
72
|
+
- **`server-auth-actions`**: Explicitly authenticate all Server Actions and API routes. Do not assume context is protected just because it's called from a protected UI component.
|
|
73
|
+
|
|
74
|
+
### Priority 4: Client-Side Data Fetching (MEDIUM-HIGH)
|
|
75
|
+
|
|
76
|
+
- **`client-swr-dedup`**: Use `SWR` or React Query for automatic request deduplication on the client instead of raw `useEffect` fetches.
|
|
77
|
+
|
|
78
|
+
### Priority 5: Re-render Optimization (MEDIUM)
|
|
79
|
+
|
|
80
|
+
- **`rerender-defer-reads`**: Do not subscribe to state variables if they are only used inside an event callback. Use `useRef` for mutable values that do not require re-renders.
|
|
81
|
+
|
|
82
|
+
### Priority 6: Rendering Performance (MEDIUM)
|
|
83
|
+
|
|
84
|
+
- **`rendering-animate-svg-wrapper`**: When animating SVGs, animate the wrapping `div` instead of the internal SVG DOM nodes to leverage GPU acceleration.
|
|
85
|
+
|
|
86
|
+
_(For deeper details, consult the `references/_.md`and`rules/_.md` files when needed)._
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Cache Component Examples & Deep Dives
|
|
2
|
+
|
|
3
|
+
## Cache Invalidation
|
|
4
|
+
|
|
5
|
+
### `cacheTag()` - Tag Cached Content
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { cacheTag } from 'next/cache'
|
|
9
|
+
|
|
10
|
+
async function getProducts() {
|
|
11
|
+
'use cache'
|
|
12
|
+
cacheTag('products')
|
|
13
|
+
return db.products.findMany()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function getProduct(id: string) {
|
|
17
|
+
'use cache'
|
|
18
|
+
cacheTag('products', `product-${id}`)
|
|
19
|
+
return db.products.findUnique({ where: { id } })
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### `updateTag()` - Immediate Invalidation
|
|
24
|
+
|
|
25
|
+
Use when you need the cache refreshed within the same request:
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
'use server'
|
|
29
|
+
|
|
30
|
+
import { updateTag } from 'next/cache'
|
|
31
|
+
|
|
32
|
+
export async function updateProduct(id: string, data: FormData) {
|
|
33
|
+
await db.products.update({ where: { id }, data })
|
|
34
|
+
updateTag(`product-${id}`) // Immediate - same request sees fresh data
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### `revalidateTag()` - Background Revalidation
|
|
39
|
+
|
|
40
|
+
Use for stale-while-revalidate behavior:
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
'use server'
|
|
44
|
+
|
|
45
|
+
import { revalidateTag } from 'next/cache'
|
|
46
|
+
|
|
47
|
+
export async function createPost(data: FormData) {
|
|
48
|
+
await db.posts.create({ data })
|
|
49
|
+
revalidateTag('posts') // Background - next request sees fresh data
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Runtime Data Constraint
|
|
56
|
+
|
|
57
|
+
**Cannot** access `cookies()`, `headers()`, or `searchParams` inside `use cache`.
|
|
58
|
+
|
|
59
|
+
### Solution: Pass as Arguments
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
// Wrong - runtime API inside use cache
|
|
63
|
+
async function CachedProfile() {
|
|
64
|
+
'use cache'
|
|
65
|
+
const session = (await cookies()).get('session')?.value // Error!
|
|
66
|
+
return <div>{session}</div>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Correct - extract outside, pass as argument
|
|
70
|
+
async function ProfilePage() {
|
|
71
|
+
const session = (await cookies()).get('session')?.value
|
|
72
|
+
return <CachedProfile sessionId={session} />
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function CachedProfile({ sessionId }: { sessionId: string }) {
|
|
76
|
+
'use cache'
|
|
77
|
+
// sessionId becomes part of cache key automatically
|
|
78
|
+
const data = await fetchUserData(sessionId)
|
|
79
|
+
return <div>{data.name}</div>
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Exception: `use cache: private`
|
|
84
|
+
|
|
85
|
+
For compliance requirements when you can't refactor:
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
async function getData() {
|
|
89
|
+
'use cache: private'
|
|
90
|
+
const session = (await cookies()).get('session')?.value // Allowed
|
|
91
|
+
return fetchData(session)
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Caching Security & Auth Boundaries
|
|
98
|
+
|
|
99
|
+
> **CRITICAL FAILURE MODE:** Caching user-specific or authorization-bound data globally will leak PII (Personally Identifiable Information) across different users' sessions.
|
|
100
|
+
|
|
101
|
+
**Rules for Auth Boundaries:**
|
|
102
|
+
|
|
103
|
+
1. **Never use standard `'use cache'` for PII:** Standard cache entries are shared globally. If a component fetches user profile data using an auth token, you MUST NOT use the standard global `'use cache'`.
|
|
104
|
+
2. **Explicitly include user identities in cache keys:** If you must cache per-user data, extract the user ID in a dynamic context and pass it as an argument so it becomes part of the automatic cache key (e.g., `async function CachedProfile({ userId }) { 'use cache'; ... }`).
|
|
105
|
+
3. **Use `'use cache: private'` cautiously:** This ensures data isn't shared across requests, but relies heavily on correct platform caching configuration.
|
|
106
|
+
4. **Dynamic by default for Auth:** For dashboards, settings, and secure data, default to **Dynamic** (Suspense) rather than Cached.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Cache Key Generation
|
|
111
|
+
|
|
112
|
+
Cache keys are automatic based on:
|
|
113
|
+
|
|
114
|
+
- **Build ID** - invalidates all caches on deploy
|
|
115
|
+
- **Function ID** - hash of function location
|
|
116
|
+
- **Serializable arguments** - props become part of key
|
|
117
|
+
- **Closure variables** - outer scope values included
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
async function Component({ userId }: { userId: string }) {
|
|
121
|
+
const getData = async (filter: string) => {
|
|
122
|
+
'use cache'
|
|
123
|
+
// Cache key = userId (closure) + filter (argument)
|
|
124
|
+
return fetch(`/api/users/${userId}?filter=${filter}`)
|
|
125
|
+
}
|
|
126
|
+
return getData('active')
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Complete Example
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
import { Suspense } from 'react'
|
|
136
|
+
import { cookies } from 'next/headers'
|
|
137
|
+
import { cacheLife, cacheTag } from 'next/cache'
|
|
138
|
+
|
|
139
|
+
export default function DashboardPage() {
|
|
140
|
+
return (
|
|
141
|
+
<>
|
|
142
|
+
{/* Static shell - instant from CDN */}
|
|
143
|
+
<header>
|
|
144
|
+
<h1>Dashboard</h1>
|
|
145
|
+
</header>
|
|
146
|
+
<nav>...</nav>
|
|
147
|
+
|
|
148
|
+
{/* Cached - fast, revalidates hourly */}
|
|
149
|
+
<Stats />
|
|
150
|
+
|
|
151
|
+
{/* Dynamic - streams in with fresh data */}
|
|
152
|
+
<Suspense fallback={<NotificationsSkeleton />}>
|
|
153
|
+
<Notifications />
|
|
154
|
+
</Suspense>
|
|
155
|
+
</>
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function Stats() {
|
|
160
|
+
'use cache'
|
|
161
|
+
cacheLife('hours')
|
|
162
|
+
cacheTag('dashboard-stats')
|
|
163
|
+
|
|
164
|
+
const stats = await db.stats.aggregate()
|
|
165
|
+
return <StatsDisplay stats={stats} />
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async function Notifications() {
|
|
169
|
+
const userId = (await cookies()).get('userId')?.value
|
|
170
|
+
const notifications = await db.notifications.findMany({
|
|
171
|
+
where: { userId, read: false },
|
|
172
|
+
})
|
|
173
|
+
return <NotificationList items={notifications} />
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Migration from Previous Versions
|
|
180
|
+
|
|
181
|
+
| Old Config | Replacement |
|
|
182
|
+
| --------------------------- | ---------------------------------- |
|
|
183
|
+
| `experimental.ppr` | `cacheComponents: true` |
|
|
184
|
+
| `dynamic = 'force-dynamic'` | Remove (default behavior) |
|
|
185
|
+
| `dynamic = 'force-static'` | `'use cache'` + `cacheLife('max')` |
|
|
186
|
+
| `revalidate = N` | `cacheLife({ revalidate: N })` |
|
|
187
|
+
| `unstable_cache()` | `'use cache'` directive |
|
|
188
|
+
|
|
189
|
+
### Migrating `unstable_cache` to `use cache`
|
|
190
|
+
|
|
191
|
+
`unstable_cache` has been replaced by the `use cache` directive in Next.js 16. When `cacheComponents` is enabled, convert `unstable_cache` calls to `use cache` functions:
|
|
192
|
+
|
|
193
|
+
**Before (`unstable_cache`):**
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
import { unstable_cache } from 'next/cache'
|
|
197
|
+
|
|
198
|
+
const getCachedUser = unstable_cache(async (id) => getUser(id), ['my-app-user'], {
|
|
199
|
+
tags: ['users'],
|
|
200
|
+
revalidate: 60,
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
|
|
204
|
+
const { id } = await params
|
|
205
|
+
const user = await getCachedUser(id)
|
|
206
|
+
return <div>{user.name}</div>
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**After (`use cache`):**
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import { cacheLife, cacheTag } from 'next/cache'
|
|
214
|
+
|
|
215
|
+
async function getCachedUser(id: string) {
|
|
216
|
+
'use cache'
|
|
217
|
+
cacheTag('users')
|
|
218
|
+
cacheLife({ revalidate: 60 })
|
|
219
|
+
return getUser(id)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
|
|
223
|
+
const { id } = await params
|
|
224
|
+
const user = await getCachedUser(id)
|
|
225
|
+
return <div>{user.name}</div>
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Key differences:
|
|
230
|
+
|
|
231
|
+
- **No manual cache keys** - `use cache` generates keys automatically from function arguments and closures. The `keyParts` array from `unstable_cache` is no longer needed.
|
|
232
|
+
- **Tags** - Replace `options.tags` with `cacheTag()` calls inside the function.
|
|
233
|
+
- **Revalidation** - Replace `options.revalidate` with `cacheLife({ revalidate: N })` or a built-in profile like `cacheLife('minutes')`.
|
|
234
|
+
- **Dynamic data** - `unstable_cache` did not support `cookies()` or `headers()` inside the callback. The same restriction applies to `use cache`, but you can use `'use cache: private'` if needed.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: next-cache-components
|
|
3
|
+
description: |
|
|
4
|
+
Next.js 16 Cache Components guidance. Use when refactoring React Server Components for performance, debugging Partial Prerendering (PPR) issues, or applying the `use cache` directive, `cacheLife`, `cacheTag`, `updateTag`, and `revalidateTag`.
|
|
5
|
+
Also use when deciding whether data should be static, cached, or dynamic, or when addressing stale data and cache invalidation.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Cache Components (Next.js 16+)
|
|
9
|
+
|
|
10
|
+
> **Note:** Cache Components are available in Next.js canary. Verify `cacheComponents` is supported in your target version before applying this guidance.
|
|
11
|
+
|
|
12
|
+
Cache Components enable Partial Prerendering (PPR) - mix static, cached, and dynamic content in a single route.
|
|
13
|
+
|
|
14
|
+
## Enable Cache Components
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
// next.config.ts
|
|
18
|
+
import type { NextConfig } from 'next'
|
|
19
|
+
|
|
20
|
+
const nextConfig: NextConfig = {
|
|
21
|
+
cacheComponents: true,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default nextConfig
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This replaces the old `experimental.ppr` flag.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Three Content Types
|
|
32
|
+
|
|
33
|
+
With Cache Components enabled, content falls into three categories:
|
|
34
|
+
|
|
35
|
+
### 1. Static (Auto-Prerendered)
|
|
36
|
+
|
|
37
|
+
Synchronous code, imports, pure computations - prerendered at build time:
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
export default function Page() {
|
|
41
|
+
return (
|
|
42
|
+
<header>
|
|
43
|
+
<h1>Our Blog</h1> {/* Static - instant */}
|
|
44
|
+
<nav>...</nav>
|
|
45
|
+
</header>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Cached (`use cache`)
|
|
51
|
+
|
|
52
|
+
Async data that doesn't need fresh fetches every request:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
async function BlogPosts() {
|
|
56
|
+
'use cache'
|
|
57
|
+
cacheLife('hours')
|
|
58
|
+
|
|
59
|
+
const posts = await db.posts.findMany()
|
|
60
|
+
return <PostList posts={posts} />
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Dynamic (Suspense)
|
|
65
|
+
|
|
66
|
+
Runtime data that must be fresh - wrap in Suspense:
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import { Suspense } from 'react'
|
|
70
|
+
|
|
71
|
+
export default function Page() {
|
|
72
|
+
return (
|
|
73
|
+
<>
|
|
74
|
+
<BlogPosts /> {/* Cached */}
|
|
75
|
+
<Suspense fallback={<p>Loading...</p>}>
|
|
76
|
+
<UserPreferences /> {/* Dynamic - streams in */}
|
|
77
|
+
</Suspense>
|
|
78
|
+
</>
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function UserPreferences() {
|
|
83
|
+
const theme = (await cookies()).get('theme')?.value
|
|
84
|
+
return <p>Theme: {theme}</p>
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Selection Matrix: Static vs Cached vs Dynamic
|
|
91
|
+
|
|
92
|
+
When designing a component, use this matrix to determine the correct caching strategy:
|
|
93
|
+
|
|
94
|
+
| Data Type | Frequency of Change | Strategy | Implementation |
|
|
95
|
+
| ---------------------------- | ----------------------- | ----------- | ---------------------------- |
|
|
96
|
+
| Marketing copy, Layouts, Nav | Build-time or rarely | **Static** | Default Server Component |
|
|
97
|
+
| Blog posts, Product catalog | Periodic / CMS-driven | **Cached** | `'use cache'` + `cacheLife` |
|
|
98
|
+
| User profile, Shopping cart | Per-user / Real-time | **Dynamic** | Suspense + `await cookies()` |
|
|
99
|
+
| Admin dashboard, Analytics | High-frequency / Secure | **Dynamic** | Suspense + `await headers()` |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## `use cache` Directive
|
|
104
|
+
|
|
105
|
+
### File Level
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
'use cache'
|
|
109
|
+
|
|
110
|
+
export default async function Page() {
|
|
111
|
+
// Entire page is cached
|
|
112
|
+
const data = await fetchData()
|
|
113
|
+
return <div>{data}</div>
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Component Level
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
export async function CachedComponent() {
|
|
121
|
+
'use cache'
|
|
122
|
+
const data = await fetchData()
|
|
123
|
+
return <div>{data}</div>
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Function Level
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
export async function getData() {
|
|
131
|
+
'use cache'
|
|
132
|
+
return db.query('SELECT * FROM posts')
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Cache Profiles
|
|
139
|
+
|
|
140
|
+
### Built-in Profiles
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
'use cache' // Default: 5m stale, 15m revalidate
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
'use cache: remote' // Platform-provided cache (Redis, KV)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
'use cache: private' // For compliance, allows runtime APIs
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### `cacheLife()` - Custom Lifetime
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
import { cacheLife } from 'next/cache'
|
|
158
|
+
|
|
159
|
+
async function getData() {
|
|
160
|
+
'use cache'
|
|
161
|
+
cacheLife('hours') // Built-in profile
|
|
162
|
+
return fetch('/api/data')
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Built-in profiles: `'default'`, `'minutes'`, `'hours'`, `'days'`, `'weeks'`, `'max'`
|
|
167
|
+
|
|
168
|
+
### Inline Configuration
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
async function getData() {
|
|
172
|
+
'use cache'
|
|
173
|
+
cacheLife({
|
|
174
|
+
stale: 3600, // 1 hour - serve stale while revalidating
|
|
175
|
+
revalidate: 7200, // 2 hours - background revalidation interval
|
|
176
|
+
expire: 86400, // 1 day - hard expiration
|
|
177
|
+
})
|
|
178
|
+
return fetch('/api/data')
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Deep Dives & Advanced Usage
|
|
183
|
+
|
|
184
|
+
For complete examples, migration strategies from `unstable_cache`, runtime constraints, and cache invalidation APIs (`cacheTag`, `updateTag`, `revalidateTag`), read the reference file:
|
|
185
|
+
|
|
186
|
+
**[Read: cache-components-examples.md](cache-components-examples.md)**
|
|
187
|
+
|
|
188
|
+
## Limitations
|
|
189
|
+
|
|
190
|
+
- **Edge runtime not supported** - requires Node.js
|
|
191
|
+
- **Static export not supported** - needs server
|
|
192
|
+
- **Non-deterministic values** (`Math.random()`, `Date.now()`) execute once at build time inside `use cache`
|
|
193
|
+
|
|
194
|
+
For request-time randomness outside cache:
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { connection } from 'next/server'
|
|
198
|
+
|
|
199
|
+
async function DynamicContent() {
|
|
200
|
+
await connection() // Defer to request time
|
|
201
|
+
const id = crypto.randomUUID() // Different per request
|
|
202
|
+
return <div>{id}</div>
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Sources:
|
|
207
|
+
|
|
208
|
+
- [Cache Components Guide](https://nextjs.org/docs/app/getting-started/cache-components)
|
|
209
|
+
- [use cache Directive](https://nextjs.org/docs/app/api-reference/directives/use-cache)
|
|
210
|
+
- [unstable_cache (legacy)](https://nextjs.org/docs/app/api-reference/functions/unstable_cache)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Next.js Upgrade Decision Tree
|
|
2
|
+
|
|
3
|
+
When upgrading Next.js, follow this decision tree to determine which official migration guide to read and which codemods to run.
|
|
4
|
+
|
|
5
|
+
## 1. Upgrade from Next.js 14 to 15
|
|
6
|
+
|
|
7
|
+
If current version is 14.x and target is 15.x:
|
|
8
|
+
|
|
9
|
+
1. Fetch guide: `https://nextjs.org/docs/app/guides/upgrading/version-15`
|
|
10
|
+
2. **Major Breaking Change**: Async Request APIs (params, searchParams, cookies, headers are now Promises).
|
|
11
|
+
3. **Run Codemod**: `npx @next/codemod@latest next-async-request-api .`
|
|
12
|
+
4. **Other Codemods**:
|
|
13
|
+
- `next-request-geo-ip` (if using geo/ip in middleware)
|
|
14
|
+
- `next-dynamic-access-named-export` (if using dynamic imports)
|
|
15
|
+
5. **Config Changes**: `experimental.ppr` is now `cacheComponents` (Next 15+).
|
|
16
|
+
|
|
17
|
+
## 2. Upgrade from Next.js 13 to 14
|
|
18
|
+
|
|
19
|
+
If current version is 13.x and target is 14.x:
|
|
20
|
+
|
|
21
|
+
1. Fetch guide: `https://nextjs.org/docs/app/guides/upgrading/version-14`
|
|
22
|
+
2. **Major Breaking Change**: Node.js minimum version is 18.17.
|
|
23
|
+
3. **Run Codemod**: `npx @next/codemod@latest next-Image-experimental .` (if moving from legacy Image).
|
|
24
|
+
|
|
25
|
+
## 3. General Codemod Workflow
|
|
26
|
+
|
|
27
|
+
For any version upgrade:
|
|
28
|
+
|
|
29
|
+
1. Ensure git working directory is clean.
|
|
30
|
+
2. Run the specific codemod.
|
|
31
|
+
3. Review the git diff.
|
|
32
|
+
4. ONLY THEN run the `npm install` / `pnpm install` step to pin the new target version.
|
|
33
|
+
5. Rebuild the app and manually fix TypeScript errors.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: next-upgrade
|
|
3
|
+
description: |
|
|
4
|
+
Upgrade Next.js to a specific target version using safe dependency bumps, codemods,
|
|
5
|
+
and diff reviews. Use when you need to execute major version bumps, resolve breaking changes,
|
|
6
|
+
"upgrading Next.js", "migrate to Next.js 15 or 16", or safely "run @next/codemod" against the repository before upgrading.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Upgrade Next.js
|
|
10
|
+
|
|
11
|
+
Upgrade the current project to a targeted Next.js version following official migration guides.
|
|
12
|
+
|
|
13
|
+
## Instructions
|
|
14
|
+
|
|
15
|
+
1. **Detect current environment**:
|
|
16
|
+
- Read `package.json` to identify the current Next.js version, React version, and package manager (`npm`, `pnpm`, `yarn`).
|
|
17
|
+
- Read the lockfile to ensure you use the correct package manager.
|
|
18
|
+
|
|
19
|
+
2. **Determine target version**:
|
|
20
|
+
- Do NOT blindly use `@latest`. Always determine the explicit target version (e.g., `15.0.0`) based on user request or current LTS.
|
|
21
|
+
- For major version jumps, upgrade incrementally (e.g., 13 → 14 → 15).
|
|
22
|
+
|
|
23
|
+
3. **Consult Upgrade Decision Tree**:
|
|
24
|
+
- Read [references/decision-tree.md](references/decision-tree.md) to find the correct codemods and checklists for your target version.
|
|
25
|
+
|
|
26
|
+
4. **Security Gate**:
|
|
27
|
+
- You MUST request explicit user confirmation before running any codemod that modifies source files.
|
|
28
|
+
|
|
29
|
+
5. **Run codemods FIRST (before installing new versions)**:
|
|
30
|
+
- Next.js codemods should often be run against the _old_ codebase before upgrading to automate breaking changes.
|
|
31
|
+
- Example: `npx @next/codemod@<target-version> <transform> <path>`
|
|
32
|
+
|
|
33
|
+
6. **Pin dependencies**:
|
|
34
|
+
- Upgrade Next.js and peer dependencies to the specific target version:
|
|
35
|
+
- Example: `pnpm install next@15.0.0 react@19.0.0 react-dom@19.0.0`
|
|
36
|
+
|
|
37
|
+
7. **Review Diff**:
|
|
38
|
+
- After running codemods and installing new dependencies, you MUST run `git diff` or review the changes.
|
|
39
|
+
- Do NOT commit or ship without explicit user review of the codemod changes.
|
|
40
|
+
|
|
41
|
+
8. **Test the upgrade**:
|
|
42
|
+
- Run `npm run build` (or equivalent) to check for build errors.
|
|
43
|
+
- If there are errors in `next.config.js` or routing, resolve them manually.
|