Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
266 commits
Select commit Hold shift + click to select a range
66496f0
docs(ios): record internal TestFlight build 9
sambitcreate Aug 20, 2026
5cc94eb
docs: add remote multi-instance hardening plan
sambitcreate Aug 21, 2026
6ead7b8
docs(dev): update troubleshooting
sambitcreate Aug 22, 2026
2445458
docs(remote): update aiden-remote-api-v1
sambitcreate Aug 22, 2026
86a2843
docs(plans): update README
sambitcreate Aug 22, 2026
292d548
docs(plans): remove aiden-remote-multi-instance-hardening-plan
sambitcreate Aug 22, 2026
127d3f8
docs(security): update aiden-remote-threat-model
sambitcreate Aug 22, 2026
878950c
docs(ios): update phase-12
sambitcreate Aug 22, 2026
494a5c5
docs(ios): update phase-6
sambitcreate Aug 22, 2026
6994a91
docs(ios): update ASC_CLI
sambitcreate Aug 22, 2026
4112d0e
build(ios): update project
sambitcreate Aug 22, 2026
5c4a9ae
feat(ios): update ContentView
sambitcreate Aug 22, 2026
22b882d
feat(ios): update AidenChatFeature
sambitcreate Aug 22, 2026
fb9fcad
feat(ios): update AidenPairingView
sambitcreate Aug 22, 2026
cdc6369
feat(ios): update AidenRemoteCoordinator
sambitcreate Aug 22, 2026
525d60b
feat(ios): update AidenScheduledTasksView
sambitcreate Aug 22, 2026
c983255
feat(ios): update AidenWorkspaceEnvironmentView
sambitcreate Aug 22, 2026
e261a8d
feat(ios): update AidenWorkspaceShellView
sambitcreate Aug 22, 2026
66c36f8
feat(ios): update AidenRemoteLiveActivityManager
sambitcreate Aug 22, 2026
5c31be4
feat(ios): update AidenInstallation
sambitcreate Aug 22, 2026
1d56926
feat(ios): update AidenRemoteClient
sambitcreate Aug 22, 2026
41b9a09
feat(ios): update AidenRemoteContract
sambitcreate Aug 22, 2026
f629c10
feat(ios): update AidenServerTrust
sambitcreate Aug 22, 2026
74b922b
feat(ios): update AidenChatCache
sambitcreate Aug 22, 2026
8cc55d4
test(ios): update AidenChatTests
sambitcreate Aug 22, 2026
7a39641
test(ios): update AidenNativeIntegrationTests
sambitcreate Aug 22, 2026
594647a
test(ios): update AidenRemoteClientTests
sambitcreate Aug 22, 2026
342c692
test(ios): update AidenRemotePhase0Tests
sambitcreate Aug 22, 2026
3e1129f
test(ios): update AidenScheduledTaskTests
sambitcreate Aug 22, 2026
cea4a2a
test(ios): update AidenWorkspaceEnvironmentTests
sambitcreate Aug 22, 2026
b21c640
docs(ios): update PROJECT_SPEC
sambitcreate Aug 22, 2026
4cc6e23
docs(ios): update TESTFLIGHT
sambitcreate Aug 22, 2026
a48203c
feat(remote): update aiden-remote-parse
sambitcreate Aug 22, 2026
8ba0416
test(main): update aiden-remote.test
sambitcreate Aug 22, 2026
9628f33
feat(remote): update aiden-remote
sambitcreate Aug 22, 2026
adf8e02
feat(providers): update providers
sambitcreate Aug 22, 2026
dcd7090
feat(remote): update index
sambitcreate Aug 22, 2026
160c61f
test(main): update aiden-remote-chat-http.test
sambitcreate Aug 22, 2026
f41bd05
test(main): update aiden-remote-pairing.test
sambitcreate Aug 22, 2026
c872001
feat(remote): update aiden-remote-pairing
sambitcreate Aug 22, 2026
55979f1
test(main): update aiden-remote-protocol.test
sambitcreate Aug 22, 2026
8ece1be
feat(remote): update aiden-remote-protocol
sambitcreate Aug 22, 2026
0cfce64
test(main): update aiden-remote-router.test
sambitcreate Aug 22, 2026
33066ed
feat(remote): update aiden-remote-router
sambitcreate Aug 22, 2026
39216d7
feat(remote): update aiden-remote-service-main
sambitcreate Aug 22, 2026
68dd3a1
test(main): update aiden-remote-service.test
sambitcreate Aug 22, 2026
f4ede71
feat(remote): update aiden-remote-service
sambitcreate Aug 22, 2026
6015635
test(main): update aiden-remote-state.test
sambitcreate Aug 22, 2026
321f62e
feat(remote): update aiden-remote-state
sambitcreate Aug 22, 2026
7bcfa2f
test(main): update aiden-remote-streams.test
sambitcreate Aug 22, 2026
97abff2
feat(remote): update aiden-remote-streams
sambitcreate Aug 22, 2026
25b7226
test(main): update aiden-remote-tailscale-route.test
sambitcreate Aug 22, 2026
d4c3f6a
feat(remote): update aiden-remote-tailscale-route
sambitcreate Aug 22, 2026
588197d
test(main): update aiden-remote-tailscale.test
sambitcreate Aug 22, 2026
5ff954c
feat(remote): update aiden-remote-tailscale
sambitcreate Aug 22, 2026
2ec39da
test(main): update aiden-remote-workspace-http.test
sambitcreate Aug 22, 2026
fc287ca
test(main): update models.test
sambitcreate Aug 22, 2026
30e7101
feat(models): update models
sambitcreate Aug 22, 2026
4e281d8
feat(remote): update portable-config-core
sambitcreate Aug 22, 2026
c15b3d2
test(main): update provider-auth-flow-core.test
sambitcreate Aug 22, 2026
0c44868
feat(providers): update provider-auth-flow-core
sambitcreate Aug 22, 2026
821cb2b
test(main): update provider-credential-rotation-core.test
sambitcreate Aug 22, 2026
d88ca41
feat(providers): update provider-credential-rotation-core
sambitcreate Aug 22, 2026
344d106
feat(providers): update provider-registry
sambitcreate Aug 22, 2026
c4872d3
feat(remote): update types
sambitcreate Aug 22, 2026
0bf2645
test(repo): update package
sambitcreate Aug 22, 2026
729bbbd
feat(protocol): update contract
sambitcreate Aug 22, 2026
03c96cf
feat(protocol): update openapi
sambitcreate Aug 22, 2026
77e1427
test(renderer): update chat-sidebar.test
sambitcreate Aug 22, 2026
0885f90
feat(renderer): update chat-sidebar
sambitcreate Aug 22, 2026
e075749
test(renderer): update onboarding-flow.test
sambitcreate Aug 22, 2026
9a928ad
feat(onboarding): update onboarding-flow
sambitcreate Aug 22, 2026
4cb7631
feat(settings): update about-settings
sambitcreate Aug 22, 2026
39f5e20
feat(settings): update builtin-provider-editor
sambitcreate Aug 22, 2026
ff68f6d
feat(settings): update codex-provider-settings
sambitcreate Aug 22, 2026
157058a
test(renderer): update remote-access-settings.test
sambitcreate Aug 22, 2026
d824a4d
feat(settings): update remote-access-settings
sambitcreate Aug 22, 2026
e4474b8
feat(renderer): update ui
sambitcreate Aug 22, 2026
2f8f9bd
feat(renderer): update codex-auth-view-state
sambitcreate Aug 22, 2026
f499c07
feat(renderer): update ipc
sambitcreate Aug 22, 2026
f46e05c
test(renderer): update onboarding-state.test
sambitcreate Aug 22, 2026
0298533
feat(onboarding): update onboarding-state
sambitcreate Aug 22, 2026
d1ddfc4
feat(renderer): update types
sambitcreate Aug 22, 2026
8f8cc55
feat(renderer): update root-view
sambitcreate Aug 22, 2026
5c5c53d
feat(renderer): update aiden-remote
sambitcreate Aug 22, 2026
963fca0
feat(onboarding): update onboarding
sambitcreate Aug 22, 2026
8a2ed94
docs(plans): add aiden-manual-pairing-plan
sambitcreate Aug 22, 2026
3b2ee2d
docs(plans): add aiden-remote-multi-instance-hardening-plan
sambitcreate Aug 22, 2026
d12cdc9
docs(plans): add onboarding-auth-and-provider-validation-plan
sambitcreate Aug 22, 2026
31daaf2
test(main): add aiden-remote-revocation.test
sambitcreate Aug 22, 2026
ea2a8d5
feat(remote): add aiden-remote-revocation
sambitcreate Aug 22, 2026
b2b4336
test(main): add onboarding-provider-validation.test
sambitcreate Aug 22, 2026
794ffde
feat(onboarding): add onboarding-provider-validation
sambitcreate Aug 22, 2026
7f644a9
test(main): add onboarding-state-core.test
sambitcreate Aug 22, 2026
df79e07
feat(onboarding): add onboarding-state-core
sambitcreate Aug 22, 2026
2c7be5a
feat(onboarding): add onboarding-state
sambitcreate Aug 22, 2026
8848051
feat(protocol): add manual-pairing-vector
sambitcreate Aug 22, 2026
12e7e93
test(renderer): add remote-connection-popover.test
sambitcreate Aug 22, 2026
2b22425
feat(renderer): add remote-connection-popover
sambitcreate Aug 22, 2026
e89b224
test(renderer): add remote-connection-status.test
sambitcreate Aug 22, 2026
84b912f
feat(renderer): add remote-connection-status
sambitcreate Aug 22, 2026
2b3cc1c
test(renderer): add remote-pairing-lifecycle.test
sambitcreate Aug 22, 2026
a96d352
feat(renderer): add remote-pairing-lifecycle
sambitcreate Aug 22, 2026
91bcc5b
test(renderer): add onboarding.test
sambitcreate Aug 22, 2026
6ad260f
test(e2e): scope remote access readiness status
sambitcreate Aug 22, 2026
db366d7
test(e2e): scope disabled remote access status
sambitcreate Aug 22, 2026
b129252
fix(remote): close rollback sockets before listeners
sambitcreate Aug 22, 2026
5b75e4e
docs: record catalog and device tooling papercuts
sambitcreate Aug 22, 2026
2cf4ce7
docs: update dynamic catalog plan status
sambitcreate Aug 22, 2026
ba2b8c9
docs: record first-class iOS pairing choices
sambitcreate Aug 22, 2026
507c329
docs: finalize dynamic model catalog plan
sambitcreate Aug 22, 2026
4570d8c
docs: record physical pairing validation
sambitcreate Aug 22, 2026
f7bc713
feat(models): coordinate Pi catalog refreshes
sambitcreate Aug 22, 2026
d4efea5
feat(models): resolve provider model metadata
sambitcreate Aug 22, 2026
20b15d6
feat(models): define Pi provider compatibility
sambitcreate Aug 22, 2026
ddfa90e
feat(models): fetch bounded Pi remote catalogs
sambitcreate Aug 22, 2026
14f4397
test(models): cover Pi remote catalog hardening
sambitcreate Aug 22, 2026
ed340a6
feat(models): persist dynamic Pi model overlays
sambitcreate Aug 22, 2026
4b58208
feat(providers): merge refreshed Pi model catalogs
sambitcreate Aug 22, 2026
75b7e38
feat(providers): expose refreshed model metadata
sambitcreate Aug 22, 2026
2478b47
test(providers): verify dynamic model metadata
sambitcreate Aug 22, 2026
1aae5f5
feat(providers): refresh models after authentication
sambitcreate Aug 22, 2026
d0a1156
test(providers): cover authenticated model refresh
sambitcreate Aug 22, 2026
600d580
fix(onboarding): validate against refreshed models
sambitcreate Aug 22, 2026
4b22e49
test(onboarding): cover refreshed provider validation
sambitcreate Aug 22, 2026
84b1d6c
feat(config): persist model catalog refresh state
sambitcreate Aug 22, 2026
df8f410
test(config): cover model catalog persistence
sambitcreate Aug 22, 2026
0756556
feat(config): normalize portable model metadata
sambitcreate Aug 22, 2026
c01d09b
feat(models): type provider catalog warnings
sambitcreate Aug 22, 2026
1cd7965
fix(models): use compatible OpenCode Go transport
sambitcreate Aug 22, 2026
37b92d0
fix(thinking): align runtime model thinking levels
sambitcreate Aug 22, 2026
fb11971
test(thinking): cover dynamic runtime levels
sambitcreate Aug 22, 2026
fe44623
feat(remote): project refreshed models to iOS
sambitcreate Aug 22, 2026
f69c0c0
test(remote): cover dynamic iOS model projection
sambitcreate Aug 22, 2026
2459e6e
test(remote): lock additive thinking defaults
sambitcreate Aug 22, 2026
0e3a7a5
feat(providers): add explicit catalog refresh actions
sambitcreate Aug 22, 2026
b0a5b44
docs(protocol): expose model thinking defaults
sambitcreate Aug 22, 2026
5696e6e
feat(thinking): centralize provider thinking choices
sambitcreate Aug 22, 2026
773d7b3
test(thinking): cover provider thinking choices
sambitcreate Aug 22, 2026
91cfda9
feat(models): type dynamic provider catalog state
sambitcreate Aug 22, 2026
4a93bff
feat(models): expose catalog refresh IPC
sambitcreate Aug 22, 2026
949d19f
feat(settings): refresh provider model catalogs
sambitcreate Aug 22, 2026
138640c
feat(settings): show refreshed builtin models
sambitcreate Aug 22, 2026
ef74488
fix(onboarding): reconcile refreshed model choices
sambitcreate Aug 22, 2026
36e1ca3
feat(models): refresh catalog from command palette
sambitcreate Aug 22, 2026
dbcae51
feat(thinking): render dynamic thinking choices
sambitcreate Aug 22, 2026
75531ac
feat(models): refresh stale catalogs after launch
sambitcreate Aug 22, 2026
5619dfe
feat(ios): decode model thinking defaults
sambitcreate Aug 22, 2026
d440b12
feat(ios): apply remote thinking defaults
sambitcreate Aug 22, 2026
0b333c3
test(ios): cover model thinking defaults
sambitcreate Aug 22, 2026
f249b2c
test(ios): decode refreshed remote models
sambitcreate Aug 22, 2026
aca88c3
feat(ios): expose every Aiden pairing method
sambitcreate Aug 22, 2026
678efd5
test(ios): mirror Mac pairing choices
sambitcreate Aug 22, 2026
d6f2175
chore(models): refresh bundled model capabilities
sambitcreate Aug 22, 2026
886803d
test(ios): lock first-class pairing surfaces
sambitcreate Aug 22, 2026
0478732
test(models): register catalog refresh coverage
sambitcreate Aug 22, 2026
3498c1e
chore(ios): advance TestFlight build to 11
sambitcreate Aug 22, 2026
93f147e
docs(ios): record build 11 App Store state
sambitcreate Aug 22, 2026
963c7ab
docs(ios): update internal TestFlight candidate
sambitcreate Aug 22, 2026
7e5ac84
docs(ios): record build 11 release evidence
sambitcreate Aug 22, 2026
c667ff4
feat(ios): add progressive onboarding and pairing tabs
sambitcreate Aug 22, 2026
fe18160
chore(remote): advance fixture contract revision
sambitcreate Aug 22, 2026
fb28310
feat(remote): describe image content and turn outcomes
sambitcreate Aug 22, 2026
418980f
docs(remote): document image content and terminal outcomes
sambitcreate Aug 22, 2026
ec3e740
feat(remote): project image attachments and safe outcomes
sambitcreate Aug 22, 2026
8fc523d
test(remote): cover attachment content and outcomes
sambitcreate Aug 22, 2026
6ee28d7
feat(remote): serve authenticated attachment images
sambitcreate Aug 22, 2026
14ef747
test(remote): verify attachment image HTTP route
sambitcreate Aug 22, 2026
fb285ff
test(remote): cover attachment content route contract
sambitcreate Aug 22, 2026
f026c71
fix(remote): reconcile terminal stream outcomes
sambitcreate Aug 22, 2026
2d2e410
test(remote): cover cancellation and terminal replay
sambitcreate Aug 22, 2026
fbe3e0f
fix(agent): persist initialization terminal states once
sambitcreate Aug 22, 2026
5ab4f84
test(agent): cover initialization terminal persistence
sambitcreate Aug 22, 2026
5d628b0
fix(agent): publish durable initialization failures
sambitcreate Aug 22, 2026
f266ded
test(agent): enforce terminal state ordering
sambitcreate Aug 22, 2026
5a83c7a
test(agent): register initialization terminal coverage
sambitcreate Aug 22, 2026
4981ae4
feat(ios): model attachments and terminal outcomes
sambitcreate Aug 22, 2026
91f66dc
feat(ios): fetch authenticated chat images
sambitcreate Aug 22, 2026
6ad7965
feat(ios): cache bounded protected chat images
sambitcreate Aug 22, 2026
e2f7532
feat(ios): render stable sender-edge image decks
sambitcreate Aug 22, 2026
06d4bc9
test(ios): cover chat media rendering and outcomes
sambitcreate Aug 22, 2026
7f8655b
feat(ios): adapt onboarding actions across window sizes
sambitcreate Aug 22, 2026
8440c65
test(ios): cover adaptive onboarding layout
sambitcreate Aug 22, 2026
695e5aa
test(ios): verify authenticated image downloads
sambitcreate Aug 22, 2026
5df044a
test(ios): expect remote contract revision four
sambitcreate Aug 22, 2026
c39fae1
chore(ios): explain save-to-photos permission
sambitcreate Aug 22, 2026
c49f6f5
test(ios): lock adaptive onboarding action layout
sambitcreate Aug 22, 2026
7939a30
docs(plan): record attachment and carousel completion
sambitcreate Aug 22, 2026
55e93b9
chore(ios): bump internal TestFlight build to 12
sambitcreate Aug 22, 2026
a1f9ee3
fix(ios): preserve all inline image corners
sambitcreate Aug 22, 2026
bf09c78
test(ios): lock image mask modifier order
sambitcreate Aug 22, 2026
15e8002
docs(plan): record fitted image corner correction
sambitcreate Aug 22, 2026
b2a3f91
chore(ios): bump replacement TestFlight build to 13
sambitcreate Aug 22, 2026
b51ae42
docs(ios): record TestFlight build 13 identity
sambitcreate Aug 22, 2026
3d9eb98
docs(test): record build 13 release evidence
sambitcreate Aug 22, 2026
0783e2a
fix(remote): make approval streams resumable and bounded
sambitcreate Aug 22, 2026
7bf7b4d
test(remote): cover approval lifecycle and journal bounds
sambitcreate Aug 22, 2026
a18bf95
feat(remote): expose pending approval snapshots
sambitcreate Aug 22, 2026
cf47ff4
feat(remote): bridge host approval coordination
sambitcreate Aug 22, 2026
9b96efe
feat(remote): add authenticated stream approval route
sambitcreate Aug 22, 2026
cb1db39
test(remote): verify approval snapshot HTTP contract
sambitcreate Aug 22, 2026
032f608
test(protocol): freeze additive approval snapshot schema
sambitcreate Aug 22, 2026
8f61ff6
docs(protocol): define stream approval snapshot
sambitcreate Aug 22, 2026
a15344b
test(protocol): add revision five approval fixture
sambitcreate Aug 22, 2026
03fb619
docs(remote): document resumable approval snapshots
sambitcreate Aug 22, 2026
bbfba29
fix(ipc): validate remote approval identifiers
sambitcreate Aug 22, 2026
b733683
feat(ipc): bind host approval actions to current document
sambitcreate Aug 22, 2026
da6ef82
test(ipc): cover approval ownership across awaits
sambitcreate Aug 22, 2026
087c743
feat(ipc): allow scoped approval change notifications
sambitcreate Aug 22, 2026
17bd522
feat(renderer): type remote approval capabilities
sambitcreate Aug 22, 2026
4f91b78
fix(renderer): fence approval refresh reconciliation
sambitcreate Aug 22, 2026
624d6d5
test(renderer): cover approval merge and refresh fencing
sambitcreate Aug 22, 2026
0ce95dc
fix(renderer): show safe host approval controls
sambitcreate Aug 22, 2026
c00ba4a
test(renderer): require deny-only malformed approvals
sambitcreate Aug 22, 2026
18fbb6d
test(remote): register approval reconciliation coverage
sambitcreate Aug 22, 2026
ef458b8
feat(ios): model approval snapshots and identity checks
sambitcreate Aug 22, 2026
8a3e014
feat(ios): fetch pending stream approvals
sambitcreate Aug 22, 2026
5e24922
test(ios): decode revision five approval fixture
sambitcreate Aug 22, 2026
689e4aa
fix(ios): condition stream cache cleanup on identity
sambitcreate Aug 22, 2026
3318204
fix(ios): reconcile approvals without stale stream races
sambitcreate Aug 22, 2026
c59c969
test(ios): cover approval identity and cache ABA races
sambitcreate Aug 22, 2026
42bd1b2
test(ios): verify separate approval snapshot request
sambitcreate Aug 22, 2026
e532938
test(ios): freeze approval fixture contract
sambitcreate Aug 22, 2026
9c1452c
docs(ios): note approval visibility repair
sambitcreate Aug 22, 2026
2d244cd
docs(ios): reserve build fourteen candidate
sambitcreate Aug 22, 2026
d23f80c
build(ios): bump internal TestFlight build to fourteen
sambitcreate Aug 22, 2026
6a161a4
docs(ios): record TestFlight build 14 release
sambitcreate Aug 22, 2026
eb08b7f
feat: share agent images across paired clients
sambitcreate Aug 22, 2026
27501e2
feat(remote): project safe generation timelines
sambitcreate Aug 22, 2026
4bd2c0c
test(remote): cover mobile activity projection
sambitcreate Aug 22, 2026
868b6f6
feat(ios): align activity presentation with Mac
sambitcreate Aug 22, 2026
6ee9ad5
test(ios): cover typed activity timelines
sambitcreate Aug 22, 2026
1373b49
build(ios): bump internal TestFlight build to fifteen
sambitcreate Aug 22, 2026
18497cf
docs(ios): record TestFlight build fifteen release
sambitcreate Aug 22, 2026
3c046e2
feat(ios): add scoped semantic haptic center
sambitcreate Aug 22, 2026
e9cb2cd
feat(ios): host interaction haptics at app root
sambitcreate Aug 22, 2026
cb0f08c
feat(ios): expose interaction haptics preference
sambitcreate Aug 22, 2026
09544ed
fix(ios): silence haptics during audio capture
sambitcreate Aug 22, 2026
7aac731
feat(remote): model authoritative mutation outcomes
sambitcreate Aug 22, 2026
352a760
feat(ios): scope pairing outcome haptics
sambitcreate Aug 22, 2026
d70dbb7
feat(ios): add replay-safe chat haptics
sambitcreate Aug 22, 2026
b294700
feat(ios): add scheduled task outcome haptics
sambitcreate Aug 22, 2026
d708cb8
feat(ios): add file and git outcome haptics
sambitcreate Aug 22, 2026
5e1ae3f
feat(ios): add workspace interaction haptics
sambitcreate Aug 22, 2026
afa9aac
test(ios): cover haptic gates and stream races
sambitcreate Aug 22, 2026
97db505
test(remote): cover definitive mutation failure
sambitcreate Aug 22, 2026
31aed36
chore(ios): advance TestFlight build to 16
sambitcreate Aug 22, 2026
29622c3
docs(plan): archive completed iOS haptics work
sambitcreate Aug 22, 2026
fbe14b2
docs(plans): record haptics completion
sambitcreate Aug 22, 2026
cc8ad4b
docs(ios): record TestFlight build 16
sambitcreate Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
193 changes: 193 additions & 0 deletions .github/workflows/aiden-on-the-go-external-testflight.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
# Maintainer-only: uploads a build to the Aiden On The Go app's external TestFlight.
# Requires the repo's APP_STORE_CONNECT_* secrets (App Store Connect API key),
# which forks and contributors do not have. Repository CI lives in .github/workflows/ci.yml.

