codymaster 4.4.5 → 4.5.2

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 (197) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +29 -14
  3. package/commands/demo.md +1 -1
  4. package/dist/context-bus.js +70 -0
  5. package/dist/context-db.js +265 -0
  6. package/dist/continuity.js +12 -0
  7. package/dist/file-watcher.js +79 -0
  8. package/dist/index.js +152 -1
  9. package/dist/l0-indexer.js +158 -0
  10. package/dist/mcp-context-server.js +400 -0
  11. package/dist/migrate-json-to-sqlite.js +126 -0
  12. package/dist/skill-chain.js +19 -3
  13. package/dist/token-budget.js +108 -0
  14. package/dist/uri-resolver.js +203 -0
  15. package/package.json +5 -1
  16. package/scripts/gate-0-secrets.js +63 -0
  17. package/scripts/gate-1-syntax.js +53 -0
  18. package/scripts/gate-5-dist-verify.js +55 -0
  19. package/scripts/gate-6-smoke-test.js +30 -0
  20. package/scripts/index-codebase.sh +552 -0
  21. package/scripts/mcp-bridge.js +284 -0
  22. package/scripts/postinstall.js +301 -0
  23. package/scripts/security-fixer.js +143 -0
  24. package/scripts/security-scan.js +55 -0
  25. package/scripts/test-gemini.js +13 -0
  26. package/scripts/todo-bridge.js +112 -0
  27. package/skills/_shared/helpers.md +50 -14
  28. package/skills/cm-autopilot/SKILL.md +29 -0
  29. package/skills/cm-autopilot/scripts/autopilot.py +190 -0
  30. package/skills/cm-continuity/SKILL.md +90 -28
  31. package/skills/cm-skill-chain/SKILL.md +47 -1
  32. package/skills/cm-start/SKILL.md +11 -2
  33. package/skills/boxme-git-config/SKILL.md +0 -56
  34. package/skills/boxme-local-dev/SKILL.md +0 -66
  35. package/skills/jobs-to-be-done/SKILL.md +0 -266
  36. package/skills/jobs-to-be-done/references/case-studies.md +0 -154
  37. package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
  38. package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
  39. package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
  40. package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
  41. package/skills/marketplace-report-crawler/SKILL.md +0 -176
  42. package/skills/marketplace-report-crawler/config/accounts.json +0 -41
  43. package/skills/marketplace-report-crawler/config/report-types.json +0 -422
  44. package/skills/marketplace-report-crawler/config/sessions.json +0 -3
  45. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
  46. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
  47. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
  48. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
  49. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
  50. package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
  51. package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
  52. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
  53. package/skills/medical-research/SKILL.md +0 -194
  54. package/skills/medical-research/scripts/evidence_checker.py +0 -288
  55. package/skills/mom-test/SKILL.md +0 -267
  56. package/skills/mom-test/references/avoiding-bad-data.md +0 -221
  57. package/skills/mom-test/references/case-studies.md +0 -306
  58. package/skills/mom-test/references/commitment-advancement.md +0 -219
  59. package/skills/mom-test/references/finding-conversations.md +0 -251
  60. package/skills/mom-test/references/processing-learning.md +0 -256
  61. package/skills/mom-test/references/question-patterns.md +0 -198
  62. package/skills/pandasai-analytics/SKILL.md +0 -251
  63. package/skills/release-it/SKILL.md +0 -235
  64. package/skills/release-it/references/anti-patterns.md +0 -279
  65. package/skills/release-it/references/capacity-planning.md +0 -285
  66. package/skills/release-it/references/chaos-engineering.md +0 -325
  67. package/skills/release-it/references/deployment-strategies.md +0 -331
  68. package/skills/release-it/references/observability.md +0 -301
  69. package/skills/release-it/references/stability-patterns.md +0 -355
  70. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
  71. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
  72. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
  73. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
  74. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
  75. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
  76. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
  77. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
  78. package/skills/skill-creator-ultra/README.md +0 -1242
  79. package/skills/skill-creator-ultra/SKILL.md +0 -388
  80. package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
  81. package/skills/skill-creator-ultra/agents/comparator.md +0 -202
  82. package/skills/skill-creator-ultra/agents/grader.md +0 -223
  83. package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
  84. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
  85. package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
  86. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
  87. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
  88. package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
  89. package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
  90. package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
  91. package/skills/skill-creator-ultra/install.ps1 +0 -289
  92. package/skills/skill-creator-ultra/install.sh +0 -313
  93. package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
  94. package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
  95. package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
  96. package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
  97. package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
  98. package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
  99. package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
  100. package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
  101. package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
  102. package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
  103. package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
  104. package/skills/skill-creator-ultra/resources/checklist.md +0 -243
  105. package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
  106. package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
  107. package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
  108. package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
  109. package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
  110. package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
  111. package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
  112. package/skills/skill-creator-ultra/resources/schemas.md +0 -430
  113. package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
  114. package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
  115. package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
  116. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
  117. package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
  118. package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
  119. package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
  120. package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
  121. package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
  122. package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
  123. package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
  124. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
  125. package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
  126. package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
  127. package/skills/tailwind-mastery/SKILL.md +0 -229
  128. package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
  129. package/skills/vercel-react-best-practices/README.md +0 -123
  130. package/skills/vercel-react-best-practices/SKILL.md +0 -143
  131. package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
  132. package/skills/vercel-react-best-practices/rules/_template.md +0 -28
  133. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  134. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  135. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  136. package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  137. package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  138. package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  139. package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  140. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  141. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  142. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  143. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  144. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  145. package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  146. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  147. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  148. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  149. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  150. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  151. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  152. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  153. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  154. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  155. package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  156. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  157. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  158. package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  159. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  160. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  161. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  162. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  163. package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  164. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  165. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  166. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  167. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  168. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  169. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  170. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  171. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  172. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  173. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  174. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  175. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  176. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  177. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  178. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  179. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  180. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  181. package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  182. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  183. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  184. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  185. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  186. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  187. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  188. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  189. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  190. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  191. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  192. package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  193. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  194. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  195. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  196. package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  197. package/skills/web-design-guidelines/SKILL.md +0 -39
