@shaykec/app-agent 1.0.8 → 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 (213) hide show
  1. package/.claude/agents/android-customizer.md +9 -1
  2. package/.claude/agents/catalog-analyzer.md +57 -0
  3. package/.claude/agents/ios-customizer.md +9 -1
  4. package/.claude/agents/react-native-customizer.md +71 -0
  5. package/.claude/skills/android-customizer/SKILL.md +108 -23
  6. package/.claude/skills/bug-fixer/SKILL.md +59 -0
  7. package/.claude/skills/catalog-analyzer/SKILL.md +96 -0
  8. package/.claude/skills/customization-planner/SKILL.md +44 -5
  9. package/.claude/skills/design-selector/SKILL.md +3 -1
  10. package/.claude/skills/design-system/SKILL.md +1 -1
  11. package/.claude/skills/exploratory-tester/SKILL.md +82 -0
  12. package/.claude/skills/ios-customizer/SKILL.md +123 -23
  13. package/.claude/skills/module-integrator/SKILL.md +1 -1
  14. package/.claude/skills/react-native-customizer/SKILL.md +97 -11
  15. package/.claude/skills/test-planner/SKILL.md +72 -0
  16. package/.cursor/agents/README.md +3 -1
  17. package/.cursor/agents/android-customizer.md +15 -11
  18. package/.cursor/agents/catalog-analyzer.md +83 -0
  19. package/.cursor/agents/ios-customizer.md +15 -10
  20. package/.cursor/agents/react-native-customizer.md +170 -0
  21. package/.cursor/mcp.json +2 -10
  22. package/.cursor/rules/safety-guardrails.mdc +1 -1
  23. package/.cursor/rules/workflow.mdc +52 -18
  24. package/.cursor/skills/android-customizer/SKILL.md +46 -22
  25. package/.cursor/skills/bug-fixer/SKILL.md +189 -0
  26. package/.cursor/skills/catalog-analyzer/SKILL.md +222 -0
  27. package/.cursor/skills/customization-planner/SKILL.md +55 -8
  28. package/.cursor/skills/design-selector/SKILL.md +6 -5
  29. package/.cursor/skills/design-system/SKILL.md +8 -7
  30. package/.cursor/skills/exploratory-tester/SKILL.md +223 -0
  31. package/.cursor/skills/ios-customizer/SKILL.md +50 -15
  32. package/.cursor/skills/module-integrator/SKILL.md +2 -2
  33. package/.cursor/skills/output-validator/SKILL.md +1 -1
  34. package/.cursor/skills/react-native-customizer/SKILL.md +115 -25
  35. package/.cursor/skills/test-planner/SKILL.md +199 -0
  36. package/AGENTS.md +32 -11
  37. package/CLAUDE.md +78 -33
  38. package/README.md +77 -11
  39. package/designs/DESIGN_CATALOG.md +17 -15
  40. package/designs/DESIGN_PRINCIPLES.md +53 -0
  41. package/designs/brands/accessible-high-contrast.md +14 -0
  42. package/designs/brands/corporate-professional.md +14 -0
  43. package/designs/brands/dark-luxe.md +14 -0
  44. package/designs/brands/kids-playful.md +14 -0
  45. package/designs/brands/medical-clinical.md +14 -0
  46. package/designs/brands/modern-minimal.md +14 -0
  47. package/designs/brands/nature-organic.md +14 -0
  48. package/designs/brands/neo-brutalist.md +14 -0
  49. package/designs/brands/retro-vintage.md +14 -0
  50. package/designs/brands/soft-gradient.md +14 -0
  51. package/designs/brands/sport-athletic.md +14 -0
  52. package/designs/brands/tech-dynamic.md +14 -0
  53. package/designs/brands/vibrant-playful.md +14 -0
  54. package/dist/cli.d.ts +4 -2
  55. package/dist/cli.d.ts.map +1 -1
  56. package/dist/cli.js +91 -1
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config.d.ts +2 -0
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +2 -0
  61. package/dist/config.js.map +1 -1
  62. package/dist/engines/claude-engine.d.ts.map +1 -1
  63. package/dist/engines/claude-engine.js +16 -4
  64. package/dist/engines/claude-engine.js.map +1 -1
  65. package/dist/engines/types.d.ts +1 -1
  66. package/dist/engines/types.d.ts.map +1 -1
  67. package/dist/engines/types.js +31 -2
  68. package/dist/engines/types.js.map +1 -1
  69. package/dist/github.d.ts +3 -0
  70. package/dist/github.d.ts.map +1 -1
  71. package/dist/github.js +47 -4
  72. package/dist/github.js.map +1 -1
  73. package/dist/index.js +217 -9
  74. package/dist/index.js.map +1 -1
  75. package/dist/prompt-builder.d.ts +11 -1
  76. package/dist/prompt-builder.d.ts.map +1 -1
  77. package/dist/prompt-builder.js +216 -1
  78. package/dist/prompt-builder.js.map +1 -1
  79. package/dist/validator.d.ts +7 -2
  80. package/dist/validator.d.ts.map +1 -1
  81. package/dist/validator.js +61 -41
  82. package/dist/validator.js.map +1 -1
  83. package/dist/workspace.js +2 -2
  84. package/dist/workspace.js.map +1 -1
  85. package/package.json +2 -2
  86. package/prompts/agent-prompt.md +35 -18
  87. package/prompts/deep-test-agent-prompt.md +122 -0
  88. package/prompts/fix-agent-prompt.md +90 -0
  89. package/prompts/quick-agent-prompt.md +32 -2
  90. package/prompts/scratch-agent-prompt.md +5 -8
  91. package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  92. package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  93. package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +1 -1
  94. package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  95. package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/MainScreen.kt +1 -0
  96. package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  97. package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/navigation/MainNavigation.kt +5 -1
  98. package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  99. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  100. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/MotionPreferencesScreen.kt +3 -3
  101. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/navigation/Navigation.kt +1 -1
  102. package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/settings/SettingsScreen.kt +1 -1
  103. package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  104. package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  105. package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  106. package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  107. package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +3 -2
  108. package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  109. package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/settings/SettingsScreen.kt +1 -1
  110. package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  111. package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +3 -2
  112. package/templates/android/Skeleton/TESTING_MANIFEST.md +2 -1
  113. package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/MainActivity.kt +23 -2
  114. package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  115. package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/theme/AppearanceManager.kt +42 -0
  116. package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/profile/ProfileScreen.kt +20 -8
  117. package/templates/android/Skeleton/tests/03_detail_screen.yaml +3 -2
  118. package/templates/android/Skeleton/tests/04_favorites.yaml +3 -2
  119. package/templates/android/Skeleton/tests/08_full_e2e.yaml +9 -2
  120. package/templates/android/Skeleton/tests/09_dark_mode.yaml +50 -0
  121. package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  122. package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  123. package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/settings/SettingsScreen.kt +3 -2
  124. package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/animation/AnimatedTransitionsModifiers.kt +188 -0
  125. package/templates/ios/BookTemplate/BookTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  126. package/templates/ios/ChatTemplate/ChatTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  127. package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +1 -0
  128. package/templates/ios/DashTemplate/DashTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  129. package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +13 -0
  130. package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +32 -20
  131. package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  132. package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  133. package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Strings.swift +42 -0
  134. package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +36 -30
  135. package/templates/ios/GameTemplate/GameTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  136. package/templates/ios/HealthTemplate/HealthTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  137. package/templates/ios/LearnTemplate/LearnTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  138. package/templates/ios/MapTemplate/MapTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  139. package/templates/ios/MediaTemplate/MediaTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  140. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  141. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +12 -0
  142. package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingView.swift +2 -37
  143. package/templates/ios/ShopTemplate/ShopTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  144. package/templates/ios/Skeleton/Skeleton/Core/Animation/AnimatedTransitionsView.swift +201 -0
  145. package/templates/ios/Skeleton/tests/08_full_e2e.yaml +4 -0
  146. package/templates/ios/Skeleton/tests/09_dark_mode.yaml +52 -0
  147. package/templates/ios/SocialTemplate/SocialTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  148. package/templates/ios/TaskTemplate/TaskTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  149. package/templates/ios/TrackTemplate/TrackTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
  150. package/templates/react-native/BookTemplate/src/animation/useAnimatedList.ts +219 -2
  151. package/templates/react-native/BookTemplate/src/animation/useMotionPreferences.ts +23 -9
  152. package/templates/react-native/BookTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  153. package/templates/react-native/ChatTemplate/src/animation/useAnimatedList.ts +219 -2
  154. package/templates/react-native/ChatTemplate/src/animation/useMotionPreferences.ts +23 -9
  155. package/templates/react-native/ChatTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  156. package/templates/react-native/DashTemplate/src/animation/useAnimatedList.ts +219 -2
  157. package/templates/react-native/DashTemplate/src/animation/useMotionPreferences.ts +23 -9
  158. package/templates/react-native/DashTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  159. package/templates/react-native/FamilyTemplate/src/animation/useAnimatedList.ts +219 -2
  160. package/templates/react-native/FamilyTemplate/src/animation/useMotionPreferences.ts +23 -9
  161. package/templates/react-native/FamilyTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  162. package/templates/react-native/FinanceTemplate/src/animation/useAnimatedList.ts +219 -2
  163. package/templates/react-native/FinanceTemplate/src/animation/useMotionPreferences.ts +23 -9
  164. package/templates/react-native/FinanceTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  165. package/templates/react-native/GameTemplate/src/animation/useAnimatedList.ts +219 -2
  166. package/templates/react-native/GameTemplate/src/animation/useMotionPreferences.ts +23 -9
  167. package/templates/react-native/GameTemplate/src/screens/GameDetail/GameDetailScreen.tsx +2 -1
  168. package/templates/react-native/GameTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  169. package/templates/react-native/HealthTemplate/src/animation/useAnimatedList.ts +219 -2
  170. package/templates/react-native/HealthTemplate/src/animation/useMotionPreferences.ts +23 -9
  171. package/templates/react-native/HealthTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  172. package/templates/react-native/HealthTemplate/src/screens/WorkoutDetail/WorkoutDetailScreen.tsx +1 -1
  173. package/templates/react-native/LearnTemplate/src/animation/useAnimatedList.ts +219 -2
  174. package/templates/react-native/LearnTemplate/src/animation/useMotionPreferences.ts +23 -9
  175. package/templates/react-native/LearnTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  176. package/templates/react-native/MapTemplate/src/animation/useAnimatedList.ts +219 -2
  177. package/templates/react-native/MapTemplate/src/animation/useMotionPreferences.ts +23 -9
  178. package/templates/react-native/MapTemplate/src/screens/Map/MapScreen.tsx +14 -0
  179. package/templates/react-native/MapTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  180. package/templates/react-native/MediaTemplate/src/animation/useAnimatedList.ts +219 -2
  181. package/templates/react-native/MediaTemplate/src/animation/useMotionPreferences.ts +23 -9
  182. package/templates/react-native/MediaTemplate/src/screens/PlaylistDetail/PlaylistDetailScreen.tsx +1 -1
  183. package/templates/react-native/MediaTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  184. package/templates/react-native/ReferenceTemplate/src/animation/useAnimatedList.ts +219 -2
  185. package/templates/react-native/ReferenceTemplate/src/animation/useMotionPreferences.ts +23 -9
  186. package/templates/react-native/ReferenceTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
  187. package/templates/react-native/ShopTemplate/src/animation/useAnimatedList.ts +219 -2
  188. package/templates/react-native/ShopTemplate/src/animation/useMotionPreferences.ts +23 -9
  189. package/templates/react-native/ShopTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  190. package/templates/react-native/Skeleton/TESTING_MANIFEST.md +2 -1
  191. package/templates/react-native/Skeleton/src/animation/useAnimatedList.ts +219 -2
  192. package/templates/react-native/Skeleton/src/animation/useMotionPreferences.ts +23 -9
  193. package/templates/react-native/Skeleton/src/screens/Profile/ProfileScreen.tsx +1 -1
  194. package/templates/react-native/Skeleton/tests/07_profile.yaml +3 -2
  195. package/templates/react-native/Skeleton/tests/08_full_e2e.yaml +12 -1
  196. package/templates/react-native/Skeleton/tests/09_dark_mode.yaml +46 -0
  197. package/templates/react-native/SocialTemplate/src/animation/useAnimatedList.ts +219 -2
  198. package/templates/react-native/SocialTemplate/src/animation/useMotionPreferences.ts +23 -9
  199. package/templates/react-native/SocialTemplate/src/screens/Feed/FeedScreen.tsx +1 -0
  200. package/templates/react-native/SocialTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  201. package/templates/react-native/TaskTemplate/src/animation/useAnimatedList.ts +219 -2
  202. package/templates/react-native/TaskTemplate/src/animation/useMotionPreferences.ts +23 -9
  203. package/templates/react-native/TaskTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
  204. package/templates/react-native/TrackTemplate/src/animation/useAnimatedList.ts +219 -2
  205. package/templates/react-native/TrackTemplate/src/animation/useMotionPreferences.ts +23 -9
  206. package/templates/react-native/TrackTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
  207. package/templates/shared/ios/AnimatedTransitions/AnimatedTransitionsView.swift +233 -93
  208. package/.claude/agents/template-selector.md +0 -39
  209. package/.claude/skills/module-selector/SKILL.md +0 -81
  210. package/.claude/skills/template-selector/SKILL.md +0 -44
  211. package/.cursor/agents/template-selector.md +0 -52
  212. package/.cursor/skills/module-selector/SKILL.md +0 -135
  213. package/.cursor/skills/template-selector/SKILL.md +0 -123
