botrun-horse 2.29.2 → 2.30.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.
Files changed (574) hide show
  1. package/botrun-c/.claude/skills/DOCX/351/226/261/350/256/200/346/212/200/350/203/275/SKILL.md +103 -0
  2. package/botrun-c/.claude/skills/DOCX/351/226/261/350/256/200/346/212/200/350/203/275/scripts/docx-to-markdown.mjs +206 -0
  3. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/SKILL.md +1093 -0
  4. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branch.mjs +73 -0
  5. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branches.mjs +77 -0
  6. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-checkout.mjs +72 -0
  7. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-clone.mjs +72 -0
  8. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-commit.mjs +75 -0
  9. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-branch.mjs +75 -0
  10. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-file.mjs +72 -0
  11. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-diff.mjs +80 -0
  12. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list-tree.mjs +336 -0
  13. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list.mjs +199 -0
  14. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-merge.mjs +86 -0
  15. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-move.mjs +75 -0
  16. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-create.mjs +81 -0
  17. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-list.mjs +74 -0
  18. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-merge.mjs +83 -0
  19. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-view.mjs +71 -0
  20. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-push.mjs +71 -0
  21. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-read.mjs +277 -0
  22. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-search.mjs +370 -0
  23. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-stash.mjs +116 -0
  24. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-sync.mjs +71 -0
  25. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-write.mjs +74 -0
  26. package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/lib/path-validator.mjs +167 -0
  27. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/SKILL.md +605 -0
  28. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-create.mjs +127 -0
  29. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-delete.mjs +77 -0
  30. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-diff.mjs +87 -0
  31. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-history.mjs +99 -0
  32. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-list.mjs +174 -0
  33. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-read.mjs +214 -0
  34. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-restore.mjs +75 -0
  35. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-search.mjs +270 -0
  36. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-sync-back.mjs +155 -0
  37. package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-update.mjs +100 -0
  38. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/SKILL.md +414 -0
  39. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/create-project.mjs +91 -0
  40. package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/finalize-project.mjs +162 -0
  41. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/SKILL.md +206 -0
  42. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/package.json +19 -0
  43. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-analyze.mjs +309 -0
  44. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-compress.mjs +315 -0
  45. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-split.mjs +275 -0
  46. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-to-text.mjs +336 -0
  47. package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/test-pdf-scripts.mjs +491 -0
  48. package/botrun-c/.claude/skills/docx-to-markdown/SKILL.md +76 -0
  49. package/botrun-c/.claude/skills/docx-to-markdown/scripts/convert_docx.py +183 -0
  50. package/botrun-c/.claude/skills/gcp-coord-ml-ocr/SKILL.md +133 -0
  51. package/botrun-c/.claude/skills/gcp-coord-ml-ocr/scripts/ocr_processor.py +381 -0
  52. package/botrun-c/.claude/skills/gemini-transcribe/SKILL.md +115 -0
  53. package/botrun-c/.claude/skills/gemini-transcribe/scripts/transcribe.py +499 -0
  54. package/botrun-c/.claude/skills/nchc-transcribe/SKILL.md +131 -0
  55. package/botrun-c/.claude/skills/nchc-transcribe/scripts/transcribe.py +522 -0
  56. package/botrun-c/.claude/skills/p320-moj-review/SKILL.md +200 -0
  57. package/botrun-c/.claude/skills/p320-moj-review/references/guideline.md +118 -0
  58. package/botrun-c/.claude/skills/pdf-multimodal-processor/SKILL.md +186 -0
  59. package/botrun-c/.claude/skills/pdf-multimodal-processor/scripts/process_pdf.py +515 -0
  60. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/SKILL.md +81 -0
  61. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/package.json +13 -0
  62. package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/secure-search.mjs +232 -0
  63. package/botrun-c/.claude/skills/top100/351/240/230/350/242/226/351/240/220/346/270/254/346/212/200/350/203/275/SKILL.md +518 -0
  64. package/botrun-c/.claude/skills//345/216/273/350/255/230/345/210/245/346/212/200/350/203/275/SKILL.md +125 -0
  65. package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/SKILL.md +123 -0
  66. package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/scripts/recall.mjs +339 -0
  67. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/SKILL.md +156 -0
  68. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/__tests__/utils.test.mjs +139 -0
  69. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/constants.mjs +40 -0
  70. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/gcs-uploader.mjs +195 -0
  71. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/gemini-image-client.mjs +307 -0
  72. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/generate-image.mjs +103 -0
  73. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/image-session-manager.mjs +219 -0
  74. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/output-formatter.mjs +209 -0
  75. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/package.json +20 -0
  76. package/botrun-c/.claude/skills//345/234/226/347/211/207/347/224/237/346/210/220/346/212/200/350/203/275/scripts/utils.mjs +115 -0
  77. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/SKILL.md +86 -0
  78. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/scripts/multimodal-read.mjs +304 -0
  79. package/botrun-c/.claude/skills//345/244/232/346/250/241/346/205/213/351/226/261/350/256/200/346/212/200/350/203/275/scripts/package.json +17 -0
  80. package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/SKILL.md +131 -0
  81. package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/scripts/skill-manager.mjs +542 -0
  82. package/botrun-c/.claude/skills//346/234/203/350/255/260/350/250/230/351/214/204/346/212/200/350/203/275/SKILL.md +127 -0
  83. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/SKILL.md +53 -0
  84. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/scripts/package.json +13 -0
  85. package/botrun-c/.claude/skills//347/233/256/351/214/204/345/210/227/350/241/250/346/212/200/350/203/275/scripts/tree-view.mjs +149 -0
  86. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/SKILL.md +82 -0
  87. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/scripts/package.json +16 -0
  88. package/botrun-c/.claude/skills//347/264/224/346/226/207/345/255/227/345/244/232/346/252/224/346/241/210/350/256/200/345/217/226/346/212/200/350/203/275/scripts/secure-read.mjs +260 -0
  89. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/SKILL.md +156 -0
  90. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/package.json +16 -0
  91. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.js +139 -0
  92. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.mjs +272 -0
  93. package/botrun-c/.claude/skills//347/266/262/350/267/257/346/220/234/345/260/213/346/212/200/350/203/275/scripts/search.ts +166 -0
  94. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/SKILL.md +114 -0
  95. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/remember.mjs +159 -0
  96. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test-advanced.mjs +342 -0
  97. package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test.mjs +430 -0
  98. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/SKILL.md +30 -0
  99. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/scripts/package.json +13 -0
  100. package/botrun-c/.claude/skills//350/252/236/351/237/263/350/275/211/346/226/207/345/255/227/346/212/200/350/203/275/scripts/transcribe.mjs +294 -0
  101. package/botrun-c/.claude/skills//351/233/266/345/271/273/350/246/272/350/255/211/346/230/216/346/212/200/350/203/275/SKILL.md +338 -0
  102. package/botrun-c/.dockerignore +131 -0
  103. package/botrun-c/.dockeroptimize +13 -0
  104. package/botrun-c/.firebase/hosting.b3V0.cache +30 -0
  105. package/botrun-c/.firebaserc +5 -0
  106. package/botrun-c/.gcloudignore +56 -0
  107. package/botrun-c/.ruby-version +1 -0
  108. package/botrun-c/CHANGELOG.md +224 -0
  109. package/botrun-c/Dockerfile.gcp +365 -0
  110. package/botrun-c/Dockerfile.slim +195 -0
  111. package/botrun-c/Gemfile +8 -0
  112. package/botrun-c/Gemfile.lock +233 -0
  113. package/botrun-c/LOCAL-DEVELOPMENT-GUIDE.md +393 -0
  114. package/botrun-c/PLAN.md +131 -0
  115. package/botrun-c/README.md +129 -0
  116. package/botrun-c/TODO-CAPACITOR-INTEGRATION.md +482 -0
  117. package/botrun-c/VERIFICATION.md +121 -0
  118. package/botrun-c/admin/RATE_LIMIT_MANAGEMENT.md +312 -0
  119. package/botrun-c/admin/README.md +338 -0
  120. package/botrun-c/admin/botrun-billing-report-1765235244038.csv +22 -0
  121. package/botrun-c/admin/botrun-billing-report-1765235323089.csv +22 -0
  122. package/botrun-c/admin/botrun-dashboard-1765235244039.html +278 -0
  123. package/botrun-c/admin/botrun-dashboard-1765235323089.html +278 -0
  124. package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235244039.html +161 -0
  125. package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235323090.html +161 -0
  126. package/botrun-c/admin/check-billing.ts +48 -0
  127. package/botrun-c/admin/count-all-users.ts +65 -0
  128. package/botrun-c/admin/generate-analytics-report.ts +188 -0
  129. package/botrun-c/admin/jest.config.ts +43 -0
  130. package/botrun-c/admin/lib/__tests__/formatters.test.ts +264 -0
  131. package/botrun-c/admin/lib/__tests__/mocks/firebase.mock.ts +112 -0
  132. package/botrun-c/admin/lib/__tests__/services/UserService.test.ts +83 -0
  133. package/botrun-c/admin/lib/__tests__/user-resolver.test.ts +439 -0
  134. package/botrun-c/admin/lib/analyzers/BillingAnalyticsService.ts +242 -0
  135. package/botrun-c/admin/lib/analyzers/CsvExporter.ts +263 -0
  136. package/botrun-c/admin/lib/analyzers/HtmlChartGenerator.ts +530 -0
  137. package/botrun-c/admin/lib/analyzers/SpikeAnalyzer.ts +608 -0
  138. package/botrun-c/admin/lib/analyzers/TimeSeriesAnalyzer.ts +344 -0
  139. package/botrun-c/admin/lib/cli/CLIBootstrapper.ts +40 -0
  140. package/botrun-c/admin/lib/commands/AbstractCommand.ts +69 -0
  141. package/botrun-c/admin/lib/commands/AnalyticsCommand.ts +215 -0
  142. package/botrun-c/admin/lib/commands/ListCommand.ts +85 -0
  143. package/botrun-c/admin/lib/commands/QueryCommand.ts +81 -0
  144. package/botrun-c/admin/lib/commands/SpikeCommand.ts +83 -0
  145. package/botrun-c/admin/lib/domain/User.ts +38 -0
  146. package/botrun-c/admin/lib/firebase.ts +92 -0
  147. package/botrun-c/admin/lib/firestore-safe.ts +105 -0
  148. package/botrun-c/admin/lib/formatters.ts +154 -0
  149. package/botrun-c/admin/lib/rate-limit-detailed.ts +355 -0
  150. package/botrun-c/admin/lib/rate-limit.ts +286 -0
  151. package/botrun-c/admin/lib/repositories/UserRepository.ts +104 -0
  152. package/botrun-c/admin/lib/services/UserService.ts +108 -0
  153. package/botrun-c/admin/lib/types.ts +56 -0
  154. package/botrun-c/admin/lib/user-resolver.ts +275 -0
  155. package/botrun-c/admin/manage-auth-domains.js +178 -0
  156. package/botrun-c/admin/migrate-plan-free.sh +64 -0
  157. package/botrun-c/admin/package-lock.json +5656 -0
  158. package/botrun-c/admin/package.json +28 -0
  159. package/botrun-c/admin/rate-limit.sh +55 -0
  160. package/botrun-c/admin/remove-custom-limits.ts +75 -0
  161. package/botrun-c/admin/reset-rate.sh +70 -0
  162. package/botrun-c/admin/reset-trial.sh +68 -0
  163. package/botrun-c/admin/seed-trial-data.sh +38 -0
  164. package/botrun-c/admin/trial.sh +55 -0
  165. package/botrun-c/admin/tsconfig.json +20 -0
  166. package/botrun-c/admin/users-cli.py +298 -0
  167. package/botrun-c/admin/users.sh +12 -0
  168. package/botrun-c/admin/users.ts +1321 -0
  169. package/botrun-c/api/admin-tools/check-whitelist.mjs.migration-bak +74 -0
  170. package/botrun-c/api/admin-tools/create-user.mjs +92 -0
  171. package/botrun-c/api/admin-tools/create-user.mjs.migration-bak +92 -0
  172. package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py +287 -0
  173. package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py.migration-bak +287 -0
  174. package/botrun-c/api/admin-tools/init-firestore.mjs +75 -0
  175. package/botrun-c/api/admin-tools/init-firestore.mjs.migration-bak +101 -0
  176. package/botrun-c/api/admin-tools/list-users.mjs +43 -0
  177. package/botrun-c/api/admin-tools/list-users.mjs.migration-bak +43 -0
  178. package/botrun-c/api/admin-tools/manage-authorized-domains.ts +255 -0
  179. package/botrun-c/api/admin-tools/manage-authorized-domains.ts.migration-bak +255 -0
  180. package/botrun-c/api/admin-tools/setup-custom-claims.ts.migration-bak +155 -0
  181. package/botrun-c/api/admin-tools/test-claims.mjs +69 -0
  182. package/botrun-c/api/admin-tools/test-claims.mjs.migration-bak +69 -0
  183. package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs +72 -0
  184. package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs.migration-bak +72 -0
  185. package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs +159 -0
  186. package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs.migration-bak +159 -0
  187. package/botrun-c/api/admin-tools/update-service-urls.mjs +82 -0
  188. package/botrun-c/api/admin-tools/update-service-urls.mjs.migration-bak +82 -0
  189. package/botrun-c/api/package-lock.json +5031 -0
  190. package/botrun-c/api/package.json +63 -0
  191. package/botrun-c/api/pnpm-lock.yaml +4157 -0
  192. package/botrun-c/api/rate-limit-export-1763620678737.csv +79 -0
  193. package/botrun-c/api/scripts/README-migrate-plan-free.md +197 -0
  194. package/botrun-c/api/scripts/check-users.ts +45 -0
  195. package/botrun-c/api/scripts/delete-firestore-docs.js +43 -0
  196. package/botrun-c/api/scripts/dump-subscriptions.ts +395 -0
  197. package/botrun-c/api/scripts/list-all-users.ts +65 -0
  198. package/botrun-c/api/scripts/migrate-plan-free-rpd-16to32.ts +262 -0
  199. package/botrun-c/api/scripts/migrate-plan-names-to-lite-max.ts +269 -0
  200. package/botrun-c/api/scripts/query-user-info.ts +304 -0
  201. package/botrun-c/api/scripts/reset-rate-limit.ts +206 -0
  202. package/botrun-c/api/scripts/reset-trial-subscription.ts +166 -0
  203. package/botrun-c/api/scripts/rollback-plan-names-from-lite-max.ts +139 -0
  204. package/botrun-c/api/scripts/seed-rate-limit-test-data.ts +114 -0
  205. package/botrun-c/api/scripts/seed-subscription-test-data.ts +173 -0
  206. package/botrun-c/api/scripts/test-rate-limit-message.ts +108 -0
  207. package/botrun-c/api/test-billing-write.ts +103 -0
  208. package/botrun-c/api/test-billing.ts +81 -0
  209. package/botrun-c/api/test-chat-upload.sh +162 -0
  210. package/botrun-c/api/test-nchc-whisper.ts +87 -0
  211. package/botrun-c/api/test-skills-loading.js +77 -0
  212. package/botrun-c/api/test-skills-symlink.js +118 -0
  213. package/botrun-c/api/test-upload-multimodal.sh +167 -0
  214. package/botrun-c/api/tsconfig.json +27 -0
  215. package/botrun-c/api/verify-form-2-1.mjs +229 -0
  216. package/botrun-c/api/vitest.config.ts +9 -0
  217. package/botrun-c/appium-capabilities.json +20 -0
  218. package/botrun-c/cors.json +26 -0
  219. package/botrun-c/delete-old.sh +44 -0
  220. package/botrun-c/design/google-drive/01-architecture.md +186 -0
  221. package/botrun-c/design/google-drive/02-api-design.md +314 -0
  222. package/botrun-c/design/google-drive/03-frontend-design.md +278 -0
  223. package/botrun-c/design/google-drive/04-skill-design.md +384 -0
  224. package/botrun-c/design/google-drive/05-test-plan.md +507 -0
  225. package/botrun-c/design/google-drive/README.md +32 -0
  226. package/botrun-c/dev/mcp-token-calculator/README.md +92 -0
  227. package/botrun-c/dev/mcp-token-calculator/RESULTS.md +188 -0
  228. package/botrun-c/dev/mcp-token-calculator/calculate-current-tokens.ts +369 -0
  229. package/botrun-c/dev/mcp-token-calculator/calculate-mcp-tokens.ts +464 -0
  230. package/botrun-c/dev/mcp-token-calculator/optimization-proposals.ts +316 -0
  231. package/botrun-c/dev/mcp-token-calculator/package-lock.json +599 -0
  232. package/botrun-c/dev/mcp-token-calculator/package.json +22 -0
  233. package/botrun-c/dev/mcp-token-calculator/test-all-schemas.ts +314 -0
  234. package/botrun-c/dev/mcp-token-calculator/test-schema-correctness.ts +221 -0
  235. package/botrun-c/dev/mcp-token-calculator/verify-optimization.ts +159 -0
  236. package/botrun-c/fastlane/ANDROID-DEPLOYMENT-SETUP.md +825 -0
  237. package/botrun-c/fastlane/IOS-DEPLOYMENT-SETUP.md +431 -0
  238. package/botrun-c/fastlane/Pluginfile +5 -0
  239. package/botrun-c/fastlane/QUICK-START.md +133 -0
  240. package/botrun-c/fastlane/README.md +424 -0
  241. package/botrun-c/fastlane/RUBY-SETUP.md +449 -0
  242. package/botrun-c/fastlane/android/Appfile +11 -0
  243. package/botrun-c/fastlane/android/Fastfile +240 -0
  244. package/botrun-c/firebase.json +46 -0
  245. package/botrun-c/firestore-init-data.json +40 -0
  246. package/botrun-c/firestore.indexes.json +55 -0
  247. package/botrun-c/firestore.rules +53 -0
  248. package/botrun-c/fix-codex-permissions.sh +56 -0
  249. package/botrun-c/gcs-lifecycle-30day-retention.json +12 -0
  250. package/botrun-c/html-architecture/architecture/deployment.html +664 -0
  251. package/botrun-c/html-architecture/architecture/index.html +309 -0
  252. package/botrun-c/html-architecture/architecture/styles.css +500 -0
  253. package/botrun-c/html-architecture/architecture/system-components.html +538 -0
  254. package/botrun-c/html-architecture/architecture/user-flow.html +370 -0
  255. package/botrun-c/mobile-android/FIREBASE-AUTH-SETUP.md +302 -0
  256. package/botrun-c/mobile-android/WSL-ANDROID-SETUP.md +252 -0
  257. package/botrun-c/mobile-android/android/app/build.gradle +75 -0
  258. package/botrun-c/mobile-android/android/app/capacitor.build.gradle +31 -0
  259. package/botrun-c/mobile-android/android/app/proguard-rules.pro +21 -0
  260. package/botrun-c/mobile-android/android/build.gradle +29 -0
  261. package/botrun-c/mobile-android/android/capacitor.settings.gradle +42 -0
  262. package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  263. package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  264. package/botrun-c/mobile-android/android/gradle.properties +22 -0
  265. package/botrun-c/mobile-android/android/gradlew +252 -0
  266. package/botrun-c/mobile-android/android/gradlew.bat +94 -0
  267. package/botrun-c/mobile-android/android/settings.gradle +5 -0
  268. package/botrun-c/mobile-android/android/variables.gradle +16 -0
  269. package/botrun-c/mobile-android/capacitor.config.ts +44 -0
  270. package/botrun-c/mobile-android/fastlane/Appfile +11 -0
  271. package/botrun-c/mobile-android/fastlane/Fastfile +202 -0
  272. package/botrun-c/mobile-android/fastlane/README.md +96 -0
  273. package/botrun-c/mobile-android/google-services.json.template +39 -0
  274. package/botrun-c/mobile-android/package.json +32 -0
  275. package/botrun-c/mobile-android/resources/icon.png +0 -0
  276. package/botrun-c/mobile-android/tsconfig.json +15 -0
  277. package/botrun-c/mobile-ios/.ruby-version +1 -0
  278. package/botrun-c/mobile-ios/BUILD-LOG.md +82 -0
  279. package/botrun-c/mobile-ios/Gemfile +4 -0
  280. package/botrun-c/mobile-ios/Gemfile.lock +299 -0
  281. package/botrun-c/mobile-ios/GoogleService-Info.plist.template +34 -0
  282. package/botrun-c/mobile-ios/IOS-PERMISSIONS.md +80 -0
  283. package/botrun-c/mobile-ios/QUICK-START.md +189 -0
  284. package/botrun-c/mobile-ios/README.md +231 -0
  285. package/botrun-c/mobile-ios/capacitor.config.ts +46 -0
  286. package/botrun-c/mobile-ios/fastlane/Fastfile +326 -0
  287. package/botrun-c/mobile-ios/fastlane/README.md +88 -0
  288. package/botrun-c/mobile-ios/ios/App/App/App.entitlements +10 -0
  289. package/botrun-c/mobile-ios/ios/App/App/AppDelegate.swift +49 -0
  290. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png +0 -0
  291. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
  292. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Contents.json +6 -0
  293. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +56 -0
  294. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png +0 -0
  295. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png +0 -0
  296. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png +0 -0
  297. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png +0 -0
  298. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png +0 -0
  299. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png +0 -0
  300. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  301. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  302. package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  303. package/botrun-c/mobile-ios/ios/App/App/Base.lproj/LaunchScreen.storyboard +32 -0
  304. package/botrun-c/mobile-ios/ios/App/App/Base.lproj/Main.storyboard +19 -0
  305. package/botrun-c/mobile-ios/ios/App/App/Info.plist +72 -0
  306. package/botrun-c/mobile-ios/ios/App/App.xcodeproj/project.pbxproj +446 -0
  307. package/botrun-c/mobile-ios/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme +78 -0
  308. package/botrun-c/mobile-ios/ios/App/App.xcworkspace/contents.xcworkspacedata +10 -0
  309. package/botrun-c/mobile-ios/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  310. package/botrun-c/mobile-ios/ios/App/Podfile +52 -0
  311. package/botrun-c/mobile-ios/ios/App/Podfile.lock +205 -0
  312. package/botrun-c/mobile-ios/ios/App/add_plist.rb +30 -0
  313. package/botrun-c/mobile-ios/ios/App/fix_plist_path.rb +22 -0
  314. package/botrun-c/mobile-ios/package.json +29 -0
  315. package/botrun-c/mobile-ios/resources/icon.png +0 -0
  316. package/botrun-c/mobile-ios/run-simulator.sh +34 -0
  317. package/botrun-c/mobile-ios/screenshot-after-clean-rebuild.png +0 -0
  318. package/botrun-c/mobile-ios/screenshot-final-version.png +0 -0
  319. package/botrun-c/mobile-ios/screenshot-simulator.png +0 -0
  320. package/botrun-c/mobile-ios/screenshot-version-1009.png +0 -0
  321. package/botrun-c/mobile-ios/screenshot-with-version.png +0 -0
  322. package/botrun-c/mobile-ios/screenshot-working.png +0 -0
  323. package/botrun-c/mobile-ios/setup-ios.sh +106 -0
  324. package/botrun-c/mobile-ios/tsconfig.json +16 -0
  325. package/botrun-c/org-policy-allow-all-users.yaml +3 -0
  326. package/botrun-c/package.json +68 -0
  327. package/botrun-c/pnpm-lock.yaml +10198 -0
  328. package/botrun-c/pnpm-workspace.yaml +6 -0
  329. package/botrun-c/prompts/BOTRUN-1.md +13 -0
  330. package/botrun-c/prompts/BOTRUN-2.md +70 -0
  331. package/botrun-c/prompts/BOTRUN-3.md +139 -0
  332. package/botrun-c/prototypes/firestore-gax-debug/package-lock.json +1204 -0
  333. package/botrun-c/prototypes/firestore-gax-debug/package.json +12 -0
  334. package/botrun-c/prototypes/firestore-gax-debug/pnpm-workspace.yaml +2 -0
  335. package/botrun-c/prototypes/firestore-gax-debug/test.js +98 -0
  336. package/botrun-c/prototypes/taiwan-haiku/README.md +93 -0
  337. package/botrun-c/prototypes/taiwan-haiku/index.ts +139 -0
  338. package/botrun-c/prototypes/taiwan-haiku/package.json +23 -0
  339. package/botrun-c/prototypes/taiwan-haiku/pnpm-lock.yaml +730 -0
  340. package/botrun-c/prototypes/taiwan-haiku/test-vertex-direct.ts +83 -0
  341. package/botrun-c/prototypes/taiwan-haiku/tsconfig.json +18 -0
  342. package/botrun-c/prototypes/web-search/FINDINGS-STAGE-1.md +48 -0
  343. package/botrun-c/prototypes/web-search/README.md +46 -0
  344. package/botrun-c/prototypes/web-search/VERIFICATION-REPORT.md +310 -0
  345. package/botrun-c/prototypes/web-search/package-lock.json +595 -0
  346. package/botrun-c/prototypes/web-search/package.json +18 -0
  347. package/botrun-c/prototypes/web-search/stage-1.1-basic-connection.js +123 -0
  348. package/botrun-c/prototypes/web-search/stage-1.2-with-websearch.js +154 -0
  349. package/botrun-c/prototypes/web-search/stage-1.3-search-query.js +192 -0
  350. package/botrun-c/prototypes/web-search/stage-2-agent-sdk-websearch.js +265 -0
  351. package/botrun-c/runtime-scripts/env-detect.sh +64 -0
  352. package/botrun-c/scripts/github-collaborator-manager.sh +297 -0
  353. package/botrun-c/scripts/github-collaborator-manager.ts +325 -0
  354. package/botrun-c/scripts/manage-collaborators.sh +91 -0
  355. package/botrun-c/scripts/setup-secrets.sh +202 -0
  356. package/botrun-c/scripts/stress-test-17-users.sh +113 -0
  357. package/botrun-c/scripts/stress-test-api.sh +119 -0
  358. package/botrun-c/scripts/stress-test-full-report.sh +385 -0
  359. package/botrun-c/specs/infra-vm/design.md +0 -0
  360. package/botrun-c/specs/share-skill/design.md +1146 -0
  361. package/botrun-c/specs/share-skill/tasks.md +444 -0
  362. package/botrun-c/stress-test-results/20260121-162630/config.json +7 -0
  363. package/botrun-c/stress-test-results/20260121-162630/user-1-status.txt +1 -0
  364. package/botrun-c/stress-test-results/20260121-162630/user-1-timing.txt +1 -0
  365. package/botrun-c/stress-test-results/20260121-162630/user-1.json +2 -0
  366. package/botrun-c/stress-test-results/20260121-162646/config.json +7 -0
  367. package/botrun-c/stress-test-results/20260121-162646/user-1-status.txt +1 -0
  368. package/botrun-c/stress-test-results/20260121-162646/user-1-timing.txt +1 -0
  369. package/botrun-c/stress-test-results/20260121-162646/user-1.json +2 -0
  370. package/botrun-c/stress-test-results/20260121-162646/user-10-status.txt +1 -0
  371. package/botrun-c/stress-test-results/20260121-162646/user-10-timing.txt +1 -0
  372. package/botrun-c/stress-test-results/20260121-162646/user-10.json +2 -0
  373. package/botrun-c/stress-test-results/20260121-162646/user-11-status.txt +1 -0
  374. package/botrun-c/stress-test-results/20260121-162646/user-11-timing.txt +1 -0
  375. package/botrun-c/stress-test-results/20260121-162646/user-11.json +2 -0
  376. package/botrun-c/stress-test-results/20260121-162646/user-12-status.txt +1 -0
  377. package/botrun-c/stress-test-results/20260121-162646/user-12-timing.txt +1 -0
  378. package/botrun-c/stress-test-results/20260121-162646/user-12.json +2 -0
  379. package/botrun-c/stress-test-results/20260121-162646/user-13-status.txt +1 -0
  380. package/botrun-c/stress-test-results/20260121-162646/user-13-timing.txt +1 -0
  381. package/botrun-c/stress-test-results/20260121-162646/user-13.json +2 -0
  382. package/botrun-c/stress-test-results/20260121-162646/user-14-status.txt +1 -0
  383. package/botrun-c/stress-test-results/20260121-162646/user-14-timing.txt +1 -0
  384. package/botrun-c/stress-test-results/20260121-162646/user-14.json +2 -0
  385. package/botrun-c/stress-test-results/20260121-162646/user-15-status.txt +1 -0
  386. package/botrun-c/stress-test-results/20260121-162646/user-15-timing.txt +1 -0
  387. package/botrun-c/stress-test-results/20260121-162646/user-15.json +2 -0
  388. package/botrun-c/stress-test-results/20260121-162646/user-16-status.txt +1 -0
  389. package/botrun-c/stress-test-results/20260121-162646/user-16-timing.txt +1 -0
  390. package/botrun-c/stress-test-results/20260121-162646/user-16.json +2 -0
  391. package/botrun-c/stress-test-results/20260121-162646/user-17-status.txt +1 -0
  392. package/botrun-c/stress-test-results/20260121-162646/user-17-timing.txt +1 -0
  393. package/botrun-c/stress-test-results/20260121-162646/user-17.json +2 -0
  394. package/botrun-c/stress-test-results/20260121-162646/user-2-status.txt +1 -0
  395. package/botrun-c/stress-test-results/20260121-162646/user-2-timing.txt +1 -0
  396. package/botrun-c/stress-test-results/20260121-162646/user-2.json +2 -0
  397. package/botrun-c/stress-test-results/20260121-162646/user-3-status.txt +1 -0
  398. package/botrun-c/stress-test-results/20260121-162646/user-3-timing.txt +1 -0
  399. package/botrun-c/stress-test-results/20260121-162646/user-3.json +2 -0
  400. package/botrun-c/stress-test-results/20260121-162646/user-4-status.txt +1 -0
  401. package/botrun-c/stress-test-results/20260121-162646/user-4-timing.txt +1 -0
  402. package/botrun-c/stress-test-results/20260121-162646/user-4.json +2 -0
  403. package/botrun-c/stress-test-results/20260121-162646/user-5-status.txt +1 -0
  404. package/botrun-c/stress-test-results/20260121-162646/user-5-timing.txt +1 -0
  405. package/botrun-c/stress-test-results/20260121-162646/user-5.json +2 -0
  406. package/botrun-c/stress-test-results/20260121-162646/user-6-status.txt +1 -0
  407. package/botrun-c/stress-test-results/20260121-162646/user-6-timing.txt +1 -0
  408. package/botrun-c/stress-test-results/20260121-162646/user-6.json +2 -0
  409. package/botrun-c/stress-test-results/20260121-162646/user-7-status.txt +1 -0
  410. package/botrun-c/stress-test-results/20260121-162646/user-7-timing.txt +1 -0
  411. package/botrun-c/stress-test-results/20260121-162646/user-7.json +2 -0
  412. package/botrun-c/stress-test-results/20260121-162646/user-8-status.txt +1 -0
  413. package/botrun-c/stress-test-results/20260121-162646/user-8-timing.txt +1 -0
  414. package/botrun-c/stress-test-results/20260121-162646/user-8.json +2 -0
  415. package/botrun-c/stress-test-results/20260121-162646/user-9-status.txt +1 -0
  416. package/botrun-c/stress-test-results/20260121-162646/user-9-timing.txt +1 -0
  417. package/botrun-c/stress-test-results/20260121-162646/user-9.json +2 -0
  418. package/botrun-c/stress-test-results/20260121-163148/REPORT.html +344 -0
  419. package/botrun-c/stress-test-results/20260121-163148/REPORT.md +93 -0
  420. package/botrun-c/stress-test-results/20260121-163148/REPORT.pdf +0 -0
  421. package/botrun-c/stress-test-results/20260121-163148/config.json +7 -0
  422. package/botrun-c/stress-test-results/20260121-163148/summary.json +26 -0
  423. package/botrun-c/stress-test-results/20260121-163148/user-1-status.txt +1 -0
  424. package/botrun-c/stress-test-results/20260121-163148/user-1-timing.txt +1 -0
  425. package/botrun-c/stress-test-results/20260121-163148/user-1.json +206 -0
  426. package/botrun-c/stress-test-results/20260121-163148/user-10-status.txt +1 -0
  427. package/botrun-c/stress-test-results/20260121-163148/user-10-timing.txt +1 -0
  428. package/botrun-c/stress-test-results/20260121-163148/user-10.json +110 -0
  429. package/botrun-c/stress-test-results/20260121-163148/user-11-status.txt +1 -0
  430. package/botrun-c/stress-test-results/20260121-163148/user-11-timing.txt +1 -0
  431. package/botrun-c/stress-test-results/20260121-163148/user-11.json +104 -0
  432. package/botrun-c/stress-test-results/20260121-163148/user-12-status.txt +1 -0
  433. package/botrun-c/stress-test-results/20260121-163148/user-12-timing.txt +1 -0
  434. package/botrun-c/stress-test-results/20260121-163148/user-12.json +98 -0
  435. package/botrun-c/stress-test-results/20260121-163148/user-13-status.txt +1 -0
  436. package/botrun-c/stress-test-results/20260121-163148/user-13-timing.txt +1 -0
  437. package/botrun-c/stress-test-results/20260121-163148/user-13.json +68 -0
  438. package/botrun-c/stress-test-results/20260121-163148/user-14-status.txt +1 -0
  439. package/botrun-c/stress-test-results/20260121-163148/user-14-timing.txt +1 -0
  440. package/botrun-c/stress-test-results/20260121-163148/user-14.json +116 -0
  441. package/botrun-c/stress-test-results/20260121-163148/user-15-status.txt +1 -0
  442. package/botrun-c/stress-test-results/20260121-163148/user-15-timing.txt +1 -0
  443. package/botrun-c/stress-test-results/20260121-163148/user-15.json +131 -0
  444. package/botrun-c/stress-test-results/20260121-163148/user-16-status.txt +1 -0
  445. package/botrun-c/stress-test-results/20260121-163148/user-16-timing.txt +1 -0
  446. package/botrun-c/stress-test-results/20260121-163148/user-16.json +110 -0
  447. package/botrun-c/stress-test-results/20260121-163148/user-17-status.txt +1 -0
  448. package/botrun-c/stress-test-results/20260121-163148/user-17-timing.txt +1 -0
  449. package/botrun-c/stress-test-results/20260121-163148/user-17.json +116 -0
  450. package/botrun-c/stress-test-results/20260121-163148/user-2-status.txt +1 -0
  451. package/botrun-c/stress-test-results/20260121-163148/user-2-timing.txt +1 -0
  452. package/botrun-c/stress-test-results/20260121-163148/user-2.json +98 -0
  453. package/botrun-c/stress-test-results/20260121-163148/user-3-status.txt +1 -0
  454. package/botrun-c/stress-test-results/20260121-163148/user-3-timing.txt +1 -0
  455. package/botrun-c/stress-test-results/20260121-163148/user-3.json +62 -0
  456. package/botrun-c/stress-test-results/20260121-163148/user-4-status.txt +1 -0
  457. package/botrun-c/stress-test-results/20260121-163148/user-4-timing.txt +1 -0
  458. package/botrun-c/stress-test-results/20260121-163148/user-4.json +113 -0
  459. package/botrun-c/stress-test-results/20260121-163148/user-5-status.txt +1 -0
  460. package/botrun-c/stress-test-results/20260121-163148/user-5-timing.txt +1 -0
  461. package/botrun-c/stress-test-results/20260121-163148/user-5.json +83 -0
  462. package/botrun-c/stress-test-results/20260121-163148/user-6-status.txt +1 -0
  463. package/botrun-c/stress-test-results/20260121-163148/user-6-timing.txt +1 -0
  464. package/botrun-c/stress-test-results/20260121-163148/user-6.json +125 -0
  465. package/botrun-c/stress-test-results/20260121-163148/user-7-status.txt +1 -0
  466. package/botrun-c/stress-test-results/20260121-163148/user-7-timing.txt +1 -0
  467. package/botrun-c/stress-test-results/20260121-163148/user-7.json +62 -0
  468. package/botrun-c/stress-test-results/20260121-163148/user-8-status.txt +1 -0
  469. package/botrun-c/stress-test-results/20260121-163148/user-8-timing.txt +1 -0
  470. package/botrun-c/stress-test-results/20260121-163148/user-8.json +41 -0
  471. package/botrun-c/stress-test-results/20260121-163148/user-9-status.txt +1 -0
  472. package/botrun-c/stress-test-results/20260121-163148/user-9-timing.txt +1 -0
  473. package/botrun-c/stress-test-results/20260121-163148/user-9.json +53 -0
  474. package/botrun-c/test-merge.md +1 -0
  475. package/botrun-c/version.txt +1 -0
  476. package/botrun-c/web/.version +1 -0
  477. package/botrun-c/web/ALLOW-PUBLIC-ACCESS.md +57 -0
  478. package/botrun-c/web/FINAL-SETUP-STEPS.md +71 -0
  479. package/botrun-c/web/FIREBASE-MANUAL-STEPS.md +41 -0
  480. package/botrun-c/web/QUICK-SETUP-HELPER.md +79 -0
  481. package/botrun-c/web/README.md +162 -0
  482. package/botrun-c/web/__tests__/image-extractor.test.ts +147 -0
  483. package/botrun-c/web/__tests__/useGitHub.test.ts +245 -0
  484. package/botrun-c/web/app/favicon.ico +0 -0
  485. package/botrun-c/web/app/globals.css +215 -0
  486. package/botrun-c/web/app/image-preview/page.tsx +213 -0
  487. package/botrun-c/web/app/layout.tsx +46 -0
  488. package/botrun-c/web/app/page.tsx +45 -0
  489. package/botrun-c/web/components/CapacitorProvider.tsx +43 -0
  490. package/botrun-c/web/components/ChatPage.tsx +1736 -0
  491. package/botrun-c/web/components/ConversationList.tsx +237 -0
  492. package/botrun-c/web/components/ConversationListItem.tsx +121 -0
  493. package/botrun-c/web/components/LoginPage.tsx +212 -0
  494. package/botrun-c/web/components/Providers.tsx +12 -0
  495. package/botrun-c/web/components/StatusBarProvider.tsx +16 -0
  496. package/botrun-c/web/components/attachment-preview.tsx +193 -0
  497. package/botrun-c/web/components/botrun-incubator/BotrunIncubator.tsx +266 -0
  498. package/botrun-c/web/components/botrun-incubator/index.ts +1 -0
  499. package/botrun-c/web/components/chat-input.tsx +1251 -0
  500. package/botrun-c/web/components/chat-message.tsx +598 -0
  501. package/botrun-c/web/components/drop-zone.tsx +143 -0
  502. package/botrun-c/web/components/gdrive/gdrive-add-dialog.tsx +254 -0
  503. package/botrun-c/web/components/gdrive/gdrive-drawer.tsx +236 -0
  504. package/botrun-c/web/components/gdrive/gdrive-selector.tsx +226 -0
  505. package/botrun-c/web/components/gdrive/index.ts +7 -0
  506. package/botrun-c/web/components/generated-image-card.tsx +363 -0
  507. package/botrun-c/web/components/github/GitHubConnect.tsx +366 -0
  508. package/botrun-c/web/components/github/index.ts +2 -0
  509. package/botrun-c/web/components/import-skill-dialog.tsx +208 -0
  510. package/botrun-c/web/components/scroll-to-bottom-button.tsx +90 -0
  511. package/botrun-c/web/components/share-skill-dialog.tsx +175 -0
  512. package/botrun-c/web/components/skills-editor.tsx +443 -0
  513. package/botrun-c/web/components/skills-manager-drawer.tsx +586 -0
  514. package/botrun-c/web/components/smart-button-group.tsx +132 -0
  515. package/botrun-c/web/config/smart-buttons.ts +295 -0
  516. package/botrun-c/web/config/welcome-messages.ts +29 -0
  517. package/botrun-c/web/contexts/AuthContext.tsx +220 -0
  518. package/botrun-c/web/hooks/use-toast.ts +187 -0
  519. package/botrun-c/web/hooks/useAppStoreUpdate.ts +356 -0
  520. package/botrun-c/web/hooks/useAppVersion.ts +113 -0
  521. package/botrun-c/web/hooks/useAttachments.ts +269 -0
  522. package/botrun-c/web/hooks/useAuthToken.ts +59 -0
  523. package/botrun-c/web/hooks/useAutoWelcome.ts +89 -0
  524. package/botrun-c/web/hooks/useCapacitorPlatform.ts +113 -0
  525. package/botrun-c/web/hooks/useCapawesomeLiveUpdate.ts +149 -0
  526. package/botrun-c/web/hooks/useClaudeModel.ts +118 -0
  527. package/botrun-c/web/hooks/useConversation.ts +115 -0
  528. package/botrun-c/web/hooks/useConversations.ts +235 -0
  529. package/botrun-c/web/hooks/useGdriveFolders.ts +199 -0
  530. package/botrun-c/web/hooks/useGdriveSync.ts +107 -0
  531. package/botrun-c/web/hooks/useGitHub.ts +409 -0
  532. package/botrun-c/web/hooks/useScrollToBottom.ts +150 -0
  533. package/botrun-c/web/hooks/useStatusBar.ts +42 -0
  534. package/botrun-c/web/hooks/useUserPlan.ts +153 -0
  535. package/botrun-c/web/lib/api-config.ts +162 -0
  536. package/botrun-c/web/lib/api-url.ts +62 -0
  537. package/botrun-c/web/lib/api.ts +105 -0
  538. package/botrun-c/web/lib/attachment-utils.ts +168 -0
  539. package/botrun-c/web/lib/build-version.ts +11 -0
  540. package/botrun-c/web/lib/clipboard-utils.ts +199 -0
  541. package/botrun-c/web/lib/constants.ts +62 -0
  542. package/botrun-c/web/lib/conversation-storage.ts +324 -0
  543. package/botrun-c/web/lib/firebase-capacitor.ts +135 -0
  544. package/botrun-c/web/lib/firebase.ts +137 -0
  545. package/botrun-c/web/lib/firestore-auth.ts +61 -0
  546. package/botrun-c/web/lib/firestore-auth.ts.migration-bak +319 -0
  547. package/botrun-c/web/lib/image-extractor.ts +156 -0
  548. package/botrun-c/web/lib/path-utils.ts +48 -0
  549. package/botrun-c/web/lib/rehype-del-to-mark.ts +19 -0
  550. package/botrun-c/web/lib/upload-service.ts +326 -0
  551. package/botrun-c/web/lib/utils.ts +6 -0
  552. package/botrun-c/web/next.config.js +49 -0
  553. package/botrun-c/web/package-lock.json +6711 -0
  554. package/botrun-c/web/package.json +63 -0
  555. package/botrun-c/web/postcss.config.js +6 -0
  556. package/botrun-c/web/public/apple_icon.png +0 -0
  557. package/botrun-c/web/public/google_icon.png +0 -0
  558. package/botrun-c/web/public/logo-48-small.png +0 -0
  559. package/botrun-c/web/public/logo-48.png +0 -0
  560. package/botrun-c/web/scripts/generate-version.js +36 -0
  561. package/botrun-c/web/scripts/update-build-version.js +41 -0
  562. package/botrun-c/web/tailwind.config.ts +80 -0
  563. package/botrun-c/web/test-welcome-message.mjs +115 -0
  564. package/botrun-c/web/tsconfig.json +42 -0
  565. package/botrun-c/web/types/agent.ts +6 -0
  566. package/botrun-c/web/types/attachment.ts +39 -0
  567. package/botrun-c/web/types/conversation.ts +68 -0
  568. package/botrun-c/web/types/flutter.d.ts +6 -0
  569. package/botrun-c/web/types/project.ts +41 -0
  570. package/botrun-c/web/types/skills.ts +13 -0
  571. package/botrun-c/web//350/250/272/346/226/267-Skills-/345/211/215/347/253/257/351/241/257/347/244/272/345/225/217/351/241/214.md +83 -0
  572. package/lib/prompt/prompts/zero-framework/fullstack.md +17 -0
  573. package/lib/prompt/prompts/zero-framework/segment.md +13 -0
  574. package/package.json +1 -1