@@ -1,96 +0,0 @@
1
- ---
2
- title: Authenticate Server Actions Like API Routes
3
- impact: CRITICAL
4
- impactDescription: prevents unauthorized access to server mutations
5
- tags: server, server-actions, authentication, security, authorization
6
- ---
7
-
8
- ## Authenticate Server Actions Like API Routes
9
-
10
- **Impact: CRITICAL (prevents unauthorized access to server mutations)**
11
-
12
- Server Actions (functions with `"use server"`) are exposed as public endpoints, just like API routes. Always verify authentication and authorization **inside** each Server Action—do not rely solely on middleware, layout guards, or page-level checks, as Server Actions can be invoked directly.
13
-
14
- Next.js documentation explicitly states: "Treat Server Actions with the same security considerations as public-facing API endpoints, and verify if the user is allowed to perform a mutation."
15
-
16
- **Incorrect (no authentication check):**
17
-
18
- ```typescript
19
- 'use server'
20
-
21
- export async function deleteUser(userId: string) {
22
- // Anyone can call this! No auth check
23
- await db.user.delete({ where: { id: userId } })
24
- return { success: true }
25
- }
26
- ```
27
-
28
- **Correct (authentication inside the action):**
29
-
30
- ```typescript
31
- 'use server'
32
-
33
- import { verifySession } from '@/lib/auth'
34
- import { unauthorized } from '@/lib/errors'
35
-
36
- export async function deleteUser(userId: string) {
37
- // Always check auth inside the action
38
- const session = await verifySession()
39
-
40
- if (!session) {
41
- throw unauthorized('Must be logged in')
42
- }
43
-
44
- // Check authorization too
45
- if (session.user.role !== 'admin' && session.user.id !== userId) {
46
- throw unauthorized('Cannot delete other users')
47
- }
48
-
49
- await db.user.delete({ where: { id: userId } })
50
- return { success: true }
51
- }
52
- ```
53
-
54
- **With input validation:**
55
-
56
- ```typescript
57
- 'use server'
58
-
59
- import { verifySession } from '@/lib/auth'
60
- import { z } from 'zod'
61
-
62
- const updateProfileSchema = z.object({
63
- userId: z.string().uuid(),
64
- name: z.string().min(1).max(100),
65
- email: z.string().email()
66
- })
67
-
68
- export async function updateProfile(data: unknown) {
69
- // Validate input first
70
- const validated = updateProfileSchema.parse(data)
71
-
72
- // Then authenticate
73
- const session = await verifySession()
74
- if (!session) {
75
- throw new Error('Unauthorized')
76
- }
77
-
78
- // Then authorize
79
- if (session.user.id !== validated.userId) {
80
- throw new Error('Can only update own profile')
81
- }
82
-
83
- // Finally perform the mutation
84
- await db.user.update({
85
- where: { id: validated.userId },
86
- data: {
87
- name: validated.name,
88
- email: validated.email
89
- }
90
- })
91
-
92
- return { success: true }
93
- }
94
- ```
95
-
96
- Reference: [https://nextjs.org/docs/app/guides/authentication](https://nextjs.org/docs/app/guides/authentication)
@@ -1,41 +0,0 @@
1
- ---
2
- title: Cross-Request LRU Caching
3
- impact: HIGH
4
- impactDescription: caches across requests
5
- tags: server, cache, lru, cross-request
6
- ---
7
-
8
- ## Cross-Request LRU Caching
9
-
10
- `React.cache()` only works within one request. For data shared across sequential requests (user clicks button A then button B), use an LRU cache.
11
-
12
- **Implementation:**
13
-
14
- ```typescript
15
- import { LRUCache } from 'lru-cache'
16
-
17
- const cache = new LRUCache<string, any>({
18
- max: 1000,
19
- ttl: 5 * 60 * 1000 // 5 minutes
20
- })
21
-
22
- export async function getUser(id: string) {
23
- const cached = cache.get(id)
24
- if (cached) return cached
25
-
26
- const user = await db.user.findUnique({ where: { id } })
27
- cache.set(id, user)
28
- return user
29
- }
30
-
31
- // Request 1: DB query, result cached
32
- // Request 2: cache hit, no DB query
33
- ```
34
-
35
- Use when sequential user actions hit multiple endpoints needing the same data within seconds.
36
-
37
- **With Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute):** LRU caching is especially effective because multiple concurrent requests can share the same function instance and cache. This means the cache persists across requests without needing external storage like Redis.
38
-
39
- **In traditional serverless:** Each invocation runs in isolation, so consider Redis for cross-process caching.
40
-
41
- Reference: [https://github.com/isaacs/node-lru-cache](https://github.com/isaacs/node-lru-cache)
@@ -1,76 +0,0 @@
1
- ---
2
- title: Per-Request Deduplication with React.cache()
3
- impact: MEDIUM
4
- impactDescription: deduplicates within request
5
- tags: server, cache, react-cache, deduplication
6
- ---
7
-
8
- ## Per-Request Deduplication with React.cache()
9
-
10
- Use `React.cache()` for server-side request deduplication. Authentication and database queries benefit most.
11
-
12
- **Usage:**
13
-
14
- ```typescript
15
- import { cache } from 'react'
16
-
17
- export const getCurrentUser = cache(async () => {
18
- const session = await auth()
19
- if (!session?.user?.id) return null
20
- return await db.user.findUnique({
21
- where: { id: session.user.id }
22
- })
23
- })
24
- ```
25
-
26
- Within a single request, multiple calls to `getCurrentUser()` execute the query only once.
27
-
28
- **Avoid inline objects as arguments:**
29
-
30
- `React.cache()` uses shallow equality (`Object.is`) to determine cache hits. Inline objects create new references each call, preventing cache hits.
31
-
32
- **Incorrect (always cache miss):**
33
-
34
- ```typescript
35
- const getUser = cache(async (params: { uid: number }) => {
36
- return await db.user.findUnique({ where: { id: params.uid } })
37
- })
38
-
39
- // Each call creates new object, never hits cache
40
- getUser({ uid: 1 })
41
- getUser({ uid: 1 }) // Cache miss, runs query again
42
- ```
43
-
44
- **Correct (cache hit):**
45
-
46
- ```typescript
47
- const getUser = cache(async (uid: number) => {
48
- return await db.user.findUnique({ where: { id: uid } })
49
- })
50
-
51
- // Primitive args use value equality
52
- getUser(1)
53
- getUser(1) // Cache hit, returns cached result
54
- ```
55
-
56
- If you must pass objects, pass the same reference:
57
-
58
- ```typescript
59
- const params = { uid: 1 }
60
- getUser(params) // Query runs
61
- getUser(params) // Cache hit (same reference)
62
- ```
63
-
64
- **Next.js-Specific Note:**
65
-
66
- In Next.js, the `fetch` API is automatically extended with request memoization. Requests with the same URL and options are automatically deduplicated within a single request, so you don't need `React.cache()` for `fetch` calls. However, `React.cache()` is still essential for other async tasks:
67
-
68
- - Database queries (Prisma, Drizzle, etc.)
69
- - Heavy computations
70
- - Authentication checks
71
- - File system operations
72
- - Any non-fetch async work
73
-
74
- Use `React.cache()` to deduplicate these operations across your component tree.
75
-
76
- Reference: [React.cache documentation](https://react.dev/reference/react/cache)
@@ -1,65 +0,0 @@
1
- ---
2
- title: Avoid Duplicate Serialization in RSC Props
3
- impact: LOW
4
- impactDescription: reduces network payload by avoiding duplicate serialization
5
- tags: server, rsc, serialization, props, client-components
6
- ---
7
-
8
- ## Avoid Duplicate Serialization in RSC Props
9
-
10
- **Impact: LOW (reduces network payload by avoiding duplicate serialization)**
11
-
12
- RSC→client serialization deduplicates by object reference, not value. Same reference = serialized once; new reference = serialized again. Do transformations (`.toSorted()`, `.filter()`, `.map()`) in client, not server.
13
-
14
- **Incorrect (duplicates array):**
15
-
16
- ```tsx
17
- // RSC: sends 6 strings (2 arrays × 3 items)
18
- <ClientList usernames={usernames} usernamesOrdered={usernames.toSorted()} />
19
- ```
20
-
21
- **Correct (sends 3 strings):**
22
-
23
- ```tsx
24
- // RSC: send once
25
- <ClientList usernames={usernames} />
26
-
27
- // Client: transform there
28
- 'use client'
29
- const sorted = useMemo(() => [...usernames].sort(), [usernames])
30
- ```
31
-
32
- **Nested deduplication behavior:**
33
-
34
- Deduplication works recursively. Impact varies by data type:
35
-
36
- - `string[]`, `number[]`, `boolean[]`: **HIGH impact** - array + all primitives fully duplicated
37
- - `object[]`: **LOW impact** - array duplicated, but nested objects deduplicated by reference
38
-
39
- ```tsx
40
- // string[] - duplicates everything
41
- usernames={['a','b']} sorted={usernames.toSorted()} // sends 4 strings
42
-
43
- // object[] - duplicates array structure only
44
- users={[{id:1},{id:2}]} sorted={users.toSorted()} // sends 2 arrays + 2 unique objects (not 4)
45
- ```
46
-
47
- **Operations breaking deduplication (create new references):**
48
-
49
- - Arrays: `.toSorted()`, `.filter()`, `.map()`, `.slice()`, `[...arr]`
50
- - Objects: `{...obj}`, `Object.assign()`, `structuredClone()`, `JSON.parse(JSON.stringify())`
51
-
52
- **More examples:**
53
-
54
- ```tsx
55
- // ❌ Bad
56
- <C users={users} active={users.filter(u => u.active)} />
57
- <C product={product} productName={product.name} />
58
-
59
- // ✅ Good
60
- <C users={users} />
61
- <C product={product} />
62
- // Do filtering/destructuring in client
63
- ```
64
-
65
- **Exception:** Pass derived data when transformation is expensive or client doesn't need original.
@@ -1,142 +0,0 @@
1
- ---
2
- title: Hoist Static I/O to Module Level
3
- impact: HIGH
4
- impactDescription: avoids repeated file/network I/O per request
5
- tags: server, io, performance, next.js, route-handlers, og-image
6
- ---
7
-
8
- ## Hoist Static I/O to Module Level
9
-
10
- **Impact: HIGH (avoids repeated file/network I/O per request)**
11
-
12
- When loading static assets (fonts, logos, images, config files) in route handlers or server functions, hoist the I/O operation to module level. Module-level code runs once when the module is first imported, not on every request. This eliminates redundant file system reads or network fetches that would otherwise run on every invocation.
13
-
14
- **Incorrect: reads font file on every request**
15
-
16
- ```typescript
17
- // app/api/og/route.tsx
18
- import { ImageResponse } from 'next/og'
19
-
20
- export async function GET(request: Request) {
21
- // Runs on EVERY request - expensive!
22
- const fontData = await fetch(
23
- new URL('./fonts/Inter.ttf', import.meta.url)
24
- ).then(res => res.arrayBuffer())
25
-
26
- const logoData = await fetch(
27
- new URL('./images/logo.png', import.meta.url)
28
- ).then(res => res.arrayBuffer())
29
-
30
- return new ImageResponse(
31
- <div style={{ fontFamily: 'Inter' }}>
32
- <img src={logoData} />
33
- Hello World
34
- </div>,
35
- { fonts: [{ name: 'Inter', data: fontData }] }
36
- )
37
- }
38
- ```
39
-
40
- **Correct: loads once at module initialization**
41
-
42
- ```typescript
43
- // app/api/og/route.tsx
44
- import { ImageResponse } from 'next/og'
45
-
46
- // Module-level: runs ONCE when module is first imported
47
- const fontData = fetch(
48
- new URL('./fonts/Inter.ttf', import.meta.url)
49
- ).then(res => res.arrayBuffer())
50
-
51
- const logoData = fetch(
52
- new URL('./images/logo.png', import.meta.url)
53
- ).then(res => res.arrayBuffer())
54
-
55
- export async function GET(request: Request) {
56
- // Await the already-started promises
57
- const [font, logo] = await Promise.all([fontData, logoData])
58
-
59
- return new ImageResponse(
60
- <div style={{ fontFamily: 'Inter' }}>
61
- <img src={logo} />
62
- Hello World
63
- </div>,
64
- { fonts: [{ name: 'Inter', data: font }] }
65
- )
66
- }
67
- ```
68
-
69
- **Alternative: synchronous file reads with Node.js fs**
70
-
71
- ```typescript
72
- // app/api/og/route.tsx
73
- import { ImageResponse } from 'next/og'
74
- import { readFileSync } from 'fs'
75
- import { join } from 'path'
76
-
77
- // Synchronous read at module level - blocks only during module init
78
- const fontData = readFileSync(
79
- join(process.cwd(), 'public/fonts/Inter.ttf')
80
- )
81
-
82
- const logoData = readFileSync(
83
- join(process.cwd(), 'public/images/logo.png')
84
- )
85
-
86
- export async function GET(request: Request) {
87
- return new ImageResponse(
88
- <div style={{ fontFamily: 'Inter' }}>
89
- <img src={logoData} />
90
- Hello World
91
- </div>,
92
- { fonts: [{ name: 'Inter', data: fontData }] }
93
- )
94
- }
95
- ```
96
-
97
- **General Node.js example: loading config or templates**
98
-
99
- ```typescript
100
- // Incorrect: reads config on every call
101
- export async function processRequest(data: Data) {
102
- const config = JSON.parse(
103
- await fs.readFile('./config.json', 'utf-8')
104
- )
105
- const template = await fs.readFile('./template.html', 'utf-8')
106
-
107
- return render(template, data, config)
108
- }
109
-
110
- // Correct: loads once at module level
111
- const configPromise = fs.readFile('./config.json', 'utf-8')
112
- .then(JSON.parse)
113
- const templatePromise = fs.readFile('./template.html', 'utf-8')
114
-
115
- export async function processRequest(data: Data) {
116
- const [config, template] = await Promise.all([
117
- configPromise,
118
- templatePromise
119
- ])
120
-
121
- return render(template, data, config)
122
- }
123
- ```
124
-
125
- **When to use this pattern:**
126
-
127
- - Loading fonts for OG image generation
128
- - Loading static logos, icons, or watermarks
129
- - Reading configuration files that don't change at runtime
130
- - Loading email templates or other static templates
131
- - Any static asset that's the same across all requests
132
-
133
- **When NOT to use this pattern:**
134
-
135
- - Assets that vary per request or user
136
- - Files that may change during runtime (use caching with TTL instead)
137
- - Large files that would consume too much memory if kept loaded
138
- - Sensitive data that shouldn't persist in memory
139
-
140
- **With Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute):** Module-level caching is especially effective because multiple concurrent requests share the same function instance. The static assets stay loaded in memory across requests without cold start penalties.
141
-
142
- **In traditional serverless:** Each cold start re-executes module-level code, but subsequent warm invocations reuse the loaded assets until the instance is recycled.
@@ -1,83 +0,0 @@
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
- ```
@@ -1,38 +0,0 @@
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
- ```
@@ -1,39 +0,0 @@
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.