@eltonssouza/development-utility-kit 1.0.0
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/.claude/agents/analyst.md +198 -0
- package/.claude/agents/backend-developer.md +126 -0
- package/.claude/agents/brain-keeper.md +229 -0
- package/.claude/agents/code-reviewer.md +181 -0
- package/.claude/agents/database-engineer.md +94 -0
- package/.claude/agents/devops-engineer.md +141 -0
- package/.claude/agents/frontend-developer.md +97 -0
- package/.claude/agents/gate-keeper.md +118 -0
- package/.claude/agents/migrator.md +291 -0
- package/.claude/agents/mobile-developer.md +80 -0
- package/.claude/agents/n8n-specialist.md +94 -0
- package/.claude/agents/product-owner.md +115 -0
- package/.claude/agents/qa-engineer.md +232 -0
- package/.claude/agents/release-engineer.md +204 -0
- package/.claude/agents/scaffold.md +87 -0
- package/.claude/agents/security-engineer.md +199 -0
- package/.claude/agents/sprint-runner.md +44 -0
- package/.claude/agents/stack-resolver.md +84 -0
- package/.claude/agents/tech-lead.md +182 -0
- package/.claude/agents/update-template.md +54 -0
- package/.claude/agents/ux-designer.md +118 -0
- package/.claude/settings.json +44 -0
- package/.claude/skills/README.md +332 -0
- package/.claude/skills/active-project/SKILL.md +129 -0
- package/.claude/skills/api-integration-test/SKILL.md +64 -0
- package/.claude/skills/auto-test-guard/SKILL.md +237 -0
- package/.claude/skills/auto-test-guard/resources/backend-tests.md +20 -0
- package/.claude/skills/auto-test-guard/resources/e2e-tests.md +24 -0
- package/.claude/skills/auto-test-guard/resources/execution-report.md +49 -0
- package/.claude/skills/auto-test-guard/resources/frontend-tests.md +18 -0
- package/.claude/skills/auto-test-guard/resources/initial-setup.md +108 -0
- package/.claude/skills/auto-test-guard/resources/run-suite.md +48 -0
- package/.claude/skills/auto-test-guard/resources/senior-gate.md +19 -0
- package/.claude/skills/brain-keeper/SKILL.md +60 -0
- package/.claude/skills/brain-keeper/obsidian/app.json +9 -0
- package/.claude/skills/brain-keeper/obsidian/appearance.json +4 -0
- package/.claude/skills/brain-keeper/obsidian/core-plugins.json +20 -0
- package/.claude/skills/brain-keeper/obsidian/daily-notes.json +5 -0
- package/.claude/skills/brain-keeper/obsidian/graph.json +32 -0
- package/.claude/skills/brain-keeper/obsidian/snippets/folder-colors.css +90 -0
- package/.claude/skills/brain-keeper/obsidian/templates.json +5 -0
- package/.claude/skills/brain-keeper/templates/README.md +51 -0
- package/.claude/skills/brain-keeper/templates/adr.md +40 -0
- package/.claude/skills/brain-keeper/templates/bug.md +35 -0
- package/.claude/skills/brain-keeper/templates/daily.md +38 -0
- package/.claude/skills/brain-keeper/templates/feature.md +62 -0
- package/.claude/skills/brain-keeper/templates/meeting.md +34 -0
- package/.claude/skills/brain-keeper/templates/tech-debt.md +21 -0
- package/.claude/skills/caveman/SKILL.md +187 -0
- package/.claude/skills/create-stack-pack/SKILL.md +281 -0
- package/.claude/skills/grill-me/SKILL.md +79 -0
- package/.claude/skills/honcho-memory/SKILL.md +207 -0
- package/.claude/skills/honcho-memory/docs/api-endpoints-verified.md +75 -0
- package/.claude/skills/honcho-memory/hooks/on-prompt-submit.js +221 -0
- package/.claude/skills/honcho-memory/hooks/on-stop.js +193 -0
- package/.claude/skills/honcho-memory/lib/honcho-client.js +363 -0
- package/.claude/skills/honcho-memory/lib/memory-injector.js +93 -0
- package/.claude/skills/honcho-memory/package.json +32 -0
- package/.claude/skills/honcho-memory/scripts/cli.js +370 -0
- package/.claude/skills/honcho-memory/scripts/setup.js +109 -0
- package/.claude/skills/honcho-memory/tests/t001-api-endpoints-verified.test.js +89 -0
- package/.claude/skills/honcho-memory/tests/t002-structure.test.js +97 -0
- package/.claude/skills/honcho-memory/tests/t003-honcho-client.test.js +162 -0
- package/.claude/skills/honcho-memory/tests/t004-soft-delete.test.js +259 -0
- package/.claude/skills/honcho-memory/tests/t005-memory-injector.test.js +175 -0
- package/.claude/skills/honcho-memory/tests/t006-on-prompt-submit.test.js +215 -0
- package/.claude/skills/honcho-memory/tests/t007-on-stop.test.js +165 -0
- package/.claude/skills/honcho-memory/tests/t008-cli.test.js +214 -0
- package/.claude/skills/honcho-memory/tests/t009-setup.test.js +232 -0
- package/.claude/skills/honcho-memory/tests/t010-skill-md.test.js +114 -0
- package/.claude/skills/honcho-memory/tests/t011-settings-hooks.test.js +105 -0
- package/.claude/skills/honcho-memory/tests/t012-docs-update.test.js +106 -0
- package/.claude/skills/honcho-memory/tests/t013-smoke-e2e.test.js +90 -0
- package/.claude/skills/pair-debug/SKILL.md +288 -0
- package/.claude/skills/prd-ready-check/SKILL.md +58 -0
- package/.claude/skills/project-manager/SKILL.md +167 -0
- package/.claude/skills/quality-standards/SKILL.md +201 -0
- package/.claude/skills/quick-feature/SKILL.md +264 -0
- package/.claude/skills/run-sprint/SKILL.md +342 -0
- package/.claude/skills/scaffold/SKILL.md +58 -0
- package/.claude/skills/stack-discovery/SKILL.md +159 -0
- package/.claude/skills/test-coverage-auditor/SKILL.md +59 -0
- package/.claude/skills/to-issues/SKILL.md +163 -0
- package/.claude/skills/to-prd/SKILL.md +130 -0
- package/.claude/skills/update-template/SKILL.md +254 -0
- package/.claude/stacks/CODEOWNERS +30 -0
- package/.claude/stacks/README.md +88 -0
- package/.claude/stacks/_template.md +116 -0
- package/.claude/stacks/java/spring-boot-3.md +376 -0
- package/.claude/stacks/java/spring-boot-4.md +438 -0
- package/.claude/stacks/typescript/angular-18.md +420 -0
- package/.claude/stacks/typescript/angular-19.md +397 -0
- package/.claude/stacks/typescript/angular-21.md +494 -0
- package/CLAUDE.md +453 -0
- package/README.md +391 -0
- package/bin/cli.js +773 -0
- package/bin/lib/backup.js +62 -0
- package/bin/lib/detect-stack.js +476 -0
- package/bin/lib/help.js +233 -0
- package/bin/lib/identity.js +108 -0
- package/bin/lib/local-dir.js +69 -0
- package/bin/lib/manifest.js +236 -0
- package/bin/lib/sync-all.js +394 -0
- package/bin/lib/version-check.js +398 -0
- package/dashboard/db.js +199 -0
- package/dashboard/package.json +22 -0
- package/dashboard/public/app.js +709 -0
- package/dashboard/public/content/docs/agents-reference.en.md +911 -0
- package/dashboard/public/content/docs/architecture-overview.en.md +260 -0
- package/dashboard/public/content/docs/autonomy-matrix.en.md +186 -0
- package/dashboard/public/content/docs/git-flow.en.md +525 -0
- package/dashboard/public/content/docs/honcho-memory.en.md +394 -0
- package/dashboard/public/content/docs/hooks-reference.en.md +420 -0
- package/dashboard/public/content/docs/pipeline.en.md +400 -0
- package/dashboard/public/content/docs/quality-gate.en.md +315 -0
- package/dashboard/public/content/docs/skills-reference.en.md +500 -0
- package/dashboard/public/content/docs/stack-rules.en.md +362 -0
- package/dashboard/public/content/docs/troubleshooting.en.md +637 -0
- package/dashboard/public/content/manifest.json +102 -0
- package/dashboard/public/content/manual/backend.en.md +1138 -0
- package/dashboard/public/content/manual/existing-project.en.md +831 -0
- package/dashboard/public/content/manual/frontend.en.md +1065 -0
- package/dashboard/public/content/manual/fullstack.en.md +1508 -0
- package/dashboard/public/content/manual/mobile.en.md +866 -0
- package/dashboard/public/index.html +108 -0
- package/dashboard/public/style.css +610 -0
- package/dashboard/public/vendor/marked.min.js +69 -0
- package/dashboard/rtk.js +143 -0
- package/dashboard/server-app.js +403 -0
- package/dashboard/server.js +104 -0
- package/dashboard/test/sprint1.test.js +406 -0
- package/dashboard/test/sprint2.test.js +571 -0
- package/dashboard/test/sprint3.test.js +560 -0
- package/package.json +33 -0
- package/scripts/hooks/subagent-telemetry.sh +14 -0
- package/scripts/hooks/telemetry-writer.js +250 -0
- package/scripts/latest-versions.json +56 -0
|
@@ -0,0 +1,866 @@
|
|
|
1
|
+
# Mobile — React Native 0.84+ + Expo SDK 54+
|
|
2
|
+
|
|
3
|
+
Onboarding guide for mobile development with React Native, Expo, and development-utility-kit.
|
|
4
|
+
|
|
5
|
+
## Who this manual is for
|
|
6
|
+
|
|
7
|
+
Mobile developer working on a React Native app (Expo managed or bare) that will use the development-utility-kit harness as an orchestration layer for skills + agents. The guide covers everything from an empty folder to EAS Build in production, including discovery, sprints, tests, and debugging.
|
|
8
|
+
|
|
9
|
+
Prerequisites:
|
|
10
|
+
|
|
11
|
+
- Node.js 22+ and npm 10+ on PATH
|
|
12
|
+
- Expo CLI (`npm install --global expo-cli` optional; prefer `npx`)
|
|
13
|
+
- Android Studio (with SDK 35+) for local Android builds
|
|
14
|
+
- Xcode 16+ + CocoaPods for local iOS builds (macOS only)
|
|
15
|
+
- EAS account (`npx eas-cli login`)
|
|
16
|
+
- Git, Git Bash, or WSL on Windows
|
|
17
|
+
|
|
18
|
+
Cowork or Claude Code open in the project folder. The harness lives at `C:\development\tools\development-utility-kit` (Windows) or `~/development/tools/development-utility-kit` (macOS/Linux).
|
|
19
|
+
|
|
20
|
+
## Real CLI (duk)
|
|
21
|
+
|
|
22
|
+
The `duk` binary covers 3 verbs:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
duk install # install/update harness in current folder
|
|
26
|
+
duk install --sub mobile # install in ./mobile subfolder
|
|
27
|
+
duk install --dry-run # show what it would do, no writes
|
|
28
|
+
duk dashboard # open local dashboard
|
|
29
|
+
duk update # alias for `duk install`
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Important**: there is NO `duk <skill>`. Skills trigger by keyword match in chat with Claude. Do not type `duk bootstrap-mobile`, `duk run-sprint`, `duk grill-me`. Everything is conversation.
|
|
33
|
+
|
|
34
|
+
## 5-min onboarding
|
|
35
|
+
|
|
36
|
+
Mobile has no `bootstrap-mobile` skill. Scaffolding is the responsibility of the `mobile-developer` agent via `project-manager` (catch-all skill). Step by step:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 1. Create Expo project (manual, outside the harness)
|
|
40
|
+
npx create-expo-app@latest MyApp --template blank-typescript
|
|
41
|
+
cd MyApp
|
|
42
|
+
|
|
43
|
+
# 2. Install harness in the app folder
|
|
44
|
+
duk install
|
|
45
|
+
# Expected output:
|
|
46
|
+
# ✓ .claude/ provisioned (skills + agents + hooks)
|
|
47
|
+
# ✓ CLAUDE.md created (fill in Project Identity)
|
|
48
|
+
# ✓ docs/brain/ provisioned (Obsidian vault)
|
|
49
|
+
# ✓ scripts/hooks/ installed
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Edit `CLAUDE.md` under the `Project Identity` section:
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
## Project Identity
|
|
56
|
+
|
|
57
|
+
- **Project name**: `my-mobile-app`
|
|
58
|
+
- **Project type**: `mobile`
|
|
59
|
+
- **Primary stack**: `React Native 0.84+ / Expo SDK 54+`
|
|
60
|
+
- **Database**: `MMKV (local) + remote REST API`
|
|
61
|
+
- **Domain**: `e-commerce`
|
|
62
|
+
- **Team size**: `2 mobile`
|
|
63
|
+
- **Additional rules**:
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Optional dashboard to inspect harness state:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
duk dashboard
|
|
70
|
+
# Opens http://localhost:4300
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Open the folder in Cowork or Claude Code. First chat configures the app:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
you:
|
|
77
|
+
configure mobile project with Expo Router, TypeScript strict, New Architecture
|
|
78
|
+
|
|
79
|
+
Claude (project-manager -> mobile-developer):
|
|
80
|
+
> Applied:
|
|
81
|
+
> - app.json: newArchEnabled: true, scheme "myapp"
|
|
82
|
+
> - tsconfig.json: strict: true, noUncheckedIndexedAccess: true
|
|
83
|
+
> - expo-router installed, app/_layout.tsx + app/(tabs)/_layout.tsx
|
|
84
|
+
> - app/(tabs)/index.tsx Home
|
|
85
|
+
> - app/(tabs)/profile.tsx Profile
|
|
86
|
+
> - .eslintrc with @typescript-eslint strict
|
|
87
|
+
> - jest.config.ts + jest-expo preset
|
|
88
|
+
> Run `npx expo start` to validate.
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Mandatory stack
|
|
92
|
+
|
|
93
|
+
| Technology | Version | Notes |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| React Native | 0.84+ | New Architecture mandatory (Fabric + TurboModules) |
|
|
96
|
+
| React | 19+ | Server Components awareness, but RN stays client-only |
|
|
97
|
+
| TypeScript | strict | `tsconfig.json` with `strict: true`, `noUncheckedIndexedAccess: true` |
|
|
98
|
+
| Expo | SDK 54+ | Prefer managed; bare workflow only with justification |
|
|
99
|
+
| Navigation | React Navigation 7+ or Expo Router | Expo Router default in new apps |
|
|
100
|
+
| State | Zustand / TanStack Query / Jotai | Zustand for local state; TanStack for server state |
|
|
101
|
+
| Styling | NativeWind 4+ or StyleSheet | NativeWind if the team comes from Tailwind |
|
|
102
|
+
| Animation | Reanimated 4 + Gesture Handler | Always animate on the UI thread |
|
|
103
|
+
| Lists | FlashList 2+ | FlatList only for lists < 20 items |
|
|
104
|
+
| Storage | MMKV (sync) or AsyncStorage | MMKV default; AsyncStorage only on legacy |
|
|
105
|
+
| Secure storage | expo-secure-store | Token, refresh token, biometric secret |
|
|
106
|
+
| Forms | react-hook-form + zod | Validation with zod, single schema client+API |
|
|
107
|
+
| Unit testing | Jest + React Native Testing Library | jest-expo preset |
|
|
108
|
+
| E2E testing | Detox or Maestro | Detox for native iOS+Android; Maestro for simple flows |
|
|
109
|
+
| Build | EAS Build | Cloud build default |
|
|
110
|
+
| Submit | EAS Submit | Automated store submission |
|
|
111
|
+
| OTA | expo-updates + EAS Update | Hotfix without store review |
|
|
112
|
+
|
|
113
|
+
## CLAUDE.md Project Identity (mobile)
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
## Project Identity
|
|
117
|
+
|
|
118
|
+
- **Project name**: `my-mobile-app`
|
|
119
|
+
- **Project type**: `mobile`
|
|
120
|
+
- **Primary stack**: `React Native 0.84+ / Expo SDK 54+`
|
|
121
|
+
- **State**: `Zustand + TanStack Query`
|
|
122
|
+
- **Navigation**: `Expo Router`
|
|
123
|
+
- **Storage**: `MMKV + expo-secure-store`
|
|
124
|
+
- **Domain**: `e-commerce`
|
|
125
|
+
- **Team size**: `2 mobile`
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Skills applicable to mobile
|
|
129
|
+
|
|
130
|
+
Mobile uses the harness's general skill catalog. There is no mobile-specific skill. `project-manager` does the catch-all routing to `mobile-developer`.
|
|
131
|
+
|
|
132
|
+
| Skill | EN trigger | Output |
|
|
133
|
+
|---|---|---|
|
|
134
|
+
| `project-manager` | "create mobile app", "react native", "convert Angular to mobile" | Delegates to `mobile-developer` via Task |
|
|
135
|
+
| `grill-me` | "grill me about X", "interview me about X" | `DISCOVERY_*.md` |
|
|
136
|
+
| `to-prd` | "generate PRD" | `PRD_*.md` |
|
|
137
|
+
| `to-issues` | "split into issues" | `ISSUES_*.md` |
|
|
138
|
+
| `run-sprint` | "run sprint N", "execute the sprint" | Sprint implemented with green tests |
|
|
139
|
+
| `auto-test-guard` | "run tests", "generate tests" | Suite + senior+ gate |
|
|
140
|
+
| `pair-debug` | "let's debug X", "investigate this bug" | Hypothesis -> probe -> confirm loop |
|
|
141
|
+
| `prd-ready-check` | "PRD ready?", "DoD" | GO / NO-GO |
|
|
142
|
+
| `brain-keeper` | "record in brain", end of PLAN | Notes in `docs/brain/` |
|
|
143
|
+
| `active-project` | "/active-project <path>" | Fast-lane adoption |
|
|
144
|
+
| `update-template` | "update template" | Sync `.claude/` + `CLAUDE.md` |
|
|
145
|
+
| `honcho-memory` | "remember that X", "/honcho list" | Cross-session memory |
|
|
146
|
+
| `caveman` | always-on, "stop caveman" | Telegraphic output |
|
|
147
|
+
|
|
148
|
+
### `project-manager` (catch-all — replaces bootstrap-mobile)
|
|
149
|
+
|
|
150
|
+
Since there is NO `bootstrap-mobile`, all scaffolding or structural changes go through `project-manager`:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
you:
|
|
154
|
+
create mobile app with Expo SDK 54 and tab navigation
|
|
155
|
+
|
|
156
|
+
Claude (project-manager):
|
|
157
|
+
> Intent identified: mobile scaffold.
|
|
158
|
+
> Delegating to mobile-developer.
|
|
159
|
+
|
|
160
|
+
Claude (mobile-developer):
|
|
161
|
+
> npx create-expo-app@latest --template blank-typescript .
|
|
162
|
+
> Configured Expo Router with (tabs).
|
|
163
|
+
> Installed: zustand, @tanstack/react-query, react-native-mmkv,
|
|
164
|
+
> expo-secure-store, react-hook-form, zod, @shopify/flash-list
|
|
165
|
+
> jest-expo + RNTL + Detox in devDependencies.
|
|
166
|
+
> CLAUDE.md updated for type=mobile.
|
|
167
|
+
> Done. `npx expo start` to validate.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### `grill-me` (typical mobile discovery)
|
|
171
|
+
|
|
172
|
+
Mobile discovery covers platform-specific topics:
|
|
173
|
+
|
|
174
|
+
- iOS-first vs Android-first vs parallel
|
|
175
|
+
- Online-first vs offline-first
|
|
176
|
+
- Biometric auth (Face ID, Touch ID, Android Biometric)
|
|
177
|
+
- Push notification (Expo Notifications vs native FCM/APNs)
|
|
178
|
+
- Universal deep linking vs custom scheme
|
|
179
|
+
- OTA strategy (which channel, which SLA)
|
|
180
|
+
- Accessibility (Screen reader, dynamic type, touch targets)
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
you:
|
|
184
|
+
grill me about checkout screen with Apple Pay and Google Pay
|
|
185
|
+
|
|
186
|
+
Claude (grill-me):
|
|
187
|
+
> 1. What price range is supported?
|
|
188
|
+
> 2. Multi-currency?
|
|
189
|
+
> 3. Idempotency: does the backend have an idempotency-key already?
|
|
190
|
+
> 4. Fallback if Apple/Google Pay unavailable? Stripe? PIX in Brazil?
|
|
191
|
+
> 5. Lock orientation during payment — yes or no?
|
|
192
|
+
> 6. Offline behavior: can payment start without internet?
|
|
193
|
+
> 7. iOS-first launch or Android-first?
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### `auto-test-guard` (mobile thresholds)
|
|
197
|
+
|
|
198
|
+
Senior+ gate adapts for mobile (Detox flakiness tolerated):
|
|
199
|
+
|
|
200
|
+
| Metric | Mobile threshold |
|
|
201
|
+
|---|---|
|
|
202
|
+
| Jest statements | >= 85% |
|
|
203
|
+
| Jest branches | >= 80% |
|
|
204
|
+
| RN Testing Library a11y | 0 critical |
|
|
205
|
+
| Detox/Maestro E2E | critical flows green, retry up to 3x |
|
|
206
|
+
| ESLint | 0 errors, 0 new warnings |
|
|
207
|
+
| TS strict | no `any` in new code |
|
|
208
|
+
| Bundle size delta | < 200KB per feature (warn), block > 500KB |
|
|
209
|
+
|
|
210
|
+
### `pair-debug` (typically mobile)
|
|
211
|
+
|
|
212
|
+
Mobile has its own class of bugs that warrant the hypothesis-driven loop:
|
|
213
|
+
|
|
214
|
+
- Metro cache corrupted after `git pull`
|
|
215
|
+
- `pod install` failing on CocoaPods version
|
|
216
|
+
- Gradle daemon stuck
|
|
217
|
+
- New Architecture incompatible with legacy lib
|
|
218
|
+
- Hermes crash with no stack trace
|
|
219
|
+
- EAS Build failing on signing
|
|
220
|
+
|
|
221
|
+
## Workflow 1 — Feature from scratch (15 turns)
|
|
222
|
+
|
|
223
|
+
Scenario: product list screen with pull-to-refresh, infinite scroll, and API integration.
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
Turn 1 — you:
|
|
227
|
+
grill me about product list screen with pull-to-refresh and infinite scroll
|
|
228
|
+
|
|
229
|
+
Turn 1 — Claude (grill-me):
|
|
230
|
+
> Let's scope this.
|
|
231
|
+
> 1. How many products per page? I recommend 20 with cursor pagination
|
|
232
|
+
> (not offset — avoids drift when the list changes during scroll).
|
|
233
|
+
> 2. Cache: TanStack Query with 5min staleTime? Persisted to MMKV?
|
|
234
|
+
> 3. Offline: show last cache + "offline" banner when no network?
|
|
235
|
+
> 4. Skeleton during initial load or native ProgressView?
|
|
236
|
+
> 5. Does pull-to-refresh invalidate cache or just refetch the first page?
|
|
237
|
+
> 6. Error: auto-retry or manual button?
|
|
238
|
+
> 7. Accessibility: VoiceOver / TalkBack — announce "loading more"?
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Turn 2 — you:
|
|
243
|
+
20 per page with cursor. TanStack staleTime 5min. Offline shows cache + banner.
|
|
244
|
+
Initial skeleton. Pull-to-refresh invalidates everything. Auto-retry 2x then manual.
|
|
245
|
+
A11y mandatory.
|
|
246
|
+
|
|
247
|
+
Turn 2 — Claude (grill-me):
|
|
248
|
+
> Discovery complete. Saved to docs/discovery/DISCOVERY_product-list.md.
|
|
249
|
+
> Next: "generate PRD" to produce PRD_product-list.md.
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
Turn 3 — you:
|
|
254
|
+
generate PRD
|
|
255
|
+
|
|
256
|
+
Turn 3 — Claude (to-prd):
|
|
257
|
+
> docs/prd/PRD_product-list.md created.
|
|
258
|
+
> Overview, Goals, User Stories (US-1..US-4), Functional Requirements,
|
|
259
|
+
> Non-functional (a11y AA, p95 < 800ms first page, offline fallback),
|
|
260
|
+
> Out of scope (filters, sorting — backlog).
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Turn 4 — you:
|
|
265
|
+
split into issues
|
|
266
|
+
|
|
267
|
+
Turn 4 — Claude (to-issues):
|
|
268
|
+
> docs/issues/ISSUES_product-list.md created with 6 [ISSUE-N] blocks.
|
|
269
|
+
> To open all on GitHub:
|
|
270
|
+
> gh issue create --title "..." --body-file ...
|
|
271
|
+
> (commands ready in the file)
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
Turn 5 — you:
|
|
276
|
+
analyst generate plan
|
|
277
|
+
|
|
278
|
+
Turn 5 — Claude (analyst):
|
|
279
|
+
> docs/plans/PLAN_product-list.md created.
|
|
280
|
+
> Sprint 1: hook + service + cache (3 tasks)
|
|
281
|
+
> Sprint 2: UI + FlashList + skeleton (4 tasks)
|
|
282
|
+
> Sprint 3: pull-to-refresh + error + offline banner (3 tasks)
|
|
283
|
+
> Sprint 4: E2E tests + a11y audit (2 tasks)
|
|
284
|
+
> Each task with goal-ready DoD.
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```
|
|
288
|
+
Turn 6 — you:
|
|
289
|
+
prd ready?
|
|
290
|
+
|
|
291
|
+
Turn 6 — Claude (prd-ready-check):
|
|
292
|
+
> Evaluating PRD_product-list.md + PLAN_product-list.md.
|
|
293
|
+
> ✓ User Stories with measurable criteria
|
|
294
|
+
> ✓ Non-functional with numeric thresholds
|
|
295
|
+
> ✓ Out of scope explicit
|
|
296
|
+
> ✓ Goal-ready DoD on all tasks
|
|
297
|
+
> GO. Can start sprint 1.
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
Turn 7 — you:
|
|
302
|
+
run sprint 1 of PLAN_product-list.md
|
|
303
|
+
|
|
304
|
+
Turn 7 — Claude (run-sprint):
|
|
305
|
+
> Sprint 1 — initial backlog:
|
|
306
|
+
> [Task 1.1] qa-engineer writes failing test (Red)
|
|
307
|
+
> [Task 1.2] mobile-developer implements hook + service (Green)
|
|
308
|
+
> [Task 1.3] gate-keeper validates senior+
|
|
309
|
+
>
|
|
310
|
+
> [Task 1.1] qa-engineer:
|
|
311
|
+
> features/products/useProductList.test.ts created, 4 scenarios failing.
|
|
312
|
+
>
|
|
313
|
+
> [Task 1.2] mobile-developer:
|
|
314
|
+
> - features/products/useProductList.ts (TanStack Query infinite)
|
|
315
|
+
> - features/products/product.service.ts (cursor fetch)
|
|
316
|
+
> - features/products/product.types.ts (zod schema)
|
|
317
|
+
> - 4 scenarios passing ✓
|
|
318
|
+
>
|
|
319
|
+
> [Task 1.3] gate-keeper:
|
|
320
|
+
> Jest statements 91% ✓
|
|
321
|
+
> ESLint 0 warnings ✓
|
|
322
|
+
> TS strict 0 any ✓
|
|
323
|
+
> GREEN. Sprint 1 done.
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
Turn 8 — you:
|
|
328
|
+
run sprint 2
|
|
329
|
+
|
|
330
|
+
Turn 8 — Claude (run-sprint):
|
|
331
|
+
> Sprint 2 — UI with FlashList:
|
|
332
|
+
> [Task 2.1] qa-engineer writes RNTL test (snapshot + a11y)
|
|
333
|
+
> [Task 2.2] mobile-developer implements screen
|
|
334
|
+
> [Task 2.3] gate-keeper validates
|
|
335
|
+
>
|
|
336
|
+
> [Task 2.2] mobile-developer:
|
|
337
|
+
> - features/products/ProductListScreen.tsx (FlashList 2 estimatedItemSize 96)
|
|
338
|
+
> - features/products/ProductCard.tsx (memo, OnPress callback)
|
|
339
|
+
> - features/products/ProductSkeleton.tsx (Reanimated 4 pulse)
|
|
340
|
+
> - app/(tabs)/products/index.tsx (Expo Router route)
|
|
341
|
+
>
|
|
342
|
+
> [Task 2.3] gate-keeper:
|
|
343
|
+
> Jest 88% ✓
|
|
344
|
+
> RNTL a11y 0 critical ✓
|
|
345
|
+
> FlashList warnings: 0 ✓
|
|
346
|
+
> GREEN.
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
Turn 9 — you:
|
|
351
|
+
run sprint 3
|
|
352
|
+
|
|
353
|
+
Turn 9 — Claude (run-sprint):
|
|
354
|
+
> Sprint 3 — pull-to-refresh, error, offline:
|
|
355
|
+
> - RefreshControl with invalidateQueries
|
|
356
|
+
> - Local ErrorBoundary + retry button
|
|
357
|
+
> - NetInfo subscription -> "offline" banner
|
|
358
|
+
> - MMKV persister for TanStack cache
|
|
359
|
+
>
|
|
360
|
+
> gate-keeper GREEN.
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
```
|
|
364
|
+
Turn 10 — you:
|
|
365
|
+
run sprint 4
|
|
366
|
+
|
|
367
|
+
Turn 10 — Claude (run-sprint):
|
|
368
|
+
> Sprint 4 — E2E + a11y:
|
|
369
|
+
> [Task 4.1] qa-engineer writes Detox test
|
|
370
|
+
> [Task 4.2] qa-engineer runs axe-core/react-native scan
|
|
371
|
+
>
|
|
372
|
+
> [Task 4.1]:
|
|
373
|
+
> e2e/product-list.e2e.ts — scroll, pull-to-refresh, offline mode
|
|
374
|
+
> Dev client build + Detox run: 3 scenarios green, retry used in 1
|
|
375
|
+
>
|
|
376
|
+
> [Task 4.2]:
|
|
377
|
+
> 0 critical, 0 serious. 2 minor (low contrast on badge).
|
|
378
|
+
> Auto-fix applied.
|
|
379
|
+
>
|
|
380
|
+
> gate-keeper GREEN.
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
Turn 11 — you:
|
|
385
|
+
record in brain
|
|
386
|
+
|
|
387
|
+
Turn 11 — Claude (brain-keeper):
|
|
388
|
+
> docs/brain/features/product-list.md created.
|
|
389
|
+
> docs/brain/daily/2026-05-27.md updated.
|
|
390
|
+
> Obsidian links to PRD, PLAN, ADR (none created this sprint).
|
|
391
|
+
> MOC.md updated.
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
Turn 12 — you:
|
|
396
|
+
ready for production?
|
|
397
|
+
|
|
398
|
+
Turn 12 — Claude (gate-keeper):
|
|
399
|
+
> Final senior+ gate:
|
|
400
|
+
> ✓ Jest 87% statements
|
|
401
|
+
> ✓ RNTL 0 critical a11y
|
|
402
|
+
> ✓ Detox critical flows green
|
|
403
|
+
> ✓ Bundle delta +180KB (warn — ok)
|
|
404
|
+
> ✓ TS strict
|
|
405
|
+
> ✓ ESLint clean
|
|
406
|
+
> Cleared for production build.
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## Workflow 2 — Biometric authentication
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
you:
|
|
413
|
+
create auth flow with biometric using expo-local-authentication
|
|
414
|
+
|
|
415
|
+
Claude (project-manager -> mobile-developer):
|
|
416
|
+
> Installs expo-local-authentication, expo-secure-store.
|
|
417
|
+
> Creates:
|
|
418
|
+
> - features/auth/BiometricAuthScreen.tsx ("Sign in with Face ID" button)
|
|
419
|
+
> - features/auth/PasswordFallbackScreen.tsx
|
|
420
|
+
> - services/biometric.service.ts:
|
|
421
|
+
> authenticateAsync({ promptMessage, fallbackLabel: 'Use password' })
|
|
422
|
+
> - services/credentials.store.ts (SecureStore, namespace "auth.v1")
|
|
423
|
+
> - store/auth.store.ts (Zustand: { user, token, refreshAt })
|
|
424
|
+
> - app/(auth)/_layout.tsx (gate for authenticated routes)
|
|
425
|
+
>
|
|
426
|
+
> Unit test: services/biometric.service.test.ts (mock LocalAuth)
|
|
427
|
+
> E2E test: e2e/biometric.e2e.ts (skipped on CI without biometric device)
|
|
428
|
+
>
|
|
429
|
+
> Applied. Want to run "run tests"?
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
## Workflow 3 — EAS Build + Submit setup
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
you:
|
|
436
|
+
configure EAS Build for Android and iOS
|
|
437
|
+
|
|
438
|
+
Claude (devops-engineer):
|
|
439
|
+
> Commands for you to run locally (needs your login):
|
|
440
|
+
> npm install --global eas-cli
|
|
441
|
+
> eas login
|
|
442
|
+
> eas build:configure
|
|
443
|
+
>
|
|
444
|
+
> I'll create eas.json with 3 profiles:
|
|
445
|
+
|
|
446
|
+
> {
|
|
447
|
+
> "build": {
|
|
448
|
+
> "development": {
|
|
449
|
+
> "developmentClient": true,
|
|
450
|
+
> "distribution": "internal",
|
|
451
|
+
> "channel": "development"
|
|
452
|
+
> },
|
|
453
|
+
> "preview": {
|
|
454
|
+
> "distribution": "internal",
|
|
455
|
+
> "channel": "preview",
|
|
456
|
+
> "ios": { "simulator": false },
|
|
457
|
+
> "android": { "buildType": "apk" }
|
|
458
|
+
> },
|
|
459
|
+
> "production": {
|
|
460
|
+
> "channel": "production",
|
|
461
|
+
> "autoIncrement": true
|
|
462
|
+
> }
|
|
463
|
+
> },
|
|
464
|
+
> "submit": {
|
|
465
|
+
> "production": {
|
|
466
|
+
> "android": { "track": "production" },
|
|
467
|
+
> "ios": { "ascAppId": "1234567890" }
|
|
468
|
+
> }
|
|
469
|
+
> }
|
|
470
|
+
> }
|
|
471
|
+
>
|
|
472
|
+
> Build commands:
|
|
473
|
+
> eas build --platform all --profile production
|
|
474
|
+
> eas submit -p android --latest
|
|
475
|
+
> eas submit -p ios --latest
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
```
|
|
479
|
+
you:
|
|
480
|
+
generate OTA update production with hotfix
|
|
481
|
+
|
|
482
|
+
Claude (devops-engineer):
|
|
483
|
+
> Pre-checks:
|
|
484
|
+
> ✓ expo-updates installed and configured (app.json runtimeVersion)
|
|
485
|
+
> ✓ "production" channel exists in eas.json
|
|
486
|
+
> ✓ No native code changes (verified git diff android/ ios/)
|
|
487
|
+
>
|
|
488
|
+
> Command:
|
|
489
|
+
> eas update --branch production --message "Hotfix: fix crash on list"
|
|
490
|
+
>
|
|
491
|
+
> After publish:
|
|
492
|
+
> - Prod devices get update on next cold start (or checkAutomatically: ON_LOAD)
|
|
493
|
+
> - Monitor: https://expo.dev/accounts/<org>/projects/<app>/updates
|
|
494
|
+
>
|
|
495
|
+
> Warning: if you changed native code, OTA will not work. You must rebuild.
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## Workflow 4 — Angular -> React Native conversion
|
|
499
|
+
|
|
500
|
+
```
|
|
501
|
+
you:
|
|
502
|
+
convert my existing Angular app to React Native preserving business logic
|
|
503
|
+
|
|
504
|
+
Claude (mobile-developer):
|
|
505
|
+
> Phase 1 — Catalog (read-only, no Angular changes):
|
|
506
|
+
> ✓ 12 features detected in src/app/features/
|
|
507
|
+
> ✓ 8 HttpClient services in src/app/core/services/
|
|
508
|
+
> ✓ 5 guards (auth, role-admin, role-user, has-tenant, feature-flag)
|
|
509
|
+
> ✓ 23 standalone components
|
|
510
|
+
> ✓ 4 pipes (currency, date-relative, mask-cpf, truncate)
|
|
511
|
+
>
|
|
512
|
+
> Phase 2 — Mapping:
|
|
513
|
+
> Angular service -> custom hook + Zustand
|
|
514
|
+
> UserService.getMe() -> useMe() (TanStack Query)
|
|
515
|
+
> CartService.add() -> useCart() (Zustand action)
|
|
516
|
+
> Angular component -> functional component + hooks
|
|
517
|
+
> ProductCardComponent -> ProductCard.tsx (memo)
|
|
518
|
+
> Guard -> Expo Router middleware
|
|
519
|
+
> authGuard -> app/(auth)/_layout.tsx redirect
|
|
520
|
+
> Pipe -> pure function
|
|
521
|
+
> currencyPipe -> formatCurrency(value, locale)
|
|
522
|
+
>
|
|
523
|
+
> Phase 3 — Incremental migration, feature by feature:
|
|
524
|
+
> Sprint A: auth + me + bootstrap
|
|
525
|
+
> Sprint B: signup feature
|
|
526
|
+
> Sprint C: listing feature
|
|
527
|
+
> ...
|
|
528
|
+
>
|
|
529
|
+
> Phase 4 — RN Testing Library + Detox tests per feature.
|
|
530
|
+
>
|
|
531
|
+
> Want to start with Sprint A? Type "run sprint A".
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
## Workflow 5 — pair-debug (Metro stuck)
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
you:
|
|
538
|
+
let's debug — Metro is stuck and build won't run after git pull
|
|
539
|
+
|
|
540
|
+
Claude (pair-debug):
|
|
541
|
+
> Symptom: after recent git pull, npx expo start hangs at "Starting Metro Bundler".
|
|
542
|
+
> Hypothesis 1 (85% confidence): Metro cache invalid due to changes in
|
|
543
|
+
> node_modules or metro.config.js.
|
|
544
|
+
> Probe: run `watchman watch-del-all && rm -rf $TMPDIR/metro-* /tmp/metro-*`.
|
|
545
|
+
> Confirm probe? (yes/no)
|
|
546
|
+
|
|
547
|
+
you: yes
|
|
548
|
+
|
|
549
|
+
Claude:
|
|
550
|
+
> Executed. Caches cleared.
|
|
551
|
+
> Next step: `npx expo start --clear`.
|
|
552
|
+
> If still stuck, hypothesis 2 (60%): outdated node_modules.
|
|
553
|
+
> Probe: rm -rf node_modules && npm ci.
|
|
554
|
+
|
|
555
|
+
you:
|
|
556
|
+
didn't work. still stuck
|
|
557
|
+
|
|
558
|
+
Claude:
|
|
559
|
+
> Hypothesis 2 active.
|
|
560
|
+
> Probe: rm -rf node_modules package-lock.json .expo && npm install.
|
|
561
|
+
> Confirm? (yes/no)
|
|
562
|
+
|
|
563
|
+
you: yes
|
|
564
|
+
|
|
565
|
+
Claude:
|
|
566
|
+
> Executed. npm install complete in 47s.
|
|
567
|
+
> Run again: npx expo start --clear.
|
|
568
|
+
> If it persists, hypothesis 3 (40%): watchman conflict with WSL/Windows
|
|
569
|
+
> filesystem. Check `watchman --version` and `watchman watch-list`.
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
## Workflow 6 — Push notifications
|
|
573
|
+
|
|
574
|
+
```
|
|
575
|
+
you:
|
|
576
|
+
create push notification with expo-notifications
|
|
577
|
+
|
|
578
|
+
Claude (project-manager -> mobile-developer):
|
|
579
|
+
> Installs expo-notifications + expo-device.
|
|
580
|
+
> Configures:
|
|
581
|
+
> - app.json: plugins ["expo-notifications", { icon, color }]
|
|
582
|
+
> - iOS: requests notifyOnUserAction permission
|
|
583
|
+
> - Android: creates "default" channel on boot
|
|
584
|
+
> Creates:
|
|
585
|
+
> - services/notifications.service.ts:
|
|
586
|
+
> registerForPushNotificationsAsync()
|
|
587
|
+
> getExpoPushTokenAsync({ projectId })
|
|
588
|
+
> - hooks/useNotificationListener.ts:
|
|
589
|
+
> Notifications.addNotificationReceivedListener
|
|
590
|
+
> Notifications.addNotificationResponseReceivedListener
|
|
591
|
+
> - store/notifications.store.ts (list, badge count, mark-read)
|
|
592
|
+
> Backend (suggested):
|
|
593
|
+
> POST /api/v1/devices { expoPushToken, platform, locale }
|
|
594
|
+
> POST /api/v1/notifications/dispatch (server -> Expo Push API)
|
|
595
|
+
> Test: mock Notifications.scheduleNotificationAsync in jest setup.
|
|
596
|
+
> Next: configure permission in the onboarding flow.
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## Workflow 7 — Deep linking
|
|
600
|
+
|
|
601
|
+
```
|
|
602
|
+
you:
|
|
603
|
+
configure universal deep linking for /products/:id
|
|
604
|
+
|
|
605
|
+
Claude (mobile-developer):
|
|
606
|
+
> app.json:
|
|
607
|
+
> "scheme": "myapp",
|
|
608
|
+
> "ios": { "associatedDomains": ["applinks:myapp.com"] },
|
|
609
|
+
> "android": { "intentFilters": [{ "action": "VIEW",
|
|
610
|
+
> "data": [{ "scheme": "https", "host": "myapp.com",
|
|
611
|
+
> "pathPrefix": "/products" }], "category": ["BROWSABLE","DEFAULT"] }] }
|
|
612
|
+
> Expo Router automatically maps /products/[id] to app/products/[id].tsx.
|
|
613
|
+
> Creates:
|
|
614
|
+
> - app/products/[id].tsx (loads product via useProduct(id))
|
|
615
|
+
> - Linking.createURL helper in utils/links.ts
|
|
616
|
+
> Test:
|
|
617
|
+
> adb shell am start -W -a android.intent.action.VIEW \
|
|
618
|
+
> -d "myapp://products/42" com.example.myapp
|
|
619
|
+
> xcrun simctl openurl booted "myapp://products/42"
|
|
620
|
+
> Universal link requires apple-app-site-association + assetlinks.json
|
|
621
|
+
> hosted at https://myapp.com/.well-known/.
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
## Cheat sheet — mobile triggers
|
|
625
|
+
|
|
626
|
+
| I want to... | Type in chat |
|
|
627
|
+
|---|---|
|
|
628
|
+
| Create mobile app from scratch | `create mobile app with Expo SDK 54` |
|
|
629
|
+
| Add a screen with discovery | `grill me about <screen>` -> `generate PRD` -> `run sprint` |
|
|
630
|
+
| Biometric auth | `create auth flow with biometric` |
|
|
631
|
+
| Push notification | `create push notification with expo-notifications` |
|
|
632
|
+
| Deep link | `configure deep linking for /products/:id` |
|
|
633
|
+
| EAS Build | `configure EAS Build` |
|
|
634
|
+
| EAS Submit | `submit to Google Play and App Store` |
|
|
635
|
+
| Production OTA update | `generate OTA update production` |
|
|
636
|
+
| Migrate Angular -> RN | `convert Angular app to React Native` |
|
|
637
|
+
| Debug stuck Metro | `let's debug — Metro stuck` |
|
|
638
|
+
| Debug pod install | `let's debug — pod install fail` |
|
|
639
|
+
| Run tests | `run tests` |
|
|
640
|
+
| Final pre-store gate | `ready for production?` |
|
|
641
|
+
| Record history | `record in brain` |
|
|
642
|
+
| Remember preference | `remember that <X>` |
|
|
643
|
+
|
|
644
|
+
## Decision tree
|
|
645
|
+
|
|
646
|
+
```
|
|
647
|
+
Empty app? -> create mobile app with Expo SDK 54
|
|
648
|
+
(project-manager -> mobile-developer)
|
|
649
|
+
|
|
650
|
+
New screen or feature? -> grill me about <X>
|
|
651
|
+
-> generate PRD
|
|
652
|
+
-> analyst generate plan
|
|
653
|
+
-> run sprint N
|
|
654
|
+
|
|
655
|
+
Native auth (Face/Touch ID)? -> create auth flow with biometric
|
|
656
|
+
|
|
657
|
+
Notification? -> create push notification
|
|
658
|
+
|
|
659
|
+
Deep link / universal link? -> configure deep linking
|
|
660
|
+
|
|
661
|
+
Build for store? -> configure EAS Build
|
|
662
|
+
-> eas build --profile production
|
|
663
|
+
|
|
664
|
+
Update without review? -> generate OTA update production
|
|
665
|
+
(only if no native changes)
|
|
666
|
+
|
|
667
|
+
Angular conversion? -> convert Angular app to React Native
|
|
668
|
+
|
|
669
|
+
Mysterious crash? -> let's debug
|
|
670
|
+
(pair-debug hypothesis-driven)
|
|
671
|
+
|
|
672
|
+
Tests missing? -> run tests
|
|
673
|
+
(auto-test-guard + gate-keeper)
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
## Sub-agents relevant to mobile
|
|
677
|
+
|
|
678
|
+
| Agent | Model | Acts on |
|
|
679
|
+
|---|---|---|
|
|
680
|
+
| `mobile-developer` | Sonnet 4.6 | React Native 0.84+, Expo SDK 54+, New Architecture, TS strict, Reanimated 4, FlashList 2 |
|
|
681
|
+
| `ux-designer` | Sonnet 4.6 | Mobile-specific: touch targets (>= 44pt), safe area, dynamic type, dark mode |
|
|
682
|
+
| `architect` | Sonnet 4.6 | State mgmt (Zustand vs TanStack vs Jotai), navigation pattern, OTA strategy |
|
|
683
|
+
| `qa-engineer` | Sonnet 4.6 | Jest + RN Testing Library + Detox/Maestro |
|
|
684
|
+
| `gate-keeper` | Sonnet 4.6 | Senior+ gate adapted for mobile (Detox flakiness tolerated) |
|
|
685
|
+
| `devops-engineer` | Sonnet 4.6 | EAS Build, EAS Submit, EAS Update, fastlane (if bare workflow) |
|
|
686
|
+
| `tech-lead` | Opus 4.7 | Mobile stack decision, OTA strategy, native breaking changes |
|
|
687
|
+
| `product-owner` | Opus 4.7 | Scope, MVP iOS-first vs Android-first, mobile persona |
|
|
688
|
+
| `security-engineer` | Opus 4.7 | SecureStore, jailbreak/root detection, certificate pinning, OWASP MASVS |
|
|
689
|
+
| `database-engineer` | Sonnet 4.6 | MMKV schema, AsyncStorage migration, encrypted local DB (SQLite + sqlcipher) |
|
|
690
|
+
|
|
691
|
+
## Senior+ gate adapted for mobile
|
|
692
|
+
|
|
693
|
+
| Metric | Threshold | Tool |
|
|
694
|
+
|---|---|---|
|
|
695
|
+
| Jest statements | >= 85% | `jest --coverage` |
|
|
696
|
+
| Jest branches | >= 80% | `jest --coverage` |
|
|
697
|
+
| RNTL a11y violations | 0 critical, 0 serious | adapted `jest-axe` |
|
|
698
|
+
| Detox/Maestro critical flows | 100% (retry up to 3x) | Detox runner |
|
|
699
|
+
| ESLint | 0 errors, 0 new warnings | `eslint --max-warnings 0` |
|
|
700
|
+
| TypeScript strict | no `any` in new code | `tsc --noEmit` |
|
|
701
|
+
| Bundle size delta | warn > 200KB, block > 500KB | `expo export` + size script |
|
|
702
|
+
| Cold start (Android median) | < 2500ms | EAS Build profile + Detox metrics |
|
|
703
|
+
| Crash-free sessions | >= 99.5% | Sentry/Bugsnag |
|
|
704
|
+
|
|
705
|
+
## Active hooks in the harness
|
|
706
|
+
|
|
707
|
+
| Event | Script | Function |
|
|
708
|
+
|---|---|---|
|
|
709
|
+
| `UserPromptSubmit` | `prompt-gate-reminder.sh`, `on-prompt-submit.js` | Injects `[HONCHO MEMORY]` + senior+ gate reminder |
|
|
710
|
+
| `PreToolUse` (Bash) | `pre-push-guard.sh`, `block-test-deletion.sh` | Blocks direct push to main/develop; blocks deletion of `*.test.ts` / `*.e2e.ts` |
|
|
711
|
+
| `PostToolUse` (Edit/Write) | inline prettier, `post-edit-test-reminder.sh` | Formats + reminds to run suite |
|
|
712
|
+
| `Stop` | `stop-brain-reminder.sh`, `on-stop.js` | brain-keeper records session; Honcho stores context |
|
|
713
|
+
|
|
714
|
+
See [Hooks reference](../docs/hooks-reference).
|
|
715
|
+
|
|
716
|
+
## Honcho memory in practice (mobile)
|
|
717
|
+
|
|
718
|
+
Save typical mobile preferences:
|
|
719
|
+
|
|
720
|
+
```
|
|
721
|
+
remember that I always use React Native's New Architecture
|
|
722
|
+
remember that I prefer Zustand for local state and TanStack Query for server state
|
|
723
|
+
remember that MMKV for sync storage; AsyncStorage only on legacy projects
|
|
724
|
+
remember that never class components — only functional + hooks
|
|
725
|
+
remember that always TypeScript strict, zero any
|
|
726
|
+
remember that always FlashList on lists with more than 20 items
|
|
727
|
+
remember that iOS-first on consumer apps; Android-first on logistics apps
|
|
728
|
+
remember that OTA only for JS changes — native code requires rebuild
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
Audit:
|
|
732
|
+
|
|
733
|
+
```
|
|
734
|
+
/honcho list
|
|
735
|
+
/honcho search "OTA"
|
|
736
|
+
/honcho forget <id>
|
|
737
|
+
/honcho status
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
See [Honcho memory](../docs/honcho-memory).
|
|
741
|
+
|
|
742
|
+
## Antipatterns (DON'T do this)
|
|
743
|
+
|
|
744
|
+
- Class components — always functional + hooks
|
|
745
|
+
- `any` in TypeScript — gate-keeper blocks
|
|
746
|
+
- `duk <skill>` — doesn't exist, skills trigger by keyword in chat
|
|
747
|
+
- Inline styles without `StyleSheet.create` — slow on the shadow tree
|
|
748
|
+
- Skipping Detox/Maestro E2E on critical flows (auth, checkout, payment)
|
|
749
|
+
- AsyncStorage for token, password, PII — use `expo-secure-store`
|
|
750
|
+
- Libraries without New Architecture support (check before installing)
|
|
751
|
+
- FlatList on long lists — always FlashList 2+
|
|
752
|
+
- Reanimated 1/2 in new code — always 4+
|
|
753
|
+
- Outdated Cocoapods — sync version with Expo SDK
|
|
754
|
+
- Commit with `Co-Authored-By: Claude` — gate-keeper blocks
|
|
755
|
+
- Mentioning Claude/Anthropic/AI/LLM/assistant in commit messages
|
|
756
|
+
- OTA when native code changed — devices will crash
|
|
757
|
+
- Permission prompt for notification or camera without prior UI context
|
|
758
|
+
|
|
759
|
+
## Mobile troubleshooting
|
|
760
|
+
|
|
761
|
+
**Metro cache corrupted after git pull:**
|
|
762
|
+
|
|
763
|
+
```bash
|
|
764
|
+
watchman watch-del-all
|
|
765
|
+
rm -rf $TMPDIR/metro-* /tmp/metro-* node_modules/.cache
|
|
766
|
+
npx expo start --clear
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
**pod install failing on Cocoapods version:**
|
|
770
|
+
|
|
771
|
+
```bash
|
|
772
|
+
cd ios && pod deintegrate && pod install --repo-update
|
|
773
|
+
# If it persists:
|
|
774
|
+
sudo gem install cocoapods -v 1.15.2
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
**Gradle daemon stuck (Android):**
|
|
778
|
+
|
|
779
|
+
```bash
|
|
780
|
+
cd android && ./gradlew --stop
|
|
781
|
+
rm -rf ~/.gradle/caches/transforms-*
|
|
782
|
+
./gradlew clean
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
**AsyncStorage migration (legacy -> MMKV):**
|
|
786
|
+
|
|
787
|
+
Use `react-native-mmkv` with a one-shot migration helper at boot. Reads AsyncStorage, copies to MMKV, marks a migration flag.
|
|
788
|
+
|
|
789
|
+
**New Architecture incompatible with a lib:**
|
|
790
|
+
|
|
791
|
+
Check at https://github.com/reactwg/react-native-new-architecture/discussions/175. Lib without support: contact the maintainer or swap to an alternative.
|
|
792
|
+
|
|
793
|
+
**EAS Build failing on signing:**
|
|
794
|
+
|
|
795
|
+
Check:
|
|
796
|
+
- `eas.json` -> production profile -> credentials configured
|
|
797
|
+
- `eas credentials` -> verify Android keystore and iOS provisioning profile
|
|
798
|
+
- Active Apple developer membership
|
|
799
|
+
- Google Play service account with release permission
|
|
800
|
+
|
|
801
|
+
**OTA update not reaching devices:**
|
|
802
|
+
|
|
803
|
+
Checklist:
|
|
804
|
+
- `expo-updates` installed and configured
|
|
805
|
+
- `runtimeVersion` in `app.json` matches the production build
|
|
806
|
+
- Correct channel in `eas update --branch production`
|
|
807
|
+
- Devices opened the app at least once (background update)
|
|
808
|
+
|
|
809
|
+
**Push notification not firing on iOS:**
|
|
810
|
+
|
|
811
|
+
Check:
|
|
812
|
+
- aps-environment entitlement in provisioning profile
|
|
813
|
+
- "Push Notifications" capability in app.json
|
|
814
|
+
- APNs key configured in EAS (`eas credentials`)
|
|
815
|
+
- `notifyOnUserAction` permission requested and accepted
|
|
816
|
+
|
|
817
|
+
**Detox flaky:**
|
|
818
|
+
|
|
819
|
+
- Bump `waitFor(...).withTimeout(10000)`
|
|
820
|
+
- Use `device.disableSynchronization()` only at critical points
|
|
821
|
+
- Clean state between tests (`device.reloadReactNative()`)
|
|
822
|
+
- Retry up to 3x in CI (`--retries 3`)
|
|
823
|
+
|
|
824
|
+
## Quick glossary
|
|
825
|
+
|
|
826
|
+
- **Skill** — entry point triggered by keyword match in the prompt. Defined in `.claude/skills/<slug>/SKILL.md`.
|
|
827
|
+
- **Agent** — specialist executor invoked via Task tool. Defined in `.claude/agents/<name>.md`.
|
|
828
|
+
- **Task tool** — harness mechanism to invoke subagents in parallel or sequence.
|
|
829
|
+
- **PLAN_*.md** — goal-ready technical plan in `docs/plans/`, generated by `analyst`.
|
|
830
|
+
- **PRD_*.md** — Product Requirements Document in `docs/prd/`.
|
|
831
|
+
- **DISCOVERY_*.md** — output of the `grill-me` interview in `docs/discovery/`.
|
|
832
|
+
- **ISSUES_*.md** — decomposed issues in `docs/issues/`.
|
|
833
|
+
- **ADR-NNN** — Architecture Decision Record in `docs/decisions/`.
|
|
834
|
+
- **EAS** — Expo Application Services. Build (cloud), Submit (auto-publish), Update (OTA).
|
|
835
|
+
- **OTA** — Over-The-Air update. JS update bypassing store review. JS/assets only.
|
|
836
|
+
- **New Architecture** — Fabric (renderer) + TurboModules + JSI. Replaces the old bridge.
|
|
837
|
+
- **FlashList** — Shopify's virtualized list. Replaces FlatList for performance.
|
|
838
|
+
- **MMKV** — native sync key-value storage (Facebook). Replaces AsyncStorage.
|
|
839
|
+
- **Detox** — gray-box E2E. Runs on real device or emulator.
|
|
840
|
+
- **Maestro** — black-box E2E via declarative YAML.
|
|
841
|
+
- **Expo Router** — file-based routing inspired by Next.js. Default in SDK 50+.
|
|
842
|
+
- **Zustand** — simple global store, no Redux boilerplate.
|
|
843
|
+
- **TanStack Query** — server state cache + sync (replaces SWR).
|
|
844
|
+
- **Reanimated** — UI-thread animations (JS worklet).
|
|
845
|
+
- **Senior+ gate** — non-negotiable quality gate.
|
|
846
|
+
- **Obsidian vault** — `docs/brain/` with daily/features/decisions.
|
|
847
|
+
- **Autonomy Matrix** — who-decides-what table.
|
|
848
|
+
- **Honcho** — persistent cross-session memory.
|
|
849
|
+
|
|
850
|
+
## Cross references
|
|
851
|
+
|
|
852
|
+
- [Architecture overview](../docs/architecture-overview) — 2-layer model (skill + agent)
|
|
853
|
+
- [Agents reference](../docs/agents-reference) — all 25 agents
|
|
854
|
+
- [Skills reference](../docs/skills-reference) — all 18 skills
|
|
855
|
+
- [Pipeline](../docs/pipeline) — end-to-end flow
|
|
856
|
+
- [Quality gate](../docs/quality-gate) — senior+ thresholds
|
|
857
|
+
- [Stack rules](../docs/stack-rules) — mandatory conventions
|
|
858
|
+
- [Autonomy matrix](../docs/autonomy-matrix) — who decides what
|
|
859
|
+
- [Hooks reference](../docs/hooks-reference) — active hooks
|
|
860
|
+
- [Honcho memory](../docs/honcho-memory) — persistent memory
|
|
861
|
+
- [Git Flow](../docs/git-flow) — branches and commits
|
|
862
|
+
- [Troubleshooting](../docs/troubleshooting) — common issues
|
|
863
|
+
- [Backend manual](./backend) — Java 25 + Spring Boot 4
|
|
864
|
+
- [Frontend manual](./frontend) — Angular 21
|
|
865
|
+
- [Fullstack manual](./fullstack) — backend + frontend monorepo
|
|
866
|
+
- [Existing project manual](./existing-project) — adoption via active-project
|