@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,222 @@
1
+ ---
2
+ name: catalog-analyzer
3
+ description: Selects the best template from CATALOG.md and the best shared modules from MODULES_CATALOG.md in a single pass. Uses the selected template to boost module selection accuracy via the "Relevant Templates" column.
4
+ ---
5
+
6
+ # Catalog Analyzer Skill
7
+
8
+ Use this skill to select the best template AND the best shared modules for the user's app in one pass.
9
+
10
+ ## When to Use
11
+
12
+ - At Step 0 of the AppAgent workflow, in parallel with prompt validation and design brand selection
13
+ - When you need to pick both a starting template and shared modules
14
+ - Before cloning any template to `output/`
15
+
16
+ ## Context You Need
17
+
18
+ - **User description** — what kind of app the user wants to build
19
+ - **Platform** — `ios`, `android`, or `react-native`
20
+ - **Sanitized description** — from the prompt-validator skill (if available)
21
+
22
+ ## Instructions
23
+
24
+ ### Phase 1 — Template Selection
25
+
26
+ #### Step 1 — Read the Template Catalog
27
+
28
+ Read `templates/CATALOG.md` thoroughly. Understand each template's:
29
+ - Feature set and architecture
30
+ - "Best-For Keywords" in the decision matrix
31
+ - "Best match when" criteria
32
+ - "NOT a match when" exclusion rules
33
+
34
+ #### Step 2 — Score Each Template
35
+
36
+ For each template in the catalog:
37
+ 1. Score it against the user's description using the "Best-For Keywords"
38
+ 2. Check the "Best match when" criteria — how many match?
39
+ 3. Apply the "NOT a match when" rules — does any exclusion trigger?
40
+ 4. Consider navigation pattern similarity (tabs, lists, detail screens)
41
+
42
+ #### Step 3 — Handle Edge Cases
43
+
44
+ - If the app spans multiple categories, check the "Hybrid Apps" table in the catalog
45
+ - If no template is a strong match, follow the "When No Template Fits" guidance — pick the template with the most similar navigation and screen patterns
46
+ - Consider the platform (iOS vs Android vs React Native) — all templates are available on all three platforms. The same template names exist under `templates/ios/`, `templates/android/`, and `templates/react-native/`
47
+
48
+ #### Step 4 — Select ONE Template
49
+
50
+ Choose exactly ONE primary template. Determine confidence:
51
+ - **high** — multiple criteria match, clear winner
52
+ - **medium** — good fit but some aspects don't align perfectly
53
+ - **low** — no great match, picking the closest option
54
+
55
+ If hybrid is needed, identify what to borrow from a secondary template.
56
+
57
+ **Important:** Features covered by shared modules (consent, paywall, push notifications, etc.) should NOT affect template scoring — they are handled by module selection in Phase 2.
58
+
59
+ ### Phase 2 — Module Selection
60
+
61
+ Uses the template selected in Phase 1 for improved accuracy.
62
+
63
+ #### Step 5 — Read the Modules Catalog
64
+
65
+ Read `templates/shared/MODULES_CATALOG.md` thoroughly. Understand each module's:
66
+ - "Best-For Keywords" in the decision matrix
67
+ - "Relevant Templates" column
68
+ - Module dependencies
69
+
70
+ #### Step 6 — Match Modules by Keywords + Relevant Templates
71
+
72
+ For every module in the catalog:
73
+ 1. Compare its "Best-For Keywords" against the user's description (primary signal)
74
+ 2. Check if the **selected template** (from Phase 1) is in the "Relevant Templates" column (boost signal)
75
+ 3. If keyword matches AND template matches → **strong include**
76
+ 4. If keyword matches but template doesn't match → include with lower confidence
77
+ 5. If no keyword match but template matches → consider if implied by domain
78
+
79
+ **Selection guidance:**
80
+ - Aim for **5-15 modules** that genuinely match the app's features
81
+ - Don't over-select — only include modules the app will actually use
82
+ - Don't under-select — if a keyword matches, the module is likely needed
83
+ - Consider implicit needs (e.g., a "shopping app" implies payment, a "social app" implies sharing)
84
+
85
+ #### Step 7 — BaaS Module Selection
86
+
87
+ **BaaS module selection (FirebaseProvider, SupabaseProvider, CachedRepository):**
88
+ - Select FirebaseProvider OR SupabaseProvider (not both) when the description mentions: "real data", "users", "auth", "login", "sign up", "accounts", "cloud", "sync", "backend", "database", "multi-device", "server"
89
+ - Default (no BaaS keywords): NO BaaS module. The app uses `localStorage` (Core Data / Room) by default.
90
+ - If SupabaseProvider is selected, also add CachedRepository (Supabase has no built-in offline cache)
91
+ - If FirebaseProvider is selected, do NOT add CachedRepository (Firestore has built-in offline persistence)
92
+ - Prefer Firebase for "Google ecosystem" keywords, Supabase for "PostgreSQL", "open source", "self-hosted" keywords
93
+ - When both would fit equally, prefer Firebase (more mature mobile SDK)
94
+
95
+ #### Step 8 — Check Dependencies
96
+
97
+ Verify that included modules have their dependencies met:
98
+ - Paywall depends on BiometricAuth (optional)
99
+ - AccountDeletion depends on ConsentPrivacy
100
+ - PushNotifications depends on ConsentPrivacy
101
+ - PaymentMethods depends on Paywall
102
+ - GamificationKit depends on ChartsLibrary
103
+ - NotificationCenter depends on PushNotifications
104
+ - CloudSync depends on NetworkBanner
105
+ - LiveActivities depends on PushNotifications
106
+ - SupabaseProvider depends on CachedRepository (for offline support)
107
+ - FirebaseProvider depends on ErrorHandling (optional), NetworkBanner (optional)
108
+ - SupabaseProvider depends on ErrorHandling (optional), NetworkBanner (optional)
109
+
110
+ If a dependency is missing, add it.
111
+
112
+ #### Step 9 — Animation & Sensory Module Heuristics
113
+
114
+ When the user description contains words like **"stunning", "beautiful", "premium feel", "polished", "delightful", "smooth", "animated", "modern", "sleek", "creative", "artistic", "colorful", "vibrant", "elegant", "stylish", "cool", "interactive"**, consider these signal-word matches:
115
+
116
+ | Signal Word | Consider Modules |
117
+ |---|---|
118
+ | stunning, beautiful, premium, polished | MicroInteractions, AnimatedTransitions, CelebrationEffects |
119
+ | haptic, tactile, vibration, feedback | HapticEngine |
120
+ | sound, audio, click sound, chime | AudioFeedback |
121
+ | parallax, scroll effect, header animation | ScrollEffects |
122
+ | confetti, celebration, achievement | CelebrationEffects |
123
+ | onboarding, walkthrough, tutorial | AnimatedOnboarding |
124
+ | transitions, hero, card flip, animated navigation | AnimatedTransitions |
125
+ | micro-animations, bounce, press, stagger | MicroInteractions |
126
+
127
+ **Auto-include rule:** When ANY of HapticEngine, AudioFeedback, ScrollEffects, CelebrationEffects, MicroInteractions, AnimatedTransitions, or AnimatedOnboarding is selected, **MotionPreferences is automatically added** (it provides the accessibility foundation — reduce motion support).
128
+
129
+ **Visual liveliness rule:** For apps that should feel vibrant and alive (most consumer apps — shopping, social, food, fitness, travel, art, music, creative, lifestyle), automatically include **MicroInteractions** (press feedback, bounces) unless the domain explicitly demands restraint (medical, legal, finance). This ensures every app gets basic visual polish through press feedback and toggle animations.
130
+
131
+ #### Step 10 — Final Module List
132
+
133
+ Produce the final list of selected modules with reasoning for each.
134
+
135
+ ## Report Output
136
+
137
+ Write the report to `output/{app-name}/reports/02-catalog-analysis.md`:
138
+
139
+ ```markdown
140
+ # Catalog Analysis Report
141
+
142
+ **Step:** 0
143
+ **Skill:** catalog-analyzer
144
+ **Timestamp:** {ISO 8601}
145
+ **Result:** PASS
146
+
147
+ ## Template Selection
148
+
149
+ **Selected Template:** {TemplateName}
150
+ **Confidence:** high | medium | low
151
+
152
+ ### Reasoning
153
+
154
+ {2-3 sentences explaining why this template was chosen}
155
+
156
+ ### Scoring
157
+
158
+ | Template | Score | Match Criteria | Exclusions |
159
+ |----------|-------|---------------|------------|
160
+ | {name} | {/10} | {matched} | {any} |
161
+
162
+ ### Hybrid Recommendation
163
+
164
+ **Borrow From:** {other template name} or "none"
165
+ **Hybrid Notes:** {what to borrow and why} or "n/a"
166
+
167
+ ## Module Selection — {N} total
168
+
169
+ | Module | Matched Keywords | Template Boost | Reason |
170
+ |--------|-----------------|----------------|--------|
171
+ | {name} | {keywords} | yes/no | {why included} |
172
+ ...
173
+
174
+ ### Excluded Modules
175
+
176
+ | Module | Reason for Exclusion |
177
+ |--------|---------------------|
178
+ ...
179
+
180
+ ### Dependencies Added
181
+
182
+ | Module | Added Because |
183
+ |--------|--------------|
184
+ | {name} | Required by {other module} |
185
+ ...
186
+ ```
187
+
188
+ Update `output/{app-name}/reports/summary.json` — read the file, append this step.
189
+
190
+ **Timing:** Record the current timestamp when you begin this skill. When writing the step entry, set `"startedAt"` to that timestamp (ISO 8601) and `"durationSeconds"` to the elapsed seconds.
191
+
192
+ ```json
193
+ {
194
+ "step": 0,
195
+ "name": "catalog-analysis",
196
+ "startedAt": "{ISO 8601 timestamp}",
197
+ "durationSeconds": 0,
198
+ "result": "PASS",
199
+ "reportFile": "02-catalog-analysis.md",
200
+ "template": "{TemplateName}",
201
+ "confidence": "high|medium|low",
202
+ "borrowFrom": "{other template or null}",
203
+ "modulesSelected": {N}
204
+ }
205
+ ```
206
+
207
+ Also update the top-level `"template"` field in summary.json.
208
+
209
+ ## Important Rules
210
+
211
+ - This skill is READ-ONLY — do NOT create, edit, or delete any app source files during this step
212
+ - The ONLY files you write are the report files in `reports/`
213
+ - Always recommend exactly ONE primary template
214
+ - If confidence is "low", explain what aspects don't fit well
215
+ - Do NOT recommend building from scratch — always pick the closest template
216
+ - Consider the platform when relevant — all templates are available on iOS, Android, and React Native
217
+ - For React Native, templates use TypeScript + React Navigation + custom hooks (MVVM-hook pattern)
218
+ - Features covered by shared modules should NOT affect template scoring — they are handled in Phase 2
219
+ - No modules are auto-included — every module must earn its place via keyword matching (exception: MotionPreferences is auto-included when any animation/sensory module is selected)
220
+ - Aim for 5-15 modules — be selective, not exhaustive
221
+ - Module integration happens later during customization (Steps 4-5) — this skill only produces the selection list
222
+ - The "Relevant Templates" column is a **boost signal**, not a hard filter — a module can be selected without template match if keywords are strong
@@ -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), `features/` (Android), or `src/screens/` (React Native)
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
 
