diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 350d82112..46c1aa0a7 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -267,6 +267,18 @@ "authentication": "ON_INSTALL" }, "category": "文档处理" + }, + { + "name": "next-skills", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/next-skills" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" } ] } diff --git a/config/external-sources.json b/config/external-sources.json index 3d9ed7c2a..6b2c5dc76 100644 --- a/config/external-sources.json +++ b/config/external-sources.json @@ -406,6 +406,62 @@ "quality": 90 } ] + }, + { + "id": "next-skills", + "repo": "https://github.com/vercel-labs/next-skills.git", + "ref": "main", + "adapter": "skill-collection", + "pluginName": "next-skills", + "category": "开发工具", + "skillsPath": "skills", + "sparseCheckout": [ + "skills" + ], + "brandColor": "#000000", + "manifestOverrides": { + "version": "0.1.0", + "description": "Next.js Agent Skills 提供 Next.js 最佳实践、版本升级和 Cache Components 工作流。", + "author": { + "name": "Vercel Labs", + "url": "https://github.com/vercel-labs" + }, + "homepage": "https://github.com/vercel-labs/next-skills", + "repository": "https://github.com/vercel-labs/next-skills", + "license": "UNKNOWN", + "keywords": [ + "nextjs", + "next-skills", + "vercel", + "react", + "cache-components", + "upgrade" + ], + "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", + "category": "开发工具", + "capabilities": [ + "Read", + "Write" + ], + "defaultPrompt": [ + "使用 Next.js Agent Skills 帮我检查这个 Next.js 项目。", + "使用 Next.js Agent Skills 帮我升级 Next.js 或处理 Cache Components。" + ], + "websiteURL": "https://github.com/vercel-labs/next-skills", + "privacyPolicyURL": "https://github.com/vercel-labs/next-skills", + "termsOfServiceURL": "https://github.com/vercel-labs/next-skills", + "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 项目。" + } } ] } diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 6f7fd10bf..7d8beadae 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -71,6 +71,15 @@ "adapter": "claude-skill", "commit": "34d1f0057d51ff2cc15bcbbec071ef35f6fc1ae1", "syncedAt": "2026-06-14T16:00:01Z" + }, + { + "id": "next-skills", + "pluginName": "next-skills", + "repo": "https://github.com/vercel-labs/next-skills.git", + "ref": "main", + "adapter": "skill-collection", + "commit": "dc1de9caf7612d73f56a8dec3cb1bd6c9ec096b9", + "syncedAt": "2026-06-15T08:24:34Z" } ] } diff --git a/plugins/codex/.agents/plugins/marketplace.json b/plugins/codex/.agents/plugins/marketplace.json index 33cf425bc..f7258196f 100644 --- a/plugins/codex/.agents/plugins/marketplace.json +++ b/plugins/codex/.agents/plugins/marketplace.json @@ -267,6 +267,18 @@ "authentication": "ON_INSTALL" }, "category": "文档处理" + }, + { + "name": "next-skills", + "source": { + "source": "local", + "path": "./plugins/next-skills" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" } ] } diff --git a/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json b/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json new file mode 100644 index 000000000..8fd554ba1 --- /dev/null +++ b/plugins/codex/plugins/next-skills/.codex-plugin/plugin.json @@ -0,0 +1,41 @@ +{ + "name": "next-skills", + "version": "0.1.0", + "description": "Next.js Agent Skills 提供 Next.js 最佳实践、版本升级和 Cache Components 工作流。", + "author": { + "name": "Vercel Labs", + "url": "https://github.com/vercel-labs" + }, + "homepage": "https://github.com/vercel-labs/next-skills", + "repository": "https://github.com/vercel-labs/next-skills", + "license": "UNKNOWN", + "keywords": [ + "nextjs", + "next-skills", + "vercel", + "react", + "cache-components", + "upgrade" + ], + "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", + "category": "开发工具", + "capabilities": [ + "Read", + "Write" + ], + "defaultPrompt": [ + "使用 Next.js Agent Skills 帮我检查这个 Next.js 项目。", + "使用 Next.js Agent Skills 帮我升级 Next.js 或处理 Cache Components。" + ], + "websiteURL": "https://github.com/vercel-labs/next-skills", + "privacyPolicyURL": "https://github.com/vercel-labs/next-skills", + "termsOfServiceURL": "https://github.com/vercel-labs/next-skills", + "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 new file mode 100644 index 000000000..1c4c35745 --- /dev/null +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -0,0 +1,9 @@ +{ + "sourceId": "next-skills", + "repo": "https://github.com/vercel-labs/next-skills.git", + "ref": "main", + "commit": "dc1de9caf7612d73f56a8dec3cb1bd6c9ec096b9", + "adapter": "skill-collection", + "sourcePath": "skills", + "syncedAt": "2026-06-15T08:24:34Z" +} 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 new file mode 100644 index 000000000..b734b7339 --- /dev/null +++ b/plugins/codex/plugins/next-skills/skills/next-best-practices/SKILL.md @@ -0,0 +1,153 @@ +--- +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 new file mode 100644 index 000000000..dce8d8ccf --- /dev/null +++ b/plugins/codex/plugins/next-skills/skills/next-best-practices/async-patterns.md @@ -0,0 +1,87 @@ +# 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 new file mode 100644 index 000000000..ac5e814c1 --- /dev/null +++ b/plugins/codex/plugins/next-skills/skills/next-best-practices/bundling.md @@ -0,0 +1,180 @@ +# 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 | +|---------|-------|-----| +| `