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.
Files changed (261) hide show
  1. appfactory-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +21 -0
  2. appfactory-0.1.0/.github/ISSUE_TEMPLATE/config.yml +1 -0
  3. appfactory-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +15 -0
  4. appfactory-0.1.0/.github/workflows/ci.yml +46 -0
  5. appfactory-0.1.0/.github/workflows/release.yml +19 -0
  6. appfactory-0.1.0/.gitignore +33 -0
  7. appfactory-0.1.0/.gitleaks.toml +6 -0
  8. appfactory-0.1.0/.mcp.json +40 -0
  9. appfactory-0.1.0/.python-version +1 -0
  10. appfactory-0.1.0/AGENTS.md +13 -0
  11. appfactory-0.1.0/CONTRIBUTING.md +34 -0
  12. appfactory-0.1.0/GEMINI.md +1 -0
  13. appfactory-0.1.0/LICENSE +21 -0
  14. appfactory-0.1.0/PKG-INFO +121 -0
  15. appfactory-0.1.0/README.md +95 -0
  16. appfactory-0.1.0/SECURITY.md +36 -0
  17. appfactory-0.1.0/docs/PIPELINE_PLAYBOOK.md +275 -0
  18. appfactory-0.1.0/docs/SETUP.md +65 -0
  19. appfactory-0.1.0/docs/TOOLS.md +319 -0
  20. appfactory-0.1.0/docs/gen_tools.py +38 -0
  21. appfactory-0.1.0/pyproject.toml +61 -0
  22. appfactory-0.1.0/server.json +19 -0
  23. appfactory-0.1.0/src/appfactory/__init__.py +3 -0
  24. appfactory-0.1.0/src/appfactory/ai.py +275 -0
  25. appfactory-0.1.0/src/appfactory/animation.py +164 -0
  26. appfactory-0.1.0/src/appfactory/app.py +679 -0
  27. appfactory-0.1.0/src/appfactory/approvals.py +149 -0
  28. appfactory-0.1.0/src/appfactory/asc.py +705 -0
  29. appfactory-0.1.0/src/appfactory/asc_cli.py +222 -0
  30. appfactory-0.1.0/src/appfactory/aso.py +604 -0
  31. appfactory-0.1.0/src/appfactory/bin/maestro-live +227 -0
  32. appfactory-0.1.0/src/appfactory/build.py +114 -0
  33. appfactory-0.1.0/src/appfactory/cli.py +263 -0
  34. appfactory-0.1.0/src/appfactory/config.py +376 -0
  35. appfactory-0.1.0/src/appfactory/cpp.py +56 -0
  36. appfactory-0.1.0/src/appfactory/data/generic_localizations.json +3980 -0
  37. appfactory-0.1.0/src/appfactory/data/playbook.md +236 -0
  38. appfactory-0.1.0/src/appfactory/data/setup.html +117 -0
  39. appfactory-0.1.0/src/appfactory/deliver.py +340 -0
  40. appfactory-0.1.0/src/appfactory/design/__init__.py +317 -0
  41. appfactory-0.1.0/src/appfactory/design/brand.py +220 -0
  42. appfactory-0.1.0/src/appfactory/design/dc.py +238 -0
  43. appfactory-0.1.0/src/appfactory/design/export.py +65 -0
  44. appfactory-0.1.0/src/appfactory/design/main_app.py +433 -0
  45. appfactory-0.1.0/src/appfactory/design/mascot_boards.py +184 -0
  46. appfactory-0.1.0/src/appfactory/design/onboarding.py +878 -0
  47. appfactory-0.1.0/src/appfactory/design/pricing.py +80 -0
  48. appfactory-0.1.0/src/appfactory/design/receipt.py +116 -0
  49. appfactory-0.1.0/src/appfactory/design/research.py +460 -0
  50. appfactory-0.1.0/src/appfactory/design/rules.py +78 -0
  51. appfactory-0.1.0/src/appfactory/design/screens.py +472 -0
  52. appfactory-0.1.0/src/appfactory/design/theme.py +172 -0
  53. appfactory-0.1.0/src/appfactory/firebase.py +116 -0
  54. appfactory-0.1.0/src/appfactory/gates.py +1530 -0
  55. appfactory-0.1.0/src/appfactory/github.py +69 -0
  56. appfactory-0.1.0/src/appfactory/growth.py +113 -0
  57. appfactory-0.1.0/src/appfactory/icon.py +115 -0
  58. appfactory-0.1.0/src/appfactory/ideas.py +428 -0
  59. appfactory-0.1.0/src/appfactory/issues.py +136 -0
  60. appfactory-0.1.0/src/appfactory/legal.py +228 -0
  61. appfactory-0.1.0/src/appfactory/localize.py +138 -0
  62. appfactory-0.1.0/src/appfactory/maestro.py +330 -0
  63. appfactory-0.1.0/src/appfactory/mascot.py +201 -0
  64. appfactory-0.1.0/src/appfactory/metadata.py +439 -0
  65. appfactory-0.1.0/src/appfactory/options.py +318 -0
  66. appfactory-0.1.0/src/appfactory/orchestrator.py +144 -0
  67. appfactory-0.1.0/src/appfactory/pipeline.py +271 -0
  68. appfactory-0.1.0/src/appfactory/preview.py +454 -0
  69. appfactory-0.1.0/src/appfactory/proc.py +24 -0
  70. appfactory-0.1.0/src/appfactory/revenuecat.py +171 -0
  71. appfactory-0.1.0/src/appfactory/sbp.py +158 -0
  72. appfactory-0.1.0/src/appfactory/screenshot.py +329 -0
  73. appfactory-0.1.0/src/appfactory/server.py +1674 -0
  74. appfactory-0.1.0/src/appfactory/setup_gui.py +268 -0
  75. appfactory-0.1.0/src/appfactory/setup_tools.py +115 -0
  76. appfactory-0.1.0/src/appfactory/signing.py +287 -0
  77. appfactory-0.1.0/src/appfactory/spec.py +470 -0
  78. appfactory-0.1.0/src/appfactory/store_setup.py +1677 -0
  79. appfactory-0.1.0/src/appfactory/storekit.py +213 -0
  80. appfactory-0.1.0/src/appfactory/supabase.py +310 -0
  81. appfactory-0.1.0/src/appfactory/team.py +172 -0
  82. appfactory-0.1.0/templates/docs/CHECKLIST.md +86 -0
  83. appfactory-0.1.0/templates/docs/aso-research.md +60 -0
  84. appfactory-0.1.0/templates/docs/onboarding-plan.md +53 -0
  85. appfactory-0.1.0/templates/swiftui-subscription/.gitignore +6 -0
  86. appfactory-0.1.0/templates/swiftui-subscription/.maestro/config.yaml +11 -0
  87. appfactory-0.1.0/templates/swiftui-subscription/.maestro/flows/smoke_onboarding_paywall.yaml +89 -0
  88. appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/AccentColor.colorset/Contents.json +4 -0
  89. appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +4 -0
  90. appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/Contents.json +1 -0
  91. appfactory-0.1.0/templates/swiftui-subscription/Resources/Assets.xcassets/Mascot/Contents.json +4 -0
  92. appfactory-0.1.0/templates/swiftui-subscription/Resources/InfoPlist.xcstrings +132 -0
  93. appfactory-0.1.0/templates/swiftui-subscription/Resources/Localizable.xcstrings +7507 -0
  94. appfactory-0.1.0/templates/swiftui-subscription/Scripts/sim_store_prep.sh +59 -0
  95. appfactory-0.1.0/templates/swiftui-subscription/Scripts/sync_strings.py +46 -0
  96. appfactory-0.1.0/templates/swiftui-subscription/Scripts/translations.py +464 -0
  97. appfactory-0.1.0/templates/swiftui-subscription/Sources/App/App.swift +116 -0
  98. appfactory-0.1.0/templates/swiftui-subscription/Sources/App/AppConfig.swift +179 -0
  99. appfactory-0.1.0/templates/swiftui-subscription/Sources/App/LaunchOptions.swift +52 -0
  100. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AIService.swift +91 -0
  101. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/Analytics.swift +193 -0
  102. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AnalyticsGate.swift +77 -0
  103. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/AuthProvider.swift +118 -0
  104. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/LocalUsageGate.swift +21 -0
  105. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/Proxy.swift +147 -0
  106. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/RatingPolicy.swift +171 -0
  107. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/StoreManager.swift +512 -0
  108. appfactory-0.1.0/templates/swiftui-subscription/Sources/Core/SupabaseAuth.swift +292 -0
  109. appfactory-0.1.0/templates/swiftui-subscription/Sources/Credits/CreditManager.swift +80 -0
  110. appfactory-0.1.0/templates/swiftui-subscription/Sources/Credits/TopUpSheet.swift +245 -0
  111. appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/Controls.swift +426 -0
  112. appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/MascotView.swift +393 -0
  113. appfactory-0.1.0/templates/swiftui-subscription/Sources/Design/Motion.swift +282 -0
  114. appfactory-0.1.0/templates/swiftui-subscription/Sources/DesignSystem.swift +193 -0
  115. appfactory-0.1.0/templates/swiftui-subscription/Sources/Health/HealthStore.swift +270 -0
  116. appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/GenerationFlow.swift +414 -0
  117. appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/GenerationStore.swift +137 -0
  118. appfactory-0.1.0/templates/swiftui-subscription/Sources/Main/RootTabView.swift +443 -0
  119. appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/BirthYears.swift +44 -0
  120. appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/Units.swift +72 -0
  121. appfactory-0.1.0/templates/swiftui-subscription/Sources/Model/UserProfile.swift +118 -0
  122. appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingModel.swift +133 -0
  123. appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingSteps.swift +230 -0
  124. appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/OnboardingView.swift +192 -0
  125. appfactory-0.1.0/templates/swiftui-subscription/Sources/Onboarding/Screens/StepScreens.swift +363 -0
  126. appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/HardPaywallView.swift +241 -0
  127. appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/OfferPaywallView.swift +211 -0
  128. appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallComponents.swift +257 -0
  129. appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallPersonalization.swift +58 -0
  130. appfactory-0.1.0/templates/swiftui-subscription/Sources/Paywall/PaywallPricing.swift +302 -0
  131. appfactory-0.1.0/templates/swiftui-subscription/Tests/AnalyticsGateTests.swift +52 -0
  132. appfactory-0.1.0/templates/swiftui-subscription/Tests/BillingTests.swift +113 -0
  133. appfactory-0.1.0/templates/swiftui-subscription/Tests/HealthTests.swift +52 -0
  134. appfactory-0.1.0/templates/swiftui-subscription/Tests/LocalizationCompletenessTests.swift +121 -0
  135. appfactory-0.1.0/templates/swiftui-subscription/Tests/OnboardingTests.swift +186 -0
  136. appfactory-0.1.0/templates/swiftui-subscription/Tests/PaywallTests.swift +191 -0
  137. appfactory-0.1.0/templates/swiftui-subscription/Tests/RatingPolicyTests.swift +131 -0
  138. appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAudit.swift +379 -0
  139. appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAuditRuleTests.swift +56 -0
  140. appfactory-0.1.0/templates/swiftui-subscription/UITests/LayoutAuditUITests.swift +66 -0
  141. appfactory-0.1.0/templates/swiftui-subscription/UITests/LocalizationUITests.swift +36 -0
  142. appfactory-0.1.0/templates/swiftui-subscription/UITests/OnboardingFlowUITests.swift +115 -0
  143. appfactory-0.1.0/templates/swiftui-subscription/backend/CONTRACT.md +201 -0
  144. appfactory-0.1.0/templates/swiftui-subscription/backend/EVAL.md +50 -0
  145. appfactory-0.1.0/templates/swiftui-subscription/backend/PRIVACY.md +74 -0
  146. appfactory-0.1.0/templates/swiftui-subscription/backend/README.md +72 -0
  147. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/.gitignore +3 -0
  148. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/data/cases.json +9 -0
  149. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/prepare.ts +68 -0
  150. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/run.ts +188 -0
  151. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score.ts +106 -0
  152. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score_app.ts +28 -0
  153. appfactory-0.1.0/templates/swiftui-subscription/backend/eval/score_test.ts +119 -0
  154. appfactory-0.1.0/templates/swiftui-subscription/backend/legal/build.ts +158 -0
  155. appfactory-0.1.0/templates/swiftui-subscription/backend/legal/build_test.ts +89 -0
  156. appfactory-0.1.0/templates/swiftui-subscription/backend/legal/verify.ts +47 -0
  157. appfactory-0.1.0/templates/swiftui-subscription/backend/smoke/smoke.ts +136 -0
  158. appfactory-0.1.0/templates/swiftui-subscription/marketing/preview/README.md +16 -0
  159. appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/build.mjs +188 -0
  160. appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/config.json +6 -0
  161. appfactory-0.1.0/templates/swiftui-subscription/marketing/screenshots/package.json +7 -0
  162. appfactory-0.1.0/templates/swiftui-subscription/project.yml +162 -0
  163. appfactory-0.1.0/templates/swiftui-subscription/store/CHECKLIST.md +88 -0
  164. appfactory-0.1.0/templates/swiftui-subscription/store/metadata/listing.json +209 -0
  165. appfactory-0.1.0/templates/swiftui-subscription/store/pricing.md +96 -0
  166. appfactory-0.1.0/templates/swiftui-subscription/store/privacy/privacy-policy.en.md +130 -0
  167. appfactory-0.1.0/templates/swiftui-subscription/store/privacy/support.en.md +21 -0
  168. appfactory-0.1.0/templates/swiftui-subscription/store/privacy/terms.en.md +105 -0
  169. appfactory-0.1.0/templates/swiftui-subscription/store/review-notes.md +59 -0
  170. appfactory-0.1.0/templates/swiftui-subscription/supabase/.gitignore +2 -0
  171. appfactory-0.1.0/templates/swiftui-subscription/supabase/config.toml +48 -0
  172. appfactory-0.1.0/templates/swiftui-subscription/supabase/deno.json +9 -0
  173. appfactory-0.1.0/templates/swiftui-subscription/supabase/deno.lock +101 -0
  174. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/analysis.ts +119 -0
  175. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/app.gen.ts +14 -0
  176. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/config.ts +64 -0
  177. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/credits.ts +172 -0
  178. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/credits_rc.ts +64 -0
  179. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/entitlement.ts +58 -0
  180. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/http.ts +48 -0
  181. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/llm.ts +176 -0
  182. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/locale.ts +108 -0
  183. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/rc.ts +100 -0
  184. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/store.ts +132 -0
  185. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/_shared/usage.ts +132 -0
  186. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/ai-proxy/index.ts +146 -0
  187. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/analyze/handler.ts +204 -0
  188. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/analyze/index.ts +25 -0
  189. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/delete-account/handler.ts +37 -0
  190. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/delete-account/index.ts +18 -0
  191. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/content.gen.ts +8 -0
  192. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/handler.ts +77 -0
  193. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/legal/index.ts +6 -0
  194. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/cancellation.json +14 -0
  195. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/initial_purchase.json +15 -0
  196. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/fixtures/trial_started.json +14 -0
  197. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/index.ts +18 -0
  198. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/map.ts +36 -0
  199. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/rc-webhook/map_test.ts +21 -0
  200. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/usage-status/handler.ts +34 -0
  201. appfactory-0.1.0/templates/swiftui-subscription/supabase/functions/usage-status/index.ts +22 -0
  202. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0001_core.sql +118 -0
  203. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0002_analytics.sql +105 -0
  204. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0003_consent.sql +25 -0
  205. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0004_calendar_caps.sql +50 -0
  206. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations/0005_events_revenue.sql +61 -0
  207. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0001_ai_usage.sql +11 -0
  208. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0002_events.sql +14 -0
  209. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0003_credits.sql +84 -0
  210. appfactory-0.1.0/templates/swiftui-subscription/supabase/migrations_credits/0004_adops.sql +43 -0
  211. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/analyze_test.ts +375 -0
  212. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/calendar_caps_db_test.ts +71 -0
  213. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/db_harness.ts +76 -0
  214. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/db_test.ts +215 -0
  215. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/delete_account_test.ts +39 -0
  216. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/fakes.ts +153 -0
  217. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/legal_test.ts +60 -0
  218. appfactory-0.1.0/templates/swiftui-subscription/supabase/tests/shared_test.ts +355 -0
  219. appfactory-0.1.0/templates/team/TEAM.md +118 -0
  220. appfactory-0.1.0/templates/team/backend.md +15 -0
  221. appfactory-0.1.0/templates/team/ios.md +20 -0
  222. appfactory-0.1.0/templates/team/store.md +20 -0
  223. appfactory-0.1.0/tests/asc_fake.py +77 -0
  224. appfactory-0.1.0/tests/backend_fixtures.py +79 -0
  225. appfactory-0.1.0/tests/conftest.py +36 -0
  226. appfactory-0.1.0/tests/design_fixtures.py +153 -0
  227. appfactory-0.1.0/tests/fixtures/asa_report.json +20 -0
  228. appfactory-0.1.0/tests/fixtures/maestro/junit_mixed.xml +12 -0
  229. appfactory-0.1.0/tests/fixtures/revenue_events.json +7 -0
  230. appfactory-0.1.0/tests/fixtures/scaffold_golden.json +376 -0
  231. appfactory-0.1.0/tests/test_ai_flag.py +121 -0
  232. appfactory-0.1.0/tests/test_analytics_gate.py +51 -0
  233. appfactory-0.1.0/tests/test_app_scaffold.py +293 -0
  234. appfactory-0.1.0/tests/test_approval_gating.py +98 -0
  235. appfactory-0.1.0/tests/test_asc_cli.py +302 -0
  236. appfactory-0.1.0/tests/test_backend_wp.py +469 -0
  237. appfactory-0.1.0/tests/test_cli.py +79 -0
  238. appfactory-0.1.0/tests/test_cpp.py +49 -0
  239. appfactory-0.1.0/tests/test_deliver.py +143 -0
  240. appfactory-0.1.0/tests/test_design.py +437 -0
  241. appfactory-0.1.0/tests/test_design_research.py +244 -0
  242. appfactory-0.1.0/tests/test_foundation.py +369 -0
  243. appfactory-0.1.0/tests/test_gates.py +719 -0
  244. appfactory-0.1.0/tests/test_ideas.py +239 -0
  245. appfactory-0.1.0/tests/test_maestro.py +358 -0
  246. appfactory-0.1.0/tests/test_options.py +101 -0
  247. appfactory-0.1.0/tests/test_orchestrator.py +215 -0
  248. appfactory-0.1.0/tests/test_preview.py +187 -0
  249. appfactory-0.1.0/tests/test_run_options_effects.py +337 -0
  250. appfactory-0.1.0/tests/test_screenshot.py +45 -0
  251. appfactory-0.1.0/tests/test_security.py +143 -0
  252. appfactory-0.1.0/tests/test_services.py +269 -0
  253. appfactory-0.1.0/tests/test_session.py +57 -0
  254. appfactory-0.1.0/tests/test_setup_gui.py +228 -0
  255. appfactory-0.1.0/tests/test_signing.py +98 -0
  256. appfactory-0.1.0/tests/test_spec.py +146 -0
  257. appfactory-0.1.0/tests/test_store_setup.py +395 -0
  258. appfactory-0.1.0/tests/test_storekit.py +73 -0
  259. appfactory-0.1.0/tests/test_team_issues_mascot.py +182 -0
  260. appfactory-0.1.0/tools/maestro-live +1 -0
  261. 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,6 @@
1
+ [extend]
2
+ useDefault = true
3
+
4
+ [allowlist]
5
+ description = "Scaffold snapshot stores file content hashes, not secrets"
6
+ paths = ['''tests/fixtures/scaffold_golden\.json''']
@@ -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
@@ -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
+ [![CI](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml/badge.svg)](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml)
30
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
31
+ ![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)
32
+ ![MCP](https://img.shields.io/badge/MCP-server-8A2BE2.svg)
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
+ [![CI](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml/badge.svg)](https://github.com/gbatistuta0/appfactory/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
+ ![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)
6
+ ![MCP](https://img.shields.io/badge/MCP-server-8A2BE2.svg)
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.