# Run manually from the Actions tab (workflow_dispatch).
name: Aiden On The Go External TestFlight

on:
workflow_dispatch:
inputs:
confirm_external_review:
description: "Type EXTERNAL_REVIEW to confirm this upload can be submitted to Beta App Review."
required: true
type: string
build_number:
description: "Optional CFBundleVersion override. Leave blank to use the next App Store Connect build number."
required: false
type: string

run-name: "Aiden On The Go external TestFlight from ${{ github.ref_name }}"

permissions:
contents: read

concurrency:
group: aiden-on-the-go-external-testflight
cancel-in-progress: false

jobs:
upload:
name: Archive and Upload
runs-on: macos-26
environment: aiden-on-the-go-external-testflight
timeout-minutes: 60

env:
APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }}
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
APP_STORE_CONNECT_PRIVATE_KEY: ${{ secrets.APP_STORE_CONNECT_PRIVATE_KEY }}
EXPORT_OPTIONS_PLIST: ios/ci/ExternalTestFlightExportOptions.plist
PROJECT_PATH: ios/AidenOnTheGo.xcodeproj
SCHEME: AidenOnTheGo
TEAM_ID: 5WP229CBB8

steps:
- name: Check manual gate
env:
CONFIRM_EXTERNAL_REVIEW: ${{ inputs.confirm_external_review }}
run: |
set -euo pipefail

