create-quadrokit 0.3.2 → 0.3.4
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/README.md +1 -1
- package/package.json +3 -3
- package/template-common/.agents/skills/quadro-paged-collection/SKILL.md +33 -0
- package/template-common/.agents/skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/template-common/.agents/skills/vercel-composition-patterns/README.md +60 -0
- package/template-common/.agents/skills/vercel-composition-patterns/SKILL.md +89 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/_sections.md +29 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/_template.md +24 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/template-common/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/template-common/.agents/skills/vercel-react-best-practices/AGENTS.md +3750 -0
- package/template-common/.agents/skills/vercel-react-best-practices/README.md +123 -0
- package/template-common/.agents/skills/vercel-react-best-practices/SKILL.md +148 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template-common/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template-common/.agents/skills/web-design-guidelines/SKILL.md +39 -0
- package/template-common/skills-lock.json +20 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Avoid Shared Module State for Request Data
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: prevents concurrency bugs and request data leaks
|
|
5
|
+
tags: server, rsc, ssr, concurrency, security, state
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Avoid Shared Module State for Request Data
|
|
9
|
+
|
|
10
|
+
For React Server Components and client components rendered during SSR, avoid using mutable module-level variables to share request-scoped data. Server renders can run concurrently in the same process. If one render writes to shared module state and another render reads it, you can get race conditions, cross-request contamination, and security bugs where one user's data appears in another user's response.
|
|
11
|
+
|
|
12
|
+
Treat module scope on the server as process-wide shared memory, not request-local state.
|
|
13
|
+
|
|
14
|
+
**Incorrect (request data leaks across concurrent renders):**
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
let currentUser: User | null = null
|
|
18
|
+
|
|
19
|
+
export default async function Page() {
|
|
20
|
+
currentUser = await auth()
|
|
21
|
+
return <Dashboard />
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function Dashboard() {
|
|
25
|
+
return <div>{currentUser?.name}</div>
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If two requests overlap, request A can set `currentUser`, then request B overwrites it before request A finishes rendering `Dashboard`.
|
|
30
|
+
|
|
31
|
+
**Correct (keep request data local to the render tree):**
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
export default async function Page() {
|
|
35
|
+
const user = await auth()
|
|
36
|
+
return <Dashboard user={user} />
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function Dashboard({ user }: { user: User | null }) {
|
|
40
|
+
return <div>{user?.name}</div>
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Safe exceptions:
|
|
45
|
+
|
|
46
|
+
- Immutable static assets or config loaded once at module scope
|
|
47
|
+
- Shared caches intentionally designed for cross-request reuse and keyed correctly
|
|
48
|
+
- Process-wide singletons that do not store request- or user-specific mutable data
|
|
49
|
+
|
|
50
|
+
For static assets and config, see [Hoist Static I/O to Module Level](./server-hoist-static-io.md).
|
package/template-common/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Parallel Data Fetching with Component Composition
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: eliminates server-side waterfalls
|
|
5
|
+
tags: server, rsc, parallel-fetching, composition
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Parallel Data Fetching with Component Composition
|
|
9
|
+
|
|
10
|
+
React Server Components execute sequentially within a tree. Restructure with composition to parallelize data fetching.
|
|
11
|
+
|
|
12
|
+
**Incorrect (Sidebar waits for Page's fetch to complete):**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
export default async function Page() {
|
|
16
|
+
const header = await fetchHeader()
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<div>{header}</div>
|
|
20
|
+
<Sidebar />
|
|
21
|
+
</div>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function Sidebar() {
|
|
26
|
+
const items = await fetchSidebarItems()
|
|
27
|
+
return <nav>{items.map(renderItem)}</nav>
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Correct (both fetch simultaneously):**
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
async function Header() {
|
|
35
|
+
const data = await fetchHeader()
|
|
36
|
+
return <div>{data}</div>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function Sidebar() {
|
|
40
|
+
const items = await fetchSidebarItems()
|
|
41
|
+
return <nav>{items.map(renderItem)}</nav>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default function Page() {
|
|
45
|
+
return (
|
|
46
|
+
<div>
|
|
47
|
+
<Header />
|
|
48
|
+
<Sidebar />
|
|
49
|
+
</div>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Alternative with children prop:**
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
async function Header() {
|
|
58
|
+
const data = await fetchHeader()
|
|
59
|
+
return <div>{data}</div>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function Sidebar() {
|
|
63
|
+
const items = await fetchSidebarItems()
|
|
64
|
+
return <nav>{items.map(renderItem)}</nav>
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function Layout({ children }: { children: ReactNode }) {
|
|
68
|
+
return (
|
|
69
|
+
<div>
|
|
70
|
+
<Header />
|
|
71
|
+
{children}
|
|
72
|
+
</div>
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default function Page() {
|
|
77
|
+
return (
|
|
78
|
+
<Layout>
|
|
79
|
+
<Sidebar />
|
|
80
|
+
</Layout>
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Parallel Nested Data Fetching
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
impactDescription: eliminates server-side waterfalls
|
|
5
|
+
tags: server, rsc, parallel-fetching, promise-chaining
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Parallel Nested Data Fetching
|
|
9
|
+
|
|
10
|
+
When fetching nested data in parallel, chain dependent fetches within each item's promise so a slow item doesn't block the rest.
|
|
11
|
+
|
|
12
|
+
**Incorrect (a single slow item blocks all nested fetches):**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
const chats = await Promise.all(
|
|
16
|
+
chatIds.map(id => getChat(id))
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const chatAuthors = await Promise.all(
|
|
20
|
+
chats.map(chat => getUser(chat.author))
|
|
21
|
+
)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If one `getChat(id)` out of 100 is extremely slow, the authors of the other 99 chats can't start loading even though their data is ready.
|
|
25
|
+
|
|
26
|
+
**Correct (each item chains its own nested fetch):**
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
const chatAuthors = await Promise.all(
|
|
30
|
+
chatIds.map(id => getChat(id).then(chat => getUser(chat.author)))
|
|
31
|
+
)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Each item independently chains `getChat` → `getUser`, so a slow chat doesn't block author fetches for the others.
|
package/template-common/.agents/skills/vercel-react-best-practices/rules/server-serialization.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Minimize Serialization at RSC Boundaries
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: reduces data transfer size
|
|
5
|
+
tags: server, rsc, serialization, props
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Minimize Serialization at RSC Boundaries
|
|
9
|
+
|
|
10
|
+
The React Server/Client boundary serializes all object properties into strings and embeds them in the HTML response and subsequent RSC requests. This serialized data directly impacts page weight and load time, so **size matters a lot**. Only pass fields that the client actually uses.
|
|
11
|
+
|
|
12
|
+
**Incorrect (serializes all 50 fields):**
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
async function Page() {
|
|
16
|
+
const user = await fetchUser() // 50 fields
|
|
17
|
+
return <Profile user={user} />
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
'use client'
|
|
21
|
+
function Profile({ user }: { user: User }) {
|
|
22
|
+
return <div>{user.name}</div> // uses 1 field
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Correct (serializes only 1 field):**
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
async function Page() {
|
|
30
|
+
const user = await fetchUser()
|
|
31
|
+
return <Profile name={user.name} />
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
'use client'
|
|
35
|
+
function Profile({ name }: { name: string }) {
|
|
36
|
+
return <div>{name}</div>
|
|
37
|
+
}
|
|
38
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-design-guidelines
|
|
3
|
+
description: Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
|
|
4
|
+
metadata:
|
|
5
|
+
author: vercel
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
argument-hint: <file-or-pattern>
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Web Interface Guidelines
|
|
11
|
+
|
|
12
|
+
Review files for compliance with Web Interface Guidelines.
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
1. Fetch the latest guidelines from the source URL below
|
|
17
|
+
2. Read the specified files (or prompt user for files/pattern)
|
|
18
|
+
3. Check against all rules in the fetched guidelines
|
|
19
|
+
4. Output findings in the terse `file:line` format
|
|
20
|
+
|
|
21
|
+
## Guidelines Source
|
|
22
|
+
|
|
23
|
+
Fetch fresh guidelines before each review:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Use WebFetch to retrieve the latest rules. The fetched content contains all the rules and output format instructions.
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
When a user provides a file or pattern argument:
|
|
34
|
+
1. Fetch guidelines from the source URL above
|
|
35
|
+
2. Read the specified files
|
|
36
|
+
3. Apply all rules from the fetched guidelines
|
|
37
|
+
4. Output findings using the format specified in the guidelines
|
|
38
|
+
|
|
39
|
+
If no files specified, ask the user which files to review.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"skills": {
|
|
4
|
+
"vercel-composition-patterns": {
|
|
5
|
+
"source": "vercel-labs/agent-skills",
|
|
6
|
+
"sourceType": "github",
|
|
7
|
+
"computedHash": "f98931159fa9c7fed043bcd18a891a46dcf89ababa38df13a4c5b7b30dc0ce07"
|
|
8
|
+
},
|
|
9
|
+
"vercel-react-best-practices": {
|
|
10
|
+
"source": "vercel-labs/agent-skills",
|
|
11
|
+
"sourceType": "github",
|
|
12
|
+
"computedHash": "1be892a3ea68b74654326ef836a58dd528d99ae0ab8d879764e2519c39068e67"
|
|
13
|
+
},
|
|
14
|
+
"web-design-guidelines": {
|
|
15
|
+
"source": "vercel-labs/agent-skills",
|
|
16
|
+
"sourceType": "github",
|
|
17
|
+
"computedHash": "a6a44d5498f7e8f68289902f3dedfc6f38ae0cee1e96527c80724cf27f727c2a"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|