@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
@@ -100,7 +100,21 @@ 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 customization manifest. This step is MANDATORY for every build — it makes apps feel handcrafted rather than template-like.
106
+
107
+ 1. **Shadows**: Apply `.cardShadow()` to every card, list item card, and elevated surface. Use `.elevatedShadow()` for FABs and floating buttons. If no `.cardShadow()` modifier exists, add `shadow(color:radius:x:y:)` directly using the manifest's shadow tokens.
108
+ 2. **Gradients**: Apply `LinearGradient` to hero sections (detail screen headers, banner areas) and primary CTA buttons per the manifest's gradient usage plan. Use `Color.appPrimary` → `Color.appSecondary` for primary gradient.
109
+ 3. **Press feedback**: Ensure all `Button` and tappable elements use `.scaleOnPress()` or `ButtonStyle` with scale animation (scale to 0.95 on press, spring return). For key interactions (favorite toggle, submit), add `UIImpactFeedbackGenerator(style: .light).impactOccurred()`.
110
+ 4. **Staggered animations**: Ensure all `ForEach` / `LazyVStack` list views apply `.staggeredAppear(index:)` to each item. This gives lists a lively cascading entrance.
111
+ 5. **Empty states**: Enhance empty state views — add a gradient circle background behind the icon (e.g., `Circle().fill(LinearGradient(...)).frame(width: 80, height: 80)` behind the SF Symbol), and add `.slideIn()` animation to the entire empty state composition.
112
+ 6. **Glass/blur**: Apply `.ultraThinMaterial` or `.regularMaterial` to sheet backgrounds and overlay views. Use `.background(.ultraThinMaterial)` on navigation bars where appropriate.
113
+ 7. **Haptic feedback**: Add `UIImpactFeedbackGenerator` calls to favorite toggles, pull-to-refresh completions, and primary action buttons.
114
+
115
+ Verify visual hierarchy: hero elements (large images, gradients) stand out > section headers > cards (with shadows) > inline text.
116
+
117
+ ### Step 4.6 — Generate App Launcher Icon
104
118
 
105
119
  Generate a domain-specific app icon using the manifest's **App Launcher Icon** section:
106
120
 
@@ -229,26 +243,47 @@ If the customization manifest includes an **"Animation & Sensory Plan"** section
229
243
  3. **Apply the modifiers** using the imported module code:
230
244
 
231
245
  ```swift
232
- // MicroInteractions press feedback
246
+ // Built-in press feedback (always available)
233
247
  Button("Add to Cart") { ... }
234
248
  .scaleOnPress()
235
- .hapticFeedback(.impact(.medium))
249
+ .hapticFeedback(.medium)
250
+
251
+ // Built-in staggered list items (always available)
252
+ ForEach(items.indices, id: \.self) { index in
253
+ ItemRow(item: items[index])
254
+ .staggeredAppear(index: index)
255
+ }
256
+
257
+ // Built-in shadow (always available)
258
+ CardView(item: item)
259
+ .cardShadow()
236
260
 
237
- // ScrollEffects parallax header
261
+ // Built-in slide animation (always available)
262
+ EmptyStateView()
263
+ .slideIn()
264
+
265
+ // Built-in shimmer for loading placeholders (always available)
266
+ RoundedRectangle(cornerRadius: 8)
267
+ .fill(Color(.systemGray5))
268
+ .frame(height: 60)
269
+ .shimmer()
270
+
271
+ // Built-in pulse for live indicators (always available)
272
+ Circle().fill(.red).frame(width: 8, height: 8)
273
+ .pulse()
274
+
275
+ // Built-in heart bounce for favorites (always available)
276
+ Image(systemName: isFavorite ? "heart.fill" : "heart")
277
+ .heartBounce(isActive: isFavorite)
278
+
279
+ // ScrollEffects module — parallax header (if module integrated)
238
280
  ScrollView {
239
281
  ParallaxHeaderView(height: 280) {
240
282
  AsyncImage(url: item.imageURL)
241
283
  }
242
- // content below
243
- }
244
-
245
- // AnimatedTransitions — staggered list items
246
- ForEach(items.indices, id: \.self) { index in
247
- ItemRow(item: items[index])
248
- .staggeredAppearance(index: index)
249
284
  }
250
285
 
251
- // CelebrationEffects — success overlay
286
+ // CelebrationEffects module — success overlay (if module integrated)
252
287
  .celebrationOverlay(isPresented: $showCelebration, style: .confetti)
253
288
  ```