@@ -165,7 +165,7 @@ DATA REPOSITORY:
165
165
 
166
166
  ### Step 6 — Produce Module Integration Plan
167
167
 
168
- Read the module selection report (`output/{app-name}/reports/02b-module-selection.md`). For each selected module, plan how it connects to the app:
168
+ 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:
169
169
 
170
170
  ```
171
171
  MODULE INTEGRATION PLAN:
@@ -271,6 +271,39 @@ Write the complete manifest to `output/{app-name}/reports/customization-manifest
271
271
  - Spacing: {scale}
272
272
  - Icon style: {filled|outlined}
273
273
 
274
+ ### Visual Polish Plan
275
+
276
+ #### Shadow Style
277
+ | Token | Value |
278
+ |-------|-------|
279
+ | Shadow type | {colored / neutral} |
280
+ | Shadow color | {primary at X% / black at X%} |
281
+ | Shadow blur | {X}pt |
282
+ | Shadow y-offset | {X}pt |
283
+ | Floating element shadow | {deeper: blur Xpt, y Xpt} |
284
+
285
+ #### Gradient Usage
286
+ - Hero sections: {primary-to-secondary gradient / subtle gradient / none}
287
+ - CTA buttons: {gradient / solid}
288
+ - Section backgrounds: {subtle gradient / solid}
289
+
290
+ #### Animation Choreography
291
+ | Token | Value |
292
+ |-------|-------|
293
+ | Spring preset | {bouncy / smooth / snappy} |
294
+ | Spring response | {X}s |
295
+ | Spring damping | {X} |
296
+ | Stagger delay | {X}ms per item |
297
+ | Press scale | {0.95} |
298
+ | Button feedback | {scale + haptic (light)} |
299
+ | Favorite toggle | {heart bounce + haptic} |
300
+ | Success event | {confetti / sparkle / none} |
301
+
302
+ #### Depth & Material
303
+ - Sheet backgrounds: {glass blur / solid / gradient}
304
+ - Navigation bar: {transparent+blur / solid / gradient}
305
+ - Tab bar: {blur / solid / elevated}
306
+
274
307
  ### Icon Mapping — Tabs
