Génération de code Next.js

VérifiéSûr

Génère des pages, routes API, composants serveur, layouts et middlewares Next.js en suivant les conventions du projet.

Spar Skills Guide Bot
DeveloppementDébutant
28/07/2026
Claude CodeCursorWindsurf
#nextjs#scaffolding#app-router#boilerplate#code-generation

Recommandé pour

Synthèse automatique

Génère du code Next.js prêt pour la production en détectant automatiquement la configuration du projet (App Router, TypeScript, Tailwind, etc.).

Points forts

  • Détection automatique du routeur, du répertoire source et des outils de styling.
  • Modèles de composants serveur, API routes, layouts, loading et error boundaries.
  • Respect des conventions existantes du projet.

Limites

  • Ne couvre que les patterns standards Next.js, pas de configurations avancées.
  • Dépend de l'exactitude de la détection du projet (peut échouer si la structure est inhabituelle).
Quand l'utiliser

Utilisez ce skill lorsque vous devez créer rapidement une nouvelle page, route API, layout ou autre fichier Next.js en respectant les conventions du projet.

Quand l'éviter

Évitez ce skill si vous devez générer du code pour un framework autre que Next.js, ou si vous souhaitez une personnalisation très spécifique non prise en charge par les templates.

Analyse de sécurité

Sûr
Score qualité92/100

The skill uses only safe detection commands (checking directories, grepping package.json) and generates boilerplate code. No exfiltration, destruction, or obfuscation. Allowed tools (Read, Write, Bash) are used in a controlled manner.

Aucun point d'attention détecté

Comment cette analyse est faite

Exemples

Create a new blog page
Create a new page for blog posts in the app router with metadata and a server component that fetches posts.
Add a users API route
Add an API route for users with GET and POST handlers, including error handling.
Scaffold a layout with sidebar
Scaffold a layout for the dashboard section with a sidebar navigation and content area.

name: nextjs-scaffold description: Generate Next.js pages, API routes, server components, layouts, and middleware following project conventions. Use when user says "create page", "new route", "scaffold", "generate component", "add api endpoint", "create layout", or needs any Next.js boilerplate generated. allowed-tools: Read, Write, Edit, Glob, Grep, Bash

Next.js Scaffolding

Generate production-ready Next.js code following the project's existing patterns. Auto-detects App Router vs Pages Router, TypeScript config, and styling approach.

Detection workflow

Before generating anything, detect the project's setup:

# 1. Router type
if [ -d "app" ] || [ -d "src/app" ]; then
  echo "APP_ROUTER"
elif [ -d "pages" ] || [ -d "src/pages" ]; then
  echo "PAGES_ROUTER"
fi

# 2. Source directory
if [ -d "src" ]; then
  echo "SRC_DIR=src"
else
  echo "SRC_DIR=."
fi

# 3. TypeScript
if [ -f "tsconfig.json" ]; then
  echo "TYPESCRIPT=true"
fi

# 4. Styling
if [ -f "tailwind.config.js" ] || [ -f "tailwind.config.ts" ]; then
  echo "TAILWIND=true"
fi

if ls src/**/*.module.css 2>/dev/null | head -1; then
  echo "CSS_MODULES=true"
fi

# 5. Database
grep -l "supabase" package.json 2>/dev/null && echo "SUPABASE=true"
grep -l "firebase" package.json 2>/dev/null && echo "FIREBASE=true"
grep -l "prisma" package.json 2>/dev/null && echo "PRISMA=true"

# 6. Auth
grep -l "next-auth\|@auth" package.json 2>/dev/null && echo "NEXTAUTH=true"
grep -l "@supabase/auth" package.json 2>/dev/null && echo "SUPABASE_AUTH=true"

App Router templates

Page (Server Component)

// app/{route}/page.tsx
import { Metadata } from 'next'

export const metadata: Metadata = {
  title: '{Page Title}',
  description: '{Page description}',
}

export default async function {PageName}Page() {
  // Fetch data server-side
  
  return (
    <main className="container mx-auto px-4 py-8">
      <h1 className="text-3xl font-bold">{Page Title}</h1>
    </main>
  )
}

Page with params

