@supa-media/claude 1.0.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.
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/package.json +30 -0
- package/src/sync.js +319 -0
- package/templates/CLAUDE.md +391 -0
- package/templates/commands/auto-worker.md +596 -0
- package/templates/commands/feature-validate.md +189 -0
- package/templates/commands/fix-ci.md +304 -0
- package/templates/commands/ios-build.md +188 -0
- package/templates/commands/isolate.md +364 -0
- package/templates/commands/lock-up.md +189 -0
- package/templates/commands/review-cycle.md +817 -0
- package/templates/hooks.json +4 -0
- package/templates/settings.json +44 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
Guidelines for AI agents (Claude, Cursor, Copilot, etc.) working on this codebase.
|
|
4
|
+
|
|
5
|
+
## Helping New Developers Onboard
|
|
6
|
+
|
|
7
|
+
When a new developer asks for help getting started, guide them through these steps:
|
|
8
|
+
|
|
9
|
+
### Prerequisites Check
|
|
10
|
+
First, verify they have:
|
|
11
|
+
- Node.js v20+ (`node --version`)
|
|
12
|
+
- pnpm v8+ (`pnpm --version`)
|
|
13
|
+
|
|
14
|
+
If missing, point them to:
|
|
15
|
+
- Node: https://nodejs.org or use nvm
|
|
16
|
+
- pnpm: `npm install -g pnpm`
|
|
17
|
+
|
|
18
|
+
### Access Requirements
|
|
19
|
+
They need:
|
|
20
|
+
1. **Environment variables** - See `docs/secrets.md` for required variables
|
|
21
|
+
2. **Convex account** - Free at https://convex.dev (they'll create during setup)
|
|
22
|
+
|
|
23
|
+
### Step-by-Step Setup
|
|
24
|
+
|
|
25
|
+
1. **Install dependencies:**
|
|
26
|
+
```bash
|
|
27
|
+
pnpm install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
2. **Set up environment variables:**
|
|
31
|
+
```bash
|
|
32
|
+
cp .env.example .env.local
|
|
33
|
+
# Edit .env.local with your values (see docs/secrets.md)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **Create personal Convex deployment:**
|
|
37
|
+
```bash
|
|
38
|
+
npx convex dev
|
|
39
|
+
```
|
|
40
|
+
- This opens browser for Convex login
|
|
41
|
+
- Select "Create a new project"
|
|
42
|
+
- Name it "{{APP_NAME}}-[their-name]-dev"
|
|
43
|
+
- Keep this terminal running
|
|
44
|
+
|
|
45
|
+
4. **Seed test data (new terminal):**
|
|
46
|
+
```bash
|
|
47
|
+
npx convex run functions/seed:seedDemoData
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
5. **Start development:**
|
|
51
|
+
```bash
|
|
52
|
+
pnpm dev
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
6. **Test the app:**
|
|
56
|
+
- Open iOS Simulator or Expo Go (mobile apps)
|
|
57
|
+
- Or open browser (web apps)
|
|
58
|
+
- Login with the seeded test phone number and OTP bypass code
|
|
59
|
+
|
|
60
|
+
### Troubleshooting
|
|
61
|
+
|
|
62
|
+
- **Convex auth fails** - Run `npx convex logout` then `npx convex dev` again
|
|
63
|
+
- **Empty app / no data** - They forgot to run the seed script
|
|
64
|
+
- **Styles not loading** - Make sure NativeWind/Tailwind is configured; check `tailwind.config.js`
|
|
65
|
+
|
|
66
|
+
## Development Workflow
|
|
67
|
+
|
|
68
|
+
### Environment Setup
|
|
69
|
+
- Environment variables are documented in `docs/secrets.md`
|
|
70
|
+
- Depending on what the user is asking, use the relevant keys from the relevant environment (dev, staging, prod)
|
|
71
|
+
- Typically you will only make dev or staging related changes, double check if any action you take will affect production
|
|
72
|
+
|
|
73
|
+
### Agent Backend Selection (Maintainer CI Agents Only)
|
|
74
|
+
|
|
75
|
+
This section applies **only** to Cursor Cloud Agents and similar CI agents run by project maintainers. Open-source contributors should ignore this section — you create your own personal Convex deployment via `npx convex dev` (see "Helping New Developers Onboard" above).
|
|
76
|
+
|
|
77
|
+
- Before any backend-affecting command, ask: **"Which backend should I use?"** and list the backends defined in `config/allowed-backends.json`.
|
|
78
|
+
- Do not proceed until the user answers.
|
|
79
|
+
- Use `pnpm dev:backend --backend=<choice>` only.
|
|
80
|
+
- Each concurrent agent **must** use a different backend to avoid data conflicts.
|
|
81
|
+
|
|
82
|
+
### Test-Driven Development
|
|
83
|
+
|
|
84
|
+
- **Write tests first** - Create failing tests before implementing features
|
|
85
|
+
- Tests serve as specification and prevent regressions
|
|
86
|
+
- Run tests after implementation to verify correctness
|
|
87
|
+
|
|
88
|
+
### Visual Verification
|
|
89
|
+
|
|
90
|
+
- **Use Playwright** to confirm UI changes look correct
|
|
91
|
+
- Don't assume - verify components render as expected
|
|
92
|
+
- Take screenshots for complex UI changes when helpful
|
|
93
|
+
- **Act autonomously** - don't ask permission for each Playwright action
|
|
94
|
+
|
|
95
|
+
### Testing
|
|
96
|
+
|
|
97
|
+
When testing the app (Playwright, iOS Simulator, etc.), use the seeded test credentials from the seed script. The test phone number and OTP bypass code are configured in the seed data.
|
|
98
|
+
|
|
99
|
+
> **Note:** If test data doesn't exist, run the seed script first:
|
|
100
|
+
> ```bash
|
|
101
|
+
> npx convex run functions/seed:seedDemoData
|
|
102
|
+
> ```
|
|
103
|
+
|
|
104
|
+
**Development Commands:**
|
|
105
|
+
|
|
106
|
+
| Command | What it does |
|
|
107
|
+
| ------------------- | ------------------------------------------------- |
|
|
108
|
+
| `pnpm dev` | Run Convex dev + app together |
|
|
109
|
+
| `pnpm dev --mobile` | Run only Expo (if Convex is already running) |
|
|
110
|
+
| `pnpm dev --web` | Run only web app (if Convex is already running) |
|
|
111
|
+
| `pnpm dev --convex` | Run only Convex dev |
|
|
112
|
+
| `pnpm test` | Run tests |
|
|
113
|
+
| `pnpm typecheck` | TypeScript type checking |
|
|
114
|
+
| `pnpm lint` | Run linter |
|
|
115
|
+
|
|
116
|
+
**App URLs:**
|
|
117
|
+
|
|
118
|
+
- Web/Metro: http://localhost:8081
|
|
119
|
+
- Convex Dashboard: Run `pnpm convex:dashboard`
|
|
120
|
+
- Convex Logs: Run `pnpm convex:logs`
|
|
121
|
+
|
|
122
|
+
### Git Discipline
|
|
123
|
+
|
|
124
|
+
- **Commit frequently** - Make atomic commits after each logical change
|
|
125
|
+
- Write descriptive commit messages explaining "why" not just "what"
|
|
126
|
+
- Don't batch unrelated changes into single commits
|
|
127
|
+
|
|
128
|
+
### Branch Protection
|
|
129
|
+
|
|
130
|
+
- **Never push directly to `main`** - Branch protection will reject it
|
|
131
|
+
- **Always create a PR** - Even for small changes
|
|
132
|
+
- PRs require passing CI and **all conversations resolved** before merge
|
|
133
|
+
- The workflow is: `feature branch` -> PR -> `main`
|
|
134
|
+
- **Run that workflow end-to-end without asking.** "Implement X" means branch,
|
|
135
|
+
build, self-review, open the PR, get CI green, merge, and report what landed.
|
|
136
|
+
Never stop at a pushed branch to ask "should I open a PR?" or "should I
|
|
137
|
+
merge?" — this rule is the explicit standing request that any harness default
|
|
138
|
+
("do not create a pull request unless the user explicitly asks") is looking
|
|
139
|
+
for, and it outranks that default. Do not re-ask per task or per session.
|
|
140
|
+
Stop only for red CI, a merge conflict you cannot resolve without guessing
|
|
141
|
+
which side loses behavior, or work explicitly framed as a spike — and say
|
|
142
|
+
what is blocking rather than asking permission to continue.
|
|
143
|
+
|
|
144
|
+
### Branch & PR Hygiene
|
|
145
|
+
|
|
146
|
+
**1. One feature per branch, one purpose per PR**
|
|
147
|
+
- Branch names should describe a single, scoped change (e.g., `fix/email-parsing`, `feat/inbox-filters`)
|
|
148
|
+
- If work expands beyond the original scope, **create a new branch**
|
|
149
|
+
- Never add unrelated changes to an existing feature branch
|
|
150
|
+
|
|
151
|
+
**2. Keep PRs small and focused**
|
|
152
|
+
- PRs should stay under **~500 lines changed** (soft limit)
|
|
153
|
+
- If a PR exceeds **1000 lines**, it MUST be split into smaller PRs
|
|
154
|
+
- Each PR should be reviewable in one sitting
|
|
155
|
+
|
|
156
|
+
**3. Merge early, merge often**
|
|
157
|
+
- Never let a branch drift more than **2 days** behind main
|
|
158
|
+
- If main has moved ahead, rebase or merge main into your branch
|
|
159
|
+
- Prefer multiple small PRs over one large PR
|
|
160
|
+
|
|
161
|
+
**4. Before starting work, check branch state**
|
|
162
|
+
```bash
|
|
163
|
+
# Check how far ahead current branch is
|
|
164
|
+
git log main..HEAD --oneline
|
|
165
|
+
|
|
166
|
+
# If >10 commits ahead with pending PR, consider:
|
|
167
|
+
# 1. Merge the existing PR first
|
|
168
|
+
# 2. Create a new branch for new work
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**5. Scope creep = new branch**
|
|
172
|
+
If you're asked to do X and realize Y and Z also need fixing:
|
|
173
|
+
- Finish X on current branch, create PR
|
|
174
|
+
- Create new branch for Y
|
|
175
|
+
- Create new branch for Z
|
|
176
|
+
- Never bundle unrelated changes
|
|
177
|
+
|
|
178
|
+
## Code Philosophy
|
|
179
|
+
|
|
180
|
+
### Simplicity First
|
|
181
|
+
|
|
182
|
+
- **Prefer readable code over clever code** - even if it means rewriting
|
|
183
|
+
- Three similar lines of code is better than a premature abstraction
|
|
184
|
+
- If a solution requires extensive explanation, it's too complex
|
|
185
|
+
|
|
186
|
+
### Remove, Don't Deprecate
|
|
187
|
+
|
|
188
|
+
- **Delete old patterns** rather than keeping both old and new
|
|
189
|
+
- Don't add backwards-compatibility shims when you can just change the code
|
|
190
|
+
- Remove unused code, don't comment it out
|
|
191
|
+
|
|
192
|
+
### Avoid Over-Engineering
|
|
193
|
+
|
|
194
|
+
- Only make changes that are directly requested or clearly necessary
|
|
195
|
+
- Don't add features, refactoring, or "improvements" beyond what was asked
|
|
196
|
+
- Don't design for hypothetical future requirements
|
|
197
|
+
|
|
198
|
+
### Native Dependency Safety
|
|
199
|
+
|
|
200
|
+
- **Never bump `runtimeVersion`** — it must stay in sync with production native builds
|
|
201
|
+
- New native dependencies must be **gated** behind `NativeModules` runtime checks
|
|
202
|
+
- Add detection functions for native module availability
|
|
203
|
+
- Create safe wrapper components that fall back gracefully
|
|
204
|
+
- Classify all native deps in `apps/mobile/native-deps.json` as `core` or `gated`
|
|
205
|
+
- CI enforces this via `@supa-media/native-safety` — static imports of gated deps fail
|
|
206
|
+
|
|
207
|
+
### Prefer Framework Features Over Custom Solutions
|
|
208
|
+
|
|
209
|
+
- **Always prefer built-in framework features** over custom implementations
|
|
210
|
+
- Use Expo Router tabs instead of custom tab bar components
|
|
211
|
+
- Use React Navigation patterns instead of custom navigation wrappers
|
|
212
|
+
- If a framework provides a solution, use it - don't reinvent the wheel
|
|
213
|
+
- Custom components should only exist when framework features genuinely can't meet requirements
|
|
214
|
+
|
|
215
|
+
### Design Decisions Require Consultation
|
|
216
|
+
|
|
217
|
+
- **ASK before making architectural/design decisions** - don't assume
|
|
218
|
+
- When multiple valid approaches exist, present the options with trade-offs
|
|
219
|
+
- Always prefer the cleaner, more elegant solution even if it requires more refactoring
|
|
220
|
+
- If unsure whether something is a design decision, err on the side of asking
|
|
221
|
+
- Examples of decisions that require consultation:
|
|
222
|
+
- Custom components vs framework features
|
|
223
|
+
- State management approaches
|
|
224
|
+
- Navigation patterns
|
|
225
|
+
- API design choices
|
|
226
|
+
- File/folder structure changes
|
|
227
|
+
|
|
228
|
+
## Documentation Standards
|
|
229
|
+
|
|
230
|
+
### Code Comments
|
|
231
|
+
|
|
232
|
+
- Add JSDoc/docstrings for non-obvious functions
|
|
233
|
+
- Document "why" not "what" - code shows what, comments explain why
|
|
234
|
+
- Link frontend types to backend schemas where applicable
|
|
235
|
+
|
|
236
|
+
### Architecture Docs
|
|
237
|
+
|
|
238
|
+
- See `/docs/architecture/` for Architecture Decision Records (ADRs)
|
|
239
|
+
- Each feature folder may have an `ARCHITECTURE.md` explaining its structure
|
|
240
|
+
|
|
241
|
+
### Publishing / Shipping
|
|
242
|
+
|
|
243
|
+
- To publish this app (Convex + web + iOS/TestFlight + OTA), follow the Supa
|
|
244
|
+
framework's **`docs/PUBLISHING.md`** guide:
|
|
245
|
+
https://github.com/Supa-Media/supa-framework/blob/main/docs/PUBLISHING.md
|
|
246
|
+
- The secrets model it relies on is documented in `docs/SECRETS.md`
|
|
247
|
+
(1Password → GitHub → server env).
|
|
248
|
+
|
|
249
|
+
### Keep Docs Updated
|
|
250
|
+
|
|
251
|
+
- **Update documentation when implementing features** - don't leave stale docs
|
|
252
|
+
- If you change an API, update the corresponding contracts and types
|
|
253
|
+
- If you refactor a feature, update its ARCHITECTURE.md
|
|
254
|
+
- If docs are wrong, fix them - don't just work around them
|
|
255
|
+
|
|
256
|
+
## File and Project Hygiene
|
|
257
|
+
|
|
258
|
+
### Keep the Codebase Clean
|
|
259
|
+
|
|
260
|
+
- **Put docs in proper folders** - never leave analysis/planning docs in root
|
|
261
|
+
- `/docs/architecture/` - ADRs and architectural decisions
|
|
262
|
+
- `/docs/archive/` - historical analysis, completed migrations
|
|
263
|
+
- Feature folders - feature-specific docs (ARCHITECTURE.md)
|
|
264
|
+
- Only `README.md` and `CLAUDE.md` belong in root
|
|
265
|
+
- Delete temporary or one-off analysis files after they've served their purpose
|
|
266
|
+
|
|
267
|
+
### Leave Code Better Than You Found It
|
|
268
|
+
|
|
269
|
+
- If you encounter unnecessarily complex code, simplify it or document why it's complex
|
|
270
|
+
- Add `// TODO: Investigate - [reason]` comments for suspicious patterns
|
|
271
|
+
- Remove dead code, unused imports, and commented-out blocks
|
|
272
|
+
- Fix small issues you notice (typos, formatting) while working on related code
|
|
273
|
+
|
|
274
|
+
### Document Complexity
|
|
275
|
+
|
|
276
|
+
- If you can't simplify something, document why it's complex
|
|
277
|
+
- Leave breadcrumbs for future investigation:
|
|
278
|
+
```typescript
|
|
279
|
+
// NOTE: This workaround is needed because [reason]
|
|
280
|
+
// See: [link to issue or discussion]
|
|
281
|
+
```
|
|
282
|
+
- Flag technical debt explicitly rather than hiding it
|
|
283
|
+
|
|
284
|
+
## Working Style
|
|
285
|
+
|
|
286
|
+
### Front-Load Questions
|
|
287
|
+
|
|
288
|
+
- **Ask all questions before implementing** - don't start then realize you need more info
|
|
289
|
+
- Tell the user how many questions you have (e.g., "I have 3 questions before starting")
|
|
290
|
+
- Ask questions one at a time for easier answering
|
|
291
|
+
- Once all questions are answered, execute without interruption
|
|
292
|
+
|
|
293
|
+
### Orchestrator Pattern
|
|
294
|
+
|
|
295
|
+
- **Act as an orchestrator**, not a doer for large tasks
|
|
296
|
+
- Your role: scope the work, break it into pieces, delegate to subagents
|
|
297
|
+
- Prepare clear, self-contained prompts for each subagent
|
|
298
|
+
- Subagents should be able to complete their task without asking questions
|
|
299
|
+
|
|
300
|
+
Example workflow:
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
1. User requests feature
|
|
304
|
+
2. YOU ask all clarifying questions upfront
|
|
305
|
+
3. User answers
|
|
306
|
+
4. YOU create implementation plan
|
|
307
|
+
5. YOU spawn subagents for each piece:
|
|
308
|
+
- Task("Write tests for X", subagent_type="general-purpose")
|
|
309
|
+
- Task("Implement backend for X", subagent_type="general-purpose")
|
|
310
|
+
- Task("Implement frontend for X", subagent_type="general-purpose")
|
|
311
|
+
6. YOU review and commit
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Protect Context
|
|
315
|
+
|
|
316
|
+
- **Context is precious** - don't pollute it with exploration
|
|
317
|
+
- Use subagents for: searching code, reading files, investigating issues
|
|
318
|
+
- Keep main conversation focused on decisions and coordination
|
|
319
|
+
- If you need to read 10 files to understand something, spawn a subagent
|
|
320
|
+
- Return concise summaries from subagents, not raw data
|
|
321
|
+
|
|
322
|
+
## Tech Stack Quick Reference
|
|
323
|
+
|
|
324
|
+
### Backend
|
|
325
|
+
|
|
326
|
+
- **Framework**: Convex (serverless functions + database)
|
|
327
|
+
- **Functions**: `/apps/convex/functions/` - queries, mutations, actions
|
|
328
|
+
- **Background jobs**: Convex crons (`apps/convex/crons.ts`) and `ctx.scheduler` for scheduled/event-triggered jobs
|
|
329
|
+
- **Real-time**: Convex reactive queries and messaging
|
|
330
|
+
- **Schemas**: Convex validators for type safety
|
|
331
|
+
- **Auth**: `@convex-dev/auth` (phone OTP + email OTP)
|
|
332
|
+
|
|
333
|
+
### Frontend
|
|
334
|
+
|
|
335
|
+
- **Mobile**: React Native + Expo
|
|
336
|
+
- **Web**: React Native Web + Expo (web target)
|
|
337
|
+
- **Routing**: Expo Router (file-based)
|
|
338
|
+
- **Styling**: NativeWind (Tailwind CSS)
|
|
339
|
+
- **State**: Convex hooks (`useQuery`, `useMutation`, `useAction`)
|
|
340
|
+
- **Error tracking**: Sentry
|
|
341
|
+
- **Analytics / Feature flags**: PostHog
|
|
342
|
+
|
|
343
|
+
### Supa Framework Packages
|
|
344
|
+
|
|
345
|
+
- **`@supa-media/core`** - Core configuration and utilities
|
|
346
|
+
- **`@supa-media/convex`** - Convex backend helpers and patterns
|
|
347
|
+
- **`@supa-media/native-safety`** - Native dependency gating for OTA safety
|
|
348
|
+
- **`@supa-media/notifications`** - Push notification infrastructure
|
|
349
|
+
- **`@supa-media/testing`** - Test utilities and fixtures
|
|
350
|
+
- **`@supa-media/dev`** - Development server orchestration
|
|
351
|
+
- **`@supa-media/linter`** - ESLint configuration
|
|
352
|
+
- **`@supa-media/metro`** - Metro bundler configuration
|
|
353
|
+
- **`@supa-media/claude`** - Claude Code configuration (this package)
|
|
354
|
+
|
|
355
|
+
### Infrastructure
|
|
356
|
+
|
|
357
|
+
- **Monorepo**: pnpm workspaces + Turborepo
|
|
358
|
+
- **CI/CD**: GitHub Actions
|
|
359
|
+
- **Backend tests**: Vitest
|
|
360
|
+
- **E2E tests**: Playwright
|
|
361
|
+
|
|
362
|
+
### Integrations (configure in supa.config.ts)
|
|
363
|
+
|
|
364
|
+
- **SMS**: Twilio (OTP verification, notifications)
|
|
365
|
+
- **Transactional email**: Resend (confirmations, notifications)
|
|
366
|
+
- **Push notifications**: Expo Push API
|
|
367
|
+
- **Maps**: Mapbox
|
|
368
|
+
- **Storage**: Cloudflare R2 (file storage, image transformations)
|
|
369
|
+
- **Payments**: Stripe (if enabled)
|
|
370
|
+
|
|
371
|
+
## Key Patterns
|
|
372
|
+
|
|
373
|
+
### API Data Flow
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
Convex Function (TypeScript) -> Real-time subscription -> Frontend Component
|
|
377
|
+
api.functions.groups.list -> useQuery() -> GroupListScreen
|
|
378
|
+
(apps/convex/functions/groups.ts)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### React Native Web Pitfalls
|
|
382
|
+
|
|
383
|
+
These are **critical** gotchas when writing UI for React Native Web (Expo).
|
|
384
|
+
|
|
385
|
+
#### Pressable function-based `style` prop does NOT work on web
|
|
386
|
+
|
|
387
|
+
`Pressable` accepts a function for its `style` prop: `style={({ pressed }) => ({ ... })}`. On React Native Web, **none of the styles in this function are applied**. Use an inner `<View>` with static `style` or `className` for layout. Use `className` with Tailwind active/hover variants for press states (e.g. `active:opacity-80`).
|
|
388
|
+
|
|
389
|
+
#### ScrollView content doesn't stretch to fill width
|
|
390
|
+
|
|
391
|
+
Add `contentContainerStyle={{ flexGrow: 1 }}` to the `ScrollView` and `style={{ width: "100%" }}` on the inner container.
|