@relipa/ai-flow-kit 0.0.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 (204) hide show
  1. package/AIFLOW.md +432 -0
  2. package/CHANGELOG.md +78 -0
  3. package/CONTRIBUTING.md +351 -0
  4. package/IMPLEMENTATION_SUMMARY.md +348 -0
  5. package/QUICK_START.md +392 -0
  6. package/README.md +323 -0
  7. package/bin/aiflow.js +178 -0
  8. package/custom/mcp-presets/README.md +138 -0
  9. package/custom/mcp-presets/backlog.json +15 -0
  10. package/custom/mcp-presets/figma.json +15 -0
  11. package/custom/mcp-presets/google-sheets.json +14 -0
  12. package/custom/mcp-presets/jira.json +16 -0
  13. package/custom/prompts/bug-fix.md +149 -0
  14. package/custom/prompts/feature.md +190 -0
  15. package/custom/prompts/investigation.md +164 -0
  16. package/custom/rules/code-style.md +7 -0
  17. package/custom/rules/java/code-style.md +11 -0
  18. package/custom/rules/java/naming.md +17 -0
  19. package/custom/rules/java/review-checklist.md +36 -0
  20. package/custom/rules/javascript/code-style.md +12 -0
  21. package/custom/rules/javascript/naming.md +14 -0
  22. package/custom/rules/naming.md +9 -0
  23. package/custom/rules/php/code-style.md +10 -0
  24. package/custom/rules/php/naming.md +15 -0
  25. package/custom/rules/review-checklist.md +9 -0
  26. package/custom/skills/figma-to-component/SKILL.md +207 -0
  27. package/custom/skills/generate-spec/SKILL.md +97 -0
  28. package/custom/skills/impact-analysis/SKILL.md +94 -0
  29. package/custom/skills/investigate-bug/SKILL.md +93 -0
  30. package/custom/skills/report-customer/SKILL.md +95 -0
  31. package/custom/skills/review-plan/SKILL.md +158 -0
  32. package/custom/skills/validate-ticket/SKILL.md +240 -0
  33. package/custom/templates/laravel.md +90 -0
  34. package/custom/templates/nextjs.md +89 -0
  35. package/custom/templates/reactjs.md +567 -0
  36. package/custom/templates/spring-boot.md +598 -0
  37. package/custom/templates/vue-nuxt.md +89 -0
  38. package/docs/architecture.md +395 -0
  39. package/docs/cli-reference.md +438 -0
  40. package/docs/configuration.md +412 -0
  41. package/docs/getting-started.md +248 -0
  42. package/docs/troubleshooting.md +587 -0
  43. package/docs/workflows/bug-fix.md +126 -0
  44. package/docs/workflows/feature.md +123 -0
  45. package/docs/workflows/impact-analysis.md +13 -0
  46. package/docs/workflows/investigation.md +13 -0
  47. package/docs/workflows/refactor.md +13 -0
  48. package/index.js +27 -0
  49. package/package.json +70 -0
  50. package/scripts/config.js +317 -0
  51. package/scripts/context.js +117 -0
  52. package/scripts/detect.js +239 -0
  53. package/scripts/doctor.js +48 -0
  54. package/scripts/guide.js +282 -0
  55. package/scripts/hooks/session-start.js +140 -0
  56. package/scripts/init.js +453 -0
  57. package/scripts/memory.js +247 -0
  58. package/scripts/prompt.js +392 -0
  59. package/scripts/remove.js +170 -0
  60. package/scripts/update.js +111 -0
  61. package/scripts/use.js +570 -0
  62. package/scripts/validate.js +303 -0
  63. package/upstream/.claude-plugin/marketplace.json +20 -0
  64. package/upstream/.claude-plugin/plugin.json +20 -0
  65. package/upstream/.codex/INSTALL.md +67 -0
  66. package/upstream/.cursor-plugin/plugin.json +25 -0
  67. package/upstream/.gitattributes +18 -0
  68. package/upstream/.github/FUNDING.yml +3 -0
  69. package/upstream/.github/ISSUE_TEMPLATE/bug_report.md +52 -0
  70. package/upstream/.github/ISSUE_TEMPLATE/config.yml +5 -0
  71. package/upstream/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
  72. package/upstream/.github/ISSUE_TEMPLATE/platform_support.md +23 -0
  73. package/upstream/.github/PULL_REQUEST_TEMPLATE.md +87 -0
  74. package/upstream/.opencode/INSTALL.md +83 -0
  75. package/upstream/.opencode/plugins/superpowers.js +112 -0
  76. package/upstream/.version-bump.json +19 -0
  77. package/upstream/AGENTS.md +1 -0
  78. package/upstream/CHANGELOG.md +13 -0
  79. package/upstream/CLAUDE.md +85 -0
  80. package/upstream/CODE_OF_CONDUCT.md +128 -0
  81. package/upstream/GEMINI.md +2 -0
  82. package/upstream/LICENSE +21 -0
  83. package/upstream/README.md +190 -0
  84. package/upstream/RELEASE-NOTES.md +1096 -0
  85. package/upstream/agents/code-reviewer.md +48 -0
  86. package/upstream/commands/brainstorm.md +5 -0
  87. package/upstream/commands/execute-plan.md +5 -0
  88. package/upstream/commands/write-plan.md +5 -0
  89. package/upstream/docs/README.codex.md +126 -0
  90. package/upstream/docs/README.opencode.md +130 -0
  91. package/upstream/docs/plans/2025-11-22-opencode-support-design.md +294 -0
  92. package/upstream/docs/plans/2025-11-22-opencode-support-implementation.md +1095 -0
  93. package/upstream/docs/plans/2025-11-28-skills-improvements-from-user-feedback.md +711 -0
  94. package/upstream/docs/plans/2026-01-17-visual-brainstorming.md +571 -0
  95. package/upstream/docs/superpowers/plans/2026-01-22-document-review-system.md +301 -0
  96. package/upstream/docs/superpowers/plans/2026-02-19-visual-brainstorming-refactor.md +523 -0
  97. package/upstream/docs/superpowers/plans/2026-03-11-zero-dep-brainstorm-server.md +479 -0
  98. package/upstream/docs/superpowers/plans/2026-03-23-codex-app-compatibility.md +564 -0
  99. package/upstream/docs/superpowers/specs/2026-01-22-document-review-system-design.md +136 -0
  100. package/upstream/docs/superpowers/specs/2026-02-19-visual-brainstorming-refactor-design.md +162 -0
  101. package/upstream/docs/superpowers/specs/2026-03-11-zero-dep-brainstorm-server-design.md +118 -0
  102. package/upstream/docs/superpowers/specs/2026-03-23-codex-app-compatibility-design.md +244 -0
  103. package/upstream/docs/testing.md +303 -0
  104. package/upstream/docs/windows/polyglot-hooks.md +212 -0
  105. package/upstream/gemini-extension.json +6 -0
  106. package/upstream/hooks/hooks-cursor.json +10 -0
  107. package/upstream/hooks/hooks.json +16 -0
  108. package/upstream/hooks/run-hook.cmd +46 -0
  109. package/upstream/hooks/session-start +57 -0
  110. package/upstream/package.json +6 -0
  111. package/upstream/scripts/bump-version.sh +220 -0
  112. package/upstream/skills/brainstorming/SKILL.md +164 -0
  113. package/upstream/skills/brainstorming/scripts/frame-template.html +214 -0
  114. package/upstream/skills/brainstorming/scripts/helper.js +88 -0
  115. package/upstream/skills/brainstorming/scripts/server.cjs +354 -0
  116. package/upstream/skills/brainstorming/scripts/start-server.sh +148 -0
  117. package/upstream/skills/brainstorming/scripts/stop-server.sh +56 -0
  118. package/upstream/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  119. package/upstream/skills/brainstorming/visual-companion.md +287 -0
  120. package/upstream/skills/dispatching-parallel-agents/SKILL.md +182 -0
  121. package/upstream/skills/executing-plans/SKILL.md +70 -0
  122. package/upstream/skills/finishing-a-development-branch/SKILL.md +200 -0
  123. package/upstream/skills/receiving-code-review/SKILL.md +213 -0
  124. package/upstream/skills/requesting-code-review/SKILL.md +105 -0
  125. package/upstream/skills/requesting-code-review/code-reviewer.md +146 -0
  126. package/upstream/skills/subagent-driven-development/SKILL.md +277 -0
  127. package/upstream/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  128. package/upstream/skills/subagent-driven-development/implementer-prompt.md +113 -0
  129. package/upstream/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  130. package/upstream/skills/systematic-debugging/CREATION-LOG.md +119 -0
  131. package/upstream/skills/systematic-debugging/SKILL.md +296 -0
  132. package/upstream/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  133. package/upstream/skills/systematic-debugging/condition-based-waiting.md +115 -0
  134. package/upstream/skills/systematic-debugging/defense-in-depth.md +122 -0
  135. package/upstream/skills/systematic-debugging/find-polluter.sh +63 -0
  136. package/upstream/skills/systematic-debugging/root-cause-tracing.md +169 -0
  137. package/upstream/skills/systematic-debugging/test-academic.md +14 -0
  138. package/upstream/skills/systematic-debugging/test-pressure-1.md +58 -0
  139. package/upstream/skills/systematic-debugging/test-pressure-2.md +68 -0
  140. package/upstream/skills/systematic-debugging/test-pressure-3.md +69 -0
  141. package/upstream/skills/test-driven-development/SKILL.md +371 -0
  142. package/upstream/skills/test-driven-development/testing-anti-patterns.md +299 -0
  143. package/upstream/skills/using-git-worktrees/SKILL.md +218 -0
  144. package/upstream/skills/using-superpowers/SKILL.md +117 -0
  145. package/upstream/skills/using-superpowers/references/codex-tools.md +100 -0
  146. package/upstream/skills/using-superpowers/references/copilot-tools.md +52 -0
  147. package/upstream/skills/using-superpowers/references/gemini-tools.md +33 -0
  148. package/upstream/skills/verification-before-completion/SKILL.md +139 -0
  149. package/upstream/skills/writing-plans/SKILL.md +152 -0
  150. package/upstream/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  151. package/upstream/skills/writing-skills/SKILL.md +655 -0
  152. package/upstream/skills/writing-skills/anthropic-best-practices.md +1150 -0
  153. package/upstream/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  154. package/upstream/skills/writing-skills/graphviz-conventions.dot +172 -0
  155. package/upstream/skills/writing-skills/persuasion-principles.md +187 -0
  156. package/upstream/skills/writing-skills/render-graphs.js +168 -0
  157. package/upstream/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  158. package/upstream/tests/brainstorm-server/package-lock.json +36 -0
  159. package/upstream/tests/brainstorm-server/package.json +10 -0
  160. package/upstream/tests/brainstorm-server/server.test.js +427 -0
  161. package/upstream/tests/brainstorm-server/windows-lifecycle.test.sh +351 -0
  162. package/upstream/tests/brainstorm-server/ws-protocol.test.js +392 -0
  163. package/upstream/tests/claude-code/README.md +158 -0
  164. package/upstream/tests/claude-code/analyze-token-usage.py +168 -0
  165. package/upstream/tests/claude-code/run-skill-tests.sh +187 -0
  166. package/upstream/tests/claude-code/test-document-review-system.sh +177 -0
  167. package/upstream/tests/claude-code/test-helpers.sh +202 -0
  168. package/upstream/tests/claude-code/test-subagent-driven-development-integration.sh +314 -0
  169. package/upstream/tests/claude-code/test-subagent-driven-development.sh +165 -0
  170. package/upstream/tests/explicit-skill-requests/prompts/action-oriented.txt +3 -0
  171. package/upstream/tests/explicit-skill-requests/prompts/after-planning-flow.txt +17 -0
  172. package/upstream/tests/explicit-skill-requests/prompts/claude-suggested-it.txt +11 -0
  173. package/upstream/tests/explicit-skill-requests/prompts/i-know-what-sdd-means.txt +8 -0
  174. package/upstream/tests/explicit-skill-requests/prompts/mid-conversation-execute-plan.txt +3 -0
  175. package/upstream/tests/explicit-skill-requests/prompts/please-use-brainstorming.txt +1 -0
  176. package/upstream/tests/explicit-skill-requests/prompts/skip-formalities.txt +3 -0
  177. package/upstream/tests/explicit-skill-requests/prompts/subagent-driven-development-please.txt +1 -0
  178. package/upstream/tests/explicit-skill-requests/prompts/use-systematic-debugging.txt +1 -0
  179. package/upstream/tests/explicit-skill-requests/run-all.sh +70 -0
  180. package/upstream/tests/explicit-skill-requests/run-claude-describes-sdd.sh +100 -0
  181. package/upstream/tests/explicit-skill-requests/run-extended-multiturn-test.sh +113 -0
  182. package/upstream/tests/explicit-skill-requests/run-haiku-test.sh +144 -0
  183. package/upstream/tests/explicit-skill-requests/run-multiturn-test.sh +143 -0
  184. package/upstream/tests/explicit-skill-requests/run-test.sh +136 -0
  185. package/upstream/tests/opencode/run-tests.sh +163 -0
  186. package/upstream/tests/opencode/setup.sh +88 -0
  187. package/upstream/tests/opencode/test-plugin-loading.sh +82 -0
  188. package/upstream/tests/opencode/test-priority.sh +198 -0
  189. package/upstream/tests/opencode/test-tools.sh +104 -0
  190. package/upstream/tests/skill-triggering/prompts/dispatching-parallel-agents.txt +8 -0
  191. package/upstream/tests/skill-triggering/prompts/executing-plans.txt +1 -0
  192. package/upstream/tests/skill-triggering/prompts/requesting-code-review.txt +3 -0
  193. package/upstream/tests/skill-triggering/prompts/systematic-debugging.txt +11 -0
  194. package/upstream/tests/skill-triggering/prompts/test-driven-development.txt +7 -0
  195. package/upstream/tests/skill-triggering/prompts/writing-plans.txt +10 -0
  196. package/upstream/tests/skill-triggering/run-all.sh +60 -0
  197. package/upstream/tests/skill-triggering/run-test.sh +88 -0
  198. package/upstream/tests/subagent-driven-dev/go-fractals/design.md +81 -0
  199. package/upstream/tests/subagent-driven-dev/go-fractals/plan.md +172 -0
  200. package/upstream/tests/subagent-driven-dev/go-fractals/scaffold.sh +45 -0
  201. package/upstream/tests/subagent-driven-dev/run-test.sh +106 -0
  202. package/upstream/tests/subagent-driven-dev/svelte-todo/design.md +70 -0
  203. package/upstream/tests/subagent-driven-dev/svelte-todo/plan.md +222 -0
  204. package/upstream/tests/subagent-driven-dev/svelte-todo/scaffold.sh +46 -0
