diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 99fab2c6e..aef047b24 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -160,6 +160,90 @@ }, "category": "文档处理" }, + { + "name": "eapil-llmapi-structured", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/eapil-llmapi-structured" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "generate-agents-md", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/generate-agents-md" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "知识库与检索" + }, + { + "name": "eapil-voice", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/eapil-voice" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "多媒体与生成" + }, + { + "name": "superpowers", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/superpowers" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "oh-my-codex", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/oh-my-codex" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "ui-ux-pro-max", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/ui-ux-pro-max" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "设计" + }, + { + "name": "shadcn", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/shadcn" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, { "name": "frontend-slides", "source": { @@ -196,6 +280,18 @@ }, "category": "文档处理" }, + { + "name": "ppt-master", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/ppt-master" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "文档处理" + }, { "name": "next-skills", "source": { @@ -208,54 +304,6 @@ }, "category": "开发工具" }, - { - "name": "eapil-llmapi-structured", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/eapil-llmapi-structured" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "generate-agents-md", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/generate-agents-md" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "知识库与检索" - }, - { - "name": "superpowers", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/superpowers" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "oh-my-codex", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/oh-my-codex" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "mcp-playwright", "source": { @@ -267,54 +315,6 @@ "authentication": "ON_INSTALL" }, "category": "MCP" - }, - { - "name": "ui-ux-pro-max", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/ui-ux-pro-max" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "设计" - }, - { - "name": "shadcn", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/shadcn" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "ppt-master", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/ppt-master" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "文档处理" - }, - { - "name": "eapil-voice", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/eapil-voice" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "多媒体与生成" } ] } diff --git a/config/external-sources.json b/config/external-sources.json index 6b2c5dc76..9d1170882 100644 --- a/config/external-sources.json +++ b/config/external-sources.json @@ -409,8 +409,8 @@ }, { "id": "next-skills", - "repo": "https://github.com/vercel-labs/next-skills.git", - "ref": "main", + "repo": "https://github.com/vercel/next.js.git", + "ref": "canary", "adapter": "skill-collection", "pluginName": "next-skills", "category": "开发工具", @@ -420,15 +420,15 @@ ], "brandColor": "#000000", "manifestOverrides": { - "version": "0.1.0", - "description": "Next.js Agent Skills 提供 Next.js 最佳实践、版本升级和 Cache Components 工作流。", + "version": "0.2.0", + "description": "Next.js Agent Skills 提供 Cache Components 迁移、优化和 dev loop 验证工作流。", "author": { - "name": "Vercel Labs", - "url": "https://github.com/vercel-labs" + "name": "Vercel", + "url": "https://github.com/vercel" }, - "homepage": "https://github.com/vercel-labs/next-skills", - "repository": "https://github.com/vercel-labs/next-skills", - "license": "UNKNOWN", + "homepage": "https://github.com/vercel/next.js/tree/canary/skills", + "repository": "https://github.com/vercel/next.js", + "license": "MIT", "keywords": [ "nextjs", "next-skills", @@ -439,28 +439,28 @@ ], "interface": { "displayName": "Next.js Agent Skills", - "shortDescription": "Next.js 最佳实践、升级和 Cache Components 工作流。", - "longDescription": "Next.js Agent Skills 包含 next-best-practices、next-upgrade 和 next-cache-components 三个技能,覆盖 App Router 文件约定、RSC 边界、数据模式、异步 API、metadata、route handlers、图片/字体优化、打包、调试、Next.js 版本升级以及 Next.js 16 Cache Components。", - "developerName": "Vercel Labs", + "shortDescription": "Next.js Cache Components 迁移、优化和 dev loop 验证工作流。", + "longDescription": "Next.js Agent Skills 现在跟随 Next.js 仓库 canary/skills 版本,包含 next-cache-components-adoption、next-cache-components-optimizer 和 next-dev-loop 三个技能,覆盖 Cache Components 启用迁移、静态壳/即时导航优化,以及通过 Next.js dev MCP 与真实浏览器验证运行时行为。", + "developerName": "Vercel", "category": "开发工具", "capabilities": [ "Read", "Write" ], "defaultPrompt": [ - "使用 Next.js Agent Skills 帮我检查这个 Next.js 项目。", - "使用 Next.js Agent Skills 帮我升级 Next.js 或处理 Cache Components。" + "使用 Next.js Agent Skills 帮我启用或优化 Cache Components。", + "使用 Next.js Agent Skills 帮我通过 dev loop 验证 Next.js 运行时行为。" ], - "websiteURL": "https://github.com/vercel-labs/next-skills", - "privacyPolicyURL": "https://github.com/vercel-labs/next-skills", - "termsOfServiceURL": "https://github.com/vercel-labs/next-skills", + "websiteURL": "https://github.com/vercel/next.js/tree/canary/skills", + "privacyPolicyURL": "https://github.com/vercel/next.js", + "termsOfServiceURL": "https://github.com/vercel/next.js", "brandColor": "#000000" } }, "skillDescriptions": { - "next-best-practices": "Next.js 最佳实践背景知识,覆盖文件约定、RSC 边界、数据模式、异步 API、metadata、route handlers、图片/字体优化、打包和调试。", - "next-cache-components": "Next.js 16 Cache Components、PPR、use cache、cacheLife、cacheTag 和 updateTag 工作流。", - "next-upgrade": "按照官方迁移指南和 codemods 升级 Next.js 项目。" + "next-cache-components-adoption": "启用 Next.js Cache Components 并修复阻塞路由。", + "next-cache-components-optimizer": "优化 Next.js Cache Components 页面静态壳和导航体验。", + "next-dev-loop": "通过 Next.js dev MCP 与真实浏览器验证运行时行为。" } } ] diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index c44a3bdbf..e4f1a1af2 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -24,8 +24,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "9a863a527534eeff97cad45430b8e5678ab45c40", - "syncedAt": "2026-06-22T16:00:01Z" + "commit": "a13b2a02fd58d8ad325fefd9d146f62708be8456", + "syncedAt": "2026-06-24T03:56:08Z" }, { "id": "shadcn", @@ -33,8 +33,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "70a7a0c2a8271ccde9932fb40d5b4adeacb9b131", - "syncedAt": "2026-06-21T16:00:01Z" + "commit": "b59f68ecc5216e39d3f492e79b9767388ccd43db", + "syncedAt": "2026-06-24T03:56:08Z" }, { "id": "frontend-slides", @@ -42,8 +42,8 @@ "repo": "https://github.com/zarazhangrui/frontend-slides.git", "ref": "main", "adapter": "claude-skill", - "commit": "c28690100a289d979e5e032b44771a7c28a86e40", - "syncedAt": "2026-06-13T16:00:00Z" + "commit": "9906a34d640d2111f724544cbc50f7f130569ae1", + "syncedAt": "2026-06-24T03:56:08Z" }, { "id": "guizang-ppt-skill", @@ -69,17 +69,17 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "bf9ae01a8df43b1a86f459ed007e84ef465ae257", - "syncedAt": "2026-06-22T16:00:01Z" + "commit": "54ef7c733480ca44061fc76d6d29dcf2227ecd67", + "syncedAt": "2026-06-24T03:56:08Z" }, { "id": "next-skills", "pluginName": "next-skills", - "repo": "https://github.com/vercel-labs/next-skills.git", - "ref": "main", + "repo": "https://github.com/vercel/next.js.git", + "ref": "canary", "adapter": "skill-collection", - "commit": "dc1de9caf7612d73f56a8dec3cb1bd6c9ec096b9", - "syncedAt": "2026-06-15T08:24:34Z" + "commit": "16db9d05442fc1521c02e6690599aa89da0df0ec", + "syncedAt": "2026-06-24T03:48:19Z" } ] } diff --git a/plugins/codex/.agents/plugins/marketplace.json b/plugins/codex/.agents/plugins/marketplace.json index 4ab1351b4..b73a80cf3 100644 --- a/plugins/codex/.agents/plugins/marketplace.json +++ b/plugins/codex/.agents/plugins/marketplace.json @@ -160,6 +160,90 @@ }, "category": "文档处理" }, + { + "name": "eapil-llmapi-structured", + "source": { + "source": "local", + "path": "./plugins/eapil-llmapi-structured" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "generate-agents-md", + "source": { + "source": "local", + "path": "./plugins/generate-agents-md" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "知识库与检索" + }, + { + "name": "eapil-voice", + "source": { + "source": "local", + "path": "./plugins/eapil-voice" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "多媒体与生成" + }, + { + "name": "superpowers", + "source": { + "source": "local", + "path": "./plugins/superpowers" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "oh-my-codex", + "source": { + "source": "local", + "path": "./plugins/oh-my-codex" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "ui-ux-pro-max", + "source": { + "source": "local", + "path": "./plugins/ui-ux-pro-max" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "设计" + }, + { + "name": "shadcn", + "source": { + "source": "local", + "path": "./plugins/shadcn" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, { "name": "frontend-slides", "source": { @@ -196,6 +280,18 @@ }, "category": "文档处理" }, + { + "name": "ppt-master", + "source": { + "source": "local", + "path": "./plugins/ppt-master" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "文档处理" + }, { "name": "next-skills", "source": { @@ -208,54 +304,6 @@ }, "category": "开发工具" }, - { - "name": "eapil-llmapi-structured", - "source": { - "source": "local", - "path": "./plugins/eapil-llmapi-structured" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "generate-agents-md", - "source": { - "source": "local", - "path": "./plugins/generate-agents-md" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "知识库与检索" - }, - { - "name": "superpowers", - "source": { - "source": "local", - "path": "./plugins/superpowers" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "oh-my-codex", - "source": { - "source": "local", - "path": "./plugins/oh-my-codex" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "mcp-playwright", "source": { @@ -267,54 +315,6 @@ "authentication": "ON_INSTALL" }, "category": "MCP" - }, - { - "name": "ui-ux-pro-max", - "source": { - "source": "local", - "path": "./plugins/ui-ux-pro-max" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "设计" - }, - { - "name": "shadcn", - "source": { - "source": "local", - "path": "./plugins/shadcn" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, - { - "name": "ppt-master", - "source": { - "source": "local", - "path": "./plugins/ppt-master" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "文档处理" - }, - { - "name": "eapil-voice", - "source": { - "source": "local", - "path": "./plugins/eapil-voice" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "多媒体与生成" } ] } diff --git a/plugins/codex/plugins/frontend-slides/README.md b/plugins/codex/plugins/frontend-slides/README.md index 9f1c2a61c..bd4bd9290 100644 --- a/plugins/codex/plugins/frontend-slides/README.md +++ b/plugins/codex/plugins/frontend-slides/README.md @@ -2,6 +2,16 @@ A coding-agent skill for creating stunning HTML presentations — from scratch or by converting PowerPoint files. It is packaged as a Claude Code plugin, and the core `SKILL.md` can also be read by other coding agents with filesystem and shell access. +## 📺 Watch the Walkthrough & Tutorial + +New here? This beginner-friendly video walks you through the whole thing, start to finish. + + + Watch the Frontend Slides walkthrough and tutorial on YouTube + + +> ▶️ **[Watch on YouTube →](https://www.youtube.com/watch?v=372Iksaz8b0)** (beginner-friendly walkthrough and tutorial) + ## What This Does **Frontend Slides** helps non-designers create beautiful web presentations without knowing CSS or JavaScript. It uses a "show, don't tell" approach: instead of asking you to describe your aesthetic preferences in words, it generates visual previews and lets you pick what you like. diff --git a/plugins/codex/plugins/frontend-slides/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/frontend-slides/THIRD_PARTY_SOURCE.json index a19dbbb9b..b4bdbcb2f 100644 --- a/plugins/codex/plugins/frontend-slides/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/frontend-slides/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "frontend-slides", "repo": "https://github.com/zarazhangrui/frontend-slides.git", "ref": "main", - "commit": "c28690100a289d979e5e032b44771a7c28a86e40", + "commit": "9906a34d640d2111f724544cbc50f7f130569ae1", "adapter": "claude-skill", "sourcePath": "plugins/frontend-slides/skills/frontend-slides", - "syncedAt": "2026-06-13T16:00:00Z" + "syncedAt": "2026-06-24T03:56:08Z" } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index b5c89a433..0b1f14cf6 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-06-22T16:01:37Z" + "syncedAt": "2026-06-24T03:57:12Z" } diff --git a/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json b/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json index 8fd554ba1..ecb5afe76 100644 --- a/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json +++ b/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json @@ -1,14 +1,14 @@ { "name": "next-skills", - "version": "0.1.0", - "description": "Next.js Agent Skills 提供 Next.js 最佳实践、版本升级和 Cache Components 工作流。", + "version": "0.2.0", + "description": "Next.js Agent Skills 提供 Cache Components 迁移、优化和 dev loop 验证工作流。", "author": { - "name": "Vercel Labs", - "url": "https://github.com/vercel-labs" + "name": "Vercel", + "url": "https://github.com/vercel" }, - "homepage": "https://github.com/vercel-labs/next-skills", - "repository": "https://github.com/vercel-labs/next-skills", - "license": "UNKNOWN", + "homepage": "https://github.com/vercel/next.js/tree/canary/skills", + "repository": "https://github.com/vercel/next.js", + "license": "MIT", "keywords": [ "nextjs", "next-skills", @@ -20,21 +20,21 @@ "skills": "./skills/", "interface": { "displayName": "Next.js Agent Skills", - "shortDescription": "Next.js 最佳实践、升级和 Cache Components 工作流。", - "longDescription": "Next.js Agent Skills 包含 next-best-practices、next-upgrade 和 next-cache-components 三个技能,覆盖 App Router 文件约定、RSC 边界、数据模式、异步 API、metadata、route handlers、图片/字体优化、打包、调试、Next.js 版本升级以及 Next.js 16 Cache Components。", - "developerName": "Vercel Labs", + "shortDescription": "Next.js Cache Components 迁移、优化和 dev loop 验证工作流。", + "longDescription": "Next.js Agent Skills 现在跟随 Next.js 仓库 canary/skills 版本,包含 next-cache-components-adoption、next-cache-components-optimizer 和 next-dev-loop 三个技能,覆盖 Cache Components 启用迁移、静态壳/即时导航优化,以及通过 Next.js dev MCP 与真实浏览器验证运行时行为。", + "developerName": "Vercel", "category": "开发工具", "capabilities": [ "Read", "Write" ], "defaultPrompt": [ - "使用 Next.js Agent Skills 帮我检查这个 Next.js 项目。", - "使用 Next.js Agent Skills 帮我升级 Next.js 或处理 Cache Components。" + "使用 Next.js Agent Skills 帮我启用或优化 Cache Components。", + "使用 Next.js Agent Skills 帮我通过 dev loop 验证 Next.js 运行时行为。" ], - "websiteURL": "https://github.com/vercel-labs/next-skills", - "privacyPolicyURL": "https://github.com/vercel-labs/next-skills", - "termsOfServiceURL": "https://github.com/vercel-labs/next-skills", + "websiteURL": "https://github.com/vercel/next.js/tree/canary/skills", + "privacyPolicyURL": "https://github.com/vercel/next.js", + "termsOfServiceURL": "https://github.com/vercel/next.js", "brandColor": "#000000", "screenshots": [] } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 1c4c35745..c337d36db 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -1,9 +1,9 @@ { "sourceId": "next-skills", - "repo": "https://github.com/vercel-labs/next-skills.git", - "ref": "main", - "commit": "dc1de9caf7612d73f56a8dec3cb1bd6c9ec096b9", + "repo": "https://github.com/vercel/next.js.git", + "ref": "canary", + "commit": "16db9d05442fc1521c02e6690599aa89da0df0ec", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-06-15T08:24:34Z" + "syncedAt": "2026-06-24T03:48:19Z" } diff --git a/plugins/codex/plugins/next-skills/skills/next-best-practices/SKILL.md b/plugins/codex/plugins/next-skills/skills/next-best-practices/SKILL.md deleted file mode 100644 index b734b7339..000000000 --- a/plugins/codex/plugins/next-skills/skills/next-best-practices/SKILL.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -name: next-best-practices -description: "Next.js 最佳实践背景知识,覆盖文件约定、RSC 边界、数据模式、异步 API、metadata、route handlers、图片/字体优化、打包和调试。" -user-invocable: false ---- - -# Next.js Best Practices - -Apply these rules when writing or reviewing Next.js code. - -## File Conventions - -See [file-conventions.md](./file-conventions.md) for: -- Project structure and special files -- Route segments (dynamic, catch-all, groups) -- Parallel and intercepting routes -- Middleware rename in v16 (middleware → proxy) - -## RSC Boundaries - -Detect invalid React Server Component patterns. - -See [rsc-boundaries.md](./rsc-boundaries.md) for: -- Async client component detection (invalid) -- Non-serializable props detection -- Server Action exceptions - -## Async Patterns - -Next.js 15+ async API changes. - -See [async-patterns.md](./async-patterns.md) for: -- Async `params` and `searchParams` -- Async `cookies()` and `headers()` -- Migration codemod - -## Runtime Selection - -See [runtime-selection.md](./runtime-selection.md) for: -- Default to Node.js runtime -- When Edge runtime is appropriate - -## Directives - -See [directives.md](./directives.md) for: -- `'use client'`, `'use server'` (React) -- `'use cache'` (Next.js) - -## Functions - -See [functions.md](./functions.md) for: -- Navigation hooks: `useRouter`, `usePathname`, `useSearchParams`, `useParams` -- Server functions: `cookies`, `headers`, `draftMode`, `after` -- Generate functions: `generateStaticParams`, `generateMetadata` - -## Error Handling - -See [error-handling.md](./error-handling.md) for: -- `error.tsx`, `global-error.tsx`, `not-found.tsx` -- `redirect`, `permanentRedirect`, `notFound` -- `forbidden`, `unauthorized` (auth errors) -- `unstable_rethrow` for catch blocks - -## Data Patterns - -See [data-patterns.md](./data-patterns.md) for: -- Server Components vs Server Actions vs Route Handlers -- Avoiding data waterfalls (`Promise.all`, Suspense, preload) -- Client component data fetching - -## Route Handlers - -See [route-handlers.md](./route-handlers.md) for: -- `route.ts` basics -- GET handler conflicts with `page.tsx` -- Environment behavior (no React DOM) -- When to use vs Server Actions - -## Metadata & OG Images - -See [metadata.md](./metadata.md) for: -- Static and dynamic metadata -- `generateMetadata` function -- OG image generation with `next/og` -- File-based metadata conventions - -## Image Optimization - -See [image.md](./image.md) for: -- Always use `next/image` over `` -- Remote images configuration -- Responsive `sizes` attribute -- Blur placeholders -- Priority loading for LCP - -## Font Optimization - -See [font.md](./font.md) for: -- `next/font` setup -- Google Fonts, local fonts -- Tailwind CSS integration -- Preloading subsets - -## Bundling - -See [bundling.md](./bundling.md) for: -- Server-incompatible packages -- CSS imports (not link tags) -- Polyfills (already included) -- ESM/CommonJS issues -- Bundle analysis - -## Scripts - -See [scripts.md](./scripts.md) for: -- `next/script` vs native script tags -- Inline scripts need `id` -- Loading strategies -- Google Analytics with `@next/third-parties` - -## Hydration Errors - -See [hydration-error.md](./hydration-error.md) for: -- Common causes (browser APIs, dates, invalid HTML) -- Debugging with error overlay -- Fixes for each cause - -## Suspense Boundaries - -See [suspense-boundaries.md](./suspense-boundaries.md) for: -- CSR bailout with `useSearchParams` and `usePathname` -- Which hooks require Suspense boundaries - -## Parallel & Intercepting Routes - -See [parallel-routes.md](./parallel-routes.md) for: -- Modal patterns with `@slot` and `(.)` interceptors -- `default.tsx` for fallbacks -- Closing modals correctly with `router.back()` - -## Self-Hosting - -See [self-hosting.md](./self-hosting.md) for: -- `output: 'standalone'` for Docker -- Cache handlers for multi-instance ISR -- What works vs needs extra setup - -## Debug Tricks - -See [debug-tricks.md](./debug-tricks.md) for: -- MCP endpoint for AI-assisted debugging -- Rebuild specific routes with `--debug-build-paths` - diff --git a/plugins/codex/plugins/next-skills/skills/next-best-practices/async-patterns.md b/plugins/codex/plugins/next-skills/skills/next-best-practices/async-patterns.md deleted file mode 100644 index dce8d8ccf..000000000 --- a/plugins/codex/plugins/next-skills/skills/next-best-practices/async-patterns.md +++ /dev/null @@ -1,87 +0,0 @@ -# Async Patterns - -In Next.js 15+, `params`, `searchParams`, `cookies()`, and `headers()` are asynchronous. - -## Async Params and SearchParams - -Always type them as `Promise<...>` and await them. - -### Pages and Layouts - -```tsx -type Props = { params: Promise<{ slug: string }> } - -export default async function Page({ params }: Props) { - const { slug } = await params -} -``` - -### Route Handlers - -```tsx -export async function GET( - request: Request, - { params }: { params: Promise<{ id: string }> } -) { - const { id } = await params -} -``` - -### SearchParams - -```tsx -type Props = { - params: Promise<{ slug: string }> - searchParams: Promise<{ query?: string }> -} - -export default async function Page({ params, searchParams }: Props) { - const { slug } = await params - const { query } = await searchParams -} -``` - -### Synchronous Components - -Use `React.use()` for non-async components: - -```tsx -import { use } from 'react' - -type Props = { params: Promise<{ slug: string }> } - -export default function Page({ params }: Props) { - const { slug } = use(params) -} -``` - -### generateMetadata - -```tsx -type Props = { params: Promise<{ slug: string }> } - -export async function generateMetadata({ params }: Props): Promise { - const { slug } = await params - return { title: slug } -} -``` - -## Async Cookies and Headers - -```tsx -import { cookies, headers } from 'next/headers' - -export default async function Page() { - const cookieStore = await cookies() - const headersList = await headers() - - const theme = cookieStore.get('theme') - const userAgent = headersList.get('user-agent') -} -``` - -## Migration Codemod - -```bash -npx @next/codemod@latest next-async-request-api . -``` diff --git a/plugins/codex/plugins/next-skills/skills/next-best-practices/bundling.md b/plugins/codex/plugins/next-skills/skills/next-best-practices/bundling.md deleted file mode 100644 index ac5e814c1..000000000 --- a/plugins/codex/plugins/next-skills/skills/next-best-practices/bundling.md +++ /dev/null @@ -1,180 +0,0 @@ -# Bundling - -Fix common bundling issues with third-party packages. - -## Server-Incompatible Packages - -Some packages use browser APIs (`window`, `document`, `localStorage`) and fail in Server Components. - -### Error Signs - -``` -ReferenceError: window is not defined -ReferenceError: document is not defined -ReferenceError: localStorage is not defined -Module not found: Can't resolve 'fs' -``` - -### Solution 1: Mark as Client-Only - -If the package is only needed on client: - -```tsx -// Bad: Fails - package uses window -import SomeChart from 'some-chart-library' - -export default function Page() { - return -} - -// Good: Use dynamic import with ssr: false -import dynamic from 'next/dynamic' - -const SomeChart = dynamic(() => import('some-chart-library'), { - ssr: false, -}) - -export default function Page() { - return -} -``` - -### Solution 2: Externalize from Server Bundle - -For packages that should run on server but have bundling issues: - -```js -// next.config.js -module.exports = { - serverExternalPackages: ['problematic-package'], -} -``` - -Use this for: -- Packages with native bindings (sharp, bcrypt) -- Packages that don't bundle well (some ORMs) -- Packages with circular dependencies - -### Solution 3: Client Component Wrapper - -Wrap the entire usage in a client component: - -```tsx -// components/ChartWrapper.tsx -'use client' - -import { Chart } from 'chart-library' - -export function ChartWrapper(props) { - return -} - -// app/page.tsx (server component) -import { ChartWrapper } from '@/components/ChartWrapper' - -export default function Page() { - return -} -``` - -## CSS Imports - -Import CSS files instead of using `` tags. Next.js handles bundling and optimization. - -```tsx -// Bad: Manual link tag - - -// Good: Import CSS -import './styles.css' - -// Good: CSS Modules -import styles from './Button.module.css' -``` - -## Polyfills - -Next.js includes common polyfills automatically. Don't load redundant ones from polyfill.io or similar CDNs. - -Already included: `Array.from`, `Object.assign`, `Promise`, `fetch`, `Map`, `Set`, `Symbol`, `URLSearchParams`, and 50+ others. - -```tsx -// Bad: Redundant polyfills - - -// Good: Next.js Script component -import Script from 'next/script' - - -``` - -## Don't Put Script in Head - -`next/script` should not be placed inside `next/head`. It handles its own positioning. - -```tsx -// Bad: Script inside Head -import Head from 'next/head' -import Script from 'next/script' - - - - -// Good: Next.js component -import { GoogleAnalytics } from '@next/third-parties/google' - -export default function Layout({ children }) { - return ( - - {children} - - - ) -} -``` - -## Google Tag Manager - -```tsx -import { GoogleTagManager } from '@next/third-parties/google' - -export default function Layout({ children }) { - return ( - - - {children} - - ) -} -``` - -## Other Third-Party Scripts - -```tsx -// YouTube embed -import { YouTubeEmbed } from '@next/third-parties/google' - - - -// Google Maps -import { GoogleMapsEmbed } from '@next/third-parties/google' - - -``` - -## Quick Reference - -| Pattern | Issue | Fix | -|---------|-------|-----| -| `