@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.
- package/.claude/agents/catalog-analyzer.md +57 -0
- package/.claude/skills/android-customizer/SKILL.md +23 -10
- package/.claude/skills/bug-fixer/SKILL.md +59 -0
- package/.claude/skills/catalog-analyzer/SKILL.md +96 -0
- package/.claude/skills/customization-planner/SKILL.md +44 -5
- package/.claude/skills/design-selector/SKILL.md +3 -1
- package/.claude/skills/design-system/SKILL.md +1 -1
- package/.claude/skills/exploratory-tester/SKILL.md +82 -0
- package/.claude/skills/ios-customizer/SKILL.md +29 -8
- package/.claude/skills/module-integrator/SKILL.md +1 -1
- package/.claude/skills/react-native-customizer/SKILL.md +22 -10
- package/.claude/skills/test-planner/SKILL.md +72 -0
- package/.cursor/agents/README.md +3 -1
- package/.cursor/agents/catalog-analyzer.md +83 -0
- package/.cursor/rules/safety-guardrails.mdc +1 -1
- package/.cursor/rules/workflow.mdc +52 -18
- package/.cursor/skills/android-customizer/SKILL.md +43 -19
- package/.cursor/skills/bug-fixer/SKILL.md +189 -0
- package/.cursor/skills/catalog-analyzer/SKILL.md +222 -0
- package/.cursor/skills/customization-planner/SKILL.md +55 -8
- package/.cursor/skills/design-selector/SKILL.md +6 -5
- package/.cursor/skills/design-system/SKILL.md +8 -7
- package/.cursor/skills/exploratory-tester/SKILL.md +223 -0
- package/.cursor/skills/ios-customizer/SKILL.md +47 -12
- package/.cursor/skills/module-integrator/SKILL.md +2 -2
- package/.cursor/skills/output-validator/SKILL.md +1 -1
- package/.cursor/skills/react-native-customizer/SKILL.md +46 -16
- package/.cursor/skills/test-planner/SKILL.md +199 -0
- package/AGENTS.md +32 -11
- package/CLAUDE.md +78 -33
- package/README.md +77 -11
- package/designs/DESIGN_CATALOG.md +17 -15
- package/designs/DESIGN_PRINCIPLES.md +53 -0
- package/designs/brands/accessible-high-contrast.md +14 -0
- package/designs/brands/corporate-professional.md +14 -0
- package/designs/brands/dark-luxe.md +14 -0
- package/designs/brands/kids-playful.md +14 -0
- package/designs/brands/medical-clinical.md +14 -0
- package/designs/brands/modern-minimal.md +14 -0
- package/designs/brands/nature-organic.md +14 -0
- package/designs/brands/neo-brutalist.md +14 -0
- package/designs/brands/retro-vintage.md +14 -0
- package/designs/brands/soft-gradient.md +14 -0
- package/designs/brands/sport-athletic.md +14 -0
- package/designs/brands/tech-dynamic.md +14 -0
- package/designs/brands/vibrant-playful.md +14 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +91 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/engines/claude-engine.d.ts.map +1 -1
- package/dist/engines/claude-engine.js +16 -4
- package/dist/engines/claude-engine.js.map +1 -1
- package/dist/engines/types.d.ts +1 -1
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/engines/types.js +31 -2
- package/dist/engines/types.js.map +1 -1
- package/dist/github.d.ts +3 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +47 -4
- package/dist/github.js.map +1 -1
- package/dist/index.js +217 -9
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +11 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +216 -1
- package/dist/prompt-builder.js.map +1 -1
- package/dist/validator.d.ts +7 -2
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +61 -41
- package/dist/validator.js.map +1 -1
- package/dist/workspace.js +2 -2
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -2
- package/prompts/agent-prompt.md +35 -18
- package/prompts/deep-test-agent-prompt.md +122 -0
- package/prompts/fix-agent-prompt.md +90 -0
- package/prompts/quick-agent-prompt.md +32 -2
- package/prompts/scratch-agent-prompt.md +5 -8
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +1 -1
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/MainScreen.kt +1 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/navigation/MainNavigation.kt +5 -1
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/animation/MotionPreferencesScreen.kt +3 -3
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/navigation/Navigation.kt +1 -1
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/settings/SettingsScreen.kt +1 -1
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +3 -2
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/settings/SettingsScreen.kt +1 -1
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +3 -2
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/Skeleton/tests/03_detail_screen.yaml +1 -1
- package/templates/android/Skeleton/tests/04_favorites.yaml +1 -1
- package/templates/android/Skeleton/tests/08_full_e2e.yaml +7 -1
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/settings/SettingsScreen.kt +3 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/ios/BookTemplate/BookTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +1 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +13 -0
- package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +32 -20
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Strings.swift +42 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +36 -30
- package/templates/ios/GameTemplate/GameTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +12 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingView.swift +2 -37
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/Skeleton/Skeleton/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/Skeleton/tests/08_full_e2e.yaml +4 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Core/Animation/AnimatedTransitionsView.swift +201 -0
- package/templates/react-native/BookTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/BookTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/BookTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/ChatTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ChatTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ChatTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/DashTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/DashTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/DashTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/FamilyTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/FamilyTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/FamilyTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/FinanceTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/FinanceTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/FinanceTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/GameTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/GameTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/GameTemplate/src/screens/GameDetail/GameDetailScreen.tsx +2 -1
- package/templates/react-native/GameTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/HealthTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/HealthTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/HealthTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/HealthTemplate/src/screens/WorkoutDetail/WorkoutDetailScreen.tsx +1 -1
- package/templates/react-native/LearnTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/LearnTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/LearnTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/MapTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/MapTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/MapTemplate/src/screens/Map/MapScreen.tsx +14 -0
- package/templates/react-native/MapTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/MediaTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/MediaTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/MediaTemplate/src/screens/PlaylistDetail/PlaylistDetailScreen.tsx +1 -1
- package/templates/react-native/MediaTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/ReferenceTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ReferenceTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ReferenceTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
- package/templates/react-native/ShopTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/ShopTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/ShopTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/Skeleton/TESTING_MANIFEST.md +1 -1
- package/templates/react-native/Skeleton/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/Skeleton/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/Skeleton/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/Skeleton/tests/07_profile.yaml +3 -2
- package/templates/react-native/Skeleton/tests/08_full_e2e.yaml +12 -1
- package/templates/react-native/SocialTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/SocialTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/SocialTemplate/src/screens/Feed/FeedScreen.tsx +1 -0
- package/templates/react-native/SocialTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/TaskTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/TaskTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/TaskTemplate/src/screens/Profile/ProfileScreen.tsx +1 -1
- package/templates/react-native/TrackTemplate/src/animation/useAnimatedList.ts +219 -2
- package/templates/react-native/TrackTemplate/src/animation/useMotionPreferences.ts +23 -9
- package/templates/react-native/TrackTemplate/src/screens/Settings/SettingsScreen.tsx +1 -1
- package/templates/shared/ios/AnimatedTransitions/AnimatedTransitionsView.swift +233 -93
- package/.claude/agents/template-selector.md +0 -39
- package/.claude/skills/module-selector/SKILL.md +0 -81
- package/.claude/skills/template-selector/SKILL.md +0 -44
- package/.cursor/agents/template-selector.md +0 -52
- package/.cursor/skills/module-selector/SKILL.md +0 -135
- package/.cursor/skills/template-selector/SKILL.md +0 -123
|
@@ -0,0 +1,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
|
|
13
|
-
- After Step 1 (Clone) and Step
|
|
12
|
+
- After Step 0 (Prompt Validation, Catalog Analysis, Design Brand Selection) is complete
|
|
13
|
+
- After Step 1 (Clone) and Step 2 (Rename) are complete — the output app directory exists
|
|
14
14
|
- BEFORE any code modifications (AppConfig, MockDataProvider, screens, theme)
|
|
15
15
|
|
|
16
16
|
## Context You Need
|
|
@@ -23,7 +23,7 @@ Use this skill to produce a single, comprehensive customization manifest before
|
|
|
23
23
|
- **Selected template** — which template was cloned (e.g., "TrackTemplate")
|
|
24
24
|
- **Selected design brand** — brand name and file path (e.g., "VibrantPlayful", `designs/brands/vibrant-playful.md`)
|
|
25
25
|
- **Adaptation suggestions** — from the design-selector (if any)
|
|
26
|
-
- **Selected modules** — from the
|
|
26
|
+
- **Selected modules** — from the catalog analysis report (`reports/02-catalog-analysis.md`)
|
|
27
27
|
|
|
28
28
|
## Instructions
|
|
29
29
|
|
|
@@ -37,7 +37,7 @@ Read these files in parallel (batch your read calls):
|
|
|
37
37
|
4. **MockDataProvider** — find and read the MockDataProvider file — understand seed data structure, entity types, item counts
|
|
38
38
|
5. **Template Features directory** — list all screen files in `Features/` (iOS), `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. **
|
|
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
|
|
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 | `.
|
|
370
|
-
| DetailView.swift | `.slideAndFade()`, `.
|
|
371
|
-
| CreateView.swift | `.scaleOnPress()`, `.hapticFeedback(.
|
|
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
|
|
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 (
|
|
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:**
|
|
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":
|
|
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
|
-
-
|
|
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
|
|
13
|
-
- Before AppConfig customization (Step
|
|
14
|
-
- Before the platform customizer runs (Step
|
|
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.
|
|
43
|
-
7. Note any
|
|
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
|
|
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
|
|
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
|