Phase 6: CI & release process - #14
Merged
Merged
Conversation
Scope narrowed from the roadmap's original EAS/Detox-Maestro/store-cutover entry: CI gate + documented manual release path, mirroring paperwork-app's existing Xcode/gradlew process. EAS and E2E are deferred; store submission stays a manual later decision.
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Gives the app a CI gate and a documented, verified manual release process, per the Phase 6 design doc (
specs/2026-07-02-phase-6-ci-release/design.md). Scope was narrowed during brainstorming from the migration roadmap's original entry: EAS and Detox/Maestro E2E are deferred to a future phase; actual store submission stays a manual, later decision.react-hooks/set-state-in-effectlint errors so the new CI lint gate isn't red on arrival.github/workflows/ci.yml(typecheck + test + lint, verify-only, no build/deploy)npm run update-version— single-file version bump againstapp.json(the source of truth, sinceios//android/are gitignored and regenerated byexpo prebuild)plugins/withReleaseSigningConfig.js— an Expo config plugin that injects Android release-signing config into the generatedbuild.gradleand copies credentials from a gitignoredcredentials/folder, survivingexpo prebuild --clean. No real credentials are in this branch.docs/RELEASE.mddocumenting CI, versioning, and manual iOS/Android release stepsBuilt via subagent-driven-development: each task had its own implementer + reviewer cycle, followed by a whole-branch review (opus) that came back "Ready to merge: With fixes" — one Minor wording inaccuracy (docs said release builds "fall back to the debug keystore" when credentials are missing; actual AGP behavior is an unsigned build) was found and fixed (
86f7716).Test plan
npm run typecheck— cleannpm test— 610/610 passing across 94 suitesnpm run lint— 0 errors (57 pre-existing warnings, unrelated to this branch)expo prebuild --platform android --cleanrun twice — signing config injection verified idempotent against the real generatedbuild.gradledocs/RELEASE.md): supply realcredentials/keystore.properties+credentials/release.keystorefrom paperwork-app's existing Android keystore, then run a realgradlew bundleReleaseand confirm the.aab's signing certificate matches paperwork-app'sexpo prebuild --platform ios→ open in Xcode → confirm a real Archive succeeds