@su-record/vibe 2.4.71 → 2.4.74
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.md +216 -215
- package/README.md +4 -4
- package/agents/research/best-practices-agent.md +13 -13
- package/agents/research/codebase-patterns-agent.md +33 -33
- package/agents/research/framework-docs-agent.md +23 -23
- package/agents/research/security-advisory-agent.md +29 -29
- package/agents/review/architecture-reviewer.md +31 -31
- package/agents/review/complexity-reviewer.md +21 -21
- package/agents/review/data-integrity-reviewer.md +29 -29
- package/agents/review/git-history-reviewer.md +24 -24
- package/agents/review/performance-reviewer.md +29 -29
- package/agents/review/python-reviewer.md +53 -53
- package/agents/review/rails-reviewer.md +40 -40
- package/agents/review/react-reviewer.md +40 -40
- package/agents/review/security-reviewer.md +29 -29
- package/agents/review/simplicity-reviewer.md +24 -24
- package/agents/review/test-coverage-reviewer.md +31 -31
- package/agents/review/typescript-reviewer.md +41 -41
- package/commands/vibe.analyze.md +103 -7
- package/commands/vibe.reason.md +106 -0
- package/commands/vibe.review.md +123 -38
- package/commands/vibe.run.md +286 -221
- package/commands/vibe.spec.md +293 -173
- package/commands/vibe.utils.md +104 -3
- package/commands/vibe.verify.md +179 -86
- package/dist/cli/detect.js +40 -40
- package/dist/cli/detect.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/llm.js +5 -5
- package/dist/cli/llm.js.map +1 -1
- package/dist/cli/setup.js +3 -3
- package/dist/cli/setup.js.map +1 -1
- package/dist/lib/ContextCompressor.js +1 -1
- package/dist/lib/ContextCompressor.js.map +1 -1
- package/dist/lib/gemini-api.js +12 -12
- package/dist/lib/gemini-api.js.map +1 -1
- package/dist/lib/gemini-oauth.js +22 -22
- package/dist/lib/gemini-oauth.js.map +1 -1
- package/dist/lib/gemini-storage.js +3 -3
- package/dist/lib/gemini-storage.js.map +1 -1
- package/dist/lib/gpt-api.js +11 -11
- package/dist/lib/gpt-api.js.map +1 -1
- package/dist/lib/gpt-oauth.js +28 -28
- package/dist/lib/gpt-oauth.js.map +1 -1
- package/dist/lib/gpt-storage.js +3 -3
- package/dist/lib/gpt-storage.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +4 -6
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/tools/convention/analyzeComplexity.js +3 -3
- package/dist/tools/convention/analyzeComplexity.js.map +1 -1
- package/dist/tools/convention/applyQualityRules.js +1 -1
- package/dist/tools/convention/applyQualityRules.js.map +1 -1
- package/dist/tools/convention/checkCouplingCohesion.js +2 -2
- package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
- package/dist/tools/convention/suggestImprovements.js +1 -1
- package/dist/tools/convention/suggestImprovements.js.map +1 -1
- package/dist/tools/convention/validateCodeQuality.js +1 -1
- package/dist/tools/convention/validateCodeQuality.js.map +1 -1
- package/dist/tools/memory/autoSaveContext.js +1 -1
- package/dist/tools/memory/autoSaveContext.js.map +1 -1
- package/dist/tools/memory/createMemoryTimeline.js +27 -27
- package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
- package/dist/tools/memory/deleteMemory.js +1 -1
- package/dist/tools/memory/deleteMemory.js.map +1 -1
- package/dist/tools/memory/getMemoryGraph.js +24 -24
- package/dist/tools/memory/getMemoryGraph.js.map +1 -1
- package/dist/tools/memory/getSessionContext.js +36 -36
- package/dist/tools/memory/getSessionContext.js.map +1 -1
- package/dist/tools/memory/linkMemories.js +21 -21
- package/dist/tools/memory/linkMemories.js.map +1 -1
- package/dist/tools/memory/prioritizeMemory.js +1 -1
- package/dist/tools/memory/prioritizeMemory.js.map +1 -1
- package/dist/tools/memory/restoreSessionContext.js +1 -1
- package/dist/tools/memory/restoreSessionContext.js.map +1 -1
- package/dist/tools/memory/searchMemories.js +1 -1
- package/dist/tools/memory/searchMemories.js.map +1 -1
- package/dist/tools/memory/searchMemoriesAdvanced.js +42 -42
- package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
- package/dist/tools/memory/startSession.js +2 -2
- package/dist/tools/memory/startSession.js.map +1 -1
- package/dist/tools/memory/updateMemory.js +1 -1
- package/dist/tools/memory/updateMemory.js.map +1 -1
- package/dist/tools/semantic/analyzeDependencyGraph.js +38 -38
- package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
- package/dist/tools/semantic/findReferences.js +1 -1
- package/dist/tools/semantic/findReferences.js.map +1 -1
- package/dist/tools/semantic/findSymbol.js +1 -1
- package/dist/tools/semantic/findSymbol.js.map +1 -1
- package/dist/tools/time/getCurrentTime.js +1 -1
- package/dist/tools/time/getCurrentTime.js.map +1 -1
- package/dist/tools/ui/previewUiAscii.js +2 -2
- package/dist/tools/ui/previewUiAscii.js.map +1 -1
- package/hooks/hooks.json +11 -2
- package/hooks/scripts/llm-orchestrate.js +1 -1
- package/hooks/scripts/utils.js +31 -6
- package/languages/csharp-unity.md +82 -83
- package/languages/dart-flutter.md +89 -88
- package/languages/go.md +76 -75
- package/languages/java-spring.md +85 -84
- package/languages/kotlin-android.md +64 -63
- package/languages/python-django.md +83 -82
- package/languages/python-fastapi.md +82 -81
- package/languages/rust.md +75 -74
- package/languages/swift-ios.md +73 -72
- package/languages/typescript-electron.md +70 -71
- package/languages/typescript-nextjs.md +93 -92
- package/languages/typescript-node.md +64 -63
- package/languages/typescript-nuxt.md +113 -112
- package/languages/typescript-react-native.md +82 -81
- package/languages/typescript-react.md +76 -75
- package/languages/typescript-tauri.md +74 -75
- package/languages/typescript-vue.md +73 -72
- package/package.json +1 -1
- package/skills/git-worktree.md +25 -25
- package/skills/multi-llm-orchestration.md +4 -6
- package/skills/priority-todos.md +39 -39
- package/skills/vibe-capabilities.md +2 -2
- package/vibe/config.json +2 -2
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# TypeScript + React Native Quality Rules
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Core Principles (inherited from core + React)
|
|
4
4
|
|
|
5
5
|
```markdown
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
# Core Principles (inherited from core + React)
|
|
7
|
+
Single Responsibility (SRP)
|
|
8
|
+
No Duplication (DRY)
|
|
9
|
+
Reusability
|
|
10
|
+
Low Complexity
|
|
11
|
+
Function <= 30 lines, JSX <= 50 lines
|
|
12
|
+
All React rules apply
|
|
12
13
|
```
|
|
13
14
|
|
|
14
|
-
## React Native
|
|
15
|
+
## React Native Specific Rules
|
|
15
16
|
|
|
16
|
-
### 1.
|
|
17
|
+
### 1. Platform-specific Code Separation
|
|
17
18
|
|
|
18
19
|
```typescript
|
|
19
|
-
//
|
|
20
|
-
Button.ios.tsx // iOS
|
|
21
|
-
Button.android.tsx // Android
|
|
22
|
-
Button.tsx //
|
|
20
|
+
// Good: Separate by file extension
|
|
21
|
+
Button.ios.tsx // iOS only
|
|
22
|
+
Button.android.tsx // Android only
|
|
23
|
+
Button.tsx // Common
|
|
23
24
|
|
|
24
|
-
//
|
|
25
|
+
// Good: Using Platform API
|
|
25
26
|
import { Platform, StyleSheet } from 'react-native';
|
|
26
27
|
|
|
27
28
|
const styles = StyleSheet.create({
|
|
@@ -39,21 +40,21 @@ const styles = StyleSheet.create({
|
|
|
39
40
|
},
|
|
40
41
|
});
|
|
41
42
|
|
|
42
|
-
//
|
|
43
|
+
// Good: Platform.OS check
|
|
43
44
|
if (Platform.OS === 'ios') {
|
|
44
|
-
// iOS
|
|
45
|
+
// iOS specific logic
|
|
45
46
|
} else if (Platform.OS === 'android') {
|
|
46
|
-
// Android
|
|
47
|
+
// Android specific logic
|
|
47
48
|
}
|
|
48
49
|
```
|
|
49
50
|
|
|
50
|
-
### 2. StyleSheet
|
|
51
|
+
### 2. Use StyleSheet (Avoid Inline Styles)
|
|
51
52
|
|
|
52
53
|
```typescript
|
|
53
|
-
//
|
|
54
|
+
// Bad: Inline style (performance degradation)
|
|
54
55
|
<View style={{ flex: 1, padding: 16, backgroundColor: '#fff' }} />
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
+
// Good: StyleSheet (optimized)
|
|
57
58
|
import { StyleSheet } from 'react-native';
|
|
58
59
|
|
|
59
60
|
const styles = StyleSheet.create({
|
|
@@ -66,18 +67,18 @@ const styles = StyleSheet.create({
|
|
|
66
67
|
|
|
67
68
|
<View style={styles.container} />
|
|
68
69
|
|
|
69
|
-
//
|
|
70
|
+
// Good: Conditional styles
|
|
70
71
|
<View style={[
|
|
71
72
|
styles.container,
|
|
72
73
|
isActive && styles.active,
|
|
73
|
-
{ marginTop: offset }, //
|
|
74
|
+
{ marginTop: offset }, // Inline only for dynamic values
|
|
74
75
|
]} />
|
|
75
76
|
```
|
|
76
77
|
|
|
77
|
-
### 3. FlatList
|
|
78
|
+
### 3. FlatList Optimization
|
|
78
79
|
|
|
79
80
|
```typescript
|
|
80
|
-
//
|
|
81
|
+
// Good: FlatList performance optimization
|
|
81
82
|
interface User {
|
|
82
83
|
id: string;
|
|
83
84
|
name: string;
|
|
@@ -96,23 +97,23 @@ const UserList = ({ users }: { users: User[] }) => {
|
|
|
96
97
|
data={users}
|
|
97
98
|
renderItem={renderItem}
|
|
98
99
|
keyExtractor={keyExtractor}
|
|
99
|
-
//
|
|
100
|
+
// Performance optimization options
|
|
100
101
|
removeClippedSubviews={true}
|
|
101
102
|
maxToRenderPerBatch={10}
|
|
102
103
|
updateCellsBatchingPeriod={50}
|
|
103
104
|
initialNumToRender={10}
|
|
104
105
|
windowSize={5}
|
|
105
|
-
//
|
|
106
|
+
// Sticky header
|
|
106
107
|
stickyHeaderIndices={[0]}
|
|
107
|
-
//
|
|
108
|
+
// List separator
|
|
108
109
|
ItemSeparatorComponent={() => <View style={styles.separator} />}
|
|
109
|
-
//
|
|
110
|
+
// Empty state
|
|
110
111
|
ListEmptyComponent={<EmptyState />}
|
|
111
112
|
/>
|
|
112
113
|
);
|
|
113
114
|
};
|
|
114
115
|
|
|
115
|
-
//
|
|
116
|
+
// Good: UserCard memoization
|
|
116
117
|
const UserCard = React.memo<{ user: User }>(({ user }) => {
|
|
117
118
|
return (
|
|
118
119
|
<View style={styles.card}>
|
|
@@ -126,11 +127,11 @@ const UserCard = React.memo<{ user: User }>(({ user }) => {
|
|
|
126
127
|
### 4. Navigation (React Navigation)
|
|
127
128
|
|
|
128
129
|
```typescript
|
|
129
|
-
//
|
|
130
|
+
// Good: Type-safe navigation
|
|
130
131
|
import { NavigationContainer } from '@react-navigation/native';
|
|
131
132
|
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
132
133
|
|
|
133
|
-
//
|
|
134
|
+
// Navigation type definition
|
|
134
135
|
type RootStackParamList = {
|
|
135
136
|
Home: undefined;
|
|
136
137
|
UserProfile: { userId: string };
|
|
@@ -151,7 +152,7 @@ function App() {
|
|
|
151
152
|
);
|
|
152
153
|
}
|
|
153
154
|
|
|
154
|
-
//
|
|
155
|
+
// Good: Type-safe navigation hook
|
|
155
156
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
|
|
156
157
|
import { useNavigation } from '@react-navigation/native';
|
|
157
158
|
|
|
@@ -164,19 +165,19 @@ function HomeScreen() {
|
|
|
164
165
|
const navigation = useNavigation<HomeScreenNavigationProp>();
|
|
165
166
|
|
|
166
167
|
const navigateToProfile = (userId: string) => {
|
|
167
|
-
navigation.navigate('UserProfile', { userId }); //
|
|
168
|
+
navigation.navigate('UserProfile', { userId }); // Type safe
|
|
168
169
|
};
|
|
169
170
|
|
|
170
171
|
return <Button onPress={() => navigateToProfile('123')} title="Profile" />;
|
|
171
172
|
}
|
|
172
173
|
```
|
|
173
174
|
|
|
174
|
-
### 5. AsyncStorage (
|
|
175
|
+
### 5. AsyncStorage (Data Persistence)
|
|
175
176
|
|
|
176
177
|
```typescript
|
|
177
178
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
178
179
|
|
|
179
|
-
//
|
|
180
|
+
// Good: Type-safe Storage wrapper
|
|
180
181
|
class Storage {
|
|
181
182
|
static async set<T>(key: string, value: T): Promise<void> {
|
|
182
183
|
await AsyncStorage.setItem(key, JSON.stringify(value));
|
|
@@ -192,7 +193,7 @@ class Storage {
|
|
|
192
193
|
}
|
|
193
194
|
}
|
|
194
195
|
|
|
195
|
-
//
|
|
196
|
+
// Usage
|
|
196
197
|
interface User {
|
|
197
198
|
id: string;
|
|
198
199
|
name: string;
|
|
@@ -202,13 +203,13 @@ await Storage.set<User>('user', { id: '123', name: 'John' });
|
|
|
202
203
|
const user = await Storage.get<User>('user');
|
|
203
204
|
```
|
|
204
205
|
|
|
205
|
-
### 6.
|
|
206
|
+
### 6. Image Optimization
|
|
206
207
|
|
|
207
208
|
```typescript
|
|
208
209
|
import { Image } from 'react-native';
|
|
209
210
|
import FastImage from 'react-native-fast-image';
|
|
210
211
|
|
|
211
|
-
//
|
|
212
|
+
// Good: Use FastImage (caching, performance)
|
|
212
213
|
<FastImage
|
|
213
214
|
source={{
|
|
214
215
|
uri: user.avatar,
|
|
@@ -218,10 +219,10 @@ import FastImage from 'react-native-fast-image';
|
|
|
218
219
|
resizeMode={FastImage.resizeMode.cover}
|
|
219
220
|
/>
|
|
220
221
|
|
|
221
|
-
//
|
|
222
|
+
// Good: Local image
|
|
222
223
|
<Image source={require('./assets/logo.png')} style={styles.logo} />
|
|
223
224
|
|
|
224
|
-
//
|
|
225
|
+
// Good: Conditional loading
|
|
225
226
|
{imageUrl && (
|
|
226
227
|
<Image
|
|
227
228
|
source={{ uri: imageUrl }}
|
|
@@ -230,12 +231,12 @@ import FastImage from 'react-native-fast-image';
|
|
|
230
231
|
)}
|
|
231
232
|
```
|
|
232
233
|
|
|
233
|
-
### 7. SafeAreaView (
|
|
234
|
+
### 7. SafeAreaView (Safe Areas)
|
|
234
235
|
|
|
235
236
|
```typescript
|
|
236
237
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
237
238
|
|
|
238
|
-
//
|
|
239
|
+
// Good: Use SafeAreaView (notch/status bar handling)
|
|
239
240
|
function Screen() {
|
|
240
241
|
return (
|
|
241
242
|
<SafeAreaView style={styles.container} edges={['top', 'bottom']}>
|
|
@@ -244,7 +245,7 @@ function Screen() {
|
|
|
244
245
|
);
|
|
245
246
|
}
|
|
246
247
|
|
|
247
|
-
//
|
|
248
|
+
// Good: useSafeAreaInsets hook
|
|
248
249
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
249
250
|
|
|
250
251
|
function CustomHeader() {
|
|
@@ -258,20 +259,20 @@ function CustomHeader() {
|
|
|
258
259
|
}
|
|
259
260
|
```
|
|
260
261
|
|
|
261
|
-
### 8. Hooks
|
|
262
|
+
### 8. Hooks Optimization
|
|
262
263
|
|
|
263
264
|
```typescript
|
|
264
|
-
//
|
|
265
|
+
// Good: useCallback (event handlers)
|
|
265
266
|
const handlePress = useCallback(() => {
|
|
266
267
|
navigation.navigate('UserProfile', { userId });
|
|
267
268
|
}, [navigation, userId]);
|
|
268
269
|
|
|
269
|
-
//
|
|
270
|
+
// Good: useMemo (expensive calculations)
|
|
270
271
|
const sortedUsers = useMemo(() => {
|
|
271
272
|
return users.sort((a, b) => a.name.localeCompare(b.name));
|
|
272
273
|
}, [users]);
|
|
273
274
|
|
|
274
|
-
//
|
|
275
|
+
// Good: Custom Hook (logic reuse)
|
|
275
276
|
function useKeyboard() {
|
|
276
277
|
const [isVisible, setIsVisible] = useState(false);
|
|
277
278
|
|
|
@@ -293,13 +294,13 @@ function useKeyboard() {
|
|
|
293
294
|
}
|
|
294
295
|
```
|
|
295
296
|
|
|
296
|
-
### 9.
|
|
297
|
+
### 9. Permission Handling
|
|
297
298
|
|
|
298
299
|
```typescript
|
|
299
300
|
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions';
|
|
300
301
|
import { Platform } from 'react-native';
|
|
301
302
|
|
|
302
|
-
//
|
|
303
|
+
// Good: Permission check and request
|
|
303
304
|
async function requestCameraPermission(): Promise<boolean> {
|
|
304
305
|
const permission =
|
|
305
306
|
Platform.OS === 'ios'
|
|
@@ -315,7 +316,7 @@ async function requestCameraPermission(): Promise<boolean> {
|
|
|
315
316
|
const requested = await request(permission);
|
|
316
317
|
return requested === RESULTS.GRANTED;
|
|
317
318
|
case RESULTS.BLOCKED:
|
|
318
|
-
//
|
|
319
|
+
// Guide to settings
|
|
319
320
|
return false;
|
|
320
321
|
default:
|
|
321
322
|
return false;
|
|
@@ -323,10 +324,10 @@ async function requestCameraPermission(): Promise<boolean> {
|
|
|
323
324
|
}
|
|
324
325
|
```
|
|
325
326
|
|
|
326
|
-
### 10.
|
|
327
|
+
### 10. Error Boundary
|
|
327
328
|
|
|
328
329
|
```typescript
|
|
329
|
-
//
|
|
330
|
+
// Good: React Native Error Boundary
|
|
330
331
|
import React, { Component, ErrorInfo, ReactNode } from 'react';
|
|
331
332
|
import { View, Text, Button } from 'react-native';
|
|
332
333
|
|
|
@@ -351,7 +352,7 @@ class ErrorBoundary extends Component<Props, State> {
|
|
|
351
352
|
|
|
352
353
|
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
353
354
|
console.error('Error caught:', error, errorInfo);
|
|
354
|
-
//
|
|
355
|
+
// Error logging service (Sentry etc.)
|
|
355
356
|
}
|
|
356
357
|
|
|
357
358
|
handleReset = () => {
|
|
@@ -373,18 +374,18 @@ class ErrorBoundary extends Component<Props, State> {
|
|
|
373
374
|
}
|
|
374
375
|
```
|
|
375
376
|
|
|
376
|
-
##
|
|
377
|
+
## Anti-patterns
|
|
377
378
|
|
|
378
379
|
```typescript
|
|
379
|
-
//
|
|
380
|
+
// Bad: ScrollView for long lists
|
|
380
381
|
<ScrollView>
|
|
381
382
|
{users.map(user => <UserCard key={user.id} user={user} />)}
|
|
382
383
|
</ScrollView>
|
|
383
384
|
|
|
384
|
-
//
|
|
385
|
+
// Good: Use FlatList
|
|
385
386
|
<FlatList data={users} renderItem={renderItem} />
|
|
386
387
|
|
|
387
|
-
//
|
|
388
|
+
// Bad: Nested FlatList (performance degradation)
|
|
388
389
|
<FlatList
|
|
389
390
|
data={categories}
|
|
390
391
|
renderItem={({ item }) => (
|
|
@@ -392,17 +393,17 @@ class ErrorBoundary extends Component<Props, State> {
|
|
|
392
393
|
)}
|
|
393
394
|
/>
|
|
394
395
|
|
|
395
|
-
//
|
|
396
|
+
// Good: Single FlatList + sections
|
|
396
397
|
<SectionList sections={sections} renderItem={renderItem} />
|
|
397
398
|
|
|
398
|
-
//
|
|
399
|
+
// Bad: Async setState in useEffect cleanup
|
|
399
400
|
useEffect(() => {
|
|
400
401
|
return () => {
|
|
401
|
-
setData(null); //
|
|
402
|
+
setData(null); // Bad: setState after unmount
|
|
402
403
|
};
|
|
403
404
|
}, []);
|
|
404
405
|
|
|
405
|
-
//
|
|
406
|
+
// Good: isMounted check
|
|
406
407
|
useEffect(() => {
|
|
407
408
|
let isMounted = true;
|
|
408
409
|
|
|
@@ -416,31 +417,31 @@ useEffect(() => {
|
|
|
416
417
|
}, []);
|
|
417
418
|
```
|
|
418
419
|
|
|
419
|
-
##
|
|
420
|
+
## Performance Optimization Tools
|
|
420
421
|
|
|
421
422
|
```bash
|
|
422
|
-
# Flipper (
|
|
423
|
+
# Flipper (debugging)
|
|
423
424
|
npx react-native-flipper
|
|
424
425
|
|
|
425
|
-
# Bundle
|
|
426
|
+
# Bundle analysis
|
|
426
427
|
npx react-native bundle --platform android --dev false \
|
|
427
428
|
--entry-file index.js --bundle-output android.bundle
|
|
428
429
|
|
|
429
|
-
#
|
|
430
|
+
# Memory profiling (use Flipper)
|
|
430
431
|
```
|
|
431
432
|
|
|
432
|
-
##
|
|
433
|
-
|
|
434
|
-
React Native
|
|
435
|
-
|
|
436
|
-
- [ ] StyleSheet
|
|
437
|
-
- [ ] FlatList
|
|
438
|
-
- [ ] Platform
|
|
439
|
-
- [ ]
|
|
440
|
-
- [ ] SafeAreaView
|
|
441
|
-
- [ ] FastImage
|
|
442
|
-
- [ ] useCallback/useMemo
|
|
443
|
-
- [ ]
|
|
444
|
-
- [ ] Error Boundary
|
|
445
|
-
- [ ] AsyncStorage
|
|
446
|
-
- [ ]
|
|
433
|
+
## Checklist
|
|
434
|
+
|
|
435
|
+
When writing React Native code:
|
|
436
|
+
|
|
437
|
+
- [ ] Use StyleSheet (avoid inline)
|
|
438
|
+
- [ ] FlatList optimization (long lists)
|
|
439
|
+
- [ ] Platform branching
|
|
440
|
+
- [ ] Type-safe Navigation
|
|
441
|
+
- [ ] Use SafeAreaView
|
|
442
|
+
- [ ] Use FastImage (images)
|
|
443
|
+
- [ ] useCallback/useMemo optimization
|
|
444
|
+
- [ ] Permission handling (camera, location, etc.)
|
|
445
|
+
- [ ] Apply Error Boundary
|
|
446
|
+
- [ ] AsyncStorage type wrapper
|
|
447
|
+
- [ ] Complexity <= 10
|