275
308
  | Tab | Label | iOS (SF Symbol) | Android (Material) |
276
309
  |-----|-------|-----------------|-------------------|
@@ -364,11 +397,25 @@ Write the complete manifest to `output/{app-name}/reports/customization-manifest
364
397
  {List selected animation/sensory modules and their purpose in this app}
365
398
 
366
399
  ### Per-Screen Animation Modifiers
400
+
401
+ **Built-in modifiers (always available, no module required):**
402
+ - `.staggeredAppear(index:)` — staggered fade+slide for list items
403
+ - `.slideIn()` — slide-from-bottom on appear
404
+ - `.slideAndFade()` — slide-from-side + fade on appear
405
+ - `.scaleOnPress()` — scale-down press feedback (0.95 + spring)
406
+ - `.hapticFeedback()` / `.hapticFeedback(.medium)` — haptic on tap
407
+ - `.bounceOnChange(isActive:)` — scale bounce on state toggle
408
+ - `.cardShadow()` — subtle shadow for cards/elevated surfaces
409
+ - `.elevatedShadow()` — deeper shadow for FABs/floating elements
410
+ - `.shimmer()` — shimmer loading overlay for skeleton/placeholder views
411
+ - `.pulse()` — repeating scale pulse for live indicators, notification badges
412
+ - `.heartBounce(isActive:)` — bounce-on-activate for favorite/like buttons
413
+
367
414
  | Screen File | Modifiers to Apply | Notes |
368
415
  |---|---|---|
369
- | HomeView.swift | `.staggeredAppearance()`, `.hapticFeedback(.selection)` | List items stagger in on appear |
370
- | DetailView.swift | `.slideAndFade()`, `.parallaxHeader()` | Hero image parallax, content slides in |
371
- | CreateView.swift | `.scaleOnPress()`, `.hapticFeedback(.success)` on save | Button feedback |
416
+ | HomeView.swift | `.staggeredAppear(index:)`, `.cardShadow()` | List items stagger in, cards have shadows |
417
+ | DetailView.swift | `.slideAndFade()`, `.cardShadow()` | Content slides in with shadows |
418
+ | CreateView.swift | `.scaleOnPress()`, `.hapticFeedback(.medium)` on save | Button feedback |
372
419
  | {screen} | {modifiers} | {notes} |
373
420
  ...
374
421
 
@@ -9,7 +9,7 @@ Use this skill to select the best visual design brand for the user's app.
9
9
 
10
10
  ## When to Use
11
11
 
12
- - At Step 4a of the AppAgent workflow, after the template is cloned and renamed
12
+ - At Step 0 of the AppAgent workflow, in parallel with prompt validation and catalog analysis
13
13
  - When you need to pick a visual identity from the design brand catalog
14
14
  - Before applying design tokens to the app
15
15
 
@@ -18,7 +18,7 @@ Use this skill to select the best visual design brand for the user's app.
18
18
  - **App name** — display name (e.g., "PawSpa")
19
19
  - **App description** — what the app does and who it's for
20
20
  - **Platform** — `ios` or `android`
21
- - **App template** — which template was selected (e.g., "BookTemplate")
21
+ - **App template** (optional) — which template was selected, if available (may not be when running in parallel)
22
22
  - **User style preferences** — any explicit color, style, or visual direction the user mentioned (may be empty)
23
23
 
24
24
  ## Instructions
@@ -40,6 +40,7 @@ For each brand in the catalog:
40
40
  3. Apply "NOT a match when" exclusion rules
41
41
  4. Follow the "Brand Selection Guide" decision flow
42
42
  5. Consider the "Hybrid Brands" table if the app spans categories
43
+ 6. **Energy bias**: When multiple brands score equally, prefer the one with higher Energy score (from the catalog's decision matrix). For ambiguous domains (not explicitly medical, finance, or corporate), bias toward brands with Energy >= 3. Apps should feel vibrant and alive by default — only choose low-energy brands when the domain clearly demands restraint.
43
44
 
44
45
  ### Step 3 — Handle User Style Preferences
45
46
 
@@ -59,7 +60,7 @@ Write the report to `output/{app-name}/reports/03-design-brand.md`:
59
60
  ```markdown
