一键导入
jikime-framework-nextjs14
Next.js 14 App Router baseline guide. Core patterns, conventions, and best practices for Next.js 14.x applications.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Next.js 14 App Router baseline guide. Core patterns, conventions, and best practices for Next.js 14.x applications.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
AI-powered legacy site rebuilding workflow. Captures screenshots, analyzes source code, and generates modern frontend/backend code. Claude Code reads screenshots and writes actual code. Use when rebuilding legacy PHP, WordPress, or similar sites to Next.js, React, or other modern frameworks.
하네스를 구성합니다. 전문 에이전트를 정의하며, 해당 에이전트가 사용할 스킬을 생성하는 메타 스킬. (1) '하네스 구성해줘', '하네스 구축해줘' 요청 시, (2) '하네스 설계', '하네스 엔지니어링' 요청 시, (3) 새로운 도메인/프로젝트에 대한 하네스 기반 자동화 체계를 구축할 때, (4) 하네스 구성을 재구성하거나 확장할 때 사용.
Leader agent role guide for jikime team orchestration. Covers task distribution, plan approval, worker monitoring, and team shutdown. Use when spawned as the leader role in a jikime team.
Reviewer agent role guide for jikime team orchestration. Covers plan review, quality assessment, acceptance criteria validation, and feedback delivery via team inbox. Use when spawned as the reviewer role in a jikime team.
Use this skill when the user asks to "jikime team을 사용해줘", "팀 만들어줘", "에이전트 생성해줘", "멀티 에이전트로 작업해줘", "병렬로 에이전트 실행해줘", "여러 에이전트 조율해줘", "작업을 여러 에이전트에게 분배해줘", "team status 확인해줘", "task 만들어줘", "inbox 확인해줘", or mentions "jikime team", "multi-agent coordination", "spawn agents", "team tasks", "agent inbox", "task board", "team leader", "team worker". Also trigger when the scope of work is large enough to benefit from splitting into parallel subtasks — for example "전체 코드베이스 리팩토링", "여러 기능 동시에 구현", "대규모 분석", "full-stack app 만들어줘". Provides comprehensive guidance for using the jikime team CLI to orchestrate multi-agent teams with task management, messaging, and monitoring.
Claude Code skill for operating as part of a jikime multi-agent team (swarm). Provides command reference, coordination protocols, and role-specific workflows for leader, worker, and reviewer agents. Triggers when the task involves multi-agent coordination, spawning workers, assigning tasks, monitoring team progress, or when the scope exceeds what a single agent can efficiently handle (e.g., "build a full-stack app", "implement multiple features in parallel", "refactor the entire codebase"). Also triggers on keywords: "create a team", "spawn agents", "assign tasks", "team status", "board attach", "agent inbox", "multi-agent", "swarm", "jikime team".
| name | jikime-framework-nextjs@14 |
| description | Next.js 14 App Router baseline guide. Core patterns, conventions, and best practices for Next.js 14.x applications. |
| tags | ["framework","nextjs","version","app-router","server-components","server-actions"] |
| triggers | {"keywords":["nextjs","next.js 14","app-router","server-components","server-actions"],"phases":["run"],"agents":["frontend"],"languages":["typescript"]} |
| progressive_disclosure | {"enabled":true,"level1_tokens":"~100","level2_tokens":"~2159"} |
| type | version |
| framework | nextjs |
| version | 14 |
| user-invocable | false |
Next.js 14 App Router의 핵심 패턴과 규칙을 정의합니다. 버전 업그레이드 시 기준점으로 사용됩니다.
| 항목 | 값 |
|---|---|
| Version | 14.0.0 ~ 14.2.x |
| Release Date | October 2023 |
| Node.js | 18.17+ |
| React | 18.2+ |
src/
└── app/
├── layout.tsx # Root layout (required)
├── page.tsx # Home page
├── loading.tsx # Loading UI
├── error.tsx # Error boundary
├── not-found.tsx # 404 page
├── [slug]/
│ └── page.tsx # Dynamic route
└── api/
├── auth/
│ └── route.ts # POST /api/auth
├── users/
│ ├── route.ts # GET, POST /api/users
│ └── [id]/
│ └── route.ts # GET, PUT, DELETE /api/users/:id
└── health-check/
└── route.ts # GET /api/health-check
| 대상 | 규칙 | 예시 |
|---|---|---|
| 폴더명 | kebab-case | user-profile/, health-check/ |
| route 파일명 | 고정 (route.ts, page.tsx) | Next.js 규약 |
| 컴포넌트 파일 | kebab-case | user-card.tsx, nav-menu.tsx |
| 컴포넌트 이름 | PascalCase | UserCard, NavMenu |
| 유틸리티 파일 | kebab-case | format-date.ts, use-auth.ts |
WHY: URL 경로가 폴더명에서 자동 생성되므로, kebab-case가 웹 표준 URL 규약과 일치합니다.
# CORRECT
src/app/user-profile/page.tsx → /user-profile
src/app/api/health-check/route.ts → /api/health-check
# WRONG
src/app/userProfile/page.tsx → /userProfile (비표준 URL)
src/app/api/healthCheck/route.ts → /api/healthCheck (비표준 URL)
// src/app/users/page.tsx - Server Component by default
async function getUsers() {
const res = await fetch('https://api.example.com/users')
return res.json()
}
export default async function UsersPage() {
const users = await getUsers()
return <UserList users={users} />
}
// src/components/counter.tsx
'use client'
import { useState } from 'react'
export function Counter() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>
}
// src/app/actions.ts
'use server'
export async function createPost(formData: FormData) {
const title = formData.get('title')
await db.post.create({ data: { title } })
revalidatePath('/posts')
}
// src/app/posts/new/page.tsx
import { createPost } from '../actions'
export default function NewPost() {
return (
<form action={createPost}>
<input name="title" />
<button type="submit">Create</button>
</form>
)
}
// Static metadata
export const metadata = {
title: 'My App',
description: 'App description',
}
// Dynamic metadata
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title }
}
// src/app/api/users/route.ts
import { NextRequest, NextResponse } from 'next/server'
export async function GET(request: NextRequest) {
const users = await db.user.findMany()
return NextResponse.json(users)
}
export async function POST(request: NextRequest) {
const body = await request.json()
const user = await db.user.create({ data: body })
return NextResponse.json(user, { status: 201 })
}
// Default: cached (equivalent to force-cache)
const data = await fetch('https://api.example.com/data')
// No caching
const data = await fetch('https://api.example.com/data', {
cache: 'no-store'
})
// Time-based revalidation
const data = await fetch('https://api.example.com/data', {
next: { revalidate: 3600 } // Revalidate every hour
})
// Tag-based revalidation
const data = await fetch('https://api.example.com/data', {
next: { tags: ['posts'] }
})
import { revalidatePath, revalidateTag } from 'next/cache'
// Path-based
revalidatePath('/posts')
revalidatePath('/posts/[slug]', 'page')
// Tag-based
revalidateTag('posts')
// src/app/posts/[slug]/page.tsx
type Props = {
params: { slug: string } // Direct access (synchronous)
searchParams: { [key: string]: string | string[] | undefined }
}
export default function PostPage({ params, searchParams }: Props) {
const { slug } = params // Direct destructuring
const { sort } = searchParams
return <div>Post: {slug}</div>
}
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map(post => ({ slug: post.slug }))
}
// src/middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest) {
const token = request.cookies.get('token')
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*']
}
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
remotePatterns: [
{ protocol: 'https', hostname: 'example.com' }
]
},
experimental: {
serverActions: true, // Enabled by default in 14.0+
}
}
module.exports = nextConfig
Next.js 프로젝트에서는 항상 shadcn/ui를 사용합니다.
# 새 프로젝트: 1) Next.js 생성 → 2) shadcn 초기화
npx create-next-app@latest my-app --typescript --tailwind --eslint --app --src-dir
cd my-app
npx shadcn@latest init
# 기존 프로젝트: 현재 프로젝트에 shadcn/ui 추가
npx shadcn@latest init
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"ui": "@/components/ui",
"utils": "@/lib/utils",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}
src/
├── app/
│ ├── layout.tsx
│ ├── page.tsx
│ ├── globals.css # Tailwind + CSS variables
│ └── api/
│ └── users/
│ └── route.ts
├── components/
│ ├── ui/ # shadcn/ui 컴포넌트 (자동 생성)
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ ├── dialog.tsx
│ │ └── ...
│ └── custom/ # 프로젝트 커스텀 컴포넌트
│ ├── user-card.tsx
│ └── nav-menu.tsx
├── hooks/ # 커스텀 훅
│ └── use-auth.ts
├── lib/
│ └── utils.ts # cn() 유틸리티 (shadcn 필수)
└── types/
└── index.ts
jikime-library-shadcn (상세 구현 가이드)// shadcn/ui 컴포넌트 사용
import { Button } from '@/components/ui/button'
import { Card, CardHeader, CardContent } from '@/components/ui/card'
export function UserCard({ user }) {
return (
<Card>
<CardHeader>{user.name}</CardHeader>
<CardContent>
<Button variant="outline">Edit</Button>
</CardContent>
</Card>
)
}
# 개별 컴포넌트 추가
npx shadcn@latest add button
npx shadcn@latest add card dialog
# 사용 가능한 컴포넌트 목록 확인
npx shadcn@latest add
| 기능 | 상태 |
|---|---|
| Server Actions | Stable |
| Partial Prerendering | Experimental |
| Turbopack | Dev only (unstable) |
params access | Synchronous |
'use cache' | Not available |
Next.js 14 → 15: See jikime-framework-nextjs@15
params/searchParams become async (Promise)Version: 1.0.0 Last Updated: 2026-01-22