@0xsown/vibe-code-fe 1.0.0

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.
Files changed (189) hide show
  1. package/bin/index.js +181 -0
  2. package/package.json +32 -0
  3. package/skills/claude-md-improver/SKILL.md +179 -0
  4. package/skills/claude-md-improver/references/quality-criteria.md +109 -0
  5. package/skills/claude-md-improver/references/templates.md +253 -0
  6. package/skills/claude-md-improver/references/update-guidelines.md +150 -0
  7. package/skills/find-skills/SKILL.md +133 -0
  8. package/skills/frontend-design/LICENSE.txt +177 -0
  9. package/skills/frontend-design/SKILL.md +42 -0
  10. package/skills/next-best-practices/SKILL.md +153 -0
  11. package/skills/next-best-practices/async-patterns.md +87 -0
  12. package/skills/next-best-practices/bundling.md +180 -0
  13. package/skills/next-best-practices/data-patterns.md +297 -0
  14. package/skills/next-best-practices/debug-tricks.md +105 -0
  15. package/skills/next-best-practices/directives.md +73 -0
  16. package/skills/next-best-practices/error-handling.md +227 -0
  17. package/skills/next-best-practices/file-conventions.md +140 -0
  18. package/skills/next-best-practices/font.md +245 -0
  19. package/skills/next-best-practices/functions.md +108 -0
  20. package/skills/next-best-practices/hydration-error.md +91 -0
  21. package/skills/next-best-practices/image.md +173 -0
  22. package/skills/next-best-practices/metadata.md +301 -0
  23. package/skills/next-best-practices/parallel-routes.md +287 -0
  24. package/skills/next-best-practices/route-handlers.md +146 -0
  25. package/skills/next-best-practices/rsc-boundaries.md +159 -0
  26. package/skills/next-best-practices/runtime-selection.md +39 -0
  27. package/skills/next-best-practices/scripts.md +141 -0
  28. package/skills/next-best-practices/self-hosting.md +371 -0
  29. package/skills/next-best-practices/suspense-boundaries.md +67 -0
  30. package/skills/next-cache-components/SKILL.md +411 -0
  31. package/skills/shadcn-ui/README.md +248 -0
  32. package/skills/shadcn-ui/SKILL.md +326 -0
  33. package/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  34. package/skills/shadcn-ui/examples/data-table.tsx +313 -0
  35. package/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  36. package/skills/shadcn-ui/resources/component-catalog.md +481 -0
  37. package/skills/shadcn-ui/resources/customization-guide.md +516 -0
  38. package/skills/shadcn-ui/resources/migration-guide.md +463 -0
  39. package/skills/shadcn-ui/resources/setup-guide.md +412 -0
  40. package/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  41. package/skills/supabase-postgres-best-practices/AGENTS.md +68 -0
  42. package/skills/supabase-postgres-best-practices/CLAUDE.md +68 -0
  43. package/skills/supabase-postgres-best-practices/README.md +116 -0
  44. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  45. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  46. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  47. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  48. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  49. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  50. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  51. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  52. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  53. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  54. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  55. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  56. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  57. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  58. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  59. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  60. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  61. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  62. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  63. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  64. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  65. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  66. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  67. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  68. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  69. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  70. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  71. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  72. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  73. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  74. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  75. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  76. package/skills/tailwind-design-system/SKILL.md +874 -0
  77. package/skills/vercel-composition-patterns/AGENTS.md +946 -0
  78. package/skills/vercel-composition-patterns/README.md +60 -0
  79. package/skills/vercel-composition-patterns/SKILL.md +89 -0
  80. package/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  81. package/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  82. package/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  83. package/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  84. package/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  85. package/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  86. package/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  87. package/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  88. package/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  89. package/skills/vercel-react-best-practices/README.md +123 -0
  90. package/skills/vercel-react-best-practices/SKILL.md +136 -0
  91. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  92. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  93. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  94. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  95. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  96. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  97. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  98. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  99. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  100. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  101. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  102. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  103. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  104. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  105. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  106. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  107. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  108. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  109. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  110. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  111. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  112. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  113. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  114. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  115. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  116. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  117. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  118. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  119. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  120. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  121. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  122. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  123. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  124. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  125. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  126. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  127. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  128. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  129. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  130. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  131. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  132. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  133. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  134. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  135. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  136. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  137. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  138. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  139. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  140. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  141. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  142. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  143. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  144. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  145. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  146. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  147. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  148. package/skills/vercel-react-native-skills/AGENTS.md +2897 -0
  149. package/skills/vercel-react-native-skills/README.md +165 -0
  150. package/skills/vercel-react-native-skills/SKILL.md +121 -0
  151. package/skills/vercel-react-native-skills/rules/animation-derived-value.md +53 -0
  152. package/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  153. package/skills/vercel-react-native-skills/rules/animation-gpu-properties.md +65 -0
  154. package/skills/vercel-react-native-skills/rules/design-system-compound-components.md +66 -0
  155. package/skills/vercel-react-native-skills/rules/fonts-config-plugin.md +71 -0
  156. package/skills/vercel-react-native-skills/rules/imports-design-system-folder.md +68 -0
  157. package/skills/vercel-react-native-skills/rules/js-hoist-intl.md +61 -0
  158. package/skills/vercel-react-native-skills/rules/list-performance-callbacks.md +44 -0
  159. package/skills/vercel-react-native-skills/rules/list-performance-function-references.md +132 -0
  160. package/skills/vercel-react-native-skills/rules/list-performance-images.md +53 -0
  161. package/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md +97 -0
  162. package/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md +94 -0
  163. package/skills/vercel-react-native-skills/rules/list-performance-item-memo.md +82 -0
  164. package/skills/vercel-react-native-skills/rules/list-performance-item-types.md +104 -0
  165. package/skills/vercel-react-native-skills/rules/list-performance-virtualize.md +67 -0
  166. package/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  167. package/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  168. package/skills/vercel-react-native-skills/rules/navigation-native-navigators.md +188 -0
  169. package/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  170. package/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  171. package/skills/vercel-react-native-skills/rules/react-state-dispatcher.md +91 -0
  172. package/skills/vercel-react-native-skills/rules/react-state-fallback.md +56 -0
  173. package/skills/vercel-react-native-skills/rules/react-state-minimize.md +65 -0
  174. package/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  175. package/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  176. package/skills/vercel-react-native-skills/rules/scroll-position-no-state.md +82 -0
  177. package/skills/vercel-react-native-skills/rules/state-ground-truth.md +80 -0
  178. package/skills/vercel-react-native-skills/rules/ui-expo-image.md +66 -0
  179. package/skills/vercel-react-native-skills/rules/ui-image-gallery.md +104 -0
  180. package/skills/vercel-react-native-skills/rules/ui-measure-views.md +78 -0
  181. package/skills/vercel-react-native-skills/rules/ui-menus.md +174 -0
  182. package/skills/vercel-react-native-skills/rules/ui-native-modals.md +77 -0
  183. package/skills/vercel-react-native-skills/rules/ui-pressable.md +61 -0
  184. package/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  185. package/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  186. package/skills/vercel-react-native-skills/rules/ui-styling.md +87 -0
  187. package/skills/web-design-guidelines/SKILL.md +39 -0
  188. package/templates/AGENTS.md +31 -0
  189. package/templates/CLAUDE.md +31 -0