60
61
  # Design Brand Report
61
62
 
62
- **Step:** 4
63
+ **Step:** 0
63
64
  **Skill:** design-selector
64
65
  **Timestamp:** {ISO 8601}
65
66
  **Result:** PASS
@@ -99,7 +100,7 @@ Update `output/{app-name}/reports/summary.json` — read the file, append this s
99
100
 
100
101
  ```json
101
102
  {
102
- "step": 4,
103
+ "step": 0,
103
104
  "name": "design-brand",
104
105
  "startedAt": "{ISO 8601 timestamp}",
105
106
  "durationSeconds": 0,
@@ -121,4 +122,4 @@ Also update the top-level `"designBrand"` field in summary.json.
121
122
  - Do NOT recommend building a custom brand from scratch — always start with a catalog brand
122
123
  - If the user mentioned specific colors, put them in adaptations — never ignore user style preferences
123
124
  - The brand file path must use the exact filename from the catalog (kebab-case .md)
124
- - Consider the app template when relevant — a FinanceTemplate naturally pairs with CorporateProfessional, but can be overridden
125
+ - If the app template is available, consider it as a weak hint — a FinanceTemplate naturally pairs with CorporateProfessional, but the user description keywords are the primary signal
@@ -9,9 +9,9 @@ Use this skill to produce a complete design brief for a newly cloned app. The pr
9
9
 
10
10
  ## When to Use
11
11
 
12
- - After the `design-selector` subagent has picked a brand (Step 4a complete)
13
- - Before AppConfig customization (Step 6) — the design brief feeds into CUSTOMIZE:THEME
14
- - Before the platform customizer runs (Step 8) — it applies the tokens to code
12
+ - After the `design-selector` subagent has picked a brand (Step 0 complete)
13
+ - Before AppConfig customization (Step 4) — the design brief feeds into CUSTOMIZE:THEME
14
+ - Before the platform customizer runs (Step 5) — it applies the tokens to code
15
15
 
16
16
  ## What You Produce
17
17
 
@@ -39,8 +39,9 @@ If the `design-selector` provided a brand:
39
39
  3. Extract layout tokens (corner radius, spacing scale, card elevation, border width)
40
40
  4. Extract typography settings (font family, heading weight, body weight, body size)
41
41
  5. Extract icon style preferences (filled vs outlined, line weight)
42
- 6. Note any brand-specific do's, don'ts, and overrides
43
- 7. Note any ADAPT suggestions from the design-selector
42
+ 6. Extract **Motion & Effects** tokens (default spring, press scale, stagger delay, shadow style, gradient usage, depth approach, haptic policy)
43
+ 7. Note any brand-specific do's, don'ts, and overrides
44
+ 8. Note any ADAPT suggestions from the design-selector
44
45
 
45
46
  **If the design-selector suggested adaptations** (in the ADAPT field):
46
47
  - Apply color overrides (e.g., "shift primary to teal for pet domain")
@@ -256,7 +257,7 @@ ACCESSIBILITY:
256
257
 
257
258
  After producing the design brief, the tokens are applied to specific files in subsequent steps. All templates follow a standardized theme structure:
258
259
 
259
- ### iOS (applied by ios-customizer in Step 8)
260
+ ### iOS (applied by ios-customizer in Step 5)
260
261
 
261
262
  | Token Category | File | Structure |
262
263
  |---------------|------|-----------|
@@ -268,7 +269,7 @@ After producing the design brief, the tokens are applied to specific files in su
268
269
  | Domain-specific colors | `Core/Theme/Colors.swift` | Semantic color tokens (e.g., `Color.incomeColor`, `Color.starFilled`) |
269
270
  | Gradient definitions | `Core/Theme/Colors.swift` | `LinearGradient` extensions |
270
271
 
271
- ### Android (applied by android-customizer in Step 8)
272
+ ### Android (applied by android-customizer in Step 5)
272
273
 
273
274
  | Token Category | File | Structure |
274
275
  |---------------|------|-----------|
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: exploratory-tester
3
+ description: Screenshot and accessibility-tree driven exploratory testing. Does NOT read source code — tests the app purely through what the AI sees on screen and what the accessibility tree reveals. Discovers visual bugs, accessibility issues, UX problems, and content issues that structured testing misses.
4
+ ---
5
+
6
+ # Exploratory Tester Skill
7
+
8
+ Use this skill to test the app by exploring it visually — using screenshots and the accessibility/element tree as your only inputs. You do NOT read source code. You test what a real user would see and interact with.
9
+
10
+ ## When to Use
11
+
12
+ - As Phase 2 of the `--deep-test` pipeline
13
+ - Runs in parallel with structured testing (Phase 3) on a separate simulator
14
+ - After the app is built and installed on a simulator
15
+
16
+ ## Context You Need
17
+
18
+ - **Platform** — `ios`, `android`, or `react-native`
19
+ - **Bundle ID / Package name** — e.g., `com.pawspa.app`
20
+ - **Simulator/device name** — the `deviceName` for your assigned simulator
21
+ - **App directory** — path under `output/` (only for writing the bug report, NOT for reading code)
22
+
23
+ **IMPORTANT:** You must NOT read source code files (Views, ViewModels, Models, etc.). Your only inputs are what `inspect()` gives you — screenshots and the element tree. This forces you to test like a real user.
24
+
25
+ ## Instructions
26
+
27
+ ### Phase A — Screen Discovery
28
+
29
+ Start by launching the app and discovering all reachable screens:
30
+
31
+ 1. **Launch the app:**
32
+ ```
33
+ inspect({ platform: "{platform}", app: "{bundleId}", deviceName: "{sim}" })
34
+ ```
35
+
36
+ 2. **Wait 3-5 seconds** for the app to fully render, then `inspect()` again.
37
+
38
+ 3. **Map the tab bar** — identify all tabs from the element tree. Record their labels.
39
+
40
+ 4. **Visit each tab** — tap each tab, `inspect()` on each to capture the screen and element tree.
41
+
42
+ 5. **Discover sub-screens** — from each tab, tap list items, buttons, and links to discover detail screens, modals, forms. Keep a visited-screens list to avoid loops.
43
+
44
+ 6. **Build a screen map:**
45
+ ```
46
+ Tab 1 ("Home") → HomeScreen → DetailScreen (from list item)
47
+ Tab 2 ("Explore") → ExploreScreen → DetailScreen (from search result)
48
+ Tab 3 ("Favorites") → FavoritesScreen
49
+ Tab 4 ("Profile") → ProfileScreen → SettingsScreen
50
+ ```
51
+
52
+ ### Phase B — Per-Screen Exploratory Audit
53
+
54
+ For **each discovered screen**, perform the following audit:
55
+
56
+ #### B1 — Visual Analysis (from screenshot)
57
+
58
+ After each `inspect()`, analyze what you see:
59
+
60
+ - **Layout correctness:**
61
+ - No overlapping text or elements
62
+ - No cut-off labels or truncated content that loses meaning
63
+ - Proper spacing between elements (not cramped, not too sparse)
64
+ - Content aligned correctly (left-aligned text, centered headers, etc.)
65
+ - No elements extending beyond screen bounds
66
+
67
+ - **Content quality:**
68
+ - Real domain-specific text (not "Lorem ipsum", "Item 1", "Product", "Template")
69
+ - Images appear to be loaded (no broken image placeholders, no empty squares)
70
+ - Icons match their context (not generic or mismatched)
71
+ - Consistent typography across the screen
72
+
73
+ - **Design consistency:**
74
+ - Colors match between elements on the same screen
75
+ - Typography hierarchy makes sense (headers larger than body text)
76
+ - Consistent spacing and padding across similar elements
77
+ - Navigation bar style is consistent across screens
78
+
79
+ - **Template leftover detection:**
80
+ - Look for ANY generic text that doesn't match the app's domain
81
+ - Common leftovers: "ShopTemplate", "TrackTemplate", "SocialTemplate", "Template", "Example", "Sample", "Demo", "Test Item", "Lorem", "Placeholder"
82
+ - Check headers, list items, buttons, placeholders, empty state text
83
+
84
+ #### B2 — Accessibility Tree Audit
85
+
86
+ Parse the element tree from `inspect()` and audit:
87
+
88
+ - **Labels on interactive elements:**
89
+ - Every button must have a non-empty accessibility label
90
+ - Every link/tappable element must have a descriptive label
91
+ - Labels should describe the action, not just "button" or "element"
92
+
93
+ - **Image descriptions:**
94
+ - Images should have accessibility descriptions
95
+ - Decorative images can be marked as such, but content images need descriptions
96
+
97
+ - **Form field labels:**
98
+ - Text fields must have associated labels or placeholder text
99
+ - Pickers and selectors must be labeled
100
+
101
+ - **Orphaned elements:**
102
+ - Elements in the a11y tree that are not visible on screen (hidden but accessible)
103
+ - Elements visible on screen but not in the a11y tree (visible but not accessible)
104
+
105
+ - **Touch target sizes:**
106
+ - Interactive elements should be at least 44x44pt (iOS) or 48x48dp (Android)
107
+ - Flag any buttons or tappable elements that appear too small
108
+
109
+ #### B3 — Interactive Exploration
110
+
111
+ Interact with EVERY discoverable element and observe what happens:
112
+
113
+ 1. **Tap every button** — verify something happens (navigation, modal, state change, animation). Record any buttons that do nothing ("dead buttons").
114
+
115
+ 2. **Type into every text field:**
116
+ - Normal text: verify it appears correctly
117
+ - Edge cases: empty submit, very long text (50+ characters), special characters (@#$%)
118
+ - Search fields: type a query and verify results update
119
+
120
+ 3. **Toggle every switch/checkbox** — verify state changes visually.
121
+
122
+ 4. **Scroll every list:**
123
+ - Scroll to the bottom — verify all items render
124
+ - Scroll back to the top — verify the header/nav bar is intact (no overlap bugs)
125
+
126
+ 5. **Try unexpected interactions:**
127
+ - Swipe on non-swipeable areas — should not cause crashes or weird behavior
128
+ - Double-tap buttons — should not trigger the action twice (unless intentional)
129
+ - Tap on non-interactive text — should not crash
130
+
131
+ 6. **Test navigation depth:**
132
+ - Navigate 3+ levels deep (tab → list item → detail → sub-detail)
133
+ - Navigate back all the way — verify each screen restores correctly
134
+ - Verify the back button works at every level
135
+
136
+ 7. **Test state persistence:**
137
+ - Toggle a favorite, navigate away, come back — is it still toggled?
138
+ - Enter text in a form, switch tabs, come back — is the text preserved?
139
+ - Scroll down in a list, switch tabs, come back — is the scroll position preserved?
140
+
141
+ 8. **Test tab switching:**
142
+ - Switch between all tabs rapidly
143
+ - Verify each tab shows its correct content (not stale data from another tab)
144
+ - Verify the selected tab indicator updates correctly
145
+
146
+ #### B4 — After-Interaction Comparison
147
+
148
+ After completing interactions on a screen:
149
+
150
+ 1. `inspect()` again to capture the post-interaction state
151
+ 2. Compare the element tree with the pre-interaction tree
152
+ 3. Flag any unexpected changes:
153
+ - Elements that disappeared when they shouldn't have
154
+ - New elements that appeared unexpectedly
155
+ - Element labels that changed incorrectly
156
+ - Count mismatches (e.g., list had 5 items, now has 4)
157
+
158
+ ### Phase C — Bug Classification and Reporting
159
+
160
+ For each issue discovered, classify it:
161
+
162
+ | Tag | Category | Description | Severity Guide |
163
+ |-----|----------|-------------|----------------|
164
+ | `[VISUAL]` | Visual | Layout, overlap, truncation, wrong colors | Medium if minor, High if content is unreadable |
165
+ | `[A11Y]` | Accessibility | Missing labels, unreachable elements, small targets | Medium for labels, High for unreachable elements |
166
+ | `[UX]` | User Experience | Dead buttons, confusing navigation, unexpected behavior | High for dead buttons, Medium for confusing flows |
167
+ | `[CONTENT]` | Content | Template leftovers, placeholder text, wrong domain text | High for template leftovers, Medium for placeholders |
168
+ | `[STATE]` | State | State not updating, data not persisting, stale views | High for data loss, Medium for stale views |
169
+ | `[CRASH]` | Crash | App crashes on interaction | Critical (P0) |
170
+
171
+ Format each bug as:
172
+
173
+ ```markdown
174
+ ### BUG-{NNN}: [{SEVERITY}][EXPLORATORY][{TAG}] {Short description}
175
+ - **Screen:** {screen name}
176
+ - **Element:** {element description from a11y tree}
177
+ - **Steps to reproduce:** {what you tapped/typed/swiped}
178
+ - **Expected:** {what should happen}
179
+ - **Actual:** {what actually happened}
180
+ - **Screenshot context:** {brief description of what the screenshot showed}
181
+ ```
182
+
183
+ ### Phase D — Write Bug Report Section
184
+
185
+ Append your findings to `output/{app-name}/reports/11-bug-report.md`. If the file doesn't exist, create it. Use this structure:
186
+
187
+ ```markdown
188
+ # Bug Report — Exploratory Testing
189
+
190
+ ## Summary
191
+ - Screens discovered: {N}
192
+ - Screens audited: {N}
193
+ - Total interactive elements found: {N}
194
+ - Total interactions performed: {N}
195
+ - Bugs found: {N}
196
+ - Critical (P0): {N}
197
+ - High (P1): {N}
198
+ - Medium (P2): {N}
199
+ - Low (P3): {N}
200
+
201
+ ## Accessibility Summary
202
+ - Elements with labels: {N}/{total}
203
+ - Elements missing labels: {N}
204
+ - Images with descriptions: {N}/{total}
205
+ - Touch targets below minimum: {N}
206
+
207
+ ## Screen Map
208
+ {screen discovery tree from Phase A}
209
+
210
+ ## Bugs
211
+ {all bugs from Phase C}
212
+ ```
213
+
214
+ ## Important Rules
215
+
216
+ - **DO NOT read source code** — your inputs are ONLY screenshots and the element tree from `inspect()`
217
+ - **DO NOT follow a test plan** — explore freely based on what you see
218
+ - **Test EVERY interactive element** you discover in the element tree
219
+ - Use ai-tester MCP tools (`inspect`, `act`, `assert`, `wait`) for ALL interaction — NOT shell commands
220
+ - If the app crashes, document it as a P0/Critical bug and try to restart
221
+ - You are testing on a SINGLE assigned simulator — use the provided `deviceName` in all MCP calls
222
+ - Write your findings to the bug report — do NOT fix bugs (that's the bug-fixer skill's job)
223
+ - Be thorough: an element tree with 20 buttons means you tap all 20 buttons