@@ -48,10 +48,18 @@ POTENTIAL ISSUES:
48
48
  - {concerns needing manual review}
49
49
  ```
50
50
 
51
+ ### Data Layer
52
+ - Use `DataSourceResolver.repository`, not `MockDataProvider` directly
53
+ - Preserve MockDataProvider CRUD functions and `reset()` method
54
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
55
+
51
56
  ## Rules
52
57
  - ONLY edit files under `output/`
53
58
  - Ensure all package declarations match directory structure
54
59
  - Keep Hilt annotations intact (@HiltAndroidApp, @HiltViewModel, @AndroidEntryPoint)
55
60
  - Keep build.gradle.kts syntactically valid
56
- - Preserve MockDataProvider function signatures
61
+ - Preserve MockDataProvider CRUD functions and `reset()` method
62
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
57
63
  - Use Material 3 components (not legacy Material 2)
64
+ - Preserve ALL `Modifier.testTag()` calls — do NOT remove test IDs
65
+ - Follow `{screen}_{element}_{role}` convention for new test tags (see `templates/TEST_ID_CONVENTIONS.md`)
@@ -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
@@ -46,9 +46,17 @@ POTENTIAL ISSUES:
46
46
  - {concerns needing manual review}
47
47
  ```
48
48
 
49
+ ### Data Layer
50
+ - Use `DataSourceResolver.repository` in ViewModels, not `MockDataProvider.shared` directly
51
+ - Preserve MockDataProvider CRUD methods and `reset()` function
52
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
53
+
49
54
  ## Rules
