specweave 1.0.32 → 1.0.33
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-plugin/marketplace.json +1 -1
- package/CLAUDE.md +205 -148
- package/README.md +0 -2
- package/bin/specweave.js +11 -0
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/update-instructions.d.ts +16 -0
- package/dist/src/cli/commands/update-instructions.d.ts.map +1 -0
- package/dist/src/cli/commands/update-instructions.js +134 -0
- package/dist/src/cli/commands/update-instructions.js.map +1 -0
- package/dist/src/cli/helpers/init/directory-structure.d.ts +28 -1
- package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.js +163 -33
- package/dist/src/cli/helpers/init/directory-structure.js.map +1 -1
- package/dist/src/cli/helpers/init/index.d.ts +2 -1
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +3 -1
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/helpers/init/instruction-file-merger.d.ts +23 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.js +243 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.js.map +1 -0
- package/dist/src/cli/helpers/init/plugin-installer.js +49 -0
- package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -1
- package/dist/src/config/types.d.ts +2 -2
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts +26 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts.map +1 -1
- package/dist/src/core/living-docs/external-sync-orchestrator.js +61 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.js.map +1 -1
- package/dist/src/core/living-docs/scaffolding/index.d.ts +12 -0
- package/dist/src/core/living-docs/scaffolding/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/index.js +15 -0
- package/dist/src/core/living-docs/scaffolding/index.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/merger.d.ts +183 -0
- package/dist/src/core/living-docs/scaffolding/merger.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/merger.js +523 -0
- package/dist/src/core/living-docs/scaffolding/merger.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.d.ts +102 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.js +346 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.d.ts +108 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.js +204 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.js.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts +38 -2
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js +65 -10
- package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -1
- package/dist/src/core/tools/index.d.ts +11 -0
- package/dist/src/core/tools/index.d.ts.map +1 -0
- package/dist/src/core/tools/index.js +10 -0
- package/dist/src/core/tools/index.js.map +1 -0
- package/dist/src/core/tools/tool-event-bus.d.ts +33 -0
- package/dist/src/core/tools/tool-event-bus.d.ts.map +1 -0
- package/dist/src/core/tools/tool-event-bus.js +84 -0
- package/dist/src/core/tools/tool-event-bus.js.map +1 -0
- package/dist/src/core/tools/tool-index-builder.d.ts +27 -0
- package/dist/src/core/tools/tool-index-builder.d.ts.map +1 -0
- package/dist/src/core/tools/tool-index-builder.js +289 -0
- package/dist/src/core/tools/tool-index-builder.js.map +1 -0
- package/dist/src/core/tools/tool-registry.d.ts +51 -0
- package/dist/src/core/tools/tool-registry.d.ts.map +1 -0
- package/dist/src/core/tools/tool-registry.js +224 -0
- package/dist/src/core/tools/tool-registry.js.map +1 -0
- package/dist/src/core/tools/tool-search-engine.d.ts +22 -0
- package/dist/src/core/tools/tool-search-engine.d.ts.map +1 -0
- package/dist/src/core/tools/tool-search-engine.js +174 -0
- package/dist/src/core/tools/tool-search-engine.js.map +1 -0
- package/dist/src/core/tools/types/tool-registry-types.d.ts +112 -0
- package/dist/src/core/tools/types/tool-registry-types.d.ts.map +1 -0
- package/dist/src/core/tools/types/tool-registry-types.js +7 -0
- package/dist/src/core/tools/types/tool-registry-types.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/hooks.json +3 -13
- package/plugins/specweave/hooks/lib/common-setup.sh +47 -321
- package/plugins/specweave/hooks/lib/migrate-increment-work.sh +5 -5
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +5 -5
- package/plugins/specweave/hooks/universal/dispatcher.mjs +4 -5
- package/plugins/specweave/hooks/universal/fail-fast-wrapper.sh +43 -296
- package/plugins/specweave/hooks/universal/hook-wrapper.sh +3 -1
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +2 -2
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +1 -10
- package/plugins/specweave/hooks/v2/guards/completion-guard.sh +12 -29
- package/plugins/specweave/hooks/v2/guards/increment-duplicate-guard.sh +27 -29
- package/plugins/specweave/hooks/v2/guards/metadata-json-guard.sh +10 -4
- package/plugins/specweave/hooks/v2/guards/spec-validation-guard.sh +139 -0
- package/plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh +4 -2
- package/plugins/specweave/hooks/v2/session-end.sh +3 -1
- package/plugins/specweave/hooks/v2/session-start.sh +3 -1
- package/plugins/specweave/skills/increment-planner/templates/plan.md +14 -0
- package/plugins/specweave/skills/update-instructions/SKILL.md +80 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh +1 -1
- package/plugins/specweave-mobile/README.md +55 -35
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +805 -329
- package/plugins/specweave-mobile/skills/expo-workflow/SKILL.md +226 -9
- package/plugins/specweave-mobile/skills/native-modules/SKILL.md +221 -20
- package/plugins/specweave-mobile/skills/performance-optimization/SKILL.md +186 -14
- package/plugins/specweave-mobile/skills/react-native-setup/SKILL.md +151 -54
- package/plugins/specweave-release/commands/npm.md +61 -17
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -3
- package/src/templates/AGENTS.md.template +34 -0
- package/src/templates/CLAUDE.md.template +121 -155
- package/plugins/specweave/hooks/config-env-separator.sh +0 -99
- package/plugins/specweave/hooks/github-metadata-guard.sh +0 -73
- package/plugins/specweave/hooks/lib/circuit-breaker.sh +0 -381
- package/plugins/specweave/hooks/lib/crash-prevention.sh +0 -336
- package/plugins/specweave/hooks/lib/logging.sh +0 -231
- package/plugins/specweave/hooks/lib/metrics.sh +0 -347
- package/plugins/specweave/hooks/lib/semaphore.sh +0 -216
- package/plugins/specweave/hooks/project-folder-guard.sh +0 -274
- package/plugins/specweave/hooks/spec-project-validator.sh +0 -210
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.sh +0 -212
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.test.sh +0 -163
- package/plugins/specweave/hooks/v2/guards/features-folder-guard.sh +0 -51
- package/plugins/specweave/hooks/v2/guards/increment-root-guard.sh +0 -63
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.sh +0 -335
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.test.sh +0 -406
|
@@ -1,14 +1,95 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: performance-optimization
|
|
3
|
-
description: Expert in React Native performance optimization including
|
|
3
|
+
description: Expert in React Native 0.83+ performance optimization including Hermes V1, React 19.2 concurrent features, Intersection Observer, Web Performance APIs, bundle size reduction, memory management, rendering optimization, FlashList, expo-image v2, memoization, lazy loading, code splitting. Activates for performance, slow app, lag, memory leak, bundle size, optimization, flatlist performance, re-render, fps, jank, startup time, app size, hermes, concurrent rendering.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Performance Optimization Expert
|
|
6
|
+
# Performance Optimization Expert (RN 0.83+)
|
|
7
7
|
|
|
8
|
-
Specialized in optimizing React Native and Expo applications for production. Expert in
|
|
8
|
+
Specialized in optimizing React Native 0.83+ and Expo SDK 54+ applications for production. Expert in Hermes V1, React 19.2 concurrent features, Intersection Observer API, Web Performance APIs, and modern optimization strategies.
|
|
9
9
|
|
|
10
10
|
## What I Know
|
|
11
11
|
|
|
12
|
+
### React Native 0.83 Performance Features
|
|
13
|
+
|
|
14
|
+
**Hermes V1 (Experimental)**
|
|
15
|
+
- Next-generation JavaScript engine
|
|
16
|
+
- Improved garbage collection
|
|
17
|
+
- Better startup performance
|
|
18
|
+
- Enhanced debugging with DevTools
|
|
19
|
+
- Enable in metro.config.js:
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// metro.config.js
|
|
23
|
+
module.exports = {
|
|
24
|
+
transformer: {
|
|
25
|
+
hermesParser: true, // Enable Hermes V1 parser
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**React 19.2 Concurrent Features**
|
|
31
|
+
- Activity component for state preservation
|
|
32
|
+
- useEffectEvent for stable event handlers
|
|
33
|
+
- Improved concurrent rendering
|
|
34
|
+
- Better memory management during transitions
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// Preserve state while hidden (React 19.2)
|
|
38
|
+
import { Activity } from 'react';
|
|
39
|
+
|
|
40
|
+
function TabContent({ isActive, children }) {
|
|
41
|
+
return (
|
|
42
|
+
<Activity mode={isActive ? 'visible' : 'hidden'}>
|
|
43
|
+
{children}
|
|
44
|
+
</Activity>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Intersection Observer API (Canary)**
|
|
50
|
+
- Web-like lazy loading for React Native
|
|
51
|
+
- Visibility detection without scroll events
|
|
52
|
+
- More efficient than manual scroll tracking
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { IntersectionObserver } from 'react-native';
|
|
56
|
+
|
|
57
|
+
// Lazy load when element enters viewport
|
|
58
|
+
const observer = new IntersectionObserver((entries) => {
|
|
59
|
+
entries.forEach((entry) => {
|
|
60
|
+
if (entry.isIntersecting) {
|
|
61
|
+
loadContent();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Web Performance APIs (Stable)**
|
|
68
|
+
- performance.now() for precise timing
|
|
69
|
+
- User Timing API for custom marks
|
|
70
|
+
- PerformanceObserver for monitoring
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Performance measurement
|
|
74
|
+
const start = performance.now();
|
|
75
|
+
await heavyOperation();
|
|
76
|
+
const duration = performance.now() - start;
|
|
77
|
+
|
|
78
|
+
// User Timing API
|
|
79
|
+
performance.mark('loadStart');
|
|
80
|
+
await loadData();
|
|
81
|
+
performance.mark('loadEnd');
|
|
82
|
+
performance.measure('dataLoad', 'loadStart', 'loadEnd');
|
|
83
|
+
|
|
84
|
+
// PerformanceObserver
|
|
85
|
+
const observer = new PerformanceObserver((list) => {
|
|
86
|
+
list.getEntries().forEach((entry) => {
|
|
87
|
+
console.log(`${entry.name}: ${entry.duration}ms`);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
observer.observe({ entryTypes: ['measure'] });
|
|
91
|
+
```
|
|
92
|
+
|
|
12
93
|
### Bundle Size Optimization
|
|
13
94
|
|
|
14
95
|
**Analyzing Bundle Size**
|
|
@@ -28,19 +109,20 @@ npx react-native-bundle-visualizer
|
|
|
28
109
|
```
|
|
29
110
|
|
|
30
111
|
**Reducing Bundle Size**
|
|
31
|
-
- Remove unused dependencies
|
|
32
|
-
- Use Hermes
|
|
112
|
+
- Remove unused dependencies with depcheck
|
|
113
|
+
- Use Hermes V1 for smaller bytecode
|
|
33
114
|
- Enable code minification and obfuscation
|
|
34
115
|
- Tree shaking for unused code elimination
|
|
35
116
|
- Lazy load heavy screens and components
|
|
36
117
|
- Optimize asset sizes (images, fonts)
|
|
118
|
+
- Use expo-image instead of react-native-fast-image
|
|
37
119
|
|
|
38
|
-
**Hermes Configuration**
|
|
120
|
+
**Hermes Configuration (RN 0.83)**
|
|
39
121
|
```javascript
|
|
40
|
-
// app.json (Expo)
|
|
122
|
+
// app.json (Expo SDK 54+)
|
|
41
123
|
{
|
|
42
124
|
"expo": {
|
|
43
|
-
"jsEngine": "hermes", //
|
|
125
|
+
"jsEngine": "hermes", // Default in SDK 54
|
|
44
126
|
"ios": {
|
|
45
127
|
"jsEngine": "hermes"
|
|
46
128
|
},
|
|
@@ -49,6 +131,14 @@ npx react-native-bundle-visualizer
|
|
|
49
131
|
}
|
|
50
132
|
}
|
|
51
133
|
}
|
|
134
|
+
|
|
135
|
+
// For Hermes V1 experimental
|
|
136
|
+
// metro.config.js
|
|
137
|
+
module.exports = {
|
|
138
|
+
transformer: {
|
|
139
|
+
hermesParser: true,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
52
142
|
```
|
|
53
143
|
|
|
54
144
|
### Rendering Performance
|
|
@@ -189,10 +279,85 @@ function SuperFastList({ data }) {
|
|
|
189
279
|
}
|
|
190
280
|
```
|
|
191
281
|
|
|
282
|
+
**Intersection Observer for Lazy Loading (RN 0.83 Canary)**
|
|
283
|
+
```typescript
|
|
284
|
+
import { useRef, useEffect, useState } from 'react';
|
|
285
|
+
import { View } from 'react-native';
|
|
286
|
+
|
|
287
|
+
function LazyLoadItem({ onVisible, children }) {
|
|
288
|
+
const ref = useRef(null);
|
|
289
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
290
|
+
|
|
291
|
+
useEffect(() => {
|
|
292
|
+
if (!ref.current) return;
|
|
293
|
+
|
|
294
|
+
const observer = new IntersectionObserver(
|
|
295
|
+
([entry]) => {
|
|
296
|
+
if (entry.isIntersecting && !isVisible) {
|
|
297
|
+
setIsVisible(true);
|
|
298
|
+
onVisible?.();
|
|
299
|
+
observer.disconnect();
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
{ threshold: 0.1 }
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
observer.observe(ref.current);
|
|
306
|
+
return () => observer.disconnect();
|
|
307
|
+
}, []);
|
|
308
|
+
|
|
309
|
+
return (
|
|
310
|
+
<View ref={ref}>
|
|
311
|
+
{isVisible ? children : <Placeholder />}
|
|
312
|
+
</View>
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
192
317
|
### Image Optimization
|
|
193
318
|
|
|
194
|
-
**
|
|
319
|
+
**expo-image v2 (Recommended for Expo SDK 54+)**
|
|
320
|
+
```typescript
|
|
321
|
+
// expo-image is the recommended solution for Expo projects
|
|
322
|
+
import { Image, useImage } from 'expo-image';
|
|
323
|
+
|
|
324
|
+
// Basic usage with blurhash placeholder
|
|
325
|
+
function OptimizedImage({ uri, blurhash }) {
|
|
326
|
+
return (
|
|
327
|
+
<Image
|
|
328
|
+
source={{ uri }}
|
|
329
|
+
placeholder={{ blurhash }}
|
|
330
|
+
contentFit="cover"
|
|
331
|
+
transition={200}
|
|
332
|
+
style={{ width: 100, height: 100 }}
|
|
333
|
+
cachePolicy="memory-disk" // Aggressive caching
|
|
334
|
+
/>
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Imperative loading with useImage hook (v2)
|
|
339
|
+
function PreloadedImage({ uri }) {
|
|
340
|
+
const image = useImage(uri, {
|
|
341
|
+
onError: (error) => console.error('Image load failed:', error),
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
if (!image) {
|
|
345
|
+
return <ActivityIndicator />;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return (
|
|
349
|
+
<Image
|
|
350
|
+
source={image}
|
|
351
|
+
style={{ width: image.width / 2, height: image.height / 2 }}
|
|
352
|
+
contentFit="cover"
|
|
353
|
+
/>
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**Fast Image for Bare RN Projects**
|
|
195
359
|
```javascript
|
|
360
|
+
// For bare React Native projects without Expo
|
|
196
361
|
// Install: npm install react-native-fast-image
|
|
197
362
|
import FastImage from 'react-native-fast-image';
|
|
198
363
|
|
|
@@ -202,8 +367,8 @@ function ProfilePicture({ uri }) {
|
|
|
202
367
|
style={{ width: 100, height: 100 }}
|
|
203
368
|
source={{
|
|
204
369
|
uri: uri,
|
|
205
|
-
priority: FastImage.priority.normal,
|
|
206
|
-
cache: FastImage.cacheControl.immutable
|
|
370
|
+
priority: FastImage.priority.normal,
|
|
371
|
+
cache: FastImage.cacheControl.immutable
|
|
207
372
|
}}
|
|
208
373
|
resizeMode={FastImage.resizeMode.cover}
|
|
209
374
|
/>
|
|
@@ -222,12 +387,14 @@ function ProfilePicture({ uri }) {
|
|
|
222
387
|
// Use local images when possible (bundled)
|
|
223
388
|
<Image source={require('./assets/logo.png')} />
|
|
224
389
|
|
|
225
|
-
// Progressive loading
|
|
226
|
-
import { Image } from '
|
|
390
|
+
// Progressive loading with blurhash
|
|
391
|
+
import { Image } from 'expo-image';
|
|
227
392
|
|
|
228
393
|
<Image
|
|
229
394
|
source={{ uri: imageUrl }}
|
|
230
|
-
|
|
395
|
+
placeholder={{ blurhash: 'LGF5]+Yk^6#M@-5c,1J5@[or[Q6.' }}
|
|
396
|
+
contentFit="cover"
|
|
397
|
+
transition={300}
|
|
231
398
|
style={{ width: 200, height: 200 }}
|
|
232
399
|
/>
|
|
233
400
|
```
|
|
@@ -429,6 +596,11 @@ Ask me when you need help with:
|
|
|
429
596
|
- Analyzing performance bottlenecks
|
|
430
597
|
- Using React.memo, useMemo, useCallback effectively
|
|
431
598
|
- Implementing 60fps animations
|
|
599
|
+
- **Configuring Hermes V1 for better performance**
|
|
600
|
+
- **Using React 19.2 Activity component for state preservation**
|
|
601
|
+
- **Implementing Intersection Observer for lazy loading**
|
|
602
|
+
- **Using Web Performance APIs for profiling**
|
|
603
|
+
- **Migrating to expo-image v2**
|
|
432
604
|
|
|
433
605
|
## Performance Monitoring
|
|
434
606
|
|
|
@@ -1,99 +1,121 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: react-native-setup
|
|
3
|
-
description: Expert in React Native environment setup
|
|
3
|
+
description: Expert in React Native 0.83+ and Expo SDK 54+ environment setup. Helps with Node.js 20+, Xcode 16.1+, Android Studio, watchman, CocoaPods, EAS Build, simulators, emulators, and troubleshooting. Activates for environment setup, installation issues, xcode setup, android studio, simulators, emulators, react-native init, expo init, development environment, SDK configuration, EAS Build, development builds.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# React Native Setup Expert
|
|
6
|
+
# React Native Setup Expert (2025)
|
|
7
7
|
|
|
8
|
-
Expert in React Native and Expo environment configuration across macOS, Windows, and Linux. Specializes in
|
|
8
|
+
Expert in React Native 0.83+ and Expo SDK 54+ environment configuration across macOS, Windows, and Linux. Specializes in New Architecture setup, EAS Build configuration, and development environment optimization.
|
|
9
9
|
|
|
10
10
|
## What I Know
|
|
11
11
|
|
|
12
|
-
### Prerequisites & Installation
|
|
12
|
+
### Prerequisites & Installation (2025 Requirements)
|
|
13
13
|
|
|
14
14
|
**Node.js & npm**
|
|
15
|
-
- Node.js
|
|
15
|
+
- **Node.js 20.x or later required** (Node 18 EOL April 2025)
|
|
16
|
+
- Node.js 22 LTS recommended for best performance
|
|
16
17
|
- Version verification: `node --version && npm --version`
|
|
17
|
-
-
|
|
18
|
-
-
|
|
18
|
+
- Package managers: npm, yarn, pnpm, bun all supported
|
|
19
|
+
- Corepack for yarn: `corepack enable && corepack prepare yarn@stable --activate`
|
|
19
20
|
|
|
20
21
|
**Xcode (macOS - iOS Development)**
|
|
21
|
-
- Xcode
|
|
22
|
-
-
|
|
22
|
+
- **Xcode 16.1 or later required** (minimum for RN 0.83)
|
|
23
|
+
- **Xcode 26 recommended** for iOS Liquid Glass support
|
|
24
|
+
- Command line tools: `xcode-select --install`
|
|
23
25
|
- License acceptance: `sudo xcodebuild -license accept`
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
+
- iOS 15.1+ deployment target (minimum supported)
|
|
27
|
+
- iOS 18+ for latest features, iOS 26 for Liquid Glass
|
|
26
28
|
|
|
27
29
|
**Android Studio (Android Development)**
|
|
28
|
-
- Android Studio
|
|
30
|
+
- **Android Studio Ladybug or later** (2024.2.1+)
|
|
29
31
|
- Required SDK components:
|
|
30
|
-
- Android SDK Platform
|
|
31
|
-
- Android SDK Build-Tools
|
|
32
|
+
- **Android SDK Platform 35** (API level 35)
|
|
33
|
+
- Android SDK Build-Tools 35.0.0
|
|
32
34
|
- Android Emulator
|
|
33
35
|
- Android SDK Platform-Tools
|
|
36
|
+
- **NDK 27.1.12297006** (for native modules)
|
|
37
|
+
- CMake 3.22.1+ (for Turbo Modules)
|
|
38
|
+
- **compileSdkVersion 35, targetSdkVersion 35, minSdkVersion 24**
|
|
34
39
|
- ANDROID_HOME environment variable setup
|
|
35
|
-
-
|
|
36
|
-
- Common Android Studio issues
|
|
40
|
+
- Edge-to-edge display support (Android 15+)
|
|
37
41
|
|
|
38
42
|
**Watchman**
|
|
39
43
|
- Installation via Homebrew (macOS): `brew install watchman`
|
|
40
|
-
- Purpose: File watching for fast refresh
|
|
41
|
-
-
|
|
42
|
-
- Cache clearing
|
|
44
|
+
- Purpose: File watching for fast refresh with Metro
|
|
45
|
+
- Critical for large codebases
|
|
46
|
+
- Cache clearing: `watchman watch-del-all`
|
|
43
47
|
|
|
44
48
|
### Environment Configuration
|
|
45
49
|
|
|
46
50
|
**iOS Setup**
|
|
47
|
-
- CocoaPods installation
|
|
48
|
-
- Pod install
|
|
49
|
-
- Xcode project configuration
|
|
51
|
+
- CocoaPods 1.15+ installation: `sudo gem install cocoapods`
|
|
52
|
+
- Pod install with New Architecture: `RCT_NEW_ARCH_ENABLED=1 pod install`
|
|
53
|
+
- Xcode project configuration for Fabric
|
|
50
54
|
- Provisioning profiles and certificates
|
|
51
55
|
- iOS Simulator management
|
|
52
56
|
- Device selection: `xcrun simctl list devices`
|
|
57
|
+
- Liquid Glass testing requires iOS 26 simulator
|
|
53
58
|
|
|
54
59
|
**Android Setup**
|
|
55
|
-
- Gradle
|
|
60
|
+
- Gradle 8.10+ (bundled with Android Studio Ladybug)
|
|
56
61
|
- Android SDK path configuration
|
|
57
62
|
- Environment variables (ANDROID_HOME, PATH)
|
|
58
|
-
- AVD
|
|
59
|
-
- Emulator
|
|
63
|
+
- AVD creation with API 35 images
|
|
64
|
+
- Emulator with edge-to-edge support
|
|
60
65
|
- ADB troubleshooting
|
|
66
|
+
- New Architecture: `newArchEnabled=true` in gradle.properties
|
|
61
67
|
|
|
62
68
|
**Metro Bundler**
|
|
63
69
|
- Port 8081 configuration
|
|
64
70
|
- Cache clearing: `npx react-native start --reset-cache`
|
|
65
|
-
-
|
|
66
|
-
-
|
|
71
|
+
- Metro config for New Architecture
|
|
72
|
+
- Symlink support for monorepos
|
|
73
|
+
- Custom resolver configuration
|
|
74
|
+
|
|
75
|
+
**EAS Build Setup (Expo)**
|
|
76
|
+
- Install EAS CLI: `npm install -g eas-cli`
|
|
77
|
+
- Login: `eas login`
|
|
78
|
+
- Configure: `eas build:configure`
|
|
79
|
+
- Development builds for custom native code
|
|
80
|
+
- EAS Update for OTA updates
|
|
67
81
|
|
|
68
82
|
### Common Setup Issues
|
|
69
83
|
|
|
70
84
|
**"Command not found" Errors**
|
|
71
|
-
- PATH configuration
|
|
85
|
+
- PATH configuration for Node, Android SDK, Xcode tools
|
|
72
86
|
- Shell profile updates (.zshrc, .bash_profile)
|
|
73
|
-
- Symlink issues
|
|
87
|
+
- Symlink issues with nvm/fnm
|
|
74
88
|
|
|
75
89
|
**SDK Not Found**
|
|
76
|
-
- SDK path verification
|
|
90
|
+
- SDK path verification: `echo $ANDROID_HOME`
|
|
77
91
|
- Environment variable troubleshooting
|
|
78
92
|
- SDK Manager reinstallation
|
|
93
|
+
- NDK path for native modules
|
|
79
94
|
|
|
80
95
|
**Pod Install Failures**
|
|
81
|
-
- CocoaPods version issues
|
|
82
|
-
- Ffi gem compilation errors
|
|
83
|
-
- Ruby version compatibility
|
|
96
|
+
- CocoaPods version issues (requires 1.15+)
|
|
97
|
+
- Ffi gem compilation errors on Apple Silicon
|
|
98
|
+
- Ruby version compatibility (use system Ruby or rbenv)
|
|
99
|
+
- New Architecture pod failures: clean and rebuild
|
|
84
100
|
- `pod deintegrate && pod install` strategy
|
|
85
101
|
|
|
86
102
|
**Build Failures**
|
|
87
|
-
- Clean build strategies
|
|
88
|
-
- Dependency conflicts
|
|
103
|
+
- Clean build strategies (see Pro Tips)
|
|
104
|
+
- Dependency conflicts with New Architecture
|
|
89
105
|
- Native module compilation errors
|
|
90
106
|
- Xcode derived data clearing
|
|
107
|
+
- Gradle cache corruption
|
|
108
|
+
|
|
109
|
+
**New Architecture Issues**
|
|
110
|
+
- Turbo Module not found: check codegen ran
|
|
111
|
+
- Fabric component not rendering: verify native setup
|
|
112
|
+
- Bridge module compatibility: use interop layer
|
|
91
113
|
|
|
92
114
|
## When to Use This Skill
|
|
93
115
|
|
|
94
116
|
Ask me when you need help with:
|
|
95
|
-
- Initial React Native environment setup
|
|
96
|
-
- Installing and configuring Xcode or Android Studio
|
|
117
|
+
- Initial React Native 0.83+ environment setup
|
|
118
|
+
- Installing and configuring Xcode 16.1+ or Android Studio Ladybug
|
|
97
119
|
- Setting up iOS simulators or Android emulators
|
|
98
120
|
- Troubleshooting "Command not found" errors
|
|
99
121
|
- Resolving SDK path or ANDROID_HOME issues
|
|
@@ -103,6 +125,10 @@ Ask me when you need help with:
|
|
|
103
125
|
- Troubleshooting build failures
|
|
104
126
|
- Setting up watchman for file watching
|
|
105
127
|
- Verifying development environment prerequisites
|
|
128
|
+
- **EAS Build configuration and troubleshooting**
|
|
129
|
+
- **New Architecture setup and migration**
|
|
130
|
+
- **Development build creation for custom native code**
|
|
131
|
+
- **Hermes V1 experimental setup**
|
|
106
132
|
|
|
107
133
|
## Quick Setup Commands
|
|
108
134
|
|
|
@@ -114,15 +140,15 @@ xcode-select --install
|
|
|
114
140
|
# Accept Xcode license
|
|
115
141
|
sudo xcodebuild -license accept
|
|
116
142
|
|
|
117
|
-
# Install CocoaPods
|
|
143
|
+
# Install CocoaPods (1.15+ required)
|
|
118
144
|
sudo gem install cocoapods
|
|
119
145
|
|
|
120
146
|
# Install watchman
|
|
121
147
|
brew install watchman
|
|
122
148
|
|
|
123
149
|
# Verify setup
|
|
124
|
-
xcodebuild -version
|
|
125
|
-
pod --version
|
|
150
|
+
xcodebuild -version # Should be 16.1+
|
|
151
|
+
pod --version # Should be 1.15+
|
|
126
152
|
watchman version
|
|
127
153
|
```
|
|
128
154
|
|
|
@@ -133,6 +159,9 @@ echo $ANDROID_HOME
|
|
|
133
159
|
adb --version
|
|
134
160
|
emulator -version
|
|
135
161
|
|
|
162
|
+
# Verify SDK version
|
|
163
|
+
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --list | grep "platforms;android-35"
|
|
164
|
+
|
|
136
165
|
# List available emulators
|
|
137
166
|
emulator -list-avds
|
|
138
167
|
|
|
@@ -140,16 +169,16 @@ emulator -list-avds
|
|
|
140
169
|
adb devices
|
|
141
170
|
```
|
|
142
171
|
|
|
143
|
-
### React Native Project
|
|
172
|
+
### React Native CLI Project
|
|
144
173
|
```bash
|
|
145
|
-
# Create new React Native project
|
|
146
|
-
npx react-native init MyProject
|
|
174
|
+
# Create new React Native project (New Architecture enabled by default)
|
|
175
|
+
npx @react-native-community/cli init MyProject
|
|
147
176
|
|
|
148
177
|
# Navigate to project
|
|
149
178
|
cd MyProject
|
|
150
179
|
|
|
151
|
-
# Install iOS dependencies
|
|
152
|
-
cd ios && pod install && cd ..
|
|
180
|
+
# Install iOS dependencies with New Architecture
|
|
181
|
+
cd ios && RCT_NEW_ARCH_ENABLED=1 pod install && cd ..
|
|
153
182
|
|
|
154
183
|
# Start Metro bundler
|
|
155
184
|
npm start
|
|
@@ -161,18 +190,39 @@ npm run ios
|
|
|
161
190
|
npm run android
|
|
162
191
|
```
|
|
163
192
|
|
|
193
|
+
### Expo Project (Recommended)
|
|
194
|
+
```bash
|
|
195
|
+
# Create new Expo project
|
|
196
|
+
npx create-expo-app@latest MyProject
|
|
197
|
+
|
|
198
|
+
# Navigate to project
|
|
199
|
+
cd MyProject
|
|
200
|
+
|
|
201
|
+
# Start development server
|
|
202
|
+
npx expo start
|
|
203
|
+
|
|
204
|
+
# Create development build (for custom native code)
|
|
205
|
+
npx expo install expo-dev-client
|
|
206
|
+
eas build --profile development --platform ios
|
|
207
|
+
eas build --profile development --platform android
|
|
208
|
+
```
|
|
209
|
+
|
|
164
210
|
## Pro Tips
|
|
165
211
|
|
|
166
212
|
1. **Clean Builds**: When in doubt, clean everything
|
|
167
213
|
```bash
|
|
168
|
-
# iOS
|
|
169
|
-
cd ios && rm -rf build Pods && pod install && cd ..
|
|
214
|
+
# iOS (nuclear option)
|
|
215
|
+
cd ios && rm -rf build Pods Podfile.lock && pod install && cd ..
|
|
170
216
|
|
|
171
217
|
# Android
|
|
172
218
|
cd android && ./gradlew clean && cd ..
|
|
173
219
|
|
|
174
|
-
# Metro
|
|
220
|
+
# Metro + Watchman
|
|
221
|
+
watchman watch-del-all
|
|
175
222
|
npx react-native start --reset-cache
|
|
223
|
+
|
|
224
|
+
# Expo
|
|
225
|
+
npx expo start --clear
|
|
176
226
|
```
|
|
177
227
|
|
|
178
228
|
2. **Environment Variables**: Always verify environment variables after changes
|
|
@@ -181,6 +231,7 @@ npm run android
|
|
|
181
231
|
export ANDROID_HOME=$HOME/Library/Android/sdk
|
|
182
232
|
export PATH=$PATH:$ANDROID_HOME/emulator
|
|
183
233
|
export PATH=$PATH:$ANDROID_HOME/platform-tools
|
|
234
|
+
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
|
|
184
235
|
|
|
185
236
|
# Reload shell
|
|
186
237
|
source ~/.zshrc
|
|
@@ -190,23 +241,68 @@ npm run android
|
|
|
190
241
|
```bash
|
|
191
242
|
# iOS
|
|
192
243
|
xcrun simctl list devices
|
|
193
|
-
xcrun simctl boot "iPhone
|
|
244
|
+
xcrun simctl boot "iPhone 16 Pro"
|
|
194
245
|
|
|
195
|
-
# Android
|
|
246
|
+
# Android (API 35 for edge-to-edge)
|
|
196
247
|
emulator -list-avds
|
|
197
|
-
emulator -avd
|
|
248
|
+
emulator -avd Pixel_8_API_35
|
|
198
249
|
```
|
|
199
250
|
|
|
200
251
|
4. **Quick Health Check**: Verify entire environment
|
|
201
252
|
```bash
|
|
202
|
-
node --version #
|
|
253
|
+
node --version # Should be 20+
|
|
203
254
|
npm --version # npm
|
|
204
|
-
xcodebuild -version #
|
|
205
|
-
pod --version #
|
|
255
|
+
xcodebuild -version # Should be 16.1+
|
|
256
|
+
pod --version # Should be 1.15+
|
|
206
257
|
adb --version # Android tools
|
|
207
258
|
watchman version # Watchman
|
|
259
|
+
eas --version # EAS CLI (Expo)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
5. **EAS Build Configuration**: Essential eas.json
|
|
263
|
+
```json
|
|
264
|
+
{
|
|
265
|
+
"build": {
|
|
266
|
+
"development": {
|
|
267
|
+
"developmentClient": true,
|
|
268
|
+
"distribution": "internal"
|
|
269
|
+
},
|
|
270
|
+
"preview": {
|
|
271
|
+
"distribution": "internal"
|
|
272
|
+
},
|
|
273
|
+
"production": {}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
6. **Hermes V1 (Experimental)**: Enable next-gen engine
|
|
279
|
+
```javascript
|
|
280
|
+
// metro.config.js
|
|
281
|
+
module.exports = {
|
|
282
|
+
transformer: {
|
|
283
|
+
hermesParser: true,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
208
286
|
```
|
|
209
287
|
|
|
288
|
+
```bash
|
|
289
|
+
# Verify Hermes is running
|
|
290
|
+
# In app: global.HermesInternal !== undefined
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Version Compatibility Matrix (2025)
|
|
294
|
+
|
|
295
|
+
| Component | Minimum | Recommended | Notes |
|
|
296
|
+
|-----------|---------|-------------|-------|
|
|
297
|
+
| Node.js | 20.x | 22 LTS | Node 18 EOL April 2025 |
|
|
298
|
+
| React Native | 0.76+ | 0.83 | New Arch default since 0.76 |
|
|
299
|
+
| React | 18.3+ | 19.2 | Activity, useEffectEvent |
|
|
300
|
+
| Expo SDK | 52+ | 54 | Native tabs, Liquid Glass |
|
|
301
|
+
| Xcode | 16.1 | 26 | iOS 26 for Liquid Glass |
|
|
302
|
+
| Android SDK | 34 | 35 | Edge-to-edge support |
|
|
303
|
+
| CocoaPods | 1.14 | 1.15+ | New Arch compatibility |
|
|
304
|
+
| Gradle | 8.6 | 8.10+ | K2 compiler support |
|
|
305
|
+
|
|
210
306
|
## Integration with SpecWeave
|
|
211
307
|
|
|
212
308
|
This skill integrates with SpecWeave's increment workflow:
|
|
@@ -214,3 +310,4 @@ This skill integrates with SpecWeave's increment workflow:
|
|
|
214
310
|
- Reference in `tasks.md` for setup-related acceptance criteria
|
|
215
311
|
- Include in `spec.md` for mobile-specific prerequisites
|
|
216
312
|
- Document setup issues in increment `reports/` folder
|
|
313
|
+
- Use mobile-architect agent for architecture decisions
|