860a4edf61
Route local dev, tests, production build, mobile release, mobile verification, and doctor through one Workout xtask surface, and update the canonical docs around that surface. req: examples/001 req: examples/006 req: test/004
80 lines
2.9 KiB
Markdown
80 lines
2.9 KiB
Markdown
# Recipe: Workout mobile release
|
|
|
|
The Workout exemplar is the production-shaped mobile path for hemx. It stays
|
|
boring on purpose: hemx builds the server app and writes mobile shell metadata;
|
|
Android/iOS SDKs, store signing, provisioning, and submission remain external
|
|
vendor work. req: examples/006
|
|
|
|
## Command surface
|
|
|
|
```sh
|
|
cargo run -p hemx-xtask -- workout dev
|
|
cargo run -p hemx-xtask -- workout test
|
|
cargo run -p hemx-xtask -- workout build
|
|
cargo run -p hemx-xtask -- workout mobile-release
|
|
cargo run -p hemx-xtask -- workout mobile-verify
|
|
cargo run -p hemx-xtask -- workout doctor
|
|
```
|
|
|
|
`workout mobile-release` builds `target/release/hemx-workout-example` and writes
|
|
a release kit under `target/hemx-mobile/workout` by default:
|
|
|
|
```text
|
|
target/hemx-mobile/workout/
|
|
release-manifest.json
|
|
BLOCKERS.md
|
|
android/twa-release.json
|
|
android/README.md
|
|
ios/webview-release.json
|
|
ios/README.md
|
|
```
|
|
|
|
Use `workout mobile-verify` to check the generated kit and release binary. Use
|
|
`workout doctor` when you only want to see missing external inputs.
|
|
|
|
## Production configuration
|
|
|
|
Set these explicitly for a real app release:
|
|
|
|
```sh
|
|
HEMX_WORKOUT_APP_ID=com.example.workout
|
|
HEMX_WORKOUT_APP_NAME="Workout Copilot"
|
|
HEMX_WORKOUT_VERSION=1.0.0
|
|
HEMX_WORKOUT_ORIGIN=https://workout.example.com
|
|
HEMX_WORKOUT_ANDROID_PACKAGE=com.example.workout
|
|
HEMX_WORKOUT_IOS_BUNDLE_ID=com.example.workout
|
|
HEMX_WORKOUT_MOBILE_OUT=target/hemx-mobile/workout
|
|
```
|
|
|
|
The generated manifest records:
|
|
|
|
- app identity and version;
|
|
- the production HTTPS origin used by Android and iOS shells;
|
|
- `target/release/hemx-workout-example` as the server artifact;
|
|
- runtime assets served by the same release through `hemx_axum::runtime_js_path()`;
|
|
- cache policy: release-scoped HTML/CSS/runtime assets only;
|
|
- offline truth policy: app-owned command/event/projection records, never DOM
|
|
patches or UI effect payloads;
|
|
- environment/secrets boundary: public shell config in the kit, signing secrets
|
|
outside the repo;
|
|
- rollback: redeploy the previous server binary and rebuild store artifacts from
|
|
the previous shell metadata/signing inputs. req: local/001 req: host/002
|
|
|
|
## Android and iOS artifacts
|
|
|
|
The command writes release-ready metadata, not store-signed binaries. That is the
|
|
honest boundary: producing `.aab`/`.apk` and `.ipa` files requires vendor SDKs,
|
|
signing credentials, and store accounts on the release machine.
|
|
|
|
Android blockers are reported when the Android SDK/JDK/signing key are not
|
|
visible. iOS blockers are reported when Xcode or the Apple signing team is not
|
|
visible. These blockers are copied into `BLOCKERS.md` so the release kit can be
|
|
reviewed without guessing what is still external. req: examples/006
|
|
|
|
## What this does not add
|
|
|
|
This is not a `hemx-mobile` framework, sync layer, client database, or native UI
|
|
runtime. The mobile shells load the production Workout web app and route host
|
|
capabilities such as share/haptics through the typed host boundary before UI
|
|
effects are produced. req: host/002 req: local/002
|