50
55
  - ONLY edit files under `output/` — never touch `templates/`
51
56
  - Ensure all imports resolve after changes
52
57
  - Keep `@main` struct and `App` protocol conformance intact
53
- - Preserve MockDataProvider function signatures
58
+ - Preserve MockDataProvider CRUD methods and `reset()` function
59
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
54
60
  - Use SF Symbols for tab and navigation icons
61
+ - Preserve ALL `.accessibilityIdentifier()` calls — do NOT remove test IDs
62
+ - Follow `{screen}_{element}_{role}` convention for new test IDs (see `templates/TEST_ID_CONVENTIONS.md`)
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: react-native-customizer
3
+ description: Specialized React Native/TypeScript subagent for customizing React Native app templates. Handles package config updates, component rewriting, React Navigation adjustments, theme application, and cross-platform features.
4
+ tools: Read, Edit, Write, Grep, Glob, LS, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ You are an expert React Native developer specializing in TypeScript and modern mobile development. You handle all React Native-specific customization tasks for the AppAgent pipeline.
9
+
10
+ ## Your Expertise
11
+ - React Native 0.73+, TypeScript 5+, React Navigation 6+
12
+ - MVVM architecture with custom hooks (`useXxxViewModel`)
13
+ - StyleSheet.create() for performant styling
14
+ - FlatList / SectionList for virtualized lists
15
+ - React Context for theming and global state
16
+
17
+ ## Tasks You Handle
18
+
19
+ ### Package & Project Renaming
20
+ 1. Update `package.json` — `name` field
21
+ 2. Update `app.json` — `name` and `displayName`
22
+ 3. Update `android/app/build.gradle` — `applicationId`, `namespace`
23
+ 4. Update `android/settings.gradle` — `rootProject.name`
24
+ 5. Update `android/app/src/main/res/values/strings.xml` — `app_name`
25
+ 6. Update `android/app/src/main/java/` — package directories, `MainActivity.kt`, `MainApplication.kt`
26
+ 7. Update `ios/Podfile` — project target name
27
+ 8. Update all imports if module paths changed
28
+
29
+ ### React Native Component Customization
30
+ - Use functional components with `React.FC` typing
31
+ - Use custom hooks (`useXxxViewModel`) for state and business logic
32
+ - Use `StyleSheet.create()` for all styles — no inline style objects
33
+ - Use `FlatList` / `SectionList` for lists (not `map()` on `ScrollView`)
34
+ - Add `testID` props to ALL interactive elements
35
+
36
+ ### Navigation Structure
37
+ Templates use React Navigation with bottom tabs and native stack. When modifying:
38
+ - Update tab names and components in `AppNavigator.tsx`
39
+ - Update `RootStackParamList` type for type-safe navigation
40
+ - Apply tab labels from content brief and icons from design brief
41
+
42
+ ### Theme Customization
43
+ - Update `ThemeContext.tsx` colors to match brand palette
44
+ - Provide both light and dark mode variants
45
+ - Apply corner radius, spacing, and typography tokens
46
+
47
+ ## Output
48
+ ```
49
+ FILES MODIFIED:
50
+ - {path}: {what changed}
51
+ POTENTIAL ISSUES:
52
+ - {concerns needing manual review}
53
+ ```
54
+
55
+ ### Data Layer
56
+ - Use `DataSourceResolver.repository` in ViewModel hooks, not `MockDataProvider` directly
57
+ - Preserve MockDataProvider CRUD methods and `reset()` function
58
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
59
+
60
+ ## Rules
61
+ - ONLY edit files under `output/` — never touch `templates/`
62
+ - Ensure all imports resolve after changes
63
+ - Preserve MockDataProvider CRUD methods and `reset()` function
64
+ - Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
65
+ - Ensure OfflineBanner is integrated into main navigation screens
66
+ - Use `testID` props on ALL interactive elements
67
+ - Follow `{screen}_{element}_{role}` convention for test IDs (see `templates/TEST_ID_CONVENTIONS.md`)
68
+ - Use `StyleSheet.create()` for styles, not inline objects
69
+ - Keep React Navigation structure intact
70
+ - Preserve ThemeContext provider wrapping in App.tsx
71
+ - Do NOT introduce new npm dependencies
@@ -9,7 +9,7 @@ Use this skill to perform deep Android/Kotlin/Compose customization on a cloned
9
9
 