if [[ "${GITHUB_REF_NAME}" != "main" ]]; then
echo "External TestFlight uploads must be run from main. Current ref: ${GITHUB_REF_NAME}" >&2
exit 1
fi

if [[ "${CONFIRM_EXTERNAL_REVIEW}" != "EXTERNAL_REVIEW" ]]; then
echo "Re-run with confirm_external_review set to EXTERNAL_REVIEW." >&2
exit 1
fi

- name: Check required secrets
run: |
set -euo pipefail

missing=0
for name in APP_STORE_CONNECT_KEY_ID APP_STORE_CONNECT_ISSUER_ID APP_STORE_CONNECT_PRIVATE_KEY; do
if [[ -z "${!name}" ]]; then
echo "Missing required secret: ${name}" >&2
missing=1
fi
done

exit "${missing}"

- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803

- name: Set output paths
run: |
set -euo pipefail

{
echo "ARCHIVE_PATH=${RUNNER_TEMP}/AidenOnTheGo.xcarchive"
echo "DERIVED_DATA_PATH=${RUNNER_TEMP}/DerivedData"
echo "EXPORT_PATH=${RUNNER_TEMP}/ExternalTestFlightExport"
} >> "${GITHUB_ENV}"

- name: Detect marketing version
run: |
set -euo pipefail