254
289
 
@@ -9,7 +9,7 @@ Integrate selected shared modules into the app by reading their reference implem
9
9
 
10
10
  ## Context You Need
11
11
 
12
- - **Module selection report** — `output/{app-name}/reports/02b-module-selection.md` — lists which modules were selected
12
+ - **Catalog analysis report** — `output/{app-name}/reports/02-catalog-analysis.md` — lists which template and modules were selected
13
13
  - **Customization manifest** — `output/{app-name}/reports/customization-manifest.md` — contains the module integration plan with placement decisions
14
14
  - **Platform** — `ios` or `android`
15
15
  - **App name and bundle ID** — for adapting imports and identifiers
@@ -19,7 +19,7 @@ Integrate selected shared modules into the app by reading their reference implem
19
19
 
20
20
  ### Step 1 — Read the Module Selection Report
21
21
 
22
- Read `output/{app-name}/reports/02b-module-selection.md` to get the list of selected modules. Read the "Module Integration Plan" section from the customization manifest to understand where each module connects.
22
+ Read the "Module Selection" section from `output/{app-name}/reports/02-catalog-analysis.md` to get the list of selected modules. Read the "Module Integration Plan" section from the customization manifest to understand where each module connects.
23
23
 
24
24
  ### Step 2 — For Each Selected Module, Integrate It
25
25
 
@@ -101,7 +101,7 @@ Mark all animation issues as `[WARN]` — they affect quality but are not build-
101
101
 
102
102
  Verify that the reports directory has the expected files:
103
103
  - `01-prompt-validation.md` exists
104
- - `02-template-selection.md` exists
104
+ - `02-catalog-analysis.md` exists
105
105
  - `03-design-brand.md` exists
106
106
  - `04-content-brief.md` exists
107
107
  - `05-customization.md` exists
@@ -133,6 +133,20 @@ const lightColors = {
133
133
  };
134
134
  ```
135
135
 
136
+ ### Step 4.5 — Visual Polish Application
137
+
138
+ Apply the **Visual Polish Plan** from the customization manifest. This step is MANDATORY — it makes apps feel handcrafted rather than template-like.
139
+
140
+ 1. **Shadows**: Apply shadow styles to every card and elevated surface. Use platform-aware styles: `shadowColor`, `shadowOffset`, `shadowOpacity`, `shadowRadius` (iOS) and `elevation` (Android). Create a `cardShadow` style object and spread it into card `StyleSheet` definitions.
141
+ 2. **Gradients**: Use `expo-linear-gradient` `LinearGradient` component for hero sections (detail screen headers, banner areas) and primary CTA buttons. Apply `colors={[colors.primary, colors.secondary]}` with `start/end` props for direction.
142
+ 3. **Press feedback**: Ensure all `TouchableOpacity` elements use `activeOpacity={0.85}` and add a scale animation on press using `Animated.spring()` (scale to 0.95, spring back). Wrap common buttons in a `ScaleButton` component.
143
+ 4. **Staggered animations**: Ensure all `FlatList` items use `useStaggeredAppear(index)` hook for animated entrance. Apply the returned `animatedStyle` to each item's `Animated.View` wrapper.
144
+ 5. **Empty states**: Enhance empty state components — add a gradient circle background behind the icon (using `LinearGradient` + `borderRadius: 40`), and add slide-in animation with `useSlideIn()`.
145
+ 6. **Blur/glass**: Use `expo-blur` `BlurView` for modal/sheet backgrounds where supported. Fall back to semi-transparent background.
146
+ 7. **Haptic feedback**: Use `expo-haptics` or React Native `Vibration` API on favorite toggles and primary actions.
147
+
148
+ Verify visual hierarchy: hero elements > section headers > cards (with shadows) > inline text.
149
+
136
150
  ### Step 5 — Data Layer & Offline Infrastructure
137
151
 
138
152
  Templates include an **offline-first data layer**. Understand these components:
@@ -252,29 +266,45 @@ If the customization manifest includes an **"Animation & Sensory Plan"** section
252
266
  3. **Apply the modifiers** using the imported module hooks/components:
253
267
 
254
268
  ```typescript