10
10
  ## When to Use
11
11
 
12
- - At Step 8 of the AppAgent workflow, when the platform is Android
12
+ - At Step 5 of the AppAgent workflow, when the platform is Android
13
13
  - After AppConfig, mock data, and design tokens are already in place
14
14
  - When you need to modify Compose screens, navigation, and themes
15
15
 
@@ -102,6 +102,29 @@ 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 — 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
118
+
119
+ Customize the adaptive icon using the manifest's **App Launcher Icon** section:
120
+
121
+ 1. Read the icon spec: `Android vector keyword` (e.g., `shopping`) and `Background` hex color
122
+ 2. Read `templates/android/ICON_VECTORS.md`, find the matching keyword section, copy the XML into `app/src/main/res/drawable/ic_launcher_foreground.xml`
123
+ 3. Update `app/src/main/res/values/colors.xml`: set `ic_launcher_background` to the background hex
124
+ 4. Verify `ic_launcher.xml` and `ic_launcher_round.xml` reference the correct foreground/background
125
+
126
+ If `ICON_VECTORS.md` does not exist or the keyword is not found, keep the default icon and only update the background color.
127
+
105
128
  ### Step 6 — Data Layer & Offline Infrastructure
106
129
 
107
130
  Templates now include an **offline-first data layer**. Understand these components:
@@ -119,19 +142,26 @@ Templates now include an **offline-first data layer**. Understand these componen
119
142
  - `reset()` function references correct defaults
120
143
  - `data/SyncManager.kt` — if entity types were renamed, update domain methods
121
144
 
122
- **ViewModel/Screen patterns** (how screens consume data):
145
+ **Screen/ViewModel patterns** (how screens consume data):
146
+
147
+ Screens and ViewModels use the `DataRepository` interface abstraction, not `MockDataProvider` directly:
123
148
  ```kotlin
124
- // Screens collect StateFlow
125
- val products by MockDataProvider.products.collectAsState()
149
+ // Screens get the repository from DataSourceResolver
150
+ val repository = remember { DataSourceResolver.repository }
151
+ val items by repository.items.collectAsState()
152
+ val categories by repository.categories.collectAsState()
126
153
 
127
- // ViewModels read from MockDataProvider
128
- val products = MockDataProvider.products.value
154
+ // CRUD via the repository
155
+ repository.addItem(newItem)
156
+ repository.deleteItem(item)
157
+ repository.toggleFavorite(item)
129
158
 
130
- // CRUD via SyncManager
159
+ // If SyncManager exists, it wraps the repository
131
160
  SyncManager.addProduct(newProduct)
132
- SyncManager.deleteProduct(id)
133
161
  ```