marketing_version="$(
xcodebuild \
-showBuildSettings \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-configuration Release 2>/dev/null |
awk -F'= ' '/MARKETING_VERSION/ { print $2; exit }'
)"

if [[ -z "${marketing_version}" ]]; then
echo "Could not detect MARKETING_VERSION from Xcode build settings." >&2
exit 1
fi

echo "MARKETING_VERSION=${marketing_version}" >> "${GITHUB_ENV}"
echo "Using marketing version ${marketing_version}"

- name: Write App Store Connect key
run: |
set -euo pipefail

key_path="${RUNNER_TEMP}/AuthKey_${APP_STORE_CONNECT_KEY_ID}.p8"
if [[ "${APP_STORE_CONNECT_PRIVATE_KEY}" == *"\\n"* ]]; then
printf "%s" "${APP_STORE_CONNECT_PRIVATE_KEY}" | perl -pe 's/\\n/\n/g' > "${key_path}"
else
printf "%s" "${APP_STORE_CONNECT_PRIVATE_KEY}" > "${key_path}"
fi
chmod 600 "${key_path}"
echo "APP_STORE_CONNECT_KEY_PATH=${key_path}" >> "${GITHUB_ENV}"

# ENFORCE_OPEN_TRAIN fails this step in seconds — instead of the upload
# step after an expensive archive — when the marketing version's
# pre-release train is already closed by an approved App Store version
# (bitten 2026-06-02 with 1.0 and 2026-08-04 with 1.4).
- name: Check release train and select build number
env:
BUNDLE_ID: sbtbiswas.AidenOnTheGo
REQUESTED_BUILD_NUMBER: ${{ inputs.build_number }}
ENFORCE_OPEN_TRAIN: "1"
run: |
set -euo pipefail