255
- // MicroInteractions press feedback
256
- import { useScaleOnPress, useStaggeredAppearance } from '../shared/MicroInteractions';
257
- import { useHapticEngine } from '../shared/HapticEngine';
269
+ // Built-in hooks (always available in animation/useAnimatedList)
270
+ import { useScaleOnPress, useStaggeredAppear, useSlideIn, cardShadowStyle, useShimmer, usePulse, useHeartBounce } from '../animation/useAnimatedList';
258
271
 
259
- const { animatedStyle, handlers } = useScaleOnPress();
260
- const haptic = useHapticEngine();
261
-
262
- <Animated.View style={animatedStyle} {...handlers}>
263
- <TouchableOpacity onPress={() => { haptic.impact('medium'); doAction(); }}>
272
+ // Press feedback
273
+ const { style: pressStyle, onPressIn, onPressOut } = useScaleOnPress();
274
+ <Animated.View style={pressStyle}>
275
+ <Pressable onPressIn={onPressIn} onPressOut={onPressOut} onPress={doAction}>
264
276
  <Text>Add to Cart</Text>
265
- </TouchableOpacity>
277
+ </Pressable>
266
278
  </Animated.View>
267
279
 
268
- // ScrollEffects parallax header
269
- import { ParallaxHeader } from '../shared/ScrollEffects';
280
+ // Staggered list items
281
+ const animStyle = useStaggeredAppear(index);
282
+ <Animated.View style={animStyle}><ItemCard item={item} /></Animated.View>
270
283
 
271
- <ParallaxHeader height={280} imageSource={item.imageUrl}>
272
- {/* content below */}
273
- </ParallaxHeader>
284
+ // Card shadow
285
+ <View style={[styles.card, cardShadowStyle()]}>{/* content */}</View>
274
286
 
275
- // CelebrationEffects — success overlay
276
- import { CelebrationOverlay } from '../shared/CelebrationEffects';
287
+ // Slide-in animation
288
+ const slideStyle = useSlideIn();
289
+ <Animated.View style={slideStyle}><EmptyState /></Animated.View>
277
290
 
291
+ // Shimmer for loading placeholders
292
+ const shimmerStyle = useShimmer();
293
+ <Animated.View style={[styles.placeholder, shimmerStyle]} />
294
+
295
+ // Pulse for live indicators
296
+ const pulseStyle = usePulse();
297
+ <Animated.View style={[styles.dot, pulseStyle]} />
298
+
299
+ // Heart bounce for favorite toggles
300
+ const heartStyle = useHeartBounce(isFavorite);
301
+ <Animated.View style={heartStyle}><HeartIcon /></Animated.View>
302
+
303
+ // Modules (if integrated)
304
+ import { ParallaxHeader } from '../shared/ScrollEffects';
305
+ <ParallaxHeader height={280} imageSource={item.imageUrl} />
306
+
307
+ import { CelebrationOverlay } from '../shared/CelebrationEffects';
278
308
  <CelebrationOverlay isActive={showCelebration} style="confetti" />