// app/{route}/[id]/page.tsx
interface Props {
  params: Promise<{ id: string }>
}

export default async function {Name}Page({ params }: Props) {
  const { id } = await params
  
  return (
    <main className="container mx-auto px-4 py-8">
      <h1>{id}</h1>
    </main>
  )
}

Layout

// app/{route}/layout.tsx
export default function {Name}Layout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <div>
      {children}
    </div>
  )
}

Loading state

// app/{route}/loading.tsx
export default function Loading() {
  return (
    <div className="flex items-center justify-center min-h-[50vh]">
      <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-gray-900" />
    </div>
  )
}

Error boundary

// app/{route}/error.tsx
'use client'

export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string }
  reset: () => void
}) {
  return (
    <div className="flex flex-col items-center justify-center min-h-[50vh] gap-4">
      <h2 className="text-xl font-semibold">Something went wrong</h2>
      <button
        onClick={reset}
        className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"
      >
        Try again
      </button>
    </div>
  )
}

API Route (App Router)

// app/api/{name}/route.ts
import { NextRequest, NextResponse } from 'next/server'

export async function GET(request: NextRequest) {
  try {
    // Implementation
    return NextResponse.json({ data: [] })
  } catch (error) {
    console.error('[API] {name} GET error:', error)
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    )
  }
}

export async function POST(request: NextRequest) {
  try {
    const body = await request.json()
    // Validate input
    // Implementation
    return NextResponse.json({ success: true }, { status: 201 })
  } catch (error) {
    console.error('[API] {name} POST error:', error)
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    )
  }
}

Server Action

// app/{route}/actions.ts
'use server'

import { revalidatePath } from 'next/cache'

export async function create{Name}(formData: FormData) {
  const field = formData.get('field') as string
  
  if (!field) {
    return { error: 'Field is required' }
  }

  try {
    // Database operation
    revalidatePath('/{route}')
    return { success: true }
  } catch (error) {
    return { error: 'Failed to create' }
  }
}

Middleware

// middleware.ts (project root)
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  // Auth check example
  const token = request.cookies.get('auth-token')?.value
  
  if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
    return NextResponse.redirect(new URL('/login', request.url))
  }
  
  return NextResponse.next()
}

export const config = {
  matcher: ['/dashboard/:path*', '/api/:path*'],
}

Supabase integration patterns

Server-side client

// lib/supabase/server.ts
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'

export async function createClient() {
  const cookieStore = await cookies()
  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        getAll() { return cookieStore.getAll() },
        setAll(cookiesToSet) {
          cookiesToSet.forEach(({ name, value, options }) =>
            cookieStore.set(name, value, options))
        },
      },
    }
  )
}

Client-side client

// lib/supabase/client.ts
import { createBrowserClient } from '@supabase/ssr'

export function createClient() {
  return createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  )
}

Scaffold workflow

  1. Detect project setup (router, TS, styling, DB)
  2. Read existing similar files to match patterns
  3. Generate using the matching template
  4. Verify the file compiles: npx tsc --noEmit {file}
  5. Report what was created and where

Scope constraints

  • Always detect the project setup BEFORE generating code
  • Match existing patterns (if the project uses src/, put files there)
  • Never overwrite existing files without confirmation
  • Never generate Pages Router code for App Router projects or vice versa
  • Always include error handling in API routes
  • Always include TypeScript types when the project uses TS

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/next-js-scaffolding-ms47vp3u' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/next-js-scaffolding-ms47vp3u/download' --output '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md.part' && mv '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md.part' '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Outils déclarés par l’auteur (à vérifier dans votre agent) : Read, Write, Edit, Glob, Grep, Bash

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md' && test -s '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/nextjs-scaffold' && cp -R '.skill-downloads/next-js-scaffolding-ms47vp3u' '.claude/skills/nextjs-scaffold'

Cursor
test -f '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md' && test -s '.skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/nextjs-scaffold' && cp -R '.skill-downloads/next-js-scaffolding-ms47vp3u' '.cursor/skills/nextjs-scaffold'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/next-js-scaffolding-ms47vp3u'

openskills read 'next-js-scaffolding-ms47vp3u'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/next-js-scaffolding-ms47vp3u/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires