@devflow-tools/plugin-nextjs 0.12.0 → 0.12.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/plugin-nextjs",
3
- "version": "0.12.0",
3
+ "version": "0.12.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -26,5 +26,5 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "gitHead": "b7b5606e419887fe8c1f921a8a5a564ce9afcbac"
29
+ "gitHead": "d544427472016eb332c6c2107f0fc98d8ae59c14"
30
30
  }
@@ -1,7 +0,0 @@
1
- import type { AnalysisResult } from './types.js';
2
- export declare function diagnoseBug(input: {
3
- projectRoot: string;
4
- errorMessage: string;
5
- stackTrace?: string;
6
- }): AnalysisResult;
7
- //# sourceMappingURL=diagnose-bug.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnose-bug.d.ts","sourceRoot":"","sources":["../../src/analyzers/diagnose-bug.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAgDrH"}
@@ -1,66 +0,0 @@
1
- import { readFileSync } from 'fs';
2
- import { readdirSync, statSync } from 'fs';
3
- import { join, relative } from 'path';
4
- export function diagnoseBug(input) {
5
- const { projectRoot, errorMessage } = input;
6
- const rootCauses = [];
7
- const files = scanProjectFiles(projectRoot);
8
- for (const file of files) {
9
- const content = readFileSync(file, 'utf-8');
10
- const relPath = relative(projectRoot, file);
11
- const lines = content.split('\n');
12
- // Check SSR-related issues
13
- if (/window|document|localStorage|navigator/.test(errorMessage)) {
14
- for (let i = 0; i < lines.length; i++) {
15
- if (/(window|document|localStorage|navigator)\./.test(lines[i]) && !/typeof\s+window|useEffect|useLayoutEffect/.test(lines[i])) {
16
- rootCauses.push({
17
- probability: 'high',
18
- description: 'SSR 期间访问浏览器 API',
19
- file: relPath,
20
- line: i + 1,
21
- evidence: lines[i].trim(),
22
- fix: '用 typeof window !== "undefined" 检查或将代码移到 useEffect',
23
- });
24
- }
25
- }
26
- }
27
- }
28
- return {
29
- success: true,
30
- summary: `分析错误 "${errorMessage.substring(0, 50)}...",发现 ${rootCauses.length} 个可能原因`,
31
- data: { rootCauses },
32
- findings: rootCauses.map(rc => ({
33
- severity: rc.probability === 'high' ? 'critical' : 'warning',
34
- category: 'bug-root-cause',
35
- title: rc.description,
36
- description: rc.evidence ?? rc.description,
37
- file: rc.file,
38
- line: rc.line,
39
- suggestion: rc.fix,
40
- })),
41
- };
42
- }
43
- function scanProjectFiles(root) {
44
- const files = [];
45
- function walk(dir) {
46
- try {
47
- for (const entry of readdirSync(dir)) {
48
- if (['node_modules', 'dist', 'build', '.git', '.next'].includes(entry))
49
- continue;
50
- const fullPath = join(dir, entry);
51
- try {
52
- const stat = statSync(fullPath);
53
- if (stat.isDirectory())
54
- walk(fullPath);
55
- else if (/\.(tsx?|jsx?)$/.test(entry))
56
- files.push(fullPath);
57
- }
58
- catch { }
59
- }
60
- }
61
- catch { }
62
- }
63
- walk(root);
64
- return files;
65
- }
66
- //# sourceMappingURL=diagnose-bug.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnose-bug.js","sourceRoot":"","sources":["../../src/analyzers/diagnose-bug.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { AnalysisResult } from './types.js';
2
- export declare function generatePage(pageName: string, route: string): AnalysisResult;
3
- //# sourceMappingURL=new-page.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new-page.d.ts","sourceRoot":"","sources":["../../src/analyzers/new-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAmC5E"}
@@ -1,34 +0,0 @@
1
- export function generatePage(pageName, route) {
2
- const componentName = pageName.charAt(0).toUpperCase() + pageName.slice(1);
3
- const pageCode = `import { Metadata } from 'next';
4
-
5
- export const metadata: Metadata = {
6
- title: '${componentName}',
7
- };
8
-
9
- export default async function ${componentName}Page() {
10
- return (
11
- <main>
12
- <h1>${componentName}</h1>
13
- </main>
14
- );
15
- }
16
- `;
17
- const routeConfig = route
18
- ? `// Add to next.config.js or use App Router convention
19
- // Route: ${route}
20
- // File: app${route}/page.tsx`
21
- : '';
22
- return {
23
- success: true,
24
- summary: `生成 ${componentName} 页面`,
25
- data: {
26
- generatedCode: { page: pageCode, routeConfig },
27
- filesToCreate: [
28
- { path: `app/${route || pageName.toLowerCase()}/page.tsx`, type: 'page' },
29
- ],
30
- renderingStrategy: 'server-side (default)',
31
- },
32
- };
33
- }
34
- //# sourceMappingURL=new-page.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new-page.js","sourceRoot":"","sources":["../../src/analyzers/new-page.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa;IAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,QAAQ,GAAG;;;YAGP,aAAa;;;gCAGO,aAAa;;;YAGjC,aAAa;;;;CAIxB,CAAC;IAEA,MAAM,WAAW,GAAG,KAAK;QACvB,CAAC,CAAC;YACM,KAAK;cACH,KAAK,WAAW;QAC1B,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,MAAM,aAAa,KAAK;QACjC,IAAI,EAAE;YACJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC9C,aAAa,EAAE;gBACb,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;aAC1E;YACD,iBAAiB,EAAE,uBAAuB;SAC3C;KACF,CAAC;AACJ,CAAC"}
@@ -1,19 +0,0 @@
1
- export interface AnalysisResult {
2
- success: boolean;
3
- summary: string;
4
- findings?: Finding[];
5
- metrics?: Record<string, number | string>;
6
- data?: unknown;
7
- error?: string;
8
- }
9
- export interface Finding {
10
- severity: 'critical' | 'warning' | 'info' | 'suggestion';
11
- category: string;
12
- title: string;
13
- description: string;
14
- file?: string;
15
- line?: number;
16
- suggestion?: string;
17
- codeSnippet?: string;
18
- }
19
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type { DevFlowPlugin } from "@devflow-tools/sdk";
2
- export declare const nextjsPlugin: DevFlowPlugin;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,YAAY,EAAE,aAuzB1B,CAAC"}
package/dist/index.js DELETED
@@ -1,818 +0,0 @@
1
- export const nextjsPlugin = {
2
- meta: {
3
- name: "nextjs",
4
- version: "0.1.0",
5
- description: "Next.js 专家 — App Router、SSR/SSG/ISR、Server Components、Middleware、部署",
6
- icon: "▲",
7
- tags: ["frontend", "nextjs", "react", "ssr", "server-components"],
8
- },
9
- knowledge: {
10
- sources: [
11
- {
12
- name: "nextjs-docs",
13
- urls: [
14
- "https://nextjs.org/docs",
15
- "https://nextjs.org/docs/app/building-your-application",
16
- "https://nextjs.org/docs/app/api-reference",
17
- ],
18
- pluginName: "nextjs",
19
- version: "14.2.0",
20
- renderJs: true,
21
- },
22
- ],
23
- },
24
- memory: {
25
- project: {
26
- stack: ["Next.js 14", "App Router", "React Server Components", "Vercel"],
27
- conventions: [
28
- { key: "components", value: "组件默认 Server Components,需要交互才加 'use client'", source: "manual", confidence: 0.9 },
29
- { key: "routing", value: "使用 App Router 文件系统路由(page.tsx/layout.tsx/loading.tsx/error.tsx)", source: "manual", confidence: 0.9 },
30
- { key: "fetching", value: "服务端数据获取使用 fetch + React cache(),客户端使用 SWR/React Query", source: "manual", confidence: 0.85 },
31
- { key: "rendering", value: "静态页面用 generateStaticParams + ISR,动态页面用 SSR", source: "manual", confidence: 0.85 },
32
- ],
33
- },
34
- global: [
35
- {
36
- id: "nextjs:app-router",
37
- source: "nextjs",
38
- title: "App Router 核心概念",
39
- content: "App Router 基于文件系统:page.tsx(页面)、layout.tsx(共享布局)、loading.tsx(加载状态)、error.tsx(错误边界)、not-found.tsx(404)。布局嵌套且保持状态。路由组用 (folder) 不影响 URL。",
40
- embedding: [],
41
- },
42
- {
43
- id: "nextjs:server-components",
44
- source: "nextjs",
45
- title: "Server Components 模式",
46
- content: "默认所有组件是 Server Component。use client 声明客户端边界。Server Component 可以 async/await 直接查询数据库。客户端组件通过 props 从服务端组件接收数据。减少客户端 JS 体积。",
47
- embedding: [],
48
- },
49
- {
50
- id: "nextjs:caching-strategies",
51
- source: "nextjs",
52
- title: "Next.js 缓存策略",
53
- content: "四种缓存:Request Memoization(fetch 去重)、Data Cache(fetch 持久缓存)、Full Route Cache(静态渲染缓存)、Router Cache(客户端路由缓存)。revalidate/export const dynamic 控制缓存行为。",
54
- embedding: [],
55
- },
56
- {
57
- id: "nextjs:middleware-edge",
58
- source: "nextjs",
59
- title: "Middleware 与 Edge Runtime",
60
- content: "middleware.ts 在请求到达前执行(Edge Runtime)。用于认证重定向、A/B 测试、国际化路由、bot 保护。不能直接访问数据库(Edge 限制)。使用 matcher 配置匹配路径。",
61
- embedding: [],
62
- },
63
- ],
64
- },
65
- workflow: {
66
- steps: [],
67
- templates: [
68
- // ── 新建页面 ──
69
- {
70
- name: "new-page",
71
- description: "新建 Next.js 页面(路由 + 数据获取 + 渲染策略)",
72
- version: "2.0.0",
73
- steps: [
74
- {
75
- id: "determine-rendering",
76
- title: "确定渲染策略",
77
- instruction: [
78
- "## 确定渲染策略(SSG / SSR / ISR 选型)",
79
- "",
80
- "根据页面需求选择合适的 Next.js 渲染策略。",
81
- "",
82
- "**执行动作**:",
83
- "1. 分析页面数据特征:",
84
- " - 数据是否每次请求都变化? → SSR(动态渲染)",
85
- " - 数据可预先获取且变化不频繁? → SSG(静态生成)",
86
- " - 需要定时更新但不需要每次请求都生成? → ISR(增量静态再生)",
87
- " - 完全静态(无数据)? → 默认静态渲染",
88
- "2. 检查页面是否需要用户特定数据(cookies、headers):",
89
- " - 是 → SSR 或客户端获取",
90
- " - 否 → SSG / ISR",
91
- "3. 确定 URL 结构:",
92
- " - 动态路由(如 `/posts/[id]`) → 使用 `generateStaticParams`",
93
- " - 静态路由 → 直接创建 `page.tsx`",
94
- "4. 查看 `next.config.ts` 中是否有相关配置",
95
- "",
96
- "**产出格式**:",
97
- "```",
98
- "route_path: </posts/[id]>",
99
- "rendering_strategy: SSG | SSR | ISR | static",
100
- "needs_generateStaticParams: true | false",
101
- "revalidate_seconds: <N | false>",
102
- "data_source: <数据库 | API | 静态>",
103
- "```",
104
- ].join("\n"),
105
- suggestedTools: ["Read", "Bash"],
106
- output: "渲染策略决策(SSG/SSR/ISR)及数据获取方式",
107
- },
108
- {
109
- id: "create-route",
110
- title: "创建 App Router 路由",
111
- instruction: [
112
- "## 创建 App Router 路由目录和 page.tsx",
113
- "",
114
- "基于 `determine-rendering` 的路由规划,创建对应的 App Router 文件结构。",
115
- "",
116
- "**执行动作**:",
117
- "1. 创建路由目录(遵循 App Router 文件系统约定):",
118
- " ```bash",
119
- " mkdir -p app/<route-path>/",
120
- " # 例如: mkdir -p app/posts/[id]/",
121
- " # 动态路由用方括号: [id], [...slug], [[...slug]]",
122
- " # 路由组用圆括号: (marketing)/about",
123
- " ```",
124
- "2. 创建 `page.tsx` 文件:",
125
- " - 默认导出一个 React 组件",
126
- " - Server Component 默认(不加 `'use client'`)",
127
- " - 如需客户端交互(useState、useEffect、事件处理器)才加 `'use client'`",
128
- "3. 编写 page 组件基础结构:",
129
- " ```typescript",
130
- " // app/posts/[id]/page.tsx",
131
- " export default async function PostPage({ params }: { params: { id: string } }) {",
132
- " // 数据获取将在 implement-data-fetching 步骤实现",
133
- " return <div>Post {params.id}</div>;",
134
- " }",
135
- " ```",
136
- "4. 检查 `app/layout.tsx` 是否存在(根布局必须有)",
137
- "",
138
- "**产出格式**:",
139
- "```",
140
- "route_directory: app/<route-path>/",
141
- "page_file: app/<route-path>/page.tsx",
142
- "is_client_component: true | false",
143
- "dynamic_segments: [id, slug, ...]",
144
- "```",
145
- ].join("\n"),
146
- suggestedTools: ["Bash", "Read", "Write"],
147
- output: "创建的路由目录和 page.tsx 文件",
148
- depends: ["determine-rendering"],
149
- },
150
- {
151
- id: "create-layout",
152
- title: "创建共享布局",
153
- instruction: [
154
- "## 创建 layout.tsx(共享布局 + metadata)",
155
- "",
156
- "为新建路由创建共享布局,定义页面结构和 SEO 元数据。",
157
- "",
158
- "**执行动作**:",
159
- "1. 在路由目录创建 `layout.tsx`:",
160
- " ```bash",
161
- " ls app/<route-path>/",
162
- " ```",
163
- "2. 编写 layout 组件:",
164
- " - 接收 `children` prop(嵌套的页面组件)",
165
- " - 布局在导航时保持状态(不会重新渲染)",
166
- " - 默认也是 Server Component",
167
- " ```typescript",
168
- " // app/posts/layout.tsx",
169
- " import type { Metadata } from 'next';",
170
- "",
171
- " export const metadata: Metadata = {",
172
- " title: 'Posts',",
173
- " description: 'Browse all posts',",
174
- " };",
175
- "",
176
- " export default function PostsLayout({ children }: { children: React.ReactNode }) {",
177
- " return (",
178
- " <section>",
179
- " <nav>...</nav>",
180
- " {children}",
181
- " </section>",
182
- " );",
183
- " }",
184
- " ```",
185
- "3. 导出 `metadata` 对象(用于 SEO)或使用 `generateMetadata` 函数(动态 metadata)",
186
- "4. 布局可嵌套:父布局包裹子布局",
187
- "",
188
- "**产出格式**:",
189
- "```",
190
- "layout_file: app/<route-path>/layout.tsx",
191
- "has_metadata: true | false",
192
- "metadata: { title, description, openGraph? }",
193
- "```",
194
- ].join("\n"),
195
- suggestedTools: ["Read", "Write"],
196
- output: "创建的 layout.tsx 和 metadata 配置",
197
- depends: ["create-route"],
198
- },
199
- {
200
- id: "add-loading-error",
201
- title: "添加加载和错误状态",
202
- instruction: [
203
- "## 添加 loading.tsx 和 error.tsx",
204
- "",
205
- "为路由添加加载状态和错误边界,提升用户体验。",
206
- "",
207
- "**执行动作**:",
208
- "1. 创建 `loading.tsx`(自动配合 Suspense 使用):",
209
- " ```typescript",
210
- " // app/<route-path>/loading.tsx",
211
- " export default function Loading() {",
212
- " return <div>Loading...</div>;",
213
- " }",
214
- " ```",
215
- " - 当页面组件 suspend 时自动显示",
216
- " - 可配合 `react-loading-skeleton` 或自定义 skeleton",
217
- "2. 创建 `error.tsx`(React 错误边界):",
218
- " ```typescript",
219
- " // app/<route-path>/error.tsx",
220
- " 'use client'; // 必须是 Client Component",
221
- "",
222
- " export default function Error({ error, reset }: { error: Error; reset: () => void }) {",
223
- " return (",
224
- " <div>",
225
- " <h2>Something went wrong</h2>",
226
- " <button onClick={() => reset()}>Try again</button>",
227
- " </div>",
228
- " );",
229
- " }",
230
- " ```",
231
- " - 必须标记 `'use client'`(因为用到事件处理器)",
232
- " - 提供 `reset` 函数让用户重试",
233
- "3. 创建 `not-found.tsx`(404 页面,可选)",
234
- "",
235
- "**产出格式**:",
236
- "```",
237
- "loading_file: app/<route-path>/loading.tsx",
238
- "error_file: app/<route-path>/error.tsx",
239
- "not_found_file: app/<route-path>/not-found.tsx | null",
240
- "```",
241
- ].join("\n"),
242
- suggestedTools: ["Read", "Write"],
243
- output: "创建的 loading.tsx、error.tsx 文件",
244
- depends: ["create-route"],
245
- },
246
- {
247
- id: "implement-data-fetching",
248
- title: "实现数据获取",
249
- instruction: [
250
- "## 实现数据获取",
251
- "",
252
- "基于 `determine-rendering` 的渲染策略,在 Server Component 中实现数据获取。",
253
- "",
254
- "**执行动作**:",
255
- "1. 根据渲染策略实现数据获取:",
256
- "",
257
- " **SSG(静态生成)**:",
258
- " ```typescript",
259
- " // app/posts/[id]/page.tsx",
260
- " export async function generateStaticParams() {",
261
- " const posts = await fetch('https://api.example.com/posts').then(res => res.json());",
262
- " return posts.map((post) => ({ id: post.id }));",
263
- " }",
264
- "",
265
- " export default async function PostPage({ params }: { params: { id: string } }) {",
266
- " const post = await fetch(`https://api.example.com/posts/${params.id}`).then(res => res.json());",
267
- " return <article>{post.title}</article>;",
268
- " }",
269
- " ```",
270
- "",
271
- " **SSR(动态渲染)**:",
272
- " ```typescript",
273
- " export const dynamic = 'force-dynamic'; // 或默认",
274
- "",
275
- " export default async function PostPage({ params }: { params: { id: string } }) {",
276
- " const post = await fetch(`...`, { cache: 'no-store' }).then(res => res.json());",
277
- " return <article>{post.title}</article>;",
278
- " }",
279
- " ```",
280
- "",
281
- " **ISR(增量再生)**:",
282
- " ```typescript",
283
- " export const revalidate = 60; // 60 秒后重新验证",
284
- "",
285
- " export default async function PostPage({ params }: { params: { id: string } }) {",
286
- " const post = await fetch(`...`, { next: { revalidate: 60 } }).then(res => res.json());",
287
- " return <article>{post.title}</article>;",
288
- " }",
289
- " ```",
290
- "2. 使用 `fetch + cache()` 封装可复用的数据获取:",
291
- " ```typescript",
292
- " import { cache } from 'react';",
293
- " export const getPost = cache(async (id: string) => {",
294
- " return fetch(`...`).then(res => res.json());",
295
- " });",
296
- " ```",
297
- "3. 处理 loading / error / not-found 状态",
298
- "4. 添加 TypeScript 类型定义",
299
- "",
300
- "**产出格式**:",
301
- "```",
302
- "data_fetching_approach: generateStaticParams | async-component | revalidate",
303
- "fetch_function: getPost | getPosts | ...",
304
- "cache_strategy: force-cache | no-store | revalidate",
305
- "files_modified: [{ path, changes }]",
306
- "```",
307
- ].join("\n"),
308
- suggestedTools: ["Read", "Write", "Edit"],
309
- output: "实现的数据获取逻辑和缓存策略",
310
- depends: ["determine-rendering", "create-route"],
311
- },
312
- { id: "type-check", stepTemplate: "type-check", depends: ["implement-data-fetching"] },
313
- { id: "build-verify", stepTemplate: "build-verify", depends: ["type-check"] },
314
- ],
315
- triggers: [
316
- { type: "cli", command: "new:page" },
317
- { type: "mcp", tool: "new_page" },
318
- ],
319
- },
320
- // ── Pages → App 迁移 ──
321
- {
322
- name: "migrate-pages-to-app",
323
- description: "Pages Router → App Router 迁移:路由映射 → 数据获取 → 渐进迁移",
324
- version: "2.0.0",
325
- steps: [
326
- {
327
- id: "inventory-pages",
328
- title: "盘点现有页面",
329
- instruction: [
330
- "## 盘点所有 Pages Router 页面",
331
- "",
332
- "扫描项目中所有使用 Pages Router 的页面、数据获取方式和 API 路由。",
333
- "",
334
- "**执行动作**:",
335
- "1. 列出 `pages/` 目录下所有页面文件:",
336
- " ```bash",
337
- " find pages/ -type f \\( -name '*.tsx' -o -name '*.ts' -o -name '*.jsx' -o -name '*.js' \\) | grep -v '_app\\|_document\\|api/' | sort",
338
- " ```",
339
- "2. 识别每个页面的数据获取方式:",
340
- " ```bash",
341
- " grep -rn 'getServerSideProps\\|getStaticProps\\|getStaticPaths\\|getInitialProps' pages/ --include='*.tsx' --include='*.ts'",
342
- " ```",
343
- "3. 列出所有 API Routes:",
344
- " ```bash",
345
- " find pages/api/ -type f | sort",
346
- " ```",
347
- "4. 检查 `_app.tsx` 和 `_document.tsx` 的自定义内容:",
348
- " ```bash",
349
- " cat pages/_app.tsx 2>/dev/null || cat pages/_app.jsx 2>/dev/null",
350
- " cat pages/_document.tsx 2>/dev/null || cat pages/_document.jsx 2>/dev/null",
351
- " ```",
352
- "5. 检查 `next.config.js` 或 `next.config.ts` 配置:",
353
- " ```bash",
354
- " cat next.config.* 2>/dev/null | head -50",
355
- " ```",
356
- "",
357
- "**产出格式**:",
358
- "```",
359
- "pages: [",
360
- " { route: '/dashboard', file: 'pages/dashboard.tsx', data_fetching: 'getServerSideProps' },",
361
- " { route: '/posts/[id]', file: 'pages/posts/[id].tsx', data_fetching: 'getStaticProps + getStaticPaths' },",
362
- "]",
363
- "api_routes: [",
364
- " { route: '/api/users', file: 'pages/api/users.ts', methods: ['GET', 'POST'] },",
365
- "]",
366
- "custom_app: true | false,",
367
- "custom_document: true | false,",
368
- "```",
369
- ].join("\n"),
370
- suggestedTools: ["Bash", "Read"],
371
- output: "Pages Router 完整清单(页面、数据获取、API 路由)",
372
- },
373
- {
374
- id: "map-routes",
375
- title: "映射路由结构",
376
- instruction: [
377
- "## 映射路由到 App Router 结构",
378
- "",
379
- "将 `inventory-pages` 中的每个 Pages Router 路由映射到 App Router 文件结构。",
380
- "",
381
- "**执行动作**:",
382
- "1. 为每个页面创建映射关系:",
383
- " ```",
384
- " pages/index.tsx → app/page.tsx",
385
- " pages/about.tsx → app/about/page.tsx",
386
- " pages/posts/[id].tsx → app/posts/[id]/page.tsx",
387
- " pages/blog/[...slug].tsx → app/blog/[...slug]/page.tsx",
388
- " pages/(group)/x.tsx → app/(group)/x/page.tsx",
389
- " ```",
390
- "2. 创建 `app/` 目录结构:",
391
- " ```bash",
392
- " mkdir -p app/",
393
- " # 为每个路由创建对应目录",
394
- " ```",
395
- "3. 迁移 `_app.tsx` 内容到 `app/layout.tsx`:",
396
- " - 全局 Providers(Theme、Auth、QueryClient)",
397
- " - 全局样式导入",
398
- "4. 迁移 `_document.tsx` 内容(如自定义 HTML/head):",
399
- " - 使用 `app/layout.tsx` 的 `<html>` 和 `<body>` 标签",
400
- " - Metadata API 替代 `<Head>` 组件",
401
- "5. 迁移路由级布局(如共享侧边栏)到 `layout.tsx`",
402
- "",
403
- "**产出格式**:",
404
- "```",
405
- "route_mapping: [",
406
- " { from: 'pages/about.tsx', to: 'app/about/page.tsx' },",
407
- " { from: 'pages/posts/[id].tsx', to: 'app/posts/[id]/page.tsx' },",
408
- "]",
409
- "layouts_created: ['app/layout.tsx', 'app/posts/layout.tsx'],",
410
- "```",
411
- ].join("\n"),
412
- suggestedTools: ["Bash", "Read", "Write"],
413
- output: "路由映射表和创建的 App Router 目录结构",
414
- depends: ["inventory-pages"],
415
- },
416
- {
417
- id: "migrate-data-fetching",
418
- title: "迁移数据获取",
419
- instruction: [
420
- "## 迁移数据获取(Pages → App Router)",
421
- "",
422
- "将 Pages Router 的数据获取方式迁移到 App Router 的 async components。",
423
- "",
424
- "**执行动作**:",
425
- "1. **`getServerSideProps` → async Server Component**:",
426
- " ```typescript",
427
- " // 旧: pages/dashboard.tsx",
428
- " export async function getServerSideProps(context) {",
429
- " const data = await fetch(...);",
430
- " return { props: { data } };",
431
- " }",
432
- " export default function Dashboard({ data }) { ... }",
433
- "",
434
- " // 新: app/dashboard/page.tsx",
435
- " export default async function DashboardPage() {",
436
- " const data = await fetch(..., { cache: 'no-store' });",
437
- " return <Dashboard data={data} />;",
438
- " }",
439
- " ```",
440
- "",
441
- "2. **`getStaticProps` + `getStaticPaths` → `generateStaticParams`**:",
442
- " ```typescript",
443
- " // 新: app/posts/[id]/page.tsx",
444
- " export async function generateStaticParams() {",
445
- " const posts = await fetch(...).then(res => res.json());",
446
- " return posts.map(p => ({ id: p.id }));",
447
- " }",
448
- " export default async function PostPage({ params }) {",
449
- " const post = await fetch(`${API}/posts/${params.id}`);",
450
- " return <Post post={post} />;",
451
- " }",
452
- " ```",
453
- "",
454
- "3. **`getInitialProps` → 重构为 async component 或客户端获取**",
455
- "",
456
- "4. 迁移 `context` 参数:",
457
- " - `context.params` → `params` prop",
458
- " - `context.query` → `searchParams` prop",
459
- " - `context.req/res` → Route Handlers 或 cookies()/headers()",
460
- "",
461
- "**产出格式**:",
462
- "```",
463
- "migrated_pages: [",
464
- " { from: 'pages/x.tsx', fetching_before: 'getServerSideProps', fetching_after: 'async component' },",
465
- "]",
466
- "files_modified: [{ path, changes }]",
467
- "```",
468
- ].join("\n"),
469
- suggestedTools: ["Read", "Write", "Edit"],
470
- output: "迁移后的数据获取逻辑",
471
- depends: ["map-routes"],
472
- },
473
- {
474
- id: "add-loading-states",
475
- title: "添加加载状态",
476
- instruction: [
477
- "## 添加 loading.tsx 和 Suspense 边界",
478
- "",
479
- "为迁移后的页面添加加载状态和 Suspense 边界。",
480
- "",
481
- "**执行动作**:",
482
- "1. 为每个数据获取页面创建 `loading.tsx`:",
483
- " ```bash",
484
- " # 找到所有有数据获取的路由目录",
485
- " grep -rn 'await fetch\\|await get' app/ --include='*.tsx' -l | sed 's|/page.tsx||' | sort -u",
486
- " ```",
487
- "2. 创建 `loading.tsx` 使用 Skeleton 或 Spinner:",
488
- " ```typescript",
489
- " export default function Loading() {",
490
- " return <div className='animate-pulse'>Loading...</div>;",
491
- " }",
492
- " ```",
493
- "3. 在 Server Component 中使用 `<Suspense>` 包裹慢速数据获取:",
494
- " ```typescript",
495
- " import { Suspense } from 'react';",
496
- "",
497
- " export default function Page() {",
498
- " return (",
499
- " <Suspense fallback={<Loading />}>",
500
- " <SlowDataComponent />",
501
- " </Suspense>",
502
- " );",
503
- " }",
504
- " ```",
505
- "4. 为每个有数据获取的路由创建 `error.tsx` 错误边界",
506
- "",
507
- "**产出格式**:",
508
- "```",
509
- "loading_files: ['app/dashboard/loading.tsx', ...],",
510
- "suspense_boundaries: [{ file, wrapped_component }],",
511
- "error_files: ['app/dashboard/error.tsx', ...],",
512
- "```",
513
- ].join("\n"),
514
- suggestedTools: ["Bash", "Read", "Write"],
515
- output: "创建的 loading.tsx 和 Suspense 边界",
516
- depends: ["migrate-data-fetching"],
517
- },
518
- {
519
- id: "migrate-api-routes",
520
- title: "迁移 API 路由",
521
- instruction: [
522
- "## 迁移 API Routes 到 Route Handlers",
523
- "",
524
- "将 `pages/api/` 下的 API 路由迁移到 App Router 的 Route Handlers。",
525
- "",
526
- "**执行动作**:",
527
- "1. 将每个 API 路由文件迁移到 Route Handler:",
528
- " ```",
529
- " pages/api/users.ts → app/api/users/route.ts",
530
- " pages/api/posts/[id].ts → app/api/posts/[id]/route.ts",
531
- " ```",
532
- "2. 转换导出格式:",
533
- " ```typescript",
534
- " // 旧: pages/api/users.ts",
535
- " export default function handler(req: NextApiRequest, res: NextApiResponse) {",
536
- " if (req.method === 'GET') { ... }",
537
- " }",
538
- "",
539
- " // 新: app/api/users/route.ts",
540
- " import { NextRequest, NextResponse } from 'next/server';",
541
- "",
542
- " export async function GET(request: NextRequest) {",
543
- " return NextResponse.json({ data: ... });",
544
- " }",
545
- " export async function POST(request: NextRequest) {",
546
- " const body = await request.json();",
547
- " return NextResponse.json({ data: ... });",
548
- " }",
549
- " ```",
550
- "3. 转换请求解析方式:",
551
- " - `req.query` → `request.nextUrl.searchParams`",
552
- " - `req.body` → `await request.json()`",
553
- " - `req.headers` → `request.headers`",
554
- " - `res.status(200).json(data)` → `NextResponse.json(data)`",
555
- "4. 检查是否需要 Edge Runtime(`export const runtime = 'edge'`)",
556
- "5. 创建对应目录:",
557
- " ```bash",
558
- " mkdir -p app/api/users/",
559
- " ```",
560
- "",
561
- "**产出格式**:",
562
- "```",
563
- "migrated_api_routes: [",
564
- " { from: 'pages/api/users.ts', to: 'app/api/users/route.ts', methods: ['GET', 'POST'] },",
565
- "]",
566
- "edge_runtime_routes: ['app/api/users/route.ts'],",
567
- "```",
568
- ].join("\n"),
569
- suggestedTools: ["Bash", "Read", "Write", "Edit"],
570
- output: "迁移后的 Route Handlers",
571
- depends: ["map-routes"],
572
- },
573
- { id: "build-test", stepTemplate: "build-verify", depends: ["add-loading-states", "migrate-api-routes"] },
574
- ],
575
- triggers: [
576
- { type: "cli", command: "migrate:app-router" },
577
- ],
578
- },
579
- // ── Bug 诊断 ──
580
- {
581
- name: "bug-diagnosis",
582
- description: "Next.js Bug 诊断:错误类型 → 渲染层 → 构建配置 → 修复",
583
- version: "2.0.0",
584
- steps: [
585
- {
586
- id: "classify-error",
587
- title: "分类错误类型",
588
- instruction: [
589
- "## 分类错误(编译 / 运行时 / 构建 / 部署错误)",
590
- "",
591
- "根据错误信息分类,确定排查方向。",
592
- "",
593
- "**执行动作**:",
594
- "1. 收集错误信息:",
595
- " - 浏览器控制台错误",
596
- " - 终端构建/开发服务器输出",
597
- " - Vercel 部署日志(如适用)",
598
- "2. 分类错误类型:",
599
- " - **编译错误**:TypeScript 错误、ESLint 错误、语法错误",
600
- " - **运行时错误**:Hydration mismatch、客户端/服务端不一致、React 错误边界",
601
- " - **构建错误**:`next build` 失败、webpack/turbopack 错误",
602
- " - **部署错误**:Vercel 函数超时、Edge Runtime 不兼容",
603
- " - **渲染错误**:SSR/SSG 失败、Server Component 错误",
604
- "3. 记录错误出现时机:",
605
- " - 开发时 vs 生产构建",
606
- " - 首次加载 vs 客户端导航",
607
- "",
608
- "**产出格式**:",
609
- "```",
610
- "error_type: compile | runtime | build | deploy | rendering",
611
- "error_message: <完整错误消息>",
612
- "stack_trace: <关键帧>",
613
- "occurs_in: dev | prod | both",
614
- "trigger: initial-load | client-navigation | api-call",
615
- "```",
616
- ].join("\n"),
617
- suggestedTools: ["Read", "Bash"],
618
- output: "错误分类和上下文信息",
619
- },
620
- {
621
- id: "check-rendering-layer",
622
- title: "检查渲染层问题",
623
- instruction: [
624
- "## 检查 Server/Client Component 边界问题",
625
- "",
626
- "排查是否是 Server Component 和 Client Component 的边界问题。",
627
- "",
628
- "**执行动作**:",
629
- "1. 检查 Hydration 错误(常见错误码:",
630
- " - **Text content does not match**:服务端和客户端渲染内容不一致",
631
- " - **Expected server HTML to contain a matching**:DOM 结构不匹配",
632
- "2. 检查 `'use client'` 使用是否正确:",
633
- " ```bash",
634
- " grep -rn \"'use client'\" app/ --include='*.tsx' --include='*.ts'",
635
- " ```",
636
- "3. 检查 Server Component 中是否使用了客户端 Hook:",
637
- " - useState、useEffect、useContext 等只能在 Client Component 使用",
638
- " - 事件处理器(onClick、onChange)只能在 Client Component",
639
- " - `window`、`document`、`localStorage` 只能在 Client Component",
640
- "4. 检查 Client Component 是否直接 import 了 Server-only 模块:",
641
- " - 数据库客户端、文件系统、服务端密钥",
642
- " - 应使用 `server-only` 包保护",
643
- "5. 检查序列化问题:",
644
- " - Props 从 Server Component 传递给 Client Component 必须可序列化",
645
- " - 不能传递函数、类实例、Date 对象(需转换为字符串)",
646
- "",
647
- "**产出格式**:",
648
- "```",
649
- "hydration_issues: [{ file, line, issue_type: 'use-client-missing' | 'serialization' | 'hook-in-server' }],",
650
- "boundary_violations: [{ file, issue: '...' }],",
651
- "```",
652
- ].join("\n"),
653
- suggestedTools: ["Bash", "Read"],
654
- output: "渲染层问题分析结果",
655
- depends: ["classify-error"],
656
- },
657
- {
658
- id: "check-build-config",
659
- title: "检查构建配置",
660
- instruction: [
661
- "## 检查 next.config.ts 配置",
662
- "",
663
- "排查 Next.js 配置文件是否有问题。",
664
- "",
665
- "**执行动作**:",
666
- "1. 读取 `next.config.ts` 或 `next.config.js`:",
667
- " ```bash",
668
- " cat next.config.ts 2>/dev/null || cat next.config.js 2>/dev/null || cat next.config.mjs 2>/dev/null",
669
- " ```",
670
- "2. 检查常见配置问题:",
671
- " - `images.domains` / `images.remotePatterns` 是否正确配置",
672
- " - `experimental` 功能是否启用但实际未使用",
673
- " - `output: 'standalone'` 是否与部署目标匹配",
674
- " - `basePath` / `trailingSlash` 是否影响路由",
675
- " - `redirects` / `rewrites` 是否有冲突",
676
- "3. 检查 TypeScript 配置:",
677
- " ```bash",
678
- " cat tsconfig.json",
679
- " ```",
680
- " - `compilerOptions.paths` 是否正确",
681
- " - `include` / `exclude` 是否遗漏了 `app/` 目录",
682
- "4. 检查环境变量:",
683
- " ```bash",
684
- " cat .env.local 2>/dev/null | head -20",
685
- " cat .env 2>/dev/null | head -20",
686
- " ```",
687
- " - `NEXT_PUBLIC_*` 前缀是否正确(客户端可访问)",
688
- " - 敏感变量是否缺少前缀(只在服务端使用)",
689
- "",
690
- "**产出格式**:",
691
- "```",
692
- "config_issues: [{ file, key, issue: '...' }],",
693
- "env_issues: [{ var_name, issue: 'missing NEXT_PUBLIC_ prefix' }],",
694
- "typescript_issues: [{ file, issue: '...' }],",
695
- "```",
696
- ].join("\n"),
697
- suggestedTools: ["Read", "Bash"],
698
- output: "构建配置问题分析结果",
699
- depends: ["classify-error"],
700
- },
701
- {
702
- id: "check-cache",
703
- title: "检查缓存行为",
704
- instruction: [
705
- "## 检查缓存行为是否导致数据过期",
706
- "",
707
- "排查 Next.js 缓存策略是否导致数据不更新。",
708
- "",
709
- "**执行动作**:",
710
- "1. 检查数据获取的缓存配置:",
711
- " ```bash",
712
- " grep -rn 'fetch(' app/ --include='*.tsx' --include='*.ts' -A 3",
713
- " ```",
714
- " - 检查 `cache` 选项:`force-cache`(默认)、`no-store`、`no-cache`",
715
- " - 检查 `next.revalidate` 选项",
716
- "2. 检查 `revalidate` 配置:",
717
- " ```bash",
718
- " grep -rn 'export const revalidate\\|export const dynamic' app/ --include='*.tsx' --include='*.ts'",
719
- " ```",
720
- "3. 检查是否使用了 `unstable_cache` 或 `cache()`:",
721
- " ```bash",
722
- " grep -rn 'unstable_cache\\|from.*react.*cache' app/ --include='*.tsx' --include='*.ts'",
723
- " ```",
724
- "4. 检查 ISR 配置:",
725
- " - `generateStaticParams` 的 `revalidate` 设置",
726
- " - `revalidatePath()` / `revalidateTag()` 调用",
727
- "5. 排查 Router Cache(客户端路由缓存):",
728
- " - `router.refresh()` 是否用于强制刷新",
729
- " - `<Link>` 组件的 `prefetch` 属性",
730
- "",
731
- "**产出格式**:",
732
- "```",
733
- "cache_configurations: [{ file, fetch_options, revalidate }],",
734
- "stale_data_risks: [{ route, issue: '...' }],",
735
- "recommended_fix: '...' ,",
736
- "```",
737
- ].join("\n"),
738
- suggestedTools: ["Bash", "Read"],
739
- output: "缓存问题分析结果",
740
- depends: ["classify-error"],
741
- },
742
- {
743
- id: "search-docs",
744
- title: "搜索 Next.js 文档",
745
- instruction: [
746
- "## 搜索 Next.js 官方文档",
747
- "",
748
- "基于前面步骤收集的信息,搜索 Next.js 官方文档寻找解决方案。",
749
- "",
750
- "**执行动作**:",
751
- "1. 根据错误类型提取关键词:",
752
- " - Hydration → `hydration mismatch`、`text content does not match`",
753
- " - Build → `next build failed`、`module not found`",
754
- " - Rendering → `server component error`、`use client`",
755
- " - Cache → `stale data`、`revalidate`、`ISR`",
756
- "2. 搜索 Next.js 官方文档:",
757
- " ```bash",
758
- " # 使用 devflow 知识库查询",
759
- " # 关键词: nextjs hydration, nextjs server components, nextjs caching",
760
- " ```",
761
- "3. 查阅相关文档页面:",
762
- " - https://nextjs.org/docs/app/building-your-application/rendering",
763
- " - https://nextjs.org/docs/app/building-your-application/data-fetching",
764
- " - https://nextjs.org/docs/app/api-reference",
765
- "4. 查找 GitHub Issues 和 Discussions",
766
- "5. 整理出 2-3 条最相关的解决方案",
767
- "",
768
- "**产出格式**:",
769
- "```",
770
- "search_keywords: ['...'],",
771
- "docs_hits: [",
772
- " { title: '...', url: '...', summary: '...' },",
773
- "],",
774
- "recommended_solutions: ['...'],",
775
- "```",
776
- ].join("\n"),
777
- suggestedTools: ["Bash", "Read"],
778
- output: "相关文档和推荐解决方案",
779
- },
780
- { id: "generate-fix", stepTemplate: "generate-fix", depends: ["check-rendering-layer", "check-build-config", "check-cache", "search-docs"] },
781
- { id: "build-verify", stepTemplate: "build-verify", depends: ["generate-fix"] },
782
- { id: "approve", stepTemplate: "human-review", depends: ["build-verify"] },
783
- ],
784
- triggers: [
785
- { type: "cli", command: "bug" },
786
- { type: "mcp", tool: "diagnose_bug" },
787
- ],
788
- },
789
- ],
790
- },
791
- prompt: {
792
- system: "你是一个 Next.js 14 专家。使用 App Router、React Server Components。默认服务端渲染,按需客户端交互。",
793
- rules: [
794
- "组件默认 Server Components,需要交互时才加 'use client'",
795
- "使用 App Router 文件系统路由(page/layout/loading/error)",
796
- "服务端数据获取使用 async component + fetch + cache()",
797
- "客户端数据获取使用 SWR 或 React Query",
798
- "图片使用 next/image,链接使用 next/link",
799
- "中间件在 Edge Runtime 执行,不能直接访问数据库",
800
- "使用 generateStaticParams + ISR 优化静态页面",
801
- ],
802
- },
803
- tools: [
804
- {
805
- name: "nextjs_diagnose_bug",
806
- description: "Next.js Bug 诊断:错误类型 → 渲染层 → 构建配置 → 修复",
807
- inputSchema: { type: "object", properties: { projectRoot: { type: "string" }, errorMessage: { type: "string" }, stackTrace: { type: "string" } }, required: ["projectRoot", "errorMessage"] },
808
- handler: async (input) => { const { diagnoseBug } = await import('./analyzers/diagnose-bug.js'); return diagnoseBug(input); },
809
- },
810
- {
811
- name: "nextjs_new_page",
812
- description: "新建 Next.js 页面(路由 + 数据获取 + 渲染策略)",
813
- inputSchema: { type: "object", properties: { pageName: { type: "string" }, route: { type: "string" } }, required: ["pageName"] },
814
- handler: async (input) => { const { generatePage } = await import('./analyzers/new-page.js'); return generatePage(input.pageName, input.route || ''); },
815
- },
816
- ],
817
- };
818
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}