build_number="$(ruby ios/ci/select_testflight_build_number.rb)"
echo "BUILD_NUMBER=${build_number}" >> "${GITHUB_ENV}"
echo "Using build number ${build_number}"

- name: Show upload target
run: |
set -euo pipefail

echo "Uploading external-capable TestFlight build"
echo "Commit SHA: ${GITHUB_SHA}"
echo "Marketing version: ${MARKETING_VERSION}"
echo "Build number: ${BUILD_NUMBER}"
echo "Export options: ${EXPORT_OPTIONS_PLIST}"
echo "This workflow uploads only; App Store Connect external group assignment and Beta App Review submission remain manual."

- name: Show Xcode version
run: xcodebuild -version

- name: Resolve Swift packages
run: |
set -euo pipefail

xcodebuild \
-resolvePackageDependencies \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}"

- name: Archive
run: |
set -euo pipefail

xcodebuild \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-configuration Release \
-destination "generic/platform=iOS" \
-archivePath "${ARCHIVE_PATH}" \
-derivedDataPath "${DERIVED_DATA_PATH}" \
-allowProvisioningUpdates \
-authenticationKeyPath "${APP_STORE_CONNECT_KEY_PATH}" \
-authenticationKeyID "${APP_STORE_CONNECT_KEY_ID}" \
-authenticationKeyIssuerID "${APP_STORE_CONNECT_ISSUER_ID}" \
DEVELOPMENT_TEAM="${TEAM_ID}" \
CURRENT_PROJECT_VERSION="${BUILD_NUMBER}" \
archive

