@shaykec/app-agent 1.0.9 → 1.0.11
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/.cursor/skills/web-analyzer/SKILL.md +310 -0
- package/.cursor/skills/web-crawler/SKILL.md +252 -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 +123 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +8 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- 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 +294 -16
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +17 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +272 -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 -4
- 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/prompts/web-clone-agent-prompt.md +179 -0
- 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
|