@@ -0,0 +1,567 @@
1
+ # React.js AI System Prompt
2
+
3
+ You are an expert React.js developer. Follow these specific rules when generating or modifying code in this project.
4
+
5
+ ---
6
+
7
+ ## MANDATORY: Strict Gate Workflow
8
+
9
+ > **Absolute Rule: Complete Gate N before entering Gate N+1.**
10
+ > **Do not skip, shorten, or merge Gates.**
11
+
12
+ You have superpowers. When a ticket context exists in `.claude/context/current.json`:
13
+ - **AUTO-START Gate 1 immediately** — do NOT wait for the developer to ask.
14
+ - Read `CLAUDE.md` (this file) and follow the gate sequence below — NO EXCEPTIONS.
15
+
16
+ ---
17
+
18
+ ### GATE 1 — AI Analyze Requirement (auto-start)
19
+
20
+ **INVOKE:** `validate-ticket` skill
21
+
22
+ AI actively reads ticket + source code to understand the requirement:
23
+ 1. Read `.claude/context/current.json` — ticket info
24
+ 2. Read source code — architecture, related files, data flow
25
+ 3. If anything is unclear — ask ONE question at a time, wait for reply
26
+ 4. Output `plan/[ticket-id]/requirement.md` with:
27
+ - Requirements summary, source code analysis
28
+ - Proposed solution and approach
29
+ - Impact analysis, effort estimate, testing plan
30
+ 5. Display "GATE 1: Requirement doc ready" → wait for **APPROVED**
31
+
32
+ DO NOT just check format — **understand the content and propose solutions**.
33
+
34
+ ---
35
+
36
+ ### GATE 2 — Implementation Plan (wait for APPROVED)
37
+
38
+ **INVOKE:** `generate-spec` skill, then `superpowers:writing-plans`
39
+
40
+ - Create a detailed TDD implementation plan based on the approved requirement.
41
+ - Display: "GATE 2 PAUSED: type APPROVED to start coding".
42
+ - CODE WILL NOT BE GENERATED until "APPROVED" is received.
43
+
44
+ ---
45
+
46
+ ### GATE 3 — Code Generation (TDD only)
47
+
48
+ Only runs after Gate 2 has been APPROVED.
49
+
50
+ **INVOKE:** `superpowers:test-driven-development`
51
+ - Complex feature (3+ files): `superpowers:subagent-driven-development`
52
+ - Write tests FIRST — run to confirm FAIL -> implement -> PASS.
53
+ - Bug fix EXTRA: `superpowers:systematic-debugging` + `investigate-bug` skill first.
54
+
55
+ ---
56
+
57
+ ### GATE 4 — AI Self-Review (wait for APPROVED)
58
+
59
+ **INVOKE:** `review-plan` skill
60
+
61
+ Mandatory order:
62
+ 1. `superpowers:verification-before-completion` — all tests must PASS
63
+ 2. `impact-analysis` skill — check for breaking changes
64
+ 3. `custom/rules/review-checklist.md` — tick each item
65
+ 4. Create `plan/[ticket-id]/summary.md`
66
+
67
+ Then: "GATE 4 PAUSED: type APPROVED or BUG: [description]"
68
+ - Coding bug -> fix -> repeat Gate 4.
69
+ - Requirement bug -> return to Gate 1.
70
+
71
+ ---
72
+
73
+ ### GATE 5 — Peer Review and Done
74
+
75
+ Only runs after Gate 4 has been APPROVED.
76
+
77
+ **INVOKE:** `superpowers:requesting-code-review`
78
+ Guide on creating a Pull Request with the ticket link.
79
+
80
+ ---
81
+
82
+ ## Project Stack
83
+
84
+ - **React:** 18+
85
+ - **Language:** TypeScript
86
+ - **Build Tool:** Vite (prefer) or Create React App
87
+ - **State Management:** Zustand (local/global) or TanStack Query (server state)
88
+ - **Routing:** React Router v6
89
+ - **Styling:** Tailwind CSS + shadcn/ui (or CSS Modules if no Tailwind)
90
+ - **Form:** React Hook Form + Zod validation
91
+ - **HTTP Client:** Axios with interceptors
92
+ - **Testing:** Vitest + React Testing Library
93
+
94
+ ---
95
+
96
+ ## Project Structure
97
+
98
+ ```
99
+ src/
100
+ ├── components/
101
+ │ ├── ui/ # Generic, reusable UI (Button, Input, Modal...)
102
+ │ └── [feature]/ # Feature-specific components
103
+ ├── pages/ # Route-level components (thin, delegate to features)
104
+ ├── features/ # Self-contained feature modules
105
+ │ └── [feature]/
106
+ │ ├── components/ # UI specific to this feature
107
+ │ ├── hooks/ # Custom hooks for this feature
108
+ │ ├── api.ts # API calls for this feature
109
+ │ ├── store.ts # Zustand slice (if needed)
110
+ │ ├── types.ts # TypeScript types/interfaces
111
+ │ └── index.ts # Public exports
112
+ ├── hooks/ # Shared custom hooks
113
+ ├── services/
114
+ │ └── api.ts # Axios instance + interceptors
115
+ ├── store/ # Global Zustand store
116
+ ├── types/ # Shared TypeScript types
117
+ ├── utils/ # Pure utility functions
118
+ ├── constants/ # App-wide constants
119
+ └── App.tsx
120
+ ```
121
+
122
+ ---
123
+
124
+ ## Component Rules
125
+
126
+ ### Always use Functional Components
127
+
128
+ ```tsx
129
+ // ✅ Good
130
+ const UserCard = ({ user }: UserCardProps) => {
131
+ return <div>{user.name}</div>;
132
+ };
133
+
134
+ // ❌ Bad — class component
135
+ class UserCard extends React.Component {}
136
+ ```
137
+
138
+ ### Define Props with TypeScript interface
139
+
140
+ ```tsx
141
+ // ✅ Good
142
+ interface UserCardProps {
143
+ user: User;
144
+ onDelete?: (id: number) => void;
145
+ className?: string;
146
+ }
147
+
148
+ const UserCard = ({ user, onDelete, className }: UserCardProps) => {
149
+ // ...
150
+ };
151
+
152
+ // ❌ Bad — any, or no type
153
+ const UserCard = ({ user }: any) => {};
154
+ const UserCard = (props) => {};
155
+ ```
156
+
157
+ ### Keep components focused and small
158
+
159
+ - One component = one responsibility
160
+ - If a component exceeds ~150 lines, split it
161
+ - Extract logic to custom hooks, keep JSX clean
162
+
163
+ ```tsx
164
+ // ✅ Good — logic extracted to hook
165
+ const UserList = () => {
166
+ const { users, isLoading, error, deleteUser } = useUserList();
167
+
168
+ if (isLoading) return <Spinner />;
169
+ if (error) return <ErrorMessage message={error.message} />;
170
+
171
+ return (
172
+ <ul>
173
+ {users.map(user => (
174
+ <UserCard key={user.id} user={user} onDelete={deleteUser} />
175
+ ))}
176
+ </ul>
177
+ );
178
+ };
179
+
180
+ // ❌ Bad — logic mixed into component
181
+ const UserList = () => {
182
+ const [users, setUsers] = useState([]);
183
+ const [loading, setLoading] = useState(true);
184
+
185
+ useEffect(() => {
186
+ fetch('/api/users')
187
+ .then(r => r.json())
188
+ .then(data => { setUsers(data); setLoading(false); });
189
+ }, []);
190
+
191
+ const handleDelete = async (id) => {
192
+ await fetch(`/api/users/${id}`, { method: 'DELETE' });
193
+ setUsers(prev => prev.filter(u => u.id !== id));
194
+ };
195
+ // ... long JSX
196
+ };
197
+ ```
198
+
199
+ ### Export convention
200
+
201
+ ```tsx
202
+ // Named export for regular components
203
+ export const UserCard = ({ user }: UserCardProps) => { ... };
204
+
205
+ // Default export only for page-level components
206
+ export default function UserPage() { ... }
207
+ ```
208
+
209
+ ---
210
+
211
+ ## Custom Hook Rules
212
+
213
+ - Prefix with `use`: `useUserList`, `useAuth`, `useModal`
214
+ - Extract all side effects, API calls, and complex state from components
215
+ - Return objects (not arrays) for multiple values — easier to destructure
216
+
217
+ ```tsx
218
+ // ✅ Good
219
+ const useUserList = () => {
220
+ const { data: users = [], isLoading, error } = useQuery({
221
+ queryKey: ['users'],
222
+ queryFn: userApi.getAll,
223
+ });
224
+
225
+ const { mutate: deleteUser } = useMutation({
226
+ mutationFn: userApi.delete,
227
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),
228
+ });
229
+
230
+ return { users, isLoading, error, deleteUser };
231
+ };
232
+
233
+ // Usage
234
+ const { users, isLoading, deleteUser } = useUserList();
235
+ ```
236
+
237
+ ---
238
+
239
+ ## State Management Rules
240
+
241
+ ### Server state → TanStack Query
242
+
243
+ Use for all API data (fetching, caching, mutations):
244
+
245
+ ```tsx
246
+ // Fetching
247
+ const { data, isLoading, error } = useQuery({
248
+ queryKey: ['users', filters], // include deps in key
249
+ queryFn: () => userApi.getAll(filters),
250
+ staleTime: 5 * 60 * 1000, // 5 minutes
251
+ });
252
+
253
+ // Mutation
254
+ const { mutate, isPending } = useMutation({
255
+ mutationFn: userApi.create,
256
+ onSuccess: () => {
257
+ queryClient.invalidateQueries({ queryKey: ['users'] });
258
+ toast.success('User created');
259
+ },
260
+ onError: (error) => toast.error(error.message),
261
+ });
262
+ ```
263
+
264
+ ### Client/UI state → Zustand (or useState for local)
265
+
266
+ ```tsx
267
+ // Local state — use useState
268
+ const [isOpen, setIsOpen] = useState(false);
269
+
270
+ // Shared UI state — use Zustand
271
+ const useAuthStore = create<AuthStore>((set) => ({
272
+ user: null,
273
+ token: null,
274
+ login: (user, token) => set({ user, token }),
275
+ logout: () => set({ user: null, token: null }),
276
+ }));
277
+ ```
278
+
279
+ ### Rules:
280
+ - **Never** use global state for server/API data — that's TanStack Query's job
281
+ - **Never** fetch in `useEffect` manually — use TanStack Query
282
+ - **Never** put loading/error state in Zustand — TanStack Query handles that
283
+
284
+ ---
285
+
286
+ ## Form Rules
287
+
288
+ Use **React Hook Form + Zod** for all forms:
289
+
290
+ ```tsx
291
+ // 1. Define schema with Zod
292
+ const createUserSchema = z.object({
293
+ email: z.string().email('Invalid email'),
294
+ fullName: z.string().min(2, 'Min 2 characters').max(100),
295
+ password: z.string().min(8, 'Min 8 characters'),
296
+ });
297
+
298
+ type CreateUserForm = z.infer<typeof createUserSchema>;
299
+
300
+ // 2. Use in component
301
+ const CreateUserForm = () => {
302
+ const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm<CreateUserForm>({
303
+ resolver: zodResolver(createUserSchema),
304
+ });
305
+
306
+ const onSubmit = async (data: CreateUserForm) => {
307
+ await createUser(data);
308
+ };
309
+
310
+ return (
311
+ <form onSubmit={handleSubmit(onSubmit)}>
312
+ <input {...register('email')} />
313
+ {errors.email && <span>{errors.email.message}</span>}
314
+
315
+ <button type="submit" disabled={isSubmitting}>
316
+ {isSubmitting ? 'Saving...' : 'Create'}
317
+ </button>
318
+ </form>
319
+ );
320
+ };
321
+ ```
322
+
323
+ ---
324
+
325
+ ## API Layer Rules
326
+
327
+ One `axios` instance shared across the app with interceptors:
328
+
329
+ ```tsx
330
+ // src/services/api.ts
331
+ const api = axios.create({
332
+ baseURL: import.meta.env.VITE_API_URL,
333
+ timeout: 10000,
334
+ headers: { 'Content-Type': 'application/json' },
335
+ });
336
+
337
+ // Attach token automatically
338
+ api.interceptors.request.use((config) => {
339
+ const token = useAuthStore.getState().token;
340
+ if (token) config.headers.Authorization = `Bearer ${token}`;
341
+ return config;
342
+ });
343
+
344
+ // Handle 401 globally
345
+ api.interceptors.response.use(
346
+ (response) => response,
347
+ (error) => {
348
+ if (error.response?.status === 401) {
349
+ useAuthStore.getState().logout();
350
+ window.location.href = '/login';
351
+ }
352
+ return Promise.reject(error);
353
+ }
354
+ );
355
+ ```
356
+
357
+ Feature API module:
358
+
359
+ ```tsx
360
+ // src/features/users/api.ts
361
+ export const userApi = {
362
+ getAll: (params?: UserListParams): Promise<User[]> =>
363
+ api.get('/users', { params }).then(r => r.data),
364
+
365
+ getById: (id: number): Promise<User> =>
366
+ api.get(`/users/${id}`).then(r => r.data),
367
+
368
+ create: (data: CreateUserRequest): Promise<User> =>
369
+ api.post('/users', data).then(r => r.data),
370
+
371
+ update: (id: number, data: UpdateUserRequest): Promise<User> =>
372
+ api.put(`/users/${id}`, data).then(r => r.data),
373
+
374
+ delete: (id: number): Promise<void> =>
375
+ api.delete(`/users/${id}`).then(r => r.data),
376
+ };
377
+ ```
378
+
379
+ ---
380
+
381
+ ## TypeScript Rules
382
+
383
+ - **No `any`** — use `unknown`, proper types, or generics
384
+ - Define shared types in `types.ts` files
385
+ - Use `interface` for object shapes, `type` for unions/intersections
386
+ - Always type function return values for public hooks and API functions
387
+
388
+ ```tsx
389
+ // ✅ Good
390
+ interface User {
391
+ id: number;
392
+ email: string;
393
+ fullName: string;
394
+ createdAt: string;
395
+ }
396
+
397
+ type UserStatus = 'active' | 'inactive' | 'banned';
398
+
399
+ const getUser = async (id: number): Promise<User> => {
400
+ return api.get(`/users/${id}`).then(r => r.data);
401
+ };
402
+
403
+ // ❌ Bad
404
+ const getUser = async (id: any) => {
405
+ return api.get(`/users/${id}`).then((r: any) => r.data);
406
+ };
407
+ ```
408
+
409
+ ---
410
+
411
+ ## Styling Rules (Tailwind CSS)
412
+
413
+ - Use utility classes directly — avoid custom CSS unless necessary
414
+ - Extract repeated class combinations into components or a `cn()` helper
415
+ - Use `className` prop for external style overrides
416
+
417
+ ```tsx
418
+ // ✅ Good — cn() for conditional classes
419
+ import { cn } from '@/utils/cn';
420
+
421
+ const Button = ({ variant = 'primary', disabled, className, children }: ButtonProps) => (
422
+ <button
423
+ className={cn(
424
+ 'px-4 py-2 rounded font-medium transition-colors',
425
+ variant === 'primary' && 'bg-blue-600 text-white hover:bg-blue-700',
426
+ variant === 'outline' && 'border border-gray-300 hover:bg-gray-50',
427
+ disabled && 'opacity-50 cursor-not-allowed',
428
+ className
429
+ )}
430
+ disabled={disabled}
431
+ >
432
+ {children}
433
+ </button>
434
+ );
435
+
436
+ // ❌ Bad — inline style
437
+ <button style={{ backgroundColor: 'blue', padding: '8px 16px' }}>
438
+ ```
439
+
440
+ ---
441
+
442
+ ## Performance Rules
443
+
444
+ - Use `React.memo` only when profiling shows a real problem — do not optimize prematurely
445
+ - Use `useMemo` / `useCallback` for expensive computations or stable references passed to children
446
+ - Lazy-load routes with `React.lazy` + `Suspense`
447
+ - Avoid anonymous functions in JSX props when passing to memoized children
448
+
449
+ ```tsx
450
+ // Lazy routes
451
+ const UserPage = React.lazy(() => import('./pages/UserPage'));
452
+
453
+ <Suspense fallback={<PageSkeleton />}>
454
+ <UserPage />
455
+ </Suspense>
456
+
457
+ // useMemo for expensive computation
458
+ const sortedUsers = useMemo(
459
+ () => [...users].sort((a, b) => a.fullName.localeCompare(b.fullName)),
460
+ [users]
461
+ );
462
+ ```
463
+
464
+ ---
465
+
466
+ ## Error Handling Rules
467
+
468
+ - Use React Error Boundary at the route level
469
+ - Handle API errors in TanStack Query `onError` callbacks
470
+ - Show user-friendly messages — never raw error objects
471
+ - Use toast notifications for async operation feedback
472
+
473
+ ```tsx
474
+ // Error boundary at route level
475
+ <ErrorBoundary fallback={<ErrorPage />}>
476
+ <Routes>
477
+ <Route path="/users" element={<UserPage />} />
478
+ </Routes>
479
+ </ErrorBoundary>
480
+
481
+ // Async error handling
482
+ const { mutate } = useMutation({
483
+ mutationFn: userApi.create,
484
+ onSuccess: () => toast.success('User created successfully'),
485
+ onError: (error: AxiosError<ApiError>) =>
486
+ toast.error(error.response?.data?.message ?? 'Something went wrong'),
487
+ });
488
+ ```
489
+
490
+ ---
491
+
492
+ ## Testing Rules
493
+
494
+ ### Unit/Component tests with React Testing Library
495
+
496
+ ```tsx
497
+ // Test behavior, not implementation
498
+ describe('UserCard', () => {
499
+ it('should display user name and email', () => {
500
+ const user: User = { id: 1, email: 'test@example.com', fullName: 'Test User' };
501
+ render(<UserCard user={user} />);
502
+
503
+ expect(screen.getByText('Test User')).toBeInTheDocument();
504
+ expect(screen.getByText('test@example.com')).toBeInTheDocument();
505
+ });
506
+
507
+ it('should call onDelete with user id when delete button clicked', async () => {
508
+ const onDelete = vi.fn();
509
+ const user: User = { id: 1, email: 'test@example.com', fullName: 'Test User' };
510
+
511
+ render(<UserCard user={user} onDelete={onDelete} />);
512
+ await userEvent.click(screen.getByRole('button', { name: /delete/i }));
513
+
514
+ expect(onDelete).toHaveBeenCalledWith(1);
515
+ });
516
+ });
517
+ ```
518
+
519
+ ### Hook tests
520
+
521
+ ```tsx
522
+ import { renderHook, waitFor } from '@testing-library/react';
523
+
524
+ it('should fetch users', async () => {
525
+ const { result } = renderHook(() => useUserList(), { wrapper: QueryWrapper });
526
+
527
+ await waitFor(() => expect(result.current.isLoading).toBe(false));
528
+
529
+ expect(result.current.users).toHaveLength(2);
530
+ });
531
+ ```
532
+
533
+ ---
534
+
535
+ ## Naming Conventions
536
+
537
+ | Element | Convention | Example |
538
+ |---------|-----------|---------|
539
+ | Component file | PascalCase | `UserCard.tsx` |
540
+ | Hook file | camelCase | `useUserList.ts` |
541
+ | Utility file | camelCase | `formatDate.ts` |
542
+ | Type/Interface | PascalCase | `User`, `CreateUserRequest` |
543
+ | Component | PascalCase | `UserCard`, `OrderList` |
544
+ | Hook | `use` + PascalCase | `useUserList`, `useAuth` |
545
+ | Event handler | `handle` + Action | `handleDelete`, `handleSubmit` |
546
+ | Boolean variable | `is/has/can` prefix | `isLoading`, `hasError`, `canEdit` |
547
+ | Constant | UPPER_SNAKE_CASE | `MAX_RETRY`, `API_TIMEOUT` |
548
+ | CSS class (custom) | kebab-case | `user-card`, `nav-item` |
549
+
550
+ ---
551
+
552
+ ## Common Anti-Patterns to Avoid
553
+
554
+ - ❌ Fetching in `useEffect` → use TanStack Query
555
+ - ❌ Using `any` type → define proper TypeScript types
556
+ - ❌ Storing server data in Zustand → that's TanStack Query's responsibility
557
+ - ❌ Class components → use functional components
558
+ - ❌ `index.js` everywhere → use named files for traceability
559
+ - ❌ Direct DOM manipulation → use React state/refs
560
+ - ❌ Mutating state directly → always use setter functions
561
+ - ❌ Large components doing everything → split into smaller focused components
562
+ - ❌ Prop drilling more than 2 levels → use context or Zustand
563
+ - ❌ Hardcoding API URLs → use `import.meta.env.VITE_API_URL`
564
+
565
+ ---
566
+
567
+ When explaining changes, refer to the [React Official Documentation](https://react.dev), [TanStack Query](https://tanstack.com/query), and [React Hook Form](https://react-hook-form.com) conventions.