- name: Upload to App Store Connect
run: |
set -euo pipefail

xcodebuild \
-exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportPath "${EXPORT_PATH}" \
-exportOptionsPlist "${EXPORT_OPTIONS_PLIST}" \
-allowProvisioningUpdates \
-authenticationKeyPath "${APP_STORE_CONNECT_KEY_PATH}" \
-authenticationKeyID "${APP_STORE_CONNECT_KEY_ID}" \
-authenticationKeyIssuerID "${APP_STORE_CONNECT_ISSUER_ID}"
187 changes: 187 additions & 0 deletions .github/workflows/aiden-on-the-go-internal-testflight.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# Maintainer-only: uploads a build to the Aiden On The Go app's internal TestFlight.
# Requires the repo's APP_STORE_CONNECT_* secrets (App Store Connect API key),
# which forks and contributors do not have. Repository CI lives in .github/workflows/ci.yml.

# Run manually from the Actions tab (workflow_dispatch).
name: Aiden On The Go Internal TestFlight

on:
workflow_dispatch:
inputs:
confirm_internal_only:
description: "Type INTERNAL to confirm this upload is for internal TestFlight only."
required: true
type: string
build_number:
description: "Optional CFBundleVersion override. Leave blank to use the next App Store Connect build number."
required: false
type: string

