@shaykec/app-agent 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/android-customizer.md +9 -1
- package/.claude/agents/catalog-analyzer.md +57 -0
- package/.claude/agents/ios-customizer.md +9 -1
- package/.claude/agents/react-native-customizer.md +71 -0
- package/.claude/skills/android-customizer/SKILL.md +108 -23
- 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 +123 -23
- package/.claude/skills/module-integrator/SKILL.md +1 -1
- package/.claude/skills/react-native-customizer/SKILL.md +97 -11
- package/.claude/skills/test-planner/SKILL.md +72 -0
- package/.cursor/agents/README.md +3 -1
- package/.cursor/agents/android-customizer.md +15 -11
- package/.cursor/agents/catalog-analyzer.md +83 -0
- package/.cursor/agents/ios-customizer.md +15 -10
- package/.cursor/agents/react-native-customizer.md +170 -0
- package/.cursor/mcp.json +2 -10
- package/.cursor/rules/safety-guardrails.mdc +1 -1
- package/.cursor/rules/workflow.mdc +52 -18
- package/.cursor/skills/android-customizer/SKILL.md +46 -22
- 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 +50 -15
- 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 +115 -25
- 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/TESTING_MANIFEST.md +2 -1
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/MainActivity.kt +23 -2
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/animation/AnimatedTransitionsModifiers.kt +188 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/theme/AppearanceManager.kt +42 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/profile/ProfileScreen.kt +20 -8
- package/templates/android/Skeleton/tests/03_detail_screen.yaml +3 -2
- package/templates/android/Skeleton/tests/04_favorites.yaml +3 -2
- package/templates/android/Skeleton/tests/08_full_e2e.yaml +9 -2
- package/templates/android/Skeleton/tests/09_dark_mode.yaml +50 -0
- 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/Skeleton/tests/09_dark_mode.yaml +52 -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 +2 -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/Skeleton/tests/09_dark_mode.yaml +46 -0
- 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
|
@@ -48,10 +48,18 @@ POTENTIAL ISSUES:
|
|
|
48
48
|
- {concerns needing manual review}
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
### Data Layer
|
|
52
|
+
- Use `DataSourceResolver.repository`, not `MockDataProvider` directly
|
|
53
|
+
- Preserve MockDataProvider CRUD functions and `reset()` method
|
|
54
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
55
|
+
|
|
51
56
|
## Rules
|
|
52
57
|
- ONLY edit files under `output/`
|
|
53
58
|
- Ensure all package declarations match directory structure
|
|
54
59
|
- Keep Hilt annotations intact (@HiltAndroidApp, @HiltViewModel, @AndroidEntryPoint)
|
|
55
60
|
- Keep build.gradle.kts syntactically valid
|
|
56
|
-
- Preserve MockDataProvider
|
|
61
|
+
- Preserve MockDataProvider CRUD functions and `reset()` method
|
|
62
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
57
63
|
- Use Material 3 components (not legacy Material 2)
|
|
64
|
+
- Preserve ALL `Modifier.testTag()` calls — do NOT remove test IDs
|
|
65
|
+
- Follow `{screen}_{element}_{role}` convention for new test tags (see `templates/TEST_ID_CONVENTIONS.md`)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: catalog-analyzer
|
|
3
|
+
description: Selects the best template from CATALOG.md and shared modules from MODULES_CATALOG.md in one pass. Uses selected template to boost module accuracy via "Relevant Templates" column.
|
|
4
|
+
tools: Read, Grep, Glob, LS
|
|
5
|
+
model: haiku
|
|
6
|
+
permissionMode: plan
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are a specialised subagent for selecting the best mobile app template AND shared modules.
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
### Phase 1 — Template Selection
|
|
14
|
+
|
|
15
|
+
1. Read `templates/CATALOG.md` thoroughly
|
|
16
|
+
2. Evaluate each template: score against keywords, check match criteria, apply exclusion rules, check hybrid table
|
|
17
|
+
3. Choose exactly ONE primary template
|
|
18
|
+
|
|
19
|
+
### Phase 2 — Module Selection
|
|
20
|
+
|
|
21
|
+
4. Read `templates/shared/MODULES_CATALOG.md`
|
|
22
|
+
5. Match by keywords + check "Relevant Templates" against selected template (boost signal)
|
|
23
|
+
6. Apply BaaS heuristics (Firebase vs Supabase vs none)
|
|
24
|
+
7. Check dependencies, add missing ones
|
|
25
|
+
8. Apply animation heuristics if needed
|
|
26
|
+
9. Aim for 5-15 modules
|
|
27
|
+
|
|
28
|
+
## Output Format
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
SELECTED TEMPLATE: {TemplateName}
|
|
32
|
+
CONFIDENCE: high | medium | low
|
|
33
|
+
REASONING: {1-2 sentence explanation}
|
|
34
|
+
BORROW FROM: {other template name, if hybrid} or "none"
|
|
35
|
+
HYBRID NOTES: {what to borrow and why} or "n/a"
|
|
36
|
+
|
|
37
|
+
SELECTED MODULES ({N} total):
|
|
38
|
+
- {ModuleName}: {reason} [template boost: yes/no]
|
|
39
|
+
- ...
|
|
40
|
+
|
|
41
|
+
EXCLUDED MODULES:
|
|
42
|
+
- {ModuleName}: {reason for exclusion}
|
|
43
|
+
- ...
|
|
44
|
+
|
|
45
|
+
DEPENDENCIES ADDED:
|
|
46
|
+
- {ModuleName}: required by {other module}
|
|
47
|
+
- ...
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Rules
|
|
51
|
+
|
|
52
|
+
- Always recommend exactly ONE primary template
|
|
53
|
+
- Do NOT recommend building from scratch
|
|
54
|
+
- Features covered by modules don't affect template scoring
|
|
55
|
+
- No auto-include — every module must match via keywords
|
|
56
|
+
- "Relevant Templates" is a boost, not a hard filter
|
|
57
|
+
- Aim for 5-15 modules
|
|
@@ -46,9 +46,17 @@ POTENTIAL ISSUES:
|
|
|
46
46
|
- {concerns needing manual review}
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
### Data Layer
|
|
50
|
+
- Use `DataSourceResolver.repository` in ViewModels, not `MockDataProvider.shared` directly
|
|
51
|
+
- Preserve MockDataProvider CRUD methods and `reset()` function
|
|
52
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
53
|
+
|
|
49
54
|
## Rules
|
|
50
55
|
- ONLY edit files under `output/` — never touch `templates/`
|
|
51
56
|
- Ensure all imports resolve after changes
|
|
52
57
|
- Keep `@main` struct and `App` protocol conformance intact
|
|
53
|
-
- Preserve MockDataProvider function
|
|
58
|
+
- Preserve MockDataProvider CRUD methods and `reset()` function
|
|
59
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
54
60
|
- Use SF Symbols for tab and navigation icons
|
|
61
|
+
- Preserve ALL `.accessibilityIdentifier()` calls — do NOT remove test IDs
|
|
62
|
+
- Follow `{screen}_{element}_{role}` convention for new test IDs (see `templates/TEST_ID_CONVENTIONS.md`)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-native-customizer
|
|
3
|
+
description: Specialized React Native/TypeScript subagent for customizing React Native app templates. Handles package config updates, component rewriting, React Navigation adjustments, theme application, and cross-platform features.
|
|
4
|
+
tools: Read, Edit, Write, Grep, Glob, LS, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are an expert React Native developer specializing in TypeScript and modern mobile development. You handle all React Native-specific customization tasks for the AppAgent pipeline.
|
|
9
|
+
|
|
10
|
+
## Your Expertise
|
|
11
|
+
- React Native 0.73+, TypeScript 5+, React Navigation 6+
|
|
12
|
+
- MVVM architecture with custom hooks (`useXxxViewModel`)
|
|
13
|
+
- StyleSheet.create() for performant styling
|
|
14
|
+
- FlatList / SectionList for virtualized lists
|
|
15
|
+
- React Context for theming and global state
|
|
16
|
+
|
|
17
|
+
## Tasks You Handle
|
|
18
|
+
|
|
19
|
+
### Package & Project Renaming
|
|
20
|
+
1. Update `package.json` — `name` field
|
|
21
|
+
2. Update `app.json` — `name` and `displayName`
|
|
22
|
+
3. Update `android/app/build.gradle` — `applicationId`, `namespace`
|
|
23
|
+
4. Update `android/settings.gradle` — `rootProject.name`
|
|
24
|
+
5. Update `android/app/src/main/res/values/strings.xml` — `app_name`
|
|
25
|
+
6. Update `android/app/src/main/java/` — package directories, `MainActivity.kt`, `MainApplication.kt`
|
|
26
|
+
7. Update `ios/Podfile` — project target name
|
|
27
|
+
8. Update all imports if module paths changed
|
|
28
|
+
|
|
29
|
+
### React Native Component Customization
|
|
30
|
+
- Use functional components with `React.FC` typing
|
|
31
|
+
- Use custom hooks (`useXxxViewModel`) for state and business logic
|
|
32
|
+
- Use `StyleSheet.create()` for all styles — no inline style objects
|
|
33
|
+
- Use `FlatList` / `SectionList` for lists (not `map()` on `ScrollView`)
|
|
34
|
+
- Add `testID` props to ALL interactive elements
|
|
35
|
+
|
|
36
|
+
### Navigation Structure
|
|
37
|
+
Templates use React Navigation with bottom tabs and native stack. When modifying:
|
|
38
|
+
- Update tab names and components in `AppNavigator.tsx`
|
|
39
|
+
- Update `RootStackParamList` type for type-safe navigation
|
|
40
|
+
- Apply tab labels from content brief and icons from design brief
|
|
41
|
+
|
|
42
|
+
### Theme Customization
|
|
43
|
+
- Update `ThemeContext.tsx` colors to match brand palette
|
|
44
|
+
- Provide both light and dark mode variants
|
|
45
|
+
- Apply corner radius, spacing, and typography tokens
|
|
46
|
+
|
|
47
|
+
## Output
|
|
48
|
+
```
|
|
49
|
+
FILES MODIFIED:
|
|
50
|
+
- {path}: {what changed}
|
|
51
|
+
POTENTIAL ISSUES:
|
|
52
|
+
- {concerns needing manual review}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Data Layer
|
|
56
|
+
- Use `DataSourceResolver.repository` in ViewModel hooks, not `MockDataProvider` directly
|
|
57
|
+
- Preserve MockDataProvider CRUD methods and `reset()` function
|
|
58
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
59
|
+
|
|
60
|
+
## Rules
|
|
61
|
+
- ONLY edit files under `output/` — never touch `templates/`
|
|
62
|
+
- Ensure all imports resolve after changes
|
|
63
|
+
- Preserve MockDataProvider CRUD methods and `reset()` function
|
|
64
|
+
- Do NOT modify NetworkMonitor, LocalPersistence, or OfflineBanner
|
|
65
|
+
- Ensure OfflineBanner is integrated into main navigation screens
|
|
66
|
+
- Use `testID` props on ALL interactive elements
|
|
67
|
+
- Follow `{screen}_{element}_{role}` convention for test IDs (see `templates/TEST_ID_CONVENTIONS.md`)
|
|
68
|
+
- Use `StyleSheet.create()` for styles, not inline objects
|
|
69
|
+
- Keep React Navigation structure intact
|
|
70
|
+
- Preserve ThemeContext provider wrapping in App.tsx
|
|
71
|
+
- Do NOT introduce new npm dependencies
|
|
@@ -9,7 +9,7 @@ Use this skill to perform deep Android/Kotlin/Compose customization on a cloned
|
|
|
9
9
|
|
|
10
10
|
## When to Use
|
|
11
11
|
|
|
12
|
-
- At Step
|
|
12
|
+
- At Step 5 of the AppAgent workflow, when the platform is Android
|
|
13
13
|
- After AppConfig, mock data, and design tokens are already in place
|
|
14
14
|
- When you need to modify Compose screens, navigation, and themes
|
|
15
15
|
|
|
@@ -102,6 +102,29 @@ Android templates use Material 3 dynamic theming in `Theme.kt`:
|
|
|
102
102
|
- Apply typography scale if the design brief specifies custom fonts
|
|
103
103
|
- Apply shape theme (corner radius) from the design brief
|
|
104
104
|
|
|
105
|
+
### Step 5.5 — Visual Polish Application
|
|
106
|
+
|
|
107
|
+
Apply the **Visual Polish Plan** from the manifest. MANDATORY for every build.
|
|
108
|
+
|
|
109
|
+
1. **Shadows/Elevation**: `Card(elevation = CardDefaults.cardElevation(defaultElevation = 4.dp))` on all cards. 8dp for FABs.
|
|
110
|
+
2. **Gradients**: `Brush.linearGradient(listOf(Primary, Secondary))` on hero sections and CTAs.
|
|
111
|
+
3. **Press feedback**: `Modifier.scaleOnPress()` or clickable scale animation (0.95). Haptic via `HapticFeedbackConstants.CONFIRM`.
|
|
112
|
+
4. **Staggered animations**: `Modifier.staggeredAppear(index)` on all LazyColumn/LazyRow items.
|
|
113
|
+
5. **Empty states**: Gradient circle behind icon + slide-in animation.
|
|
114
|
+
6. **Material surfaces**: `Surface(tonalElevation)` for sheets and overlays.
|
|
115
|
+
7. **Haptic**: `performHapticFeedback()` on favorite toggles and primary actions.
|
|
116
|
+
|
|
117
|
+
### Step 5.6 — Generate App Launcher Icon
|
|
118
|
+
|
|
119
|
+
Customize the adaptive icon using the manifest's **App Launcher Icon** section:
|
|
120
|
+
|
|
121
|
+
1. Read the icon spec: `Android vector keyword` (e.g., `shopping`) and `Background` hex color
|
|
122
|
+
2. Read `templates/android/ICON_VECTORS.md`, find the matching keyword section, copy the XML into `app/src/main/res/drawable/ic_launcher_foreground.xml`
|
|
123
|
+
3. Update `app/src/main/res/values/colors.xml`: set `ic_launcher_background` to the background hex
|
|
124
|
+
4. Verify `ic_launcher.xml` and `ic_launcher_round.xml` reference the correct foreground/background
|
|
125
|
+
|
|
126
|
+
If `ICON_VECTORS.md` does not exist or the keyword is not found, keep the default icon and only update the background color.
|
|
127
|
+
|
|
105
128
|
### Step 6 — Data Layer & Offline Infrastructure
|
|
106
129
|
|
|
107
130
|
Templates now include an **offline-first data layer**. Understand these components:
|
|
@@ -119,19 +142,26 @@ Templates now include an **offline-first data layer**. Understand these componen
|
|
|
119
142
|
- `reset()` function references correct defaults
|
|
120
143
|
- `data/SyncManager.kt` — if entity types were renamed, update domain methods
|
|
121
144
|
|
|
122
|
-
**ViewModel
|
|
145
|
+
**Screen/ViewModel patterns** (how screens consume data):
|
|
146
|
+
|
|
147
|
+
Screens and ViewModels use the `DataRepository` interface abstraction, not `MockDataProvider` directly:
|
|
123
148
|
```kotlin
|
|
124
|
-
// Screens
|
|
125
|
-
val
|
|
149
|
+
// Screens get the repository from DataSourceResolver
|
|
150
|
+
val repository = remember { DataSourceResolver.repository }
|
|
151
|
+
val items by repository.items.collectAsState()
|
|
152
|
+
val categories by repository.categories.collectAsState()
|
|
126
153
|
|
|
127
|
-
//
|
|
128
|
-
|
|
154
|
+
// CRUD via the repository
|
|
155
|
+
repository.addItem(newItem)
|
|
156
|
+
repository.deleteItem(item)
|
|
157
|
+
repository.toggleFavorite(item)
|
|
129
158
|
|
|
130
|
-
//
|
|
159
|
+
// If SyncManager exists, it wraps the repository
|
|
131
160
|
SyncManager.addProduct(newProduct)
|
|
132
|
-
SyncManager.deleteProduct(id)
|
|
133
161
|
```
|
|
134
162
|
|
|
163
|
+
When customizing screens or ViewModels, ALWAYS use `DataSourceResolver.repository`, never `MockDataProvider` directly. This ensures the app works with any data source.
|
|
164
|
+
|
|
135
165
|
**OfflineBanner integration** — add to main navigation:
|
|
136
166
|
```kotlin
|
|
137
167
|
Column {
|
|
@@ -151,26 +181,76 @@ class MyApplication : Application() {
|
|
|
151
181
|
}
|
|
152
182
|
```
|
|
153
183
|
|
|
154
|
-
### Step 7 —
|
|
184
|
+
### Step 7 — Data Layer Verification
|
|
185
|
+
|
|
186
|
+
Verify the data layer uses the correct patterns:
|
|
155
187
|
|
|
156
|
-
|
|
188
|
+
**DataRepository interface:**
|
|
189
|
+
```kotlin
|
|
190
|
+
interface DataRepository {
|
|
191
|
+
val items: StateFlow<List<Item>>
|
|
192
|
+
val categories: StateFlow<List<Category>>
|
|
193
|
+
val favoriteItems: StateFlow<List<Item>>
|
|
194
|
+
fun loadData()
|
|
195
|
+
fun addItem(item: Item)
|
|
196
|
+
// ... all CRUD + query methods
|
|
197
|
+
}
|
|
198
|
+
```
|
|
157
199
|
|
|
200
|
+
**MockDataProvider (implements DataRepository):**
|
|
158
201
|
```kotlin
|
|
159
|
-
object MockDataProvider {
|
|
202
|
+
object MockDataProvider : DataRepository {
|
|
160
203
|
private val _products = MutableStateFlow(defaultProducts)
|
|
161
|
-
val products: StateFlow<List<Product>> = _products.asStateFlow()
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
fun addProduct(product: Product) { ... } // CRUD
|
|
166
|
-
fun reset() { ... } // Reset to defaults
|
|
204
|
+
override val products: StateFlow<List<Product>> = _products.asStateFlow()
|
|
205
|
+
val defaultProducts = listOf(...)
|
|
206
|
+
override fun addProduct(product: Product) { ... }
|
|
207
|
+
fun reset() { ... }
|
|
167
208
|
}
|
|
168
209
|
```
|
|
169
210
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
211
|
+
**DataSourceResolver:**
|
|
212
|
+
```kotlin
|
|
213
|
+
object DataSourceResolver {
|
|
214
|
+
val repository: DataRepository
|
|
215
|
+
get() = when (AppConfig.DataSource.active) {
|
|
216
|
+
AppConfig.DataSource.SourceType.MOCK -> MockDataProvider
|
|
217
|
+
AppConfig.DataSource.SourceType.LOCAL_STORAGE -> MockDataProvider // TODO
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Verify:
|
|
223
|
+
- DataRepository interface matches MockDataProvider's public members
|
|
224
|
+
- MockDataProvider implements DataRepository with `override` on all members
|
|
225
|
+
- DataSourceResolver returns the correct implementation
|
|
226
|
+
- Screens use `DataSourceResolver.repository`, not `MockDataProvider` directly
|
|
227
|
+
- Seed data matches the new domain
|
|
228
|
+
- CRUD functions reference correct entity types
|
|
229
|
+
|
|
230
|
+
### Step 7.5 — Apply Animation Modifiers (if animation modules are integrated)
|
|
231
|
+
|
|
232
|
+
If the customization manifest includes an **"Animation & Sensory Plan"** section:
|
|
233
|
+
|
|
234
|
+
1. Read the "Per-Screen Animation Modifiers" table from the manifest
|
|
235
|
+
2. For each screen in your batch, apply the assigned modifiers:
|
|
236
|
+
|
|
237
|
+
```kotlin
|
|
238
|
+
// Built-in (always available)
|
|
239
|
+
Button(onClick = { }, modifier = Modifier.scaleOnPress()) { Text("Add") }
|
|
240
|
+
ItemRow(item = item, modifier = Modifier.staggeredAppear(index = index))
|
|
241
|
+
Card(modifier = Modifier.cardShadow()) { /* content */ }
|
|
242
|
+
EmptyState(modifier = Modifier.slideIn())
|
|
243
|
+
Box(modifier = Modifier.fillMaxWidth().height(60.dp).shimmer()) // loading placeholder
|
|
244
|
+
Box(modifier = Modifier.size(8.dp).pulse()) // live indicator
|
|
245
|
+
Icon(icon, modifier = Modifier.heartBounce(isActive = isFavorite)) // favorite toggle
|
|
246
|
+
|
|
247
|
+
// Modules (if integrated)
|
|
248
|
+
ParallaxHeader(height = 280.dp, scrollState = scrollState) { AsyncImage(model = item.imageUrl) }
|
|
249
|
+
Box(modifier = Modifier.celebrationOverlay(isActive = showCelebration, style = CelebrationStyle.CONFETTI))
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
3. Wrap all applied animations with `motionAwareAnimationSpec()` if MotionPreferences is integrated
|
|
253
|
+
4. Do NOT add animation modifiers to screens not listed in the manifest
|
|
174
254
|
|
|
175
255
|
## Report Output
|
|
176
256
|
|
|
@@ -179,7 +259,7 @@ Write the report to `output/{app-name}/reports/05-customization.md` (append Andr
|
|
|
179
259
|
```markdown
|
|
180
260
|
# Customization Report
|
|
181
261
|
|
|
182
|
-
**Step:**
|
|
262
|
+
**Step:** 5
|
|
183
263
|
**Skill:** android-customizer
|
|
184
264
|
**Timestamp:** {ISO 8601}
|
|
185
265
|
**Result:** PASS
|
|
@@ -214,6 +294,11 @@ Android (Kotlin / Jetpack Compose)
|
|
|
214
294
|
- SyncManager methods updated: {list or "no changes needed"}
|
|
215
295
|
- Data persistence verified: {yes/no}
|
|
216
296
|
|
|
297
|
+
## Animation Modifiers Applied
|
|
298
|
+
|
|
299
|
+
- {modifier}: applied to {screen} — {description}
|
|
300
|
+
- MotionPreferences respected: {yes/no/N/A}
|
|
301
|
+
|
|
217
302
|
## Potential Issues
|
|
218
303
|
|
|
219
304
|
- {any concerns or items needing manual review}
|
|
@@ -225,7 +310,7 @@ Update `output/{app-name}/reports/summary.json` — read the file, append this s
|
|
|
225
310
|
|
|
226
311
|
```json
|
|
227
312
|
{
|
|
228
|
-
"step":
|
|
313
|
+
"step": 5,
|
|
229
314
|
"name": "android-customization",
|
|
230
315
|
"startedAt": "{ISO 8601 timestamp}",
|
|
231
316
|
"durationSeconds": 0,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-fixer
|
|
3
|
+
description: Reads a bug report and systematically fixes each bug. Rebuilds, re-tests fixed screens, produces a fix report.
|
|
4
|
+
allowed-tools: Read, Write, Grep, Glob, LS, Shell, inspect, act, assert, wait, device
|
|
5
|
+
context: fork
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Bug Fixer Skill
|
|
9
|
+
|
|
10
|
+
Fix bugs from `reports/11-bug-report.md`. Read the report, fix each bug, rebuild, verify.
|
|
11
|
+
|
|
12
|
+
## Instructions
|
|
13
|
+
|
|
14
|
+
### Step 1 — Read and Prioritize
|
|
15
|
+
|
|
16
|
+
Read `output/{app-name}/reports/11-bug-report.md`. Sort by severity (P0→P3). Triage:
|
|
17
|
+
- **FIX** — fixable in source code
|
|
18
|
+
- **DEFER** — needs major refactoring (document recommendation)
|
|
19
|
+
- **SKIP** — false positive
|
|
20
|
+
|
|
21
|
+
### Step 2 — Locate Source Files
|
|
22
|
+
|
|
23
|
+
- `[STRUCTURED]` bugs: file path in bug report or test plan
|
|
24
|
+
- `[EXPLORATORY]` bugs: find `{ScreenName}View.swift` / `{ScreenName}Screen.kt` / `{ScreenName}Screen.tsx`
|
|
25
|
+
- `[A11Y]` bugs: open View file, add accessibility modifiers
|
|
26
|
+
- Content bugs: check AppConfig, MockDataProvider, strings
|
|
27
|
+
|
|
28
|
+
### Step 3 — Fix Each Bug (priority order)
|
|
29
|
+
|
|
30
|
+
**Fix patterns:**
|
|
31
|
+
- `[VISUAL]`: lineLimit, frame, padding, spacing, ZStack ordering
|
|
32
|
+
- `[A11Y]`: `.accessibilityLabel()`, `contentDescription`, increase touch targets
|
|
33
|
+
- `[UX]`: fix action handler, navigation call, target
|
|
34
|
+
- `[CONTENT]`: replace leftover text, update AppConfig/MockDataProvider
|
|
35
|
+
- `[STATE]`: fix ViewModel save call, check binding, update provider
|
|
36
|
+
- `[CRASH]`: add nil checks, bounds checking, optional binding
|
|
37
|
+
|
|
38
|
+
### Step 4 — Rebuild
|
|
39
|
+
|
|
40
|
+
Follow `build-tester` skill. Max 3 rebuild cycles.
|
|
41
|
+
|
|
42
|
+
### Step 5 — Verify Fixes
|
|
43
|
+
|
|
44
|
+
Boot simulator, install, launch. For each fixed bug: navigate to screen, verify fix, check no regressions.
|
|
45
|
+
|
|
46
|
+
### Step 6 — Write Fix Report
|
|
47
|
+
|
|
48
|
+
Write `output/{app-name}/reports/12-fix-report.md`: summary counts, per-bug fix details (root cause, fix, files, verified), deferred bugs with recommendations, rebuild/verification results.
|
|
49
|
+
|
|
50
|
+
Update `summary.json` with step 12 entry.
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
- Fix P0 first, P3 last
|
|
55
|
+
- Minimal changes — don't refactor unrelated code
|
|
56
|
+
- Preserve MVVM architecture and MockDataProvider pattern
|
|
57
|
+
- Max 3 rebuild cycles
|
|
58
|
+
- Only write under `output/`
|
|
59
|
+
- DEFER bugs requiring new dependencies or >50 lines across >3 files
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: catalog-analyzer
|
|
3
|
+
description: Selects the best template from CATALOG.md and shared modules from MODULES_CATALOG.md in one pass. Uses selected template to boost module accuracy via "Relevant Templates" column.
|
|
4
|
+
allowed-tools: Read, Grep, Glob, LS
|
|
5
|
+
context: fork
|
|
6
|
+
agent: Explore
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Catalog Analyzer Skill
|
|
10
|
+
|
|
11
|
+
Select the best template AND shared modules for the user's app in one pass.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- Step 0, in parallel with prompt validation and design brand selection
|
|
16
|
+
- Before cloning any template to `output/`
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
### Phase 1 — Template Selection
|
|
21
|
+
|
|
22
|
+
#### Step 1 — Read the Template Catalog
|
|
23
|
+
|
|
24
|
+
Read `templates/CATALOG.md`. Understand each template's feature set, "Best-For Keywords", "Best match when" criteria, and "NOT a match when" rules.
|
|
25
|
+
|
|
26
|
+
#### Step 2 — Score Each Template
|
|
27
|
+
|
|
28
|
+
For each template: score against user description keywords, check match criteria, apply exclusion rules, consider navigation pattern similarity.
|
|
29
|
+
|
|
30
|
+
#### Step 3 — Handle Edge Cases
|
|
31
|
+
|
|
32
|
+
Check the "Hybrid Apps" table if the app spans categories. Follow "When No Template Fits" guidance if needed.
|
|
33
|
+
|
|
34
|
+
#### Step 4 — Select ONE Template
|
|
35
|
+
|
|
36
|
+
Choose exactly ONE primary template. Determine confidence (high/medium/low). Features covered by shared modules should NOT affect template scoring.
|
|
37
|
+
|
|
38
|
+
### Phase 2 — Module Selection (uses template from Phase 1)
|
|
39
|
+
|
|
40
|
+
#### Step 5 — Read Modules Catalog
|
|
41
|
+
|
|
42
|
+
Read `templates/shared/MODULES_CATALOG.md`. Note each module's keywords, relevant templates, and dependencies.
|
|
43
|
+
|
|
44
|
+
#### Step 6 — Match by Keywords + Relevant Templates
|
|
45
|
+
|
|
46
|
+
For every module:
|
|
47
|
+
1. Compare "Best-For Keywords" against user description (primary signal)
|
|
48
|
+
2. Check if selected template is in "Relevant Templates" column (boost signal)
|
|
49
|
+
3. Keyword match + template match = strong include
|
|
50
|
+
4. Keyword match + no template match = include with lower confidence
|
|
51
|
+
5. No keyword match + template match = consider if implied by domain
|
|
52
|
+
|
|
53
|
+
**Guidance:** Aim for **5-15 modules**. Consider implicit needs (shopping → payment, social → sharing).
|
|
54
|
+
|
|
55
|
+
**BaaS selection:** FirebaseProvider OR SupabaseProvider (not both) when description mentions auth/users/cloud/sync/backend. Default: no BaaS. Supabase needs CachedRepository; Firebase does not. Prefer Firebase when both fit equally.
|
|
56
|
+
|
|
57
|
+
#### Step 7 — Check Dependencies
|
|
58
|
+
|
|
59
|
+
Verify dependencies (Paywall→BiometricAuth, AccountDeletion→ConsentPrivacy, PushNotifications→ConsentPrivacy, etc.). Add missing ones.
|
|
60
|
+
|
|
61
|
+
#### Step 8 — Animation Heuristics
|
|
62
|
+
|
|
63
|
+
For "stunning/beautiful/premium/polished" descriptions, consider MicroInteractions, AnimatedTransitions, CelebrationEffects, HapticEngine, etc. Auto-include MotionPreferences when any animation module is selected.
|
|
64
|
+
|
|
65
|
+
#### Step 9 — Final List
|
|
66
|
+
|
|
67
|
+
Produce selected modules with reasoning.
|
|
68
|
+
|
|
69
|
+
## Report Output
|
|
70
|
+
|
|
71
|
+
Write `output/{app-name}/reports/02-catalog-analysis.md` with both template selection and module selection sections. Update `summary.json`:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"step": 0,
|
|
76
|
+
"name": "catalog-analysis",
|
|
77
|
+
"result": "PASS",
|
|
78
|
+
"reportFile": "02-catalog-analysis.md",
|
|
79
|
+
"template": "{TemplateName}",
|
|
80
|
+
"confidence": "high|medium|low",
|
|
81
|
+
"borrowFrom": "{other template or null}",
|
|
82
|
+
"modulesSelected": {N}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Rules
|
|
87
|
+
|
|
88
|
+
- READ-ONLY — only write report files
|
|
89
|
+
- Always recommend exactly ONE primary template
|
|
90
|
+
- Do NOT recommend building from scratch
|
|
91
|
+
- No modules are auto-included — every module must match via keywords
|
|
92
|
+
- **Visual liveliness rule**: For consumer apps (shopping, social, food, fitness, travel, art, music, creative, lifestyle), automatically include **MicroInteractions** unless the domain demands restraint (medical, legal, finance)
|
|
93
|
+
- When ANY animation module is selected, auto-include MotionPreferences
|
|
94
|
+
- Aim for 5-15 modules
|
|
95
|
+
- "Relevant Templates" is a boost, not a hard filter
|
|
96
|
+
- Module integration happens later (Steps 4-5), not here
|
|
@@ -9,8 +9,8 @@ Use this skill to produce a single, comprehensive customization manifest before
|
|
|
9
9
|
|
|
10
10
|
## When to Use
|
|
11
11
|
|
|
12
|
-
- After Step 0 (Prompt Validation
|
|
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) or `features/` (Android)
|
|
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
|
|
|
@@ -148,7 +148,7 @@ Based on the app domain and the existing MockDataProvider structure:
|
|
|
148
148
|
|
|
149
149
|
### Step 6 — Produce Module Integration Plan
|
|
150
150
|
|
|
151
|
-
Read the
|
|
151
|
+
Read the "Module Selection" section from `output/{app-name}/reports/02-catalog-analysis.md`. For each selected module, plan how it connects to the app:
|
|
152
152
|
|
|
153
153
|
- **Placement:** How the module's UI is presented (tab, sheet, navigation link, settings row, or embedded)
|
|
154
154
|
- **Presented from:** Which existing screen triggers it and how
|
|
@@ -241,6 +241,45 @@ Write the complete manifest to `output/{app-name}/reports/customization-manifest
|
|
|
241
241
|
- Spacing: {scale}
|
|
242
242
|
- Icon style: {filled|outlined}
|
|
243
243
|
|
|
244
|
+
### Visual Polish Plan
|
|
245
|
+
|
|
246
|
+
#### Shadow Style
|
|
247
|
+
| Token | Value |
|
|
248
|
+
|-------|-------|
|
|
249
|
+
| Shadow type | {colored / neutral} |
|
|
250
|
+
| Shadow color | {primary at X% / black at X%} |
|
|
251
|
+
| Shadow blur | {X}pt |
|
|
252
|
+
| Shadow y-offset | {X}pt |
|
|
253
|
+
|
|
254
|
+
#### Gradient Usage
|
|
255
|
+
- Hero sections: {primary-to-secondary gradient / subtle gradient / none}
|
|
256
|
+
- CTA buttons: {gradient / solid}
|
|
257
|
+
- Section backgrounds: {subtle gradient / solid}
|
|
258
|
+
|
|
259
|
+
#### Animation Choreography
|
|
260
|
+
| Token | Value |
|
|
261
|
+
|-------|-------|
|
|
262
|
+
| Spring preset | {bouncy / smooth / snappy} |
|
|
263
|
+
| Press scale | {0.95} |
|
|
264
|
+
| Stagger delay | {X}ms |
|
|
265
|
+
| Favorite toggle | {heart bounce + haptic} |
|
|
266
|
+
| Success event | {confetti / sparkle / none} |
|
|
267
|
+
|
|
268
|
+
#### Built-in Modifiers (always available, no module required)
|
|
269
|
+
- `.staggeredAppear(index:)` — staggered list entrance
|
|
270
|
+
- `.slideIn()` / `.slideAndFade()` — appear animations
|
|
271
|
+
- `.scaleOnPress()` — press feedback (0.95 scale + spring)
|
|
272
|
+
- `.hapticFeedback()` — haptic on tap
|
|
273
|
+
- `.bounceOnChange(isActive:)` — toggle bounce
|
|
274
|
+
- `.cardShadow()` / `.elevatedShadow()` — shadow depth
|
|
275
|
+
- `.shimmer()` — shimmer overlay for loading placeholders
|
|
276
|
+
- `.pulse()` — repeating pulse for live indicators
|
|
277
|
+
- `.heartBounce(isActive:)` — bounce for favorite/like toggles
|
|
278
|
+
|
|
279
|
+
#### Depth & Material
|
|
280
|
+
- Sheet backgrounds: {glass blur / solid}
|
|
281
|
+
- Tab bar: {blur / solid / elevated}
|
|
282
|
+
|
|
244
283
|
### Icon Mapping — Tabs
|
|
245
284
|
| Tab | Label | iOS (SF Symbol) | Android (Material) |
|
|
246
285
|
|-----|-------|-----------------|-------------------|
|
|
@@ -12,7 +12,7 @@ Use this skill to select the best visual design brand for the user's app.
|
|
|
12
12
|
|
|
13
13
|
## When to Use
|
|
14
14
|
|
|
15
|
-
- At Step
|
|
15
|
+
- At Step 0, in parallel with prompt validation and catalog analysis
|
|
16
16
|
- Before applying design tokens
|
|
17
17
|
|
|
18
18
|
## Instructions
|
|
@@ -25,6 +25,8 @@ Read `designs/DESIGN_CATALOG.md`. Understand each brand's visual tone, decision
|
|
|
25
25
|
|
|
26
26
|
Score against app description and target audience. Apply match criteria and exclusion rules. Follow the decision flow.
|
|
27
27
|
|
|
28
|
+
**Energy bias**: When brands tie, prefer higher Energy score. For ambiguous domains (not medical/finance/corporate), bias toward Energy >= 3. Apps should feel vibrant by default.
|
|
29
|
+
|
|
28
30
|
### Step 3 — Handle User Style Preferences
|
|
29
31
|
|
|
30
32
|
If user mentioned colors/style: use as primary input, select brand with best structural token match, note color overrides in adaptations.
|
|
@@ -16,7 +16,7 @@ Read `designs/DESIGN_PRINCIPLES.md` for baseline mobile design rules.
|
|
|
16
16
|
|
|
17
17
|
### Step 1 — Load the Selected Brand
|
|
18
18
|
|
|
19
|
-
Read brand file, extract palette, layout tokens, typography, icon style. Apply any ADAPT suggestions.
|
|
19
|
+
Read brand file, extract palette, layout tokens, typography, icon style, and **Motion & Effects** section (spring preset, press scale, shadow style, gradient usage, depth approach, haptic policy). Apply any ADAPT suggestions.
|
|
20
20
|
|
|
21
21
|
### Step 2/3 — Fallback (if no brand selected)
|
|
22
22
|
|