@mrtrinhvn/ag-kit 1.0.11 → 1.1.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 (218) hide show
  1. package/README.md +31 -0
  2. package/bin/cli.js +72 -0
  3. package/package.json +7 -1
  4. package/template/.agent/knowledge/orchestrator_v3_protocol.md +60 -0
  5. package/template/.agent/knowledge/self_healing_logs.md +22 -0
  6. package/{.agent → template/.agent}/skills/telegram-agentic-gateway/SKILL.md +0 -0
  7. package/template/.agent/skills/vfs-assistant/SKILL.md +39 -0
  8. package/.agent/agents/backend-specialist.md +0 -263
  9. package/.agent/agents/code-archaeologist.md +0 -106
  10. package/.agent/agents/database-architect.md +0 -226
  11. package/.agent/agents/debugger.md +0 -225
  12. package/.agent/agents/devops-engineer.md +0 -242
  13. package/.agent/agents/documentation-writer.md +0 -104
  14. package/.agent/agents/explorer-agent.md +0 -73
  15. package/.agent/agents/frontend-specialist.md +0 -556
  16. package/.agent/agents/game-developer.md +0 -162
  17. package/.agent/agents/mobile-developer.md +0 -377
  18. package/.agent/agents/orchestrator.md +0 -416
  19. package/.agent/agents/penetration-tester.md +0 -188
  20. package/.agent/agents/performance-optimizer.md +0 -187
  21. package/.agent/agents/product-manager.md +0 -112
  22. package/.agent/agents/product-owner.md +0 -95
  23. package/.agent/agents/project-planner.md +0 -406
  24. package/.agent/agents/qa-automation-engineer.md +0 -103
  25. package/.agent/agents/quant-architect.md +0 -31
  26. package/.agent/agents/security-auditor.md +0 -170
  27. package/.agent/agents/seo-specialist.md +0 -111
  28. package/.agent/agents/test-engineer.md +0 -158
  29. package/.agent/rules/GEMINI.md +0 -280
  30. package/.agent/scripts/auto_preview.py +0 -148
  31. package/.agent/scripts/checklist.py +0 -217
  32. package/.agent/scripts/session_manager.py +0 -120
  33. package/.agent/scripts/verify_all.py +0 -327
  34. package/.agent/skills/api-patterns/SKILL.md +0 -81
  35. package/.agent/skills/api-patterns/api-style.md +0 -42
  36. package/.agent/skills/api-patterns/auth.md +0 -24
  37. package/.agent/skills/api-patterns/documentation.md +0 -26
  38. package/.agent/skills/api-patterns/graphql.md +0 -41
  39. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  40. package/.agent/skills/api-patterns/response.md +0 -37
  41. package/.agent/skills/api-patterns/rest.md +0 -40
  42. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  43. package/.agent/skills/api-patterns/security-testing.md +0 -122
  44. package/.agent/skills/api-patterns/trpc.md +0 -41
  45. package/.agent/skills/api-patterns/versioning.md +0 -22
  46. package/.agent/skills/app-builder/SKILL.md +0 -75
  47. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  48. package/.agent/skills/app-builder/feature-building.md +0 -53
  49. package/.agent/skills/app-builder/project-detection.md +0 -34
  50. package/.agent/skills/app-builder/scaffolding.md +0 -118
  51. package/.agent/skills/app-builder/tech-stack.md +0 -40
  52. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  53. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  54. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  55. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  56. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  57. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  58. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  59. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  60. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -82
  61. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -100
  62. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -106
  63. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -101
  64. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  65. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -93
  66. package/.agent/skills/architecture/SKILL.md +0 -55
  67. package/.agent/skills/architecture/context-discovery.md +0 -43
  68. package/.agent/skills/architecture/examples.md +0 -94
  69. package/.agent/skills/architecture/pattern-selection.md +0 -68
  70. package/.agent/skills/architecture/patterns-reference.md +0 -50
  71. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  72. package/.agent/skills/bash-linux/SKILL.md +0 -199
  73. package/.agent/skills/behavioral-modes/SKILL.md +0 -242
  74. package/.agent/skills/brainstorming/SKILL.md +0 -168
  75. package/.agent/skills/brainstorming/dynamic-questioning.md +0 -350
  76. package/.agent/skills/business-ops/SKILL.md +0 -26
  77. package/.agent/skills/clean-code/SKILL.md +0 -202
  78. package/.agent/skills/cli-generator/SKILL.md +0 -48
  79. package/.agent/skills/code-review-checklist/SKILL.md +0 -109
  80. package/.agent/skills/cognitive-session/SKILL.md +0 -28
  81. package/.agent/skills/data-science/SKILL.md +0 -28
  82. package/.agent/skills/database-design/SKILL.md +0 -52
  83. package/.agent/skills/database-design/database-selection.md +0 -43
  84. package/.agent/skills/database-design/indexing.md +0 -39
  85. package/.agent/skills/database-design/migrations.md +0 -48
  86. package/.agent/skills/database-design/optimization.md +0 -36
  87. package/.agent/skills/database-design/orm-selection.md +0 -30
  88. package/.agent/skills/database-design/schema-design.md +0 -56
  89. package/.agent/skills/database-design/scripts/schema_validator.py +0 -172
  90. package/.agent/skills/deployment-procedures/SKILL.md +0 -241
  91. package/.agent/skills/doc.md +0 -177
  92. package/.agent/skills/documentation-templates/SKILL.md +0 -194
  93. package/.agent/skills/frontend-design/SKILL.md +0 -418
  94. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  95. package/.agent/skills/frontend-design/color-system.md +0 -311
  96. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  97. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  98. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  99. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  100. package/.agent/skills/frontend-design/typography-system.md +0 -345
  101. package/.agent/skills/frontend-design/ux-psychology.md +0 -541
  102. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  103. package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
  104. package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
  105. package/.agent/skills/game-development/SKILL.md +0 -167
  106. package/.agent/skills/game-development/game-art/SKILL.md +0 -185
  107. package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
  108. package/.agent/skills/game-development/game-design/SKILL.md +0 -129
  109. package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
  110. package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
  111. package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
  112. package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
  113. package/.agent/skills/game-development/web-games/SKILL.md +0 -150
  114. package/.agent/skills/geo-fundamentals/SKILL.md +0 -156
  115. package/.agent/skills/geo-fundamentals/scripts/geo_checker.py +0 -289
  116. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  117. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  118. package/.agent/skills/intelligent-routing/SKILL.md +0 -335
  119. package/.agent/skills/knowledge-management/SKILL.md +0 -66
  120. package/.agent/skills/lint-and-validate/SKILL.md +0 -45
  121. package/.agent/skills/lint-and-validate/scripts/lint_runner.py +0 -172
  122. package/.agent/skills/lint-and-validate/scripts/type_coverage.py +0 -173
  123. package/.agent/skills/llm-routing-quirks/SKILL.md +0 -41
  124. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  125. package/.agent/skills/memory-architecture/SKILL.md +0 -107
  126. package/.agent/skills/mini-antigravity-injection/SKILL.md +0 -66
  127. package/.agent/skills/mobile-design/SKILL.md +0 -394
  128. package/.agent/skills/mobile-design/decision-trees.md +0 -516
  129. package/.agent/skills/mobile-design/mobile-backend.md +0 -491
  130. package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
  131. package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
  132. package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
  133. package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
  134. package/.agent/skills/mobile-design/mobile-performance.md +0 -767
  135. package/.agent/skills/mobile-design/mobile-testing.md +0 -356
  136. package/.agent/skills/mobile-design/mobile-typography.md +0 -433
  137. package/.agent/skills/mobile-design/platform-android.md +0 -666
  138. package/.agent/skills/mobile-design/platform-ios.md +0 -561
  139. package/.agent/skills/mobile-design/scripts/mobile_audit.py +0 -670
  140. package/.agent/skills/mobile-design/touch-psychology.md +0 -537
  141. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  142. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  143. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  144. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  145. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  146. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  147. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  148. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  149. package/.agent/skills/nextjs-react-expert/SKILL.md +0 -267
  150. package/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +0 -222
  151. package/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
  152. package/.agent/skills/nodejs-best-practices/SKILL.md +0 -333
  153. package/.agent/skills/parallel-agents/SKILL.md +0 -175
  154. package/.agent/skills/performance-profiling/SKILL.md +0 -143
  155. package/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +0 -76
  156. package/.agent/skills/plan-writing/SKILL.md +0 -153
  157. package/.agent/skills/powershell-windows/SKILL.md +0 -167
  158. package/.agent/skills/product-management/SKILL.md +0 -30
  159. package/.agent/skills/python-patterns/SKILL.md +0 -441
  160. package/.agent/skills/red-team-tactics/SKILL.md +0 -199
  161. package/.agent/skills/seo-fundamentals/SKILL.md +0 -129
  162. package/.agent/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
  163. package/.agent/skills/server-management/SKILL.md +0 -161
  164. package/.agent/skills/systematic-debugging/SKILL.md +0 -120
  165. package/.agent/skills/tailwind-patterns/SKILL.md +0 -269
  166. package/.agent/skills/tdd-workflow/SKILL.md +0 -148
  167. package/.agent/skills/testing-patterns/SKILL.md +0 -178
  168. package/.agent/skills/testing-patterns/scripts/test_runner.py +0 -219
  169. package/.agent/skills/vulnerability-scanner/SKILL.md +0 -276
  170. package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
  171. package/.agent/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
  172. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  173. package/.agent/skills/webapp-testing/SKILL.md +0 -187
  174. package/.agent/skills/webapp-testing/scripts/playwright_runner.py +0 -173
  175. package/.agent/workflows/brainstorm.md +0 -113
  176. package/.agent/workflows/create.md +0 -59
  177. package/.agent/workflows/debug.md +0 -103
  178. package/.agent/workflows/deploy.md +0 -176
  179. package/.agent/workflows/enhance.md +0 -63
  180. package/.agent/workflows/orchestrate.md +0 -237
  181. package/.agent/workflows/plan.md +0 -89
  182. package/.agent/workflows/preview.md +0 -81
  183. package/.agent/workflows/status.md +0 -86
  184. package/.agent/workflows/test.md +0 -144
  185. package/.agent/workflows/ui-ux-pro-max.md +0 -296
  186. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/charts.csv +0 -0
  187. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/colors.csv +0 -0
  188. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/icons.csv +0 -0
  189. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/landing.csv +0 -0
  190. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/products.csv +0 -0
  191. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/prompts.csv +0 -0
  192. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/react-performance.csv +0 -0
  193. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -0
  194. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -0
  195. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -0
  196. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -0
  197. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -0
  198. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -0
  199. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -0
  200. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -0
  201. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -0
  202. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -0
  203. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -0
  204. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -0
  205. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/styles.csv +0 -0
  206. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/typography.csv +0 -0
  207. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -0
  208. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -0
  209. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/data/web-interface.csv +0 -0
  210. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  211. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  212. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/scripts/core.py +0 -0
  213. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/scripts/design_system.py +0 -0
  214. /package/{.agent → template/.agent}/.shared/ui-ux-pro-max/scripts/search.py +0 -0
  215. /package/{.agent → template/.agent}/ARCHITECTURE.md +0 -0
  216. /package/{.agent → template/.agent}/mcp_config.json +0 -0
  217. /package/{.agent → template/.agent}/skills/nextjs-react-expert/9-cache-components.md +0 -0
  218. /package/{.agent → template/.agent}/skills/rust-pro/SKILL.md +0 -0