run-name: "Aiden On The Go internal TestFlight from ${{ github.ref_name }}"

permissions:
contents: read

concurrency:
group: aiden-on-the-go-internal-testflight
cancel-in-progress: false

jobs:
upload:
name: Archive and Upload
runs-on: macos-26
environment: aiden-on-the-go-internal-testflight
timeout-minutes: 60

env:
APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }}
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
APP_STORE_CONNECT_PRIVATE_KEY: ${{ secrets.APP_STORE_CONNECT_PRIVATE_KEY }}
EXPORT_OPTIONS_PLIST: ios/ci/TestFlightExportOptions.plist
PROJECT_PATH: ios/AidenOnTheGo.xcodeproj
SCHEME: AidenOnTheGo
TEAM_ID: 5WP229CBB8

steps:
- name: Check manual gate
env:
CONFIRM_INTERNAL_ONLY: ${{ inputs.confirm_internal_only }}
run: |
set -euo pipefail

if [[ "${GITHUB_REF_NAME}" != "main" ]]; then
echo "Internal TestFlight uploads must be run from main. Current ref: ${GITHUB_REF_NAME}" >&2
exit 1
fi

if [[ "${CONFIRM_INTERNAL_ONLY}" != "INTERNAL" ]]; then
echo "Re-run with confirm_internal_only set to INTERNAL." >&2
exit 1
fi

