codymaster 4.4.4 → 4.5.1

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 (190) 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 +7 -1
  16. package/skills/_shared/helpers.md +50 -14
  17. package/skills/cm-autopilot/SKILL.md +29 -0
  18. package/skills/cm-autopilot/scripts/autopilot.py +190 -0
  19. package/skills/cm-continuity/SKILL.md +90 -28
  20. package/skills/cm-quality-gate/SKILL.md +11 -1
  21. package/skills/cm-safe-deploy/SKILL.md +38 -2
  22. package/skills/cm-security-gate/SKILL.md +158 -34
  23. package/skills/cm-skill-chain/SKILL.md +47 -1
  24. package/skills/cm-start/SKILL.md +11 -2
  25. package/skills/cm-test-gate/SKILL.md +3 -0
  26. package/skills/boxme-git-config/SKILL.md +0 -56
  27. package/skills/boxme-local-dev/SKILL.md +0 -66
  28. package/skills/jobs-to-be-done/SKILL.md +0 -266
  29. package/skills/jobs-to-be-done/references/case-studies.md +0 -154
  30. package/skills/jobs-to-be-done/references/competitive-strategy.md +0 -280
  31. package/skills/jobs-to-be-done/references/diagnostics.md +0 -158
  32. package/skills/jobs-to-be-done/references/innovation-process.md +0 -392
  33. package/skills/jobs-to-be-done/references/organizational-change.md +0 -328
  34. package/skills/marketplace-report-crawler/SKILL.md +0 -176
  35. package/skills/marketplace-report-crawler/config/accounts.json +0 -41
  36. package/skills/marketplace-report-crawler/config/report-types.json +0 -422
  37. package/skills/marketplace-report-crawler/config/sessions.json +0 -3
  38. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +0 -102
  39. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +0 -114
  40. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +0 -94
  41. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +0 -272
  42. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +0 -281
  43. package/skills/marketplace-report-crawler/scripts/session-check.sh +0 -72
  44. package/skills/marketplace-report-crawler/scripts/session-manager.sh +0 -349
  45. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +0 -83
  46. package/skills/medical-research/SKILL.md +0 -194
  47. package/skills/medical-research/scripts/evidence_checker.py +0 -288
  48. package/skills/mom-test/SKILL.md +0 -267
  49. package/skills/mom-test/references/avoiding-bad-data.md +0 -221
  50. package/skills/mom-test/references/case-studies.md +0 -306
  51. package/skills/mom-test/references/commitment-advancement.md +0 -219
  52. package/skills/mom-test/references/finding-conversations.md +0 -251
  53. package/skills/mom-test/references/processing-learning.md +0 -256
  54. package/skills/mom-test/references/question-patterns.md +0 -198
  55. package/skills/pandasai-analytics/SKILL.md +0 -251
  56. package/skills/release-it/SKILL.md +0 -235
  57. package/skills/release-it/references/anti-patterns.md +0 -279
  58. package/skills/release-it/references/capacity-planning.md +0 -285
  59. package/skills/release-it/references/chaos-engineering.md +0 -325
  60. package/skills/release-it/references/deployment-strategies.md +0 -331
  61. package/skills/release-it/references/observability.md +0 -301
  62. package/skills/release-it/references/stability-patterns.md +0 -355
  63. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +0 -37
  64. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +0 -34
  65. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +0 -51
  66. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +0 -39
  67. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +0 -52
  68. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +0 -25
  69. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +0 -31
  70. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +0 -25
  71. package/skills/skill-creator-ultra/README.md +0 -1242
  72. package/skills/skill-creator-ultra/SKILL.md +0 -388
  73. package/skills/skill-creator-ultra/agents/analyzer.md +0 -274
  74. package/skills/skill-creator-ultra/agents/comparator.md +0 -202
  75. package/skills/skill-creator-ultra/agents/grader.md +0 -223
  76. package/skills/skill-creator-ultra/assets/eval_review.html +0 -146
  77. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +0 -471
  78. package/skills/skill-creator-ultra/eval-viewer/viewer.html +0 -1325
  79. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +0 -109
  80. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +0 -116
  81. package/skills/skill-creator-ultra/examples/example_api_docs.md +0 -189
  82. package/skills/skill-creator-ultra/examples/example_db_migration.md +0 -253
  83. package/skills/skill-creator-ultra/examples/example_git_commit.md +0 -111
  84. package/skills/skill-creator-ultra/install.ps1 +0 -289
  85. package/skills/skill-creator-ultra/install.sh +0 -313
  86. package/skills/skill-creator-ultra/phases/phase1_interview.md +0 -202
  87. package/skills/skill-creator-ultra/phases/phase2_extract.md +0 -55
  88. package/skills/skill-creator-ultra/phases/phase3_detect.md +0 -57
  89. package/skills/skill-creator-ultra/phases/phase4_generate.md +0 -543
  90. package/skills/skill-creator-ultra/phases/phase5_test.md +0 -319
  91. package/skills/skill-creator-ultra/phases/phase6_eval.md +0 -301
  92. package/skills/skill-creator-ultra/phases/phase7_iterate.md +0 -103
  93. package/skills/skill-creator-ultra/phases/phase8_optimize.md +0 -113
  94. package/skills/skill-creator-ultra/resources/advanced_patterns.md +0 -499
  95. package/skills/skill-creator-ultra/resources/anti_patterns.md +0 -376
  96. package/skills/skill-creator-ultra/resources/blueprints.md +0 -498
  97. package/skills/skill-creator-ultra/resources/checklist.md +0 -243
  98. package/skills/skill-creator-ultra/resources/composition_cookbook.md +0 -291
  99. package/skills/skill-creator-ultra/resources/description_optimization.md +0 -90
  100. package/skills/skill-creator-ultra/resources/eval_guide.md +0 -133
  101. package/skills/skill-creator-ultra/resources/industry_questions.md +0 -189
  102. package/skills/skill-creator-ultra/resources/interview_questions.md +0 -200
  103. package/skills/skill-creator-ultra/resources/pattern_detection.md +0 -200
  104. package/skills/skill-creator-ultra/resources/prompt_engineering.md +0 -531
  105. package/skills/skill-creator-ultra/resources/schemas.md +0 -430
  106. package/skills/skill-creator-ultra/resources/script_integration.md +0 -593
  107. package/skills/skill-creator-ultra/resources/scripts_guide.md +0 -339
  108. package/skills/skill-creator-ultra/resources/skill_template.md +0 -124
  109. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +0 -634
  110. package/skills/skill-creator-ultra/resources/versioning_guide.md +0 -193
  111. package/skills/skill-creator-ultra/scripts/ci_eval.py +0 -200
  112. package/skills/skill-creator-ultra/scripts/package_skill.py +0 -165
  113. package/skills/skill-creator-ultra/scripts/simulate_skill.py +0 -398
  114. package/skills/skill-creator-ultra/scripts/skill_audit.py +0 -611
  115. package/skills/skill-creator-ultra/scripts/skill_compare.py +0 -265
  116. package/skills/skill-creator-ultra/scripts/skill_export.py +0 -334
  117. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +0 -403
  118. package/skills/skill-creator-ultra/scripts/skill_stats.py +0 -339
  119. package/skills/skill-creator-ultra/scripts/validate_skill.py +0 -411
  120. package/skills/tailwind-mastery/SKILL.md +0 -229
  121. package/skills/vercel-react-best-practices/AGENTS.md +0 -3373
  122. package/skills/vercel-react-best-practices/README.md +0 -123
  123. package/skills/vercel-react-best-practices/SKILL.md +0 -143
  124. package/skills/vercel-react-best-practices/rules/_sections.md +0 -46
  125. package/skills/vercel-react-best-practices/rules/_template.md +0 -28
  126. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  127. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  128. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  129. package/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  130. package/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -80
  131. package/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  132. package/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  133. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  134. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -59
  135. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  136. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  137. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  138. package/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  139. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  140. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  141. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  142. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  143. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  144. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  145. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  146. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  147. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  148. package/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  149. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  150. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  151. package/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  152. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  153. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  154. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  155. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  156. package/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  157. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  158. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  159. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  160. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  161. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  162. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  163. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  164. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  165. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  166. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  167. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  168. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  169. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  170. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  171. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  172. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  173. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  174. package/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  175. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  176. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  177. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  178. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  179. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  180. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  181. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  182. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  183. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  184. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  185. package/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  186. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  187. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -142
  188. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  189. package/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  190. 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.