@@ -1,264 +0,0 @@
1
- # 4. Client-Side Data Fetching
2
-
3
- > **Impact:** MEDIUM-HIGH
4
- > **Focus:** Automatic deduplication and efficient data fetching patterns reduce redundant network requests.
5
-
6
- ---
7
-
8
- ## Overview
9
-
10
- This section contains **4 rules** focused on client-side data fetching.
11
-
12
- ---
13
-
14
- ## Rule 4.1: Deduplicate Global Event Listeners
15
-
16
- **Impact:** LOW
17
- **Tags:** client, swr, event-listeners, subscription
18
-
19
- ## Deduplicate Global Event Listeners
20
-
21
- Use `useSWRSubscription()` to share global event listeners across component instances.
22
-
23
- **Incorrect (N instances = N listeners):**
24
-
25
- ```tsx
26
- function useKeyboardShortcut(key: string, callback: () => void) {
27
- useEffect(() => {
28
- const handler = (e: KeyboardEvent) => {
29
- if (e.metaKey && e.key === key) {
30
- callback()
31
- }
32
- }
33
- window.addEventListener('keydown', handler)
34
- return () => window.removeEventListener('keydown', handler)
35
- }, [key, callback])
36
- }
37
- ```
38
-
39
- When using the `useKeyboardShortcut` hook multiple times, each instance will register a new listener.
40
-
41
- **Correct (N instances = 1 listener):**
42
-
43
- ```tsx
44
- import useSWRSubscription from 'swr/subscription'
45
-
46
- // Module-level Map to track callbacks per key
47
- const keyCallbacks = new Map<string, Set<() => void>>()
48
-
49
- function useKeyboardShortcut(key: string, callback: () => void) {
50
- // Register this callback in the Map
51
- useEffect(() => {
52
- if (!keyCallbacks.has(key)) {
53
- keyCallbacks.set(key, new Set())
54
- }
55
- keyCallbacks.get(key)!.add(callback)
56
-
57
- return () => {
58
- const set = keyCallbacks.get(key)
59
- if (set) {
60
- set.delete(callback)
61
- if (set.size === 0) {
62
- keyCallbacks.delete(key)
63
- }
64
- }
65
- }
66
- }, [key, callback])
67
-
68
- useSWRSubscription('global-keydown', () => {
69
- const handler = (e: KeyboardEvent) => {
70
- if (e.metaKey && keyCallbacks.has(e.key)) {
71
- keyCallbacks.get(e.key)!.forEach(cb => cb())
72
- }
73
- }
74
- window.addEventListener('keydown', handler)
75
- return () => window.removeEventListener('keydown', handler)
76
- })
77
- }
78
-
79
- function Profile() {
80
- // Multiple shortcuts will share the same listener
81
- useKeyboardShortcut('p', () => { /* ... */ })
82
- useKeyboardShortcut('k', () => { /* ... */ })
83
- // ...
84
- }
85
- ```
86
-
87
- ---
88
-
89
- ## Rule 4.2: Use Passive Event Listeners for Scrolling Performance
90
-
91
- **Impact:** MEDIUM
92
- **Tags:** client, event-listeners, scrolling, performance, touch, wheel
93
-
94
- ## Use Passive Event Listeners for Scrolling Performance
95
-
96
- Add `{ passive: true }` to touch and wheel event listeners to enable immediate scrolling. Browsers normally wait for listeners to finish to check if `preventDefault()` is called, causing scroll delay.
97
-
98
- **Incorrect:**
99
-
100
- ```typescript
101
- useEffect(() => {
102
- const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX)
103
- const handleWheel = (e: WheelEvent) => console.log(e.deltaY)
104
-
105
- document.addEventListener('touchstart', handleTouch)
106
- document.addEventListener('wheel', handleWheel)
107
-
108
- return () => {
109
- document.removeEventListener('touchstart', handleTouch)
110
- document.removeEventListener('wheel', handleWheel)
111
- }
112
- }, [])
113
- ```
114
-
115
- **Correct:**
116
-
117
- ```typescript
118
- useEffect(() => {
119
- const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX)
120
- const handleWheel = (e: WheelEvent) => console.log(e.deltaY)
121
-
122
- document.addEventListener('touchstart', handleTouch, { passive: true })
123
- document.addEventListener('wheel', handleWheel, { passive: true })
124
-
125
- return () => {
126
- document.removeEventListener('touchstart', handleTouch)
127
- document.removeEventListener('wheel', handleWheel)
128
- }
129
- }, [])
130
- ```
131
-
132
- **Use passive when:** tracking/analytics, logging, any listener that doesn't call `preventDefault()`.
133
-
134
- **Don't use passive when:** implementing custom swipe gestures, custom zoom controls, or any listener that needs `preventDefault()`.
135
-
136
- ---
137
-
138
- ## Rule 4.3: Use SWR for Automatic Deduplication
139
-
140
- **Impact:** MEDIUM-HIGH
141
- **Tags:** client, swr, deduplication, data-fetching
142
-
143
- ## Use SWR for Automatic Deduplication
144
-
145
- SWR enables request deduplication, caching, and revalidation across component instances.
146
-
147
- **Incorrect (no deduplication, each instance fetches):**
148
-
149
- ```tsx
150
- function UserList() {
151
- const [users, setUsers] = useState([])
152
- useEffect(() => {
153
- fetch('/api/users')
154
- .then(r => r.json())
155
- .then(setUsers)
156
- }, [])
157
- }
158
- ```
159
-
160
- **Correct (multiple instances share one request):**
161
-
162
- ```tsx
163
- import useSWR from 'swr'
164
-
165
- function UserList() {
166
- const { data: users } = useSWR('/api/users', fetcher)
167
- }
168
- ```
169
-
170
- **For immutable data:**
171
-
172
- ```tsx
173
- import { useImmutableSWR } from '@/lib/swr'
174
-
175
- function StaticContent() {
176
- const { data } = useImmutableSWR('/api/config', fetcher)
177
- }
178
- ```
179
-
180
- **For mutations:**
181
-
182
- ```tsx
183
- import { useSWRMutation } from 'swr/mutation'
184
-
185
- function UpdateButton() {
186
- const { trigger } = useSWRMutation('/api/user', updateUser)
187
- return <button onClick={() => trigger()}>Update</button>
188
- }
189
- ```
190
-
191
- Reference: [https://swr.vercel.app](https://swr.vercel.app)
192
-
193
- ---
194
-
195
- ## Rule 4.4: Version and Minimize localStorage Data
196
-
197
- **Impact:** MEDIUM
198
- **Tags:** client, localStorage, storage, versioning, data-minimization
199
-
200
- ## Version and Minimize localStorage Data
201
-
202
- Add version prefix to keys and store only needed fields. Prevents schema conflicts and accidental storage of sensitive data.
203
-
204
- **Incorrect:**
205
-
206
- ```typescript
207
- // No version, stores everything, no error handling
208
- localStorage.setItem('userConfig', JSON.stringify(fullUserObject))
209
- const data = localStorage.getItem('userConfig')
210
- ```
211
-
212
- **Correct:**
213
-
214
- ```typescript
215
- const VERSION = 'v2'
216
-
217
- function saveConfig(config: { theme: string; language: string }) {
218
- try {
219
- localStorage.setItem(`userConfig:${VERSION}`, JSON.stringify(config))
220
- } catch {
221
- // Throws in incognito/private browsing, quota exceeded, or disabled
222
- }
223
- }
224
-
225
- function loadConfig() {
226
- try {
227
- const data = localStorage.getItem(`userConfig:${VERSION}`)
228
- return data ? JSON.parse(data) : null
229
- } catch {
230
- return null
231
- }
232
- }
233
-
234
- // Migration from v1 to v2
235
- function migrate() {
236
- try {
237
- const v1 = localStorage.getItem('userConfig:v1')
238
- if (v1) {
239
- const old = JSON.parse(v1)
240
- saveConfig({ theme: old.darkMode ? 'dark' : 'light', language: old.lang })
241
- localStorage.removeItem('userConfig:v1')
242
- }
243
- } catch {}
244
- }
245
- ```
246
-
247
- **Store minimal fields from server responses:**
248
-
249
- ```typescript
250
- // User object has 20+ fields, only store what UI needs
251
- function cachePrefs(user: FullUser) {
252
- try {
253
- localStorage.setItem('prefs:v1', JSON.stringify({
254
- theme: user.preferences.theme,
255
- notifications: user.preferences.notifications
256
- }))
257
- } catch {}
258
- }
259
- ```
260
-
261
- **Always wrap in try-catch:** `getItem()` and `setItem()` throw in incognito/private browsing (Safari, Firefox), when quota exceeded, or when disabled.
262
-
263
- **Benefits:** Schema evolution via versioning, reduced storage size, prevents storing tokens/PII/internal flags.
264
-