- name: Check required secrets
run: |
set -euo pipefail

missing=0
for name in APP_STORE_CONNECT_KEY_ID APP_STORE_CONNECT_ISSUER_ID APP_STORE_CONNECT_PRIVATE_KEY; do
if [[ -z "${!name}" ]]; then
echo "Missing required secret: ${name}" >&2
missing=1
fi
done

exit "${missing}"

- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803

- name: Set output paths
run: |
set -euo pipefail

{
echo "ARCHIVE_PATH=${RUNNER_TEMP}/AidenOnTheGo.xcarchive"
echo "DERIVED_DATA_PATH=${RUNNER_TEMP}/DerivedData"
echo "EXPORT_PATH=${RUNNER_TEMP}/TestFlightExport"
} >> "${GITHUB_ENV}"

- name: Detect marketing version
run: |
set -euo pipefail

marketing_version="$(
xcodebuild \
-showBuildSettings \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-configuration Release 2>/dev/null |
awk -F'= ' '/MARKETING_VERSION/ { print $2; exit }'
)"

if [[ -z "${marketing_version}" ]]; then
echo "Could not detect MARKETING_VERSION from Xcode build settings." >&2
exit 1
fi

echo "MARKETING_VERSION=${marketing_version}" >> "${GITHUB_ENV}"
echo "Using marketing version ${marketing_version}"

- name: Write App Store Connect key
run: |
set -euo pipefail

key_path="${RUNNER_TEMP}/AuthKey_${APP_STORE_CONNECT_KEY_ID}.p8"
if [[ "${APP_STORE_CONNECT_PRIVATE_KEY}" == *"\\n"* ]]; then
printf "%s" "${APP_STORE_CONNECT_PRIVATE_KEY}" | perl -pe 's/\\n/\n/g' > "${key_path}"
else
printf "%s" "${APP_STORE_CONNECT_PRIVATE_KEY}" > "${key_path}"
fi
chmod 600 "${key_path}"
echo "APP_STORE_CONNECT_KEY_PATH=${key_path}" >> "${GITHUB_ENV}"

- name: Select build number
env:
BUNDLE_ID: sbtbiswas.AidenOnTheGo
REQUESTED_BUILD_NUMBER: ${{ inputs.build_number }}
run: |
set -euo pipefail

build_number="$(ruby ios/ci/select_testflight_build_number.rb)"
echo "BUILD_NUMBER=${build_number}" >> "${GITHUB_ENV}"
echo "Using build number ${build_number}"

- name: Show upload target
run: |
set -euo pipefail

echo "Uploading internal-only TestFlight build"
echo "Commit SHA: ${GITHUB_SHA}"
echo "Marketing version: ${MARKETING_VERSION}"
echo "Build number: ${BUILD_NUMBER}"
echo "Export options: ${EXPORT_OPTIONS_PLIST}"

- name: Show Xcode version
run: xcodebuild -version

- name: Resolve Swift packages
run: |
set -euo pipefail

xcodebuild \
-resolvePackageDependencies \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}"

- name: Archive
run: |
set -euo pipefail

xcodebuild \
-project "${PROJECT_PATH}" \
-scheme "${SCHEME}" \
-configuration Release \
-destination "generic/platform=iOS" \
-archivePath "${ARCHIVE_PATH}" \
-derivedDataPath "${DERIVED_DATA_PATH}" \
-allowProvisioningUpdates \
-authenticationKeyPath "${APP_STORE_CONNECT_KEY_PATH}" \
-authenticationKeyID "${APP_STORE_CONNECT_KEY_ID}" \
-authenticationKeyIssuerID "${APP_STORE_CONNECT_ISSUER_ID}" \
DEVELOPMENT_TEAM="${TEAM_ID}" \
CURRENT_PROJECT_VERSION="${BUILD_NUMBER}" \
archive

- name: Upload to App Store Connect
run: |
set -euo pipefail

xcodebuild \
-exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportPath "${EXPORT_PATH}" \
-exportOptionsPlist "${EXPORT_OPTIONS_PLIST}" \
-allowProvisioningUpdates \
-authenticationKeyPath "${APP_STORE_CONNECT_KEY_PATH}" \
-authenticationKeyID "${APP_STORE_CONNECT_KEY_ID}" \
-authenticationKeyIssuerID "${APP_STORE_CONNECT_ISSUER_ID}"
Loading