279
309
  ```
280
310
 
@@ -0,0 +1,199 @@
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 with per-screen checklists, edge cases, and regression checks.
4
+ ---
5
+
6
+ # Test Planner Skill
7
+
8
+ Use this skill to analyze the app's source code and produce a structured test plan. This runs entirely offline — no simulator or device interaction needed.
9
+
10
+ ## When to Use
11
+
12
+ - As Phase 1 of the `--deep-test` pipeline
13
+ - Before any simulator is booted
14
+ - When you need visibility into what will be tested before testing starts
15
+
16
+ ## Context You Need
17
+
18
+ - **App directory** — path under `output/` (e.g., `output/pawspa-ios/`)
19
+ - **Platform** — `ios`, `android`, or `react-native`
20
+ - **App name** — display name (e.g., "PawSpa")
21
+ - **Bundle ID** — e.g., `com.pawspa.app`
22
+
23
+ ## Instructions
24
+
25
+ ### Step 1 — Gather App Inventory
26
+
27
+ Read the following files from the app directory to build a full picture of the app:
28
+
29
+ 1. **`TESTING_MANIFEST.md`** — all test IDs, screen inventory, element counts, navigation paths. This is the primary reference for what exists in the app.
30
+
31
+ 2. **`AppConfig`** — feature flags, enabled/disabled features, business rules, categories, content configuration. Look for:
32
+ - iOS: search for `AppConfig.swift` or `Configuration.swift`
33
+ - Android: search for `AppConfig.kt` or `Configuration.kt`
34
+ - React Native: search for `AppConfig.ts` or `config.ts`
35
+
36
+ 3. **`MockDataProvider`** — what data exists, how many items per collection, data structure, categories. Look for:
37
+ - iOS: `MockDataProvider.swift`
38
+ - Android: `MockDataProvider.kt`
39
+ - React Native: `MockDataProvider.ts`
40
+
41
+ 4. **`customization-manifest.md`** (if exists in `reports/`) — screen descriptions, expected behavior, feature toggles, domain content decisions.
42
+
43
+ 5. **`summary.json`** (if exists in `reports/`) — previous build/test results, template used, design brand.
44
+
45
+ 6. **`requirements.md` or `PRD.md`** (if exists in the app root) — user-provided requirements for business logic test cases.
46
+
47
+ ### Step 2 — Scan All Screens
48
+
49
+ Read all View files to discover every screen in the app:
50
+
51
+ - **iOS**: files matching `*View.swift` in the Views/ or Features/ directories
52
+ - **Android**: files matching `*Screen.kt` in the ui/ or features/ directories
53
+ - **React Native**: files matching `*Screen.tsx` or `*View.tsx` in the screens/ or components/ directories
54
+
55
+ For each screen, extract:
56
+
57
+ 1. **Interactive elements** — buttons, toggles, text fields, pickers, sliders, list items, FABs, navigation bar items
58
+ 2. **Navigation targets** — where each button/link navigates to
59
+ 3. **Data dependencies** — what data from MockDataProvider this screen displays
60
+ 4. **Feature flags** — which AppConfig flags control visibility of elements on this screen
61
+ 5. **Accessibility identifiers** — cross-reference with TESTING_MANIFEST.md
62
+
63
+ ### Step 3 — Scan All ViewModels
64
+
65
+ Read all ViewModel files to understand state and logic:
66
+
67
+ - **iOS**: files matching `*ViewModel.swift`
68
+ - **Android**: files matching `*ViewModel.kt`
69
+ - **React Native**: files matching `*ViewModel.ts` or `use*.ts` (hooks)
70
+
71
+ For each ViewModel, extract:
72
+
73
+ 1. **State transitions** — what actions trigger state changes (loading, error, empty, populated)
74
+ 2. **CRUD operations** — create, update, delete, toggle favorite, etc.
75
+ 3. **Filter/search logic** — how search queries filter data
76
+ 4. **Validation rules** — form validation, input constraints
77
+ 5. **Side effects** — what happens after actions (navigation, alerts, data refresh)
78
+
79
+ ### Step 4 — Build the Test Matrix
80
+
81
+ Produce a structured test plan with the following sections:
82
+
83
+ #### 4a — App Overview
84
+
85
+ Summarize the app: name, platform, template used, number of screens, number of tabs, key features, total interactive elements estimated.
86
+
87
+ #### 4b — Per-Screen Test Cases
88
+
89
+ For **each screen**, create a checklist of test cases:
90
+
91
+ ```markdown
92
+ ### Screen: {ScreenName}
93
+ **File:** {path to view file}
94
+ **Elements:** {count} interactive elements
95
+ **Data:** {data source from MockDataProvider}
96
+
97
+ #### Rendering
98
+ - [ ] Screen renders without crash
99
+ - [ ] Correct title/header displayed
100
+ - [ ] Expected number of items shown ({N} items from MockDataProvider)
101
+ - [ ] All images/icons load correctly
102
+ - [ ] No template leftover text visible
103
+
104
+ #### Navigation
105
+ - [ ] Can navigate TO this screen (from: {source})
106
+ - [ ] Can navigate BACK from this screen
107
+ - [ ] {specific navigation: e.g., "Tap item navigates to DetailView"}
108
+
109
+ #### Interactions
110
+ - [ ] {Button name}: tap triggers {expected action}
111
+ - [ ] {Toggle name}: tap changes state from {A} to {B}
112
+ - [ ] {Text field name}: can type and submit
113
+ - [ ] {List item}: tap opens detail
114
+ ...
115
+
116
+ #### State
117
+ - [ ] {State transition: e.g., "Search filters items correctly"}
118
+ - [ ] {State transition: e.g., "Toggle favorite persists"}
119
+ ```
120
+
121
+ #### 4c — Edge Cases
122
+
123
+ List edge cases to test across the app:
124
+
125
+ - **Empty states** — what screens look like with no data
126
+ - **Long text** — labels with very long content (truncation, wrapping)
127
+ - **Rapid interactions** — tapping the same button multiple times quickly
128
+ - **Deep navigation** — navigating 3+ levels deep and back
129
+ - **Tab switching** — switching tabs preserves state
130
+ - **Scroll behavior** — scrolling to the bottom of long lists
131
+ - **Form validation** — submitting empty forms, invalid input
132
+
133
+ #### 4d — Regression Checks
134
+
135
+ - No template leftover text on any screen (check for: template name, "Lorem ipsum", "Item 1", "Product", generic placeholders)
136
+ - All accessibility identifiers present (from TESTING_MANIFEST.md)
137
+ - All images render (no broken image placeholders)
138
+ - Navigation back works from every screen
139
+ - All tabs are reachable and show correct content
140
+
141
+ #### 4e — Requirements-Based Tests (if requirements.md/PRD.md exists)
142
+
143
+ Parse the requirements document and create test cases for each stated requirement:
144
+
145
+ ```markdown
146
+ ### Requirement: {requirement description}
147
+ - [ ] {test case derived from requirement}
148
+ - [ ] {test case derived from requirement}
149
+ ```
150
+
151
+ ### Step 5 — Assign Priorities
152
+
153
+ Mark each test case with a priority:
154
+
155
+ - **P0 (Critical)** — app crashes, data loss, navigation broken
156
+ - **P1 (High)** — features don't work, wrong data displayed
157
+ - **P2 (Medium)** — visual issues, accessibility gaps, minor UX problems
158
+ - **P3 (Low)** — cosmetic, nice-to-have improvements
159
+
160
+ ### Step 6 — Estimate Counts
161
+
162
+ At the end of the test plan, add a summary:
163
+
164
+ ```markdown
165
+ ## Test Plan Summary
166
+ - Total screens: {N}
167
+ - Total test cases: {N}
168
+ - P0 (Critical): {N}
169
+ - P1 (High): {N}
170
+ - P2 (Medium): {N}
171
+ - P3 (Low): {N}
172
+ - Estimated interactive elements: {N}
173
+ ```
174
+
175
+ ## Report Output
176
+
177
+ Write the test plan to `output/{app-name}/reports/10-test-plan.md`.
178
+
179
+ Update `summary.json` — read the existing file, add a step entry:
180
+
181
+ ```json
182
+ {
183
+ "step": 10,
184
+ "name": "test-plan",
185
+ "result": "PASS",
186
+ "totalScreens": 0,
187
+ "totalTestCases": 0,
188
+ "priorities": { "P0": 0, "P1": 0, "P2": 0, "P3": 0 }
189
+ }
190
+ ```
191
+
192
+ ## Important Rules
193
+
194
+ - This is a **read-only** analysis phase — do NOT modify any source files
195
+ - Do NOT boot any simulators or use ai-tester MCP tools
196
+ - Read the actual source files, not just the TESTING_MANIFEST — the manifest may be incomplete
197
+ - Every interactive element discovered in the source code should have at least one test case
198
+ - If `requirements.md` or `PRD.md` exists, MUST include requirements-based test cases
199
+ - The test plan should be detailed enough that another agent can execute it without reading the source code
package/AGENTS.md CHANGED
@@ -29,8 +29,8 @@ flowchart TD
29
29
  S6 -->|Build fails| S6fix["Fix errors"]
30
30
  S6fix --> S6
31
31
 
32
- S6 -->|Build succeeds| S7["Step 7: PARALLEL — Security Audit + Validation"]
33
- S7 --> S8["Step 8: Boot Simulators"]
32
+ S6 -->|Build succeeds| S7["Step 7: PARALLEL — Audits + Boot Sims"]
33
+ S7 --> S8["Step 8: Install App"]
34
34
  S8 --> S9["Step 9: PARALLEL — Interactive UI Testing (2-3 simulators)"]
35
35
 
36
36
  S9 -->|Bug found| S9fix["Fix + rebuild"]
@@ -45,18 +45,18 @@ flowchart TD
45
45
 
46
46
  | Step | Name | Parallelism | What Happens |
47
47
  |------|------|-------------|-------------|
48
- | 0 | Analysis Phase | **4 parallel tasks** | Validate prompt + select template + select design brand + select shared modules concurrently. Abort if validation fails. |
48
+ | 0 | Analysis Phase | **3 parallel tasks** | Validate prompt + catalog analysis (template + modules) + design brand concurrently. Abort if validation fails. |
49
49
  | 1 | Clone Template | — | Copy the template into `output/{app-name}/`. |
50
50
  | 2 | Rename App | — | Update display name, bundle ID, package name, all code references. Uses script if available. |
51
51
  | 3 | Customization Planning | — | Produce a manifest with design brief, content brief, AppConfig values, mock data spec, module integration plan, per-screen changes, and parallel batches. |
52
52
  | 4 | Update Shared Files + Integrate Modules | — | Apply manifest to AppConfig, MockDataProvider, Theme/Colors. Integrate selected modules by reading references from `templates/shared/` and writing adapted code into the app. |
53
53
  | 5 | Screen Customization | **2-3 parallel subagents** | Each subagent runs the platform customizer skill (ios-customizer, android-customizer, or react-native-customizer) on its assigned batch of screen files from the manifest. |
54
54
  | 6 | Build | — | Compile the app. Fix errors and rebuild until it succeeds. Save the artifact path. |
55
- | 7 | Post-Build Audits | **2 parallel tasks** | Security audit + output validation run concurrently. |
56
- | 8 | Boot Simulators | — | Boot 2-3 simulators, install app on all. |
55
+ | 7 | Audits + Boot Sims | **3 parallel tasks** | Security audit + output validation + boot simulators run concurrently (sim boot is independent, saves ~30-60s). |
56
+ | 8 | Install App | — | Install the build artifact on all (already booted) simulators. |
57
57
  | 9 | Interactive Testing | **2-3 parallel subagents** | Each subagent tests its screen batch on its own simulator. Fix bugs if found. |
58
58
  | 10 | Maestro Tests | **2-3 parallel subagents** | Each subagent runs its YAML test batch on its own simulator. All must pass. |
59
- | 11 | Screenshot Collection | — | Capture one clean screenshot per main tab using ai-tester. Save to `screenshots/` for GitHub PRs and README. |
59
+ | 11 | Screenshots + Cleanup | — | Capture one clean screenshot per main tab using ai-tester. Shut down simulators. |
60
60
 
61
61
  ### Quick Build Workflow
62
62
 
@@ -81,19 +81,38 @@ When `--scratch` is used, the workflow changes. The agent reads templates as ref
81
81
 
82
82
  | Step | Name | Parallelism | What Happens |
83
83
  |------|------|-------------|-------------|
84
- | 0 | Analysis Phase | **4 parallel tasks** | Same as template mode: validate prompt + select 1-3 reference templates + select design brand + select shared modules. |
84
+ | 0 | Analysis Phase | **3 parallel tasks** | Same as template mode: validate prompt + catalog analysis (1-3 reference templates + modules) + design brand. |
85
85
  | 1 | Architecture + Content Planning | -- | Read reference templates and module list. Plan screens, models, navigation. Produce content brief with all user-facing strings. Account for which features modules provide. |
86
86
  | 2 | Project Scaffolding | -- | Create a new Xcode/Gradle/React Native project from scratch. Verify it compiles. |
87
87
  | 3 | Module Integration | -- | Read shared module references from `templates/shared/` and write adapted code into the project. Done before custom code so the agent builds on module APIs. |
88
88
  | 4 | Write All Code + Design | -- | Write screens, viewmodels, models, mock data, theme. Apply design brand. Use content brief for all strings. |
89
89
  | 5 | Build | -- | Same as template mode. |
90
- | 6 | Post-Build Audits | **2 parallel tasks** | Same as template mode. |
91
- | 7 | Boot Simulators | -- | Same as template mode. |
90
+ | 6 | Audits + Boot Sims | **3 parallel tasks** | Same as template mode. |
91
+ | 7 | Install App | -- | Same as template mode. |
92
92
  | 8 | Interactive Testing | **2-3 parallel subagents** | Same as template mode. |
93
93
  | 9 | Maestro Tests | **2-3 parallel subagents** | Same as template mode. |
94
94
 
95
95
  Key differences: no clone/rename steps, modules read from `templates/shared/` as reference and adapted into the project, content planned before implementation, agent has full architectural freedom.
96
96
 
97
+ ### Deep Test Workflow
98
+
99
+ When `--deep-test <app-name>` is used, AppAgent runs a comprehensive 4-phase testing pipeline on a previously built app. Optionally auto-fixes discovered bugs with `--fix`.
100
+
101
+ ```bash
102
+ appagent --deep-test my-app # test only
103
+ appagent --deep-test my-app --fix # test + auto-fix
104
+ appagent --fix my-app # standalone fix from existing bug report
105
+ ```
106
+
107
+ | Phase | Name | Parallelism | What Happens |
108
+ |-------|------|-------------|-------------|
109
+ | 1 | Test Plan Generation | -- | Analyze source code offline (Views, ViewModels, AppConfig, MockDataProvider). Produce `10-test-plan.md`. |
110
+ | 2 | Exploratory Testing | **Parallel with Phase 3** | Screenshot + a11y tree driven testing on Simulator 1. Does NOT read source code. Finds visual, a11y, UX, content bugs. |
111
+ | 3 | Structured Testing | **Parallel with Phase 2** | Follows test plan from Phase 1 on Simulator 2+. Marks each test case pass/fail. |
112
+ | 4 | Auto-Fix (optional) | -- | Reads merged bug report, fixes each bug, rebuilds, verifies. Only runs with `--fix`. |
113
+
114
+ Key differences from `--test`: generates a test plan before testing, adds exploratory testing driven by screenshots + accessibility tree, produces a structured bug report, supports standalone fix mode.
115
+
97
116
  ### Update Workflow
98
117
 
99
118
  When `--update <source>` is used, AppAgent modifies an existing app instead of creating a new one. The source can be a GitHub URL, a local path, or an app name from `output/`.
@@ -127,9 +146,8 @@ Skills are self-contained documents the agent reads when it reaches a workflow s
127
146
  | Step | Skill | Report File |
128
147
  |------|-------|------------|
129
148
  | 0 | prompt-validator | `01-prompt-validation.md` |
130
- | 0 | template-selector | `02-template-selection.md` |
149
+ | 0 | catalog-analyzer | `02-catalog-analysis.md` |
131
150
  | 0 | design-selector | `03-design-brand.md` |
132
- | 0 | module-selector | `02b-module-selection.md` |
133
151
  | 4 | module-integrator | -- |
134
152
  | 2 | app-renaming | -- |
135
153
  | 3 | customization-planner | `customization-manifest.md` |
@@ -144,6 +162,9 @@ Skills are self-contained documents the agent reads when it reaches a workflow s
144
162
  | 7 | code-auditor | `07-security-audit.md` |
145
163
  | 7 | output-validator | `08-validation.md` |
146
164
  | 8-10 | ui-tester | `09-ui-testing.md` |
165
+ | deep-test (Phase 1) | test-planner | `10-test-plan.md` |
166
+ | deep-test (Phase 2) | exploratory-tester | `11-bug-report.md` |
167
+ | deep-test (Phase 4) | bug-fixer | `12-fix-report.md` |
147
168
 
148
169
  Skills that share a step with other activities (e.g., Steps 4's multiple skills all contribute to shared file updates) run sequentially within that step. The `customization-planner` (Step 3) is the key enabler — it produces a manifest that drives all subsequent steps and enables parallel screen customization (Step 5) and parallel UI testing (Steps 8-10).
149
170