134
162
 
163
+ When customizing screens or ViewModels, ALWAYS use `DataSourceResolver.repository`, never `MockDataProvider` directly. This ensures the app works with any data source.
164
+
135
165
  **OfflineBanner integration** — add to main navigation:
136
166
  ```kotlin
137
167
  Column {
@@ -151,26 +181,76 @@ class MyApplication : Application() {
151
181
  }
152
182
  ```
153
183
 
154
- ### Step 7 — MockDataProvider Verification
184
+ ### Step 7 — Data Layer Verification
185
+
186
+ Verify the data layer uses the correct patterns:
155
187
 
156
- Verify MockDataProvider uses the correct patterns:
188
+ **DataRepository interface:**
189
+ ```kotlin
190
+ interface DataRepository {
191
+ val items: StateFlow<List<Item>>
192
+ val categories: StateFlow<List<Category>>
193
+ val favoriteItems: StateFlow<List<Item>>
194
+ fun loadData()
195
+ fun addItem(item: Item)
196
+ // ... all CRUD + query methods
197
+ }
198
+ ```
157
199
 
200
+ **MockDataProvider (implements DataRepository):**
158
201
  ```kotlin
159
- object MockDataProvider {
202
+ object MockDataProvider : DataRepository {
160
203
  private val _products = MutableStateFlow(defaultProducts)
161
- val products: StateFlow<List<Product>> = _products.asStateFlow()
162
-
163
- val defaultProducts = listOf(...) // Seed data
164
-
165
- fun addProduct(product: Product) { ... } // CRUD
166
- fun reset() { ... } // Reset to defaults
204
+ override val products: StateFlow<List<Product>> = _products.asStateFlow()
205
+ val defaultProducts = listOf(...)
206
+ override fun addProduct(product: Product) { ... }
207
+ fun reset() { ... }
167
208
  }
168
209
  ```
