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