appfactory 0.1.0__tar.gz
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.
- appfactory-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +21 -0
- appfactory-0.1.0/.github/ISSUE_TEMPLATE/config.yml +1 -0
- appfactory-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +15 -0
- appfactory-0.1.0/.github/workflows/ci.yml +46 -0
- appfactory-0.1.0/.github/workflows/release.yml +19 -0
- appfactory-0.1.0/.gitignore +33 -0
- appfactory-0.1.0/.gitleaks.toml +6 -0
- appfactory-0.1.0/.mcp.json +40 -0
- appfactory-0.1.0/.python-version +1 -0
- appfactory-0.1.0/AGENTS.md +13 -0
- appfactory-0.1.0/CONTRIBUTING.md +34 -0
- appfactory-0.1.0/GEMINI.md +1 -0
- appfactory-0.1.0/LICENSE +21 -0
- appfactory-0.1.0/PKG-INFO +121 -0
- appfactory-0.1.0/README.md +95 -0
- appfactory-0.1.0/SECURITY.md +36 -0
- appfactory-0.1.0/docs/PIPELINE_PLAYBOOK.md +275 -0
- appfactory-0.1.0/docs/SETUP.md +65 -0
- appfactory-0.1.0/docs/TOOLS.md +319 -0
- appfactory-0.1.0/docs/gen_tools.py +38 -0
- appfactory-0.1.0/pyproject.toml +61 -0
- appfactory-0.1.0/server.json +19 -0
- appfactory-0.1.0/src/appfactory/__init__.py +3 -0
- appfactory-0.1.0/src/appfactory/ai.py +275 -0
- appfactory-0.1.0/src/appfactory/animation.py +164 -0
- appfactory-0.1.0/src/appfactory/app.py +679 -0
- appfactory-0.1.0/src/appfactory/approvals.py +149 -0
- appfactory-0.1.0/src/appfactory/asc.py +705 -0
- appfactory-0.1.0/src/appfactory/asc_cli.py +222 -0
- appfactory-0.1.0/src/appfactory/aso.py +604 -0
- appfactory-0.1.0/src/appfactory/bin/maestro-live +227 -0
- appfactory-0.1.0/src/appfactory/build.py +114 -0
- appfactory-0.1.0/src/appfactory/cli.py +263 -0
- appfactory-0.1.0/src/appfactory/config.py +376 -0
- appfactory-0.1.0/src/appfactory/cpp.py +56 -0
- appfactory-0.1.0/src/appfactory/data/generic_localizations.json +3980 -0
- appfactory-0.1.0/src/appfactory/data/playbook.md +236 -0
- appfactory-0.1.0/src/appfactory/data/setup.html +117 -0
- appfactory-0.1.0/src/appfactory/deliver.py +340 -0
- appfactory-0.1.0/src/appfactory/design/__init__.py +317 -0
- appfactory-0.1.0/src/appfactory/design/brand.py +220 -0
- appfactory-0.1.0/src/appfactory/design/dc.py +238 -0
- appfactory-0.1.0/src/appfactory/design/export.py +65 -0
- appfactory-0.1.0/src/appfactory/design/main_app.py +433 -0
- appfactory-0.1.0/src/appfactory/design/mascot_boards.py +184 -0
- appfactory-0.1.0/src/appfactory/design/onboarding.py +878 -0
- appfactory-0.1.0/src/appfactory/design/pricing.py +80 -0
- appfactory-0.1.0/src/appfactory/design/receipt.py +116 -0
- appfactory-0.1.0/src/appfactory/design/research.py +460 -0
- appfactory-0.1.0/src/appfactory/design/rules.py +78 -0
- appfactory-0.1.0/src/appfactory/design/screens.py +472 -0
- appfactory-0.1.0/src/appfactory/design/theme.py +172 -0
- appfactory-0.1.0/src/appfactory/firebase.py +116 -0
- appfactory-0.1.0/src/appfactory/gates.py +1530 -0
- appfactory-0.1.0/src/appfactory/github.py +69 -0
- appfactory-0.1.0/src/appfactory/growth.py +113 -0
- appfactory-0.1.0/src/appfactory/icon.py +115 -0
- appfactory-0.1.0/src/appfactory/ideas.py +428 -0
- appfactory-0.1.0/src/appfactory/issues.py +136 -0
- appfactory-0.1.0/src/appfactory/legal.py +228 -0
- appfactory-0.1.0/src/appfactory/localize.py +138 -0
- appfactory-0.1.0/src/appfactory/maestro.py +330 -0
- appfactory-0.1.0/src/appfactory/mascot.py +201 -0
- appfactory-0.1.0/src/appfactory/metadata.py +439 -0
- appfactory-0.1.0/src/appfactory/options.py +318 -0
- appfactory-0.1.0/src/appfactory/orchestrator.py +144 -0
- appfactory-0.1.0/src/appfactory/pipeline.py +271 -0
- appfactory-0.1.0/src/appfactory/preview.py +454 -0
- appfactory-0.1.0/src/appfactory/proc.py +24 -0
- appfactory-0.1.0/src/appfactory/revenuecat.py +171 -0
- appfactory-0.1.0/src/appfactory/sbp.py +158 -0
- appfactory-0.1.0/src/appfactory/screenshot.py +329 -0
- appfactory-0.1.0/src/appfactory/server.py +1674 -0
- appfactory-0.1.0/src/appfactory/setup_gui.py +268 -0
- appfactory-0.1.0/src/appfactory/setup_tools.py +115 -0
- appfactory-0.1.0/src/appfactory/signing.py +287 -0
- appfactory-0.1.0/src/appfactory/spec.py +470 -0
- appfactory-0.1.0/src/appfactory/store_setup.py +1677 -0
- appfactory-0.1.0/src/appfactory/storekit.py +213 -0
- appfactory-0.1.0/src/appfactory/supabase.py +310 -0
- appfactory-0.1.0/src/appfactory/team.py +172 -0
- appfactory-0.1.0/templates/docs/CHECKLIST.md +86 -0
- appfactory-0.1.0/templates/docs/aso-research.md +60 -0
- appfactory-0.1.0/templates/docs/onboarding-plan.md +53 -0
- appfactory-0.1.0/templates/swiftui-subscription/.gitignore +6 -0
- appfactory-0.1.0/templates/swiftui-subscription/.maestro/config.yaml +11 -0
- appfactory-0.1.0/templates/swiftui-subscription/.maestro/flows/smoke_onboarding_paywall.yaml +89 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/AccentColor.colorset/Contents.json +4 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +4 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/Contents.json +1 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/Mascot/Contents.json +4 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/InfoPlist.xcstrings +132 -0
- appfactory-0.1.0/templates/swiftui-subscription/Resources/Localizable.xcstrings +7507 -0
- appfactory-0.1.0/templates/swiftui-subscription/Scripts/sim_store_prep.sh +59 -0
- appfactory-0.1.0/templates/swiftui-subscription/Scripts/sync_strings.py +46 -0
- appfactory-0.1.0/templates/swiftui-subscription/Scripts/translations.py +464 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/App/App.swift +116 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/App/AppConfig.swift +179 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/App/LaunchOptions.swift +52 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AIService.swift +91 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/Analytics.swift +193 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AnalyticsGate.swift +77 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AuthProvider.swift +118 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/LocalUsageGate.swift +21 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/Proxy.swift +147 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/RatingPolicy.swift +171 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/StoreManager.swift +512 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/SupabaseAuth.swift +292 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Credits/CreditManager.swift +80 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Credits/TopUpSheet.swift +245 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/Controls.swift +426 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/MascotView.swift +393 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/Motion.swift +282 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/DesignSystem.swift +193 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Health/HealthStore.swift +270 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/GenerationFlow.swift +414 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/GenerationStore.swift +137 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/RootTabView.swift +443 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/BirthYears.swift +44 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/Units.swift +72 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/UserProfile.swift +118 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingModel.swift +133 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingSteps.swift +230 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingView.swift +192 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/Screens/StepScreens.swift +363 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/HardPaywallView.swift +241 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/OfferPaywallView.swift +211 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallComponents.swift +257 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallPersonalization.swift +58 -0
- appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallPricing.swift +302 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/AnalyticsGateTests.swift +52 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/BillingTests.swift +113 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/HealthTests.swift +52 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/LocalizationCompletenessTests.swift +121 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/OnboardingTests.swift +186 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/PaywallTests.swift +191 -0
- appfactory-0.1.0/templates/swiftui-subscription/Tests/RatingPolicyTests.swift +131 -0
- appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAudit.swift +379 -0
- appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAuditRuleTests.swift +56 -0
- appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAuditUITests.swift +66 -0
- appfactory-0.1.0/templates/swiftui-subscription/UITests/LocalizationUITests.swift +36 -0
- appfactory-0.1.0/templates/swiftui-subscription/UITests/OnboardingFlowUITests.swift +115 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/CONTRACT.md +201 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/EVAL.md +50 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/PRIVACY.md +74 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/README.md +72 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/.gitignore +3 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/data/cases.json +9 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/prepare.ts +68 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/run.ts +188 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score.ts +106 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score_app.ts +28 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score_test.ts +119 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/legal/build.ts +158 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/legal/build_test.ts +89 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/legal/verify.ts +47 -0
- appfactory-0.1.0/templates/swiftui-subscription/backend/smoke/smoke.ts +136 -0
- appfactory-0.1.0/templates/swiftui-subscription/marketing/preview/README.md +16 -0
- appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/build.mjs +188 -0
- appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/config.json +6 -0
- appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/package.json +7 -0
- appfactory-0.1.0/templates/swiftui-subscription/project.yml +162 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/CHECKLIST.md +88 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/metadata/listing.json +209 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/pricing.md +96 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/privacy/privacy-policy.en.md +130 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/privacy/support.en.md +21 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/privacy/terms.en.md +105 -0
- appfactory-0.1.0/templates/swiftui-subscription/store/review-notes.md +59 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/.gitignore +2 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/config.toml +48 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/deno.json +9 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/deno.lock +101 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/analysis.ts +119 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/app.gen.ts +14 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/config.ts +64 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/credits.ts +172 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/credits_rc.ts +64 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/entitlement.ts +58 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/http.ts +48 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/llm.ts +176 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/locale.ts +108 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/rc.ts +100 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/store.ts +132 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/usage.ts +132 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/ai-proxy/index.ts +146 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/analyze/handler.ts +204 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/analyze/index.ts +25 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/delete-account/handler.ts +37 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/delete-account/index.ts +18 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/content.gen.ts +8 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/handler.ts +77 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/index.ts +6 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/cancellation.json +14 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/initial_purchase.json +15 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/trial_started.json +14 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/index.ts +18 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/map.ts +36 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/map_test.ts +21 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/usage-status/handler.ts +34 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/usage-status/index.ts +22 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0001_core.sql +118 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0002_analytics.sql +105 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0003_consent.sql +25 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0004_calendar_caps.sql +50 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0005_events_revenue.sql +61 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0001_ai_usage.sql +11 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0002_events.sql +14 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0003_credits.sql +84 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0004_adops.sql +43 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/analyze_test.ts +375 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/calendar_caps_db_test.ts +71 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/db_harness.ts +76 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/db_test.ts +215 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/delete_account_test.ts +39 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/fakes.ts +153 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/legal_test.ts +60 -0
- appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/shared_test.ts +355 -0
- appfactory-0.1.0/templates/team/TEAM.md +118 -0
- appfactory-0.1.0/templates/team/backend.md +15 -0
- appfactory-0.1.0/templates/team/ios.md +20 -0
- appfactory-0.1.0/templates/team/store.md +20 -0
- appfactory-0.1.0/tests/asc_fake.py +77 -0
- appfactory-0.1.0/tests/backend_fixtures.py +79 -0
- appfactory-0.1.0/tests/conftest.py +36 -0
- appfactory-0.1.0/tests/design_fixtures.py +153 -0
- appfactory-0.1.0/tests/fixtures/asa_report.json +20 -0
- appfactory-0.1.0/tests/fixtures/maestro/junit_mixed.xml +12 -0
- appfactory-0.1.0/tests/fixtures/revenue_events.json +7 -0
- appfactory-0.1.0/tests/fixtures/scaffold_golden.json +376 -0
- appfactory-0.1.0/tests/test_ai_flag.py +121 -0
- appfactory-0.1.0/tests/test_analytics_gate.py +51 -0
- appfactory-0.1.0/tests/test_app_scaffold.py +293 -0
- appfactory-0.1.0/tests/test_approval_gating.py +98 -0
- appfactory-0.1.0/tests/test_asc_cli.py +302 -0
- appfactory-0.1.0/tests/test_backend_wp.py +469 -0
- appfactory-0.1.0/tests/test_cli.py +79 -0
- appfactory-0.1.0/tests/test_cpp.py +49 -0
- appfactory-0.1.0/tests/test_deliver.py +143 -0
- appfactory-0.1.0/tests/test_design.py +437 -0
- appfactory-0.1.0/tests/test_design_research.py +244 -0
- appfactory-0.1.0/tests/test_foundation.py +369 -0
- appfactory-0.1.0/tests/test_gates.py +719 -0
- appfactory-0.1.0/tests/test_ideas.py +239 -0
- appfactory-0.1.0/tests/test_maestro.py +358 -0
- appfactory-0.1.0/tests/test_options.py +101 -0
- appfactory-0.1.0/tests/test_orchestrator.py +215 -0
- appfactory-0.1.0/tests/test_preview.py +187 -0
- appfactory-0.1.0/tests/test_run_options_effects.py +337 -0
- appfactory-0.1.0/tests/test_screenshot.py +45 -0
- appfactory-0.1.0/tests/test_security.py +143 -0
- appfactory-0.1.0/tests/test_services.py +269 -0
- appfactory-0.1.0/tests/test_session.py +57 -0
- appfactory-0.1.0/tests/test_setup_gui.py +228 -0
- appfactory-0.1.0/tests/test_signing.py +98 -0
- appfactory-0.1.0/tests/test_spec.py +146 -0
- appfactory-0.1.0/tests/test_store_setup.py +395 -0
- appfactory-0.1.0/tests/test_storekit.py +73 -0
- appfactory-0.1.0/tests/test_team_issues_mascot.py +182 -0
- appfactory-0.1.0/tools/maestro-live +1 -0
- appfactory-0.1.0/uv.lock +1509 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something does not work as documented
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: what
|
|
7
|
+
attributes:
|
|
8
|
+
label: What happened
|
|
9
|
+
description: What you did, what you expected, what you got. Do not paste secrets.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: input
|
|
13
|
+
id: agent
|
|
14
|
+
attributes:
|
|
15
|
+
label: Agent and version
|
|
16
|
+
placeholder: Claude Code / Codex CLI / Gemini CLI / Cursor
|
|
17
|
+
- type: textarea
|
|
18
|
+
id: doctor
|
|
19
|
+
attributes:
|
|
20
|
+
label: Output of `appfactory doctor`
|
|
21
|
+
render: text
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest an improvement
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: Problem
|
|
9
|
+
description: What are you trying to do that is hard today?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: idea
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed solution
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master, main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
os: [ubuntu-latest, macos-latest]
|
|
17
|
+
runs-on: ${{ matrix.os }}
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
- uses: astral-sh/setup-uv@v5
|
|
21
|
+
- run: uv sync --locked
|
|
22
|
+
- run: uv run pytest -q
|
|
23
|
+
|
|
24
|
+
leak-scan:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0
|
|
30
|
+
- uses: gitleaks/gitleaks-action@v2
|
|
31
|
+
env:
|
|
32
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
33
|
+
|
|
34
|
+
author-emails:
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
with:
|
|
39
|
+
fetch-depth: 0
|
|
40
|
+
- name: Commit author and committer emails must be @appfactory.local or noreply.github.com
|
|
41
|
+
run: |
|
|
42
|
+
bad=$(git log --format='%h %ae %ce' | awk '
|
|
43
|
+
{ for (i = 2; i <= 3; i++) if ($i !~ /@appfactory\.local$/ && $i !~ /noreply\.github\.com$/) { print; break } }')
|
|
44
|
+
if [ -n "$bad" ]; then
|
|
45
|
+
echo "Commits with a non-allowed email:"; echo "$bad"; exit 1
|
|
46
|
+
fi
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishes to PyPI with trusted publishing (no API token) when a version tag is pushed.
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
tags: ["v*"]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pypi:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment: pypi
|
|
12
|
+
permissions:
|
|
13
|
+
id-token: write
|
|
14
|
+
contents: read
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: astral-sh/setup-uv@v6
|
|
18
|
+
- run: uv build
|
|
19
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# secrets — never commit
|
|
2
|
+
.p8
|
|
3
|
+
*.p8
|
|
4
|
+
AuthKey_*.p8
|
|
5
|
+
*.env
|
|
6
|
+
.env
|
|
7
|
+
/config.toml
|
|
8
|
+
.appfactory/
|
|
9
|
+
# python
|
|
10
|
+
__pycache__/
|
|
11
|
+
.venv/
|
|
12
|
+
*.pyc
|
|
13
|
+
# node
|
|
14
|
+
node_modules/
|
|
15
|
+
# xcode
|
|
16
|
+
DerivedData/
|
|
17
|
+
*.xcuserstate
|
|
18
|
+
build/
|
|
19
|
+
*.ipa
|
|
20
|
+
|
|
21
|
+
# supabase CLI leftovers
|
|
22
|
+
templates/swiftui-subscription/supabase/.temp/
|
|
23
|
+
|
|
24
|
+
.DS_Store
|
|
25
|
+
**/.DS_Store
|
|
26
|
+
|
|
27
|
+
# scratch builds (sample apps, DerivedData)
|
|
28
|
+
.scratch/
|
|
29
|
+
|
|
30
|
+
# private / local
|
|
31
|
+
docs/superpowers/
|
|
32
|
+
dist/
|
|
33
|
+
*.bak-*
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"appfactory": {
|
|
4
|
+
"type": "stdio",
|
|
5
|
+
"command": "uv",
|
|
6
|
+
"args": [
|
|
7
|
+
"run",
|
|
8
|
+
"--directory",
|
|
9
|
+
".",
|
|
10
|
+
"python",
|
|
11
|
+
"-m",
|
|
12
|
+
"appfactory.server"
|
|
13
|
+
],
|
|
14
|
+
"env": {}
|
|
15
|
+
},
|
|
16
|
+
"lottiefiles-creator": {
|
|
17
|
+
"type": "stdio",
|
|
18
|
+
"command": "npx",
|
|
19
|
+
"args": [
|
|
20
|
+
"-y",
|
|
21
|
+
"@lottiefiles/creator-mcp@latest"
|
|
22
|
+
],
|
|
23
|
+
"env": {}
|
|
24
|
+
},
|
|
25
|
+
"xcodebuild": {
|
|
26
|
+
"type": "stdio",
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": [
|
|
29
|
+
"-y",
|
|
30
|
+
"xcodebuildmcp@latest",
|
|
31
|
+
"mcp"
|
|
32
|
+
],
|
|
33
|
+
"env": {}
|
|
34
|
+
},
|
|
35
|
+
"revenuecat": {
|
|
36
|
+
"type": "http",
|
|
37
|
+
"url": "https://mcp.revenuecat.ai/mcp"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
AppFactory is an MCP server that takes a SwiftUI iOS subscription app from idea to the App Store.
|
|
4
|
+
|
|
5
|
+
## Running the factory
|
|
6
|
+
0. Call `setup_status()` first; fix missing setup with `setup_services` / `setup_set` / `setup_credentials` (secrets are typed by the user in a local browser page, never in the chat).
|
|
7
|
+
1. Load the playbook: tool `playbook()` (or prompt `appfactory_run` / resource `appfactory://playbook`) and follow it.
|
|
8
|
+
2. Before any work, ask the user about every optional part (`run_options()`) and save the answers. Skip whatever they turn off.
|
|
9
|
+
3. A stage is done only when `pipeline_mark` passes its gate. App Store submission always stays with the human.
|
|
10
|
+
|
|
11
|
+
## Working on this repo
|
|
12
|
+
- `appfactory doctor` (status), `appfactory setup` (optional terminal wizard); tests: `uv run pytest -q`.
|
|
13
|
+
- English only. No secrets or personal data in commits.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
```bash
|
|
5
|
+
uv sync
|
|
6
|
+
uv run pytest -q
|
|
7
|
+
uv run appfactory doctor
|
|
8
|
+
```
|
|
9
|
+
Python 3.12+. The app template lives in `templates/swiftui-subscription/` (XcodeGen project); it is shipped
|
|
10
|
+
inside the wheel as `appfactory/templates`.
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
- English only: code, comments, docs, commit messages.
|
|
14
|
+
- No secrets or personal data in commits, tests or fixtures (CI runs gitleaks). Commit with a
|
|
15
|
+
`@appfactory.local` or GitHub `noreply` email; CI checks author emails.
|
|
16
|
+
- Keep it simple: prefer the standard library and existing helpers to new code or dependencies.
|
|
17
|
+
- Tests must pass on Linux and macOS. Do not call real services in tests.
|
|
18
|
+
|
|
19
|
+
## Adding a tool
|
|
20
|
+
1. Add a function to `src/appfactory/server.py` decorated with `@tool` and a docstring whose first paragraph
|
|
21
|
+
says what it does (it becomes the tool description).
|
|
22
|
+
2. If it talks to an optional service, add it to `TOOL_SERVICES` in `server.py` (service names come from
|
|
23
|
+
`SERVICES` in `src/appfactory/config.py`). Tools not listed always run.
|
|
24
|
+
3. If it is irreversible or writes to an external account, gate it with `_approval(...)` and default to dry run.
|
|
25
|
+
If its result carries third-party text, add it to `UNTRUSTED_TOOLS`.
|
|
26
|
+
4. If it belongs to a pipeline stage, wire it into `pipeline.py` / `gates.py`.
|
|
27
|
+
5. Add a test, then regenerate the reference: `python docs/gen_tools.py`.
|
|
28
|
+
|
|
29
|
+
## Adding a service
|
|
30
|
+
Add an entry to `SERVICES` in `config.py` (description, keys, binaries), map its tools in `TOOL_SERVICES`,
|
|
31
|
+
and add a row to the README table.
|
|
32
|
+
|
|
33
|
+
## Pull requests
|
|
34
|
+
Small and focused, tests included, `uv run pytest -q` green.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
appfactory-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AppFactory contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: appfactory
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Open-source MCP server that takes an iOS subscription app from idea to the App Store
|
|
5
|
+
Project-URL: Homepage, https://github.com/gbatistuta0/appfactory
|
|
6
|
+
Project-URL: Repository, https://github.com/gbatistuta0/appfactory
|
|
7
|
+
Project-URL: Issues, https://github.com/gbatistuta0/appfactory/issues
|
|
8
|
+
Author: AppFactory contributors
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: app-store,claude-code,codex,gemini,ios,mcp,swiftui
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
18
|
+
Requires-Python: >=3.12
|
|
19
|
+
Requires-Dist: fastmcp>=2.3.0
|
|
20
|
+
Requires-Dist: httpx>=0.27
|
|
21
|
+
Provides-Extra: mascot
|
|
22
|
+
Requires-Dist: numpy>=1.26; extra == 'mascot'
|
|
23
|
+
Requires-Dist: opencv-python-headless>=4.9; extra == 'mascot'
|
|
24
|
+
Requires-Dist: pillow>=10.0; extra == 'mascot'
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
|
|
27
|
+
# AppFactory
|
|
28
|
+
|
|
29
|
+
[](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml)
|
|
30
|
+
[](LICENSE)
|
|
31
|
+

|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
An MCP server that lets your coding agent take a SwiftUI iOS subscription app from idea to the App Store.
|
|
35
|
+
|
|
36
|
+
**What it does:** idea harvesting and validation, design, SwiftUI code from a template, Supabase backend,
|
|
37
|
+
App Store Connect + RevenueCat setup, localization, analytics, ASO, screenshots and TestFlight. Every stage
|
|
38
|
+
has a gate the agent must pass. You do the final App Store submission.
|
|
39
|
+
|
|
40
|
+
## Quickstart
|
|
41
|
+
|
|
42
|
+
Requires a Mac, Python 3.12+ and [uv](https://docs.astral.sh/uv/).
|
|
43
|
+
|
|
44
|
+
### 1. Add the MCP to your agent
|
|
45
|
+
|
|
46
|
+
One line, no installer. The server command is `uvx --from git+https://github.com/gbatistuta0/appfactory appfactory-mcp`.
|
|
47
|
+
|
|
48
|
+
| Agent | How |
|
|
49
|
+
|---|---|
|
|
50
|
+
| Claude Code | `claude mcp add --scope user appfactory -- uvx --from git+https://github.com/gbatistuta0/appfactory appfactory-mcp` |
|
|
51
|
+
| Codex CLI | `~/.codex/config.toml`: `[mcp_servers.appfactory]` with `command = "uvx"`, `args = ["--from", "git+https://github.com/gbatistuta0/appfactory", "appfactory-mcp"]` |
|
|
52
|
+
| Gemini CLI | `~/.gemini/settings.json`: `"mcpServers": {"appfactory": {"command": "uvx", "args": ["--from", "git+https://github.com/gbatistuta0/appfactory", "appfactory-mcp"]}}` |
|
|
53
|
+
| Cursor | `~/.cursor/mcp.json`: same shape as Gemini |
|
|
54
|
+
|
|
55
|
+
### 2. Ask your agent: "Set up AppFactory"
|
|
56
|
+
|
|
57
|
+
The agent calls `setup_status`, asks which services you want, and turns them on. Keys never go through the chat:
|
|
58
|
+
for secrets it opens a local page in your browser (127.0.0.1 only, one-time token) where you type them; they are
|
|
59
|
+
stored in `~/.appfactory/config.toml` (mode 0600). `appfactory doctor` shows what is configured.
|
|
60
|
+
|
|
61
|
+
Then try this first prompt. It needs no accounts:
|
|
62
|
+
|
|
63
|
+
> Find 3 underserved iOS app niches in Health & Fitness and validate the best one
|
|
64
|
+
|
|
65
|
+
## Works with
|
|
66
|
+
|
|
67
|
+
Claude Code, Codex CLI, Gemini CLI and Cursor. The run playbook is served by the MCP server itself (tool
|
|
68
|
+
`playbook()`, prompt `appfactory_run`, resource `appfactory://playbook`), so any MCP-capable agent can follow it.
|
|
69
|
+
|
|
70
|
+
## Choose what you use
|
|
71
|
+
|
|
72
|
+
Every service is optional. Tools for a disabled service do nothing and the pipeline skips those stages
|
|
73
|
+
(`appfactory services enable|disable NAME`).
|
|
74
|
+
|
|
75
|
+
| Service | What it enables | Needs |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| research | Idea harvesting, ASO research (always on) | nothing |
|
|
78
|
+
| apple | App Store Connect: apps, in-app purchases, metadata, TestFlight | ASC API key, `asc` CLI |
|
|
79
|
+
| xcode | Local builds, simulator, archives | Xcode, `xcodegen` |
|
|
80
|
+
| supabase | Backend: database, edge functions, credits | access token, `supabase`, `deno` |
|
|
81
|
+
| revenuecat | Subscriptions and entitlements | RevenueCat secret key |
|
|
82
|
+
| ai | AI features through a server-side proxy | optional provider keys |
|
|
83
|
+
| firebase | Firebase Analytics setup | `firebase` CLI |
|
|
84
|
+
| github | A repo and issues per app | `gh` |
|
|
85
|
+
| design | Screen design through the claude-design MCP | claude-design MCP |
|
|
86
|
+
| maestro | End-to-end UI tests on the simulator | Maestro, Java 17+ |
|
|
87
|
+
| lottie | Lottie animations | `node` |
|
|
88
|
+
|
|
89
|
+
Details and credential steps: [docs/SETUP.md](docs/SETUP.md).
|
|
90
|
+
|
|
91
|
+
## Safety
|
|
92
|
+
|
|
93
|
+
- **Approvals.** Irreversible or outward actions (submission, store/backend/RevenueCat writes, GitHub pushes,
|
|
94
|
+
uploads) do not run when an agent calls them. They wait for `appfactory approve <id>` in your terminal.
|
|
95
|
+
- **Dry run by default** for deploys, repo creation, uploads and issue writes.
|
|
96
|
+
- **Secrets stay local** and are scrubbed from every tool result.
|
|
97
|
+
- **Untrusted content** (App Store listings, reviews) is labelled as data, not instructions.
|
|
98
|
+
|
|
99
|
+
Full threat model and limits: [SECURITY.md](SECURITY.md).
|
|
100
|
+
|
|
101
|
+
## How a run works
|
|
102
|
+
|
|
103
|
+
1. **Interview.** Before any work the agent calls `run_options()`, asks you about every optional part, and saves
|
|
104
|
+
your answers. Anything you turn off is skipped.
|
|
105
|
+
2. **Pipeline with gates.** `scaffold, design, features, backend, store setup, localize, analytics, ASO,
|
|
106
|
+
metadata, screenshots, TestFlight`. A stage is done only when `pipeline_mark` passes its gate; blockers stop
|
|
107
|
+
the run with a `NEEDS_HUMAN.md`.
|
|
108
|
+
3. **You submit.** App Store submission is always human, in the App Store Connect web UI.
|
|
109
|
+
|
|
110
|
+
## Docs
|
|
111
|
+
|
|
112
|
+
- [docs/SETUP.md](docs/SETUP.md): credentials and per-app choices
|
|
113
|
+
- [docs/PIPELINE_PLAYBOOK.md](docs/PIPELINE_PLAYBOOK.md): the why, order and gotchas of every stage
|
|
114
|
+
- [docs/TOOLS.md](docs/TOOLS.md): every tool (generated)
|
|
115
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), [AGENTS.md](AGENTS.md)
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
[MIT](LICENSE)
|
|
120
|
+
|
|
121
|
+
<!-- mcp-name: io.github.gbatistuta0/appfactory -->
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# AppFactory
|
|
2
|
+
|
|
3
|
+
[](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
An MCP server that lets your coding agent take a SwiftUI iOS subscription app from idea to the App Store.
|
|
9
|
+
|
|
10
|
+
**What it does:** idea harvesting and validation, design, SwiftUI code from a template, Supabase backend,
|
|
11
|
+
App Store Connect + RevenueCat setup, localization, analytics, ASO, screenshots and TestFlight. Every stage
|
|
12
|
+
has a gate the agent must pass. You do the final App Store submission.
|
|
13
|
+
|
|
14
|
+
## Quickstart
|
|
15
|
+
|
|
16
|
+
Requires a Mac, Python 3.12+ and [uv](https://docs.astral.sh/uv/).
|
|
17
|
+
|
|
18
|
+
### 1. Add the MCP to your agent
|
|
19
|
+
|
|
20
|
+
One line, no installer. The server command is `uvx --from git+https://github.com/gbatistuta0/appfactory appfactory-mcp`.
|
|
21
|
+
|
|
22
|
+
| Agent | How |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Claude Code | `claude mcp add --scope user appfactory -- uvx --from git+https://github.com/gbatistuta0/appfactory appfactory-mcp` |
|
|
25
|
+
| Codex CLI | `~/.codex/config.toml`: `[mcp_servers.appfactory]` with `command = "uvx"`, `args = ["--from", "git+https://github.com/gbatistuta0/appfactory", "appfactory-mcp"]` |
|
|
26
|
+
| Gemini CLI | `~/.gemini/settings.json`: `"mcpServers": {"appfactory": {"command": "uvx", "args": ["--from", "git+https://github.com/gbatistuta0/appfactory", "appfactory-mcp"]}}` |
|
|
27
|
+
| Cursor | `~/.cursor/mcp.json`: same shape as Gemini |
|
|
28
|
+
|
|
29
|
+
### 2. Ask your agent: "Set up AppFactory"
|
|
30
|
+
|
|
31
|
+
The agent calls `setup_status`, asks which services you want, and turns them on. Keys never go through the chat:
|
|
32
|
+
for secrets it opens a local page in your browser (127.0.0.1 only, one-time token) where you type them; they are
|
|
33
|
+
stored in `~/.appfactory/config.toml` (mode 0600). `appfactory doctor` shows what is configured.
|
|
34
|
+
|
|
35
|
+
Then try this first prompt. It needs no accounts:
|
|
36
|
+
|
|
37
|
+
> Find 3 underserved iOS app niches in Health & Fitness and validate the best one
|
|
38
|
+
|
|
39
|
+
## Works with
|
|
40
|
+
|
|
41
|
+
Claude Code, Codex CLI, Gemini CLI and Cursor. The run playbook is served by the MCP server itself (tool
|
|
42
|
+
`playbook()`, prompt `appfactory_run`, resource `appfactory://playbook`), so any MCP-capable agent can follow it.
|
|
43
|
+
|
|
44
|
+
## Choose what you use
|
|
45
|
+
|
|
46
|
+
Every service is optional. Tools for a disabled service do nothing and the pipeline skips those stages
|
|
47
|
+
(`appfactory services enable|disable NAME`).
|
|
48
|
+
|
|
49
|
+
| Service | What it enables | Needs |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| research | Idea harvesting, ASO research (always on) | nothing |
|
|
52
|
+
| apple | App Store Connect: apps, in-app purchases, metadata, TestFlight | ASC API key, `asc` CLI |
|
|
53
|
+
| xcode | Local builds, simulator, archives | Xcode, `xcodegen` |
|
|
54
|
+
| supabase | Backend: database, edge functions, credits | access token, `supabase`, `deno` |
|
|
55
|
+
| revenuecat | Subscriptions and entitlements | RevenueCat secret key |
|
|
56
|
+
| ai | AI features through a server-side proxy | optional provider keys |
|
|
57
|
+
| firebase | Firebase Analytics setup | `firebase` CLI |
|
|
58
|
+
| github | A repo and issues per app | `gh` |
|
|
59
|
+
| design | Screen design through the claude-design MCP | claude-design MCP |
|
|
60
|
+
| maestro | End-to-end UI tests on the simulator | Maestro, Java 17+ |
|
|
61
|
+
| lottie | Lottie animations | `node` |
|
|
62
|
+
|
|
63
|
+
Details and credential steps: [docs/SETUP.md](docs/SETUP.md).
|
|
64
|
+
|
|
65
|
+
## Safety
|
|
66
|
+
|
|
67
|
+
- **Approvals.** Irreversible or outward actions (submission, store/backend/RevenueCat writes, GitHub pushes,
|
|
68
|
+
uploads) do not run when an agent calls them. They wait for `appfactory approve <id>` in your terminal.
|
|
69
|
+
- **Dry run by default** for deploys, repo creation, uploads and issue writes.
|
|
70
|
+
- **Secrets stay local** and are scrubbed from every tool result.
|
|
71
|
+
- **Untrusted content** (App Store listings, reviews) is labelled as data, not instructions.
|
|
72
|
+
|
|
73
|
+
Full threat model and limits: [SECURITY.md](SECURITY.md).
|
|
74
|
+
|
|
75
|
+
## How a run works
|
|
76
|
+
|
|
77
|
+
1. **Interview.** Before any work the agent calls `run_options()`, asks you about every optional part, and saves
|
|
78
|
+
your answers. Anything you turn off is skipped.
|
|
79
|
+
2. **Pipeline with gates.** `scaffold, design, features, backend, store setup, localize, analytics, ASO,
|
|
80
|
+
metadata, screenshots, TestFlight`. A stage is done only when `pipeline_mark` passes its gate; blockers stop
|
|
81
|
+
the run with a `NEEDS_HUMAN.md`.
|
|
82
|
+
3. **You submit.** App Store submission is always human, in the App Store Connect web UI.
|
|
83
|
+
|
|
84
|
+
## Docs
|
|
85
|
+
|
|
86
|
+
- [docs/SETUP.md](docs/SETUP.md): credentials and per-app choices
|
|
87
|
+
- [docs/PIPELINE_PLAYBOOK.md](docs/PIPELINE_PLAYBOOK.md): the why, order and gotchas of every stage
|
|
88
|
+
- [docs/TOOLS.md](docs/TOOLS.md): every tool (generated)
|
|
89
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), [AGENTS.md](AGENTS.md)
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
[MIT](LICENSE)
|
|
94
|
+
|
|
95
|
+
<!-- mcp-name: io.github.gbatistuta0/appfactory -->
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
## Threat model
|
|
4
|
+
|
|
5
|
+
AppFactory tools are driven by coding agents, often unattended, that read untrusted web data (App Store
|
|
6
|
+
listings, competitor pages, reviews). A prompt injection in that data could try to make the agent spend money,
|
|
7
|
+
leak secrets or make irreversible changes to your App Store, Supabase, RevenueCat or GitHub accounts.
|
|
8
|
+
|
|
9
|
+
Defenses in the server:
|
|
10
|
+
|
|
11
|
+
- **Out-of-band approvals.** Irreversible or outward actions (App Store submission, `store_setup` apply, app
|
|
12
|
+
creation, live backend deploys, Supabase SQL/secrets/projects, RevenueCat writes, GitHub repos/pushes/issues,
|
|
13
|
+
App Store uploads, TestFlight, Custom Product Pages) do not run when an agent calls them. They create a pending
|
|
14
|
+
record in `~/.appfactory/approvals/` and the human approves it with `appfactory approve <id>` in a terminal
|
|
15
|
+
(interactive y/N). An approval is single use, bound to the exact arguments and expires after 30 minutes.
|
|
16
|
+
Config `approvals = "off"` disables this, except for App Store submission and destructive SQL (DROP,
|
|
17
|
+
TRUNCATE, ALTER … DROP, GRANT/REVOKE on auth, DELETE/UPDATE without WHERE), which always ask.
|
|
18
|
+
- **Dry run by default** for deploys, repo creation, preview uploads and GitHub issue writes.
|
|
19
|
+
- **Secrets never in tool results.** Known secret values are replaced with `***` in every tool result and in
|
|
20
|
+
subprocess output. Secrets cannot be set through a tool; enter them with `appfactory setup`.
|
|
21
|
+
- **Untrusted content is labelled.** Results carrying third-party text include an `untrusted_content` note and
|
|
22
|
+
the playbook tells agents to treat it as data, never as instructions.
|
|
23
|
+
|
|
24
|
+
Limits: approvals protect the MCP channel. An agent that can run arbitrary shell commands as your user can read
|
|
25
|
+
`~/.appfactory` and could bypass them; restrict shell access (allowlists, sandboxing) for unattended runs.
|
|
26
|
+
|
|
27
|
+
## Where secrets live
|
|
28
|
+
|
|
29
|
+
`~/.appfactory/config.toml` (mode 0600), plus Supabase service-role keys in `~/.appfactory/supabase/<ref>.json`
|
|
30
|
+
(0600) and your `.p8` key files. Nothing secret is written to app repos, and AI keys go only to server-side
|
|
31
|
+
Supabase secrets, never into the app binary.
|
|
32
|
+
|
|
33
|
+
## Reporting a vulnerability
|
|
34
|
+
|
|
35
|
+
Please use GitHub's private vulnerability reporting on this repository (Security tab → "Report a
|
|
36
|
+
vulnerability"). Do not open a public issue for security problems.
|