@@ -0,0 +1,297 @@
1
+ # Data Patterns
2
+
3
+ Choose the right data fetching pattern for each use case.
4
+
5
+ ## Decision Tree
6
+
7
+ ```
8
+ Need to fetch data?
9
+ ├── From a Server Component?
10
+ │ └── Use: Fetch directly (no API needed)
11
+
12
+ ├── From a Client Component?
13
+ │ ├── Is it a mutation (POST/PUT/DELETE)?
14
+ │ │ └── Use: Server Action
15
+ │ └── Is it a read (GET)?
16
+ │ └── Use: Route Handler OR pass from Server Component
17
+
18
+ ├── Need external API access (webhooks, third parties)?
19
+ │ └── Use: Route Handler
20
+
21
+ └── Need REST API for mobile app / external clients?
22
+ └── Use: Route Handler
23
+ ```
24
+
25
+ ## Pattern 1: Server Components (Preferred for Reads)
26
+
27
+ Fetch data directly in Server Components - no API layer needed.
28
+
29
+ ```tsx
30
+ // app/users/page.tsx
31
+ async function UsersPage() {
32
+ // Direct database access - no API round-trip
33
+ const users = await db.user.findMany();
34
+
35
+ // Or fetch from external API
36
+ const posts = await fetch('https://api.example.com/posts').then(r => r.json());
37
+
38
+ return (
39
+ <ul>
40
+ {users.map(user => <li key={user.id}>{user.name}</li>)}
41
+ </ul>
42
+ );
43
+ }
44
+ ```
45
+
46
+ **Benefits**:
47
+ - No API to maintain
48
+ - No client-server waterfall
49
+ - Secrets stay on server
50
+ - Direct database access
51
+
52
+ ## Pattern 2: Server Actions (Preferred for Mutations)
53
+
54
+ Server Actions are the recommended way to handle mutations.
55
+
56
+ ```tsx
57
+ // app/actions.ts
58
+ 'use server';
59
+
60
+ import { revalidatePath } from 'next/cache';
61
+
62
+ export async function createPost(formData: FormData) {
63
+ const title = formData.get('title') as string;
64
+
65
+ await db.post.create({ data: { title } });
66
+
67
+ revalidatePath('/posts');
68
+ }
69
+
70
+ export async function deletePost(id: string) {
71
+ await db.post.delete({ where: { id } });
72
+
73
+ revalidateTag('posts');
74
+ }
75
+ ```
76
+
77
+ ```tsx
78
+ // app/posts/new/page.tsx
79
+ import { createPost } from '@/app/actions';
80
+
81
+ export default function NewPost() {
82
+ return (
83
+ <form action={createPost}>
84
+ <input name="title" required />
85
+ <button type="submit">Create</button>
86
+ </form>
87
+ );
88
+ }
89
+ ```
90
+
91
+ **Benefits**:
92
+ - End-to-end type safety
93
+ - Progressive enhancement (works without JS)
94
+ - Automatic request handling
95
+ - Integrated with React transitions
96
+
97
+ **Constraints**:
98
+ - POST only (no GET caching semantics)
99
+ - Internal use only (no external access)
100
+ - Cannot return non-serializable data
101
+
102
+ ## Pattern 3: Route Handlers (APIs)
103
+
104
+ Use Route Handlers when you need a REST API.
105
+
106
+ ```tsx
107
+ // app/api/posts/route.ts
108
+ import { NextRequest, NextResponse } from 'next/server';
109
+
110
+ // GET is cacheable
111
+ export async function GET(request: NextRequest) {
112
+ const posts = await db.post.findMany();
113
+ return NextResponse.json(posts);
114
+ }
115
+
116
+ // POST for mutations
117
+ export async function POST(request: NextRequest) {
118
+ const body = await request.json();
119
+ const post = await db.post.create({ data: body });
120
+ return NextResponse.json(post, { status: 201 });
121
+ }
122
+ ```
123
+
124
+ **When to use**:
125
+ - External API access (mobile apps, third parties)
126
+ - Webhooks from external services
127
+ - GET endpoints that need HTTP caching
128
+ - OpenAPI/Swagger documentation needed
129
+
130
+ **When NOT to use**:
131
+ - Internal data fetching (use Server Components)
132
+ - Mutations from your UI (use Server Actions)
133
+
134
+ ## Avoiding Data Waterfalls
135
+
136
+ ### Problem: Sequential Fetches
137
+
138
+ ```tsx
139
+ // Bad: Sequential waterfalls
140
+ async function Dashboard() {
141
+ const user = await getUser(); // Wait...
142
+ const posts = await getPosts(); // Then wait...
143
+ const comments = await getComments(); // Then wait...
144
+
145
+ return <div>...</div>;
146
+ }
147
+ ```
148
+
149
+ ### Solution 1: Parallel Fetching with Promise.all
150
+
151
+ ```tsx
152
+ // Good: Parallel fetching
153
+ async function Dashboard() {
154
+ const [user, posts, comments] = await Promise.all([
155
+ getUser(),
156
+ getPosts(),
157
+ getComments(),
158
+ ]);
159
+
160
+ return <div>...</div>;
161
+ }
162
+ ```
163
+
164
+ ### Solution 2: Streaming with Suspense
165
+
166
+ ```tsx
167
+ // Good: Show content progressively
168
+ import { Suspense } from 'react';
169
+
170
+ async function Dashboard() {
171
+ return (
172
+ <div>
173
+ <Suspense fallback={<UserSkeleton />}>
174
+ <UserSection />
175
+ </Suspense>
176
+ <Suspense fallback={<PostsSkeleton />}>
177
+ <PostsSection />
178
+ </Suspense>
179
+ </div>
180
+ );
181
+ }
182
+
183
+ async function UserSection() {
184
+ const user = await getUser(); // Fetches independently
185
+ return <div>{user.name}</div>;
186
+ }
187
+
188
+ async function PostsSection() {
189
+ const posts = await getPosts(); // Fetches independently
190
+ return <PostList posts={posts} />;
191
+ }
192
+ ```
193
+
194
+ ### Solution 3: Preload Pattern
195
+
196
+ ```tsx
197
+ // lib/data.ts
198
+ import { cache } from 'react';
199
+
200
+ export const getUser = cache(async (id: string) => {
201
+ return db.user.findUnique({ where: { id } });
202
+ });
203
+
204
+ export const preloadUser = (id: string) => {
205
+ void getUser(id); // Fire and forget
206
+ };
207
+ ```
208
+
209
+ ```tsx
210
+ // app/user/[id]/page.tsx
211
+ import { getUser, preloadUser } from '@/lib/data';
212
+
213
+ export default async function UserPage({ params }) {
214
+ const { id } = await params;
215
+
216
+ // Start fetching early
217
+ preloadUser(id);
218
+
219
+ // Do other work...
220
+
221
+ // Data likely ready by now
222
+ const user = await getUser(id);
223
+ return <div>{user.name}</div>;
224
+ }
225
+ ```
226
+
227
+ ## Client Component Data Fetching
228
+
229
+ When Client Components need data:
230
+
231
+ ### Option 1: Pass from Server Component (Preferred)
232
+
233
+ ```tsx
234
+ // Server Component
235
+ async function Page() {
236
+ const data = await fetchData();
237
+ return <ClientComponent initialData={data} />;
238
+ }
239
+
240
+ // Client Component
241
+ 'use client';
242
+ function ClientComponent({ initialData }) {
243
+ const [data, setData] = useState(initialData);
244
+ // ...
245
+ }
246
+ ```
247
+
248
+ ### Option 2: Fetch on Mount (When Necessary)
249
+
250
+ ```tsx
251
+ 'use client';
252
+ import { useEffect, useState } from 'react';
253
+
254
+ function ClientComponent() {
255
+ const [data, setData] = useState(null);
256
+
257
+ useEffect(() => {
258
+ fetch('/api/data')
259
+ .then(r => r.json())
260
+ .then(setData);
261
+ }, []);
262
+
263
+ if (!data) return <Loading />;
264
+ return <div>{data.value}</div>;
265
+ }
266
+ ```
267
+
268
+ ### Option 3: Server Action for Reads (Works But Not Ideal)
269
+
270
+ Server Actions can be called from Client Components for reads, but this is not their intended purpose:
271
+
272
+ ```tsx
273
+ 'use client';
274
+ import { getData } from './actions';
275
+ import { useEffect, useState } from 'react';
276
+
277
+ function ClientComponent() {
278
+ const [data, setData] = useState(null);
279
+
280
+ useEffect(() => {
281
+ getData().then(setData);
282
+ }, []);
283
+
284
+ return <div>{data?.value}</div>;
285
+ }
286
+ ```
287
+
288
+ **Note**: Server Actions always use POST, so no HTTP caching. Prefer Route Handlers for cacheable reads.
289
+
290
+ ## Quick Reference
291
+
292
+ | Pattern | Use Case | HTTP Method | Caching |
293
+ |---------|----------|-------------|---------|
294
+ | Server Component fetch | Internal reads | Any | Full Next.js caching |
295
+ | Server Action | Mutations, form submissions | POST only | No |
296
+ | Route Handler | External APIs, webhooks | Any | GET can be cached |
297
+ | Client fetch to API | Client-side reads | Any | HTTP cache headers |
@@ -0,0 +1,105 @@
1
+ # Debug Tricks
2
+
3
+ Tricks to speed up debugging Next.js applications.
4
+
5
+ ## MCP Endpoint (Dev Server)
6
+
7
+ Next.js exposes a `/_next/mcp` endpoint in development for AI-assisted debugging via MCP (Model Context Protocol).
8
+
9
+ - **Next.js 16+**: Enabled by default, use `next-devtools-mcp`
10
+ - **Next.js < 16**: Requires `experimental.mcpServer: true` in next.config.js
11
+
12
+ Reference: https://nextjs.org/docs/app/guides/mcp
13
+
14
+ **Important**: Find the actual port of the running Next.js dev server (check terminal output or `package.json` scripts). Don't assume port 3000.
15
+
16
+ ### Request Format
17
+
18
+ The endpoint uses JSON-RPC 2.0 over HTTP POST:
19
+
20
+ ```bash
21
+ curl -X POST http://localhost:<port>/_next/mcp \
22
+ -H "Content-Type: application/json" \
23
+ -H "Accept: application/json, text/event-stream" \
24
+ -d '{
25
+ "jsonrpc": "2.0",
26
+ "id": "1",
27
+ "method": "tools/call",
28
+ "params": {
29
+ "name": "<tool-name>",
30
+ "arguments": {}
31
+ }
32
+ }'
33
+ ```
34
+
35
+ ### Available Tools
36
+
37
+ #### `get_errors`
38
+ Get current errors from dev server (build errors, runtime errors with source-mapped stacks):
39
+ ```json
40
+ { "name": "get_errors", "arguments": {} }
41
+ ```
42
+
43
+ #### `get_routes`
44
+ Discover all routes by scanning filesystem:
45
+ ```json
46
+ { "name": "get_routes", "arguments": {} }
47
+ // Optional: { "name": "get_routes", "arguments": { "routerType": "app" } }
48
+ ```
49
+ Returns: `{ "appRouter": ["/", "/api/users/[id]", ...], "pagesRouter": [...] }`
50
+
51
+ #### `get_project_metadata`
52
+ Get project path and dev server URL:
53
+ ```json
54
+ { "name": "get_project_metadata", "arguments": {} }
55
+ ```
56
+ Returns: `{ "projectPath": "/path/to/project", "devServerUrl": "http://localhost:3000" }`
57
+
58
+ #### `get_page_metadata`
59
+ Get runtime metadata about current page render (requires active browser session):
60
+ ```json
61
+ { "name": "get_page_metadata", "arguments": {} }
62
+ ```
63
+ Returns segment trie data showing layouts, boundaries, and page components.
64
+
65
+ #### `get_logs`
66
+ Get path to Next.js development log file:
67
+ ```json
68
+ { "name": "get_logs", "arguments": {} }
69
+ ```
70
+ Returns path to `<distDir>/logs/next-development.log`
71
+
72
+ #### `get_server_action_by_id`
73
+ Locate a Server Action by ID:
74
+ ```json
75
+ { "name": "get_server_action_by_id", "arguments": { "actionId": "<action-id>" } }
76
+ ```
77
+
78
+ ### Example: Get Errors
79
+
80
+ ```bash
81
+ curl -X POST http://localhost:<port>/_next/mcp \
82
+ -H "Content-Type: application/json" \
83
+ -H "Accept: application/json, text/event-stream" \
84
+ -d '{"jsonrpc":"2.0","id":"1","method":"tools/call","params":{"name":"get_errors","arguments":{}}}'
85
+ ```
86
+
87
+ ## Rebuild Specific Routes (Next.js 16+)
88
+
89
+ Use `--debug-build-paths` to rebuild only specific routes instead of the entire app:
90
+
91
+ ```bash
92
+ # Rebuild a specific route
93
+ next build --debug-build-paths "/dashboard"
94
+
95
+ # Rebuild routes matching a glob
96
+ next build --debug-build-paths "/api/*"
97
+
98
+ # Dynamic routes
99
+ next build --debug-build-paths "/blog/[slug]"
100
+ ```
101
+
102
+ Use this to:
103
+ - Quickly verify a build fix without full rebuild
104
+ - Debug static generation issues for specific pages
105
+ - Iterate faster on build errors
@@ -0,0 +1,73 @@
1
+ # Directives
2
+
3
+ ## React Directives
4
+
5
+ These are React directives, not Next.js specific.
6
+
7
+ ### `'use client'`
8
+
9
+ Marks a component as a Client Component. Required for:
10
+ - React hooks (`useState`, `useEffect`, etc.)
11
+ - Event handlers (`onClick`, `onChange`)
12
+ - Browser APIs (`window`, `localStorage`)
13
+
14
+ ```tsx
15
+ 'use client'
16
+
17
+ import { useState } from 'react'
18
+
19
+ export function Counter() {
20
+ const [count, setCount] = useState(0)
21
+ return <button onClick={() => setCount(count + 1)}>{count}</button>
22
+ }
23
+ ```
24
+
25
+ Reference: https://react.dev/reference/rsc/use-client
26
+
27
+ ### `'use server'`
28
+
29
+ Marks a function as a Server Action. Can be passed to Client Components.
30
+
31
+ ```tsx
32
+ 'use server'
33
+
34
+ export async function submitForm(formData: FormData) {
35
+ // Runs on server
36
+ }
37
+ ```
38
+
39
+ Or inline within a Server Component:
40
+
41
+ ```tsx
42
+ export default function Page() {
43
+ async function submit() {
44
+ 'use server'
45
+ // Runs on server
46
+ }
47
+ return <form action={submit}>...</form>
48
+ }
49
+ ```
50
+
51
+ Reference: https://react.dev/reference/rsc/use-server
52
+
53
+ ---
54
+
55
+ ## Next.js Directive
56
+
57
+ ### `'use cache'`
58
+
59
+ Marks a function or component for caching. Part of Next.js Cache Components.
60
+
61
+ ```tsx
62
+ 'use cache'
63
+
64
+ export async function getCachedData() {
65
+ return await fetchData()
66
+ }
67
+ ```
68
+
69
+ Requires `cacheComponents: true` in `next.config.ts`.
70
+
71
+ For detailed usage including cache profiles, `cacheLife()`, `cacheTag()`, and `updateTag()`, see the `next-cache-components` skill.
72
+
73
+ Reference: https://nextjs.org/docs/app/api-reference/directives/use-cache
@@ -0,0 +1,227 @@
1
+ # Error Handling
2
+
3
+ Handle errors gracefully in Next.js applications.
4
+
5
+ Reference: https://nextjs.org/docs/app/getting-started/error-handling
6
+
7
+ ## Error Boundaries
8
+
9
+ ### `error.tsx`
10
+
11
+ Catches errors in a route segment and its children:
12
+
13
+ ```tsx
14
+ 'use client'
15
+
16
+ export default function Error({
17
+ error,
18
+ reset,
19
+ }: {
20
+ error: Error & { digest?: string }
21
+ reset: () => void
22
+ }) {
23
+ return (
24
+ <div>
25
+ <h2>Something went wrong!</h2>
26
+ <button onClick={() => reset()}>Try again</button>
27
+ </div>
28
+ )
29
+ }
30
+ ```
31
+
32
+ **Important:** `error.tsx` must be a Client Component.
33
+
34
+ ### `global-error.tsx`
35
+
36
+ Catches errors in root layout:
37
+
38
+ ```tsx
39
+ 'use client'
40
+
41
+ export default function GlobalError({
42
+ error,
43
+ reset,
44
+ }: {
45
+ error: Error & { digest?: string }
46
+ reset: () => void
47
+ }) {
48
+ return (
49
+ <html>
50
+ <body>
51
+ <h2>Something went wrong!</h2>
52
+ <button onClick={() => reset()}>Try again</button>
53
+ </body>
54
+ </html>
55
+ )
56
+ }
57
+ ```
58
+
59
+ **Important:** Must include `<html>` and `<body>` tags.
60
+
61
+ ## Server Actions: Navigation API Gotcha
62
+
63
+ **Do NOT wrap navigation APIs in try-catch.** They throw special errors that Next.js handles internally.
64
+
65
+ Reference: https://nextjs.org/docs/app/api-reference/functions/redirect#behavior
66
+
67
+ ```tsx
68
+ 'use server'
69
+
70
+ import { redirect } from 'next/navigation'
71
+ import { notFound } from 'next/navigation'
72
+
73
+ // Bad: try-catch catches the navigation "error"
74
+ async function createPost(formData: FormData) {
75
+ try {
76
+ const post = await db.post.create({ ... })
77
+ redirect(`/posts/${post.id}`) // This throws!
78
+ } catch (error) {
79
+ // redirect() throw is caught here - navigation fails!
80
+ return { error: 'Failed to create post' }
81
+ }
82
+ }
83
+
84
+ // Good: Call navigation APIs outside try-catch
85
+ async function createPost(formData: FormData) {
86
+ let post
87
+ try {
88
+ post = await db.post.create({ ... })
89
+ } catch (error) {
90
+ return { error: 'Failed to create post' }
91
+ }
92
+ redirect(`/posts/${post.id}`) // Outside try-catch
93
+ }
94
+
95
+ // Good: Re-throw navigation errors
96
+ async function createPost(formData: FormData) {
97
+ try {
98
+ const post = await db.post.create({ ... })
99
+ redirect(`/posts/${post.id}`)
100
+ } catch (error) {
101
+ if (error instanceof Error && error.message === 'NEXT_REDIRECT') {
102
+ throw error // Re-throw navigation errors
103
+ }
104
+ return { error: 'Failed to create post' }
105
+ }
106
+ }
107
+ ```
108
+
109
+ Same applies to:
110
+ - `redirect()` - 307 temporary redirect
111
+ - `permanentRedirect()` - 308 permanent redirect
112
+ - `notFound()` - 404 not found
113
+ - `forbidden()` - 403 forbidden
114
+ - `unauthorized()` - 401 unauthorized
115
+
116
+ Use `unstable_rethrow()` to re-throw these errors in catch blocks:
117
+
118
+ ```tsx
119
+ import { unstable_rethrow } from 'next/navigation'
120
+
121
+ async function action() {
122
+ try {
123
+ // ...
124
+ redirect('/success')
125
+ } catch (error) {
126
+ unstable_rethrow(error) // Re-throws Next.js internal errors
127
+ return { error: 'Something went wrong' }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Redirects
133
+
134
+ ```tsx
135
+ import { redirect, permanentRedirect } from 'next/navigation'
136
+
137
+ // 307 Temporary - use for most cases
138
+ redirect('/new-path')
139
+
140
+ // 308 Permanent - use for URL migrations (cached by browsers)
141
+ permanentRedirect('/new-url')
142
+ ```
143
+
144
+ ## Auth Errors
145
+
146
+ Trigger auth-related error pages:
147
+
148
+ ```tsx
149
+ import { forbidden, unauthorized } from 'next/navigation'
150
+
151
+ async function Page() {
152
+ const session = await getSession()
153
+
154
+ if (!session) {
155
+ unauthorized() // Renders unauthorized.tsx (401)
156
+ }
157
+
158
+ if (!session.hasAccess) {
159
+ forbidden() // Renders forbidden.tsx (403)
160
+ }
161
+
162
+ return <Dashboard />
163
+ }
164
+ ```
165
+
166
+ Create corresponding error pages:
167
+
168
+ ```tsx
169
+ // app/forbidden.tsx
170
+ export default function Forbidden() {
171
+ return <div>You don't have access to this resource</div>
172
+ }
173
+
174
+ // app/unauthorized.tsx
175
+ export default function Unauthorized() {
176
+ return <div>Please log in to continue</div>
177
+ }
178
+ ```
179
+
180
+ ## Not Found
181
+
182
+ ### `not-found.tsx`
183
+
184
+ Custom 404 page for a route segment:
185
+
186
+ ```tsx
187
+ export default function NotFound() {
188
+ return (
189
+ <div>
190
+ <h2>Not Found</h2>
191
+ <p>Could not find the requested resource</p>
192
+ </div>
193
+ )
194
+ }
195
+ ```
196
+
197
+ ### Triggering Not Found
198
+
199
+ ```tsx
200
+ import { notFound } from 'next/navigation'
201
+
202
+ export default async function Page({ params }: { params: Promise<{ id: string }> }) {
203
+ const { id } = await params
204
+ const post = await getPost(id)
205
+
206
+ if (!post) {
207
+ notFound() // Renders closest not-found.tsx
208
+ }
209
+
210
+ return <div>{post.title}</div>
211
+ }
212
+ ```
213
+
214
+ ## Error Hierarchy
215
+
216
+ Errors bubble up to the nearest error boundary:
217
+
218
+ ```
219
+ app/
220
+ ├── error.tsx # Catches errors from all children
221
+ ├── blog/
222
+ │ ├── error.tsx # Catches errors in /blog/*
223
+ │ └── [slug]/
224
+ │ ├── error.tsx # Catches errors in /blog/[slug]
225
+ │ └── page.tsx
226
+ └── layout.tsx # Errors here go to global-error.tsx
227
+ ```