169
210
 
170
- - Verify seed data matches the new domain
171
- - Ensure CRUD functions reference correct entity types
172
- - Verify `reset()` works correctly
173
- - Check that helper functions use `.value` to read from StateFlows
211
+ **DataSourceResolver:**
212
+ ```kotlin
213
+ object DataSourceResolver {
214
+ val repository: DataRepository
215
+ get() = when (AppConfig.DataSource.active) {
216
+ AppConfig.DataSource.SourceType.MOCK -> MockDataProvider
217
+ AppConfig.DataSource.SourceType.LOCAL_STORAGE -> MockDataProvider // TODO
218
+ }
219
+ }
220
+ ```
221
+
222
+ Verify:
223
+ - DataRepository interface matches MockDataProvider's public members
224
+ - MockDataProvider implements DataRepository with `override` on all members
225
+ - DataSourceResolver returns the correct implementation
226
+ - Screens use `DataSourceResolver.repository`, not `MockDataProvider` directly
227
+ - Seed data matches the new domain
228
+ - CRUD functions reference correct entity types
229
+
230
+ ### Step 7.5 — Apply Animation Modifiers (if animation modules are integrated)
231
+
232
+ If the customization manifest includes an **"Animation & Sensory Plan"** section:
233
+
234
+ 1. Read the "Per-Screen Animation Modifiers" table from the manifest
235
+ 2. For each screen in your batch, apply the assigned modifiers:
236
+
237
+ ```kotlin
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)
248
+ ParallaxHeader(height = 280.dp, scrollState = scrollState) { AsyncImage(model = item.imageUrl) }
249
+ Box(modifier = Modifier.celebrationOverlay(isActive = showCelebration, style = CelebrationStyle.CONFETTI))
250
+ ```
251
+
252
+ 3. Wrap all applied animations with `motionAwareAnimationSpec()` if MotionPreferences is integrated
253
+ 4. Do NOT add animation modifiers to screens not listed in the manifest
174
254
 
175
255
  ## Report Output
176
256
 
@@ -179,7 +259,7 @@ Write the report to `output/{app-name}/reports/05-customization.md` (append Andr
179
259
  ```markdown
180
260
  # Customization Report
181
261
 
182
- **Step:** 8
262
+ **Step:** 5
183
263
  **Skill:** android-customizer
184
264
  **Timestamp:** {ISO 8601}
185
265
  **Result:** PASS
@@ -214,6 +294,11 @@ Android (Kotlin / Jetpack Compose)
214
294
  - SyncManager methods updated: {list or "no changes needed"}
215
295
  - Data persistence verified: {yes/no}
216
296
 
297
+ ## Animation Modifiers Applied
298
+
299
+ - {modifier}: applied to {screen} — {description}
300
+ - MotionPreferences respected: {yes/no/N/A}
301
+
217
302
  ## Potential Issues
218
303
 
219
304
  - {any concerns or items needing manual review}
@@ -225,7 +310,7 @@ Update `output/{app-name}/reports/summary.json` — read the file, append this s
225
310
 
226
311
  ```json
227
312
  {
228
- "step": 8,
313
+ "step": 5,
229
314
  "name": "android-customization",
230
315
  "startedAt": "{ISO 8601 timestamp}",
231
316
  "durationSeconds": 0,
@@ -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