@shaykec/app-agent 1.0.0
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 +57 -0
- package/.claude/agents/build-tester.md +58 -0
- package/.claude/agents/design-selector.md +43 -0
- package/.claude/agents/ios-customizer.md +54 -0
- package/.claude/agents/security-auditor.md +60 -0
- package/.claude/agents/template-selector.md +39 -0
- package/.claude/agents/ui-tester.md +74 -0
- package/.claude/agents/validator.md +53 -0
- package/.claude/settings.json +42 -0
- package/.claude/skills/android-customizer/SKILL.md +278 -0
- package/.claude/skills/app-renaming/SKILL.md +71 -0
- package/.claude/skills/appconfig-customization/SKILL.md +41 -0
- package/.claude/skills/build-tester/SKILL.md +53 -0
- package/.claude/skills/code-auditor/SKILL.md +53 -0
- package/.claude/skills/content-writer/SKILL.md +63 -0
- package/.claude/skills/customization-planner/SKILL.md +373 -0
- package/.claude/skills/design-selector/SKILL.md +45 -0
- package/.claude/skills/design-system/SKILL.md +65 -0
- package/.claude/skills/ios-customizer/SKILL.md +261 -0
- package/.claude/skills/mock-data-update/SKILL.md +48 -0
- package/.claude/skills/module-integrator/SKILL.md +69 -0
- package/.claude/skills/module-selector/SKILL.md +81 -0
- package/.claude/skills/output-validator/SKILL.md +43 -0
- package/.claude/skills/prompt-validator/SKILL.md +56 -0
- package/.claude/skills/template-selector/SKILL.md +44 -0
- package/.claude/skills/ui-tester/SKILL.md +449 -0
- package/.cursor/agents/README.md +27 -0
- package/.cursor/agents/android-customizer.md +159 -0
- package/.cursor/agents/build-tester.md +121 -0
- package/.cursor/agents/design-selector.md +88 -0
- package/.cursor/agents/ios-customizer.md +121 -0
- package/.cursor/agents/security-auditor.md +322 -0
- package/.cursor/agents/template-selector.md +52 -0
- package/.cursor/agents/ui-tester.md +187 -0
- package/.cursor/agents/validator.md +92 -0
- package/.cursor/hooks/lint-check.sh +40 -0
- package/.cursor/hooks/session-init.sh +29 -0
- package/.cursor/hooks/validate-output.sh +140 -0
- package/.cursor/hooks.json +21 -0
- package/.cursor/mcp.json +11 -0
- package/.cursor/rules/kotlin-patterns.mdc +60 -0
- package/.cursor/rules/safety-guardrails.mdc +48 -0
- package/.cursor/rules/swift-patterns.mdc +52 -0
- package/.cursor/rules/workflow.mdc +306 -0
- package/.cursor/skills/android-customizer/SKILL.md +303 -0
- package/.cursor/skills/app-renaming/SKILL.md +71 -0
- package/.cursor/skills/appconfig-customization/SKILL.md +110 -0
- package/.cursor/skills/build-tester/SKILL.md +217 -0
- package/.cursor/skills/code-auditor/SKILL.md +190 -0
- package/.cursor/skills/content-writer/SKILL.md +252 -0
- package/.cursor/skills/customization-planner/SKILL.md +386 -0
- package/.cursor/skills/design-selector/SKILL.md +124 -0
- package/.cursor/skills/design-system/SKILL.md +296 -0
- package/.cursor/skills/ios-customizer/SKILL.md +280 -0
- package/.cursor/skills/mock-data-update/SKILL.md +122 -0
- package/.cursor/skills/module-integrator/SKILL.md +111 -0
- package/.cursor/skills/module-selector/SKILL.md +107 -0
- package/.cursor/skills/output-validator/SKILL.md +160 -0
- package/.cursor/skills/prompt-validator/SKILL.md +151 -0
- package/.cursor/skills/template-selector/SKILL.md +122 -0
- package/.cursor/skills/ui-tester/SKILL.md +483 -0
- package/.cursor/worktrees.json +5 -0
- package/AGENTS.md +318 -0
- package/CLAUDE.md +387 -0
- package/README.md +814 -0
- package/designs/DESIGN_CATALOG.md +303 -0
- package/designs/DESIGN_PRINCIPLES.md +266 -0
- package/designs/brands/accessible-high-contrast.md +139 -0
- package/designs/brands/corporate-professional.md +103 -0
- package/designs/brands/dark-luxe.md +106 -0
- package/designs/brands/kids-playful.md +122 -0
- package/designs/brands/medical-clinical.md +127 -0
- package/designs/brands/modern-minimal.md +103 -0
- package/designs/brands/nature-organic.md +105 -0
- package/designs/brands/neo-brutalist.md +105 -0
- package/designs/brands/retro-vintage.md +108 -0
- package/designs/brands/soft-gradient.md +120 -0
- package/designs/brands/sport-athletic.md +117 -0
- package/designs/brands/tech-dynamic.md +123 -0
- package/designs/brands/vibrant-playful.md +103 -0
- package/dist/agent-runner.d.ts +34 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +358 -0
- package/dist/agent-runner.js.map +1 -0
- package/dist/app-manager.d.ts +53 -0
- package/dist/app-manager.d.ts.map +1 -0
- package/dist/app-manager.js +395 -0
- package/dist/app-manager.js.map +1 -0
- package/dist/cli.d.ts +39 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +414 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +143 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +133 -0
- package/dist/config.js.map +1 -0
- package/dist/engines/claude-engine.d.ts +19 -0
- package/dist/engines/claude-engine.d.ts.map +1 -0
- package/dist/engines/claude-engine.js +537 -0
- package/dist/engines/claude-engine.js.map +1 -0
- package/dist/engines/cursor-engine.d.ts +15 -0
- package/dist/engines/cursor-engine.d.ts.map +1 -0
- package/dist/engines/cursor-engine.js +333 -0
- package/dist/engines/cursor-engine.js.map +1 -0
- package/dist/engines/factory.d.ts +10 -0
- package/dist/engines/factory.d.ts.map +1 -0
- package/dist/engines/factory.js +19 -0
- package/dist/engines/factory.js.map +1 -0
- package/dist/engines/index.d.ts +4 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +3 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/types.d.ts +163 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +201 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/github.d.ts +107 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +394 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +929 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt-builder.d.ts +38 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +465 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/prompt-sanitizer.d.ts +29 -0
- package/dist/prompt-sanitizer.d.ts.map +1 -0
- package/dist/prompt-sanitizer.js +205 -0
- package/dist/prompt-sanitizer.js.map +1 -0
- package/dist/updater.d.ts +46 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +251 -0
- package/dist/updater.js.map +1 -0
- package/dist/validator.d.ts +20 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +238 -0
- package/dist/validator.js.map +1 -0
- package/dist/workspace.d.ts +33 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +267 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +58 -0
- package/prompts/agent-prompt.md +237 -0
- package/prompts/quick-agent-prompt.md +123 -0
- package/prompts/scratch-agent-prompt.md +319 -0
- package/prompts/test-agent-prompt.md +120 -0
- package/prompts/update-agent-prompt.md +129 -0
- package/scripts/rename-template.sh +212 -0
- package/scripts/run-maestro-ios.sh +33 -0
- package/templates/CATALOG.md +898 -0
- package/templates/README.md +261 -0
- package/templates/TEST_ID_CONVENTIONS.md +164 -0
- package/templates/android/BookTemplate/API_INTEGRATION.md +390 -0
- package/templates/android/BookTemplate/ARCHITECTURE.md +581 -0
- package/templates/android/BookTemplate/CUSTOMIZATION.md +247 -0
- package/templates/android/BookTemplate/README.md +90 -0
- package/templates/android/BookTemplate/TESTING_MANIFEST.md +263 -0
- package/templates/android/BookTemplate/app/build.gradle.kts +91 -0
- package/templates/android/BookTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/BookTemplate/app/src/main/AndroidManifest.xml +45 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/AppConfig.kt +78 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/BookApplication.kt +15 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/MainActivity.kt +31 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/components/OfflineBanner.kt +40 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/theme/Theme.kt +70 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/theme/Type.kt +64 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/LocalPersistence.kt +32 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/Models.kt +144 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/NetworkMonitor.kt +26 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/SyncManager.kt +31 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/booking/BookingScreen.kt +702 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/bookings/BookingsScreen.kt +416 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/DiscoveryScreen.kt +382 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/DiscoveryViewModel.kt +63 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/ProviderDetailScreen.kt +483 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/SearchScreen.kt +224 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/navigation/Navigation.kt +231 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/profile/ProfileScreen.kt +529 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/mock/MockDataProvider.kt +319 -0
- package/templates/android/BookTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +22 -0
- package/templates/android/BookTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/BookTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/BookTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/BookTemplate/app/src/main/res/values/strings.xml +48 -0
- package/templates/android/BookTemplate/app/src/main/res/values/themes.xml +7 -0
- package/templates/android/BookTemplate/app/src/main/res/xml/backup_rules.xml +4 -0
- package/templates/android/BookTemplate/app/src/main/res/xml/data_extraction_rules.xml +9 -0
- package/templates/android/BookTemplate/app/src/test/kotlin/com/appship/book/data/ModelsTest.kt +188 -0
- package/templates/android/BookTemplate/app/src/test/kotlin/com/appship/book/features/discovery/DiscoveryViewModelTest.kt +102 -0
- package/templates/android/BookTemplate/app/src/test/kotlin/com/appship/book/mock/MockDataProviderTest.kt +229 -0
- package/templates/android/BookTemplate/build.gradle.kts +7 -0
- package/templates/android/BookTemplate/gradle/libs.versions.toml +46 -0
- package/templates/android/BookTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/BookTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/BookTemplate/gradle.properties +5 -0
- package/templates/android/BookTemplate/gradlew +248 -0
- package/templates/android/BookTemplate/gradlew.bat +93 -0
- package/templates/android/BookTemplate/settings.gradle.kts +23 -0
- package/templates/android/BookTemplate/tests/01_launch_discover.yaml +16 -0
- package/templates/android/BookTemplate/tests/02_tab_navigation.yaml +21 -0
- package/templates/android/BookTemplate/tests/03_provider_detail.yaml +15 -0
- package/templates/android/BookTemplate/tests/04_booking_flow.yaml +14 -0
- package/templates/android/BookTemplate/tests/05_search_filter.yaml +14 -0
- package/templates/android/BookTemplate/tests/06_favorites.yaml +14 -0
- package/templates/android/BookTemplate/tests/07_profile.yaml +14 -0
- package/templates/android/BookTemplate/tests/08_full_e2e.yaml +21 -0
- package/templates/android/ChatTemplate/API_INTEGRATION.md +420 -0
- package/templates/android/ChatTemplate/ARCHITECTURE.md +615 -0
- package/templates/android/ChatTemplate/CUSTOMIZATION.md +300 -0
- package/templates/android/ChatTemplate/README.md +101 -0
- package/templates/android/ChatTemplate/TESTING_MANIFEST.md +148 -0
- package/templates/android/ChatTemplate/app/build.gradle.kts +62 -0
- package/templates/android/ChatTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/ChatTemplate/app/src/main/AndroidManifest.xml +32 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/AppConfig.kt +71 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/ChatApplication.kt +15 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/MainActivity.kt +31 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/components/OfflineBanner.kt +40 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/theme/Theme.kt +138 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/theme/Type.kt +116 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/LocalPersistence.kt +32 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/Models.kt +138 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/NetworkMonitor.kt +26 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/SyncManager.kt +31 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/calls/CallsScreen.kt +142 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/contacts/ContactsScreen.kt +174 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ChatScreen.kt +346 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +233 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/navigation/Navigation.kt +130 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/settings/SettingsScreen.kt +153 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/mock/MockDataProvider.kt +112 -0
- package/templates/android/ChatTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +11 -0
- package/templates/android/ChatTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/ChatTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/ChatTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/ChatTemplate/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/ChatTemplate/app/src/main/res/values/themes.xml +7 -0
- package/templates/android/ChatTemplate/app/src/test/kotlin/com/appship/chat/data/ModelsTest.kt +245 -0
- package/templates/android/ChatTemplate/app/src/test/kotlin/com/appship/chat/mock/MockDataProviderTest.kt +176 -0
- package/templates/android/ChatTemplate/build.gradle.kts +7 -0
- package/templates/android/ChatTemplate/gradle/libs.versions.toml +44 -0
- package/templates/android/ChatTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/ChatTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/ChatTemplate/gradle.properties +5 -0
- package/templates/android/ChatTemplate/gradlew +248 -0
- package/templates/android/ChatTemplate/gradlew.bat +93 -0
- package/templates/android/ChatTemplate/settings.gradle.kts +14 -0
- package/templates/android/ChatTemplate/tests/01_launch_chats.yaml +12 -0
- package/templates/android/ChatTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/android/ChatTemplate/tests/03_conversation_chat.yaml +12 -0
- package/templates/android/ChatTemplate/tests/04_new_chat.yaml +11 -0
- package/templates/android/ChatTemplate/tests/05_calls.yaml +11 -0
- package/templates/android/ChatTemplate/tests/06_contacts.yaml +11 -0
- package/templates/android/ChatTemplate/tests/07_settings_profile.yaml +11 -0
- package/templates/android/ChatTemplate/tests/08_full_e2e.yaml +23 -0
- package/templates/android/DashTemplate/API_INTEGRATION.md +47 -0
- package/templates/android/DashTemplate/ARCHITECTURE.md +78 -0
- package/templates/android/DashTemplate/CUSTOMIZATION.md +86 -0
- package/templates/android/DashTemplate/README.md +95 -0
- package/templates/android/DashTemplate/TESTING_MANIFEST.md +75 -0
- package/templates/android/DashTemplate/app/build.gradle.kts +71 -0
- package/templates/android/DashTemplate/app/proguard-rules.pro +21 -0
- package/templates/android/DashTemplate/app/src/main/AndroidManifest.xml +27 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/AppConfig.kt +97 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/DashApplication.kt +7 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/MainActivity.kt +31 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/components/TimeRangePicker.kt +32 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/components/WidgetCard.kt +147 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/theme/Theme.kt +127 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/theme/Type.kt +115 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/Models.kt +118 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/di/AppModule.kt +11 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/alerts/AlertsScreen.kt +80 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/dashboard/DashboardScreen.kt +73 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/datasources/DataSourcesScreen.kt +43 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/metricdetail/MetricDetailScreen.kt +56 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/MainScreen.kt +56 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/navigation/Navigation.kt +30 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/reports/ReportsScreen.kt +59 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/settings/SettingsScreen.kt +68 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/mock/MockDataProvider.kt +437 -0
- package/templates/android/DashTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +24 -0
- package/templates/android/DashTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/DashTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/DashTemplate/app/src/main/res/values/colors.xml +6 -0
- package/templates/android/DashTemplate/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/DashTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/DashTemplate/app/src/main/res/xml/backup_rules.xml +4 -0
- package/templates/android/DashTemplate/app/src/main/res/xml/data_extraction_rules.xml +15 -0
- package/templates/android/DashTemplate/app/src/test/kotlin/com/appship/dash/data/ModelsTest.kt +183 -0
- package/templates/android/DashTemplate/app/src/test/kotlin/com/appship/dash/mock/MockDataProviderTest.kt +180 -0
- package/templates/android/DashTemplate/build.gradle.kts +7 -0
- package/templates/android/DashTemplate/gradle/libs.versions.toml +46 -0
- package/templates/android/DashTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/DashTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/DashTemplate/gradle.properties +23 -0
- package/templates/android/DashTemplate/gradlew +248 -0
- package/templates/android/DashTemplate/gradlew.bat +93 -0
- package/templates/android/DashTemplate/settings.gradle.kts +14 -0
- package/templates/android/DashTemplate/tests/01_launch_dashboard.yaml +15 -0
- package/templates/android/DashTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/android/DashTemplate/tests/03_widget_interaction.yaml +11 -0
- package/templates/android/DashTemplate/tests/04_time_range_selection.yaml +17 -0
- package/templates/android/DashTemplate/tests/05_alerts_view.yaml +17 -0
- package/templates/android/DashTemplate/tests/06_refresh_dashboard.yaml +13 -0
- package/templates/android/DashTemplate/tests/07_settings_view.yaml +12 -0
- package/templates/android/DashTemplate/tests/08_full_e2e.yaml +45 -0
- package/templates/android/FamilyTemplate/API_INTEGRATION.md +129 -0
- package/templates/android/FamilyTemplate/ARCHITECTURE.md +137 -0
- package/templates/android/FamilyTemplate/CUSTOMIZATION.md +106 -0
- package/templates/android/FamilyTemplate/README.md +93 -0
- package/templates/android/FamilyTemplate/TESTING_MANIFEST.md +69 -0
- package/templates/android/FamilyTemplate/app/build.gradle.kts +95 -0
- package/templates/android/FamilyTemplate/app/src/main/AndroidManifest.xml +31 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/AppConfig.kt +38 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/FamilyApplication.kt +7 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/MainActivity.kt +29 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/theme/Theme.kt +37 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/Models.kt +112 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/calendar/CalendarScreen.kt +128 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/chores/ChoreBoardScreen.kt +151 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/familyhub/FamilyHubScreen.kt +144 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/gallery/GalleryScreen.kt +80 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/members/MembersListScreen.kt +89 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/navigation/MainNavigation.kt +105 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/rewards/RewardsScreen.kt +100 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/settings/SettingsScreen.kt +138 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/mock/MockDataProvider.kt +548 -0
- package/templates/android/FamilyTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +24 -0
- package/templates/android/FamilyTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/FamilyTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/FamilyTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/FamilyTemplate/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/FamilyTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/FamilyTemplate/app/src/main/res/xml/backup_rules.xml +1 -0
- package/templates/android/FamilyTemplate/app/src/main/res/xml/data_extraction_rules.xml +1 -0
- package/templates/android/FamilyTemplate/app/src/test/java/com/appship/family/data/ModelsTest.kt +177 -0
- package/templates/android/FamilyTemplate/app/src/test/java/com/appship/family/mock/MockDataProviderTest.kt +201 -0
- package/templates/android/FamilyTemplate/build.gradle.kts +6 -0
- package/templates/android/FamilyTemplate/gradle/libs.versions.toml +46 -0
- package/templates/android/FamilyTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/FamilyTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/FamilyTemplate/gradle.properties +5 -0
- package/templates/android/FamilyTemplate/gradlew +248 -0
- package/templates/android/FamilyTemplate/gradlew.bat +93 -0
- package/templates/android/FamilyTemplate/settings.gradle.kts +23 -0
- package/templates/android/FamilyTemplate/tests/01_launch_hub.yaml +9 -0
- package/templates/android/FamilyTemplate/tests/02_tab_navigation.yaml +15 -0
- package/templates/android/FamilyTemplate/tests/03_chore_complete.yaml +11 -0
- package/templates/android/FamilyTemplate/tests/04_add_chore.yaml +10 -0
- package/templates/android/FamilyTemplate/tests/05_rewards.yaml +9 -0
- package/templates/android/FamilyTemplate/tests/06_calendar.yaml +12 -0
- package/templates/android/FamilyTemplate/tests/07_gallery.yaml +11 -0
- package/templates/android/FamilyTemplate/tests/08_full_e2e.yaml +27 -0
- package/templates/android/FinanceTemplate/API_INTEGRATION.md +335 -0
- package/templates/android/FinanceTemplate/ARCHITECTURE.md +569 -0
- package/templates/android/FinanceTemplate/CUSTOMIZATION.md +312 -0
- package/templates/android/FinanceTemplate/README.md +93 -0
- package/templates/android/FinanceTemplate/TESTING_MANIFEST.md +145 -0
- package/templates/android/FinanceTemplate/app/build.gradle.kts +71 -0
- package/templates/android/FinanceTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/FinanceTemplate/app/src/main/AndroidManifest.xml +30 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/AppConfig.kt +93 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/FinanceApplication.kt +17 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/MainActivity.kt +31 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/components/OfflineBanner.kt +49 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/theme/Theme.kt +139 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/theme/Type.kt +116 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/LocalPersistence.kt +46 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/Models.kt +177 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/NetworkMonitor.kt +46 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/SyncManager.kt +94 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/budgets/BudgetsScreen.kt +199 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/goals/GoalsScreen.kt +346 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/home/HomeScreen.kt +349 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/navigation/Navigation.kt +157 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/settings/SettingsScreen.kt +141 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/transactions/TransactionsScreen.kt +267 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/mock/MockDataProvider.kt +224 -0
- package/templates/android/FinanceTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +18 -0
- package/templates/android/FinanceTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/FinanceTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/FinanceTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/FinanceTemplate/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/FinanceTemplate/app/src/main/res/values/themes.xml +7 -0
- package/templates/android/FinanceTemplate/app/src/test/kotlin/com/appship/finance/data/ModelsTest.kt +298 -0
- package/templates/android/FinanceTemplate/app/src/test/kotlin/com/appship/finance/mock/MockDataProviderTest.kt +301 -0
- package/templates/android/FinanceTemplate/build.gradle.kts +7 -0
- package/templates/android/FinanceTemplate/gradle/libs.versions.toml +46 -0
- package/templates/android/FinanceTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/FinanceTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/FinanceTemplate/gradle.properties +5 -0
- package/templates/android/FinanceTemplate/gradlew +248 -0
- package/templates/android/FinanceTemplate/gradlew.bat +93 -0
- package/templates/android/FinanceTemplate/settings.gradle.kts +14 -0
- package/templates/android/FinanceTemplate/tests/01_launch_home.yaml +15 -0
- package/templates/android/FinanceTemplate/tests/02_tab_navigation.yaml +24 -0
- package/templates/android/FinanceTemplate/tests/03_add_transaction.yaml +15 -0
- package/templates/android/FinanceTemplate/tests/04_budgets.yaml +14 -0
- package/templates/android/FinanceTemplate/tests/05_goals.yaml +14 -0
- package/templates/android/FinanceTemplate/tests/06_transactions.yaml +14 -0
- package/templates/android/FinanceTemplate/tests/07_search_filter.yaml +14 -0
- package/templates/android/FinanceTemplate/tests/08_full_e2e.yaml +24 -0
- package/templates/android/GameTemplate/API_INTEGRATION.md +253 -0
- package/templates/android/GameTemplate/ARCHITECTURE.md +162 -0
- package/templates/android/GameTemplate/CUSTOMIZATION.md +243 -0
- package/templates/android/GameTemplate/README.md +209 -0
- package/templates/android/GameTemplate/TESTING_MANIFEST.md +221 -0
- package/templates/android/GameTemplate/app/build.gradle.kts +67 -0
- package/templates/android/GameTemplate/app/proguard-rules.pro +30 -0
- package/templates/android/GameTemplate/app/src/main/AndroidManifest.xml +26 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/AppConfig.kt +76 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/MainActivity.kt +40 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/managers/GameManager.kt +98 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/managers/PlayerManager.kt +159 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/theme/Theme.kt +110 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/theme/Type.kt +116 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/Models.kt +148 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/achievements/AchievementsScreen.kt +139 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/game/GameScreen.kt +198 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/home/HomeMenuScreen.kt +292 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/leaderboard/LeaderboardScreen.kt +149 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/navigation/Navigation.kt +152 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/profile/ProfileScreen.kt +198 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/results/ResultsScreen.kt +156 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/settings/SettingsScreen.kt +192 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/shop/ShopScreen.kt +194 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/mock/MockDataProvider.kt +78 -0
- package/templates/android/GameTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +28 -0
- package/templates/android/GameTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/GameTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/GameTemplate/app/src/main/res/values/colors.xml +31 -0
- package/templates/android/GameTemplate/app/src/main/res/values/strings.xml +69 -0
- package/templates/android/GameTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/GameTemplate/app/src/main/res/xml/backup_rules.xml +5 -0
- package/templates/android/GameTemplate/app/src/main/res/xml/data_extraction_rules.xml +7 -0
- package/templates/android/GameTemplate/app/src/test/kotlin/com/appship/game/MockDataProviderTest.kt +39 -0
- package/templates/android/GameTemplate/app/src/test/kotlin/com/appship/game/ModelsTest.kt +73 -0
- package/templates/android/GameTemplate/build.gradle.kts +5 -0
- package/templates/android/GameTemplate/gradle/libs.versions.toml +40 -0
- package/templates/android/GameTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/GameTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/GameTemplate/gradle.properties +6 -0
- package/templates/android/GameTemplate/gradlew +248 -0
- package/templates/android/GameTemplate/gradlew.bat +93 -0
- package/templates/android/GameTemplate/settings.gradle.kts +18 -0
- package/templates/android/GameTemplate/tests/01_launch_home.yaml +14 -0
- package/templates/android/GameTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/android/GameTemplate/tests/03_game_play.yaml +27 -0
- package/templates/android/GameTemplate/tests/04_leaderboard.yaml +18 -0
- package/templates/android/GameTemplate/tests/05_shop.yaml +20 -0
- package/templates/android/GameTemplate/tests/06_achievements.yaml +18 -0
- package/templates/android/GameTemplate/tests/07_profile_settings.yaml +24 -0
- package/templates/android/GameTemplate/tests/08_full_e2e.yaml +49 -0
- package/templates/android/HealthTemplate/API_INTEGRATION.md +81 -0
- package/templates/android/HealthTemplate/ARCHITECTURE.md +104 -0
- package/templates/android/HealthTemplate/CUSTOMIZATION.md +90 -0
- package/templates/android/HealthTemplate/README.md +126 -0
- package/templates/android/HealthTemplate/TESTING_MANIFEST.md +64 -0
- package/templates/android/HealthTemplate/app/build.gradle.kts +84 -0
- package/templates/android/HealthTemplate/app/proguard-rules.pro +6 -0
- package/templates/android/HealthTemplate/app/src/main/AndroidManifest.xml +40 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/AppConfig.kt +83 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/MainActivity.kt +29 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/theme/Color.kt +9 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/theme/Theme.kt +70 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/theme/Type.kt +100 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/LocalPersistence.kt +32 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/Models.kt +269 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/NetworkMonitor.kt +26 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/SyncManager.kt +31 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/dashboard/DashboardScreen.kt +125 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/navigation/Navigation.kt +187 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/nutrition/MealLogScreen.kt +152 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/nutrition/NutritionLogScreen.kt +34 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/onboarding/OnboardingScreen.kt +87 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/profile/ProfileScreen.kt +86 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/progress/ProgressChartsScreen.kt +86 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/settings/SettingsScreen.kt +58 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/workouts/ExerciseDetailScreen.kt +98 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/workouts/WorkoutListScreen.kt +96 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/workouts/WorkoutPlayerScreen.kt +46 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/mock/MockDataProvider.kt +420 -0
- package/templates/android/HealthTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +11 -0
- package/templates/android/HealthTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/HealthTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/HealthTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/HealthTemplate/app/src/main/res/values/strings.xml +1 -0
- package/templates/android/HealthTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/HealthTemplate/app/src/main/res/xml/backup_rules.xml +5 -0
- package/templates/android/HealthTemplate/app/src/main/res/xml/data_extraction_rules.xml +9 -0
- package/templates/android/HealthTemplate/app/src/test/kotlin/com/appship/health/MockDataProviderTest.kt +73 -0
- package/templates/android/HealthTemplate/app/src/test/kotlin/com/appship/health/ModelsTest.kt +84 -0
- package/templates/android/HealthTemplate/build.gradle.kts +4 -0
- package/templates/android/HealthTemplate/gradle/libs.versions.toml +50 -0
- package/templates/android/HealthTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/HealthTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/HealthTemplate/gradle.properties +4 -0
- package/templates/android/HealthTemplate/gradlew +248 -0
- package/templates/android/HealthTemplate/gradlew.bat +93 -0
- package/templates/android/HealthTemplate/settings.gradle.kts +23 -0
- package/templates/android/HealthTemplate/tests/01_launch_dashboard.yaml +14 -0
- package/templates/android/HealthTemplate/tests/02_tab_navigation.yaml +18 -0
- package/templates/android/HealthTemplate/tests/03_workout_browse.yaml +16 -0
- package/templates/android/HealthTemplate/tests/04_workout_player.yaml +18 -0
- package/templates/android/HealthTemplate/tests/05_meal_logging.yaml +14 -0
- package/templates/android/HealthTemplate/tests/06_progress_charts.yaml +14 -0
- package/templates/android/HealthTemplate/tests/07_profile_settings.yaml +14 -0
- package/templates/android/HealthTemplate/tests/08_full_e2e.yaml +48 -0
- package/templates/android/ICON_VECTORS.md +420 -0
- package/templates/android/LearnTemplate/README.md +118 -0
- package/templates/android/LearnTemplate/app/build.gradle.kts +96 -0
- package/templates/android/LearnTemplate/app/src/main/AndroidManifest.xml +25 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/AppConfig.kt +86 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/MainActivity.kt +30 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/theme/Color.kt +11 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/theme/Theme.kt +46 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/theme/Type.kt +17 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/LocalPersistence.kt +46 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/models/Models.kt +186 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/courses/CourseListScreen.kt +84 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/leaderboard/LeaderboardScreen.kt +51 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/navigation/Navigation.kt +22 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/profile/ProfileScreen.kt +86 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/progress/ProgressDashboardScreen.kt +70 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/mock/MockDataProvider.kt +252 -0
- package/templates/android/LearnTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +26 -0
- package/templates/android/LearnTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/LearnTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/LearnTemplate/app/src/main/res/values/colors.xml +7 -0
- package/templates/android/LearnTemplate/app/src/main/res/values/strings.xml +3 -0
- package/templates/android/LearnTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/LearnTemplate/app/src/main/res/xml/backup_rules.xml +1 -0
- package/templates/android/LearnTemplate/app/src/main/res/xml/data_extraction_rules.xml +1 -0
- package/templates/android/LearnTemplate/app/src/test/kotlin/com/appship/learn/data/models/ModelsTest.kt +250 -0
- package/templates/android/LearnTemplate/app/src/test/kotlin/com/appship/learn/mock/MockDataProviderTest.kt +173 -0
- package/templates/android/LearnTemplate/build.gradle.kts +7 -0
- package/templates/android/LearnTemplate/gradle/libs.versions.toml +50 -0
- package/templates/android/LearnTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/LearnTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/LearnTemplate/gradle.properties +5 -0
- package/templates/android/LearnTemplate/gradlew +248 -0
- package/templates/android/LearnTemplate/gradlew.bat +93 -0
- package/templates/android/LearnTemplate/settings.gradle.kts +18 -0
- package/templates/android/LearnTemplate/tests/01_launch_home.yaml +14 -0
- package/templates/android/LearnTemplate/tests/02_tab_navigation.yaml +22 -0
- package/templates/android/LearnTemplate/tests/03_course_detail.yaml +22 -0
- package/templates/android/LearnTemplate/tests/04_lesson_player.yaml +21 -0
- package/templates/android/LearnTemplate/tests/05_search_filter.yaml +16 -0
- package/templates/android/LearnTemplate/tests/06_progress.yaml +19 -0
- package/templates/android/LearnTemplate/tests/07_profile_settings.yaml +19 -0
- package/templates/android/LearnTemplate/tests/08_full_e2e.yaml +47 -0
- package/templates/android/MapTemplate/API_INTEGRATION.md +179 -0
- package/templates/android/MapTemplate/ARCHITECTURE.md +81 -0
- package/templates/android/MapTemplate/README.md +105 -0
- package/templates/android/MapTemplate/TESTING_MANIFEST.md +77 -0
- package/templates/android/MapTemplate/app/build.gradle.kts +79 -0
- package/templates/android/MapTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/MapTemplate/app/src/main/AndroidManifest.xml +32 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/AppConfig.kt +78 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/MainActivity.kt +29 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/MapApplication.kt +7 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/theme/Theme.kt +125 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/LocalPersistence.kt +68 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/Models.kt +298 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/NetworkMonitor.kt +65 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/SyncManager.kt +78 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/di/AppModule.kt +43 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/favorites/FavoritesScreen.kt +42 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/favorites/FavoritesViewModel.kt +45 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/filters/FiltersScreen.kt +37 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/map/MapScreen.kt +151 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/map/MapViewModel.kt +46 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/navigation/MainScreen.kt +134 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/navigation/Navigation.kt +157 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/onboarding/OnboardingScreen.kt +127 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceDetailScreen.kt +243 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceDetailViewModel.kt +52 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceListScreen.kt +42 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceListViewModel.kt +46 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/profile/ProfileScreen.kt +167 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/profile/ProfileViewModel.kt +47 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/route/RouteScreen.kt +169 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/route/RouteViewModel.kt +44 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/search/SearchScreen.kt +175 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/search/SearchViewModel.kt +48 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/settings/SettingsScreen.kt +150 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/settings/SettingsViewModel.kt +43 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/mock/MockDataProvider.kt +556 -0
- package/templates/android/MapTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +16 -0
- package/templates/android/MapTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/MapTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/MapTemplate/app/src/main/res/values/colors.xml +8 -0
- package/templates/android/MapTemplate/app/src/main/res/values/strings.xml +86 -0
- package/templates/android/MapTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/MapTemplate/app/src/main/res/xml/backup_rules.xml +1 -0
- package/templates/android/MapTemplate/app/src/main/res/xml/data_extraction_rules.xml +1 -0
- package/templates/android/MapTemplate/app/src/test/kotlin/com/appship/map/ModelsTest.kt +72 -0
- package/templates/android/MapTemplate/build.gradle.kts +7 -0
- package/templates/android/MapTemplate/gradle/libs.versions.toml +56 -0
- package/templates/android/MapTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/MapTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/MapTemplate/gradle.properties +4 -0
- package/templates/android/MapTemplate/gradlew +248 -0
- package/templates/android/MapTemplate/gradlew.bat +93 -0
- package/templates/android/MapTemplate/settings.gradle.kts +14 -0
- package/templates/android/MapTemplate/tests/01_launch_map.yaml +19 -0
- package/templates/android/MapTemplate/tests/02_tab_navigation.yaml +21 -0
- package/templates/android/MapTemplate/tests/03_map_interaction.yaml +27 -0
- package/templates/android/MapTemplate/tests/04_place_detail.yaml +25 -0
- package/templates/android/MapTemplate/tests/05_search.yaml +18 -0
- package/templates/android/MapTemplate/tests/06_filters.yaml +17 -0
- package/templates/android/MapTemplate/tests/07_favorites.yaml +19 -0
- package/templates/android/MapTemplate/tests/08_full_e2e.yaml +74 -0
- package/templates/android/MediaTemplate/API_INTEGRATION.md +77 -0
- package/templates/android/MediaTemplate/ARCHITECTURE.md +60 -0
- package/templates/android/MediaTemplate/CUSTOMIZATION.md +83 -0
- package/templates/android/MediaTemplate/README.md +92 -0
- package/templates/android/MediaTemplate/TESTING_MANIFEST.md +144 -0
- package/templates/android/MediaTemplate/app/build.gradle.kts +99 -0
- package/templates/android/MediaTemplate/app/proguard-rules.pro +28 -0
- package/templates/android/MediaTemplate/app/src/main/AndroidManifest.xml +33 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/AppConfig.kt +77 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/MainActivity.kt +29 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/MediaApplication.kt +7 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/models/Models.kt +188 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/di/AppModule.kt +11 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/browse/BrowseScreen.kt +37 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/detail/DetailScreen.kt +53 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/home/HomeScreen.kt +105 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/navigation/MainNavigation.kt +90 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +40 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/mock/MockDataProvider.kt +147 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/ui/theme/Theme.kt +118 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/ui/theme/Type.kt +31 -0
- package/templates/android/MediaTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +16 -0
- package/templates/android/MediaTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/MediaTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/MediaTemplate/app/src/main/res/values/colors.xml +8 -0
- package/templates/android/MediaTemplate/app/src/main/res/values/strings.xml +56 -0
- package/templates/android/MediaTemplate/app/src/main/res/values/themes.xml +8 -0
- package/templates/android/MediaTemplate/app/src/main/res/xml/backup_rules.xml +6 -0
- package/templates/android/MediaTemplate/app/src/main/res/xml/data_extraction_rules.xml +7 -0
- package/templates/android/MediaTemplate/app/src/test/kotlin/com/appship/media/mock/MockDataProviderTest.kt +37 -0
- package/templates/android/MediaTemplate/build.gradle.kts +11 -0
- package/templates/android/MediaTemplate/gradle/libs.versions.toml +50 -0
- package/templates/android/MediaTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/MediaTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/MediaTemplate/gradle.properties +5 -0
- package/templates/android/MediaTemplate/gradlew +248 -0
- package/templates/android/MediaTemplate/gradlew.bat +93 -0
- package/templates/android/MediaTemplate/settings.gradle.kts +18 -0
- package/templates/android/MediaTemplate/tests/01_launch_home.yaml +19 -0
- package/templates/android/MediaTemplate/tests/02_tab_navigation.yaml +17 -0
- package/templates/android/MediaTemplate/tests/03_media_detail.yaml +13 -0
- package/templates/android/MediaTemplate/tests/04_player_controls.yaml +21 -0
- package/templates/android/MediaTemplate/tests/05_search.yaml +14 -0
- package/templates/android/MediaTemplate/tests/06_playlist.yaml +11 -0
- package/templates/android/MediaTemplate/tests/07_downloads.yaml +14 -0
- package/templates/android/MediaTemplate/tests/08_full_e2e.yaml +39 -0
- package/templates/android/ReferenceTemplate/INTEGRATION_MAP.md +436 -0
- package/templates/android/ReferenceTemplate/app/build.gradle.kts +105 -0
- package/templates/android/ReferenceTemplate/app/proguard-rules.pro +27 -0
- package/templates/android/ReferenceTemplate/app/src/main/AndroidManifest.xml +54 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/AppConfig.kt +131 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/Navigation.kt +100 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/AccountDeletion/AccountDeletionManager.kt +232 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/AccountDeletion/AccountDeletionScreen.kt +315 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/AccountDeletion/strings.xml +19 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/BiometricAuth/BiometricAuthManager.kt +193 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/BiometricAuth/BiometricAuthScreen.kt +267 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/BiometricAuth/strings.xml +15 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ChartsLibrary/ChartsLibraryManager.kt +172 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ChartsLibrary/ChartsLibraryModels.kt +43 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ChartsLibrary/ChartsLibraryScreen.kt +545 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ChartsLibrary/strings.xml +16 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ConsentPrivacy/ConsentPrivacyManager.kt +141 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ConsentPrivacy/ConsentPrivacyScreen.kt +265 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ConsentPrivacy/strings.xml +24 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/DeepLinking/DeepLinkingManager.kt +223 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/DeepLinking/DeepLinkingModels.kt +59 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/EmptyStates/EmptyStateManager.kt +31 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/EmptyStates/EmptyStateScreen.kt +164 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/EmptyStates/strings.xml +18 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ErrorHandling/ErrorHandlingManager.kt +67 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ErrorHandling/ErrorHandlingModels.kt +99 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ErrorHandling/ErrorHandlingScreen.kt +141 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ErrorHandling/strings.xml +22 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/FeedbackSupport/FeedbackSupportManager.kt +79 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/FeedbackSupport/FeedbackSupportScreen.kt +361 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/FeedbackSupport/strings.xml +29 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ForceUpdate/ForceUpdateManager.kt +193 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ForceUpdate/strings.xml +11 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/MediaPicker/MediaPickerManager.kt +133 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/MediaPicker/MediaPickerScreen.kt +259 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/MediaPicker/strings.xml +10 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/NetworkBanner/NetworkBannerManager.kt +101 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/NetworkBanner/NetworkBannerScreen.kt +121 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/NetworkBanner/strings.xml +6 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/Paywall/PaywallManager.kt +149 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/Paywall/PaywallModels.kt +29 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/Paywall/PaywallScreen.kt +279 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/Paywall/strings.xml +14 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/PushNotifications/PushNotificationManager.kt +270 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/PushNotifications/PushNotificationScreen.kt +379 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/PushNotifications/strings.xml +40 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ShareSheet/ShareSheetManager.kt +163 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/ShareSheet/ShareSheetModels.kt +49 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/SkeletonLoading/SkeletonLoadingManager.kt +66 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/SkeletonLoading/SkeletonLoadingModels.kt +18 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/SkeletonLoading/SkeletonLoadingScreen.kt +250 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/SkeletonLoading/strings.xml +7 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/features/settings/SettingsScreen.kt +353 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +11 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/values/strings.xml +194 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/values/themes.xml +8 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/xml/backup_rules.xml +5 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/xml/data_extraction_rules.xml +7 -0
- package/templates/android/ReferenceTemplate/build.gradle.kts +8 -0
- package/templates/android/ReferenceTemplate/gradle/libs.versions.toml +53 -0
- package/templates/android/ReferenceTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/ReferenceTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/ReferenceTemplate/gradle.properties +5 -0
- package/templates/android/ReferenceTemplate/gradlew +248 -0
- package/templates/android/ReferenceTemplate/gradlew.bat +93 -0
- package/templates/android/ReferenceTemplate/settings.gradle.kts +18 -0
- package/templates/android/ReferenceTemplate/tests/01_launch_consent.yaml +30 -0
- package/templates/android/ReferenceTemplate/tests/02_biometric_auth.yaml +29 -0
- package/templates/android/ReferenceTemplate/tests/03_home_navigation.yaml +56 -0
- package/templates/android/ReferenceTemplate/tests/04_paywall.yaml +55 -0
- package/templates/android/ReferenceTemplate/tests/05_push_notifications.yaml +52 -0
- package/templates/android/ReferenceTemplate/tests/06_feedback_support.yaml +72 -0
- package/templates/android/ReferenceTemplate/tests/07_settings.yaml +84 -0
- package/templates/android/ReferenceTemplate/tests/08_full_e2e.yaml +118 -0
- package/templates/android/ShopTemplate/API_INTEGRATION.md +374 -0
- package/templates/android/ShopTemplate/ARCHITECTURE.md +492 -0
- package/templates/android/ShopTemplate/CUSTOMIZATION.md +318 -0
- package/templates/android/ShopTemplate/README.md +82 -0
- package/templates/android/ShopTemplate/TESTING_MANIFEST.md +178 -0
- package/templates/android/ShopTemplate/app/build.gradle.kts +101 -0
- package/templates/android/ShopTemplate/app/proguard-rules.pro +27 -0
- package/templates/android/ShopTemplate/app/src/main/AndroidManifest.xml +54 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/AppConfig.kt +79 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/MainActivity.kt +32 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/ShopApplication.kt +20 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/components/CommonComponents.kt +515 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/components/OfflineBanner.kt +49 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/theme/Theme.kt +144 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/theme/Type.kt +116 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/LocalPersistence.kt +46 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/NetworkMonitor.kt +46 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/SyncManager.kt +77 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/models/Models.kt +287 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +416 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartViewModel.kt +125 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/home/HomeScreen.kt +346 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/home/HomeViewModel.kt +77 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/navigation/Navigation.kt +236 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/products/ProductListScreen.kt +469 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/products/ProductViewModels.kt +145 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/profile/ProfileScreen.kt +320 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/wishlist/WishlistScreen.kt +86 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/wishlist/WishlistViewModel.kt +41 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/mock/MockDataProvider.kt +466 -0
- package/templates/android/ShopTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +18 -0
- package/templates/android/ShopTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/ShopTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/ShopTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/ShopTemplate/app/src/main/res/values/strings.xml +60 -0
- package/templates/android/ShopTemplate/app/src/main/res/values/themes.xml +8 -0
- package/templates/android/ShopTemplate/app/src/main/res/xml/backup_rules.xml +5 -0
- package/templates/android/ShopTemplate/app/src/main/res/xml/data_extraction_rules.xml +7 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/data/models/ModelsTest.kt +290 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/features/cart/CartViewModelTest.kt +228 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/features/home/HomeViewModelTest.kt +130 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/features/products/ProductDetailViewModelTest.kt +100 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/features/products/ProductListViewModelTest.kt +136 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/features/wishlist/WishlistViewModelTest.kt +109 -0
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/mock/MockDataProviderTest.kt +314 -0
- package/templates/android/ShopTemplate/build.gradle.kts +7 -0
- package/templates/android/ShopTemplate/gradle/libs.versions.toml +50 -0
- package/templates/android/ShopTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/ShopTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/ShopTemplate/gradle.properties +5 -0
- package/templates/android/ShopTemplate/gradlew +248 -0
- package/templates/android/ShopTemplate/gradlew.bat +93 -0
- package/templates/android/ShopTemplate/settings.gradle.kts +18 -0
- package/templates/android/ShopTemplate/tests/01_launch_home.yaml +12 -0
- package/templates/android/ShopTemplate/tests/02_tab_navigation.yaml +21 -0
- package/templates/android/ShopTemplate/tests/03_product_browse_detail.yaml +13 -0
- package/templates/android/ShopTemplate/tests/04_add_to_cart_checkout.yaml +12 -0
- package/templates/android/ShopTemplate/tests/05_search_filter.yaml +11 -0
- package/templates/android/ShopTemplate/tests/06_wishlist.yaml +11 -0
- package/templates/android/ShopTemplate/tests/07_profile_settings.yaml +11 -0
- package/templates/android/ShopTemplate/tests/08_full_e2e.yaml +22 -0
- package/templates/android/Skeleton/CUSTOMIZATION.md +24 -0
- package/templates/android/Skeleton/README.md +24 -0
- package/templates/android/Skeleton/TESTING_MANIFEST.md +60 -0
- package/templates/android/Skeleton/app/build.gradle.kts +71 -0
- package/templates/android/Skeleton/app/src/main/AndroidManifest.xml +27 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/AppConfig.kt +62 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/MainActivity.kt +22 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/SkeletonApplication.kt +7 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/theme/Theme.kt +74 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/theme/Type.kt +70 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/Models.kt +26 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/create/CreateScreen.kt +135 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/detail/DetailScreen.kt +138 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/explore/ExploreScreen.kt +115 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/favorites/FavoritesScreen.kt +74 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/home/HomeScreen.kt +162 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/navigation/MainScreen.kt +69 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/navigation/Navigation.kt +81 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/profile/ProfileScreen.kt +139 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/mock/MockDataProvider.kt +111 -0
- package/templates/android/Skeleton/app/src/main/res/drawable/ic_launcher_foreground.xml +28 -0
- package/templates/android/Skeleton/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/Skeleton/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/Skeleton/app/src/main/res/values/colors.xml +6 -0
- package/templates/android/Skeleton/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/Skeleton/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/Skeleton/app/src/main/res/xml/backup_rules.xml +3 -0
- package/templates/android/Skeleton/app/src/main/res/xml/data_extraction_rules.xml +9 -0
- package/templates/android/Skeleton/app/src/test/kotlin/com/appship/skeleton/MockDataProviderTest.kt +53 -0
- package/templates/android/Skeleton/build.gradle.kts +7 -0
- package/templates/android/Skeleton/gradle/libs.versions.toml +46 -0
- package/templates/android/Skeleton/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/Skeleton/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/Skeleton/gradle.properties +4 -0
- package/templates/android/Skeleton/gradlew +248 -0
- package/templates/android/Skeleton/gradlew.bat +93 -0
- package/templates/android/Skeleton/settings.gradle.kts +23 -0
- package/templates/android/Skeleton/tests/01_app_launch.yaml +10 -0
- package/templates/android/Skeleton/tests/02_tab_navigation.yaml +20 -0
- package/templates/android/SocialTemplate/API_INTEGRATION.md +311 -0
- package/templates/android/SocialTemplate/ARCHITECTURE.md +589 -0
- package/templates/android/SocialTemplate/CUSTOMIZATION.md +242 -0
- package/templates/android/SocialTemplate/README.md +96 -0
- package/templates/android/SocialTemplate/TESTING_MANIFEST.md +147 -0
- package/templates/android/SocialTemplate/app/build.gradle.kts +72 -0
- package/templates/android/SocialTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/SocialTemplate/app/src/main/AndroidManifest.xml +31 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/AppConfig.kt +64 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/MainActivity.kt +31 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/SocialApplication.kt +17 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/components/OfflineBanner.kt +49 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/theme/Theme.kt +142 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/theme/Type.kt +116 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/LocalPersistence.kt +46 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/Models.kt +183 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/NetworkMonitor.kt +46 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/SyncManager.kt +105 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/createpost/CreatePostScreen.kt +148 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/feed/CommentsScreen.kt +190 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/feed/FeedScreen.kt +361 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/messages/MessagesScreen.kt +304 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/navigation/Navigation.kt +199 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/notifications/NotificationsScreen.kt +166 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/profile/ProfileScreen.kt +288 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/search/SearchScreen.kt +175 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/settings/SettingsScreen.kt +134 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/mock/MockDataProvider.kt +322 -0
- package/templates/android/SocialTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +24 -0
- package/templates/android/SocialTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/SocialTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/SocialTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/SocialTemplate/app/src/main/res/values/strings.xml +4 -0
- package/templates/android/SocialTemplate/app/src/main/res/values/themes.xml +7 -0
- package/templates/android/SocialTemplate/app/src/test/kotlin/com/appship/social/data/ModelsTest.kt +276 -0
- package/templates/android/SocialTemplate/app/src/test/kotlin/com/appship/social/mock/MockDataProviderTest.kt +219 -0
- package/templates/android/SocialTemplate/build.gradle.kts +7 -0
- package/templates/android/SocialTemplate/gradle/libs.versions.toml +48 -0
- package/templates/android/SocialTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/SocialTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/SocialTemplate/gradle.properties +5 -0
- package/templates/android/SocialTemplate/gradlew +248 -0
- package/templates/android/SocialTemplate/gradlew.bat +93 -0
- package/templates/android/SocialTemplate/settings.gradle.kts +14 -0
- package/templates/android/SocialTemplate/tests/01_launch_feed.yaml +17 -0
- package/templates/android/SocialTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/android/SocialTemplate/tests/03_post_interaction.yaml +18 -0
- package/templates/android/SocialTemplate/tests/04_create_post.yaml +11 -0
- package/templates/android/SocialTemplate/tests/05_search_follow.yaml +17 -0
- package/templates/android/SocialTemplate/tests/06_profile.yaml +17 -0
- package/templates/android/SocialTemplate/tests/07_messages.yaml +11 -0
- package/templates/android/SocialTemplate/tests/08_full_e2e.yaml +20 -0
- package/templates/android/TaskTemplate/API_INTEGRATION.md +145 -0
- package/templates/android/TaskTemplate/ARCHITECTURE.md +117 -0
- package/templates/android/TaskTemplate/CUSTOMIZATION.md +180 -0
- package/templates/android/TaskTemplate/README.md +91 -0
- package/templates/android/TaskTemplate/TESTING_MANIFEST.md +91 -0
- package/templates/android/TaskTemplate/app/build.gradle.kts +84 -0
- package/templates/android/TaskTemplate/app/proguard-rules.pro +13 -0
- package/templates/android/TaskTemplate/app/src/main/AndroidManifest.xml +27 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/AppConfig.kt +85 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/MainActivity.kt +29 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/TaskApplication.kt +9 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/components/PriorityBadge.kt +30 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/components/TagChip.kt +28 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/theme/Color.kt +17 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/theme/Theme.kt +70 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/theme/Type.kt +100 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/LocalPersistence.kt +56 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/Models.kt +95 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/NetworkMonitor.kt +55 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/SyncManager.kt +38 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/calendar/CalendarScreen.kt +33 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/inbox/InboxScreen.kt +145 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/kanban/KanbanBoardScreen.kt +103 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/navigation/Navigation.kt +54 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/onboarding/OnboardingScreen.kt +48 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectDetailScreen.kt +86 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectListScreen.kt +120 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/search/SearchScreen.kt +92 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/settings/SettingsScreen.kt +68 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/tasks/TaskDetailScreen.kt +91 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/mock/MockDataProvider.kt +366 -0
- package/templates/android/TaskTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +20 -0
- package/templates/android/TaskTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/TaskTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/TaskTemplate/app/src/main/res/values/colors.xml +14 -0
- package/templates/android/TaskTemplate/app/src/main/res/values/strings.xml +13 -0
- package/templates/android/TaskTemplate/app/src/main/res/values/themes.xml +4 -0
- package/templates/android/TaskTemplate/app/src/main/res/xml/backup_rules.xml +4 -0
- package/templates/android/TaskTemplate/app/src/main/res/xml/data_extraction_rules.xml +6 -0
- package/templates/android/TaskTemplate/app/src/test/kotlin/com/appship/task/data/ModelsTest.kt +120 -0
- package/templates/android/TaskTemplate/app/src/test/kotlin/com/appship/task/mock/MockDataProviderTest.kt +102 -0
- package/templates/android/TaskTemplate/build.gradle.kts +8 -0
- package/templates/android/TaskTemplate/gradle/libs.versions.toml +39 -0
- package/templates/android/TaskTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/TaskTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/TaskTemplate/gradle.properties +5 -0
- package/templates/android/TaskTemplate/gradlew +248 -0
- package/templates/android/TaskTemplate/gradlew.bat +93 -0
- package/templates/android/TaskTemplate/settings.gradle.kts +23 -0
- package/templates/android/TaskTemplate/tests/01_launch_inbox.yaml +13 -0
- package/templates/android/TaskTemplate/tests/02_tab_navigation.yaml +24 -0
- package/templates/android/TaskTemplate/tests/03_task_creation.yaml +24 -0
- package/templates/android/TaskTemplate/tests/04_project_view.yaml +19 -0
- package/templates/android/TaskTemplate/tests/05_kanban_board.yaml +18 -0
- package/templates/android/TaskTemplate/tests/06_calendar_view.yaml +14 -0
- package/templates/android/TaskTemplate/tests/07_search_filter.yaml +18 -0
- package/templates/android/TaskTemplate/tests/08_full_e2e.yaml +50 -0
- package/templates/android/TrackTemplate/API_INTEGRATION.md +419 -0
- package/templates/android/TrackTemplate/ARCHITECTURE.md +607 -0
- package/templates/android/TrackTemplate/CUSTOMIZATION.md +337 -0
- package/templates/android/TrackTemplate/README.md +88 -0
- package/templates/android/TrackTemplate/TESTING_MANIFEST.md +118 -0
- package/templates/android/TrackTemplate/app/build.gradle.kts +91 -0
- package/templates/android/TrackTemplate/app/proguard-rules.pro +12 -0
- package/templates/android/TrackTemplate/app/src/main/AndroidManifest.xml +46 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/AppConfig.kt +74 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/MainActivity.kt +31 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/TrackApplication.kt +15 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/components/OfflineBanner.kt +67 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/theme/Theme.kt +70 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/theme/Type.kt +100 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/LocalPersistence.kt +32 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/Models.kt +137 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/NetworkMonitor.kt +26 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/SyncManager.kt +31 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/achievements/AchievementsScreen.kt +229 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/achievements/AchievementsViewModel.kt +47 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/DashboardScreen.kt +360 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/DashboardViewModel.kt +90 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/TodayScreen.kt +419 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/TodayViewModel.kt +105 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/AddHabitScreen.kt +332 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitDetailScreen.kt +303 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitDetailViewModel.kt +55 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitsListScreen.kt +230 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitsListViewModel.kt +65 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/navigation/Navigation.kt +198 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/settings/SettingsScreen.kt +249 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/mock/MockDataProvider.kt +210 -0
- package/templates/android/TrackTemplate/app/src/main/res/drawable/ic_launcher_foreground.xml +24 -0
- package/templates/android/TrackTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/templates/android/TrackTemplate/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/templates/android/TrackTemplate/app/src/main/res/values/colors.xml +4 -0
- package/templates/android/TrackTemplate/app/src/main/res/values/strings.xml +53 -0
- package/templates/android/TrackTemplate/app/src/main/res/values/themes.xml +8 -0
- package/templates/android/TrackTemplate/app/src/main/res/xml/backup_rules.xml +5 -0
- package/templates/android/TrackTemplate/app/src/main/res/xml/data_extraction_rules.xml +9 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/data/ModelsTest.kt +315 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/features/achievements/AchievementsViewModelTest.kt +75 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/features/dashboard/DashboardViewModelTest.kt +97 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/features/dashboard/TodayViewModelTest.kt +124 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/features/habits/HabitDetailViewModelTest.kt +84 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/features/habits/HabitsListViewModelTest.kt +97 -0
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/mock/MockDataProviderTest.kt +169 -0
- package/templates/android/TrackTemplate/build.gradle.kts +7 -0
- package/templates/android/TrackTemplate/gradle/libs.versions.toml +46 -0
- package/templates/android/TrackTemplate/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/templates/android/TrackTemplate/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/templates/android/TrackTemplate/gradle.properties +5 -0
- package/templates/android/TrackTemplate/gradlew +248 -0
- package/templates/android/TrackTemplate/gradlew.bat +93 -0
- package/templates/android/TrackTemplate/settings.gradle.kts +23 -0
- package/templates/android/TrackTemplate/tests/01_launch_today.yaml +14 -0
- package/templates/android/TrackTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/android/TrackTemplate/tests/03_habit_toggle.yaml +13 -0
- package/templates/android/TrackTemplate/tests/04_add_habit.yaml +12 -0
- package/templates/android/TrackTemplate/tests/05_habit_detail.yaml +11 -0
- package/templates/android/TrackTemplate/tests/06_dashboard.yaml +13 -0
- package/templates/android/TrackTemplate/tests/07_settings.yaml +13 -0
- package/templates/android/TrackTemplate/tests/08_full_e2e.yaml +27 -0
- package/templates/ios/BookTemplate/BookTemplate/API_INTEGRATION.md +398 -0
- package/templates/ios/BookTemplate/BookTemplate/ARCHITECTURE.md +497 -0
- package/templates/ios/BookTemplate/BookTemplate/App/AppConfig.swift +172 -0
- package/templates/ios/BookTemplate/BookTemplate/App/BookTemplateApp.swift +88 -0
- package/templates/ios/BookTemplate/BookTemplate/CUSTOMIZATION.md +328 -0
- package/templates/ios/BookTemplate/BookTemplate/Components/OfflineBanner.swift +21 -0
- package/templates/ios/BookTemplate/BookTemplate/Core/Theme/Colors.swift +89 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalPersistence.swift +35 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/NetworkMonitor.swift +28 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/SyncManager.swift +82 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Auth/OnboardingView.swift +141 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Booking/BookingView.swift +610 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Calendar/BookingsView.swift +480 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Discovery/DiscoveryView.swift +396 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Discovery/MapExploreView.swift +188 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Discovery/ProviderDetailView.swift +597 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Discovery/SearchView.swift +222 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Profile/FavoritesView.swift +142 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Profile/ProfileView.swift +476 -0
- package/templates/ios/BookTemplate/BookTemplate/MockData/MockDataProvider.swift +274 -0
- package/templates/ios/BookTemplate/BookTemplate/Models/Models.swift +225 -0
- package/templates/ios/BookTemplate/BookTemplate/README.md +169 -0
- package/templates/ios/BookTemplate/BookTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/BookTemplate/BookTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/BookTemplate/BookTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/BookTemplate/BookTemplate/Resources/Info.plist +47 -0
- package/templates/ios/BookTemplate/BookTemplate.xcodeproj/project.pbxproj +586 -0
- package/templates/ios/BookTemplate/BookTemplate.xcodeproj/xcshareddata/xcschemes/BookTemplate.xcscheme +116 -0
- package/templates/ios/BookTemplate/BookTemplateTests/MockDataProviderTests.swift +304 -0
- package/templates/ios/BookTemplate/BookTemplateTests/ModelsTests.swift +395 -0
- package/templates/ios/BookTemplate/TESTING_MANIFEST.md +240 -0
- package/templates/ios/BookTemplate/project.yml +47 -0
- package/templates/ios/BookTemplate/tests/01_launch_discover.yaml +17 -0
- package/templates/ios/BookTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/ios/BookTemplate/tests/03_provider_detail.yaml +14 -0
- package/templates/ios/BookTemplate/tests/04_booking_flow.yaml +9 -0
- package/templates/ios/BookTemplate/tests/05_search_filter.yaml +9 -0
- package/templates/ios/BookTemplate/tests/06_favorites.yaml +9 -0
- package/templates/ios/BookTemplate/tests/07_profile.yaml +9 -0
- package/templates/ios/BookTemplate/tests/08_full_e2e.yaml +28 -0
- package/templates/ios/ChatTemplate/ChatTemplate/API_INTEGRATION.md +478 -0
- package/templates/ios/ChatTemplate/ChatTemplate/ARCHITECTURE.md +726 -0
- package/templates/ios/ChatTemplate/ChatTemplate/App/AppConfig.swift +90 -0
- package/templates/ios/ChatTemplate/ChatTemplate/App/ChatTemplateApp.swift +10 -0
- package/templates/ios/ChatTemplate/ChatTemplate/CUSTOMIZATION.md +352 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Components/OfflineBanner.swift +21 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/Theme/Colors.swift +89 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalPersistence.swift +52 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/NetworkMonitor.swift +28 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/SyncManager.swift +82 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Calls/CallsView.swift +114 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Contacts/ContactsView.swift +115 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Conversations/ChatView.swift +298 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Conversations/ConversationsView.swift +177 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Conversations/NewChatView.swift +162 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Navigation/MainTabView.swift +39 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Settings/SettingsView.swift +167 -0
- package/templates/ios/ChatTemplate/ChatTemplate/MockData/MockDataProvider.swift +291 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Models/Models.swift +293 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Resources/Info.plist +51 -0
- package/templates/ios/ChatTemplate/ChatTemplate.xcodeproj/project.pbxproj +563 -0
- package/templates/ios/ChatTemplate/ChatTemplate.xcodeproj/xcshareddata/xcschemes/ChatTemplate.xcscheme +116 -0
- package/templates/ios/ChatTemplate/ChatTemplateTests/MockDataProviderTests.swift +323 -0
- package/templates/ios/ChatTemplate/ChatTemplateTests/ModelsTests.swift +323 -0
- package/templates/ios/ChatTemplate/README.md +88 -0
- package/templates/ios/ChatTemplate/TESTING_MANIFEST.md +247 -0
- package/templates/ios/ChatTemplate/project.yml +47 -0
- package/templates/ios/ChatTemplate/tests/01_launch_chats.yaml +12 -0
- package/templates/ios/ChatTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/ios/ChatTemplate/tests/03_conversation_chat.yaml +12 -0
- package/templates/ios/ChatTemplate/tests/04_new_chat.yaml +11 -0
- package/templates/ios/ChatTemplate/tests/05_calls.yaml +11 -0
- package/templates/ios/ChatTemplate/tests/06_contacts.yaml +11 -0
- package/templates/ios/ChatTemplate/tests/07_settings_profile.yaml +11 -0
- package/templates/ios/ChatTemplate/tests/08_full_e2e.yaml +23 -0
- package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +102 -0
- package/templates/ios/DashTemplate/DashTemplate/App/DashTemplateApp.swift +10 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Components/WidgetCardView.swift +221 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Theme/Colors.swift +89 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Alerts/AlertsView.swift +125 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Charts/ChartDetailView.swift +122 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Dashboard/DashboardView.swift +100 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/DataSources/DataSourcesView.swift +151 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/MetricDetail/MetricDetailView.swift +88 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Navigation/MainTabView.swift +38 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Reports/ReportsView.swift +182 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Settings/SettingsView.swift +86 -0
- package/templates/ios/DashTemplate/DashTemplate/MockData/MockDataProvider.swift +491 -0
- package/templates/ios/DashTemplate/DashTemplate/Models/Models.swift +303 -0
- package/templates/ios/DashTemplate/DashTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/DashTemplate/DashTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/DashTemplate/DashTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/DashTemplate/DashTemplate/Resources/Info.plist +52 -0
- package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +582 -0
- package/templates/ios/DashTemplate/DashTemplate.xcodeproj/xcshareddata/xcschemes/DashTemplate.xcscheme +116 -0
- package/templates/ios/DashTemplate/DashTemplateTests/ModelsTests.swift +59 -0
- package/templates/ios/DashTemplate/TESTING_MANIFEST.md +97 -0
- package/templates/ios/DashTemplate/project.yml +47 -0
- package/templates/ios/DashTemplate/tests/01_launch_dashboard.yaml +16 -0
- package/templates/ios/DashTemplate/tests/02_tab_navigation.yaml +31 -0
- package/templates/ios/DashTemplate/tests/03_widget_interaction.yaml +18 -0
- package/templates/ios/DashTemplate/tests/04_time_range_selection.yaml +18 -0
- package/templates/ios/DashTemplate/tests/05_alerts_view.yaml +24 -0
- package/templates/ios/DashTemplate/tests/06_refresh_dashboard.yaml +14 -0
- package/templates/ios/DashTemplate/tests/07_settings_view.yaml +22 -0
- package/templates/ios/DashTemplate/tests/08_full_e2e.yaml +66 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/ARCHITECTURE.md +142 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/App/AppConfig.swift +107 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/App/FamilyTemplateApp.swift +39 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/CUSTOMIZATION.md +157 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Components/ChoreCardView.swift +138 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Components/MemberAvatarView.swift +68 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Theme/Colors.swift +88 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Calendar/CalendarView.swift +193 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Chores/ChoreBoardView.swift +190 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/FamilyHub/FamilyHubView.swift +191 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Gallery/GalleryView.swift +185 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/LocationMap/LocationMapView.swift +47 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Members/MemberProfileView.swift +145 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Members/MembersListView.swift +60 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Navigation/MainTabView.swift +56 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Onboarding/OnboardingView.swift +77 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Rewards/RewardsView.swift +157 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Settings/SettingsView.swift +97 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/MockData/MockDataProvider.swift +715 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Models/Models.swift +211 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/README.md +159 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Resources/Info.plist +32 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate.xcodeproj/project.pbxproj +618 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate.xcodeproj/xcshareddata/xcschemes/FamilyTemplate.xcscheme +116 -0
- package/templates/ios/FamilyTemplate/FamilyTemplateTests/MockDataProviderTests.swift +66 -0
- package/templates/ios/FamilyTemplate/FamilyTemplateTests/ModelsTests.swift +38 -0
- package/templates/ios/FamilyTemplate/TESTING_MANIFEST.md +69 -0
- package/templates/ios/FamilyTemplate/project.yml +47 -0
- package/templates/ios/FamilyTemplate/tests/01_launch_hub.yaml +20 -0
- package/templates/ios/FamilyTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/ios/FamilyTemplate/tests/03_chore_complete.yaml +25 -0
- package/templates/ios/FamilyTemplate/tests/04_add_chore.yaml +20 -0
- package/templates/ios/FamilyTemplate/tests/05_rewards.yaml +24 -0
- package/templates/ios/FamilyTemplate/tests/06_calendar.yaml +20 -0
- package/templates/ios/FamilyTemplate/tests/07_gallery.yaml +29 -0
- package/templates/ios/FamilyTemplate/tests/08_full_e2e.yaml +39 -0
- package/templates/ios/FinanceTemplate/ARCHITECTURE.md +429 -0
- package/templates/ios/FinanceTemplate/App/AppConfig.swift +76 -0
- package/templates/ios/FinanceTemplate/App/FinanceTemplateApp.swift +72 -0
- package/templates/ios/FinanceTemplate/Features/Accounts/AccountsView.swift +223 -0
- package/templates/ios/FinanceTemplate/Features/Dashboard/DashboardView.swift +362 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/API_INTEGRATION.md +415 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/ARCHITECTURE.md +547 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/App/AppConfig.swift +105 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/App/FinanceTemplateApp.swift +10 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/CUSTOMIZATION.md +363 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Components/OfflineBanner.swift +41 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/Theme/Colors.swift +93 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalPersistence.swift +52 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/NetworkMonitor.swift +28 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/SyncManager.swift +171 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Budgets/BudgetsView.swift +239 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Goals/GoalsView.swift +377 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Home/HomeView.swift +304 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Navigation/MainTabView.swift +49 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Settings/SettingsView.swift +368 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Transactions/AddTransactionView.swift +215 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Transactions/TransactionsView.swift +220 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/MockData/MockDataProvider.swift +552 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Models/Models.swift +606 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Resources/Info.plist +45 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +571 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/xcshareddata/xcschemes/FinanceTemplate.xcscheme +116 -0
- package/templates/ios/FinanceTemplate/FinanceTemplateTests/MockDataProviderTests.swift +334 -0
- package/templates/ios/FinanceTemplate/FinanceTemplateTests/ModelsTests.swift +334 -0
- package/templates/ios/FinanceTemplate/MockData/MockDataProvider.swift +144 -0
- package/templates/ios/FinanceTemplate/Models/Models.swift +327 -0
- package/templates/ios/FinanceTemplate/README.md +89 -0
- package/templates/ios/FinanceTemplate/Services/Managers.swift +106 -0
- package/templates/ios/FinanceTemplate/TESTING_MANIFEST.md +171 -0
- package/templates/ios/FinanceTemplate/project.yml +47 -0
- package/templates/ios/FinanceTemplate/tests/01_launch_home.yaml +15 -0
- package/templates/ios/FinanceTemplate/tests/02_tab_navigation.yaml +24 -0
- package/templates/ios/FinanceTemplate/tests/03_add_transaction.yaml +18 -0
- package/templates/ios/FinanceTemplate/tests/04_budgets.yaml +14 -0
- package/templates/ios/FinanceTemplate/tests/05_goals.yaml +14 -0
- package/templates/ios/FinanceTemplate/tests/06_transactions.yaml +14 -0
- package/templates/ios/FinanceTemplate/tests/07_search_filter.yaml +14 -0
- package/templates/ios/FinanceTemplate/tests/08_full_e2e.yaml +24 -0
- package/templates/ios/GameTemplate/GameTemplate/ARCHITECTURE.md +145 -0
- package/templates/ios/GameTemplate/GameTemplate/App/AppConfig.swift +151 -0
- package/templates/ios/GameTemplate/GameTemplate/App/GameTemplateApp.swift +95 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Components/LivesIndicatorView.swift +45 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Components/ScoreBadgeView.swift +35 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Managers/GameManager.swift +68 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Managers/PlayerManager.swift +115 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Theme/Colors.swift +93 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Utilities/NumberFormatter+Extensions.swift +10 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalPersistence.swift +35 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Achievements/AchievementsView.swift +141 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/DailyChallenge/DailyChallengeView.swift +108 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Game/GameView.swift +136 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Home/HomeMenuView.swift +198 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Leaderboard/LeaderboardView.swift +119 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Onboarding/OnboardingView.swift +82 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Profile/ProfileView.swift +154 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Results/ResultsView.swift +154 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Settings/SettingsView.swift +65 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Shop/ShopView.swift +146 -0
- package/templates/ios/GameTemplate/GameTemplate/MockData/MockDataProvider.swift +240 -0
- package/templates/ios/GameTemplate/GameTemplate/Models.swift +236 -0
- package/templates/ios/GameTemplate/GameTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/GameTemplate/GameTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/GameTemplate/GameTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/GameTemplate/GameTemplate/Resources/Info.plist +32 -0
- package/templates/ios/GameTemplate/GameTemplate.xcodeproj/project.pbxproj +642 -0
- package/templates/ios/GameTemplate/GameTemplate.xcodeproj/xcshareddata/xcschemes/GameTemplate.xcscheme +116 -0
- package/templates/ios/GameTemplate/GameTemplateTests/MockDataProviderTests.swift +17 -0
- package/templates/ios/GameTemplate/README.md +196 -0
- package/templates/ios/GameTemplate/TESTING_MANIFEST.md +176 -0
- package/templates/ios/GameTemplate/project.yml +47 -0
- package/templates/ios/GameTemplate/tests/01_launch_home.yaml +16 -0
- package/templates/ios/GameTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/ios/GameTemplate/tests/03_game_play.yaml +24 -0
- package/templates/ios/GameTemplate/tests/04_leaderboard.yaml +20 -0
- package/templates/ios/GameTemplate/tests/05_shop.yaml +20 -0
- package/templates/ios/GameTemplate/tests/06_achievements.yaml +18 -0
- package/templates/ios/GameTemplate/tests/07_profile_settings.yaml +21 -0
- package/templates/ios/GameTemplate/tests/08_full_e2e.yaml +50 -0
- package/templates/ios/HealthTemplate/ARCHITECTURE.md +158 -0
- package/templates/ios/HealthTemplate/HealthTemplate/App/AppConfig.swift +163 -0
- package/templates/ios/HealthTemplate/HealthTemplate/App/HealthTemplateApp.swift +36 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Components/MetricCardView.swift +93 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Components/ProgressRingView.swift +55 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Theme/Colors.swift +86 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalPersistence.swift +52 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/NetworkMonitor.swift +30 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/SyncManager.swift +41 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Dashboard/DashboardView.swift +186 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Navigation/MainTabView.swift +51 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Nutrition/MealLogView.swift +160 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Nutrition/NutritionLogView.swift +190 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Onboarding/OnboardingView.swift +79 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Profile/ProfileView.swift +87 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Progress/ProgressChartsView.swift +149 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Settings/SettingsView.swift +56 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/ExerciseDetailView.swift +81 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/WorkoutListView.swift +148 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/WorkoutPlayerView.swift +143 -0
- package/templates/ios/HealthTemplate/HealthTemplate/MockData/MockDataProvider.swift +722 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Models/Models.swift +434 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Resources/Info.plist +63 -0
- package/templates/ios/HealthTemplate/HealthTemplate.xcodeproj/project.pbxproj +607 -0
- package/templates/ios/HealthTemplate/HealthTemplate.xcodeproj/xcshareddata/xcschemes/HealthTemplate.xcscheme +116 -0
- package/templates/ios/HealthTemplate/HealthTemplateTests/MockDataProviderTests.swift +125 -0
- package/templates/ios/HealthTemplate/HealthTemplateTests/ModelsTests.swift +122 -0
- package/templates/ios/HealthTemplate/README.md +137 -0
- package/templates/ios/HealthTemplate/project.yml +47 -0
- package/templates/ios/HealthTemplate/tests/01_launch_dashboard.yaml +19 -0
- package/templates/ios/HealthTemplate/tests/02_tab_navigation.yaml +34 -0
- package/templates/ios/HealthTemplate/tests/03_search_workouts.yaml +31 -0
- package/templates/ios/HealthTemplate/tests/04_workout_player.yaml +20 -0
- package/templates/ios/HealthTemplate/tests/05_meal_logging.yaml +24 -0
- package/templates/ios/HealthTemplate/tests/06_progress_charts.yaml +22 -0
- package/templates/ios/HealthTemplate/tests/07_profile_settings.yaml +20 -0
- package/templates/ios/HealthTemplate/tests/08_full_e2e.yaml +42 -0
- package/templates/ios/LearnTemplate/ARCHITECTURE.md +188 -0
- package/templates/ios/LearnTemplate/LearnTemplate/App/AppConfig.swift +161 -0
- package/templates/ios/LearnTemplate/LearnTemplate/App/LearnTemplateApp.swift +82 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Components/ProgressRingView.swift +38 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Theme/Colors.swift +12 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalPersistence.swift +52 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Courses/CourseDetailView.swift +180 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Courses/CourseListView.swift +161 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Flashcards/FlashcardView.swift +139 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Leaderboard/LeaderboardView.swift +97 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Lessons/LessonPlayerView.swift +164 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Onboarding/OnboardingView.swift +88 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Profile/ProfileView.swift +141 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Progress/ProgressDashboardView.swift +144 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Quiz/QuizView.swift +295 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Settings/SettingsView.swift +56 -0
- package/templates/ios/LearnTemplate/LearnTemplate/MockData/MockDataProvider.swift +461 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Models/Models.swift +264 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Resources/Info.plist +32 -0
- package/templates/ios/LearnTemplate/LearnTemplate.xcodeproj/project.pbxproj +614 -0
- package/templates/ios/LearnTemplate/LearnTemplate.xcodeproj/xcshareddata/xcschemes/LearnTemplate.xcscheme +116 -0
- package/templates/ios/LearnTemplate/LearnTemplateTests/MockDataProviderTests.swift +66 -0
- package/templates/ios/LearnTemplate/LearnTemplateTests/ModelsTests.swift +56 -0
- package/templates/ios/LearnTemplate/README.md +176 -0
- package/templates/ios/LearnTemplate/project.yml +47 -0
- package/templates/ios/LearnTemplate/tests/01_launch_home.yaml +10 -0
- package/templates/ios/LearnTemplate/tests/02_tab_navigation.yaml +19 -0
- package/templates/ios/LearnTemplate/tests/03_course_detail.yaml +21 -0
- package/templates/ios/LearnTemplate/tests/04_quiz_flow.yaml +41 -0
- package/templates/ios/LearnTemplate/tests/05_flashcard_flip.yaml +20 -0
- package/templates/ios/LearnTemplate/tests/06_progress_stats.yaml +13 -0
- package/templates/ios/LearnTemplate/tests/07_leaderboard.yaml +12 -0
- package/templates/ios/LearnTemplate/tests/08_full_e2e.yaml +48 -0
- package/templates/ios/MapTemplate/ARCHITECTURE.md +64 -0
- package/templates/ios/MapTemplate/CUSTOMIZATION.md +80 -0
- package/templates/ios/MapTemplate/MapTemplate/App/AppConfig.swift +232 -0
- package/templates/ios/MapTemplate/MapTemplate/App/MapTemplateApp.swift +81 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Components/PlaceCardView.swift +119 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Components/RatingView.swift +55 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Theme/Colors.swift +87 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/LocalPersistence.swift +44 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Favorites/FavoritesView.swift +62 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Filters/FiltersView.swift +120 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Map/MapView.swift +182 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Onboarding/OnboardingView.swift +74 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/PlaceDetail/PlaceDetailView.swift +275 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/PlaceList/PlaceListView.swift +56 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Profile/ProfileView.swift +81 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Route/RouteView.swift +156 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Search/SearchView.swift +157 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Settings/SettingsView.swift +67 -0
- package/templates/ios/MapTemplate/MapTemplate/MockData/MockDataProvider.swift +560 -0
- package/templates/ios/MapTemplate/MapTemplate/Models/Models.swift +314 -0
- package/templates/ios/MapTemplate/MapTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/MapTemplate/MapTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/MapTemplate/MapTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Resources/Info.plist +47 -0
- package/templates/ios/MapTemplate/MapTemplate.xcodeproj/project.pbxproj +626 -0
- package/templates/ios/MapTemplate/MapTemplate.xcodeproj/xcshareddata/xcschemes/MapTemplate.xcscheme +116 -0
- package/templates/ios/MapTemplate/MapTemplateTests/MockDataProviderTests.swift +144 -0
- package/templates/ios/MapTemplate/MapTemplateTests/ModelsTests.swift +186 -0
- package/templates/ios/MapTemplate/README.md +101 -0
- package/templates/ios/MapTemplate/TESTING_MANIFEST.md +78 -0
- package/templates/ios/MapTemplate/project.yml +47 -0
- package/templates/ios/MapTemplate/tests/01_launch_map.yaml +14 -0
- package/templates/ios/MapTemplate/tests/02_tab_navigation.yaml +26 -0
- package/templates/ios/MapTemplate/tests/03_map_interaction.yaml +18 -0
- package/templates/ios/MapTemplate/tests/04_place_detail.yaml +23 -0
- package/templates/ios/MapTemplate/tests/05_search_places.yaml +20 -0
- package/templates/ios/MapTemplate/tests/06_profile_settings.yaml +29 -0
- package/templates/ios/MapTemplate/tests/07_favorites.yaml +20 -0
- package/templates/ios/MapTemplate/tests/08_full_e2e.yaml +34 -0
- package/templates/ios/MediaTemplate/ARCHITECTURE.md +178 -0
- package/templates/ios/MediaTemplate/CUSTOMIZATION.md +156 -0
- package/templates/ios/MediaTemplate/MediaTemplate/App/AppConfig.swift +154 -0
- package/templates/ios/MediaTemplate/MediaTemplate/App/AppState.swift +222 -0
- package/templates/ios/MediaTemplate/MediaTemplate/App/MediaTemplateApp.swift +97 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Components/AsyncImageView.swift +39 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Components/CommonComponents.swift +273 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Components/MiniPlayerView.swift +103 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Theme/Colors.swift +86 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalPersistence.swift +26 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Browse/BrowseView.swift +107 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Detail/DetailView.swift +262 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Home/HomeView.swift +235 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Library/LibraryView.swift +135 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Onboarding/OnboardingView.swift +128 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Player/PlayerFullView.swift +194 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Settings/SettingsView.swift +48 -0
- package/templates/ios/MediaTemplate/MediaTemplate/MockData/MockDataProvider.swift +461 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Models/Models.swift +286 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Resources/Info.plist +64 -0
- package/templates/ios/MediaTemplate/MediaTemplate.xcodeproj/project.pbxproj +594 -0
- package/templates/ios/MediaTemplate/MediaTemplate.xcodeproj/xcshareddata/xcschemes/MediaTemplate.xcscheme +116 -0
- package/templates/ios/MediaTemplate/MediaTemplateTests/MockDataProviderTests.swift +10 -0
- package/templates/ios/MediaTemplate/README.md +189 -0
- package/templates/ios/MediaTemplate/TESTING_MANIFEST.md +193 -0
- package/templates/ios/MediaTemplate/project.yml +47 -0
- package/templates/ios/MediaTemplate/tests/01_launch_home.yaml +13 -0
- package/templates/ios/MediaTemplate/tests/02_tab_navigation.yaml +20 -0
- package/templates/ios/MediaTemplate/tests/03_media_detail.yaml +12 -0
- package/templates/ios/MediaTemplate/tests/04_player_controls.yaml +15 -0
- package/templates/ios/MediaTemplate/tests/05_search.yaml +14 -0
- package/templates/ios/MediaTemplate/tests/06_playlist.yaml +19 -0
- package/templates/ios/MediaTemplate/tests/07_downloads.yaml +14 -0
- package/templates/ios/MediaTemplate/tests/08_full_e2e.yaml +44 -0
- package/templates/ios/ReferenceTemplate/INTEGRATION_MAP.md +436 -0
- package/templates/ios/ReferenceTemplate/README.md +171 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/App/AppConfig.swift +163 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/App/ReferenceTemplateApp.swift +103 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +6 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Theme/Colors.swift +10 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/AccountDeletion/AccountDeletionService.swift +166 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/AccountDeletion/AccountDeletionStrings.swift +41 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/AccountDeletion/AccountDeletionView.swift +200 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/AccountDeletion/INTEGRATION.md +86 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/BiometricAuth/BiometricAuthService.swift +204 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/BiometricAuth/BiometricAuthStrings.swift +35 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/BiometricAuth/BiometricAuthView.swift +88 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/BiometricAuth/INTEGRATION.md +107 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ChartsLibrary/ChartsLibraryModels.swift +122 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ChartsLibrary/ChartsLibraryService.swift +166 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ChartsLibrary/ChartsLibraryStrings.swift +24 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ChartsLibrary/ChartsLibraryView.swift +566 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ChartsLibrary/INTEGRATION.md +188 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ConsentPrivacy/ConsentPrivacyModels.swift +35 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ConsentPrivacy/ConsentPrivacyService.swift +123 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ConsentPrivacy/ConsentPrivacyStrings.swift +38 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ConsentPrivacy/ConsentPrivacyView.swift +227 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ConsentPrivacy/INTEGRATION.md +73 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/DeepLinking/DeepLinkingModels.swift +87 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/DeepLinking/DeepLinkingService.swift +211 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/DeepLinking/DeepLinkingStrings.swift +14 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/EmptyStateService.swift +61 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/EmptyStateView.swift +146 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/EmptyStatesStrings.swift +34 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/INTEGRATION.md +115 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ErrorHandling/ErrorHandlingModels.swift +117 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ErrorHandling/ErrorHandlingService.swift +91 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ErrorHandling/ErrorHandlingStrings.swift +44 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ErrorHandling/ErrorHandlingView.swift +117 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ErrorHandling/INTEGRATION.md +127 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/FeedbackSupport/FeedbackSupportService.swift +127 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/FeedbackSupport/FeedbackSupportStrings.swift +50 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/FeedbackSupport/FeedbackSupportView.swift +341 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/FeedbackSupport/INTEGRATION.md +84 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ForceUpdate/ForceUpdateService.swift +153 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ForceUpdate/ForceUpdateStrings.swift +21 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ForceUpdate/ForceUpdateView.swift +97 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ForceUpdate/INTEGRATION.md +86 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Home/HomeStrings.swift +12 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Home/HomeView.swift +185 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/MediaPicker/MediaPickerService.swift +106 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/MediaPicker/MediaPickerStrings.swift +16 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/MediaPicker/MediaPickerView.swift +411 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/MediaPicker/MediaPickerViewWrapper.swift +17 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Navigation/MainTabView.swift +55 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/NetworkBanner/INTEGRATION.md +123 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/NetworkBanner/NetworkBannerService.swift +56 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/NetworkBanner/NetworkBannerStrings.swift +9 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/NetworkBanner/NetworkBannerView.swift +105 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Notes/NotesStrings.swift +13 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Notes/NotesView.swift +265 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Onboarding/OnboardingView.swift +42 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Paywall/INTEGRATION.md +154 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Paywall/PaywallModels.swift +101 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Paywall/PaywallService.swift +154 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Paywall/PaywallStrings.swift +33 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Paywall/PaywallView.swift +191 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/PushNotifications/INTEGRATION.md +106 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/PushNotifications/PushNotificationModels.swift +38 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/PushNotifications/PushNotificationService.swift +213 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/PushNotifications/PushNotificationsStrings.swift +45 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/PushNotifications/PushNotificationsView.swift +240 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Settings/SettingsView.swift +282 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ShareSheet/INTEGRATION.md +128 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ShareSheet/ShareSheetModels.swift +87 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ShareSheet/ShareSheetService.swift +161 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ShareSheet/ShareSheetStrings.swift +26 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/ShareSheet/ShareSheetView.swift +63 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/INTEGRATION.md +156 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingModels.swift +25 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingService.swift +46 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingStrings.swift +11 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/SkeletonLoading/SkeletonLoadingView.swift +218 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Tasks/TaskListView.swift +235 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Tasks/TasksStrings.swift +11 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/MockData/MockDataProvider.swift +172 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Models/Models.swift +51 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Resources/Info.plist +61 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate.xcodeproj/project.pbxproj +898 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate.xcodeproj/xcshareddata/xcschemes/ReferenceTemplate.xcscheme +116 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplateTests/MockDataProviderTests.swift +140 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplateTests/ModuleIntegrationTests.swift +120 -0
- package/templates/ios/ReferenceTemplate/TESTING_MANIFEST.md +226 -0
- package/templates/ios/ReferenceTemplate/project.yml +47 -0
- package/templates/ios/ReferenceTemplate/tests/01_launch_consent.yaml +16 -0
- package/templates/ios/ReferenceTemplate/tests/02_biometric_auth.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/04_task_list.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/05_notes.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/06_settings.yaml +22 -0
- package/templates/ios/ReferenceTemplate/tests/07_paywall.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/08_push_notifications.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/09_feedback_support.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/10_account_deletion.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/11_share_sheet.yaml +35 -0
- package/templates/ios/ReferenceTemplate/tests/12_media_picker.yaml +42 -0
- package/templates/ios/ReferenceTemplate/tests/13_charts.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/14_error_states.yaml +29 -0
- package/templates/ios/ReferenceTemplate/tests/15_full_e2e.yaml +31 -0
- package/templates/ios/ReferenceTemplate/tests/16_social_login.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/17_camera.yaml +27 -0
- package/templates/ios/ReferenceTemplate/tests/18_qr_code.yaml +24 -0
- package/templates/ios/ReferenceTemplate/tests/19_reviews_ratings.yaml +21 -0
- package/templates/ios/ReferenceTemplate/tests/20_address_input.yaml +15 -0
- package/templates/ios/ReferenceTemplate/tests/21_download_manager.yaml +15 -0
- package/templates/ios/ReferenceTemplate/tests/22_gamification.yaml +18 -0
- package/templates/ios/ReferenceTemplate/tests/23_calendar.yaml +22 -0
- package/templates/ios/ReferenceTemplate/tests/24_payment_methods.yaml +15 -0
- package/templates/ios/ReferenceTemplate/tests/25_notification_center.yaml +16 -0
- package/templates/ios/ReferenceTemplate/tests/26_rich_text_editor.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/27_filters_sort.yaml +22 -0
- package/templates/ios/ReferenceTemplate/tests/28_wizard.yaml +24 -0
- package/templates/ios/ReferenceTemplate/tests/29_theme_switcher.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/30_pin_lock.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/31_two_factor_auth.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/32_cloud_sync.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/33_import_export.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/34_voice_recording.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/35_drawing_canvas.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/36_language_picker.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/37_watch_companion.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/38_analytics.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/39_whats_new.yaml +21 -0
- package/templates/ios/ReferenceTemplate/tests/40_referral.yaml +15 -0
- package/templates/ios/ReferenceTemplate/tests/41_content_moderation.yaml +21 -0
- package/templates/ios/ReferenceTemplate/tests/42_realtime_sync.yaml +15 -0
- package/templates/ios/ReferenceTemplate/tests/43_coach_marks.yaml +16 -0
- package/templates/ios/ReferenceTemplate/tests/44_app_rating.yaml +19 -0
- package/templates/ios/ReferenceTemplate/tests/45_widgets.yaml +13 -0
- package/templates/ios/ReferenceTemplate/tests/46_siri_shortcuts.yaml +20 -0
- package/templates/ios/ReferenceTemplate/tests/47_live_activities.yaml +22 -0
- package/templates/ios/ReferenceTemplate/tests/48_app_clips.yaml +13 -0
- package/templates/ios/ReferenceTemplate/tests/49_spotlight.yaml +21 -0
- package/templates/ios/ShopTemplate/API_INTEGRATION.md +362 -0
- package/templates/ios/ShopTemplate/ARCHITECTURE.md +286 -0
- package/templates/ios/ShopTemplate/CUSTOMIZATION.md +244 -0
- package/templates/ios/ShopTemplate/README.md +186 -0
- package/templates/ios/ShopTemplate/ShopTemplate/App/AppConfig.swift +153 -0
- package/templates/ios/ShopTemplate/ShopTemplate/App/AppState.swift +292 -0
- package/templates/ios/ShopTemplate/ShopTemplate/App/ShopTemplateApp.swift +103 -0
- package/templates/ios/ShopTemplate/ShopTemplate/CUSTOMIZATION.md +390 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Components/CommonComponents.swift +475 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Components/OfflineBanner.swift +48 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Theme/Colors.swift +89 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalPersistence.swift +52 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/NetworkMonitor.swift +41 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/SyncManager.swift +111 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Auth/Views/AuthFlowView.swift +582 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Cart/CartView.swift +365 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Checkout/CheckoutView.swift +696 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Home/HomeView.swift +407 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Onboarding/OnboardingView.swift +128 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Orders/OrdersView.swift +441 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Products/ProductDetailView.swift +728 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Products/ProductListView.swift +653 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Profile/ProfileView.swift +556 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/StoreLocator/StoreLocatorView.swift +365 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Wishlist/WishlistView.swift +186 -0
- package/templates/ios/ShopTemplate/ShopTemplate/MockData/MockDataProvider.swift +645 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Models/Models.swift +401 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Resources/Info.plist +61 -0
- package/templates/ios/ShopTemplate/ShopTemplate.xcodeproj/project.pbxproj +635 -0
- package/templates/ios/ShopTemplate/ShopTemplate.xcodeproj/xcshareddata/xcschemes/ShopTemplate.xcscheme +116 -0
- package/templates/ios/ShopTemplate/ShopTemplateTests/MockDataProviderTests.swift +363 -0
- package/templates/ios/ShopTemplate/ShopTemplateTests/ModelsTests.swift +507 -0
- package/templates/ios/ShopTemplate/TESTING_MANIFEST.md +273 -0
- package/templates/ios/ShopTemplate/project.yml +47 -0
- package/templates/ios/ShopTemplate/tests/01_launch_home.yaml +13 -0
- package/templates/ios/ShopTemplate/tests/02_tab_navigation.yaml +21 -0
- package/templates/ios/ShopTemplate/tests/03_product_browse_detail.yaml +12 -0
- package/templates/ios/ShopTemplate/tests/04_add_to_cart_checkout.yaml +14 -0
- package/templates/ios/ShopTemplate/tests/05-add-to-cart.yaml +19 -0
- package/templates/ios/ShopTemplate/tests/05_search_filter.yaml +11 -0
- package/templates/ios/ShopTemplate/tests/06_wishlist.yaml +11 -0
- package/templates/ios/ShopTemplate/tests/07_profile_settings.yaml +11 -0
- package/templates/ios/ShopTemplate/tests/08_full_e2e.yaml +26 -0
- package/templates/ios/Skeleton/CUSTOMIZATION.md +29 -0
- package/templates/ios/Skeleton/README.md +31 -0
- package/templates/ios/Skeleton/Skeleton/App/AppConfig.swift +93 -0
- package/templates/ios/Skeleton/Skeleton/App/SkeletonApp.swift +10 -0
- package/templates/ios/Skeleton/Skeleton/Core/Theme/Colors.swift +56 -0
- package/templates/ios/Skeleton/Skeleton/Features/Create/CreateView.swift +71 -0
- package/templates/ios/Skeleton/Skeleton/Features/Detail/DetailView.swift +82 -0
- package/templates/ios/Skeleton/Skeleton/Features/Explore/ExploreView.swift +120 -0
- package/templates/ios/Skeleton/Skeleton/Features/Explore/ExploreViewModel.swift +26 -0
- package/templates/ios/Skeleton/Skeleton/Features/Favorites/FavoritesView.swift +36 -0
- package/templates/ios/Skeleton/Skeleton/Features/Home/HomeView.swift +137 -0
- package/templates/ios/Skeleton/Skeleton/Features/Home/HomeViewModel.swift +63 -0
- package/templates/ios/Skeleton/Skeleton/Features/Navigation/MainTabView.swift +44 -0
- package/templates/ios/Skeleton/Skeleton/Features/Profile/ProfileView.swift +78 -0
- package/templates/ios/Skeleton/Skeleton/MockData/MockDataProvider.swift +111 -0
- package/templates/ios/Skeleton/Skeleton/Models/Item.swift +56 -0
- package/templates/ios/Skeleton/Skeleton/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png +0 -0
- package/templates/ios/Skeleton/Skeleton/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/Skeleton/Skeleton/Resources/Assets.xcassets/Contents.json +6 -0
- package/templates/ios/Skeleton/Skeleton/Resources/Info.plist +45 -0
- package/templates/ios/Skeleton/Skeleton.xcodeproj/project.pbxproj +566 -0
- package/templates/ios/Skeleton/Skeleton.xcodeproj/xcshareddata/xcschemes/Skeleton.xcscheme +116 -0
- package/templates/ios/Skeleton/SkeletonTests/MockDataProviderTests.swift +58 -0
- package/templates/ios/Skeleton/TESTING_MANIFEST.md +60 -0
- package/templates/ios/Skeleton/project.yml +47 -0
- package/templates/ios/Skeleton/tests/01_app_launch.yaml +10 -0
- package/templates/ios/Skeleton/tests/02_tab_navigation.yaml +20 -0
- package/templates/ios/SocialTemplate/ARCHITECTURE.md +460 -0
- package/templates/ios/SocialTemplate/SocialTemplate/API_INTEGRATION.md +381 -0
- package/templates/ios/SocialTemplate/SocialTemplate/ARCHITECTURE.md +546 -0
- package/templates/ios/SocialTemplate/SocialTemplate/App/AppConfig.swift +157 -0
- package/templates/ios/SocialTemplate/SocialTemplate/App/SocialTemplateApp.swift +90 -0
- package/templates/ios/SocialTemplate/SocialTemplate/CUSTOMIZATION.md +336 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Components/OfflineBanner.swift +21 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Core/Theme/Colors.swift +93 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalPersistence.swift +35 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/NetworkMonitor.swift +28 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/SyncManager.swift +159 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/CreatePost/CreatePostView.swift +201 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Feed/CommentsView.swift +136 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Feed/FeedView.swift +363 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Messages/MessagesView.swift +234 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Notifications/NotificationsView.swift +122 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Profile/ProfileView.swift +375 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Search/SearchView.swift +262 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Settings/SettingsView.swift +240 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Stories/StoryViewerView.swift +181 -0
- package/templates/ios/SocialTemplate/SocialTemplate/MockData/MockDataProvider.swift +394 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Models/Models.swift +193 -0
- package/templates/ios/SocialTemplate/SocialTemplate/README.md +141 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Resources/Info.plist +49 -0
- package/templates/ios/SocialTemplate/SocialTemplate.xcodeproj/project.pbxproj +595 -0
- package/templates/ios/SocialTemplate/SocialTemplate.xcodeproj/xcshareddata/xcschemes/SocialTemplate.xcscheme +116 -0
- package/templates/ios/SocialTemplate/SocialTemplateTests/MockDataProviderTests.swift +333 -0
- package/templates/ios/SocialTemplate/SocialTemplateTests/ModelsTests.swift +565 -0
- package/templates/ios/SocialTemplate/TESTING_MANIFEST.md +128 -0
- package/templates/ios/SocialTemplate/project.yml +47 -0
- package/templates/ios/SocialTemplate/tests/01_launch_feed.yaml +17 -0
- package/templates/ios/SocialTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/ios/SocialTemplate/tests/03_post_interaction.yaml +18 -0
- package/templates/ios/SocialTemplate/tests/04_create_post.yaml +17 -0
- package/templates/ios/SocialTemplate/tests/05_search_follow.yaml +17 -0
- package/templates/ios/SocialTemplate/tests/06_profile.yaml +17 -0
- package/templates/ios/SocialTemplate/tests/07_messages.yaml +17 -0
- package/templates/ios/SocialTemplate/tests/08_full_e2e.yaml +26 -0
- package/templates/ios/TaskTemplate/CUSTOMIZATION.md +200 -0
- package/templates/ios/TaskTemplate/README.md +119 -0
- package/templates/ios/TaskTemplate/TESTING_MANIFEST.md +94 -0
- package/templates/ios/TaskTemplate/TaskTemplate/App/AppConfig.swift +101 -0
- package/templates/ios/TaskTemplate/TaskTemplate/App/TaskTemplateApp.swift +16 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Components/PriorityBadgeView.swift +39 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Components/TagChipView.swift +46 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Models.swift +203 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Theme/Colors.swift +42 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Calendar/CalendarView.swift +227 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Inbox/InboxView.swift +122 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Kanban/KanbanBoardView.swift +171 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Navigation/MainTabView.swift +51 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Onboarding/OnboardingView.swift +78 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectDetailView.swift +120 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectListView.swift +139 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Search/SearchView.swift +162 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Settings/SettingsView.swift +76 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Tasks/TaskDetailView.swift +211 -0
- package/templates/ios/TaskTemplate/TaskTemplate/MockData/MockDataProvider.swift +354 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Resources/Info.plist +32 -0
- package/templates/ios/TaskTemplate/TaskTemplate.xcodeproj/project.pbxproj +598 -0
- package/templates/ios/TaskTemplate/TaskTemplate.xcodeproj/xcshareddata/xcschemes/TaskTemplate.xcscheme +116 -0
- package/templates/ios/TaskTemplate/TaskTemplateTests/MockDataProviderTests.swift +126 -0
- package/templates/ios/TaskTemplate/TaskTemplateTests/ModelsTests.swift +151 -0
- package/templates/ios/TaskTemplate/project.yml +47 -0
- package/templates/ios/TaskTemplate/tests/01_launch_inbox.yaml +14 -0
- package/templates/ios/TaskTemplate/tests/02_tab_navigation.yaml +28 -0
- package/templates/ios/TaskTemplate/tests/03_task_creation.yaml +21 -0
- package/templates/ios/TaskTemplate/tests/04_project_view.yaml +26 -0
- package/templates/ios/TaskTemplate/tests/05_kanban_board.yaml +22 -0
- package/templates/ios/TaskTemplate/tests/06_calendar_view.yaml +16 -0
- package/templates/ios/TaskTemplate/tests/07_search_filter.yaml +24 -0
- package/templates/ios/TaskTemplate/tests/08_full_e2e.yaml +51 -0
- package/templates/ios/TrackTemplate/API_INTEGRATION.md +264 -0
- package/templates/ios/TrackTemplate/ARCHITECTURE.md +381 -0
- package/templates/ios/TrackTemplate/CUSTOMIZATION.md +264 -0
- package/templates/ios/TrackTemplate/README.md +113 -0
- package/templates/ios/TrackTemplate/TESTING_MANIFEST.md +125 -0
- package/templates/ios/TrackTemplate/TrackTemplate/App/AppConfig.swift +110 -0
- package/templates/ios/TrackTemplate/TrackTemplate/App/TrackTemplateApp.swift +84 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Components/OfflineBanner.swift +21 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Core/Theme/Colors.swift +87 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalPersistence.swift +35 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/NetworkMonitor.swift +28 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/SyncManager.swift +82 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Achievements/AchievementsView.swift +180 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Dashboard/DashboardView.swift +374 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Dashboard/TodayView.swift +317 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Habits/HabitsListView.swift +584 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Settings/SettingsView.swift +320 -0
- package/templates/ios/TrackTemplate/TrackTemplate/MockData/MockDataProvider.swift +309 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Models/Models.swift +202 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png +0 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Resources/Assets.xcassets/Contents.json +1 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Resources/Info.plist +47 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Services/HabitManager.swift +289 -0
- package/templates/ios/TrackTemplate/TrackTemplate.xcodeproj/project.pbxproj +563 -0
- package/templates/ios/TrackTemplate/TrackTemplate.xcodeproj/xcshareddata/xcschemes/TrackTemplate.xcscheme +116 -0
- package/templates/ios/TrackTemplate/TrackTemplateTests/HabitManagerTests.swift +286 -0
- package/templates/ios/TrackTemplate/TrackTemplateTests/MockDataProviderTests.swift +257 -0
- package/templates/ios/TrackTemplate/TrackTemplateTests/ModelsTests.swift +440 -0
- package/templates/ios/TrackTemplate/project.yml +47 -0
- package/templates/ios/TrackTemplate/tests/01_launch_today.yaml +14 -0
- package/templates/ios/TrackTemplate/tests/02_tab_navigation.yaml +25 -0
- package/templates/ios/TrackTemplate/tests/03_habit_toggle.yaml +13 -0
- package/templates/ios/TrackTemplate/tests/04-date-navigation.yaml +12 -0
- package/templates/ios/TrackTemplate/tests/04_add_habit.yaml +12 -0
- package/templates/ios/TrackTemplate/tests/05_habit_detail.yaml +14 -0
- package/templates/ios/TrackTemplate/tests/06_dashboard.yaml +13 -0
- package/templates/ios/TrackTemplate/tests/07_settings.yaml +13 -0
- package/templates/ios/TrackTemplate/tests/08_full_e2e.yaml +27 -0
- package/templates/shared/MODULES_CATALOG.md +178 -0
- package/templates/shared/MODULE_CHECKLIST.md +76 -0
- package/templates/shared/android/AccountDeletion/AccountDeletionManager.kt +229 -0
- package/templates/shared/android/AccountDeletion/AccountDeletionScreen.kt +314 -0
- package/templates/shared/android/AccountDeletion/strings.xml +19 -0
- package/templates/shared/android/AddressInput/AddressInputManager.kt +139 -0
- package/templates/shared/android/AddressInput/AddressInputScreen.kt +255 -0
- package/templates/shared/android/AddressInput/strings.xml +25 -0
- package/templates/shared/android/AnalyticsAbstraction/AnalyticsAbstractionManager.kt +38 -0
- package/templates/shared/android/AnalyticsAbstraction/AnalyticsAbstractionScreen.kt +32 -0
- package/templates/shared/android/AnalyticsAbstraction/strings.xml +4 -0
- package/templates/shared/android/AppIndexing/AppIndexingManager.kt +108 -0
- package/templates/shared/android/AppIndexing/AppIndexingScreen.kt +103 -0
- package/templates/shared/android/AppIndexing/strings.xml +9 -0
- package/templates/shared/android/AppRatingPrompt/AppRatingPromptManager.kt +142 -0
- package/templates/shared/android/AppRatingPrompt/AppRatingPromptScreen.kt +128 -0
- package/templates/shared/android/AppRatingPrompt/strings.xml +9 -0
- package/templates/shared/android/BiometricAuth/BiometricAuthManager.kt +189 -0
- package/templates/shared/android/BiometricAuth/BiometricAuthScreen.kt +262 -0
- package/templates/shared/android/BiometricAuth/strings.xml +15 -0
- package/templates/shared/android/CalendarDateRange/CalendarDateRangeModels.kt +52 -0
- package/templates/shared/android/CalendarDateRange/strings.xml +14 -0
- package/templates/shared/android/Camera/CameraManager.kt +188 -0
- package/templates/shared/android/Camera/CameraScreen.kt +198 -0
- package/templates/shared/android/Camera/strings.xml +19 -0
- package/templates/shared/android/ChartsLibrary/ChartsLibraryManager.kt +172 -0
- package/templates/shared/android/ChartsLibrary/ChartsLibraryModels.kt +43 -0
- package/templates/shared/android/ChartsLibrary/ChartsLibraryScreen.kt +540 -0
- package/templates/shared/android/ChartsLibrary/strings.xml +16 -0
- package/templates/shared/android/CloudSync/CloudSyncManager.kt +84 -0
- package/templates/shared/android/CloudSync/CloudSyncScreen.kt +92 -0
- package/templates/shared/android/CloudSync/strings.xml +15 -0
- package/templates/shared/android/ConsentPrivacy/ConsentPrivacyManager.kt +133 -0
- package/templates/shared/android/ConsentPrivacy/ConsentPrivacyScreen.kt +264 -0
- package/templates/shared/android/ConsentPrivacy/strings.xml +24 -0
- package/templates/shared/android/ContentModeration/ContentModerationManager.kt +168 -0
- package/templates/shared/android/ContentModeration/ContentModerationScreen.kt +301 -0
- package/templates/shared/android/ContentModeration/strings.xml +43 -0
- package/templates/shared/android/DeepLinking/DeepLinkingManager.kt +223 -0
- package/templates/shared/android/DeepLinking/DeepLinkingModels.kt +59 -0
- package/templates/shared/android/DownloadManager/DownloadManager.kt +108 -0
- package/templates/shared/android/DownloadManager/DownloadManagerScreen.kt +210 -0
- package/templates/shared/android/DownloadManager/strings.xml +25 -0
- package/templates/shared/android/DrawingCanvas/DrawingCanvasScreen.kt +207 -0
- package/templates/shared/android/DrawingCanvas/strings.xml +9 -0
- package/templates/shared/android/EmptyStates/EmptyStateManager.kt +31 -0
- package/templates/shared/android/EmptyStates/EmptyStateScreen.kt +163 -0
- package/templates/shared/android/EmptyStates/strings.xml +18 -0
- package/templates/shared/android/ErrorHandling/ErrorHandlingManager.kt +67 -0
- package/templates/shared/android/ErrorHandling/ErrorHandlingModels.kt +99 -0
- package/templates/shared/android/ErrorHandling/ErrorHandlingScreen.kt +140 -0
- package/templates/shared/android/ErrorHandling/strings.xml +22 -0
- package/templates/shared/android/FeedbackSupport/FeedbackSupportScreen.kt +353 -0
- package/templates/shared/android/FeedbackSupport/strings.xml +29 -0
- package/templates/shared/android/FiltersSortSheet/FiltersSortSheetManager.kt +39 -0
- package/templates/shared/android/FiltersSortSheet/FiltersSortSheetModels.kt +5 -0
- package/templates/shared/android/FiltersSortSheet/strings.xml +4 -0
- package/templates/shared/android/ForceUpdate/ForceUpdateManager.kt +193 -0
- package/templates/shared/android/ForceUpdate/strings.xml +11 -0
- package/templates/shared/android/GamificationKit/strings.xml +21 -0
- package/templates/shared/android/GoogleAssistant/GoogleAssistantManager.kt +87 -0
- package/templates/shared/android/GoogleAssistant/GoogleAssistantScreen.kt +135 -0
- package/templates/shared/android/GoogleAssistant/strings.xml +8 -0
- package/templates/shared/android/ImportExport/ImportExportManager.kt +80 -0
- package/templates/shared/android/ImportExport/ImportExportScreen.kt +134 -0
- package/templates/shared/android/ImportExport/strings.xml +9 -0
- package/templates/shared/android/InstantApps/InstantAppsManager.kt +56 -0
- package/templates/shared/android/InstantApps/InstantAppsScreen.kt +94 -0
- package/templates/shared/android/InstantApps/strings.xml +8 -0
- package/templates/shared/android/LanguagePicker/LanguagePickerManager.kt +104 -0
- package/templates/shared/android/LanguagePicker/LanguagePickerScreen.kt +144 -0
- package/templates/shared/android/MediaPicker/MediaPickerManager.kt +133 -0
- package/templates/shared/android/MediaPicker/MediaPickerScreen.kt +257 -0
- package/templates/shared/android/MediaPicker/strings.xml +10 -0
- package/templates/shared/android/MultiStepWizard/MultiStepWizardManager.kt +47 -0
- package/templates/shared/android/MultiStepWizard/MultiStepWizardModels.kt +3 -0
- package/templates/shared/android/MultiStepWizard/MultiStepWizardScreen.kt +102 -0
- package/templates/shared/android/MultiStepWizard/strings.xml +4 -0
- package/templates/shared/android/NetworkBanner/NetworkBannerManager.kt +101 -0
- package/templates/shared/android/NetworkBanner/NetworkBannerScreen.kt +119 -0
- package/templates/shared/android/NetworkBanner/strings.xml +6 -0
- package/templates/shared/android/NotificationCenter/NotificationCenterModels.kt +41 -0
- package/templates/shared/android/NotificationCenter/strings.xml +9 -0
- package/templates/shared/android/OnboardingCoachMarks/OnboardingCoachMarksManager.kt +52 -0
- package/templates/shared/android/OnboardingCoachMarks/OnboardingCoachMarksScreen.kt +149 -0
- package/templates/shared/android/OnboardingCoachMarks/strings.xml +8 -0
- package/templates/shared/android/OngoingNotifications/OngoingNotificationsManager.kt +105 -0
- package/templates/shared/android/OngoingNotifications/OngoingNotificationsScreen.kt +80 -0
- package/templates/shared/android/OngoingNotifications/strings.xml +7 -0
- package/templates/shared/android/PaymentMethods/PaymentMethodsManager.kt +254 -0
- package/templates/shared/android/PaymentMethods/PaymentMethodsModels.kt +68 -0
- package/templates/shared/android/PaymentMethods/PaymentMethodsScreen.kt +446 -0
- package/templates/shared/android/PaymentMethods/strings.xml +20 -0
- package/templates/shared/android/Paywall/PaywallManager.kt +149 -0
- package/templates/shared/android/Paywall/PaywallModels.kt +29 -0
- package/templates/shared/android/Paywall/PaywallScreen.kt +278 -0
- package/templates/shared/android/Paywall/strings.xml +14 -0
- package/templates/shared/android/PinLock/PinLockManager.kt +214 -0
- package/templates/shared/android/PinLock/PinLockScreen.kt +242 -0
- package/templates/shared/android/PinLock/strings.xml +22 -0
- package/templates/shared/android/PushNotifications/PushNotificationManager.kt +270 -0
- package/templates/shared/android/PushNotifications/PushNotificationScreen.kt +370 -0
- package/templates/shared/android/PushNotifications/strings.xml +40 -0
- package/templates/shared/android/QRCode/QRCodeManager.kt +175 -0
- package/templates/shared/android/QRCode/QRCodeScreen.kt +323 -0
- package/templates/shared/android/QRCode/strings.xml +21 -0
- package/templates/shared/android/RealTimeSyncEngine/RealTimeSyncEngineManager.kt +213 -0
- package/templates/shared/android/RealTimeSyncEngine/RealTimeSyncEngineScreen.kt +135 -0
- package/templates/shared/android/RealTimeSyncEngine/strings.xml +20 -0
- package/templates/shared/android/ReferralInvite/ReferralInviteManager.kt +91 -0
- package/templates/shared/android/ReferralInvite/ReferralInviteScreen.kt +96 -0
- package/templates/shared/android/ReferralInvite/strings.xml +8 -0
- package/templates/shared/android/ReviewsRatings/ReviewsRatingsManager.kt +188 -0
- package/templates/shared/android/ReviewsRatings/ReviewsRatingsScreen.kt +404 -0
- package/templates/shared/android/ReviewsRatings/strings.xml +30 -0
- package/templates/shared/android/RichTextEditor/RichTextEditorManager.kt +160 -0
- package/templates/shared/android/RichTextEditor/RichTextEditorModels.kt +37 -0
- package/templates/shared/android/RichTextEditor/RichTextEditorScreen.kt +302 -0
- package/templates/shared/android/RichTextEditor/strings.xml +6 -0
- package/templates/shared/android/ShareSheet/ShareSheetManager.kt +163 -0
- package/templates/shared/android/ShareSheet/ShareSheetModels.kt +49 -0
- package/templates/shared/android/SkeletonLoading/SkeletonLoadingManager.kt +66 -0
- package/templates/shared/android/SkeletonLoading/SkeletonLoadingModels.kt +18 -0
- package/templates/shared/android/SkeletonLoading/SkeletonLoadingScreen.kt +250 -0
- package/templates/shared/android/SkeletonLoading/strings.xml +7 -0
- package/templates/shared/android/SocialLogin/SocialLoginManager.kt +114 -0
- package/templates/shared/android/SocialLogin/SocialLoginScreen.kt +137 -0
- package/templates/shared/android/SocialLogin/strings.xml +19 -0
- package/templates/shared/android/ThemeSwitcher/ThemeSwitcherManager.kt +73 -0
- package/templates/shared/android/ThemeSwitcher/ThemeSwitcherScreen.kt +278 -0
- package/templates/shared/android/ThemeSwitcher/strings.xml +12 -0
- package/templates/shared/android/TwoFactorAuth/TwoFactorAuthManager.kt +198 -0
- package/templates/shared/android/TwoFactorAuth/TwoFactorAuthScreen.kt +295 -0
- package/templates/shared/android/TwoFactorAuth/strings.xml +26 -0
- package/templates/shared/android/VoiceRecording/VoiceRecordingManager.kt +298 -0
- package/templates/shared/android/VoiceRecording/VoiceRecordingScreen.kt +273 -0
- package/templates/shared/android/VoiceRecording/strings.xml +8 -0
- package/templates/shared/android/WatchCompanion/WatchCompanionManager.kt +65 -0
- package/templates/shared/android/WatchCompanion/WatchCompanionScreen.kt +141 -0
- package/templates/shared/android/WatchCompanion/strings.xml +12 -0
- package/templates/shared/android/WhatsNew/WhatsNewManager.kt +58 -0
- package/templates/shared/android/WhatsNew/WhatsNewScreen.kt +125 -0
- package/templates/shared/android/WhatsNew/strings.xml +7 -0
- package/templates/shared/android/Widgets/WidgetsManager.kt +25 -0
- package/templates/shared/android/Widgets/WidgetsScreen.kt +77 -0
- package/templates/shared/android/Widgets/strings.xml +6 -0
- package/templates/shared/ios/AccountDeletion/AccountDeletionService.swift +166 -0
- package/templates/shared/ios/AccountDeletion/AccountDeletionView.swift +200 -0
- package/templates/shared/ios/AccountDeletion/INTEGRATION.md +86 -0
- package/templates/shared/ios/AccountDeletion/Strings.swift +41 -0
- package/templates/shared/ios/AddressInput/AddressInputService.swift +87 -0
- package/templates/shared/ios/AddressInput/AddressInputView.swift +278 -0
- package/templates/shared/ios/AddressInput/INTEGRATION.md +98 -0
- package/templates/shared/ios/AddressInput/Strings.swift +31 -0
- package/templates/shared/ios/AnalyticsAbstraction/AnalyticsAbstractionService.swift +24 -0
- package/templates/shared/ios/AnalyticsAbstraction/AnalyticsAbstractionView.swift +11 -0
- package/templates/shared/ios/AnalyticsAbstraction/INTEGRATION.md +11 -0
- package/templates/shared/ios/AnalyticsAbstraction/Strings.swift +7 -0
- package/templates/shared/ios/AppClips/AppClipsService.swift +39 -0
- package/templates/shared/ios/AppClips/AppClipsView.swift +62 -0
- package/templates/shared/ios/AppClips/INTEGRATION.md +102 -0
- package/templates/shared/ios/AppClips/Strings.swift +11 -0
- package/templates/shared/ios/AppRatingPrompt/AppRatingPromptService.swift +123 -0
- package/templates/shared/ios/AppRatingPrompt/AppRatingPromptView.swift +77 -0
- package/templates/shared/ios/AppRatingPrompt/INTEGRATION.md +77 -0
- package/templates/shared/ios/AppRatingPrompt/Strings.swift +12 -0
- package/templates/shared/ios/BiometricAuth/BiometricAuthService.swift +204 -0
- package/templates/shared/ios/BiometricAuth/INTEGRATION.md +107 -0
- package/templates/shared/ios/BiometricAuth/Strings.swift +35 -0
- package/templates/shared/ios/CalendarDateRange/CalendarDateRangeModels.swift +62 -0
- package/templates/shared/ios/CalendarDateRange/CalendarDateRangeService.swift +166 -0
- package/templates/shared/ios/CalendarDateRange/CalendarDateRangeView.swift +376 -0
- package/templates/shared/ios/CalendarDateRange/INTEGRATION.md +161 -0
- package/templates/shared/ios/CalendarDateRange/Strings.swift +16 -0
- package/templates/shared/ios/Camera/CameraView.swift +162 -0
- package/templates/shared/ios/Camera/INTEGRATION.md +115 -0
- package/templates/shared/ios/Camera/Strings.swift +22 -0
- package/templates/shared/ios/ChartsLibrary/ChartsLibraryModels.swift +75 -0
- package/templates/shared/ios/ChartsLibrary/ChartsLibraryService.swift +166 -0
- package/templates/shared/ios/ChartsLibrary/ChartsLibraryView.swift +526 -0
- package/templates/shared/ios/ChartsLibrary/INTEGRATION.md +188 -0
- package/templates/shared/ios/ChartsLibrary/Strings.swift +24 -0
- package/templates/shared/ios/CloudSync/CloudSyncService.swift +71 -0
- package/templates/shared/ios/CloudSync/CloudSyncView.swift +132 -0
- package/templates/shared/ios/CloudSync/INTEGRATION.md +61 -0
- package/templates/shared/ios/CloudSync/Strings.swift +20 -0
- package/templates/shared/ios/ConsentPrivacy/ConsentPrivacyModels.swift +35 -0
- package/templates/shared/ios/ConsentPrivacy/ConsentPrivacyService.swift +123 -0
- package/templates/shared/ios/ConsentPrivacy/ConsentPrivacyView.swift +227 -0
- package/templates/shared/ios/ConsentPrivacy/INTEGRATION.md +73 -0
- package/templates/shared/ios/ConsentPrivacy/Strings.swift +38 -0
- package/templates/shared/ios/ContentModeration/ContentModerationService.swift +181 -0
- package/templates/shared/ios/ContentModeration/ContentModerationView.swift +229 -0
- package/templates/shared/ios/ContentModeration/INTEGRATION.md +113 -0
- package/templates/shared/ios/ContentModeration/Strings.swift +45 -0
- package/templates/shared/ios/DeepLinking/DeepLinkingModels.swift +87 -0
- package/templates/shared/ios/DeepLinking/DeepLinkingService.swift +211 -0
- package/templates/shared/ios/DeepLinking/Strings.swift +12 -0
- package/templates/shared/ios/DownloadManager/DownloadManagerService.swift +135 -0
- package/templates/shared/ios/DownloadManager/DownloadManagerView.swift +146 -0
- package/templates/shared/ios/DownloadManager/Strings.swift +24 -0
- package/templates/shared/ios/DrawingCanvas/DrawingCanvasView.swift +174 -0
- package/templates/shared/ios/DrawingCanvas/INTEGRATION.md +111 -0
- package/templates/shared/ios/DrawingCanvas/Strings.swift +12 -0
- package/templates/shared/ios/EmptyStates/EmptyStateService.swift +61 -0
- package/templates/shared/ios/EmptyStates/EmptyStateView.swift +146 -0
- package/templates/shared/ios/EmptyStates/INTEGRATION.md +115 -0
- package/templates/shared/ios/EmptyStates/Strings.swift +34 -0
- package/templates/shared/ios/ErrorHandling/ErrorHandlingModels.swift +117 -0
- package/templates/shared/ios/ErrorHandling/ErrorHandlingService.swift +91 -0
- package/templates/shared/ios/ErrorHandling/ErrorHandlingView.swift +117 -0
- package/templates/shared/ios/ErrorHandling/INTEGRATION.md +127 -0
- package/templates/shared/ios/ErrorHandling/Strings.swift +44 -0
- package/templates/shared/ios/FeedbackSupport/FeedbackSupportService.swift +127 -0
- package/templates/shared/ios/FeedbackSupport/FeedbackSupportView.swift +341 -0
- package/templates/shared/ios/FeedbackSupport/INTEGRATION.md +84 -0
- package/templates/shared/ios/FeedbackSupport/Strings.swift +50 -0
- package/templates/shared/ios/FiltersSortSheet/FiltersSortSheetModels.swift +18 -0
- package/templates/shared/ios/FiltersSortSheet/FiltersSortSheetService.swift +48 -0
- package/templates/shared/ios/FiltersSortSheet/FiltersSortSheetView.swift +112 -0
- package/templates/shared/ios/FiltersSortSheet/INTEGRATION.md +12 -0
- package/templates/shared/ios/FiltersSortSheet/Strings.swift +7 -0
- package/templates/shared/ios/ForceUpdate/ForceUpdateService.swift +153 -0
- package/templates/shared/ios/ForceUpdate/ForceUpdateView.swift +97 -0
- package/templates/shared/ios/ForceUpdate/INTEGRATION.md +86 -0
- package/templates/shared/ios/ForceUpdate/Strings.swift +21 -0
- package/templates/shared/ios/GamificationKit/GamificationKitService.swift +130 -0
- package/templates/shared/ios/GamificationKit/GamificationKitView.swift +192 -0
- package/templates/shared/ios/GamificationKit/Strings.swift +27 -0
- package/templates/shared/ios/ImportExport/INTEGRATION.md +67 -0
- package/templates/shared/ios/ImportExport/ImportExportService.swift +73 -0
- package/templates/shared/ios/ImportExport/ImportExportView.swift +68 -0
- package/templates/shared/ios/ImportExport/Strings.swift +12 -0
- package/templates/shared/ios/LanguagePicker/INTEGRATION.md +87 -0
- package/templates/shared/ios/LanguagePicker/LanguagePickerService.swift +99 -0
- package/templates/shared/ios/LanguagePicker/LanguagePickerView.swift +105 -0
- package/templates/shared/ios/LanguagePicker/Strings.swift +10 -0
- package/templates/shared/ios/LiveActivities/INTEGRATION.md +69 -0
- package/templates/shared/ios/LiveActivities/LiveActivitiesService.swift +62 -0
- package/templates/shared/ios/LiveActivities/LiveActivitiesView.swift +58 -0
- package/templates/shared/ios/LiveActivities/Strings.swift +11 -0
- package/templates/shared/ios/MediaPicker/MediaPickerService.swift +106 -0
- package/templates/shared/ios/MediaPicker/MediaPickerView.swift +411 -0
- package/templates/shared/ios/MediaPicker/Strings.swift +16 -0
- package/templates/shared/ios/MultiStepWizard/INTEGRATION.md +12 -0
- package/templates/shared/ios/MultiStepWizard/MultiStepWizardModels.swift +8 -0
- package/templates/shared/ios/MultiStepWizard/MultiStepWizardService.swift +60 -0
- package/templates/shared/ios/MultiStepWizard/MultiStepWizardView.swift +72 -0
- package/templates/shared/ios/MultiStepWizard/Strings.swift +7 -0
- package/templates/shared/ios/NetworkBanner/INTEGRATION.md +123 -0
- package/templates/shared/ios/NetworkBanner/NetworkBannerService.swift +56 -0
- package/templates/shared/ios/NetworkBanner/NetworkBannerView.swift +105 -0
- package/templates/shared/ios/NetworkBanner/Strings.swift +9 -0
- package/templates/shared/ios/NotificationCenter/NotificationCenterModels.swift +39 -0
- package/templates/shared/ios/NotificationCenter/NotificationCenterService.swift +152 -0
- package/templates/shared/ios/OnboardingCoachMarks/INTEGRATION.md +94 -0
- package/templates/shared/ios/OnboardingCoachMarks/OnboardingCoachMarksService.swift +46 -0
- package/templates/shared/ios/OnboardingCoachMarks/OnboardingCoachMarksView.swift +113 -0
- package/templates/shared/ios/OnboardingCoachMarks/Strings.swift +11 -0
- package/templates/shared/ios/PaymentMethods/INTEGRATION.md +213 -0
- package/templates/shared/ios/PaymentMethods/PaymentMethodsView.swift +314 -0
- package/templates/shared/ios/PaymentMethods/Strings.swift +23 -0
- package/templates/shared/ios/Paywall/INTEGRATION.md +154 -0
- package/templates/shared/ios/Paywall/PaywallModels.swift +101 -0
- package/templates/shared/ios/Paywall/PaywallService.swift +151 -0
- package/templates/shared/ios/Paywall/PaywallView.swift +188 -0
- package/templates/shared/ios/Paywall/Strings.swift +33 -0
- package/templates/shared/ios/PinLock/INTEGRATION.md +102 -0
- package/templates/shared/ios/PinLock/PinLockService.swift +187 -0
- package/templates/shared/ios/PinLock/PinLockView.swift +170 -0
- package/templates/shared/ios/PinLock/Strings.swift +25 -0
- package/templates/shared/ios/PushNotifications/INTEGRATION.md +106 -0
- package/templates/shared/ios/PushNotifications/PushNotificationModels.swift +38 -0
- package/templates/shared/ios/PushNotifications/PushNotificationService.swift +213 -0
- package/templates/shared/ios/PushNotifications/PushNotificationsView.swift +240 -0
- package/templates/shared/ios/PushNotifications/Strings.swift +45 -0
- package/templates/shared/ios/QRCode/QRCodeView.swift +246 -0
- package/templates/shared/ios/QRCode/Strings.swift +23 -0
- package/templates/shared/ios/RealTimeSyncEngine/INTEGRATION.md +93 -0
- package/templates/shared/ios/RealTimeSyncEngine/RealTimeSyncEngineService.swift +171 -0
- package/templates/shared/ios/RealTimeSyncEngine/RealTimeSyncEngineView.swift +113 -0
- package/templates/shared/ios/RealTimeSyncEngine/Strings.swift +24 -0
- package/templates/shared/ios/ReferralInvite/INTEGRATION.md +56 -0
- package/templates/shared/ios/ReferralInvite/ReferralInviteService.swift +83 -0
- package/templates/shared/ios/ReferralInvite/ReferralInviteView.swift +55 -0
- package/templates/shared/ios/ReferralInvite/Strings.swift +13 -0
- package/templates/shared/ios/ReviewsRatings/ReviewsRatingsService.swift +172 -0
- package/templates/shared/ios/ReviewsRatings/ReviewsRatingsView.swift +306 -0
- package/templates/shared/ios/ReviewsRatings/Strings.swift +31 -0
- package/templates/shared/ios/RichTextEditor/INTEGRATION.md +160 -0
- package/templates/shared/ios/RichTextEditor/RichTextEditorModels.swift +55 -0
- package/templates/shared/ios/RichTextEditor/RichTextEditorService.swift +136 -0
- package/templates/shared/ios/RichTextEditor/RichTextEditorView.swift +219 -0
- package/templates/shared/ios/RichTextEditor/Strings.swift +8 -0
- package/templates/shared/ios/ShareSheet/INTEGRATION.md +128 -0
- package/templates/shared/ios/ShareSheet/ShareSheetModels.swift +87 -0
- package/templates/shared/ios/ShareSheet/ShareSheetService.swift +161 -0
- package/templates/shared/ios/ShareSheet/Strings.swift +26 -0
- package/templates/shared/ios/SiriShortcuts/INTEGRATION.md +72 -0
- package/templates/shared/ios/SiriShortcuts/SiriShortcutsService.swift +51 -0
- package/templates/shared/ios/SiriShortcuts/SiriShortcutsView.swift +72 -0
- package/templates/shared/ios/SiriShortcuts/Strings.swift +11 -0
- package/templates/shared/ios/SkeletonLoading/INTEGRATION.md +156 -0
- package/templates/shared/ios/SkeletonLoading/SkeletonLoadingModels.swift +25 -0
- package/templates/shared/ios/SkeletonLoading/SkeletonLoadingService.swift +46 -0
- package/templates/shared/ios/SkeletonLoading/SkeletonLoadingView.swift +195 -0
- package/templates/shared/ios/SkeletonLoading/Strings.swift +11 -0
- package/templates/shared/ios/SocialLogin/INTEGRATION.md +154 -0
- package/templates/shared/ios/SocialLogin/SocialLoginService.swift +141 -0
- package/templates/shared/ios/SocialLogin/SocialLoginView.swift +157 -0
- package/templates/shared/ios/SocialLogin/Strings.swift +24 -0
- package/templates/shared/ios/SpotlightIndexing/INTEGRATION.md +81 -0
- package/templates/shared/ios/SpotlightIndexing/SpotlightIndexingService.swift +57 -0
- package/templates/shared/ios/SpotlightIndexing/SpotlightIndexingView.swift +54 -0
- package/templates/shared/ios/SpotlightIndexing/Strings.swift +12 -0
- package/templates/shared/ios/ThemeSwitcher/INTEGRATION.md +95 -0
- package/templates/shared/ios/ThemeSwitcher/Strings.swift +15 -0
- package/templates/shared/ios/ThemeSwitcher/ThemeSwitcherService.swift +51 -0
- package/templates/shared/ios/ThemeSwitcher/ThemeSwitcherView.swift +215 -0
- package/templates/shared/ios/TwoFactorAuth/INTEGRATION.md +96 -0
- package/templates/shared/ios/TwoFactorAuth/Strings.swift +30 -0
- package/templates/shared/ios/TwoFactorAuth/TwoFactorAuthService.swift +166 -0
- package/templates/shared/ios/TwoFactorAuth/TwoFactorAuthView.swift +189 -0
- package/templates/shared/ios/VoiceRecording/INTEGRATION.md +99 -0
- package/templates/shared/ios/VoiceRecording/Strings.swift +11 -0
- package/templates/shared/ios/VoiceRecording/VoiceRecordingService.swift +246 -0
- package/templates/shared/ios/VoiceRecording/VoiceRecordingView.swift +219 -0
- package/templates/shared/ios/WatchCompanion/INTEGRATION.md +65 -0
- package/templates/shared/ios/WatchCompanion/Strings.swift +15 -0
- package/templates/shared/ios/WatchCompanion/WatchCompanionService.swift +70 -0
- package/templates/shared/ios/WatchCompanion/WatchCompanionView.swift +81 -0
- package/templates/shared/ios/WhatsNew/INTEGRATION.md +79 -0
- package/templates/shared/ios/WhatsNew/Strings.swift +12 -0
- package/templates/shared/ios/WhatsNew/WhatsNewService.swift +49 -0
- package/templates/shared/ios/WhatsNew/WhatsNewView.swift +87 -0
- package/templates/shared/ios/Widgets/INTEGRATION.md +30 -0
- package/templates/shared/ios/Widgets/Strings.swift +12 -0
- package/templates/shared/ios/Widgets/WidgetsService.swift +36 -0
- package/templates/shared/ios/Widgets/WidgetsView.swift +87 -0
- package/templates/shared/tests/android/AccountDeletionTest.kt +175 -0
- package/templates/shared/tests/android/AddressInputTest.kt +82 -0
- package/templates/shared/tests/android/AnalyticsAbstractionTest.kt +24 -0
- package/templates/shared/tests/android/AppIndexingTest.kt +60 -0
- package/templates/shared/tests/android/AppRatingPromptTest.kt +34 -0
- package/templates/shared/tests/android/BiometricAuthTest.kt +85 -0
- package/templates/shared/tests/android/CalendarDateRangeTest.kt +244 -0
- package/templates/shared/tests/android/CameraTest.kt +81 -0
- package/templates/shared/tests/android/CloudSyncTest.kt +26 -0
- package/templates/shared/tests/android/ConsentPrivacyTest.kt +161 -0
- package/templates/shared/tests/android/ContentModerationTest.kt +119 -0
- package/templates/shared/tests/android/DeepLinkingTest.kt +254 -0
- package/templates/shared/tests/android/DownloadManagerTest.kt +56 -0
- package/templates/shared/tests/android/DrawingCanvasTest.kt +100 -0
- package/templates/shared/tests/android/EmptyStateTest.kt +79 -0
- package/templates/shared/tests/android/ErrorHandlingTest.kt +182 -0
- package/templates/shared/tests/android/FeedbackSupportTest.kt +140 -0
- package/templates/shared/tests/android/FiltersSortSheetTest.kt +24 -0
- package/templates/shared/tests/android/ForceUpdateTest.kt +109 -0
- package/templates/shared/tests/android/GoogleAssistantTest.kt +63 -0
- package/templates/shared/tests/android/ImportExportTest.kt +34 -0
- package/templates/shared/tests/android/InstantAppsTest.kt +51 -0
- package/templates/shared/tests/android/LanguagePickerTest.kt +87 -0
- package/templates/shared/tests/android/MediaPickerTest.kt +151 -0
- package/templates/shared/tests/android/MultiStepWizardTest.kt +23 -0
- package/templates/shared/tests/android/NetworkBannerTest.kt +111 -0
- package/templates/shared/tests/android/NotificationCenterTest.kt +100 -0
- package/templates/shared/tests/android/OnboardingCoachMarksTest.kt +45 -0
- package/templates/shared/tests/android/OngoingNotificationsTest.kt +61 -0
- package/templates/shared/tests/android/PaymentMethodsTest.kt +195 -0
- package/templates/shared/tests/android/PinLockTest.kt +88 -0
- package/templates/shared/tests/android/QRCodeTest.kt +106 -0
- package/templates/shared/tests/android/RealTimeSyncEngineTest.kt +105 -0
- package/templates/shared/tests/android/ReferralInviteTest.kt +35 -0
- package/templates/shared/tests/android/ReviewsRatingsTest.kt +96 -0
- package/templates/shared/tests/android/ShareSheetTest.kt +182 -0
- package/templates/shared/tests/android/SkeletonLoadingTest.kt +122 -0
- package/templates/shared/tests/android/SocialLoginTest.kt +89 -0
- package/templates/shared/tests/android/ThemeSwitcherTest.kt +70 -0
- package/templates/shared/tests/android/TwoFactorAuthTest.kt +114 -0
- package/templates/shared/tests/android/VoiceRecordingTest.kt +144 -0
- package/templates/shared/tests/android/WatchCompanionTest.kt +61 -0
- package/templates/shared/tests/android/WhatsNewTest.kt +36 -0
- package/templates/shared/tests/android/WidgetsTest.kt +23 -0
- package/templates/shared/tests/ios/AccountDeletionTests.swift +156 -0
- package/templates/shared/tests/ios/AnalyticsAbstractionTests.swift +17 -0
- package/templates/shared/tests/ios/AppClipsTests.swift +47 -0
- package/templates/shared/tests/ios/AppRatingPromptTests.swift +49 -0
- package/templates/shared/tests/ios/BiometricAuthTests.swift +131 -0
- package/templates/shared/tests/ios/CameraTests.swift +99 -0
- package/templates/shared/tests/ios/ChartsLibraryTests.swift +213 -0
- package/templates/shared/tests/ios/CloudSyncTests.swift +41 -0
- package/templates/shared/tests/ios/ConsentPrivacyTests.swift +143 -0
- package/templates/shared/tests/ios/ContentModerationTests.swift +134 -0
- package/templates/shared/tests/ios/DeepLinkingTests.swift +212 -0
- package/templates/shared/tests/ios/DownloadManagerTests.swift +55 -0
- package/templates/shared/tests/ios/DrawingCanvasTests.swift +106 -0
- package/templates/shared/tests/ios/EmptyStatesTests.swift +155 -0
- package/templates/shared/tests/ios/ErrorHandlingTests.swift +185 -0
- package/templates/shared/tests/ios/FeedbackSupportTests.swift +135 -0
- package/templates/shared/tests/ios/FiltersSortSheetTests.swift +22 -0
- package/templates/shared/tests/ios/ForceUpdateTests.swift +105 -0
- package/templates/shared/tests/ios/GamificationKitTests.swift +71 -0
- package/templates/shared/tests/ios/ImportExportTests.swift +47 -0
- package/templates/shared/tests/ios/LanguagePickerTests.swift +74 -0
- package/templates/shared/tests/ios/LiveActivitiesTests.swift +54 -0
- package/templates/shared/tests/ios/MediaPickerTests.swift +169 -0
- package/templates/shared/tests/ios/MultiStepWizardTests.swift +23 -0
- package/templates/shared/tests/ios/NetworkBannerTests.swift +84 -0
- package/templates/shared/tests/ios/NotificationCenterTests.swift +93 -0
- package/templates/shared/tests/ios/OnboardingCoachMarksTests.swift +52 -0
- package/templates/shared/tests/ios/PaymentMethodsTests.swift +171 -0
- package/templates/shared/tests/ios/PinLockTests.swift +119 -0
- package/templates/shared/tests/ios/PushNotificationTests.swift +152 -0
- package/templates/shared/tests/ios/QRCodeTests.swift +108 -0
- package/templates/shared/tests/ios/RealTimeSyncEngineTests.swift +145 -0
- package/templates/shared/tests/ios/ReferralInviteTests.swift +33 -0
- package/templates/shared/tests/ios/ReviewsRatingsTests.swift +112 -0
- package/templates/shared/tests/ios/ShareSheetTests.swift +176 -0
- package/templates/shared/tests/ios/SiriShortcutsTests.swift +52 -0
- package/templates/shared/tests/ios/SkeletonLoadingTests.swift +111 -0
- package/templates/shared/tests/ios/SocialLoginTests.swift +113 -0
- package/templates/shared/tests/ios/SpotlightIndexingTests.swift +45 -0
- package/templates/shared/tests/ios/ThemeSwitcherTests.swift +67 -0
- package/templates/shared/tests/ios/TwoFactorAuthTests.swift +146 -0
- package/templates/shared/tests/ios/VoiceRecordingTests.swift +116 -0
- package/templates/shared/tests/ios/WatchCompanionTests.swift +54 -0
- package/templates/shared/tests/ios/WhatsNewTests.swift +43 -0
- package/templates/shared/tests/ios/WidgetsTests.swift +22 -0
- package/templates/shared/tests/maestro/account_deletion_flow.yaml +69 -0
- package/templates/shared/tests/maestro/address_input_flow.yaml +49 -0
- package/templates/shared/tests/maestro/analytics_abstraction_flow.yaml +9 -0
- package/templates/shared/tests/maestro/app_clips_flow.yaml +26 -0
- package/templates/shared/tests/maestro/app_rating_prompt_flow.yaml +46 -0
- package/templates/shared/tests/maestro/biometric_auth_flow.yaml +55 -0
- package/templates/shared/tests/maestro/calendar_date_range_flow.yaml +96 -0
- package/templates/shared/tests/maestro/camera_flow.yaml +64 -0
- package/templates/shared/tests/maestro/charts_library_flow.yaml +43 -0
- package/templates/shared/tests/maestro/cloud_sync_flow.yaml +33 -0
- package/templates/shared/tests/maestro/consent_privacy_flow.yaml +59 -0
- package/templates/shared/tests/maestro/content_moderation_flow.yaml +108 -0
- package/templates/shared/tests/maestro/deep_linking_flow.yaml +28 -0
- package/templates/shared/tests/maestro/download_manager_flow.yaml +36 -0
- package/templates/shared/tests/maestro/drawing_canvas_flow.yaml +66 -0
- package/templates/shared/tests/maestro/empty_states_flow.yaml +64 -0
- package/templates/shared/tests/maestro/error_handling_flow.yaml +41 -0
- package/templates/shared/tests/maestro/feedback_support_flow.yaml +92 -0
- package/templates/shared/tests/maestro/filters_sort_sheet_flow.yaml +9 -0
- package/templates/shared/tests/maestro/force_update_flow.yaml +48 -0
- package/templates/shared/tests/maestro/import_export_flow.yaml +48 -0
- package/templates/shared/tests/maestro/language_picker_flow.yaml +59 -0
- package/templates/shared/tests/maestro/live_activities_flow.yaml +36 -0
- package/templates/shared/tests/maestro/media_picker_flow.yaml +72 -0
- package/templates/shared/tests/maestro/multi_step_wizard_flow.yaml +12 -0
- package/templates/shared/tests/maestro/network_banner_flow.yaml +44 -0
- package/templates/shared/tests/maestro/notification_center_flow.yaml +79 -0
- package/templates/shared/tests/maestro/onboarding_coach_marks_flow.yaml +49 -0
- package/templates/shared/tests/maestro/payment_methods_flow.yaml +115 -0
- package/templates/shared/tests/maestro/paywall_flow.yaml +70 -0
- package/templates/shared/tests/maestro/pin_lock_flow.yaml +67 -0
- package/templates/shared/tests/maestro/qr_code_flow.yaml +51 -0
- package/templates/shared/tests/maestro/realtime_sync_engine_flow.yaml +43 -0
- package/templates/shared/tests/maestro/referral_invite_flow.yaml +32 -0
- package/templates/shared/tests/maestro/reviews_ratings_flow.yaml +59 -0
- package/templates/shared/tests/maestro/rich_text_editor_flow.yaml +86 -0
- package/templates/shared/tests/maestro/share_sheet_flow.yaml +42 -0
- package/templates/shared/tests/maestro/siri_shortcuts_flow.yaml +38 -0
- package/templates/shared/tests/maestro/skeleton_loading_flow.yaml +63 -0
- package/templates/shared/tests/maestro/social_login_flow.yaml +45 -0
- package/templates/shared/tests/maestro/spotlight_indexing_flow.yaml +44 -0
- package/templates/shared/tests/maestro/theme_switcher_flow.yaml +63 -0
- package/templates/shared/tests/maestro/two_factor_auth_flow.yaml +94 -0
- package/templates/shared/tests/maestro/voice_recording_flow.yaml +77 -0
- package/templates/shared/tests/maestro/watch_companion_flow.yaml +36 -0
- package/templates/shared/tests/maestro/whats_new_flow.yaml +38 -0
- package/templates/shared/tests/maestro/widgets_flow.yaml +10 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,929 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import fs from "fs-extra";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { execSync } from "node:child_process";
|
|
6
|
+
import { collectUserInput, confirmInput, parseCliArgs, parseManagementCommand } from "./cli.js";
|
|
7
|
+
import { buildAgentPrompt, buildTestPrompt, buildScratchPrompt, buildQuickPrompt, buildUpdatePrompt } from "./prompt-builder.js";
|
|
8
|
+
import { createEngine } from "./engines/index.js";
|
|
9
|
+
import { validateOutput, reportValidation } from "./validator.js";
|
|
10
|
+
import { validatePrompt, formatSanitizationResult } from "./prompt-sanitizer.js";
|
|
11
|
+
import { checkGitHubPrereqs, pushToGitHub, deriveRepoName, commitChanges, pushBranch, createPullRequest, isGitRepo, hasRemoteOrigin, collectScreenshots, ensureScreenshotsGitignoreException, generateReadmeScreenshots, buildPrBodyWithScreenshots, } from "./github.js";
|
|
12
|
+
import { PATHS, ASSET_PATHS, DEFAULT_ENGINE, DEFAULT_MODEL, SKELETON_TEMPLATE_NAME, expandPlatform } from "./config.js";
|
|
13
|
+
import { listApps, runApp, resolveAppContext } from "./app-manager.js";
|
|
14
|
+
import { scaffoldWorkspace, cleanupWorkspace } from "./workspace.js";
|
|
15
|
+
import { resolveUpdateContext } from "./updater.js";
|
|
16
|
+
/** Peek at argv for --engine flag before full CLI parsing (needed for pre-flight check) */
|
|
17
|
+
function peekEngineFlag() {
|
|
18
|
+
const args = process.argv.slice(2);
|
|
19
|
+
for (let i = 0; i < args.length; i++) {
|
|
20
|
+
if ((args[i] === "--engine" || args[i] === "-e") && args[i + 1]) {
|
|
21
|
+
return args[i + 1];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
async function main() {
|
|
27
|
+
// ── Management commands (no build agent needed) ─────────────────────
|
|
28
|
+
const mgmtCmd = parseManagementCommand();
|
|
29
|
+
if (mgmtCmd) {
|
|
30
|
+
if (mgmtCmd.command === "list") {
|
|
31
|
+
await listApps();
|
|
32
|
+
}
|
|
33
|
+
else if (mgmtCmd.command === "run") {
|
|
34
|
+
await runApp(mgmtCmd.appName);
|
|
35
|
+
}
|
|
36
|
+
else if (mgmtCmd.command === "test") {
|
|
37
|
+
await testApp(mgmtCmd.appName, mgmtCmd.engine, mgmtCmd.model);
|
|
38
|
+
}
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// ── Determine engine ────────────────────────────────────────────────
|
|
42
|
+
// Engine can come from CLI flags (parsed later) or env var; peek at argv for early detection
|
|
43
|
+
const earlyEngine = peekEngineFlag() ?? DEFAULT_ENGINE;
|
|
44
|
+
const engine = createEngine(earlyEngine);
|
|
45
|
+
// ── Pre-flight checks ───────────────────────────────────────────────
|
|
46
|
+
const agentCheck = await engine.checkInstallation();
|
|
47
|
+
if (!agentCheck.ok) {
|
|
48
|
+
p.log.error(agentCheck.error);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const ghCheck = await checkGitHubPrereqs();
|
|
52
|
+
if (!ghCheck.ok) {
|
|
53
|
+
for (const err of ghCheck.errors) {
|
|
54
|
+
p.log.warn(err);
|
|
55
|
+
}
|
|
56
|
+
p.log.warn("GitHub push will be skipped. You can push manually after the build.");
|
|
57
|
+
}
|
|
58
|
+
// ── Collect user input ──────────────────────────────────────────────
|
|
59
|
+
const cliResult = parseCliArgs();
|
|
60
|
+
const input = cliResult?.input ?? await collectUserInput();
|
|
61
|
+
const cliFlags = cliResult?.flags ?? {};
|
|
62
|
+
// Re-resolve engine with the actual flag value (CLI flags override peek)
|
|
63
|
+
const selectedEngine = cliFlags.engine ?? input.engine ?? earlyEngine;
|
|
64
|
+
const resolvedEngine = selectedEngine !== earlyEngine ? createEngine(selectedEngine) : engine;
|
|
65
|
+
if (!cliResult) {
|
|
66
|
+
await confirmInput(input);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (input.update) {
|
|
70
|
+
p.log.info(`Target: ${input.updateTarget}`);
|
|
71
|
+
p.log.info(`Change: ${input.description}`);
|
|
72
|
+
p.log.info(`Engine: ${resolvedEngine.name}`);
|
|
73
|
+
p.log.info(`Model: ${input.model}`);
|
|
74
|
+
p.log.info("Mode: Update");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
p.log.info(`App: ${input.description}`);
|
|
78
|
+
p.log.info(`Platform: ${input.platform}`);
|
|
79
|
+
p.log.info(`Engine: ${resolvedEngine.name}`);
|
|
80
|
+
p.log.info(`Model: ${input.model}`);
|
|
81
|
+
if (input.quick) {
|
|
82
|
+
p.log.info("Mode: Quick");
|
|
83
|
+
}
|
|
84
|
+
else if (input.scratch) {
|
|
85
|
+
p.log.info("Mode: From scratch");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ── Prompt security validation (Layer 1) ────────────────────────────
|
|
90
|
+
p.log.step("Validating prompt security...");
|
|
91
|
+
const sanitization = validatePrompt(input.description);
|
|
92
|
+
if (!sanitization.safe) {
|
|
93
|
+
p.log.error("Prompt rejected by security sanitizer:");
|
|
94
|
+
p.log.error(formatSanitizationResult(sanitization));
|
|
95
|
+
p.outro("Your app description was blocked because it contains patterns associated with prompt injection, " +
|
|
96
|
+
"malicious intent, or system manipulation. Please rephrase your description to focus on what the app " +
|
|
97
|
+
"should do for its users.");
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
if (sanitization.findings.length > 0) {
|
|
101
|
+
p.log.warn("Prompt security warnings (proceeding with caution):");
|
|
102
|
+
p.log.warn(formatSanitizationResult(sanitization));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
p.log.info("Prompt security check passed.");
|
|
106
|
+
}
|
|
107
|
+
// ── Scaffold workspace (npx mode) ───────────────────────────────────
|
|
108
|
+
// When running as an installed npm package, create symlinks and config
|
|
109
|
+
// files in the user's cwd so the agent engine can find assets.
|
|
110
|
+
await scaffoldWorkspace();
|
|
111
|
+
// ── Ensure output directory exists ─────────────────────────────────
|
|
112
|
+
await fs.ensureDir(PATHS.output);
|
|
113
|
+
// Note: previously built apps are preserved in output/.
|
|
114
|
+
// Use `--list` to see all apps or `--run <name>` to launch one on a simulator.
|
|
115
|
+
// ── Update mode (separate flow) ────────────────────────────────────
|
|
116
|
+
if (input.update && input.updateTarget) {
|
|
117
|
+
await updateApp(input, resolvedEngine, ghCheck.ok);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// ── Dual-platform build (parallel) ──────────────────────────────────
|
|
121
|
+
if (input.platform === "both") {
|
|
122
|
+
await runParallelBuild(input, resolvedEngine, cliResult, cliFlags, ghCheck.ok);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// ── Build agent prompt (single platform) ───────────────────────────
|
|
126
|
+
let prompt;
|
|
127
|
+
// Safe cast: at this point platform is "ios" | "android" (not "both")
|
|
128
|
+
const singlePlatform = input.platform;
|
|
129
|
+
// Always use monorepo layout: output/{app-name}/{platform}/
|
|
130
|
+
const appName = deriveAppName(input.description);
|
|
131
|
+
const monorepoDir = path.join(PATHS.output, appName); // repo root for GitHub
|
|
132
|
+
const appDir = path.join(monorepoDir, singlePlatform); // where code lives
|
|
133
|
+
let knownAppDir = appDir;
|
|
134
|
+
if (input.quick) {
|
|
135
|
+
// Quick mode: orchestrator pre-clones the skeleton template, renames it, and generates project
|
|
136
|
+
const displayName = deriveDisplayName(appName);
|
|
137
|
+
const bundleId = deriveBundleId(appName);
|
|
138
|
+
// Clone skeleton template
|
|
139
|
+
const skeletonPath = path.join(PATHS.templates, singlePlatform, SKELETON_TEMPLATE_NAME);
|
|
140
|
+
if (!(await fs.pathExists(skeletonPath))) {
|
|
141
|
+
p.log.error(`Skeleton template not found at: ${skeletonPath}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
// Remove existing monorepo dir if present
|
|
145
|
+
if (await fs.pathExists(monorepoDir)) {
|
|
146
|
+
await fs.remove(monorepoDir);
|
|
147
|
+
}
|
|
148
|
+
await fs.copy(skeletonPath, appDir);
|
|
149
|
+
p.log.info(`Skeleton cloned to: ${appDir}`);
|
|
150
|
+
// Rename the template from "Skeleton" to the app name
|
|
151
|
+
const renameScript = path.join(ASSET_PATHS.scripts, "rename-template.sh");
|
|
152
|
+
if (await fs.pathExists(renameScript)) {
|
|
153
|
+
try {
|
|
154
|
+
execSync(`bash "${renameScript}" "${SKELETON_TEMPLATE_NAME}" "${displayName}" "${bundleId}" "${singlePlatform}" "${appDir}"`, { stdio: "pipe", timeout: 60000 });
|
|
155
|
+
p.log.info(`Renamed: ${SKELETON_TEMPLATE_NAME} → ${displayName}`);
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
const errMsg = e instanceof Error ? e.message : String(e);
|
|
159
|
+
p.log.warn(`Rename script failed: ${errMsg.slice(0, 200)}`);
|
|
160
|
+
p.log.warn("Agent will handle remaining renames.");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
p.log.warn("Rename script not found — agent will rename manually.");
|
|
165
|
+
}
|
|
166
|
+
p.log.info(`App name: ${appName} | Display: ${displayName} | Bundle ID: ${bundleId}`);
|
|
167
|
+
prompt = await buildQuickPrompt({ ...input, platform: singlePlatform }, appDir, appName, bundleId);
|
|
168
|
+
p.log.info("Quick prompt built successfully.");
|
|
169
|
+
}
|
|
170
|
+
else if (input.scratch) {
|
|
171
|
+
// Ensure the monorepo structure exists for scratch mode
|
|
172
|
+
await fs.ensureDir(appDir);
|
|
173
|
+
prompt = await buildScratchPrompt(input);
|
|
174
|
+
// Redirect agent output to the platform subdir (monorepo layout)
|
|
175
|
+
prompt += `\n\n## OUTPUT DIRECTORY OVERRIDE\n\n` +
|
|
176
|
+
`IMPORTANT: This build uses a monorepo layout. You MUST write ALL output to \`${appDir}/\` instead of \`output/{app-name}/\`.\n` +
|
|
177
|
+
`Use "${appName}" as the app name (do NOT append the platform suffix).\n` +
|
|
178
|
+
`The app directory is: ${appDir}\n` +
|
|
179
|
+
`Reports go to: ${appDir}/reports/\n` +
|
|
180
|
+
`Tests go to: ${appDir}/tests/\n`;
|
|
181
|
+
p.log.info("Scratch prompt built successfully.");
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// Ensure the monorepo structure exists for template mode
|
|
185
|
+
await fs.ensureDir(appDir);
|
|
186
|
+
prompt = await buildAgentPrompt(input);
|
|
187
|
+
// Redirect agent output to the platform subdir (monorepo layout)
|
|
188
|
+
prompt += `\n\n## OUTPUT DIRECTORY OVERRIDE\n\n` +
|
|
189
|
+
`IMPORTANT: This build uses a monorepo layout. You MUST write ALL output to \`${appDir}/\` instead of \`output/{app-name}/\`.\n` +
|
|
190
|
+
`Use "${appName}" as the app name (do NOT append the platform suffix).\n` +
|
|
191
|
+
`The app directory is: ${appDir}\n` +
|
|
192
|
+
`Reports go to: ${appDir}/reports/\n` +
|
|
193
|
+
`Tests go to: ${appDir}/tests/\n`;
|
|
194
|
+
p.log.info("Agent prompt built successfully.");
|
|
195
|
+
}
|
|
196
|
+
// ── Run the agent engine ────────────────────────────────────────────
|
|
197
|
+
p.log.step(`Launching ${resolvedEngine.name} agent...`);
|
|
198
|
+
const runOptions = input.quick ? { skipContinuation: true } : {};
|
|
199
|
+
const agentResult = await resolvedEngine.run(prompt, input.model, runOptions);
|
|
200
|
+
if (!agentResult.success) {
|
|
201
|
+
p.log.error(`Agent failed: ${agentResult.error}`);
|
|
202
|
+
p.outro("The agent did not complete successfully. Check the output directory for partial results.");
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
// ── Proof of work summary ──────────────────────────────────────────
|
|
206
|
+
displayProofOfWork(agentResult);
|
|
207
|
+
// ── Report-based proof of work (from summary.json) ─────────────────
|
|
208
|
+
const reportTarget = knownAppDir
|
|
209
|
+
? `${appName}/${singlePlatform}` // e.g., "pet-grooming/ios"
|
|
210
|
+
: undefined;
|
|
211
|
+
const reportMeta = await displayReportSummary(reportTarget);
|
|
212
|
+
// Stream-based Maestro test results (fallback if summary.json missing)
|
|
213
|
+
displayMaestroResults(agentResult);
|
|
214
|
+
// ── Validate output ─────────────────────────────────────────────────
|
|
215
|
+
p.log.step("Validating generated app...");
|
|
216
|
+
const validation = await validateOutput(singlePlatform, knownAppDir);
|
|
217
|
+
reportValidation(validation);
|
|
218
|
+
if (!validation.valid) {
|
|
219
|
+
p.outro("Validation failed. The stop hook may have already retried. Check output/ for details.");
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
// ── Push to GitHub (monorepo root, not the platform subdir) ────────
|
|
223
|
+
await handleGitHubPush(cliResult, cliFlags, ghCheck.ok, monorepoDir, reportMeta.artifactPath);
|
|
224
|
+
}
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// Parallel Build (dual-platform) — works for quick, create, and scratch modes
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
/**
|
|
229
|
+
* Run builds for both iOS and Android in parallel.
|
|
230
|
+
* Creates a monorepo structure: output/{app-name}/ios/ and output/{app-name}/android/
|
|
231
|
+
*
|
|
232
|
+
* Quick mode: orchestrator pre-clones + renames skeleton templates before launching agents.
|
|
233
|
+
* Create/scratch mode: agents handle cloning/writing themselves; we just ensure the directory structure.
|
|
234
|
+
*/
|
|
235
|
+
async function runParallelBuild(input, engine, cliResult, cliFlags, ghAvailable) {
|
|
236
|
+
const platforms = expandPlatform("both"); // ["ios", "android"]
|
|
237
|
+
const appName = deriveAppName(input.description);
|
|
238
|
+
const displayName = deriveDisplayName(appName);
|
|
239
|
+
const monorepoDir = path.join(PATHS.output, appName);
|
|
240
|
+
const bundleId = deriveBundleId(appName);
|
|
241
|
+
const modeLabel = input.quick ? "quick" : input.scratch ? "scratch" : "create";
|
|
242
|
+
p.log.step(`Dual-platform ${modeLabel} build: ${displayName} (iOS + Android)`);
|
|
243
|
+
// Remove existing output dir if present
|
|
244
|
+
if (await fs.pathExists(monorepoDir)) {
|
|
245
|
+
await fs.remove(monorepoDir);
|
|
246
|
+
}
|
|
247
|
+
await fs.ensureDir(monorepoDir);
|
|
248
|
+
// Quick mode: clone + rename both skeletons before launching agents
|
|
249
|
+
if (input.quick) {
|
|
250
|
+
const renameScript = path.join(ASSET_PATHS.scripts, "rename-template.sh");
|
|
251
|
+
const hasRenameScript = await fs.pathExists(renameScript);
|
|
252
|
+
for (const plat of platforms) {
|
|
253
|
+
const platDir = path.join(monorepoDir, plat);
|
|
254
|
+
const skeletonPath = path.join(PATHS.templates, plat, SKELETON_TEMPLATE_NAME);
|
|
255
|
+
if (!(await fs.pathExists(skeletonPath))) {
|
|
256
|
+
p.log.error(`Skeleton template not found for ${plat}: ${skeletonPath}`);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
await fs.copy(skeletonPath, platDir);
|
|
260
|
+
p.log.info(`[${plat}] Skeleton cloned to: ${platDir}`);
|
|
261
|
+
if (hasRenameScript) {
|
|
262
|
+
try {
|
|
263
|
+
execSync(`bash "${renameScript}" "${SKELETON_TEMPLATE_NAME}" "${displayName}" "${bundleId}" "${plat}" "${platDir}"`, { stdio: "pipe", timeout: 60000 });
|
|
264
|
+
p.log.info(`[${plat}] Renamed: ${SKELETON_TEMPLATE_NAME} → ${displayName}`);
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
const errMsg = e instanceof Error ? e.message : String(e);
|
|
268
|
+
p.log.warn(`[${plat}] Rename script failed: ${errMsg.slice(0, 200)}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// Create/scratch: just ensure per-platform subdirectories exist
|
|
275
|
+
for (const plat of platforms) {
|
|
276
|
+
await fs.ensureDir(path.join(monorepoDir, plat));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
p.log.info(`App name: ${appName} | Display: ${displayName} | Bundle ID: ${bundleId}`);
|
|
280
|
+
// Build prompts for each platform using the appropriate prompt builder
|
|
281
|
+
const prompts = {};
|
|
282
|
+
for (const plat of platforms) {
|
|
283
|
+
const platInput = { ...input, platform: plat };
|
|
284
|
+
const platDir = path.join(monorepoDir, plat);
|
|
285
|
+
if (input.quick) {
|
|
286
|
+
prompts[plat] = await buildQuickPrompt(platInput, platDir, appName, bundleId);
|
|
287
|
+
}
|
|
288
|
+
else if (input.scratch) {
|
|
289
|
+
prompts[plat] = await buildScratchPrompt(platInput);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
prompts[plat] = await buildAgentPrompt(platInput);
|
|
293
|
+
}
|
|
294
|
+
// For create/scratch: tell the agent to write into the platform subdirectory
|
|
295
|
+
// Quick mode already has appDir baked into the prompt by buildQuickPrompt
|
|
296
|
+
if (!input.quick) {
|
|
297
|
+
prompts[plat] += `\n\n## OUTPUT DIRECTORY OVERRIDE\n\n` +
|
|
298
|
+
`IMPORTANT: This is a dual-platform build. You MUST write ALL output to \`${platDir}/\` instead of \`output/{app-name}/\`.\n` +
|
|
299
|
+
`Use "${appName}" as the app name (do NOT append the platform suffix).\n` +
|
|
300
|
+
`The app directory is: ${platDir}\n` +
|
|
301
|
+
`Reports go to: ${platDir}/reports/\n` +
|
|
302
|
+
`Tests go to: ${platDir}/tests/\n`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Run both agents in parallel
|
|
306
|
+
p.log.step(`Launching 2 parallel ${engine.name} agents (iOS + Android)...`);
|
|
307
|
+
const results = await Promise.allSettled(platforms.map((plat, idx) => {
|
|
308
|
+
const opts = {
|
|
309
|
+
// Quick mode agents don't need continuation; create/scratch agents do
|
|
310
|
+
skipContinuation: input.quick,
|
|
311
|
+
debugLogSuffix: `-${plat}`,
|
|
312
|
+
// Only the first agent cleans up MCP; the second skips to avoid killing sibling's processes
|
|
313
|
+
skipMcpCleanup: idx > 0,
|
|
314
|
+
// Distinguish parallel agents in logs and avoid spinner animation fighting
|
|
315
|
+
logPrefix: `[${plat}]`,
|
|
316
|
+
noSpinner: true,
|
|
317
|
+
};
|
|
318
|
+
return engine.run(prompts[plat], input.model, opts);
|
|
319
|
+
}));
|
|
320
|
+
// Process results
|
|
321
|
+
const platformResults = [];
|
|
322
|
+
for (let i = 0; i < platforms.length; i++) {
|
|
323
|
+
const plat = platforms[i];
|
|
324
|
+
const result = results[i];
|
|
325
|
+
if (result.status === "fulfilled") {
|
|
326
|
+
const agentResult = result.value;
|
|
327
|
+
platformResults.push({
|
|
328
|
+
platform: plat,
|
|
329
|
+
success: agentResult.success,
|
|
330
|
+
error: agentResult.error,
|
|
331
|
+
proof: agentResult.proof,
|
|
332
|
+
});
|
|
333
|
+
if (agentResult.success) {
|
|
334
|
+
p.log.success(`[${plat}] Agent completed successfully`);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
p.log.error(`[${plat}] Agent failed: ${agentResult.error}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
platformResults.push({
|
|
342
|
+
platform: plat,
|
|
343
|
+
success: false,
|
|
344
|
+
error: result.reason instanceof Error ? result.reason.message : String(result.reason),
|
|
345
|
+
});
|
|
346
|
+
p.log.error(`[${plat}] Agent crashed: ${result.reason}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// Display combined proof of work
|
|
350
|
+
for (const pr of platformResults) {
|
|
351
|
+
if (pr.proof) {
|
|
352
|
+
p.log.step(`[${pr.platform}] Proof of work:`);
|
|
353
|
+
p.log.info(` Files written: ${pr.proof.filesWritten}`);
|
|
354
|
+
p.log.info(` Files read: ${pr.proof.filesRead}`);
|
|
355
|
+
p.log.info(` Shell commands: ${pr.proof.shellCommands.length}`);
|
|
356
|
+
if (pr.proof.costUsd > 0) {
|
|
357
|
+
p.log.info(` API cost: $${pr.proof.costUsd.toFixed(4)}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Report total cost
|
|
362
|
+
const totalCost = platformResults.reduce((sum, pr) => sum + (pr.proof?.costUsd ?? 0), 0);
|
|
363
|
+
if (totalCost > 0) {
|
|
364
|
+
p.log.info(` Total API cost: $${totalCost.toFixed(4)}`);
|
|
365
|
+
}
|
|
366
|
+
// Display report summaries for each platform and collect artifact paths
|
|
367
|
+
const artifactPaths = [];
|
|
368
|
+
for (const plat of platforms) {
|
|
369
|
+
const parentDirName = path.basename(monorepoDir);
|
|
370
|
+
const reportMeta = await displayReportSummary(`${parentDirName}/${plat}`);
|
|
371
|
+
if (reportMeta.artifactPath) {
|
|
372
|
+
artifactPaths.push(reportMeta.artifactPath);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Validate each platform
|
|
376
|
+
p.log.step("Validating generated apps...");
|
|
377
|
+
let allValid = true;
|
|
378
|
+
for (const plat of platforms) {
|
|
379
|
+
const platDir = path.join(monorepoDir, plat);
|
|
380
|
+
const validation = await validateOutput(plat, platDir);
|
|
381
|
+
if (validation.valid) {
|
|
382
|
+
p.log.success(`[${plat}] Validation passed`);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
p.log.error(`[${plat}] Validation failed:`);
|
|
386
|
+
for (const err of validation.errors) {
|
|
387
|
+
p.log.error(` - ${err}`);
|
|
388
|
+
}
|
|
389
|
+
allValid = false;
|
|
390
|
+
}
|
|
391
|
+
if (validation.warnings.length > 0) {
|
|
392
|
+
for (const warn of validation.warnings) {
|
|
393
|
+
p.log.warn(` [${plat}] ${warn}`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Check if any platform failed
|
|
398
|
+
const anyFailed = platformResults.some((pr) => !pr.success);
|
|
399
|
+
if (anyFailed && !allValid) {
|
|
400
|
+
p.outro(`Dual-platform build had failures. Check output at: ${monorepoDir}`);
|
|
401
|
+
process.exit(1);
|
|
402
|
+
}
|
|
403
|
+
if (anyFailed) {
|
|
404
|
+
const failedPlatforms = platformResults.filter((pr) => !pr.success).map((pr) => pr.platform);
|
|
405
|
+
p.log.warn(`Some platforms failed: ${failedPlatforms.join(", ")}. Continuing with available results.`);
|
|
406
|
+
}
|
|
407
|
+
// Push to GitHub (monorepo) — pass first artifact (if any) for display
|
|
408
|
+
await handleGitHubPush(cliResult, cliFlags, ghAvailable, monorepoDir, artifactPaths[0]);
|
|
409
|
+
}
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
// Shared helper functions
|
|
412
|
+
// ---------------------------------------------------------------------------
|
|
413
|
+
/**
|
|
414
|
+
* Display proof-of-work summary from an agent result.
|
|
415
|
+
*/
|
|
416
|
+
function displayProofOfWork(agentResult) {
|
|
417
|
+
const { proof } = agentResult;
|
|
418
|
+
p.log.step("Proof of work:");
|
|
419
|
+
p.log.info(` Files written: ${proof.filesWritten}`);
|
|
420
|
+
p.log.info(` Files read: ${proof.filesRead}`);
|
|
421
|
+
p.log.info(` Shell commands: ${proof.shellCommands.length}`);
|
|
422
|
+
p.log.info(` MCP tool calls: ${proof.mcpCalls.length}`);
|
|
423
|
+
if (proof.costUsd > 0) {
|
|
424
|
+
p.log.info(` API cost: $${proof.costUsd.toFixed(4)}`);
|
|
425
|
+
}
|
|
426
|
+
if (proof.mcpCalls.length > 0) {
|
|
427
|
+
const mcpBuckets = {};
|
|
428
|
+
for (const call of proof.mcpCalls) {
|
|
429
|
+
mcpBuckets[call] = (mcpBuckets[call] ?? 0) + 1;
|
|
430
|
+
}
|
|
431
|
+
p.log.info(" ── MCP Breakdown ──");
|
|
432
|
+
for (const [name, count] of Object.entries(mcpBuckets)) {
|
|
433
|
+
p.log.info(` ${name}: ${count}×`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (proof.subagentCalls.length > 0) {
|
|
437
|
+
p.log.info(` Subagent delegations: ${proof.subagentCalls.join(", ")}`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Display Maestro test results from stream-based tracking.
|
|
442
|
+
*/
|
|
443
|
+
function displayMaestroResults(agentResult) {
|
|
444
|
+
const { proof } = agentResult;
|
|
445
|
+
if (proof.maestroTests.length > 0) {
|
|
446
|
+
const passed = proof.maestroTests.filter((t) => t.passed).length;
|
|
447
|
+
p.log.info(` ── Maestro Tests (stream): ${passed}/${proof.maestroTests.length} passed ──`);
|
|
448
|
+
for (const t of proof.maestroTests) {
|
|
449
|
+
const shortFile = t.file.split("/").slice(-2).join("/");
|
|
450
|
+
const status = t.passed ? "✓ PASS" : "✗ FAIL";
|
|
451
|
+
const steps = t.totalSteps > 0 ? ` (${t.stepsCompleted}/${t.totalSteps} steps)` : "";
|
|
452
|
+
p.log.info(` ${status} ${shortFile}${steps}`);
|
|
453
|
+
if (t.error) {
|
|
454
|
+
p.log.warn(` ${t.error.slice(0, 100)}`);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Handle GitHub push flow (shared between single and dual-platform builds).
|
|
461
|
+
*/
|
|
462
|
+
async function handleGitHubPush(cliResult, cliFlags, ghAvailable, appDir, artifactPath) {
|
|
463
|
+
const artifactLine = artifactPath ? `\nBuild artifact: ${artifactPath}` : "";
|
|
464
|
+
// Prepare screenshots for GitHub if available
|
|
465
|
+
if (appDir) {
|
|
466
|
+
const screenshots = collectScreenshots(appDir);
|
|
467
|
+
if (screenshots.length > 0) {
|
|
468
|
+
p.log.info(`Found ${screenshots.length} screenshot(s) — adding to README.`);
|
|
469
|
+
ensureScreenshotsGitignoreException(appDir);
|
|
470
|
+
const appName = deriveRepoName(appDir);
|
|
471
|
+
generateReadmeScreenshots(appDir, appName, screenshots);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (cliResult && cliFlags.push && appDir) {
|
|
475
|
+
if (!ghAvailable) {
|
|
476
|
+
p.log.error("Cannot push to GitHub: prerequisites not met. Run 'gh auth login' first.");
|
|
477
|
+
p.outro(`App was generated at: ${appDir}${artifactLine}`);
|
|
478
|
+
process.exit(1);
|
|
479
|
+
}
|
|
480
|
+
const repoName = cliFlags.repoName || deriveRepoName(appDir);
|
|
481
|
+
const ghResult = await pushToGitHub(appDir, repoName);
|
|
482
|
+
if (ghResult.success) {
|
|
483
|
+
p.outro(`Done! Your app is at: ${ghResult.repoUrl}${artifactLine}`);
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
p.log.error(`GitHub push failed: ${ghResult.error}`);
|
|
487
|
+
p.outro(`App was generated at: ${appDir}${artifactLine}\nPush manually with: cd ${appDir} && gh repo create`);
|
|
488
|
+
process.exit(1);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
else if (cliResult) {
|
|
492
|
+
p.outro(`Done! Your app is at: ${appDir ?? PATHS.output}${artifactLine}`);
|
|
493
|
+
}
|
|
494
|
+
else if (ghAvailable && appDir) {
|
|
495
|
+
const shouldPush = await p.confirm({ message: "Push to GitHub?" });
|
|
496
|
+
if (!p.isCancel(shouldPush) && shouldPush) {
|
|
497
|
+
const repoName = deriveRepoName(appDir);
|
|
498
|
+
const customName = await p.text({
|
|
499
|
+
message: "Repository name:",
|
|
500
|
+
initialValue: repoName,
|
|
501
|
+
placeholder: repoName,
|
|
502
|
+
});
|
|
503
|
+
if (p.isCancel(customName)) {
|
|
504
|
+
p.cancel("GitHub push skipped.");
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
const ghResult = await pushToGitHub(appDir, customName || repoName);
|
|
508
|
+
if (ghResult.success) {
|
|
509
|
+
p.outro(`Done! Your app is at: ${ghResult.repoUrl}${artifactLine}`);
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
p.log.error(`GitHub push failed: ${ghResult.error}`);
|
|
513
|
+
p.outro(`App was generated at: ${appDir}${artifactLine}\nPush manually with: cd ${appDir} && gh repo create`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
p.outro(`Done! Your app is at: ${appDir}${artifactLine}`);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
p.outro(`Done! Your app is at: ${appDir ?? PATHS.output}${artifactLine}`);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Run UI testing on a previously built app.
|
|
527
|
+
* Resolves app context, builds a test-only prompt, and launches the agent engine.
|
|
528
|
+
*/
|
|
529
|
+
async function testApp(appName, engineOverride, modelOverride) {
|
|
530
|
+
p.intro(`AppAgent — Test: ${appName}`);
|
|
531
|
+
// ── Resolve app context ─────────────────────────────────────────────
|
|
532
|
+
const ctx = await resolveAppContext(appName);
|
|
533
|
+
p.log.info(`App: ${ctx.appName}`);
|
|
534
|
+
p.log.info(`Platform: ${ctx.platform}`);
|
|
535
|
+
p.log.info(`Bundle: ${ctx.bundleId}`);
|
|
536
|
+
if (ctx.artifactPath) {
|
|
537
|
+
p.log.info(`Artifact: ${ctx.artifactPath}`);
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
p.log.warn("Build artifact not found — agent will rebuild before testing.");
|
|
541
|
+
}
|
|
542
|
+
if (ctx.manifestContent) {
|
|
543
|
+
p.log.info("Manifest: found (parallel batch testing enabled)");
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
p.log.warn("No customization manifest — agent will use single-simulator testing.");
|
|
547
|
+
}
|
|
548
|
+
// ── Determine engine and model ──────────────────────────────────────
|
|
549
|
+
const selectedEngine = engineOverride ?? DEFAULT_ENGINE;
|
|
550
|
+
const selectedModel = modelOverride ?? DEFAULT_MODEL;
|
|
551
|
+
const engine = createEngine(selectedEngine);
|
|
552
|
+
// ── Pre-flight check ────────────────────────────────────────────────
|
|
553
|
+
const agentCheck = await engine.checkInstallation();
|
|
554
|
+
if (!agentCheck.ok) {
|
|
555
|
+
p.log.error(agentCheck.error);
|
|
556
|
+
process.exit(1);
|
|
557
|
+
}
|
|
558
|
+
p.log.info(`Engine: ${engine.name}`);
|
|
559
|
+
p.log.info(`Model: ${selectedModel}`);
|
|
560
|
+
// ── Scaffold workspace (npx mode) ───────────────────────────────────
|
|
561
|
+
await scaffoldWorkspace();
|
|
562
|
+
// ── Build test-only prompt ──────────────────────────────────────────
|
|
563
|
+
const prompt = await buildTestPrompt(ctx);
|
|
564
|
+
p.log.info("Test prompt built successfully.");
|
|
565
|
+
// ── Run the agent engine ────────────────────────────────────────────
|
|
566
|
+
p.log.step(`Launching ${engine.name} agent for UI testing...`);
|
|
567
|
+
const agentResult = await engine.run(prompt, selectedModel);
|
|
568
|
+
if (!agentResult.success) {
|
|
569
|
+
p.log.error(`Agent failed: ${agentResult.error}`);
|
|
570
|
+
p.outro("UI testing did not complete successfully. Check the output directory for partial results.");
|
|
571
|
+
process.exit(1);
|
|
572
|
+
}
|
|
573
|
+
// ── Proof of work summary ──────────────────────────────────────────
|
|
574
|
+
const { proof } = agentResult;
|
|
575
|
+
p.log.step("Proof of work:");
|
|
576
|
+
p.log.info(` Files written: ${proof.filesWritten}`);
|
|
577
|
+
p.log.info(` Files read: ${proof.filesRead}`);
|
|
578
|
+
p.log.info(` Shell commands: ${proof.shellCommands.length}`);
|
|
579
|
+
p.log.info(` MCP tool calls: ${proof.mcpCalls.length}`);
|
|
580
|
+
if (proof.costUsd > 0) {
|
|
581
|
+
p.log.info(` API cost: $${proof.costUsd.toFixed(4)}`);
|
|
582
|
+
}
|
|
583
|
+
if (proof.mcpCalls.length > 0) {
|
|
584
|
+
const mcpBuckets = {};
|
|
585
|
+
for (const call of proof.mcpCalls) {
|
|
586
|
+
mcpBuckets[call] = (mcpBuckets[call] ?? 0) + 1;
|
|
587
|
+
}
|
|
588
|
+
p.log.info(" ── MCP Breakdown ──");
|
|
589
|
+
for (const [name, count] of Object.entries(mcpBuckets)) {
|
|
590
|
+
p.log.info(` ${name}: ${count}×`);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
if (proof.subagentCalls.length > 0) {
|
|
594
|
+
p.log.info(` Subagent delegations: ${proof.subagentCalls.join(", ")}`);
|
|
595
|
+
}
|
|
596
|
+
// ── Report-based summary ───────────────────────────────────────────
|
|
597
|
+
await displayReportSummary(appName);
|
|
598
|
+
// Stream-based Maestro test results
|
|
599
|
+
if (proof.maestroTests.length > 0) {
|
|
600
|
+
const passed = proof.maestroTests.filter((t) => t.passed).length;
|
|
601
|
+
p.log.info(` ── Maestro Tests (stream): ${passed}/${proof.maestroTests.length} passed ──`);
|
|
602
|
+
for (const t of proof.maestroTests) {
|
|
603
|
+
const shortFile = t.file.split("/").slice(-2).join("/");
|
|
604
|
+
const status = t.passed ? "✓ PASS" : "✗ FAIL";
|
|
605
|
+
const steps = t.totalSteps > 0 ? ` (${t.stepsCompleted}/${t.totalSteps} steps)` : "";
|
|
606
|
+
p.log.info(` ${status} ${shortFile}${steps}`);
|
|
607
|
+
if (t.error) {
|
|
608
|
+
p.log.warn(` ${t.error.slice(0, 100)}`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
p.outro(`UI testing complete for: ${ctx.dirPath}`);
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Update an existing app: resolve source, run agent, commit, and optionally create a PR.
|
|
616
|
+
*/
|
|
617
|
+
async function updateApp(input, engine, ghAvailable) {
|
|
618
|
+
p.intro("AppAgent — Update existing app");
|
|
619
|
+
// ── Resolve update context ───────────────────────────────────────────
|
|
620
|
+
p.log.step("Resolving update source...");
|
|
621
|
+
const updateCtx = await resolveUpdateContext(input.updateTarget, input.description);
|
|
622
|
+
// ── Scaffold workspace (npx mode) ────────────────────────────────────
|
|
623
|
+
await scaffoldWorkspace();
|
|
624
|
+
// ── Build update prompt ──────────────────────────────────────────────
|
|
625
|
+
const prompt = await buildUpdatePrompt(updateCtx);
|
|
626
|
+
p.log.info("Update prompt built successfully.");
|
|
627
|
+
// ── Run the agent engine ─────────────────────────────────────────────
|
|
628
|
+
p.log.step(`Launching ${engine.name} agent for update...`);
|
|
629
|
+
// Update mode doesn't produce reports/ — skip the continuation loop
|
|
630
|
+
const agentResult = await engine.run(prompt, input.model, { skipContinuation: true });
|
|
631
|
+
if (!agentResult.success) {
|
|
632
|
+
p.log.error(`Agent failed: ${agentResult.error}`);
|
|
633
|
+
p.outro("The agent did not complete successfully. Check the app directory for partial changes.");
|
|
634
|
+
process.exit(1);
|
|
635
|
+
}
|
|
636
|
+
// ── Proof of work summary ────────────────────────────────────────────
|
|
637
|
+
const { proof } = agentResult;
|
|
638
|
+
p.log.step("Proof of work:");
|
|
639
|
+
p.log.info(` Files written: ${proof.filesWritten}`);
|
|
640
|
+
p.log.info(` Files read: ${proof.filesRead}`);
|
|
641
|
+
p.log.info(` Shell commands: ${proof.shellCommands.length}`);
|
|
642
|
+
p.log.info(` MCP tool calls: ${proof.mcpCalls.length}`);
|
|
643
|
+
if (proof.costUsd > 0) {
|
|
644
|
+
p.log.info(` API cost: $${proof.costUsd.toFixed(4)}`);
|
|
645
|
+
}
|
|
646
|
+
// ── Collect screenshots & prepare gitignore ──────────────────────────
|
|
647
|
+
const screenshots = collectScreenshots(updateCtx.appDir);
|
|
648
|
+
if (screenshots.length > 0) {
|
|
649
|
+
p.log.info(`Found ${screenshots.length} screenshot(s) for GitHub.`);
|
|
650
|
+
ensureScreenshotsGitignoreException(updateCtx.appDir);
|
|
651
|
+
}
|
|
652
|
+
// ── Commit changes ───────────────────────────────────────────────────
|
|
653
|
+
const isRepo = await isGitRepo(updateCtx.appDir);
|
|
654
|
+
if (isRepo) {
|
|
655
|
+
const commitMsg = `AppAgent: ${updateCtx.changeDescription}`;
|
|
656
|
+
p.log.step("Committing changes...");
|
|
657
|
+
const commitResult = await commitChanges(updateCtx.appDir, commitMsg);
|
|
658
|
+
if (commitResult.success) {
|
|
659
|
+
p.log.info("Changes committed.");
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
p.log.warn(`Could not commit: ${commitResult.error}`);
|
|
663
|
+
}
|
|
664
|
+
// ── Push and create PR (for GitHub sources or if remote exists) ────
|
|
665
|
+
const hasRemote = await hasRemoteOrigin(updateCtx.appDir);
|
|
666
|
+
if (hasRemote && ghAvailable && commitResult.success) {
|
|
667
|
+
// Auto-create PR for GitHub-cloned repos
|
|
668
|
+
if (updateCtx.sourceType === "github") {
|
|
669
|
+
p.log.step("Pushing branch and creating pull request...");
|
|
670
|
+
const pushResult = await pushBranch(updateCtx.appDir);
|
|
671
|
+
if (pushResult.success) {
|
|
672
|
+
p.log.info(`Branch pushed: ${updateCtx.branchName}`);
|
|
673
|
+
const prTitle = `AppAgent: ${updateCtx.changeDescription}`;
|
|
674
|
+
const basePrBody = [
|
|
675
|
+
"## Summary",
|
|
676
|
+
"",
|
|
677
|
+
`This PR was generated by AppAgent in Update mode.`,
|
|
678
|
+
"",
|
|
679
|
+
`**Change request:** ${updateCtx.changeDescription}`,
|
|
680
|
+
"",
|
|
681
|
+
`**Branch:** \`${updateCtx.branchName}\``,
|
|
682
|
+
`**Platform:** ${updateCtx.platform === "ios" ? "iOS" : "Android"}`,
|
|
683
|
+
updateCtx.isAppAgentApp ? `**Template:** ${updateCtx.template ?? "unknown"}` : "",
|
|
684
|
+
].filter(Boolean).join("\n");
|
|
685
|
+
const prBody = screenshots.length > 0 && updateCtx.repoUrl
|
|
686
|
+
? buildPrBodyWithScreenshots(basePrBody, updateCtx.repoUrl, updateCtx.branchName, screenshots)
|
|
687
|
+
: basePrBody;
|
|
688
|
+
const prResult = await createPullRequest(updateCtx.appDir, prTitle, prBody);
|
|
689
|
+
if (prResult.success) {
|
|
690
|
+
p.outro(`Done! Pull request created: ${prResult.prUrl}`);
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
p.log.warn(`PR creation failed: ${prResult.error}`);
|
|
694
|
+
p.outro(`Changes committed on branch: ${updateCtx.branchName}\n` +
|
|
695
|
+
`Create a PR manually: cd ${updateCtx.appDir} && gh pr create`);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
p.log.warn(`Push failed: ${pushResult.error}`);
|
|
700
|
+
p.outro(`Changes committed locally on branch: ${updateCtx.branchName}\n` +
|
|
701
|
+
`Push manually: cd ${updateCtx.appDir} && git push -u origin HEAD`);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
// Local source with a remote — offer to push and create PR
|
|
706
|
+
const shouldPush = await p.confirm({
|
|
707
|
+
message: "Push changes and create a pull request?",
|
|
708
|
+
});
|
|
709
|
+
if (!p.isCancel(shouldPush) && shouldPush) {
|
|
710
|
+
const pushResult = await pushBranch(updateCtx.appDir);
|
|
711
|
+
if (pushResult.success) {
|
|
712
|
+
const prTitle = `AppAgent: ${updateCtx.changeDescription}`;
|
|
713
|
+
const basePrBody = [
|
|
714
|
+
"## Summary",
|
|
715
|
+
"",
|
|
716
|
+
`This PR was generated by AppAgent in Update mode.`,
|
|
717
|
+
"",
|
|
718
|
+
`**Change request:** ${updateCtx.changeDescription}`,
|
|
719
|
+
].join("\n");
|
|
720
|
+
// For local repos with a remote, try to get the repo URL for screenshot embedding
|
|
721
|
+
let repoUrl;
|
|
722
|
+
try {
|
|
723
|
+
const { stdout } = await import("execa").then((m) => m.execa("git", ["remote", "get-url", "origin"], { cwd: updateCtx.appDir }));
|
|
724
|
+
repoUrl = stdout.trim();
|
|
725
|
+
}
|
|
726
|
+
catch {
|
|
727
|
+
// No remote URL — skip screenshot embedding
|
|
728
|
+
}
|
|
729
|
+
const prBody = screenshots.length > 0 && repoUrl
|
|
730
|
+
? buildPrBodyWithScreenshots(basePrBody, repoUrl, updateCtx.branchName, screenshots)
|
|
731
|
+
: basePrBody;
|
|
732
|
+
const prResult = await createPullRequest(updateCtx.appDir, prTitle, prBody);
|
|
733
|
+
if (prResult.success) {
|
|
734
|
+
p.outro(`Done! Pull request created: ${prResult.prUrl}`);
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
p.log.warn(`PR creation failed: ${prResult.error}`);
|
|
738
|
+
p.outro(`Changes pushed to branch: ${updateCtx.branchName}`);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
p.log.warn(`Push failed: ${pushResult.error}`);
|
|
743
|
+
p.outro(`Changes committed locally on branch: ${updateCtx.branchName}`);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
else {
|
|
747
|
+
p.outro(`Done! Changes committed on branch: ${updateCtx.branchName}\n` +
|
|
748
|
+
`App directory: ${updateCtx.appDir}`);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
else {
|
|
753
|
+
p.outro(`Done! Changes committed on branch: ${updateCtx.branchName}\n` +
|
|
754
|
+
`App directory: ${updateCtx.appDir}`);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
p.outro(`Done! Changes applied to: ${updateCtx.appDir}`);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
async function displayReportSummary(targetApp) {
|
|
762
|
+
const result = {};
|
|
763
|
+
try {
|
|
764
|
+
let appDirs;
|
|
765
|
+
if (targetApp) {
|
|
766
|
+
appDirs = [targetApp];
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
const outputEntries = await fs.readdir(PATHS.output).catch(() => []);
|
|
770
|
+
appDirs = outputEntries.filter((e) => !e.startsWith(".") && !e.startsWith("_"));
|
|
771
|
+
}
|
|
772
|
+
for (const appDir of appDirs) {
|
|
773
|
+
const summaryPath = `${PATHS.output}/${appDir}/reports/summary.json`;
|
|
774
|
+
if (!(await fs.pathExists(summaryPath)))
|
|
775
|
+
continue;
|
|
776
|
+
const raw = await fs.readFile(summaryPath, "utf-8");
|
|
777
|
+
const summary = JSON.parse(raw);
|
|
778
|
+
// Extract artifact path from build step (field names vary across agent runs)
|
|
779
|
+
const buildStep = summary.steps?.find((s) => s.name === "build");
|
|
780
|
+
const artifactPath = buildStep?.artifactPath ??
|
|
781
|
+
buildStep?.["buildArtifact"] ??
|
|
782
|
+
summary["buildArtifactPath"] ??
|
|
783
|
+
summary["buildArtifact"];
|
|
784
|
+
if (artifactPath && (await fs.pathExists(artifactPath))) {
|
|
785
|
+
result.artifactPath = artifactPath;
|
|
786
|
+
}
|
|
787
|
+
result.platform = summary.platform;
|
|
788
|
+
result.bundleId = summary.bundleId;
|
|
789
|
+
p.log.step("── Agent Report Summary (from summary.json) ──");
|
|
790
|
+
if (summary.appName) {
|
|
791
|
+
p.log.info(` App: ${summary.appName}`);
|
|
792
|
+
}
|
|
793
|
+
if (summary.template) {
|
|
794
|
+
p.log.info(` Template: ${summary.template}`);
|
|
795
|
+
}
|
|
796
|
+
if (summary.designBrand) {
|
|
797
|
+
p.log.info(` Brand: ${summary.designBrand}`);
|
|
798
|
+
}
|
|
799
|
+
if (summary.overallResult) {
|
|
800
|
+
const icon = summary.overallResult === "PASS" ? "✓" : "✗";
|
|
801
|
+
p.log.info(` Result: ${icon} ${summary.overallResult}`);
|
|
802
|
+
}
|
|
803
|
+
if (summary.duration) {
|
|
804
|
+
p.log.info(` Duration: ${summary.duration}`);
|
|
805
|
+
}
|
|
806
|
+
if (summary.totalCostUsd != null && summary.totalCostUsd > 0) {
|
|
807
|
+
p.log.info(` Cost: $${summary.totalCostUsd.toFixed(4)}`);
|
|
808
|
+
}
|
|
809
|
+
// Display per-step results
|
|
810
|
+
if (summary.steps && summary.steps.length > 0) {
|
|
811
|
+
p.log.info(" ── Steps ──");
|
|
812
|
+
for (const step of summary.steps) {
|
|
813
|
+
const icon = step.result === "PASS" || step.result === "SUCCESS" ? "✓" : step.result === "SKIPPED" ? "–" : "✗";
|
|
814
|
+
const extras = [];
|
|
815
|
+
// Add step-specific details
|
|
816
|
+
if ("template" in step && step.template)
|
|
817
|
+
extras.push(`template: ${step.template}`);
|
|
818
|
+
if ("brand" in step && step.brand)
|
|
819
|
+
extras.push(`brand: ${step.brand}`);
|
|
820
|
+
if ("artifactPath" in step && step.artifactPath)
|
|
821
|
+
extras.push("artifact found");
|
|
822
|
+
if ("maestroTests" in step) {
|
|
823
|
+
const mt = step.maestroTests;
|
|
824
|
+
if (mt?.total)
|
|
825
|
+
extras.push(`maestro: ${mt.passed ?? 0}/${mt.total}`);
|
|
826
|
+
}
|
|
827
|
+
if ("criticalFindings" in step && step.criticalFindings > 0) {
|
|
828
|
+
extras.push(`critical: ${step.criticalFindings}`);
|
|
829
|
+
}
|
|
830
|
+
// Format step duration
|
|
831
|
+
if (step.durationSeconds != null) {
|
|
832
|
+
const mins = Math.floor(step.durationSeconds / 60);
|
|
833
|
+
const secs = step.durationSeconds % 60;
|
|
834
|
+
const timeStr = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
|
|
835
|
+
extras.push(timeStr);
|
|
836
|
+
}
|
|
837
|
+
const detail = extras.length > 0 ? ` (${extras.join(", ")})` : "";
|
|
838
|
+
p.log.info(` ${icon} Step ${step.step}: ${step.name} — ${step.result}${detail}`);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// Display build artifact prominently
|
|
842
|
+
if (result.artifactPath) {
|
|
843
|
+
const ext = path.extname(result.artifactPath);
|
|
844
|
+
const artifactType = ext === ".app" ? "iOS App (.app)" :
|
|
845
|
+
ext === ".ipa" ? "iOS Archive (.ipa)" :
|
|
846
|
+
ext === ".apk" ? "Android APK (.apk)" :
|
|
847
|
+
ext === ".aab" ? "Android Bundle (.aab)" :
|
|
848
|
+
`Build Artifact (${ext})`;
|
|
849
|
+
p.log.info(" ── Build Artifact ──");
|
|
850
|
+
p.log.success(` ${artifactType}: ${result.artifactPath}`);
|
|
851
|
+
}
|
|
852
|
+
// List report files
|
|
853
|
+
const reportsDir = `${PATHS.output}/${appDir}/reports`;
|
|
854
|
+
if (await fs.pathExists(reportsDir)) {
|
|
855
|
+
const reportFiles = (await fs.readdir(reportsDir)).filter((f) => f.endsWith(".md"));
|
|
856
|
+
if (reportFiles.length > 0) {
|
|
857
|
+
p.log.info(` ── Report Files (${reportFiles.length}) ──`);
|
|
858
|
+
for (const f of reportFiles) {
|
|
859
|
+
p.log.info(` ${reportsDir}/${f}`);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
// Only process the first app dir
|
|
864
|
+
break;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
catch {
|
|
868
|
+
// summary.json not found or malformed — fall back to stream-based tracking
|
|
869
|
+
}
|
|
870
|
+
return result;
|
|
871
|
+
}
|
|
872
|
+
/**
|
|
873
|
+
* Derive a kebab-case app name from the user's description.
|
|
874
|
+
* Extracts key words and produces something like "pet-grooming-ios".
|
|
875
|
+
*/
|
|
876
|
+
function deriveAppName(description) {
|
|
877
|
+
// Try to extract an explicit app name (e.g., "called PawSpa", "named FooBar")
|
|
878
|
+
const namedMatch = description.match(/(?:called|named)\s+["']?(\w+)["']?/i);
|
|
879
|
+
let baseName;
|
|
880
|
+
if (namedMatch) {
|
|
881
|
+
baseName = namedMatch[1];
|
|
882
|
+
}
|
|
883
|
+
else {
|
|
884
|
+
// Take the first few meaningful words from the description
|
|
885
|
+
const stopWords = new Set(["a", "an", "the", "and", "or", "for", "with", "to", "of", "in", "on", "app", "application"]);
|
|
886
|
+
const words = description
|
|
887
|
+
.toLowerCase()
|
|
888
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
889
|
+
.split(/\s+/)
|
|
890
|
+
.filter((w) => w.length > 1 && !stopWords.has(w))
|
|
891
|
+
.slice(0, 3);
|
|
892
|
+
baseName = words.join("-") || "my-app";
|
|
893
|
+
}
|
|
894
|
+
// Convert to kebab-case
|
|
895
|
+
const kebab = baseName
|
|
896
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2")
|
|
897
|
+
.toLowerCase()
|
|
898
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
899
|
+
.replace(/^-|-$/g, "");
|
|
900
|
+
return kebab || "my-app";
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* Derive a PascalCase display name from a kebab-case app name.
|
|
904
|
+
* e.g., "pet-grooming" -> "PetGrooming", "pawspa" -> "Pawspa"
|
|
905
|
+
*/
|
|
906
|
+
function deriveDisplayName(appName) {
|
|
907
|
+
return appName
|
|
908
|
+
.split("-")
|
|
909
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
910
|
+
.join("");
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Derive a reverse-domain bundle ID from a kebab-case app name.
|
|
914
|
+
* e.g., "pet-grooming" -> "com.appship.petgrooming"
|
|
915
|
+
*/
|
|
916
|
+
function deriveBundleId(appName) {
|
|
917
|
+
const cleaned = appName.replace(/-/g, "").toLowerCase();
|
|
918
|
+
return `com.appship.${cleaned}`;
|
|
919
|
+
}
|
|
920
|
+
main()
|
|
921
|
+
.catch((err) => {
|
|
922
|
+
p.log.error(`Unexpected error: ${err instanceof Error ? err.message : err}`);
|
|
923
|
+
process.exit(1);
|
|
924
|
+
})
|
|
925
|
+
.finally(() => {
|
|
926
|
+
// Clean up scaffolded workspace symlinks and files (npx mode)
|
|
927
|
+
cleanupWorkspace().catch(() => { });
|
|
928
|
+
});
|
|
929
|
+
//# sourceMappingURL=index.js.map
|