@@ -0,0 +1,825 @@
1
+ # Android 自動部署設定指南
2
+
3
+ 本指南將帶你完成 Botrun Android App 的自動化部署設定,使用 Fastlane + Firebase App Distribution + Google Play Console。
4
+
5
+ ---
6
+
7
+ ## 📋 目錄
8
+
9
+ ### 快速開始(使用現有設定)
10
+
11
+ 1. [前置準備](#前置準備)
12
+ 2. [Android Studio 設定](#android-studio-設定)
13
+ 3. [取得 Service Account Keys](#取得-service-account-keys)
14
+ 4. [設定 Fastlane 配置檔](#設定-fastlane-配置檔)
15
+ 5. [執行第一次部署測試](#執行第一次部署測試)
16
+ 6. [部署流程](#部署流程)
17
+ 7. [疑難排解](#疑難排解)
18
+
19
+ ### 附錄:從零開始建立(首次設定參考)
20
+
21
+ - [附錄 A:建立 Android 平台](#附錄-a建立-android-平台)
22
+ - [附錄 B:Firebase Service Account 建立流程](#附錄-bfirebase-service-account-建立流程)
23
+ - [附錄 C:Google Play Service Account 建立流程](#附錄-cgoogle-play-service-account-建立流程)
24
+ - [附錄 D:首次手動上傳到 Google Play](#附錄-d首次手動上傳到-google-play)
25
+
26
+ ---
27
+
28
+ # 快速開始(使用現有設定)
29
+
30
+ > 💡 **適用對象:** 新加入的團隊成員,使用專案已建立好的 Service Accounts
31
+
32
+ ## 前置準備
33
+
34
+ ### ✅ 必須先完成
35
+
36
+ 1. **Ruby 環境已設定完成**
37
+ - 📖 參考 [README.md - Ruby 環境設定](./README.md#-ruby-環境設定共用)
38
+ - ✅ 確認指令可用:
39
+ ```bash
40
+ ruby --version # 應顯示 3.3.0
41
+ bundle --version # 應顯示 Bundler version 2.x
42
+ bundle exec fastlane --version # 應顯示 fastlane 2.x
43
+ ```
44
+
45
+ 2. **本地開發環境**
46
+ - ✅ Node.js & npm 已安裝
47
+ - ✅ 專案可正常建置(`npm run build` 成功)
48
+
49
+ 3. **帳號權限(向管理員申請)**
50
+ - ✅ Firebase 專案檢視權限(可選,用於查看部署狀態)
51
+ - ✅ Google Play Console 檢視權限(可選,用於查看部署狀態)
52
+
53
+ ---
54
+
55
+ ## Android Studio 設定
56
+
57
+ ### 1. 安裝 Android Studio
58
+
59
+ 從 [Android Studio 官網](https://developer.android.com/studio) 下載並安裝。
60
+
61
+ ### 2. 安裝 Android SDK 和 Build Tools
62
+
63
+ 在 Android Studio 中:
64
+ - 開啟 **Preferences / Settings**
65
+ - 導航到 **Appearance & Behavior → System Settings → Android SDK**
66
+ - 安裝至少一個 **Android SDK Platform**(建議最新穩定版)
67
+ - 安裝 **Android SDK Build-Tools**(建議最新版)
68
+
69
+ ### 3. 設定 ANDROID_HOME 環境變數
70
+
71
+ **macOS/Linux:**
72
+ ```bash
73
+ # 加入到 ~/.zshrc 或 ~/.bashrc
74
+ export ANDROID_HOME=$HOME/Library/Android/sdk
75
+ export PATH=$PATH:$ANDROID_HOME/emulator
76
+ export PATH=$PATH:$ANDROID_HOME/tools
77
+ export PATH=$PATH:$ANDROID_HOME/tools/bin
78
+ export PATH=$PATH:$ANDROID_HOME/platform-tools
79
+
80
+ # 重新載入 shell
81
+ source ~/.zshrc # 或 source ~/.bashrc
82
+ ```
83
+
84
+ **Windows (PowerShell):**
85
+ ```powershell
86
+ # 設定用戶環境變數(永久)
87
+ [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", 'User')
88
+ [System.Environment]::SetEnvironmentVariable('Path', "$env:Path;$env:LOCALAPPDATA\Android\Sdk\platform-tools", 'User')
89
+
90
+ # 重新開啟 PowerShell
91
+ ```
92
+
93
+ ### 4. 驗證安裝
94
+
95
+ ```bash
96
+ # 檢查 ANDROID_HOME
97
+ echo $ANDROID_HOME # macOS/Linux
98
+ echo $env:ANDROID_HOME # Windows PowerShell
99
+
100
+ # 檢查 adb
101
+ adb --version
102
+ # 應顯示 Android Debug Bridge 版本資訊
103
+ ```
104
+
105
+ ---
106
+
107
+ ## 取得 Service Account Keys
108
+
109
+ ### 需要的檔案
110
+
111
+ 向專案管理員(目前是 Seba)索取以下兩個 JSON 檔案:
112
+
113
+ 1. **Firebase Service Account Key**
114
+ - 用於:上傳 APK 到 Firebase App Distribution
115
+ - 檔案名稱:`botrun-c-xxxxx.json`(或類似名稱)
116
+
117
+ 2. **Google Play Service Account Key**
118
+ - 用於:上傳 AAB 到 Google Play Console
119
+ - 檔案名稱:`botrun-c-xxxxx.json`(或類似名稱)
120
+
121
+ ### 設定步驟
122
+
123
+ 收到檔案後,執行以下指令:
124
+
125
+ ```bash
126
+ # 進入專案目錄
127
+ cd /path/to/botrun-c
128
+
129
+ # 建立目錄(如果不存在)
130
+ mkdir -p mobile-android/fastlane
131
+
132
+ # 複製 Firebase Service Account Key
133
+ cp ~/Downloads/firebase-檔案名稱.json mobile-android/fastlane/firebase-service-account.json
134
+
135
+ # 複製 Google Play Service Account Key
136
+ cp ~/Downloads/google-play-檔案名稱.json mobile-android/fastlane/google-play-service-account.json
137
+
138
+ # 設定安全權限(只有你可以讀寫)
139
+ chmod 600 mobile-android/fastlane/firebase-service-account.json
140
+ chmod 600 mobile-android/fastlane/google-play-service-account.json
141
+
142
+ # 驗證檔案已被 git ignore
143
+ git check-ignore -v mobile-android/fastlane/firebase-service-account.json
144
+ git check-ignore -v mobile-android/fastlane/google-play-service-account.json
145
+ # 兩個都應該顯示被 .gitignore 排除
146
+ ```
147
+
148
+ ✅ **安全提醒:** 這兩個檔案已自動被 `.gitignore` 排除,**絕對不要** commit 到 git!
149
+
150
+ ---
151
+
152
+ ## 設定 Fastlane 配置檔
153
+
154
+ ### 1. 建立 .env 檔案
155
+
156
+ ```bash
157
+ cd /path/to/botrun-c/mobile-android/fastlane
158
+
159
+ # 複製現有的 .env(如果不存在的話,向管理員索取)
160
+ # .env 檔案已經在 mobile-android/fastlane/.env
161
+ ```
162
+
163
+ ### 2. 確認 .env 內容
164
+
165
+ 確認 `mobile-android/fastlane/.env` 包含以下資訊:
166
+
167
+ ```bash
168
+ # === Firebase ===
169
+ FIREBASE_APP_ID=1:257949799705:android:2806947bf699e29d0d6188
170
+
171
+ # Service Account JSON 檔案路徑(相對於此 Fastfile 的路徑)
172
+ FIREBASE_SERVICE_ACCOUNT=./firebase-service-account.json
173
+
174
+ # === Google Play ===
175
+ GOOGLE_PLAY_SERVICE_ACCOUNT=./google-play-service-account.json
176
+
177
+ # === Build Paths ===
178
+ ANDROID_PROJECT_PATH=../android
179
+ ```
180
+
181
+ ### 3. 設定權限
182
+
183
+ ```bash
184
+ chmod 600 mobile-android/fastlane/.env
185
+ ```
186
+
187
+ ✅ **安全提醒:** `.env` 檔案已被 `.gitignore` 排除,不要 commit 到 git!
188
+
189
+ ---
190
+
191
+ ## 建立 Firebase Tester Group
192
+
193
+ ⚠️ **重要:必須先建立 tester group,否則部署會失敗(404 錯誤)**
194
+
195
+ ### 步驟
196
+
197
+ 1. 前往 [Firebase Console](https://console.firebase.google.com/)
198
+ 2. 選擇你的專案(botrun-c)
199
+ 3. 左側選單點擊 **"App Distribution"**
200
+ 4. 如果是第一次使用,點擊 **"Get started"**
201
+ 5. 切換到 **"Testers & Groups"** tab
202
+ 6. 點擊 **"Add Group"**
203
+ 7. 輸入 Group name: `internal-testers`(必須與 Fastfile 中的名稱一致)
204
+ 8. 點擊 **"Create group"**
205
+ 9. 點擊剛建立的 `internal-testers` group
206
+ 10. 點擊 **"Add testers"**
207
+ 11. 輸入測試人員的 email(一行一個)
208
+ 12. 點擊 **"Add testers"**
209
+
210
+ ✅ **完成!** 現在可以開始部署了。
211
+
212
+ **常見 tester group 名稱:**
213
+ - `internal-testers` - 內部測試人員(預設)
214
+ - `beta-testers` - Beta 測試人員
215
+ - `qa-team` - QA 團隊
216
+
217
+ 💡 **提示:** Fastfile 中的 `groups: "internal-testers"` 必須與 Firebase Console 中的 group 名稱完全一致(包含大小寫)。
218
+
219
+ ---
220
+
221
+ ## 設定 Android Keystore(用於 Google Play 發佈)
222
+
223
+ ⚠️ **重要:** 發佈到 Google Play 需要簽署的 AAB。如果你只使用 Firebase App Distribution,可以跳過此步驟。
224
+
225
+ ### 選項 A:使用現有 Keystore(推薦)
226
+
227
+ 如果你已經有 keystore(例如之前建立過),請按照以下步驟:
228
+
229
+ #### 1. 複製 Keystore 到專案
230
+
231
+ ```bash
232
+ # 將你的 keystore 複製到 Android 專案目錄
233
+ cp /path/to/your-keystore.keystore /path/to/botrun-c/mobile-android/android/app/botrun-release.keystore
234
+
235
+ # 設定權限
236
+ chmod 600 /path/to/botrun-c/mobile-android/android/app/botrun-release.keystore
237
+ ```
238
+
239
+ #### 2. 建立 keystore.properties
240
+
241
+ 在 `mobile-android/android/keystore.properties` 建立檔案:
242
+
243
+ ```properties
244
+ storePassword=你的_keystore_密碼
245
+ keyPassword=你的_key_密碼
246
+ keyAlias=你的_key_alias
247
+ storeFile=app/botrun-release.keystore
248
+ ```
249
+
250
+ **設定權限:**
251
+ ```bash
252
+ chmod 600 /path/to/botrun-c/mobile-android/android/keystore.properties
253
+ ```
254
+
255
+ ✅ **安全提醒:** keystore 和 keystore.properties 都已被 `.gitignore` 排除,不會 commit 到 git。
256
+
257
+ #### 3. 驗證 Keystore 規格
258
+
259
+ 確認你的 keystore 符合 Google Play 要求(2024/2025 規範):
260
+
261
+ ```bash
262
+ keytool -list -v -keystore /path/to/botrun-c/mobile-android/android/app/botrun-release.keystore -alias 你的_alias
263
+ ```
264
+
265
+ **必須符合:**
266
+ - ✅ 2048 bit RSA key
267
+ - ✅ SHA256withRSA 簽章演算法
268
+ - ✅ 有效期至少 25 年
269
+
270
+ ### 選項 B:建立新的 Keystore
271
+
272
+ 如果這是第一次建立 keystore:
273
+
274
+ ```bash
275
+ cd /path/to/botrun-c/mobile-android/android/app
276
+
277
+ # 建立 keystore(2024/2025 規範)
278
+ keytool -genkeypair -v -storetype PKCS12 \
279
+ -keystore botrun-release.keystore \
280
+ -alias botrun-release-key \
281
+ -keyalg RSA \
282
+ -keysize 2048 \
283
+ -validity 9125 \
284
+ -storepass 你的密碼 \
285
+ -keypass 你的密碼 \
286
+ -dname "CN=你的公司名稱, OU=Development, O=你的公司, L=城市, ST=省份, C=國家代碼"
287
+ ```
288
+
289
+ 然後按照「選項 A」的步驟 2-3 建立 `keystore.properties`。
290
+
291
+ ⚠️ **極重要:** 備份 keystore 檔案!一旦遺失,將無法再更新已發佈的 app。
292
+
293
+ ### 配置完成檢查
294
+
295
+ 確認以下檔案存在且已被 gitignore:
296
+
297
+ ```bash
298
+ # 檢查檔案
299
+ ls -la mobile-android/android/app/botrun-release.keystore
300
+ ls -la mobile-android/android/keystore.properties
301
+
302
+ # 確認已被 gitignore
303
+ git check-ignore -v mobile-android/android/app/botrun-release.keystore
304
+ git check-ignore -v mobile-android/android/keystore.properties
305
+ ```
306
+
307
+ ✅ 兩個檔案都應該顯示被 `.gitignore` 排除。
308
+
309
+ ---
310
+
311
+ ## 啟用 Google Play Android Developer API
312
+
313
+ ⚠️ **重要:** 如果你計劃使用 Google Play 部署功能(`internal_play` 或 `production`),必須先啟用 Google Play Android Developer API。
314
+
315
+ ### 步驟
316
+
317
+ 1. **前往 API 啟用頁面:**
318
+
319
+ 前往以下連結(替換 `PROJECT_ID` 為你的專案 ID):
320
+ ```
321
+ https://console.developers.google.com/apis/api/androidpublisher.googleapis.com/overview?project=PROJECT_ID
322
+ ```
323
+
324
+ 💡 **如何找到專案 ID?**
325
+ - 打開 `mobile-android/fastlane/google-play-service-account.json`
326
+ - 搜尋 `"project_id"` 欄位
327
+ - 或在 [Google Cloud Console](https://console.cloud.google.com/) 的頂部下拉選單中查看
328
+
329
+ 2. **點擊「Enable」(啟用)按鈕**
330
+
331
+ 3. **等待 2-5 分鐘**讓設定生效
332
+
333
+ ### 驗證
334
+
335
+ 部署時如果看到以下錯誤,表示 API 未啟用或剛啟用尚未生效:
336
+
337
+ ```
338
+ PERMISSION_DENIED: Google Play Android Developer API has not been used in project...
339
+ ```
340
+
341
+ **解決方法:**
342
+ - 確認已點擊「Enable」按鈕
343
+ - 等待 2-5 分鐘後重試
344
+ - 如果剛啟用,可能需要最多 10 分鐘才會完全生效
345
+
346
+ ✅ **完成!** 現在可以開始使用 Google Play 部署功能。
347
+
348
+ ---
349
+
350
+ ## 執行第一次部署測試
351
+
352
+ ### 測試 Firebase App Distribution 部署
353
+
354
+ ```bash
355
+ cd /path/to/botrun-c/mobile-android
356
+
357
+ # 初始化 rbenv(如果使用 rbenv)
358
+ eval "$(rbenv init - zsh)"
359
+
360
+ # 執行內部測試部署(Firebase)
361
+ bundle exec fastlane internal_firebase
362
+ ```
363
+
364
+ **預期結果:**
365
+ - ✅ Web 專案建置成功
366
+ - ✅ Android 專案同步成功
367
+ - ✅ APK 建置成功
368
+ - ✅ 上傳到 Firebase App Distribution 成功
369
+ - ✅ 測試人員收到通知 email
370
+
371
+ **如果失敗:** 參考 [疑難排解](#疑難排解)
372
+
373
+ ### 測試 Google Play 部署(可選)
374
+
375
+ ⚠️ **注意:** Google Play 部署需要先完成「首次手動上傳」(參考 [附錄 D](#附錄-d首次手動上傳到-google-play))
376
+
377
+ ```bash
378
+ cd /path/to/botrun-c/mobile-android
379
+
380
+ # 執行 Google Play 內部測試部署
381
+ bundle exec fastlane internal_play
382
+ ```
383
+
384
+ ---
385
+
386
+ ## 部署流程
387
+
388
+ ### 🧪 內部測試(Firebase App Distribution)
389
+
390
+ **使用時機:** 快速分發給內部測試人員,不需要經過 Google Play 審核。
391
+
392
+ ```bash
393
+ cd /path/to/botrun-c/mobile-android
394
+ bundle exec fastlane internal_firebase
395
+ ```
396
+
397
+ **流程:**
398
+ 1. 建置 web 專案
399
+ 2. 同步到 Android
400
+ 3. 建置 Debug APK
401
+ 4. 上傳到 Firebase App Distribution
402
+ 5. 自動發送通知給測試人員
403
+
404
+ **測試人員如何取得:**
405
+ - 收到 email 通知
406
+ - 點擊連結下載 APK
407
+ - 安裝測試
408
+
409
+ ### 📦 Google Play 內部測試
410
+
411
+ **使用時機:** 測試 Google Play 商店的更新流程,需要經過 Google Play 審核(通常數小時)。
412
+
413
+ ```bash
414
+ cd /path/to/botrun-c/mobile-android
415
+ bundle exec fastlane internal_play
416
+ ```
417
+
418
+ **流程:**
419
+ 1. 建置 web 專案
420
+ 2. 同步到 Android
421
+ 3. 建置 Release AAB(已簽署)
422
+ 4. 上傳到 Google Play Internal Testing track
423
+ 5. 等待 Google Play 審核
424
+
425
+ **測試人員如何取得:**
426
+ - 需要先被加入 Play Console 的 Internal Testing testers list
427
+ - 使用 Play Store 下載測試版本
428
+
429
+ ### 🚀 正式發佈(Production - 100% 發佈)
430
+
431
+ **使用時機:** 發佈到 Production,所有用戶立即可見。
432
+
433
+ ```bash
434
+ cd /path/to/botrun-c/mobile-android
435
+ bundle exec fastlane production
436
+ ```
437
+
438
+ **流程:**
439
+ 1. 建置 web 專案
440
+ 2. 同步到 Android
441
+ 3. 建置 Release AAB(已簽署)
442
+ 4. 上傳到 Google Play Production track(100% 發佈)
443
+ 5. 所有用戶將在數小時內收到更新
444
+
445
+ **特點(2024/2025 最佳實踐):**
446
+ - ✅ 使用 `release_status: "completed"` - 直接 100% 發佈
447
+ - ✅ 使用 Google Play App Signing - Google 管理 signing key
448
+ - ✅ 需要先完成「首次手動上傳」(僅需一次)
449
+
450
+ **首次發佈前必須:**
451
+ - ✅ Keystore 已設定(參考上方章節)
452
+ - ✅ 手動上傳過至少一次 AAB 到 production track
453
+ - ✅ Google Play App Signing 已啟用
454
+
455
+ ---
456
+
457
+ ## 疑難排解
458
+
459
+ ### ❌ 錯誤:找不到 Service Account JSON 檔案
460
+
461
+ **症狀:**
462
+ ```
463
+ No such file or directory @ rb_sysopen - .../firebase-service-account.json
464
+ ```
465
+
466
+ **解決:**
467
+ 1. 確認檔案位置正確:
468
+ ```bash
469
+ ls -la mobile-android/fastlane/*.json
470
+ ```
471
+ 2. 確認檔案名稱正確(firebase-service-account.json 或 google-play-service-account.json)
472
+ 3. 確認 `.env` 檔案中的路徑設定正確
473
+
474
+ ### ❌ 錯誤:Service account does not have permission
475
+
476
+ **問題:** Service Account 權限不足。
477
+
478
+ **解決:** 聯絡專案管理員,確認:
479
+ 1. **Firebase Service Account** 已加入 "Firebase App Distribution Admin" 角色(在 Google Cloud Console)
480
+ 2. **Google Play Service Account** 已在 Play Console 授權(2024+ 版本:透過 "Users and permissions" → "Invite new users")
481
+
482
+ **補充:** Service Account 權限可能需要最多 24 小時才會完全生效。如果剛剛才設定,請稍後再試。
483
+
484
+ ### ❌ 錯誤:Android platform has not been added
485
+
486
+ **解決:**
487
+ ```bash
488
+ cd /path/to/botrun-c/mobile-android
489
+ npx cap add android
490
+ ```
491
+
492
+ ### ❌ 錯誤:No signing key found
493
+
494
+ **問題:** 尚未設定 Android 簽署金鑰。
495
+
496
+ **解決:** 聯絡專案管理員取得 keystore 檔案和設定。
497
+
498
+ ### ❌ Fastlane 找不到 或 Ruby 相關錯誤
499
+
500
+ **解決:** 參考 [README.md - Ruby 環境問題](./README.md#ruby-環境問題)
501
+
502
+ ### ❌ 執行 fastlane 命令時的常見錯誤
503
+
504
+ #### 錯誤 1: `parse error near ';&'`
505
+
506
+ **症狀:**
507
+ ```bash
508
+ cd /path && bundle exec fastlane internal_play
509
+ # Error: (eval):1: parse error near `;&'
510
+ ```
511
+
512
+ **原因:** Bash 命令中的 `&&` 符號在某些環境中會導致解析錯誤。
513
+
514
+ **解決:** 使用分號 `;` 代替 `&&`
515
+ ```bash
516
+ cd /Users/seba/Projects/botrun-c/mobile-android; bundle exec fastlane internal_play
517
+ ```
518
+
519
+ #### 錯誤 2: `bundler: command not found: fastlane`
520
+
521
+ **症狀:**
522
+ ```bash
523
+ cd /path; bundle exec fastlane internal_play
524
+ # Error: bundler: command not found: fastlane
525
+ # Your RubyGems version (3.0.3.1) has a bug...
526
+ ```
527
+
528
+ **原因:** Ruby 環境 PATH 未正確設定,Bundler 找不到 fastlane gem。
529
+
530
+ **解決:** 必須先設定 rbenv PATH 再執行 fastlane
531
+ ```bash
532
+ cd /Users/seba/Projects/botrun-c/mobile-android; export PATH="$HOME/.rbenv/shims:$PATH"; bundle exec fastlane internal_play
533
+ ```
534
+
535
+ #### ✅ 正確的執行方式(範本)
536
+
537
+ **部署到 Google Play Internal Testing:**
538
+ ```bash
539
+ cd /Users/seba/Projects/botrun-c/mobile-android; export PATH="$HOME/.rbenv/shims:$PATH"; bundle exec fastlane internal_play
540
+ ```
541
+
542
+ **部署到 Firebase App Distribution:**
543
+ ```bash
544
+ cd /Users/seba/Projects/botrun-c/mobile-android; export PATH="$HOME/.rbenv/shims:$PATH"; bundle exec fastlane internal_firebase
545
+ ```
546
+
547
+ **部署到 Google Play Production:**
548
+ ```bash
549
+ cd /Users/seba/Projects/botrun-c/mobile-android; export PATH="$HOME/.rbenv/shims:$PATH"; bundle exec fastlane production
550
+ ```
551
+
552
+ **重點:**
553
+ - ✅ 使用 `;` 分隔命令(不要用 `&&`)
554
+ - ✅ 必須先 `export PATH="$HOME/.rbenv/shims:$PATH"` 設定 Ruby 環境
555
+ - ✅ 從 `mobile-android` 目錄執行(不是 `mobile-android/fastlane`)
556
+
557
+ ---
558
+
559
+ # 附錄:從零開始建立(首次設定參考)
560
+
561
+ > 💡 **適用對象:** 第一次設定專案,或需要重新建立 Service Accounts 的管理員
562
+
563
+ ---
564
+
565
+ ## 附錄 A:建立 Android 平台
566
+
567
+ 如果專案尚未建立 Android 平台(使用 Capacitor):
568
+
569
+ ### 1. 進入 mobile-android 目錄
570
+
571
+ ```bash
572
+ cd /path/to/botrun-c/mobile-android
573
+ ```
574
+
575
+ ### 2. 新增 Android 平台
576
+
577
+ ```bash
578
+ npx cap add android
579
+ ```
580
+
581
+ 這會建立 `android/` 子目錄,包含完整的 Android 專案結構。
582
+
583
+ ### 3. 同步 Web 資源
584
+
585
+ ```bash
586
+ npm run build
587
+ ```
588
+
589
+ 這會:
590
+ - 建置 web 專案
591
+ - 將建置結果同步到 Android 專案
592
+
593
+ ### 4. 驗證 Android 專案
594
+
595
+ ```bash
596
+ npx cap open android
597
+ ```
598
+
599
+ 這會開啟 Android Studio,確認專案可以正常開啟。
600
+
601
+ ---
602
+
603
+ ## 附錄 B:Firebase Service Account 建立流程
604
+
605
+ ### 1. 取得 Firebase App ID
606
+
607
+ 前往 [Firebase Console](https://console.firebase.google.com/):
608
+
609
+ 1. 選擇你的專案
610
+ 2. 點擊左側齒輪圖示 **⚙️ Project settings**
611
+ 3. 往下滾動到 **"Your apps"**
612
+ 4. 找到 Android app(package name: `ai.botrun.botrunapp`)
613
+ 5. 複製 **App ID**(格式:`1:123456789:android:abcd1234xxxx`)
614
+ 6. 將此 App ID 記錄下來,稍後需要填入 `.env` 檔案
615
+
616
+ ### 2. 建立 Firebase Service Account
617
+
618
+ 前往 [Google Cloud Console - Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts):
619
+
620
+ 1. **選擇對應的 Firebase 專案**(確認專案名稱正確)
621
+ 2. 點擊 **"+ Create Service Account"**
622
+ 3. 填寫資訊:
623
+ - **Service account name**: `firebase-app-distribution`
624
+ - **Description**: "Fastlane Firebase App Distribution 部署用"
625
+ 4. 點擊 **"Create and Continue"**
626
+ 5. 選擇角色:**"Firebase App Distribution Admin"**
627
+ - 在 "Select a role" 下拉選單中搜尋 "Firebase"
628
+ - 選擇 **"Firebase App Distribution Admin"**
629
+ 6. 點擊 **"Continue"** → **"Done"**
630
+
631
+ ### 3. 下載 Service Account Key
632
+
633
+ 1. 在 Service Accounts 列表中,找到剛建立的 `firebase-app-distribution@xxx.iam.gserviceaccount.com`
634
+ 2. 點擊該 Service Account
635
+ 3. 切換到 **"Keys"** tab
636
+ 4. 點擊 **"Add Key"** → **"Create new key"**
637
+ 5. 選擇 **JSON** 格式
638
+ 6. 點擊 **"Create"** → JSON 檔案會自動下載
639
+
640
+ ### 4. 移動檔案到專案
641
+
642
+ ```bash
643
+ # 建立目錄(如果不存在)
644
+ mkdir -p mobile-android/fastlane
645
+
646
+ # 移動並重新命名檔案(替換成你的檔案名稱)
647
+ cp ~/Downloads/你的專案名稱-xxxxx.json mobile-android/fastlane/firebase-service-account.json
648
+
649
+ # 設定安全權限(只有你可以讀寫)
650
+ chmod 600 mobile-android/fastlane/firebase-service-account.json
651
+
652
+ # 驗證檔案已被 git ignore
653
+ git check-ignore -v mobile-android/fastlane/firebase-service-account.json
654
+ # 應該顯示:.gitignore:xxx:mobile-android/fastlane/*-service-account.json
655
+ ```
656
+
657
+ ✅ **已自動被 .gitignore 排除**
658
+
659
+ ---
660
+
661
+ ## 附錄 C:Google Play Service Account 建立流程
662
+
663
+ ### 1. 建立 Google Play Service Account
664
+
665
+ 前往 [Google Cloud Console - Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts):
666
+
667
+ 1. **確保選擇與 Firebase 相同的專案**
668
+ 2. 點擊 **"+ Create Service Account"**
669
+ 3. 填寫資訊:
670
+ - **Service account name**: `google-play-api`
671
+ - **Description**: "Fastlane Google Play 部署用"
672
+ 4. 點擊 **"Create and Continue"**
673
+ 5. **跳過角色選擇**(點擊 "Continue")- 權限稍後在 Play Console 設定
674
+ 6. 點擊 **"Done"**
675
+
676
+ ### 2. 下載 Service Account Key
677
+
678
+ 1. 在 Service Accounts 列表中,找到剛建立的 `google-play-api@xxx.iam.gserviceaccount.com`
679
+ 2. 點擊該 Service Account
680
+ 3. 切換到 **"Keys"** tab
681
+ 4. 點擊 **"Add Key"** → **"Create new key"**
682
+ 5. 選擇 **JSON** 格式
683
+ 6. 點擊 **"Create"** → JSON 檔案會自動下載
684
+
685
+ ### 3. 移動檔案到專案
686
+
687
+ ```bash
688
+ # 移動並重新命名檔案
689
+ cp ~/Downloads/你的專案名稱-xxxxx.json mobile-android/fastlane/google-play-service-account.json
690
+
691
+ # 設定安全權限
692
+ chmod 600 mobile-android/fastlane/google-play-service-account.json
693
+
694
+ # 驗證檔案已被 git ignore
695
+ git check-ignore -v mobile-android/fastlane/google-play-service-account.json
696
+ ```
697
+
698
+ ### 4. 在 Play Console 授權 Service Account
699
+
700
+ ⚠️ **重要:2024+ 版本更新** - Google Play Console 已改版,不再有 "Settings → API Access" 選項。
701
+
702
+ 前往 [Google Play Console](https://play.google.com/console/):
703
+
704
+ #### 步驟 1:取得 Service Account Email
705
+
706
+ 1. 前往 [Google Cloud Console - Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts)
707
+ 2. 確保選擇正確的專案
708
+ 3. 找到剛建立的 `google-play-api` Service Account
709
+ 4. **複製完整的 email**(格式:`google-play-api@你的專案ID.iam.gserviceaccount.com`)
710
+
711
+ #### 步驟 2:在 Play Console 邀請 Service Account
712
+
713
+ 1. 在 Google Play Console 選擇你的開發者帳號
714
+ 2. 點擊左側邊欄的 **"Users and permissions"**(使用者和權限)
715
+ 3. 點擊右上角的 **"Invite new users"**(邀請新使用者)按鈕
716
+ 4. 在 Email address 欄位貼上剛複製的 Service Account email
717
+
718
+ #### 步驟 3:設定權限
719
+
720
+ **Account permissions(帳戶權限)tab:**
721
+ - 選擇 **"Admin (all permissions)"**(推薦)
722
+ - 或至少勾選:
723
+ - ✅ View app information and download bulk reports
724
+ - ✅ Manage production releases
725
+ - ✅ Manage testing track releases
726
+
727
+ **App permissions(應用程式權限)tab:**
728
+ - 點擊 **"Add app"**
729
+ - 選擇你的 app(`Botrun` / package name: `ai.botrun.botrunapp`)
730
+ - 或選擇 **"All apps"**(套用到所有目前和未來的 apps)
731
+
732
+ #### 步驟 4:發送邀請
733
+
734
+ 1. 點擊 **"Invite user"**
735
+ 2. 點擊 **"Send invitation"**
736
+
737
+ ✅ **完成!** Service Account 現在有權限透過 API 上傳 APK/AAB 到 Google Play。
738
+
739
+ ⏱️ **注意:** Service Account 權限可能需要最多 24 小時才會完全生效。通常幾分鐘內就可以使用,但如果遇到權限錯誤,請稍後再試。
740
+
741
+ ### 5. 啟用 Google Play Android Developer API
742
+
743
+ ⚠️ **重要:** 必須啟用此 API,否則無法透過 Fastlane 上傳到 Google Play。
744
+
745
+ 1. **取得專案 ID:**
746
+ - 打開剛下載的 `google-play-service-account.json`
747
+ - 搜尋 `"project_id"` 欄位並複製值
748
+
749
+ 2. **前往 API 啟用頁面:**
750
+ ```
751
+ https://console.developers.google.com/apis/api/androidpublisher.googleapis.com/overview?project=你的專案ID
752
+ ```
753
+ (替換 `你的專案ID` 為上一步複製的值)
754
+
755
+ 3. **點擊「Enable」(啟用)按鈕**
756
+
757
+ 4. **等待 2-5 分鐘**讓設定生效
758
+
759
+ **常見錯誤:**
760
+ ```
761
+ PERMISSION_DENIED: Google Play Android Developer API has not been used in project...
762
+ ```
763
+ - **原因:** API 未啟用或剛啟用尚未生效
764
+ - **解決:** 確認已啟用,等待 2-5 分鐘後重試
765
+
766
+ ✅ **Service Account 設定完成!** 現在可以使用 Fastlane 自動部署到 Google Play。
767
+
768
+ ---
769
+
770
+ ## 附錄 D:首次手動上傳到 Google Play
771
+
772
+ ⚠️ **重要:** 在使用 Fastlane API 上傳到 Google Play 之前,**必須先手動上傳一次 APK/AAB** 到 Internal Testing track。
773
+
774
+ ### 為什麼需要首次手動上傳?
775
+
776
+ Google Play API 要求 app 必須先有至少一個手動上傳的版本,才能使用 API 進行後續的自動化上傳。
777
+
778
+ ### 步驟
779
+
780
+ #### 1. 建置 Release AAB
781
+
782
+ ```bash
783
+ cd /path/to/botrun-c/mobile-android
784
+
785
+ # 建置 web 專案
786
+ npm run build
787
+
788
+ # 進入 Android 專案
789
+ cd android
790
+
791
+ # 建置 release AAB
792
+ ./gradlew bundleRelease
793
+
794
+ # AAB 檔案位置
795
+ ls -la app/build/outputs/bundle/release/app-release.aab
796
+ ```
797
+
798
+ #### 2. 在 Play Console 手動上傳
799
+
800
+ 1. 前往 [Google Play Console](https://play.google.com/console/)
801
+ 2. 選擇你的 app
802
+ 3. 導航到 **"Release"** → **"Testing"** → **"Internal testing"**
803
+ 4. 點擊 **"Create new release"**
804
+ 5. 上傳 AAB 檔案:
805
+ - 拖曳或選擇 `app/build/outputs/bundle/release/app-release.aab`
806
+ 6. 填寫 **Release notes**(例如:`Initial release for testing`)
807
+ 7. 點擊 **"Save"**
808
+ 8. 點擊 **"Review release"**
809
+ 9. 確認無誤後,點擊 **"Start rollout to Internal testing"**
810
+
811
+ #### 3. 等待審核
812
+
813
+ - Google Play 審核通常需要數小時
814
+ - 審核通過後,可以開始使用 Fastlane 自動化部署
815
+
816
+ ✅ **完成!** 之後就可以使用 `bundle exec fastlane internal_play` 進行自動化部署。
817
+
818
+ ---
819
+
820
+ ## 參考資源
821
+
822
+ - [Fastlane 官方文件](https://docs.fastlane.tools/)
823
+ - [Firebase App Distribution](https://firebase.google.com/docs/app-distribution)
824
+ - [Google Play Console API](https://developers.google.com/android-publisher)
825
+ - [Capacitor Android](https://capacitorjs.com/docs/android)