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.
- package/botrun-c/.claude/skills/DOCX/351/226/261/350/256/200/346/212/200/350/203/275/SKILL.md +103 -0
- 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
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/SKILL.md +1093 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branch.mjs +73 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-branches.mjs +77 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-checkout.mjs +72 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-clone.mjs +72 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-commit.mjs +75 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-branch.mjs +75 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-delete-file.mjs +72 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-diff.mjs +80 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list-tree.mjs +336 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-list.mjs +199 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-merge.mjs +86 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-move.mjs +75 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-create.mjs +81 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-list.mjs +74 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-merge.mjs +83 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-pr-view.mjs +71 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-push.mjs +71 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-read.mjs +277 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-search.mjs +370 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-stash.mjs +116 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-sync.mjs +71 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/github-write.mjs +74 -0
- package/botrun-c/.claude/skills/GitHub/346/212/200/350/203/275/scripts/lib/path-validator.mjs +167 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/SKILL.md +605 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-create.mjs +127 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-delete.mjs +77 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-diff.mjs +87 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-history.mjs +99 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-list.mjs +174 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-read.mjs +214 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-restore.mjs +75 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-search.mjs +270 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-sync-back.mjs +155 -0
- package/botrun-c/.claude/skills/GoogleDrive/346/212/200/350/203/275/scripts/gdrive-update.mjs +100 -0
- package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/SKILL.md +414 -0
- package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/create-project.mjs +91 -0
- package/botrun-c/.claude/skills/HTML/347/224/237/346/210/220/346/212/200/350/203/275/scripts/finalize-project.mjs +162 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/SKILL.md +206 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/package.json +19 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-analyze.mjs +309 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-compress.mjs +315 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-split.mjs +275 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/pdf-to-text.mjs +336 -0
- package/botrun-c/.claude/skills/PDF/346/212/200/350/203/275/scripts/test-pdf-scripts.mjs +491 -0
- package/botrun-c/.claude/skills/docx-to-markdown/SKILL.md +76 -0
- package/botrun-c/.claude/skills/docx-to-markdown/scripts/convert_docx.py +183 -0
- package/botrun-c/.claude/skills/gcp-coord-ml-ocr/SKILL.md +133 -0
- package/botrun-c/.claude/skills/gcp-coord-ml-ocr/scripts/ocr_processor.py +381 -0
- package/botrun-c/.claude/skills/gemini-transcribe/SKILL.md +115 -0
- package/botrun-c/.claude/skills/gemini-transcribe/scripts/transcribe.py +499 -0
- package/botrun-c/.claude/skills/nchc-transcribe/SKILL.md +131 -0
- package/botrun-c/.claude/skills/nchc-transcribe/scripts/transcribe.py +522 -0
- package/botrun-c/.claude/skills/p320-moj-review/SKILL.md +200 -0
- package/botrun-c/.claude/skills/p320-moj-review/references/guideline.md +118 -0
- package/botrun-c/.claude/skills/pdf-multimodal-processor/SKILL.md +186 -0
- package/botrun-c/.claude/skills/pdf-multimodal-processor/scripts/process_pdf.py +515 -0
- package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/SKILL.md +81 -0
- package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/package.json +13 -0
- package/botrun-c/.claude/skills/ripgrep/346/220/234/345/260/213/346/212/200/350/203/275/scripts/secure-search.mjs +232 -0
- 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
- package/botrun-c/.claude/skills//345/216/273/350/255/230/345/210/245/346/212/200/350/203/275/SKILL.md +125 -0
- package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/SKILL.md +123 -0
- package/botrun-c/.claude/skills//345/233/236/346/206/266/346/212/200/350/203/275/scripts/recall.mjs +339 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/SKILL.md +131 -0
- package/botrun-c/.claude/skills//345/255/265/345/214/226/346/212/200/350/203/275/scripts/skill-manager.mjs +542 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/SKILL.md +114 -0
- package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/remember.mjs +159 -0
- package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test-advanced.mjs +342 -0
- package/botrun-c/.claude/skills//350/250/230/346/206/266/346/212/200/350/203/275/scripts/test.mjs +430 -0
- 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
- 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
- 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
- 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
- package/botrun-c/.dockerignore +131 -0
- package/botrun-c/.dockeroptimize +13 -0
- package/botrun-c/.firebase/hosting.b3V0.cache +30 -0
- package/botrun-c/.firebaserc +5 -0
- package/botrun-c/.gcloudignore +56 -0
- package/botrun-c/.ruby-version +1 -0
- package/botrun-c/CHANGELOG.md +224 -0
- package/botrun-c/Dockerfile.gcp +365 -0
- package/botrun-c/Dockerfile.slim +195 -0
- package/botrun-c/Gemfile +8 -0
- package/botrun-c/Gemfile.lock +233 -0
- package/botrun-c/LOCAL-DEVELOPMENT-GUIDE.md +393 -0
- package/botrun-c/PLAN.md +131 -0
- package/botrun-c/README.md +129 -0
- package/botrun-c/TODO-CAPACITOR-INTEGRATION.md +482 -0
- package/botrun-c/VERIFICATION.md +121 -0
- package/botrun-c/admin/RATE_LIMIT_MANAGEMENT.md +312 -0
- package/botrun-c/admin/README.md +338 -0
- package/botrun-c/admin/botrun-billing-report-1765235244038.csv +22 -0
- package/botrun-c/admin/botrun-billing-report-1765235323089.csv +22 -0
- package/botrun-c/admin/botrun-dashboard-1765235244039.html +278 -0
- package/botrun-c/admin/botrun-dashboard-1765235323089.html +278 -0
- package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235244039.html +161 -0
- package/botrun-c/admin/botrun-timeseries-074xGzIKWyfKTBt1NMIj9lxi5mO2-1765235323090.html +161 -0
- package/botrun-c/admin/check-billing.ts +48 -0
- package/botrun-c/admin/count-all-users.ts +65 -0
- package/botrun-c/admin/generate-analytics-report.ts +188 -0
- package/botrun-c/admin/jest.config.ts +43 -0
- package/botrun-c/admin/lib/__tests__/formatters.test.ts +264 -0
- package/botrun-c/admin/lib/__tests__/mocks/firebase.mock.ts +112 -0
- package/botrun-c/admin/lib/__tests__/services/UserService.test.ts +83 -0
- package/botrun-c/admin/lib/__tests__/user-resolver.test.ts +439 -0
- package/botrun-c/admin/lib/analyzers/BillingAnalyticsService.ts +242 -0
- package/botrun-c/admin/lib/analyzers/CsvExporter.ts +263 -0
- package/botrun-c/admin/lib/analyzers/HtmlChartGenerator.ts +530 -0
- package/botrun-c/admin/lib/analyzers/SpikeAnalyzer.ts +608 -0
- package/botrun-c/admin/lib/analyzers/TimeSeriesAnalyzer.ts +344 -0
- package/botrun-c/admin/lib/cli/CLIBootstrapper.ts +40 -0
- package/botrun-c/admin/lib/commands/AbstractCommand.ts +69 -0
- package/botrun-c/admin/lib/commands/AnalyticsCommand.ts +215 -0
- package/botrun-c/admin/lib/commands/ListCommand.ts +85 -0
- package/botrun-c/admin/lib/commands/QueryCommand.ts +81 -0
- package/botrun-c/admin/lib/commands/SpikeCommand.ts +83 -0
- package/botrun-c/admin/lib/domain/User.ts +38 -0
- package/botrun-c/admin/lib/firebase.ts +92 -0
- package/botrun-c/admin/lib/firestore-safe.ts +105 -0
- package/botrun-c/admin/lib/formatters.ts +154 -0
- package/botrun-c/admin/lib/rate-limit-detailed.ts +355 -0
- package/botrun-c/admin/lib/rate-limit.ts +286 -0
- package/botrun-c/admin/lib/repositories/UserRepository.ts +104 -0
- package/botrun-c/admin/lib/services/UserService.ts +108 -0
- package/botrun-c/admin/lib/types.ts +56 -0
- package/botrun-c/admin/lib/user-resolver.ts +275 -0
- package/botrun-c/admin/manage-auth-domains.js +178 -0
- package/botrun-c/admin/migrate-plan-free.sh +64 -0
- package/botrun-c/admin/package-lock.json +5656 -0
- package/botrun-c/admin/package.json +28 -0
- package/botrun-c/admin/rate-limit.sh +55 -0
- package/botrun-c/admin/remove-custom-limits.ts +75 -0
- package/botrun-c/admin/reset-rate.sh +70 -0
- package/botrun-c/admin/reset-trial.sh +68 -0
- package/botrun-c/admin/seed-trial-data.sh +38 -0
- package/botrun-c/admin/trial.sh +55 -0
- package/botrun-c/admin/tsconfig.json +20 -0
- package/botrun-c/admin/users-cli.py +298 -0
- package/botrun-c/admin/users.sh +12 -0
- package/botrun-c/admin/users.ts +1321 -0
- package/botrun-c/api/admin-tools/check-whitelist.mjs.migration-bak +74 -0
- package/botrun-c/api/admin-tools/create-user.mjs +92 -0
- package/botrun-c/api/admin-tools/create-user.mjs.migration-bak +92 -0
- package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py +287 -0
- package/botrun-c/api/admin-tools/firebase-auth-domains-v2.py.migration-bak +287 -0
- package/botrun-c/api/admin-tools/init-firestore.mjs +75 -0
- package/botrun-c/api/admin-tools/init-firestore.mjs.migration-bak +101 -0
- package/botrun-c/api/admin-tools/list-users.mjs +43 -0
- package/botrun-c/api/admin-tools/list-users.mjs.migration-bak +43 -0
- package/botrun-c/api/admin-tools/manage-authorized-domains.ts +255 -0
- package/botrun-c/api/admin-tools/manage-authorized-domains.ts.migration-bak +255 -0
- package/botrun-c/api/admin-tools/setup-custom-claims.ts.migration-bak +155 -0
- package/botrun-c/api/admin-tools/test-claims.mjs +69 -0
- package/botrun-c/api/admin-tools/test-claims.mjs.migration-bak +69 -0
- package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs +72 -0
- package/botrun-c/api/admin-tools/update-service-urls-gcloud.mjs.migration-bak +72 -0
- package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs +159 -0
- package/botrun-c/api/admin-tools/update-service-urls-to-lb.mjs.migration-bak +159 -0
- package/botrun-c/api/admin-tools/update-service-urls.mjs +82 -0
- package/botrun-c/api/admin-tools/update-service-urls.mjs.migration-bak +82 -0
- package/botrun-c/api/package-lock.json +5031 -0
- package/botrun-c/api/package.json +63 -0
- package/botrun-c/api/pnpm-lock.yaml +4157 -0
- package/botrun-c/api/rate-limit-export-1763620678737.csv +79 -0
- package/botrun-c/api/scripts/README-migrate-plan-free.md +197 -0
- package/botrun-c/api/scripts/check-users.ts +45 -0
- package/botrun-c/api/scripts/delete-firestore-docs.js +43 -0
- package/botrun-c/api/scripts/dump-subscriptions.ts +395 -0
- package/botrun-c/api/scripts/list-all-users.ts +65 -0
- package/botrun-c/api/scripts/migrate-plan-free-rpd-16to32.ts +262 -0
- package/botrun-c/api/scripts/migrate-plan-names-to-lite-max.ts +269 -0
- package/botrun-c/api/scripts/query-user-info.ts +304 -0
- package/botrun-c/api/scripts/reset-rate-limit.ts +206 -0
- package/botrun-c/api/scripts/reset-trial-subscription.ts +166 -0
- package/botrun-c/api/scripts/rollback-plan-names-from-lite-max.ts +139 -0
- package/botrun-c/api/scripts/seed-rate-limit-test-data.ts +114 -0
- package/botrun-c/api/scripts/seed-subscription-test-data.ts +173 -0
- package/botrun-c/api/scripts/test-rate-limit-message.ts +108 -0
- package/botrun-c/api/test-billing-write.ts +103 -0
- package/botrun-c/api/test-billing.ts +81 -0
- package/botrun-c/api/test-chat-upload.sh +162 -0
- package/botrun-c/api/test-nchc-whisper.ts +87 -0
- package/botrun-c/api/test-skills-loading.js +77 -0
- package/botrun-c/api/test-skills-symlink.js +118 -0
- package/botrun-c/api/test-upload-multimodal.sh +167 -0
- package/botrun-c/api/tsconfig.json +27 -0
- package/botrun-c/api/verify-form-2-1.mjs +229 -0
- package/botrun-c/api/vitest.config.ts +9 -0
- package/botrun-c/appium-capabilities.json +20 -0
- package/botrun-c/cors.json +26 -0
- package/botrun-c/delete-old.sh +44 -0
- package/botrun-c/design/google-drive/01-architecture.md +186 -0
- package/botrun-c/design/google-drive/02-api-design.md +314 -0
- package/botrun-c/design/google-drive/03-frontend-design.md +278 -0
- package/botrun-c/design/google-drive/04-skill-design.md +384 -0
- package/botrun-c/design/google-drive/05-test-plan.md +507 -0
- package/botrun-c/design/google-drive/README.md +32 -0
- package/botrun-c/dev/mcp-token-calculator/README.md +92 -0
- package/botrun-c/dev/mcp-token-calculator/RESULTS.md +188 -0
- package/botrun-c/dev/mcp-token-calculator/calculate-current-tokens.ts +369 -0
- package/botrun-c/dev/mcp-token-calculator/calculate-mcp-tokens.ts +464 -0
- package/botrun-c/dev/mcp-token-calculator/optimization-proposals.ts +316 -0
- package/botrun-c/dev/mcp-token-calculator/package-lock.json +599 -0
- package/botrun-c/dev/mcp-token-calculator/package.json +22 -0
- package/botrun-c/dev/mcp-token-calculator/test-all-schemas.ts +314 -0
- package/botrun-c/dev/mcp-token-calculator/test-schema-correctness.ts +221 -0
- package/botrun-c/dev/mcp-token-calculator/verify-optimization.ts +159 -0
- package/botrun-c/fastlane/ANDROID-DEPLOYMENT-SETUP.md +825 -0
- package/botrun-c/fastlane/IOS-DEPLOYMENT-SETUP.md +431 -0
- package/botrun-c/fastlane/Pluginfile +5 -0
- package/botrun-c/fastlane/QUICK-START.md +133 -0
- package/botrun-c/fastlane/README.md +424 -0
- package/botrun-c/fastlane/RUBY-SETUP.md +449 -0
- package/botrun-c/fastlane/android/Appfile +11 -0
- package/botrun-c/fastlane/android/Fastfile +240 -0
- package/botrun-c/firebase.json +46 -0
- package/botrun-c/firestore-init-data.json +40 -0
- package/botrun-c/firestore.indexes.json +55 -0
- package/botrun-c/firestore.rules +53 -0
- package/botrun-c/fix-codex-permissions.sh +56 -0
- package/botrun-c/gcs-lifecycle-30day-retention.json +12 -0
- package/botrun-c/html-architecture/architecture/deployment.html +664 -0
- package/botrun-c/html-architecture/architecture/index.html +309 -0
- package/botrun-c/html-architecture/architecture/styles.css +500 -0
- package/botrun-c/html-architecture/architecture/system-components.html +538 -0
- package/botrun-c/html-architecture/architecture/user-flow.html +370 -0
- package/botrun-c/mobile-android/FIREBASE-AUTH-SETUP.md +302 -0
- package/botrun-c/mobile-android/WSL-ANDROID-SETUP.md +252 -0
- package/botrun-c/mobile-android/android/app/build.gradle +75 -0
- package/botrun-c/mobile-android/android/app/capacitor.build.gradle +31 -0
- package/botrun-c/mobile-android/android/app/proguard-rules.pro +21 -0
- package/botrun-c/mobile-android/android/build.gradle +29 -0
- package/botrun-c/mobile-android/android/capacitor.settings.gradle +42 -0
- package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/botrun-c/mobile-android/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/botrun-c/mobile-android/android/gradle.properties +22 -0
- package/botrun-c/mobile-android/android/gradlew +252 -0
- package/botrun-c/mobile-android/android/gradlew.bat +94 -0
- package/botrun-c/mobile-android/android/settings.gradle +5 -0
- package/botrun-c/mobile-android/android/variables.gradle +16 -0
- package/botrun-c/mobile-android/capacitor.config.ts +44 -0
- package/botrun-c/mobile-android/fastlane/Appfile +11 -0
- package/botrun-c/mobile-android/fastlane/Fastfile +202 -0
- package/botrun-c/mobile-android/fastlane/README.md +96 -0
- package/botrun-c/mobile-android/google-services.json.template +39 -0
- package/botrun-c/mobile-android/package.json +32 -0
- package/botrun-c/mobile-android/resources/icon.png +0 -0
- package/botrun-c/mobile-android/tsconfig.json +15 -0
- package/botrun-c/mobile-ios/.ruby-version +1 -0
- package/botrun-c/mobile-ios/BUILD-LOG.md +82 -0
- package/botrun-c/mobile-ios/Gemfile +4 -0
- package/botrun-c/mobile-ios/Gemfile.lock +299 -0
- package/botrun-c/mobile-ios/GoogleService-Info.plist.template +34 -0
- package/botrun-c/mobile-ios/IOS-PERMISSIONS.md +80 -0
- package/botrun-c/mobile-ios/QUICK-START.md +189 -0
- package/botrun-c/mobile-ios/README.md +231 -0
- package/botrun-c/mobile-ios/capacitor.config.ts +46 -0
- package/botrun-c/mobile-ios/fastlane/Fastfile +326 -0
- package/botrun-c/mobile-ios/fastlane/README.md +88 -0
- package/botrun-c/mobile-ios/ios/App/App/App.entitlements +10 -0
- package/botrun-c/mobile-ios/ios/App/App/AppDelegate.swift +49 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Contents.json +6 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +56 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
- package/botrun-c/mobile-ios/ios/App/App/Base.lproj/LaunchScreen.storyboard +32 -0
- package/botrun-c/mobile-ios/ios/App/App/Base.lproj/Main.storyboard +19 -0
- package/botrun-c/mobile-ios/ios/App/App/Info.plist +72 -0
- package/botrun-c/mobile-ios/ios/App/App.xcodeproj/project.pbxproj +446 -0
- package/botrun-c/mobile-ios/ios/App/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme +78 -0
- package/botrun-c/mobile-ios/ios/App/App.xcworkspace/contents.xcworkspacedata +10 -0
- package/botrun-c/mobile-ios/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/botrun-c/mobile-ios/ios/App/Podfile +52 -0
- package/botrun-c/mobile-ios/ios/App/Podfile.lock +205 -0
- package/botrun-c/mobile-ios/ios/App/add_plist.rb +30 -0
- package/botrun-c/mobile-ios/ios/App/fix_plist_path.rb +22 -0
- package/botrun-c/mobile-ios/package.json +29 -0
- package/botrun-c/mobile-ios/resources/icon.png +0 -0
- package/botrun-c/mobile-ios/run-simulator.sh +34 -0
- package/botrun-c/mobile-ios/screenshot-after-clean-rebuild.png +0 -0
- package/botrun-c/mobile-ios/screenshot-final-version.png +0 -0
- package/botrun-c/mobile-ios/screenshot-simulator.png +0 -0
- package/botrun-c/mobile-ios/screenshot-version-1009.png +0 -0
- package/botrun-c/mobile-ios/screenshot-with-version.png +0 -0
- package/botrun-c/mobile-ios/screenshot-working.png +0 -0
- package/botrun-c/mobile-ios/setup-ios.sh +106 -0
- package/botrun-c/mobile-ios/tsconfig.json +16 -0
- package/botrun-c/org-policy-allow-all-users.yaml +3 -0
- package/botrun-c/package.json +68 -0
- package/botrun-c/pnpm-lock.yaml +10198 -0
- package/botrun-c/pnpm-workspace.yaml +6 -0
- package/botrun-c/prompts/BOTRUN-1.md +13 -0
- package/botrun-c/prompts/BOTRUN-2.md +70 -0
- package/botrun-c/prompts/BOTRUN-3.md +139 -0
- package/botrun-c/prototypes/firestore-gax-debug/package-lock.json +1204 -0
- package/botrun-c/prototypes/firestore-gax-debug/package.json +12 -0
- package/botrun-c/prototypes/firestore-gax-debug/pnpm-workspace.yaml +2 -0
- package/botrun-c/prototypes/firestore-gax-debug/test.js +98 -0
- package/botrun-c/prototypes/taiwan-haiku/README.md +93 -0
- package/botrun-c/prototypes/taiwan-haiku/index.ts +139 -0
- package/botrun-c/prototypes/taiwan-haiku/package.json +23 -0
- package/botrun-c/prototypes/taiwan-haiku/pnpm-lock.yaml +730 -0
- package/botrun-c/prototypes/taiwan-haiku/test-vertex-direct.ts +83 -0
- package/botrun-c/prototypes/taiwan-haiku/tsconfig.json +18 -0
- package/botrun-c/prototypes/web-search/FINDINGS-STAGE-1.md +48 -0
- package/botrun-c/prototypes/web-search/README.md +46 -0
- package/botrun-c/prototypes/web-search/VERIFICATION-REPORT.md +310 -0
- package/botrun-c/prototypes/web-search/package-lock.json +595 -0
- package/botrun-c/prototypes/web-search/package.json +18 -0
- package/botrun-c/prototypes/web-search/stage-1.1-basic-connection.js +123 -0
- package/botrun-c/prototypes/web-search/stage-1.2-with-websearch.js +154 -0
- package/botrun-c/prototypes/web-search/stage-1.3-search-query.js +192 -0
- package/botrun-c/prototypes/web-search/stage-2-agent-sdk-websearch.js +265 -0
- package/botrun-c/runtime-scripts/env-detect.sh +64 -0
- package/botrun-c/scripts/github-collaborator-manager.sh +297 -0
- package/botrun-c/scripts/github-collaborator-manager.ts +325 -0
- package/botrun-c/scripts/manage-collaborators.sh +91 -0
- package/botrun-c/scripts/setup-secrets.sh +202 -0
- package/botrun-c/scripts/stress-test-17-users.sh +113 -0
- package/botrun-c/scripts/stress-test-api.sh +119 -0
- package/botrun-c/scripts/stress-test-full-report.sh +385 -0
- package/botrun-c/specs/infra-vm/design.md +0 -0
- package/botrun-c/specs/share-skill/design.md +1146 -0
- package/botrun-c/specs/share-skill/tasks.md +444 -0
- package/botrun-c/stress-test-results/20260121-162630/config.json +7 -0
- package/botrun-c/stress-test-results/20260121-162630/user-1-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162630/user-1-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162630/user-1.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/config.json +7 -0
- package/botrun-c/stress-test-results/20260121-162646/user-1-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-1-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-1.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-10-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-10-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-10.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-11-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-11-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-11.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-12-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-12-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-12.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-13-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-13-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-13.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-14-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-14-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-14.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-15-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-15-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-15.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-16-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-16-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-16.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-17-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-17-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-17.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-2-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-2-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-2.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-3-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-3-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-3.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-4-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-4-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-4.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-5-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-5-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-5.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-6-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-6-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-6.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-7-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-7-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-7.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-8-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-8-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-8.json +2 -0
- package/botrun-c/stress-test-results/20260121-162646/user-9-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-9-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-162646/user-9.json +2 -0
- package/botrun-c/stress-test-results/20260121-163148/REPORT.html +344 -0
- package/botrun-c/stress-test-results/20260121-163148/REPORT.md +93 -0
- package/botrun-c/stress-test-results/20260121-163148/REPORT.pdf +0 -0
- package/botrun-c/stress-test-results/20260121-163148/config.json +7 -0
- package/botrun-c/stress-test-results/20260121-163148/summary.json +26 -0
- package/botrun-c/stress-test-results/20260121-163148/user-1-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-1-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-1.json +206 -0
- package/botrun-c/stress-test-results/20260121-163148/user-10-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-10-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-10.json +110 -0
- package/botrun-c/stress-test-results/20260121-163148/user-11-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-11-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-11.json +104 -0
- package/botrun-c/stress-test-results/20260121-163148/user-12-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-12-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-12.json +98 -0
- package/botrun-c/stress-test-results/20260121-163148/user-13-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-13-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-13.json +68 -0
- package/botrun-c/stress-test-results/20260121-163148/user-14-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-14-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-14.json +116 -0
- package/botrun-c/stress-test-results/20260121-163148/user-15-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-15-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-15.json +131 -0
- package/botrun-c/stress-test-results/20260121-163148/user-16-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-16-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-16.json +110 -0
- package/botrun-c/stress-test-results/20260121-163148/user-17-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-17-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-17.json +116 -0
- package/botrun-c/stress-test-results/20260121-163148/user-2-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-2-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-2.json +98 -0
- package/botrun-c/stress-test-results/20260121-163148/user-3-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-3-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-3.json +62 -0
- package/botrun-c/stress-test-results/20260121-163148/user-4-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-4-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-4.json +113 -0
- package/botrun-c/stress-test-results/20260121-163148/user-5-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-5-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-5.json +83 -0
- package/botrun-c/stress-test-results/20260121-163148/user-6-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-6-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-6.json +125 -0
- package/botrun-c/stress-test-results/20260121-163148/user-7-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-7-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-7.json +62 -0
- package/botrun-c/stress-test-results/20260121-163148/user-8-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-8-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-8.json +41 -0
- package/botrun-c/stress-test-results/20260121-163148/user-9-status.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-9-timing.txt +1 -0
- package/botrun-c/stress-test-results/20260121-163148/user-9.json +53 -0
- package/botrun-c/test-merge.md +1 -0
- package/botrun-c/version.txt +1 -0
- package/botrun-c/web/.version +1 -0
- package/botrun-c/web/ALLOW-PUBLIC-ACCESS.md +57 -0
- package/botrun-c/web/FINAL-SETUP-STEPS.md +71 -0
- package/botrun-c/web/FIREBASE-MANUAL-STEPS.md +41 -0
- package/botrun-c/web/QUICK-SETUP-HELPER.md +79 -0
- package/botrun-c/web/README.md +162 -0
- package/botrun-c/web/__tests__/image-extractor.test.ts +147 -0
- package/botrun-c/web/__tests__/useGitHub.test.ts +245 -0
- package/botrun-c/web/app/favicon.ico +0 -0
- package/botrun-c/web/app/globals.css +215 -0
- package/botrun-c/web/app/image-preview/page.tsx +213 -0
- package/botrun-c/web/app/layout.tsx +46 -0
- package/botrun-c/web/app/page.tsx +45 -0
- package/botrun-c/web/components/CapacitorProvider.tsx +43 -0
- package/botrun-c/web/components/ChatPage.tsx +1736 -0
- package/botrun-c/web/components/ConversationList.tsx +237 -0
- package/botrun-c/web/components/ConversationListItem.tsx +121 -0
- package/botrun-c/web/components/LoginPage.tsx +212 -0
- package/botrun-c/web/components/Providers.tsx +12 -0
- package/botrun-c/web/components/StatusBarProvider.tsx +16 -0
- package/botrun-c/web/components/attachment-preview.tsx +193 -0
- package/botrun-c/web/components/botrun-incubator/BotrunIncubator.tsx +266 -0
- package/botrun-c/web/components/botrun-incubator/index.ts +1 -0
- package/botrun-c/web/components/chat-input.tsx +1251 -0
- package/botrun-c/web/components/chat-message.tsx +598 -0
- package/botrun-c/web/components/drop-zone.tsx +143 -0
- package/botrun-c/web/components/gdrive/gdrive-add-dialog.tsx +254 -0
- package/botrun-c/web/components/gdrive/gdrive-drawer.tsx +236 -0
- package/botrun-c/web/components/gdrive/gdrive-selector.tsx +226 -0
- package/botrun-c/web/components/gdrive/index.ts +7 -0
- package/botrun-c/web/components/generated-image-card.tsx +363 -0
- package/botrun-c/web/components/github/GitHubConnect.tsx +366 -0
- package/botrun-c/web/components/github/index.ts +2 -0
- package/botrun-c/web/components/import-skill-dialog.tsx +208 -0
- package/botrun-c/web/components/scroll-to-bottom-button.tsx +90 -0
- package/botrun-c/web/components/share-skill-dialog.tsx +175 -0
- package/botrun-c/web/components/skills-editor.tsx +443 -0
- package/botrun-c/web/components/skills-manager-drawer.tsx +586 -0
- package/botrun-c/web/components/smart-button-group.tsx +132 -0
- package/botrun-c/web/config/smart-buttons.ts +295 -0
- package/botrun-c/web/config/welcome-messages.ts +29 -0
- package/botrun-c/web/contexts/AuthContext.tsx +220 -0
- package/botrun-c/web/hooks/use-toast.ts +187 -0
- package/botrun-c/web/hooks/useAppStoreUpdate.ts +356 -0
- package/botrun-c/web/hooks/useAppVersion.ts +113 -0
- package/botrun-c/web/hooks/useAttachments.ts +269 -0
- package/botrun-c/web/hooks/useAuthToken.ts +59 -0
- package/botrun-c/web/hooks/useAutoWelcome.ts +89 -0
- package/botrun-c/web/hooks/useCapacitorPlatform.ts +113 -0
- package/botrun-c/web/hooks/useCapawesomeLiveUpdate.ts +149 -0
- package/botrun-c/web/hooks/useClaudeModel.ts +118 -0
- package/botrun-c/web/hooks/useConversation.ts +115 -0
- package/botrun-c/web/hooks/useConversations.ts +235 -0
- package/botrun-c/web/hooks/useGdriveFolders.ts +199 -0
- package/botrun-c/web/hooks/useGdriveSync.ts +107 -0
- package/botrun-c/web/hooks/useGitHub.ts +409 -0
- package/botrun-c/web/hooks/useScrollToBottom.ts +150 -0
- package/botrun-c/web/hooks/useStatusBar.ts +42 -0
- package/botrun-c/web/hooks/useUserPlan.ts +153 -0
- package/botrun-c/web/lib/api-config.ts +162 -0
- package/botrun-c/web/lib/api-url.ts +62 -0
- package/botrun-c/web/lib/api.ts +105 -0
- package/botrun-c/web/lib/attachment-utils.ts +168 -0
- package/botrun-c/web/lib/build-version.ts +11 -0
- package/botrun-c/web/lib/clipboard-utils.ts +199 -0
- package/botrun-c/web/lib/constants.ts +62 -0
- package/botrun-c/web/lib/conversation-storage.ts +324 -0
- package/botrun-c/web/lib/firebase-capacitor.ts +135 -0
- package/botrun-c/web/lib/firebase.ts +137 -0
- package/botrun-c/web/lib/firestore-auth.ts +61 -0
- package/botrun-c/web/lib/firestore-auth.ts.migration-bak +319 -0
- package/botrun-c/web/lib/image-extractor.ts +156 -0
- package/botrun-c/web/lib/path-utils.ts +48 -0
- package/botrun-c/web/lib/rehype-del-to-mark.ts +19 -0
- package/botrun-c/web/lib/upload-service.ts +326 -0
- package/botrun-c/web/lib/utils.ts +6 -0
- package/botrun-c/web/next.config.js +49 -0
- package/botrun-c/web/package-lock.json +6711 -0
- package/botrun-c/web/package.json +63 -0
- package/botrun-c/web/postcss.config.js +6 -0
- package/botrun-c/web/public/apple_icon.png +0 -0
- package/botrun-c/web/public/google_icon.png +0 -0
- package/botrun-c/web/public/logo-48-small.png +0 -0
- package/botrun-c/web/public/logo-48.png +0 -0
- package/botrun-c/web/scripts/generate-version.js +36 -0
- package/botrun-c/web/scripts/update-build-version.js +41 -0
- package/botrun-c/web/tailwind.config.ts +80 -0
- package/botrun-c/web/test-welcome-message.mjs +115 -0
- package/botrun-c/web/tsconfig.json +42 -0
- package/botrun-c/web/types/agent.ts +6 -0
- package/botrun-c/web/types/attachment.ts +39 -0
- package/botrun-c/web/types/conversation.ts +68 -0
- package/botrun-c/web/types/flutter.d.ts +6 -0
- package/botrun-c/web/types/project.ts +41 -0
- package/botrun-c/web/types/skills.ts +13 -0
- 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
- package/lib/prompt/prompts/zero-framework/fullstack.md +17 -0
- package/lib/prompt/prompts/zero-framework/segment.md +13 -0
- 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)
|