@shaykec/app-agent 1.0.9 → 1.0.11
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/catalog-analyzer.md +57 -0
- package/.claude/skills/android-customizer/SKILL.md +23 -10
- package/.claude/skills/bug-fixer/SKILL.md +59 -0
- package/.claude/skills/catalog-analyzer/SKILL.md +96 -0
- package/.claude/skills/customization-planner/SKILL.md +44 -5
- package/.claude/skills/design-selector/SKILL.md +3 -1
- package/.claude/skills/design-system/SKILL.md +1 -1
- package/.claude/skills/exploratory-tester/SKILL.md +82 -0
- package/.claude/skills/ios-customizer/SKILL.md +29 -8
- package/.claude/skills/module-integrator/SKILL.md +1 -1
- package/.claude/skills/react-native-customizer/SKILL.md +22 -10
- package/.claude/skills/test-planner/SKILL.md +72 -0
- package/.cursor/agents/README.md +3 -1
- package/.cursor/agents/catalog-analyzer.md +83 -0
- package/.cursor/rules/safety-guardrails.mdc +1 -1
- package/.cursor/rules/workflow.mdc +52 -18
- package/.cursor/skills/android-customizer/SKILL.md +43 -19
- package/.cursor/skills/bug-fixer/SKILL.md +189 -0
- package/.cursor/skills/catalog-analyzer/SKILL.md +222 -0
- package/.cursor/skills/customization-planner/SKILL.md +55 -8
- package/.cursor/skills/design-selector/SKILL.md +6 -5
- package/.cursor/skills/design-system/SKILL.md +8 -7
- package/.cursor/skills/exploratory-tester/SKILL.md +223 -0
- package/.cursor/skills/ios-customizer/SKILL.md +47 -12
- package/.cursor/skills/module-integrator/SKILL.md +2 -2
- package/.cursor/skills/output-validator/SKILL.md +1 -1
- package/.cursor/skills/react-native-customizer/SKILL.md +46 -16
- package/.cursor/skills/test-planner/SKILL.md +199 -0
- package/.cursor/skills/web-analyzer/SKILL.md +310 -0
- package/.cursor/skills/web-crawler/SKILL.md +252 -0
- package/AGENTS.md +32 -11
- package/CLAUDE.md +78 -33
- package/README.md +77 -11
- package/designs/DESIGN_CATALOG.md +17 -15
- package/designs/DESIGN_PRINCIPLES.md +53 -0
- package/designs/brands/accessible-high-contrast.md +14 -0
- package/designs/brands/corporate-professional.md +14 -0
- package/designs/brands/dark-luxe.md +14 -0
- package/designs/brands/kids-playful.md +14 -0
- package/designs/brands/medical-clinical.md +14 -0
- package/designs/brands/modern-minimal.md +14 -0
- package/designs/brands/nature-organic.md +14 -0
- package/designs/brands/neo-brutalist.md +14 -0
- package/designs/brands/retro-vintage.md +14 -0
- package/designs/brands/soft-gradient.md +14 -0
- package/designs/brands/sport-athletic.md +14 -0
- package/designs/brands/tech-dynamic.md +14 -0
- package/designs/brands/vibrant-playful.md +14 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/engines/claude-engine.d.ts.map +1 -1
- package/dist/engines/claude-engine.js +16 -4
- package/dist/engines/claude-engine.js.map +1 -1
- package/dist/engines/types.d.ts +1 -1
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/engines/types.js +31 -2
- package/dist/engines/types.js.map +1 -1
- package/dist/github.d.ts +3 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +47 -4
- package/dist/github.js.map +1 -1
- package/dist/index.js +294 -16
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +17 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +272 -1
- package/dist/prompt-builder.js.map +1 -1
- package/dist/validator.d.ts +7 -2
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +61 -41
- package/dist/validator.js.map +1 -1
- package/dist/workspace.js +2 -2
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -4
- package/prompts/agent-prompt.md +35 -18
- package/prompts/deep-test-agent-prompt.md +122 -0
- package/prompts/fix-agent-prompt.md +90 -0
- package/prompts/quick-agent-prompt.md +32 -2
- package/prompts/scratch-agent-prompt.md +5 -8
- package/prompts/web-clone-agent-prompt.md +179 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +1 -1
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/MainScreen.kt +1 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/navigation/MainNavigation.kt +5 -1
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/MotionPreferencesScreen.kt +3 -3
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/navigation/Navigation.kt +1 -1
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/settings/SettingsScreen.kt +1 -1
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +3 -2
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/settings/SettingsScreen.kt +1 -1
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +3 -2
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/Skeleton/tests/03_detail_screen.yaml +1 -1
- package/templates/android/Skeleton/tests/04_favorites.yaml +1 -1
- package/templates/android/Skeleton/tests/08_full_e2e.yaml +7 -1
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/settings/SettingsScreen.kt +3 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/ios/BookTemplate/BookTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +1 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +13 -0
- package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +32 -20
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Strings.swift +42 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +36 -30
- package/templates/ios/GameTemplate/GameTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +12 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingView.swift +2 -37
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/Skeleton/Skeleton/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/Skeleton/tests/08_full_e2e.yaml +4 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/react-native/BookTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/BookTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/BookTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/ChatTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ChatTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ChatTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/DashTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/DashTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/DashTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/FamilyTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/FamilyTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/FamilyTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/FinanceTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/FinanceTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/FinanceTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/GameTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/GameTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/GameTemplate/src/screens/GameDetail/GameDetailScreen.tsx +2 -1
- package/templates/react-native/GameTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/HealthTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/HealthTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/HealthTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/HealthTemplate/src/screens/WorkoutDetail/WorkoutDetailScreen.tsx +1 -1
- package/templates/react-native/LearnTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/LearnTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/LearnTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/MapTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/MapTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/MapTemplate/src/screens/Map/MapScreen.tsx +14 -0
- package/templates/react-native/MapTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/MediaTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/MediaTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/MediaTemplate/src/screens/PlaylistDetail/PlaylistDetailScreen.tsx +1 -1
- package/templates/react-native/MediaTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/ReferenceTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ReferenceTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ReferenceTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
- package/templates/react-native/ShopTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ShopTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ShopTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/Skeleton/TESTING_MANIFEST.md +1 -1
- package/templates/react-native/Skeleton/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/Skeleton/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/Skeleton/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/Skeleton/tests/07_profile.yaml +3 -2
- package/templates/react-native/Skeleton/tests/08_full_e2e.yaml +12 -1
- package/templates/react-native/SocialTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/SocialTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/SocialTemplate/src/screens/Feed/FeedScreen.tsx +1 -0
- package/templates/react-native/SocialTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/TaskTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/TaskTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/TaskTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/TrackTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/TrackTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/TrackTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
- package/templates/shared/ios/AnimatedTransitions/AnimatedTransitionsView.swift +233 -93
- package/.claude/agents/template-selector.md +0 -39
- package/.claude/skills/module-selector/SKILL.md +0 -81
- package/.claude/skills/template-selector/SKILL.md +0 -44
- package/.cursor/agents/template-selector.md +0 -52
- package/.cursor/skills/module-selector/SKILL.md +0 -135
- package/.cursor/skills/template-selector/SKILL.md +0 -123
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: catalog-analyzer
|
|
3
|
+
description: Selects the best template from CATALOG.md and shared modules from MODULES_CATALOG.md in one pass. Uses selected template to boost module accuracy via "Relevant Templates" column.
|
|
4
|
+
tools: Read, Grep, Glob, LS
|
|
5
|
+
model: haiku
|
|
6
|
+
permissionMode: plan
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are a specialised subagent for selecting the best mobile app template AND shared modules.
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
### Phase 1 — Template Selection
|
|
14
|
+
|
|
15
|
+
1. Read `templates/CATALOG.md` thoroughly
|
|
16
|
+
2. Evaluate each template: score against keywords, check match criteria, apply exclusion rules, check hybrid table
|
|
17
|
+
3. Choose exactly ONE primary template
|
|
18
|
+
|
|
19
|
+
### Phase 2 — Module Selection
|
|
20
|
+
|
|
21
|
+
4. Read `templates/shared/MODULES_CATALOG.md`
|
|
22
|
+
5. Match by keywords + check "Relevant Templates" against selected template (boost signal)
|
|
23
|
+
6. Apply BaaS heuristics (Firebase vs Supabase vs none)
|
|
24
|
+
7. Check dependencies, add missing ones
|
|
25
|
+
8. Apply animation heuristics if needed
|
|
26
|
+
9. Aim for 5-15 modules
|
|
27
|
+
|
|
28
|
+
## Output Format
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
SELECTED TEMPLATE: {TemplateName}
|
|
32
|
+
CONFIDENCE: high | medium | low
|
|
33
|
+
REASONING: {1-2 sentence explanation}
|
|
34
|
+
BORROW FROM: {other template name, if hybrid} or "none"
|
|
35
|
+
HYBRID NOTES: {what to borrow and why} or "n/a"
|
|
36
|
+
|
|
37
|
+
SELECTED MODULES ({N} total):
|
|
38
|
+
- {ModuleName}: {reason} [template boost: yes/no]
|
|
39
|
+
- ...
|
|
40
|
+
|
|
41
|
+
EXCLUDED MODULES:
|
|
42
|
+
- {ModuleName}: {reason for exclusion}
|
|
43
|
+
- ...
|
|
44
|
+
|
|
45
|
+
DEPENDENCIES ADDED:
|
|
46
|
+
- {ModuleName}: required by {other module}
|
|
47
|
+
- ...
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Rules
|
|
51
|
+
|
|
52
|
+
- Always recommend exactly ONE primary template
|
|
53
|
+
- Do NOT recommend building from scratch
|
|
54
|
+
- Features covered by modules don't affect template scoring
|
|
55
|
+
- No auto-include — every module must match via keywords
|
|
56
|
+
- "Relevant Templates" is a boost, not a hard filter
|
|
57
|
+
- Aim for 5-15 modules
|
|
@@ -102,7 +102,19 @@ Android templates use Material 3 dynamic theming in `Theme.kt`:
|
|
|
102
102
|
- Apply typography scale if the design brief specifies custom fonts
|
|
103
103
|
- Apply shape theme (corner radius) from the design brief
|
|
104
104
|
|
|
105
|
-
### Step 5.5 —
|
|
105
|
+
### Step 5.5 — Visual Polish Application
|
|
106
|
+
|
|
107
|
+
Apply the **Visual Polish Plan** from the manifest. MANDATORY for every build.
|
|
108
|
+
|
|
109
|
+
1. **Shadows/Elevation**: `Card(elevation = CardDefaults.cardElevation(defaultElevation = 4.dp))` on all cards. 8dp for FABs.
|
|
110
|
+
2. **Gradients**: `Brush.linearGradient(listOf(Primary, Secondary))` on hero sections and CTAs.
|
|
111
|
+
3. **Press feedback**: `Modifier.scaleOnPress()` or clickable scale animation (0.95). Haptic via `HapticFeedbackConstants.CONFIRM`.
|
|
112
|
+
4. **Staggered animations**: `Modifier.staggeredAppear(index)` on all LazyColumn/LazyRow items.
|
|
113
|
+
5. **Empty states**: Gradient circle behind icon + slide-in animation.
|
|
114
|
+
6. **Material surfaces**: `Surface(tonalElevation)` for sheets and overlays.
|
|
115
|
+
7. **Haptic**: `performHapticFeedback()` on favorite toggles and primary actions.
|
|
116
|
+
|
|
117
|
+
### Step 5.6 — Generate App Launcher Icon
|
|
106
118
|
|
|
107
119
|
Customize the adaptive icon using the manifest's **App Launcher Icon** section:
|
|
108
120
|
|
|
@@ -223,16 +235,17 @@ If the customization manifest includes an **"Animation & Sensory Plan"** section
|
|
|
223
235
|
2. For each screen in your batch, apply the assigned modifiers:
|
|
224
236
|
|
|
225
237
|
```kotlin
|
|
226
|
-
//
|
|
227
|
-
Button(onClick = { }, modifier = Modifier.scaleOnPress()
|
|
228
|
-
|
|
229
|
-
|
|
238
|
+
// Built-in (always available)
|
|
239
|
+
Button(onClick = { }, modifier = Modifier.scaleOnPress()) { Text("Add") }
|
|
240
|
+
ItemRow(item = item, modifier = Modifier.staggeredAppear(index = index))
|
|
241
|
+
Card(modifier = Modifier.cardShadow()) { /* content */ }
|
|
242
|
+
EmptyState(modifier = Modifier.slideIn())
|
|
243
|
+
Box(modifier = Modifier.fillMaxWidth().height(60.dp).shimmer()) // loading placeholder
|
|
244
|
+
Box(modifier = Modifier.size(8.dp).pulse()) // live indicator
|
|
245
|
+
Icon(icon, modifier = Modifier.heartBounce(isActive = isFavorite)) // favorite toggle
|
|
246
|
+
|
|
247
|
+
// Modules (if integrated)
|
|
230
248
|
ParallaxHeader(height = 280.dp, scrollState = scrollState) { AsyncImage(model = item.imageUrl) }
|
|
231
|
-
|
|
232
|
-
// AnimatedTransitions — staggered list items
|
|
233
|
-
ItemRow(item = item, modifier = Modifier.staggeredAppearance(index = index))
|
|
234
|
-
|
|
235
|
-
// CelebrationEffects — success overlay
|
|
236
249
|
Box(modifier = Modifier.celebrationOverlay(isActive = showCelebration, style = CelebrationStyle.CONFETTI))
|
|
237
250
|
```
|
|
238
251
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-fixer
|
|
3
|
+
description: Reads a bug report and systematically fixes each bug. Rebuilds, re-tests fixed screens, produces a fix report.
|
|
4
|
+
allowed-tools: Read, Write, Grep, Glob, LS, Shell, inspect, act, assert, wait, device
|
|
5
|
+
context: fork
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Bug Fixer Skill
|
|
9
|
+
|
|
10
|
+
Fix bugs from `reports/11-bug-report.md`. Read the report, fix each bug, rebuild, verify.
|
|
11
|
+
|
|
12
|
+
## Instructions
|
|
13
|
+
|
|
14
|
+
### Step 1 — Read and Prioritize
|
|
15
|
+
|
|
16
|
+
Read `output/{app-name}/reports/11-bug-report.md`. Sort by severity (P0→P3). Triage:
|
|
17
|
+
- **FIX** — fixable in source code
|
|
18
|
+
- **DEFER** — needs major refactoring (document recommendation)
|
|
19
|
+
- **SKIP** — false positive
|
|
20
|
+
|
|
21
|
+
### Step 2 — Locate Source Files
|
|
22
|
+
|
|
23
|
+
- `[STRUCTURED]` bugs: file path in bug report or test plan
|
|
24
|
+
- `[EXPLORATORY]` bugs: find `{ScreenName}View.swift` / `{ScreenName}Screen.kt` / `{ScreenName}Screen.tsx`
|
|
25
|
+
- `[A11Y]` bugs: open View file, add accessibility modifiers
|
|
26
|
+
- Content bugs: check AppConfig, MockDataProvider, strings
|
|
27
|
+
|
|
28
|
+
### Step 3 — Fix Each Bug (priority order)
|
|
29
|
+
|
|
30
|
+
**Fix patterns:**
|
|
31
|
+
- `[VISUAL]`: lineLimit, frame, padding, spacing, ZStack ordering
|
|
32
|
+
- `[A11Y]`: `.accessibilityLabel()`, `contentDescription`, increase touch targets
|
|
33
|
+
- `[UX]`: fix action handler, navigation call, target
|
|
34
|
+
- `[CONTENT]`: replace leftover text, update AppConfig/MockDataProvider
|
|
35
|
+
- `[STATE]`: fix ViewModel save call, check binding, update provider
|
|
36
|
+
- `[CRASH]`: add nil checks, bounds checking, optional binding
|
|
37
|
+
|
|
38
|
+
### Step 4 — Rebuild
|
|
39
|
+
|
|
40
|
+
Follow `build-tester` skill. Max 3 rebuild cycles.
|
|
41
|
+
|
|
42
|
+
### Step 5 — Verify Fixes
|
|
43
|
+
|
|
44
|
+
Boot simulator, install, launch. For each fixed bug: navigate to screen, verify fix, check no regressions.
|
|
45
|
+
|
|
46
|
+
### Step 6 — Write Fix Report
|
|
47
|
+
|
|
48
|
+
Write `output/{app-name}/reports/12-fix-report.md`: summary counts, per-bug fix details (root cause, fix, files, verified), deferred bugs with recommendations, rebuild/verification results.
|
|
49
|
+
|
|
50
|
+
Update `summary.json` with step 12 entry.
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
- Fix P0 first, P3 last
|
|
55
|
+
- Minimal changes — don't refactor unrelated code
|
|
56
|
+
- Preserve MVVM architecture and MockDataProvider pattern
|
|
57
|
+
- Max 3 rebuild cycles
|
|
58
|
+
- Only write under `output/`
|
|
59
|
+
- DEFER bugs requiring new dependencies or >50 lines across >3 files
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: catalog-analyzer
|
|
3
|
+
description: Selects the best template from CATALOG.md and shared modules from MODULES_CATALOG.md in one pass. Uses selected template to boost module accuracy via "Relevant Templates" column.
|
|
4
|
+
allowed-tools: Read, Grep, Glob, LS
|
|
5
|
+
context: fork
|
|
6
|
+
agent: Explore
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Catalog Analyzer Skill
|
|
10
|
+
|
|
11
|
+
Select the best template AND shared modules for the user's app in one pass.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- Step 0, in parallel with prompt validation and design brand selection
|
|
16
|
+
- Before cloning any template to `output/`
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
### Phase 1 — Template Selection
|
|
21
|
+
|
|
22
|
+
#### Step 1 — Read the Template Catalog
|
|
23
|
+
|
|
24
|
+
Read `templates/CATALOG.md`. Understand each template's feature set, "Best-For Keywords", "Best match when" criteria, and "NOT a match when" rules.
|
|
25
|
+
|
|
26
|
+
#### Step 2 — Score Each Template
|
|
27
|
+
|
|
28
|
+
For each template: score against user description keywords, check match criteria, apply exclusion rules, consider navigation pattern similarity.
|
|
29
|
+
|
|
30
|
+
#### Step 3 — Handle Edge Cases
|
|
31
|
+
|
|
32
|
+
Check the "Hybrid Apps" table if the app spans categories. Follow "When No Template Fits" guidance if needed.
|
|
33
|
+
|
|
34
|
+
#### Step 4 — Select ONE Template
|
|
35
|
+
|
|
36
|
+
Choose exactly ONE primary template. Determine confidence (high/medium/low). Features covered by shared modules should NOT affect template scoring.
|
|
37
|
+
|
|
38
|
+
### Phase 2 — Module Selection (uses template from Phase 1)
|
|
39
|
+
|
|
40
|
+
#### Step 5 — Read Modules Catalog
|
|
41
|
+
|
|
42
|
+
Read `templates/shared/MODULES_CATALOG.md`. Note each module's keywords, relevant templates, and dependencies.
|
|
43
|
+
|
|
44
|
+
#### Step 6 — Match by Keywords + Relevant Templates
|
|
45
|
+
|
|
46
|
+
For every module:
|
|
47
|
+
1. Compare "Best-For Keywords" against user description (primary signal)
|
|
48
|
+
2. Check if selected template is in "Relevant Templates" column (boost signal)
|
|
49
|
+
3. Keyword match + template match = strong include
|
|
50
|
+
4. Keyword match + no template match = include with lower confidence
|
|
51
|
+
5. No keyword match + template match = consider if implied by domain
|
|
52
|
+
|
|
53
|
+
**Guidance:** Aim for **5-15 modules**. Consider implicit needs (shopping → payment, social → sharing).
|
|
54
|
+
|
|
55
|
+
**BaaS selection:** FirebaseProvider OR SupabaseProvider (not both) when description mentions auth/users/cloud/sync/backend. Default: no BaaS. Supabase needs CachedRepository; Firebase does not. Prefer Firebase when both fit equally.
|
|
56
|
+
|
|
57
|
+
#### Step 7 — Check Dependencies
|
|
58
|
+
|
|
59
|
+
Verify dependencies (Paywall→BiometricAuth, AccountDeletion→ConsentPrivacy, PushNotifications→ConsentPrivacy, etc.). Add missing ones.
|
|
60
|
+
|
|
61
|
+
#### Step 8 — Animation Heuristics
|
|
62
|
+
|
|
63
|
+
For "stunning/beautiful/premium/polished" descriptions, consider MicroInteractions, AnimatedTransitions, CelebrationEffects, HapticEngine, etc. Auto-include MotionPreferences when any animation module is selected.
|
|
64
|
+
|
|
65
|
+
#### Step 9 — Final List
|
|
66
|
+
|
|
67
|
+
Produce selected modules with reasoning.
|
|
68
|
+
|
|
69
|
+
## Report Output
|
|
70
|
+
|
|
71
|
+
Write `output/{app-name}/reports/02-catalog-analysis.md` with both template selection and module selection sections. Update `summary.json`:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"step": 0,
|
|
76
|
+
"name": "catalog-analysis",
|
|
77
|
+
"result": "PASS",
|
|
78
|
+
"reportFile": "02-catalog-analysis.md",
|
|
79
|
+
"template": "{TemplateName}",
|
|
80
|
+
"confidence": "high|medium|low",
|
|
81
|
+
"borrowFrom": "{other template or null}",
|
|
82
|
+
"modulesSelected": {N}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Rules
|
|
87
|
+
|
|
88
|
+
- READ-ONLY — only write report files
|
|
89
|
+
- Always recommend exactly ONE primary template
|
|
90
|
+
- Do NOT recommend building from scratch
|
|
91
|
+
- No modules are auto-included — every module must match via keywords
|
|
92
|
+
- **Visual liveliness rule**: For consumer apps (shopping, social, food, fitness, travel, art, music, creative, lifestyle), automatically include **MicroInteractions** unless the domain demands restraint (medical, legal, finance)
|
|
93
|
+
- When ANY animation module is selected, auto-include MotionPreferences
|
|
94
|
+
- Aim for 5-15 modules
|
|
95
|
+
- "Relevant Templates" is a boost, not a hard filter
|
|
96
|
+
- Module integration happens later (Steps 4-5), not here
|
|
@@ -9,8 +9,8 @@ Use this skill to produce a single, comprehensive customization manifest before
|
|
|
9
9
|
|
|
10
10
|
## When to Use
|
|
11
11
|
|
|
12
|
-
- After Step 0 (Prompt Validation
|
|
13
|
-
- After Step 1 (Clone) and Step
|
|
12
|
+
- After Step 0 (Prompt Validation, Catalog Analysis, Design Brand Selection) is complete
|
|
13
|
+
- After Step 1 (Clone) and Step 2 (Rename) are complete — the output app directory exists
|
|
14
14
|
- BEFORE any code modifications (AppConfig, MockDataProvider, screens, theme)
|
|
15
15
|
|
|
16
16
|
## Context You Need
|
|
@@ -23,7 +23,7 @@ Use this skill to produce a single, comprehensive customization manifest before
|
|
|
23
23
|
- **Selected template** — which template was cloned (e.g., "TrackTemplate")
|
|
24
24
|
- **Selected design brand** — brand name and file path (e.g., "VibrantPlayful", `designs/brands/vibrant-playful.md`)
|
|
25
25
|
- **Adaptation suggestions** — from the design-selector (if any)
|
|
26
|
-
- **Selected modules** — from the
|
|
26
|
+
- **Selected modules** — from the catalog analysis report (`reports/02-catalog-analysis.md`)
|
|
27
27
|
|
|
28
28
|
## Instructions
|
|
29
29
|
|
|
@@ -37,7 +37,7 @@ Read these files in parallel (batch your read calls):
|
|
|
37
37
|
4. **MockDataProvider** — find and read the MockDataProvider file — understand seed data structure, entity types, item counts
|
|
38
38
|
5. **Template Features directory** — list all screen files in `Features/` (iOS) or `features/` (Android)
|
|
39
39
|
6. **TESTING_MANIFEST.md** — `output/{app-name}/TESTING_MANIFEST.md` — all test IDs, screens, element counts
|
|
40
|
-
7. **
|
|
40
|
+
7. **Catalog analysis report** — `output/{app-name}/reports/02-catalog-analysis.md` — which template and shared modules were selected
|
|
41
41
|
|
|
42
42
|
### Step 2 — Produce the Design Brief
|
|
43
43
|
|
|
@@ -148,7 +148,7 @@ Based on the app domain and the existing MockDataProvider structure:
|
|
|
148
148
|
|
|
149
149
|
### Step 6 — Produce Module Integration Plan
|
|
150
150
|
|
|
151
|
-
Read the
|
|
151
|
+
Read the "Module Selection" section from `output/{app-name}/reports/02-catalog-analysis.md`. For each selected module, plan how it connects to the app:
|
|
152
152
|
|
|
153
153
|
- **Placement:** How the module's UI is presented (tab, sheet, navigation link, settings row, or embedded)
|
|
154
154
|
- **Presented from:** Which existing screen triggers it and how
|
|
@@ -241,6 +241,45 @@ Write the complete manifest to `output/{app-name}/reports/customization-manifest
|
|
|
241
241
|
- Spacing: {scale}
|
|
242
242
|
- Icon style: {filled|outlined}
|
|
243
243
|
|
|
244
|
+
### Visual Polish Plan
|
|
245
|
+
|
|
246
|
+
#### Shadow Style
|
|
247
|
+
| Token | Value |
|
|
248
|
+
|-------|-------|
|
|
249
|
+
| Shadow type | {colored / neutral} |
|
|
250
|
+
| Shadow color | {primary at X% / black at X%} |
|
|
251
|
+
| Shadow blur | {X}pt |
|
|
252
|
+
| Shadow y-offset | {X}pt |
|
|
253
|
+
|
|
254
|
+
#### Gradient Usage
|
|
255
|
+
- Hero sections: {primary-to-secondary gradient / subtle gradient / none}
|
|
256
|
+
- CTA buttons: {gradient / solid}
|
|
257
|
+
- Section backgrounds: {subtle gradient / solid}
|
|
258
|
+
|
|
259
|
+
#### Animation Choreography
|
|
260
|
+
| Token | Value |
|
|
261
|
+
|-------|-------|
|
|
262
|
+
| Spring preset | {bouncy / smooth / snappy} |
|
|
263
|
+
| Press scale | {0.95} |
|
|
264
|
+
| Stagger delay | {X}ms |
|
|
265
|
+
| Favorite toggle | {heart bounce + haptic} |
|
|
266
|
+
| Success event | {confetti / sparkle / none} |
|
|
267
|
+
|
|
268
|
+
#### Built-in Modifiers (always available, no module required)
|
|
269
|
+
- `.staggeredAppear(index:)` — staggered list entrance
|
|
270
|
+
- `.slideIn()` / `.slideAndFade()` — appear animations
|
|
271
|
+
- `.scaleOnPress()` — press feedback (0.95 scale + spring)
|
|
272
|
+
- `.hapticFeedback()` — haptic on tap
|
|
273
|
+
- `.bounceOnChange(isActive:)` — toggle bounce
|
|
274
|
+
- `.cardShadow()` / `.elevatedShadow()` — shadow depth
|
|
275
|
+
- `.shimmer()` — shimmer overlay for loading placeholders
|
|
276
|
+
- `.pulse()` — repeating pulse for live indicators
|
|
277
|
+
- `.heartBounce(isActive:)` — bounce for favorite/like toggles
|
|
278
|
+
|
|
279
|
+
#### Depth & Material
|
|
280
|
+
- Sheet backgrounds: {glass blur / solid}
|
|
281
|
+
- Tab bar: {blur / solid / elevated}
|
|
282
|
+
|
|
244
283
|
### Icon Mapping — Tabs
|
|
245
284
|
| Tab | Label | iOS (SF Symbol) | Android (Material) |
|
|
246
285
|
|-----|-------|-----------------|-------------------|
|
|
@@ -12,7 +12,7 @@ Use this skill to select the best visual design brand for the user's app.
|
|
|
12
12
|
|
|
13
13
|
## When to Use
|
|
14
14
|
|
|
15
|
-
- At Step
|
|
15
|
+
- At Step 0, in parallel with prompt validation and catalog analysis
|
|
16
16
|
- Before applying design tokens
|
|
17
17
|
|
|
18
18
|
## Instructions
|
|
@@ -25,6 +25,8 @@ Read `designs/DESIGN_CATALOG.md`. Understand each brand's visual tone, decision
|
|
|
25
25
|
|
|
26
26
|
Score against app description and target audience. Apply match criteria and exclusion rules. Follow the decision flow.
|
|
27
27
|
|
|
28
|
+
**Energy bias**: When brands tie, prefer higher Energy score. For ambiguous domains (not medical/finance/corporate), bias toward Energy >= 3. Apps should feel vibrant by default.
|
|
29
|
+
|
|
28
30
|
### Step 3 — Handle User Style Preferences
|
|
29
31
|
|
|
30
32
|
If user mentioned colors/style: use as primary input, select brand with best structural token match, note color overrides in adaptations.
|
|
@@ -16,7 +16,7 @@ Read `designs/DESIGN_PRINCIPLES.md` for baseline mobile design rules.
|
|
|
16
16
|
|
|
17
17
|
### Step 1 — Load the Selected Brand
|
|
18
18
|
|
|
19
|
-
Read brand file, extract palette, layout tokens, typography, icon style. Apply any ADAPT suggestions.
|
|
19
|
+
Read brand file, extract palette, layout tokens, typography, icon style, and **Motion & Effects** section (spring preset, press scale, shadow style, gradient usage, depth approach, haptic policy). Apply any ADAPT suggestions.
|
|
20
20
|
|
|
21
21
|
### Step 2/3 — Fallback (if no brand selected)
|
|
22
22
|
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: exploratory-tester
|
|
3
|
+
description: Screenshot and accessibility-tree driven exploratory testing. Does NOT read source code — tests purely through what the AI sees on screen. Discovers visual bugs, accessibility issues, UX problems, and content issues.
|
|
4
|
+
allowed-tools: inspect, act, assert, wait, navigate, device, logs, Read, Write
|
|
5
|
+
context: fork
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Exploratory Tester Skill
|
|
9
|
+
|
|
10
|
+
Test the app by exploring it visually — screenshots and accessibility tree as your only inputs. Do NOT read source code.
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
- **Platform**, **Bundle ID**, **Simulator name** — for ai-tester MCP calls
|
|
15
|
+
- **App directory** — only for writing the bug report
|
|
16
|
+
|
|
17
|
+
## Instructions
|
|
18
|
+
|
|
19
|
+
### Phase A — Screen Discovery
|
|
20
|
+
|
|
21
|
+
1. Launch app: `inspect({ platform, app: bundleId, deviceName })`
|
|
22
|
+
2. Wait 3-5s, `inspect()` again
|
|
23
|
+
3. Map tab bar — identify all tabs from element tree
|
|
24
|
+
4. Visit each tab — `inspect()` on each
|
|
25
|
+
5. Discover sub-screens — tap list items, buttons, links
|
|
26
|
+
6. Build screen map (tab → screen → sub-screen)
|
|
27
|
+
|
|
28
|
+
### Phase B — Per-Screen Audit
|
|
29
|
+
|
|
30
|
+
For each screen, `inspect()` then:
|
|
31
|
+
|
|
32
|
+
**B1 — Visual Analysis (screenshot):**
|
|
33
|
+
- No overlapping/cut-off text, proper spacing, correct alignment
|
|
34
|
+
- Real domain text (not "Lorem ipsum", "Item 1", "Template")
|
|
35
|
+
- Images loaded, icons match context
|
|
36
|
+
- Consistent typography and colors
|
|
37
|
+
- Template leftover detection
|
|
38
|
+
|
|
39
|
+
**B2 — Accessibility Tree Audit:**
|
|
40
|
+
- Every button/link has non-empty label
|
|
41
|
+
- Images have a11y descriptions
|
|
42
|
+
- Form fields have labels
|
|
43
|
+
- No orphaned elements (in tree but not visible, or visible but not in tree)
|
|
44
|
+
- Touch targets >= 44x44pt (iOS) / 48x48dp (Android)
|
|
45
|
+
|
|
46
|
+
**B3 — Interactive Exploration:**
|
|
47
|
+
- Tap every button — verify something happens (flag dead buttons)
|
|
48
|
+
- Type into every text field — normal text + edge cases (empty, long, special chars)
|
|
49
|
+
- Toggle every switch — verify state change
|
|
50
|
+
- Scroll every list to bottom and back up
|
|
51
|
+
- Navigate 3+ levels deep, verify back nav works all the way
|
|
52
|
+
- Switch tabs rapidly — verify correct content
|
|
53
|
+
- Test state persistence (favorite, form text, scroll position)
|
|
54
|
+
|
|
55
|
+
**B4 — Before/After Comparison:**
|
|
56
|
+
- `inspect()` after interactions, compare element trees
|
|
57
|
+
- Flag unexpected changes (disappeared elements, count mismatches)
|
|
58
|
+
|
|
59
|
+
### Phase C — Bug Classification
|
|
60
|
+
|
|
61
|
+
| Tag | Category | Examples |
|
|
62
|
+
|-----|----------|----------|
|
|
63
|
+
| `[VISUAL]` | Layout | Overlap, truncation, wrong colors |
|
|
64
|
+
| `[A11Y]` | Accessibility | Missing labels, small targets |
|
|
65
|
+
| `[UX]` | Experience | Dead buttons, confusing nav |
|
|
66
|
+
| `[CONTENT]` | Content | Template leftovers, placeholders |
|
|
67
|
+
| `[STATE]` | State | Not persisting, stale views |
|
|
68
|
+
| `[CRASH]` | Crash | App crash on interaction |
|
|
69
|
+
|
|
70
|
+
Format: `BUG-{NNN}: [{SEVERITY}][EXPLORATORY][{TAG}] {description}` with screen, element, steps, expected, actual.
|
|
71
|
+
|
|
72
|
+
### Phase D — Write Bug Report
|
|
73
|
+
|
|
74
|
+
Write/append to `output/{app-name}/reports/11-bug-report.md` with: summary counts, accessibility summary, screen map, all bugs.
|
|
75
|
+
|
|
76
|
+
## Rules
|
|
77
|
+
|
|
78
|
+
- **DO NOT read source code** — only screenshots + element tree from `inspect()`
|
|
79
|
+
- **DO NOT follow a test plan** — explore freely
|
|
80
|
+
- Test EVERY interactive element in the element tree
|
|
81
|
+
- Use ai-tester MCP tools for ALL interaction
|
|
82
|
+
- Write findings to bug report — do NOT fix bugs
|
|
@@ -100,7 +100,19 @@ iOS templates use a `Colors.swift` theme file:
|
|
|
100
100
|
- Use semantic colors where possible (`Color.primary`, `Color.secondary`)
|
|
101
101
|
- Apply corner radius and spacing tokens from the design brief
|
|
102
102
|
|
|
103
|
-
### Step 4.5 —
|
|
103
|
+
### Step 4.5 — Visual Polish Application
|
|
104
|
+
|
|
105
|
+
Apply the **Visual Polish Plan** from the manifest. MANDATORY for every build.
|
|
106
|
+
|
|
107
|
+
1. **Shadows**: Apply `.cardShadow()` or `shadow(color:radius:x:y:)` to every card/elevated surface using manifest shadow tokens.
|
|
108
|
+
2. **Gradients**: Apply `LinearGradient` to hero sections and primary CTAs (primary → secondary, 135deg).
|
|
109
|
+
3. **Press feedback**: All buttons use `.scaleOnPress()` (scale 0.95, spring return). Add `UIImpactFeedbackGenerator` to favorite toggles and submit buttons.
|
|
110
|
+
4. **Staggered animations**: All list views use `.staggeredAppear(index:)` on each item.
|
|
111
|
+
5. **Empty states**: Gradient circle behind icon + `.slideIn()` animation.
|
|
112
|
+
6. **Glass/blur**: `.ultraThinMaterial` on sheet backgrounds and overlays.
|
|
113
|
+
7. **Haptic**: Feedback on favorite toggles, pull-to-refresh, primary actions.
|
|
114
|
+
|
|
115
|
+
### Step 4.6 — Generate App Launcher Icon
|
|
104
116
|
|
|
105
117
|
Generate a domain-specific app icon using the manifest's **App Launcher Icon** section:
|
|
106
118
|
|
|
@@ -216,18 +228,27 @@ If the customization manifest includes an **"Animation & Sensory Plan"** section
|
|
|
216
228
|
2. For each screen in your batch, apply the assigned modifiers:
|
|
217
229
|
|
|
218
230
|
```swift
|
|
219
|
-
//
|
|
231
|
+
// Built-in press feedback (always available)
|
|
220
232
|
Button("Add to Cart") { ... }
|
|
221
233
|
.scaleOnPress()
|
|
222
|
-
.hapticFeedback(.
|
|
234
|
+
.hapticFeedback(.medium)
|
|
223
235
|
|
|
224
|
-
//
|
|
225
|
-
|
|
236
|
+
// Built-in staggered list items (always available)
|
|
237
|
+
ItemRow(item: items[index]).staggeredAppear(index: index)
|
|
226
238
|
|
|
227
|
-
//
|
|
228
|
-
|
|
239
|
+
// Built-in shadow and slide (always available)
|
|
240
|
+
CardView(item: item).cardShadow()
|
|
241
|
+
EmptyStateView().slideIn()
|
|
242
|
+
|
|
243
|
+
// Built-in shimmer, pulse, heartBounce (always available)
|
|
244
|
+
RoundedRectangle(cornerRadius: 8).fill(Color(.systemGray5)).shimmer()
|
|
245
|
+
Circle().fill(.red).frame(width: 8).pulse()
|
|
246
|
+
Image(systemName: "heart.fill").heartBounce(isActive: isFavorite)
|
|
247
|
+
|
|
248
|
+
// ScrollEffects module (if integrated)
|
|
249
|
+
ParallaxHeaderView(height: 280) { AsyncImage(url: item.imageURL) }
|
|
229
250
|
|
|
230
|
-
// CelebrationEffects
|
|
251
|
+
// CelebrationEffects module (if integrated)
|
|
231
252
|
.celebrationOverlay(isPresented: $showCelebration, style: .confetti)
|
|
232
253
|
```
|
|
233
254
|
|
|
@@ -9,7 +9,7 @@ Integrate selected shared modules by reading reference implementations from `tem
|
|
|
9
9
|
|
|
10
10
|
## Context You Need
|
|
11
11
|
|
|
12
|
-
-
|
|
12
|
+
- Catalog analysis report (`reports/02-catalog-analysis.md`) — template + module selection
|
|
13
13
|
- Customization manifest (`reports/customization-manifest.md`) — module integration plan
|
|
14
14
|
- Platform, app name, bundle ID
|
|
15
15
|
- AppConfig file path
|
|
@@ -91,6 +91,18 @@ React Native templates use a `ThemeContext.tsx`:
|
|
|
91
91
|
- Apply corner radius and spacing tokens
|
|
92
92
|
- Apply typography settings (font sizes, weights)
|
|
93
93
|
|
|
94
|
+
### Step 4.5 — Visual Polish Application
|
|
95
|
+
|
|
96
|
+
Apply the **Visual Polish Plan** from the manifest. MANDATORY for every build.
|
|
97
|
+
|
|
98
|
+
1. **Shadows**: Platform-aware shadow styles on all cards (`shadowColor`/`shadowOffset`/`shadowRadius` + `elevation`).
|
|
99
|
+
2. **Gradients**: `expo-linear-gradient` `LinearGradient` on hero sections and CTAs.
|
|
100
|
+
3. **Press feedback**: Scale animation (0.95, spring) on all TouchableOpacity. Wrap in `ScaleButton` component.
|
|
101
|
+
4. **Staggered animations**: `useStaggeredAppear(index)` on all FlatList items.
|
|
102
|
+
5. **Empty states**: Gradient circle behind icon + `useSlideIn()` animation.
|
|
103
|
+
6. **Blur/glass**: `expo-blur` BlurView on modal/sheet backgrounds.
|
|
104
|
+
7. **Haptic**: `expo-haptics` on favorite toggles and primary actions.
|
|
105
|
+
|
|
94
106
|
### Step 5 — Data Layer & Offline Infrastructure
|
|
95
107
|
|
|
96
108
|
Templates include an **offline-first data layer**:
|
|
@@ -148,18 +160,18 @@ If the manifest includes an **"Animation & Sensory Plan"** section:
|
|
|
148
160
|
2. Apply the assigned modifiers using imported module hooks/components:
|
|
149
161
|
|
|
150
162
|
```typescript
|
|
151
|
-
//
|
|
152
|
-
import { useScaleOnPress } from '../
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
163
|
+
// Built-in (always available)
|
|
164
|
+
import { useScaleOnPress, useStaggeredAppear, useSlideIn, cardShadowStyle, useShimmer, usePulse, useHeartBounce } from '../animation/useAnimatedList';
|
|
165
|
+
const { style: pressStyle, onPressIn, onPressOut } = useScaleOnPress();
|
|
166
|
+
const listItemStyle = useStaggeredAppear(index);
|
|
167
|
+
<View style={[styles.card, cardShadowStyle()]}>{/* content */}</View>
|
|
168
|
+
<Animated.View style={[styles.placeholder, useShimmer()]} /> // loading
|
|
169
|
+
<Animated.View style={[styles.dot, usePulse()]} /> // live indicator
|
|
170
|
+
<Animated.View style={useHeartBounce(isFav)}><HeartIcon /></Animated.View> // favorite
|
|
171
|
+
|
|
172
|
+
// Modules (if integrated)
|
|
157
173
|
import { ParallaxHeader } from '../shared/ScrollEffects';
|
|
158
174
|
<ParallaxHeader height={280} imageSource={item.imageUrl} />
|
|
159
|
-
|
|
160
|
-
// CelebrationEffects — success overlay
|
|
161
|
-
import { CelebrationOverlay } from '../shared/CelebrationEffects';
|
|
162
|
-
<CelebrationOverlay isActive={showCelebration} style="confetti" />
|
|
163
175
|
```
|
|
164
176
|
|
|
165
177
|
3. Wrap with `useMotionPreferences` checks if MotionPreferences is integrated
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-planner
|
|
3
|
+
description: Analyzes app source code to generate a structured test plan before any simulator interaction. Reads Views, ViewModels, AppConfig, MockDataProvider, and TESTING_MANIFEST to produce a comprehensive test matrix.
|
|
4
|
+
allowed-tools: Read, Grep, Glob, LS
|
|
5
|
+
context: fork
|
|
6
|
+
agent: Explore
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Test Planner Skill
|
|
10
|
+
|
|
11
|
+
Analyze app source code and produce a structured test plan. Runs offline — no simulator needed.
|
|
12
|
+
|
|
13
|
+
## Instructions
|
|
14
|
+
|
|
15
|
+
### Step 1 — Gather App Inventory
|
|
16
|
+
|
|
17
|
+
Read from the app directory:
|
|
18
|
+
1. `TESTING_MANIFEST.md` — test IDs, screen inventory, element counts
|
|
19
|
+
2. `AppConfig` — feature flags, business rules (`.swift`/`.kt`/`.ts`)
|
|
20
|
+
3. `MockDataProvider` — data counts, categories, structure
|
|
21
|
+
4. `customization-manifest.md` (if exists) — screen descriptions, expected behavior
|
|
22
|
+
5. `summary.json` (if exists) — previous results, template, brand
|
|
23
|
+
6. `requirements.md` or `PRD.md` (if exists) — business-logic test cases
|
|
24
|
+
|
|
25
|
+
### Step 2 — Scan Screens + ViewModels
|
|
26
|
+
|
|
27
|
+
Read all View files (`*View.swift`, `*Screen.kt`, `*Screen.tsx`) and ViewModel files. Extract per screen:
|
|
28
|
+
- Interactive elements (buttons, toggles, fields, list items, FABs)
|
|
29
|
+
- Navigation targets
|
|
30
|
+
- Data dependencies from MockDataProvider
|
|
31
|
+
- Feature flags controlling visibility
|
|
32
|
+
- State transitions and CRUD operations
|
|
33
|
+
|
|
34
|
+
### Step 3 — Build Test Matrix
|
|
35
|
+
|
|
36
|
+
For each screen, create a checklist:
|
|
37
|
+
|
|
38
|
+
```markdown
|
|
39
|
+
### Screen: {Name}
|
|
40
|
+
**File:** {path} | **Elements:** {N}
|
|
41
|
+
|
|
42
|
+
#### Rendering
|
|
43
|
+
- [ ] Renders without crash
|
|
44
|
+
- [ ] Correct data shown ({N} items)
|
|
45
|
+
- [ ] No template leftover text
|
|
46
|
+
|
|
47
|
+
#### Navigation
|
|
48
|
+
- [ ] Navigate to screen, navigate back
|
|
49
|
+
|
|
50
|
+
#### Interactions
|
|
51
|
+
- [ ] {Button}: tap triggers {action}
|
|
52
|
+
- [ ] {Toggle}: state changes
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Add sections for: Edge Cases (empty states, long text, rapid taps, deep navigation), Regression Checks (leftovers, a11y IDs, images, back nav), Requirements-Based Tests (if PRD exists).
|
|
56
|
+
|
|
57
|
+
### Step 4 — Assign Priorities
|
|
58
|
+
|
|
59
|
+
- **P0** — crashes, data loss, broken navigation
|
|
60
|
+
- **P1** — features don't work, wrong data
|
|
61
|
+
- **P2** — visual, accessibility, minor UX
|
|
62
|
+
- **P3** — cosmetic
|
|
63
|
+
|
|
64
|
+
## Report Output
|
|
65
|
+
|
|
66
|
+
Write `output/{app-name}/reports/10-test-plan.md`. Update `summary.json` with step entry (step: 10, name: "test-plan").
|
|
67
|
+
|
|
68
|
+
## Rules
|
|
69
|
+
|
|
70
|
+
- READ-ONLY — do NOT modify source files or boot simulators
|
|
71
|
+
- Every interactive element must have at least one test case
|
|
72
|
+
- Test plan must be detailed enough for another agent to execute without reading source
|
package/.cursor/agents/README.md
CHANGED
|
@@ -12,8 +12,10 @@ These agent definition files (`.md`) are **preserved as a fallback** for when Cu
|
|
|
12
12
|
|---|---|
|
|
13
13
|
| `security-auditor.md` (Phase 1) | `.cursor/skills/prompt-validator/SKILL.md` |
|
|
14
14
|
| `security-auditor.md` (Phase 2) | `.cursor/skills/code-auditor/SKILL.md` |
|
|
15
|
-
| `template-selector.md` | `.cursor/skills/
|
|
15
|
+
| `template-selector.md` | `.cursor/skills/catalog-analyzer/SKILL.md` (merged with module-selector) |
|
|
16
16
|
| `design-selector.md` | `.cursor/skills/design-selector/SKILL.md` |
|
|
17
|
+
| `catalog-analyzer.md` | `.cursor/skills/catalog-analyzer/SKILL.md` (template + module selection) |
|
|
18
|
+
| `react-native-customizer.md` | `.cursor/skills/react-native-customizer/SKILL.md` |
|
|
17
19
|
| `ios-customizer.md` | `.cursor/skills/ios-customizer/SKILL.md` |
|
|
18
20
|
| `android-customizer.md` | `.cursor/skills/android-customizer/SKILL.md` |
|
|
19
21
|
| `build-tester.md` | `.cursor/skills/build-tester/SKILL.md` |
|