@shaykec/app-agent 1.0.9 → 1.0.10

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.
Files changed (199) hide show
  1. package/.claude/agents/catalog-analyzer.md +57 -0
  2. package/.claude/skills/android-customizer/SKILL.md +23 -10
  3. package/.claude/skills/bug-fixer/SKILL.md +59 -0
  4. package/.claude/skills/catalog-analyzer/SKILL.md +96 -0
  5. package/.claude/skills/customization-planner/SKILL.md +44 -5
  6. package/.claude/skills/design-selector/SKILL.md +3 -1
  7. package/.claude/skills/design-system/SKILL.md +1 -1
  8. package/.claude/skills/exploratory-tester/SKILL.md +82 -0
  9. package/.claude/skills/ios-customizer/SKILL.md +29 -8
  10. package/.claude/skills/module-integrator/SKILL.md +1 -1
  11. package/.claude/skills/react-native-customizer/SKILL.md +22 -10
  12. package/.claude/skills/test-planner/SKILL.md +72 -0
  13. package/.cursor/agents/README.md +3 -1
  14. package/.cursor/agents/catalog-analyzer.md +83 -0
  15. package/.cursor/rules/safety-guardrails.mdc +1 -1
  16. package/.cursor/rules/workflow.mdc +52 -18
  17. package/.cursor/skills/android-customizer/SKILL.md +43 -19
  18. package/.cursor/skills/bug-fixer/SKILL.md +189 -0
  19. package/.cursor/skills/catalog-analyzer/SKILL.md +222 -0
  20. package/.cursor/skills/customization-planner/SKILL.md +55 -8
  21. package/.cursor/skills/design-selector/SKILL.md +6 -5
  22. package/.cursor/skills/design-system/SKILL.md +8 -7
  23. package/.cursor/skills/exploratory-tester/SKILL.md +223 -0
  24. package/.cursor/skills/ios-customizer/SKILL.md +47 -12
  25. package/.cursor/skills/module-integrator/SKILL.md +2 -2
  26. package/.cursor/skills/output-validator/SKILL.md +1 -1
  27. package/.cursor/skills/react-native-customizer/SKILL.md +46 -16
  28. package/.cursor/skills/test-planner/SKILL.md +199 -0
  29. package/AGENTS.md +32 -11
  30. package/CLAUDE.md +78 -33
  31. package/README.md +77 -11
  32. package/designs/DESIGN_CATALOG.md +17 -15
  33. package/designs/DESIGN_PRINCIPLES.md +53 -0
  34. package/designs/brands/accessible-high-contrast.md +14 -0
  35. package/designs/brands/corporate-professional.md +14 -0
  36. package/designs/brands/dark-luxe.md +14 -0
  37. package/designs/brands/kids-playful.md +14 -0
  38. package/designs/brands/medical-clinical.md +14 -0
  39. package/designs/brands/modern-minimal.md +14 -0
  40. package/designs/brands/nature-organic.md +14 -0
  41. package/designs/brands/neo-brutalist.md +14 -0
  42. package/designs/brands/retro-vintage.md +14 -0
  43. package/designs/brands/soft-gradient.md +14 -0
  44. package/designs/brands/sport-athletic.md +14 -0
  45. package/designs/brands/tech-dynamic.md +14 -0
  46. package/designs/brands/vibrant-playful.md +14 -0
  47. package/dist/cli.d.ts +4 -2
  48. package/dist/cli.d.ts.map +1 -1
  49. package/dist/cli.js +91 -1
  50. package/dist/cli.js.map +1 -1
  51. package/dist/config.d.ts +2 -0
  52. package/dist/config.d.ts.map +1 -1
  53. package/dist/config.js +2 -0
  54. package/dist/config.js.map +1 -1
  55. package/dist/engines/claude-engine.d.ts.map +1 -1
  56. package/dist/engines/claude-engine.js +16 -4
  57. package/dist/engines/claude-engine.js.map +1 -1
  58. package/dist/engines/types.d.ts +1 -1
  59. package/dist/engines/types.d.ts.map +1 -1
  60. package/dist/engines/types.js +31 -2
  61. package/dist/engines/types.js.map +1 -1
  62. package/dist/github.d.ts +3 -0
  63. package/dist/github.d.ts.map +1 -1
  64. package/dist/github.js +47 -4
  65. package/dist/github.js.map +1 -1
  66. package/dist/index.js +217 -9
  67. package/dist/index.js.map +1 -1
  68. package/dist/prompt-builder.d.ts +11 -1
  69. package/dist/prompt-builder.d.ts.map +1 -1
  70. package/dist/prompt-builder.js +216 -1
  71. package/dist/prompt-builder.js.map +1 -1
  72. package/dist/validator.d.ts +7 -2
  73. package/dist/validator.d.ts.map +1 -1
  74. package/dist/validator.js +61 -41
  75. package/dist/validator.js.map +1 -1
  76. package/dist/workspace.js +2 -2
  77. package/dist/workspace.js.map +1 -1
  78. package/package.json +2 -2
  79. package/prompts/agent-prompt.md +35 -18
  80. package/prompts/deep-test-agent-prompt.md +122 -0
  81. package/prompts/fix-agent-prompt.md +90 -0
  82. package/prompts/quick-agent-prompt.md +32 -2
  83. package/prompts/scratch-agent-prompt.md +5 -8
  84. package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  85. package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  86. package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +1 -1
  87. package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  88. package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/MainScreen.kt +1 -0
  89. package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  90. package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/navigation/MainNavigation.kt +5 -1
  91. package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  92. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  93. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/MotionPreferencesScreen.kt +3 -3
  94. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/navigation/Navigation.kt +1 -1
  95. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/settings/SettingsScreen.kt +1 -1
  96. package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  97. package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  98. package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  99. package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  100. package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +3 -2
  101. package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  102. package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/settings/SettingsScreen.kt +1 -1
  103. package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  104. package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +3 -2
  105. package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  106. package/templates/android/Skeleton/tests/03_detail_screen.yaml +1 -1
  107. package/templates/android/Skeleton/tests/04_favorites.yaml +1 -1
  108. package/templates/android/Skeleton/tests/08_full_e2e.yaml +7 -1
  109. package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  110. package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  111. package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/settings/SettingsScreen.kt +3 -2
  112. package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  113. package/templates/ios/BookTemplate/BookTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  114. package/templates/ios/ChatTemplate/ChatTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  115. package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +1 -0
  116. package/templates/ios/DashTemplate/DashTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  117. package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +13 -0
  118. package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +32 -20
  119. package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  120. package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  121. package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Strings.swift +42 -0
  122. package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +36 -30
  123. package/templates/ios/GameTemplate/GameTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  124. package/templates/ios/HealthTemplate/HealthTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  125. package/templates/ios/LearnTemplate/LearnTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  126. package/templates/ios/MapTemplate/MapTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  127. package/templates/ios/MediaTemplate/MediaTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  128. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  129. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +12 -0
  130. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingView.swift +2 -37
  131. package/templates/ios/ShopTemplate/ShopTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  132. package/templates/ios/Skeleton/Skeleton/Core/Animation/AnimatedTransitionsView.swift +201 -0
  133. package/templates/ios/Skeleton/tests/08_full_e2e.yaml +4 -0
  134. package/templates/ios/SocialTemplate/SocialTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  135. package/templates/ios/TaskTemplate/TaskTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  136. package/templates/ios/TrackTemplate/TrackTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  137. package/templates/react-native/BookTemplate/src/animation/useAnimatedList.ts +219 -2
  138. package/templates/react-native/BookTemplate/src/animation/useMotionPreferences.ts +23 -9
  139. package/templates/react-native/BookTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  140. package/templates/react-native/ChatTemplate/src/animation/useAnimatedList.ts +219 -2
  141. package/templates/react-native/ChatTemplate/src/animation/useMotionPreferences.ts +23 -9
  142. package/templates/react-native/ChatTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  143. package/templates/react-native/DashTemplate/src/animation/useAnimatedList.ts +219 -2
  144. package/templates/react-native/DashTemplate/src/animation/useMotionPreferences.ts +23 -9
  145. package/templates/react-native/DashTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  146. package/templates/react-native/FamilyTemplate/src/animation/useAnimatedList.ts +219 -2
  147. package/templates/react-native/FamilyTemplate/src/animation/useMotionPreferences.ts +23 -9
  148. package/templates/react-native/FamilyTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  149. package/templates/react-native/FinanceTemplate/src/animation/useAnimatedList.ts +219 -2
  150. package/templates/react-native/FinanceTemplate/src/animation/useMotionPreferences.ts +23 -9
  151. package/templates/react-native/FinanceTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  152. package/templates/react-native/GameTemplate/src/animation/useAnimatedList.ts +219 -2
  153. package/templates/react-native/GameTemplate/src/animation/useMotionPreferences.ts +23 -9
  154. package/templates/react-native/GameTemplate/src/screens/GameDetail/GameDetailScreen.tsx +2 -1
  155. package/templates/react-native/GameTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  156. package/templates/react-native/HealthTemplate/src/animation/useAnimatedList.ts +219 -2
  157. package/templates/react-native/HealthTemplate/src/animation/useMotionPreferences.ts +23 -9
  158. package/templates/react-native/HealthTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  159. package/templates/react-native/HealthTemplate/src/screens/WorkoutDetail/WorkoutDetailScreen.tsx +1 -1
  160. package/templates/react-native/LearnTemplate/src/animation/useAnimatedList.ts +219 -2
  161. package/templates/react-native/LearnTemplate/src/animation/useMotionPreferences.ts +23 -9
  162. package/templates/react-native/LearnTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  163. package/templates/react-native/MapTemplate/src/animation/useAnimatedList.ts +219 -2
  164. package/templates/react-native/MapTemplate/src/animation/useMotionPreferences.ts +23 -9
  165. package/templates/react-native/MapTemplate/src/screens/Map/MapScreen.tsx +14 -0
  166. package/templates/react-native/MapTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  167. package/templates/react-native/MediaTemplate/src/animation/useAnimatedList.ts +219 -2
  168. package/templates/react-native/MediaTemplate/src/animation/useMotionPreferences.ts +23 -9
  169. package/templates/react-native/MediaTemplate/src/screens/PlaylistDetail/PlaylistDetailScreen.tsx +1 -1
  170. package/templates/react-native/MediaTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  171. package/templates/react-native/ReferenceTemplate/src/animation/useAnimatedList.ts +219 -2
  172. package/templates/react-native/ReferenceTemplate/src/animation/useMotionPreferences.ts +23 -9
  173. package/templates/react-native/ReferenceTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
  174. package/templates/react-native/ShopTemplate/src/animation/useAnimatedList.ts +219 -2
  175. package/templates/react-native/ShopTemplate/src/animation/useMotionPreferences.ts +23 -9
  176. package/templates/react-native/ShopTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  177. package/templates/react-native/Skeleton/TESTING_MANIFEST.md +1 -1
  178. package/templates/react-native/Skeleton/src/animation/useAnimatedList.ts +219 -2
  179. package/templates/react-native/Skeleton/src/animation/useMotionPreferences.ts +23 -9
  180. package/templates/react-native/Skeleton/src/screens/Profile/ProfileScreen.tsx +1 -1
  181. package/templates/react-native/Skeleton/tests/07_profile.yaml +3 -2
  182. package/templates/react-native/Skeleton/tests/08_full_e2e.yaml +12 -1
  183. package/templates/react-native/SocialTemplate/src/animation/useAnimatedList.ts +219 -2
  184. package/templates/react-native/SocialTemplate/src/animation/useMotionPreferences.ts +23 -9
  185. package/templates/react-native/SocialTemplate/src/screens/Feed/FeedScreen.tsx +1 -0
  186. package/templates/react-native/SocialTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  187. package/templates/react-native/TaskTemplate/src/animation/useAnimatedList.ts +219 -2
  188. package/templates/react-native/TaskTemplate/src/animation/useMotionPreferences.ts +23 -9
  189. package/templates/react-native/TaskTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  190. package/templates/react-native/TrackTemplate/src/animation/useAnimatedList.ts +219 -2
  191. package/templates/react-native/TrackTemplate/src/animation/useMotionPreferences.ts +23 -9
  192. package/templates/react-native/TrackTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
  193. package/templates/shared/ios/AnimatedTransitions/AnimatedTransitionsView.swift +233 -93
  194. package/.claude/agents/template-selector.md +0 -39
  195. package/.claude/skills/module-selector/SKILL.md +0 -81
  196. package/.claude/skills/template-selector/SKILL.md +0 -44
  197. package/.cursor/agents/template-selector.md +0 -52
  198. package/.cursor/skills/module-selector/SKILL.md +0 -135
  199. 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 — Generate App Launcher Icon
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
- // MicroInteractions press feedback
227
- Button(onClick = { }, modifier = Modifier.scaleOnPress().hapticFeedback(HapticFeedbackStyle.IMPACT_MEDIUM))
228
-
229
- // ScrollEffects parallax header
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), Step 1 (Template Selection), and Step 4a (Design Brand Selection) are complete
13
- - After Step 1 (Clone) and Step 3 (Rename) are complete — the output app directory exists
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 module selection report (`reports/02b-module-selection.md`)
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. **Module selection report** — `output/{app-name}/reports/02b-module-selection.md` — which shared modules were selected
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 module selection report (`output/{app-name}/reports/02b-module-selection.md`). For each selected module, plan how it connects to the app:
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 4a, after the template is cloned and renamed
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 — Generate App Launcher Icon
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
- // MicroInteractions press feedback
231
+ // Built-in press feedback (always available)
220
232
  Button("Add to Cart") { ... }
221
233
  .scaleOnPress()
222
- .hapticFeedback(.impact(.medium))
234
+ .hapticFeedback(.medium)
223
235
 
224
- // ScrollEffects parallax header
225
- ParallaxHeaderView(height: 280) { AsyncImage(url: item.imageURL) }
236
+ // Built-in staggered list items (always available)
237
+ ItemRow(item: items[index]).staggeredAppear(index: index)
226
238
 
227
- // AnimatedTransitions staggered list items
228
- ItemRow(item: items[index]).staggeredAppearance(index: index)
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 success overlay
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
- - Module selection report (`reports/02b-module-selection.md`)
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
- // MicroInteractions press feedback
152
- import { useScaleOnPress } from '../shared/MicroInteractions';
153
- import { useHapticEngine } from '../shared/HapticEngine';
154
- const { animatedStyle, handlers } = useScaleOnPress();
155
-
156
- // ScrollEffects parallax header
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
@@ -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/template-selector/SKILL.md` |
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` |