nativeapptemplate-agent 0.3.2 → 0.4.1
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/AGENTS.md +1 -1
- package/README.md +36 -13
- package/dist/agents/judge.d.ts.map +1 -1
- package/dist/agents/judge.js +8 -2
- package/dist/agents/judge.js.map +1 -1
- package/dist/agents/types.d.ts +14 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/workers/android.d.ts.map +1 -1
- package/dist/agents/workers/android.js +27 -3
- package/dist/agents/workers/android.js.map +1 -1
- package/dist/agents/workers/copy.d.ts +1 -0
- package/dist/agents/workers/copy.d.ts.map +1 -1
- package/dist/agents/workers/copy.js +23 -4
- package/dist/agents/workers/copy.js.map +1 -1
- package/dist/agents/workers/ios.d.ts.map +1 -1
- package/dist/agents/workers/ios.js +23 -3
- package/dist/agents/workers/ios.js.map +1 -1
- package/dist/agents/workers/rails.d.ts.map +1 -1
- package/dist/agents/workers/rails.js +6 -1
- package/dist/agents/workers/rails.js.map +1 -1
- package/dist/app-domain.d.ts +32 -0
- package/dist/app-domain.d.ts.map +1 -0
- package/dist/app-domain.js +93 -0
- package/dist/app-domain.js.map +1 -0
- package/dist/dispatch.d.ts +7 -0
- package/dist/dispatch.d.ts.map +1 -1
- package/dist/dispatch.js +61 -10
- package/dist/dispatch.js.map +1 -1
- package/dist/env-bridge.d.ts +1 -0
- package/dist/env-bridge.d.ts.map +1 -1
- package/dist/env-bridge.js +53 -16
- package/dist/env-bridge.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +5 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +43 -16
- package/dist/mcp.js.map +1 -1
- package/dist/mobile.d.ts +1 -1
- package/dist/mobile.d.ts.map +1 -1
- package/dist/mobile.js +3 -3
- package/dist/mobile.js.map +1 -1
- package/dist/preflight.d.ts +27 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +106 -0
- package/dist/preflight.js.map +1 -0
- package/dist/report/collect.d.ts +5 -0
- package/dist/report/collect.d.ts.map +1 -1
- package/dist/report/collect.js +15 -0
- package/dist/report/collect.js.map +1 -1
- package/dist/report/model.d.ts +14 -0
- package/dist/report/model.d.ts.map +1 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +69 -6
- package/dist/report/render.js.map +1 -1
- package/dist/report/theme.d.ts +1 -1
- package/dist/report/theme.d.ts.map +1 -1
- package/dist/report/theme.js +1 -0
- package/dist/report/theme.js.map +1 -1
- package/dist/run-options.d.ts +7 -0
- package/dist/run-options.d.ts.map +1 -0
- package/dist/run-options.js +24 -0
- package/dist/run-options.js.map +1 -0
- package/dist/validation/autoformat.d.ts +9 -0
- package/dist/validation/autoformat.d.ts.map +1 -0
- package/dist/validation/autoformat.js +131 -0
- package/dist/validation/autoformat.js.map +1 -0
- package/dist/validation/launch.d.ts +23 -2
- package/dist/validation/launch.d.ts.map +1 -1
- package/dist/validation/launch.js +47 -18
- package/dist/validation/launch.js.map +1 -1
- package/dist/validation/layer1.d.ts.map +1 -1
- package/dist/validation/layer1.js +4 -0
- package/dist/validation/layer1.js.map +1 -1
- package/dist/validation/protected-references.d.ts +2 -0
- package/dist/validation/protected-references.d.ts.map +1 -0
- package/dist/validation/protected-references.js +18 -0
- package/dist/validation/protected-references.js.map +1 -0
- package/dist/validation/run-step.d.ts +16 -0
- package/dist/validation/run-step.d.ts.map +1 -0
- package/dist/validation/run-step.js +49 -0
- package/dist/validation/run-step.js.map +1 -0
- package/dist/validation/scenarios/queue.d.ts.map +1 -1
- package/dist/validation/scenarios/queue.js +7 -3
- package/dist/validation/scenarios/queue.js.map +1 -1
- package/dist/validation/stage2-judge.d.ts +4 -2
- package/dist/validation/stage2-judge.d.ts.map +1 -1
- package/dist/validation/stage2-judge.js +79 -4
- package/dist/validation/stage2-judge.js.map +1 -1
- package/dist/validation/test-suites.d.ts +10 -0
- package/dist/validation/test-suites.d.ts.map +1 -0
- package/dist/validation/test-suites.js +135 -0
- package/dist/validation/test-suites.js.map +1 -0
- package/package.json +1 -1
- package/scripts/ruby/rename.rb +97 -2
package/AGENTS.md
CHANGED
|
@@ -92,7 +92,7 @@ Three clean operations on the substrate (details in `docs/SPEC.md` section 4):
|
|
|
92
92
|
|
|
93
93
|
1. **Rename the skeleton** — Shop → Clinic, Shopkeeper → Staff, propagated coherently across Rails + Swift + Kotlin.
|
|
94
94
|
2. **Adapt or replace the domain module** — keep ItemTag for queue variants; strip and insert a new resource for non-queue SaaS.
|
|
95
|
-
3. **Drive the build green** — Rails tests + xcodebuild + gradlew must all pass.
|
|
95
|
+
3. **Drive the build green** — Rails tests + xcodebuild + gradlew must all pass. Layer 2 only builds; the test suites run when `NATIVEAPPTEMPLATE_TESTS=1` (`src/validation/test-suites.ts`).
|
|
96
96
|
|
|
97
97
|
## Validation (three layers, gated)
|
|
98
98
|
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Coherent across all three, in under an hour.
|
|
|
17
17
|
npx nativeapptemplate-agent "a walk-in clinic queue for small veterinary practices" --project-name="VetClinic"
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
> **Status: 0.
|
|
20
|
+
> **Status: 0.4.1 stable.** First built during [Built with Opus 4.7: a Claude Code Hackathon](https://cerebralvalley.ai/e/built-with-4-7-hackathon) (April 21–27, 2026); shipped to npm post-hackathon. Verified end-to-end on the three demo specs below from a fresh `/tmp/` cwd — the full 3-spec × 2-edition × 2-platform matrix is green at `NATIVEAPPTEMPLATE_VISUAL=2` (see the [matrix](#demo)). Stage 2 (scripted-CRUD walk-through via `mobile-mcp` against a live Rails server) and paid-edition parity validation landed post-launch. Active development continues — see the [roadmap](./ROADMAP.md) for what's next.
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -52,6 +52,8 @@ Generated output appears under `./out/<slug>/`. See [Usage](#usage) for rename o
|
|
|
52
52
|
|
|
53
53
|
> **Pass a project name.** `--project-name` (or "project name is …" in the plugin) pins the Pascal project name, output slug (`out/vet-clinic/`), Xcode scheme, and display name across all three platforms. Omit it and the planner picks one — fine for one-off exploration, but it'll differ across re-runs.
|
|
54
54
|
|
|
55
|
+
> **Pass a domain if the app will ship.** `--domain=vetclinic.app` (or "domain is …" in the plugin) sets the app's web domain and, from its reverse, the iOS bundle ID (`app.vetclinic.VetClinic.ios`) and the Android applicationId / package (`app.vetclinic.vetclinic`). Neither ID can change after the first store release. Omit it and you get `<project name>.com` (`vetclinic.com`, `com.vetclinic.…`).
|
|
56
|
+
|
|
55
57
|
> Using Cursor, Cline, Goose, or another MCP-capable editor? The generator also ships as an MCP server: `npx -y -p nativeapptemplate-agent nativeapptemplate-agent-mcp` exposes a `generate_app` tool you can wire into your editor's MCP config.
|
|
56
58
|
|
|
57
59
|
---
|
|
@@ -78,9 +80,9 @@ It will:
|
|
|
78
80
|
|
|
79
81
|
1. **Parse the spec** into a structured domain (entities, fields, relationships, state machines).
|
|
80
82
|
2. **Copy the free-edition substrate** (three MIT-licensed repos covering Rails + iOS + Android) into `./out/<spec-slug>/{rails,ios,android}/`.
|
|
81
|
-
3. **Rename the skeleton** — `Shop → Clinic`, `Shopkeeper → Vet`, etc. — consistently across Ruby migrations, Swift models, Kotlin data classes, policies, tests, and localized copy.
|
|
82
|
-
4. **Adapt or replace the domain module** — keep `ItemTag` for walk-in queue variants; strip and insert a new resource for non-queue SaaS.
|
|
83
|
-
5. **Drive the build green** — every platform must pass before the agent exits. By default this is a fast gate: Rails routes load (`bin/rails routes`) and the iOS/Android projects resolve (`xcodebuild -list`, `./gradlew --version`). With `NATIVEAPPTEMPLATE_VISUAL=1`+ it escalates to full builds — Rails boots (`bin/rails db:prepare` + `bin/rails runner`), iOS builds (`xcodebuild build`), Android builds (`./gradlew assembleDebug`).
|
|
83
|
+
3. **Rename the skeleton** — `Shop → Clinic`, `Shopkeeper → Vet`, etc. — consistently across Ruby migrations, Swift models, Kotlin data classes, policies, tests, and localized copy. Links to the template's own repos (`github.com/nativeapptemplate/...`) and the name `nativeapptemplate-agent` are left as they are, so the generated docs keep working links; the template's domain (`nativeapptemplate.com`) becomes your app's (`<project name>.com`, or the one you pass with `--domain`).
|
|
84
|
+
4. **Adapt or replace the domain module** — keep `ItemTag` for walk-in queue variants; strip and insert a new resource for non-queue SaaS. Then run each app's autocorrecting formatter (`bin/rubocop -a`, `./gradlew spotlessApply`, `swiftformat <Product>`), since the rename shifts alignment and import order; whatever they can't fix is listed in the validation report.
|
|
85
|
+
5. **Drive the build green** — every platform must pass before the agent exits. By default this is a fast gate: Rails routes load (`bin/rails routes`) and the iOS/Android projects resolve (`xcodebuild -list`, `./gradlew --version`). With `NATIVEAPPTEMPLATE_VISUAL=1`+ it escalates to full builds — Rails boots (`bin/rails db:prepare` + `bin/rails runner`), iOS builds (`xcodebuild build`), Android builds (`./gradlew assembleDebug`). The generated apps' **test suites don't run by default**; `NATIVEAPPTEMPLATE_TESTS=1` adds `bin/rails test`, `xcodebuild test` and `./gradlew testDebugUnitTest`.
|
|
84
86
|
6. **Validate the output** across three layers (structural, runtime, semantic) and write a self-contained HTML + JSON [validation report](#validation-report). Details in [`docs/SPEC.md`](./docs/SPEC.md) section 6.
|
|
85
87
|
|
|
86
88
|
## Demo
|
|
@@ -123,11 +125,11 @@ Both screenshots are real captures from the booted iOS Simulator and Android emu
|
|
|
123
125
|
|
|
124
126
|
End-to-end wall-clock per run, measured from `report.json`'s `meta.durationMs` on a 2021 M1 Max with both simulators pre-booted:
|
|
125
127
|
|
|
126
|
-
| `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost (Opus 5.5, 2026-10-15) |
|
|
128
|
+
| `--visual` / `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost (Opus 5.5, 2026-10-15) |
|
|
127
129
|
|---|---|---|---|
|
|
128
130
|
| `0` (default) | Layer 1 (ripgrep) + Layer 2 *fast* (Rails boot probe, iOS/Android type-check) + reviewer | ~2–3 min | ~$0.02 (planner only, measured) |
|
|
129
131
|
| `1` | + full `xcodebuild build` + `./gradlew assembleDebug` + home-screen capture + Stage 1 vision judge | ~2.5 min (barbershop-queue · 2026-05-24) | ~$0.13 (derived) |
|
|
130
|
-
| `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23) | ~$0.
|
|
132
|
+
| `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23; orange-baton 7m 12s · 2026-10-17) | ~$0.22 (orange-baton, measured 2026-10-17) |
|
|
131
133
|
|
|
132
134
|
Cold builds, first-run cocoapods/gradle dependency resolution, or unbooted simulators add a one-time minute or two. The self-repair loop (opt-in, hard-capped at 5 iterations) can extend a failing run substantially — budget for it if you set `NATIVEAPPTEMPLATE_REPAIR=on`.
|
|
133
135
|
|
|
@@ -136,9 +138,10 @@ Cold builds, first-run cocoapods/gradle dependency resolution, or unbooted simul
|
|
|
136
138
|
- **Measured, per call:** the planner ("a walk-in queue for a barbershop") used 2,722 in / 446 out = **$0.020**. The vision judge caches the screenshot: its first call writes the cache (~150 in / ~110 out / ~4,400 cache-write tokens = **~$0.025**), then the remaining samples run in parallel and read it (~160 in / ~90–260 out / ~4,400 cache-read tokens = **~$0.006** each).
|
|
137
139
|
- **Measured, per platform:** a judge pass is 2 criteria × 3 samples = 6 calls: **$0.054** for Stage 1 (iOS home screen). Stage 2 sends the same shape of request on a list screen; before the cache warm-up it measured the same as Stage 1 ($0.15 each), so it is taken as ~$0.054 too.
|
|
138
140
|
- **Derived, per run:** VISUAL=1 = planner + Stage 1 on iOS and Android ≈ $0.13; VISUAL=2 adds Stage 2 on both ≈ $0.24. A judge retry after a transient render failure adds ~$0.05 per retried platform.
|
|
141
|
+
- **Measured, per run (2026-10-17):** a passing paid-edition VISUAL=2 run of the Orange Baton spec (see [Validation report](#validation-report)) cost **$0.223** — planner 2,761 in / 874 out = $0.029, plus 24 judge calls (Stage 1 + Stage 2 on iOS and Android) = 3,456 in / 2,976 out / 17,320 cache-write / 86,600 cache-read = $0.195. That's in line with the derived ~$0.24.
|
|
139
142
|
- **Self-repair** (`NATIVEAPPTEMPLATE_REPAIR`): a toy fix converged in 3 turns for ~$0.10 (measured). A real Compose/Hilt build fix can take many more turns (up to 40); estimate ~$0.10–$1 per attempt, at most 5 attempts per run. Re-validation after a repair does not re-run the judge.
|
|
140
143
|
|
|
141
|
-
**Check your own spend:** clear `tmp/trace
|
|
144
|
+
**Check your own spend:** clear `tmp/trace/` in the directory you run the agent from, run the agent, then from that same directory `npm --prefix <path-to-this-repo> run cost` (or `bash <path-to-this-repo>/scripts/cost.sh [trace_dir]`) prints per-agent tokens (including cache writes/reads) and estimated USD; repair uses the Agent SDK's own `total_cost_usd`. For billed amounts, see usage per API key in the Claude Console, and set a workspace spend cap (see [Security](#security)) as a backstop — the agent exits non-zero on validation failure, but doesn't gate on spend itself.
|
|
142
145
|
|
|
143
146
|
## Architecture
|
|
144
147
|
|
|
@@ -189,6 +192,10 @@ The paid iOS and Android templates and the Rails API include optional [Sentry](h
|
|
|
189
192
|
|
|
190
193
|
To turn it on, follow the template's README section "Error monitoring (Sentry)" with your own Sentry project.
|
|
191
194
|
|
|
195
|
+
### Push notifications (Firebase) in the paid Android template
|
|
196
|
+
|
|
197
|
+
The paid Android template sends push notifications through Firebase Cloud Messaging, configured by `app/google-services.json`. The template commits that file with **placeholder** values (the `com.google.gms.google-services` Gradle plugin fails the build without it) and its developer keeps their own Firebase project's file in the working tree under `git update-index --skip-worktree`. The agent never carries that file over: the generated app gets the file as the template commits it, so it builds, but FCM can't issue it a token and no device is registered with the API until you replace `android/app/google-services.json` with the one from your own Firebase project (register the generated app's package name there). A substrate that isn't a git checkout gets no `google-services.json` at all, and the Android build fails with "File google-services.json is missing" until you add yours. The free Android template has no Firebase.
|
|
198
|
+
|
|
192
199
|
## Usage
|
|
193
200
|
|
|
194
201
|
```bash
|
|
@@ -205,6 +212,11 @@ npx nativeapptemplate-agent "a personal task tracker with due dates"
|
|
|
205
212
|
npx nativeapptemplate-agent "a two-device home monitor for household pest detection" --project-name="Sentova"
|
|
206
213
|
# → out/sentova/ · Sentova.xcodeproj · "Sentova API"; adapts ItemTag (e.g. Shop→Household, ItemTag→Sighting)
|
|
207
214
|
|
|
215
|
+
# Choose the app's domain ("…domain is sentova.app." in the plugin/MCP path, mapped
|
|
216
|
+
# to the domain argument). Without it: sentova.com, com.sentova.Sentova.ios, com.sentova.sentova.
|
|
217
|
+
npx nativeapptemplate-agent "a two-device home monitor for household pest detection" --project-name="Sentova" --domain=sentova.app
|
|
218
|
+
# → api.sentova.app · support@sentova.app · iOS app.sentova.Sentova.ios · Android app.sentova.sentova
|
|
219
|
+
|
|
208
220
|
# Generated output appears under ./out/<slug>/
|
|
209
221
|
tree ./out/clinic-queue/
|
|
210
222
|
# ├── rails/ ← Rails 8.1 API, git-initialized, buildable
|
|
@@ -244,16 +256,18 @@ The same generator also ships as an MCP server — `npx -y -p nativeapptemplate-
|
|
|
244
256
|
|
|
245
257
|
### Optional flags
|
|
246
258
|
|
|
247
|
-
- `NATIVEAPPTEMPLATE_VISUAL=1` — opts the run into Stage 1 visual judging (Layer 3). When set, Layer 2 runs in **build mode** instead of fast mode (full `xcodebuild build` + `./gradlew assembleDebug`), then for each platform the agent installs the app on the booted sim/emulator, captures the home screen, and judges it with Opus 5.5 vision against `DEFAULT_STAGE1_RUBRIC`. Adds 60-180s per platform depending on cold-build time. Requires a sim/emulator booted for each platform you want judged. Off by default — `npm run dev` keeps the existing fast path.
|
|
248
|
-
- `NATIVEAPPTEMPLATE_VISUAL=2` — implies `=1` and additionally runs **Stage 2**: the agent boots the generated Rails app under `mise exec -- bin/dev` (after `bundle install` + `bin/rails db:prepare` + `bin/rails db:seed_fu`), waits for it to listen, then drives the iOS sim and Android emulator through the parameterized queue scenario (Sign Up → email-confirm via `bin/rails runner` → Sign In → drill into auto-seeded sample). Layer 3 then judges the last captured screenshot against `DEFAULT_STAGE2_RUBRIC` (domain content + no substrate-token leak). Adds 2–4 minutes per platform on top of `=1`. Requires both sims/emulators booted and the substrate's `mise` toolchain installed for `bin/dev`.
|
|
259
|
+
- `NATIVEAPPTEMPLATE_VISUAL=1` (or `--visual=1` for one run) — opts the run into Stage 1 visual judging (Layer 3). When set, Layer 2 runs in **build mode** instead of fast mode (full `xcodebuild build` + `./gradlew assembleDebug`), then for each platform the agent installs the app on the booted sim/emulator, captures the home screen, and judges it with Opus 5.5 vision against `DEFAULT_STAGE1_RUBRIC`. Adds 60-180s per platform depending on cold-build time. Requires a sim/emulator booted for each platform you want judged. Off by default — `npm run dev` keeps the existing fast path.
|
|
260
|
+
- `NATIVEAPPTEMPLATE_VISUAL=2` (or `--visual=2`) — implies `=1` and additionally runs **Stage 2**: the agent boots the generated Rails app under `mise exec -- bin/dev` (after `bundle install` + `bin/rails db:prepare` + `bin/rails db:seed_fu`), waits for it to listen, then drives the iOS sim and Android emulator through the parameterized queue scenario (Sign Up → email-confirm via `bin/rails runner` → Sign In → drill into auto-seeded sample). Layer 3 then judges the last captured screenshot against `DEFAULT_STAGE2_RUBRIC` (domain content + no substrate-token leak). Adds 2–4 minutes per platform on top of `=1`. Requires both sims/emulators booted and the substrate's `mise` toolchain installed for `bin/dev`.
|
|
261
|
+
- `NATIVEAPPTEMPLATE_TESTS=1` (or `--tests` for one run; `--no-tests` turns them off when the variable is set) — also run the generated apps' own test suites (off by default; they take minutes per platform). Implies build mode for Layer 2. After Layer 2, the visual phase and any self-repair, the agent runs `bin/rails db:test:prepare` + `bin/rails test` (under `mise exec` when mise is installed), `xcodebuild test` (same scheme, `NATIVEAPPTEMPLATE_IOS_DESTINATION` and Debug configuration as the build; needs that simulator) and `./gradlew testDebugUnitTest` (JVM unit tests, no emulator), all three in parallel. A failing suite fails the run; each result (command, exit code, the runner's own summary line, output tail on failure) is in the report's "Test suites" section, `platforms[].tests` in `report.json`, and the trace. Failures aren't sent to the self-repair loop.
|
|
249
262
|
- `NATIVEAPPTEMPLATE_REPAIR` — opts into the bounded self-repair loop. Set `on` (or a positive integer N, hard-capped at 5) to enable. When the first validation pass fails on a **code-repairable** layer — Layer 1 leftover substrate tokens or Layer 2 build/compile errors — the agent runs a Claude Agent SDK repair pass scoped to the failing generated project (Read/Edit/Bash inside `out/<slug>/<platform>/` only), re-validates that platform, and repeats up to the cap. Each attempt is recorded in the validation report's self-repair table. Layer 3 (vision) and contract-reviewer misses are surfaced but not auto-repaired (a Layer 3 miss is usually environmental, not a source bug). Off by default; when the loop can't close the failures the agent still exits non-zero.
|
|
250
|
-
- `NATIVEAPPTEMPLATE_BRIDGE=off` — skip writing to `~/.gradle/gradle.properties`. The agent normally mirrors `NATIVEAPPTEMPLATE_API_*` (HOST/PORT/SCHEME) into renamed-product variants (`<PRODUCT>_API_*`) at run time so the generated Android app picks them up via `gradle.properties` and the iOS sim launch picks them up via `SIMCTL_CHILD_*`. Set this to disable the file write (process.env injection still runs for child-spawn paths).
|
|
263
|
+
- `NATIVEAPPTEMPLATE_BRIDGE=off` — skip writing to `~/.gradle/gradle.properties`. The agent normally mirrors `NATIVEAPPTEMPLATE_API_*` (HOST/PORT/SCHEME) into renamed-product variants (`<PRODUCT>_API_*`) at run time so the generated Android app picks them up via `gradle.properties` and the iOS sim launch picks them up via `SIMCTL_CHILD_*`. The lines live in one managed block (`# BEGIN nativeapptemplate-agent` … `# END nativeapptemplate-agent`) that keeps one set per product: a run replaces only its own product's lines, so apps generated earlier keep theirs. Set this to disable the file write (process.env injection still runs for child-spawn paths).
|
|
251
264
|
- `NATIVEAPPTEMPLATE_BRIDGE_DRY_RUN=1` — log what would be written to `~/.gradle/gradle.properties` instead of writing. Useful before granting the bridge write access to your user-global gradle.
|
|
252
265
|
- `NATIVEAPPTEMPLATE_AGENT_ANTHROPIC_KEY` — dedicated workspace key, see [Security](#security).
|
|
253
266
|
- `NATIVEAPPTEMPLATE_ADB_SERIAL` — the `adb -s` target when more than one Android device/emulator is attached. Without it the agent prefers an `emulator-*` serial, then the first device. Run `adb devices` to list serials.
|
|
254
267
|
- `NATIVEAPPTEMPLATE_MOBILE_IOS_DEVICE` / `NATIVEAPPTEMPLATE_MOBILE_ANDROID_DEVICE` — pin the device `mobile-mcp` drives in Stage 2 (device id or exact name) when several are booted.
|
|
255
268
|
- `NATIVEAPPTEMPLATE_IOS_DESTINATION` — the `xcodebuild -destination` for build mode (default `platform=iOS Simulator,name=iPhone 17 Pro,OS=26.2`). Set it if you don't have that simulator, e.g. `platform=iOS Simulator,name=iPhone 16`.
|
|
256
269
|
- `NATIVEAPPTEMPLATE_API_SCHEME` — `http` or `https` for the generated apps' API URL (read by the env bridge alongside the substrate Rails `.env` HOST/PORT).
|
|
270
|
+
- `NATIVEAPPTEMPLATE_FORMAT=off` — skip the formatters the agent runs on each generated app after the rename: `bin/rubocop -a` (Rails, under `mise exec` when mise is installed, after `bundle install` if needed), `./gradlew spotlessApply` (Android) and `swiftformat <Product>` (iOS app sources, as the template's `make format` does; skipped when `swiftformat` isn't on PATH). The rename changes identifier lengths and import order, which the templates' lint configs flag although the builds pass. Anything a formatter can't autocorrect shows in the validation report's "Formatters" section and in `tmp/trace/<platform>.log`; it doesn't change the verdict. On by default; Spotless adds a Gradle run (seconds warm, a minute or two cold).
|
|
257
271
|
|
|
258
272
|
The agent resolves `adb` to a known-good binary in this priority order: `$ANDROID_HOME/platform-tools/adb`, `$ANDROID_SDK_ROOT/platform-tools/adb`, `~/Library/Android/sdk/platform-tools/adb` (Android Studio default), `/Applications/android-sdk-macosx/platform-tools/adb`, `/opt/homebrew/bin/adb`, `/usr/local/bin/adb`, then PATH. This avoids surprises like a stale `~/.apportable/SDK/bin/adb` (i386, won't exec on Apple Silicon) shadowing a working `adb` on PATH.
|
|
259
273
|
|
|
@@ -262,7 +276,7 @@ The agent resolves `adb` to a known-good binary in this priority order: `$ANDROI
|
|
|
262
276
|
The agent doesn't just generate code and exit — it validates the output.
|
|
263
277
|
|
|
264
278
|
1. **Structural.** `ripgrep` for leftover domain tokens; OpenAPI contract parity check between Rails, iOS networking, and Android repository layers. A silent rename inconsistency fails the run before any tests execute.
|
|
265
|
-
2. **Runtime.** Verify the generated Rails app boots (`bin/rails runner 'puts OK'`); type-check or build the iOS and Android apps. With `NATIVEAPPTEMPLATE_VISUAL=1`, escalate to a full build (`xcodebuild build` + `./gradlew assembleDebug`) and install on the booted sim/emulator. With `=2`, additionally boot the live Rails server and drive a scripted CRUD walk-through via [`mobile-next/mobile-mcp`](https://github.com/mobile-next/mobile-mcp). A walk step that doesn't reach its expected screen fails the run.
|
|
279
|
+
2. **Runtime.** Verify the generated Rails app boots (`bin/rails runner 'puts OK'`); type-check or build the iOS and Android apps. With `NATIVEAPPTEMPLATE_VISUAL=1`, escalate to a full build (`xcodebuild build` + `./gradlew assembleDebug`) and install on the booted sim/emulator. With `=2`, additionally boot the live Rails server and drive a scripted CRUD walk-through via [`mobile-next/mobile-mcp`](https://github.com/mobile-next/mobile-mcp). A walk step that doesn't reach its expected screen fails the run. The app is launched in English whatever the device language (iOS: `-AppleLanguages (en) -AppleLocale en_US`; Android: per-app locale `en-US`, which needs Android 13 / API 33+ — on an older device set its language to English), since the walk follows English UI text; a walk that still finds a non-English UI is reported as an `environment:` problem.
|
|
266
280
|
3. **Semantic.** Opus 5.5 as judge — scores whether the generated code and rendered UI actually express the intended domain. Vision judges read simulator/emulator screenshots directly.
|
|
267
281
|
|
|
268
282
|
See [`docs/SPEC.md`](./docs/SPEC.md) for the full design.
|
|
@@ -271,9 +285,9 @@ See [`docs/SPEC.md`](./docs/SPEC.md) for the full design.
|
|
|
271
285
|
|
|
272
286
|
Every run writes a report of the validation results to the output directory:
|
|
273
287
|
|
|
274
|
-
[](./docs/images/validation-report.png)
|
|
275
289
|
|
|
276
|
-
*Example report from a
|
|
290
|
+
*Example report from a paid-edition `NATIVEAPPTEMPLATE_VISUAL=2` run of `"a job hand-off tracker for small field-service companies: each project always has exactly one open baton held by one teammate; finishing it means choosing the next stage and the next holder"` with `--project-name="Orange Baton" --rename Shop=Project --rename ItemTag=Baton --rename Shopkeeper=Teammate` — all three layers green, Stage 2 walked 46/46 steps on iOS and 48/48 on Android, 7m 12s, $0.22. Click to view full size; the real artifact is a live, self-contained HTML file you open in a browser.*
|
|
277
291
|
|
|
278
292
|
- **`out/<slug>/validation-report.html`** — a self-contained HTML report (screenshots base64-embedded, no external assets, no JavaScript) you can open in a browser, attach to a PR, or drop into a demo. It shows the overall verdict — **PASS**, **FAIL**, or **PARTIAL** (nothing failed, but Layer 3 didn't judge the UI, as in a default `NATIVEAPPTEMPLATE_VISUAL=0` run) — a platform×layer matrix, Layer 1 leftover-token findings, Layer 2 build commands + `stderr`, Layer 3 home-screen screenshots with the vision judge's per-criterion rationales (plus the Stage 2 filmstrip when `NATIVEAPPTEMPLATE_VISUAL=2`), the reviewer's contract diff, and the domain rename plan.
|
|
279
293
|
- **`out/<slug>/report.json`** — the same data, machine-readable, for CI gating or programmatic use. The full schema lives in [`docs/validation-report.md`](./docs/validation-report.md).
|
|
@@ -290,8 +304,16 @@ Naming flags:
|
|
|
290
304
|
|---|---|---|
|
|
291
305
|
| `--project-name="Vet Clinic"` | planner's pick | Name the project. Accepts a human name (`"Vet Clinic"`), PascalCase (`VetClinic`), or kebab (`vet-clinic`); from it the agent derives the Pascal project name (`NativeAppTemplate → VetClinic` across all three platforms), the slug/output dir (`out/vet-clinic/`), the DB prefix + env-bridge token, and the display name. Invalid (no derivable slug) is reported and skipped. |
|
|
292
306
|
| `--rename From=To` | planner's pick | Override one of the planner's domain rename targets (repeatable). `From` is a substrate token (`Shop`, `Shopkeeper`, `ItemTag`); the planner fills in everything else. An override that matches no planned rename is reported and skipped, and so is one whose target is a [reserved name](#reserved-rename-targets) (the current target is kept: the planner's pick, or an earlier `--rename` for the same token). Example: `--rename Shopkeeper=Vet --rename Shop=Clinic` |
|
|
307
|
+
| `--domain=orangebaton.app` | `<project name, flat lowercase>.com` | The app's web domain. Replaces the template's `nativeapptemplate.com` everywhere it appears — bare, with subdomains (`api.nativeapptemplate.com` → `api.orangebaton.app`), in URLs and in email addresses — and its reverse replaces the template's `com.nativeapptemplate` prefix: iOS bundle ID `app.orangebaton.OrangeBaton.ios` (plus the test target, keychain services and log subsystem), Android `app.orangebaton.orangebaton` (`applicationId`, `namespace`, `package` / `import` declarations, proto `java_package`, `google-services.json`'s `package_name`, and the source directories, moved from `com/nativeapptemplate/nativeapptemplate` to `app/orangebaton/orangebaton` in every module and source set). Lowercased; needs at least two labels, each a DNS label (letters, digits, hyphens), and each starting with a letter (Android package segments must). A label that isn't a valid Java/Kotlin package segment is written differently in the Android package only — a hyphen becomes `_` (`orange-baton.app` → `app.orange_baton.orangebaton`, iOS keeps `app.orange-baton…`), a keyword gets a trailing `_` (`native` → `native_`) — and the run says so. An invalid domain stops the run before anything is generated. The report shows the domain and the generated IDs (`meta.appDomain` in `report.json`). Links to the template's repos stay as they are. |
|
|
293
308
|
| `--rename-ja From=名前` | planner's pick | Override the Japanese name of a planned rename (repeatable). `From` is `Shop` or `ItemTag`; the Rails API's Japanese messages (`config/locales/ja.yml`) and their tests use it in place of the substrate's 店舗 / アイテムタグ. The planner picks one itself (`toJa` in the rename plan); without one the Japanese is left as is. Example: `--rename-ja Shop=動物病院` |
|
|
294
309
|
|
|
310
|
+
Validation flags — choose per run; a flag wins over its environment variable, and without one the variable decides:
|
|
311
|
+
|
|
312
|
+
| Flag | Default | Effect |
|
|
313
|
+
|---|---|---|
|
|
314
|
+
| `--visual=0\|1\|2` (or `--visual 2`) | `NATIVEAPPTEMPLATE_VISUAL`, else `0` | How much of the UI is validated (see [Runtime](#runtime) for time and cost). `0`: no UI judging, so the verdict is PARTIAL at best. `1`: full builds, then the home screen on the booted iOS simulator and Android emulator is judged by the vision model. `2`: `1` plus the Rails API booted under `mise exec -- bin/dev` and a scripted sign-up / sign-in walk through both apps. Before generating anything (no API call yet), levels 1 and 2 check that an iOS simulator is booted and an Android emulator or device is attached (the ones `NATIVEAPPTEMPLATE_MOBILE_IOS_DEVICE` / `NATIVEAPPTEMPLATE_ADB_SERIAL` name, when set) and, for `2`, that `mise` is on PATH; if not, the run stops with what's missing (exit 2). Any other value exits 2. |
|
|
315
|
+
| `--tests` / `--no-tests` | `NATIVEAPPTEMPLATE_TESTS`, else off | Run the generated apps' own test suites (`bin/rails test`, `xcodebuild test`, `./gradlew testDebugUnitTest`) after validation. Implies full builds; adds minutes per platform. |
|
|
316
|
+
|
|
295
317
|
#### Reserved rename targets
|
|
296
318
|
|
|
297
319
|
A rename target must not be a name the substrate or the languages already use, or the renamed types collide with existing ones and the build breaks. The planner is told to avoid these, `--rename` / the MCP `renameOverrides` reject them (case-insensitively), and a run warns if a planned target is one of them. The list lives in [`src/reserved-words.ts`](./src/reserved-words.ts):
|
|
@@ -331,6 +353,7 @@ The agent strips `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, and `NATIVEAPPTEMP
|
|
|
331
353
|
## Project docs
|
|
332
354
|
|
|
333
355
|
- [`docs/SPEC.md`](./docs/SPEC.md) — full technical specification
|
|
356
|
+
- [`docs/OUTPUT-CHECKLIST.md`](./docs/OUTPUT-CHECKLIST.md) — what to check on a generated app beyond the validation report (tests, linters, leftover substrate config, multi-user and forced-update flows)
|
|
334
357
|
- [`ROADMAP.md`](./ROADMAP.md) — where this project is headed, OSS vs hosted, what stays out of scope
|
|
335
358
|
- [`AGENTS.md`](./AGENTS.md) — AI coding agent instructions (read if you're running Claude Code, Codex, etc. against this repo; `CLAUDE.md` imports it)
|
|
336
359
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/agents/judge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAa,KAAK,UAAU,EAAqB,MAAM,yBAAyB,CAAC;AAMxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAGX,cAAc,EAGd,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAWF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;KACrC,CAAC;CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/agents/judge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAa,KAAK,UAAU,EAAqB,MAAM,yBAAyB,CAAC;AAMxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAGX,cAAc,EAGd,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAWF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;KACrC,CAAC;CACH,CAAC;AASF,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAoEtE"}
|
package/dist/agents/judge.js
CHANGED
|
@@ -25,7 +25,8 @@ export async function runJudge(input) {
|
|
|
25
25
|
for (const r of reports) {
|
|
26
26
|
const l1 = r.layer1.pass ? "PASS" : `FAIL (${r.layer1.findings.length} leftover tokens)`;
|
|
27
27
|
const l2 = r.layer2.pass ? `PASS (${(r.layer2.durationMs / 1000).toFixed(1)}s)` : "FAIL";
|
|
28
|
-
|
|
28
|
+
const fmt = r.worker.format ? ` · formatter ${r.worker.format.status === "fail" ? "ISSUES LEFT" : r.worker.format.status}` : "";
|
|
29
|
+
trace("judge", `${r.platform}: Layer 1 ${l1} · Layer 2 ${l2} [${r.layer2.command}]${fmt}`);
|
|
29
30
|
}
|
|
30
31
|
let visualReport;
|
|
31
32
|
let layer3Summary = "Layer 3 skipped";
|
|
@@ -64,6 +65,7 @@ export async function runJudge(input) {
|
|
|
64
65
|
...(r.layer2.stderrTail !== undefined ? { stderrTail: r.layer2.stderrTail } : {}),
|
|
65
66
|
},
|
|
66
67
|
...(layer3 !== undefined ? { layer3 } : {}),
|
|
68
|
+
...(r.worker.format !== undefined ? { format: r.worker.format } : {}),
|
|
67
69
|
};
|
|
68
70
|
});
|
|
69
71
|
return {
|
|
@@ -125,6 +127,10 @@ async function runVisualPhase(config, domain) {
|
|
|
125
127
|
...(iosRecover ? { iosRecover } : {}),
|
|
126
128
|
});
|
|
127
129
|
const report = {};
|
|
130
|
+
for (const [platform, r] of [["ios", stage1.ios], ["android", stage1.android]]) {
|
|
131
|
+
for (const w of r?.launch.warnings ?? [])
|
|
132
|
+
trace("judge", `Layer 3 ${platform}: warning: ${w}`);
|
|
133
|
+
}
|
|
128
134
|
if (stage1.ios) {
|
|
129
135
|
report.ios = toPlatformReport(stage1.ios);
|
|
130
136
|
trace("judge", `Layer 3 ios: ${stage1.ios.ok ? "PASS" : "FAIL"}` + (stage1.ios.error ? ` — ${stage1.ios.error}` : ""));
|
|
@@ -253,6 +259,6 @@ async function evaluate(worker, layer2Mode) {
|
|
|
253
259
|
runLayer1({ projectDir: outDir, forbiddenTokens: worker.renamedFrom }),
|
|
254
260
|
runLayer2({ platform: worker.platform, outDir, mode: layer2Mode }),
|
|
255
261
|
]);
|
|
256
|
-
return { platform: worker.platform, layer1, layer2 };
|
|
262
|
+
return { platform: worker.platform, worker, layer1, layer2 };
|
|
257
263
|
}
|
|
258
264
|
//# sourceMappingURL=judge.js.map
|
package/dist/agents/judge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/agents/judge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/agents/judge.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type DomainSpec = {
|
|
|
5
5
|
entities: readonly Entity[];
|
|
6
6
|
renamePlan: readonly RenamePair[];
|
|
7
7
|
jsonApiContract: unknown;
|
|
8
|
+
appDomain?: string;
|
|
8
9
|
};
|
|
9
10
|
export type Entity = {
|
|
10
11
|
name: string;
|
|
@@ -29,6 +30,17 @@ export type WorkerResult = {
|
|
|
29
30
|
outDir: string;
|
|
30
31
|
filesTouched: number;
|
|
31
32
|
renamedFrom: readonly string[];
|
|
33
|
+
format?: StepResult;
|
|
34
|
+
appId?: string;
|
|
35
|
+
};
|
|
36
|
+
export type StepResult = {
|
|
37
|
+
status: "pass" | "fail" | "skipped";
|
|
38
|
+
command: string;
|
|
39
|
+
exitCode: number | null;
|
|
40
|
+
durationMs: number;
|
|
41
|
+
outputTail?: string;
|
|
42
|
+
note?: string;
|
|
43
|
+
summary?: string;
|
|
32
44
|
};
|
|
33
45
|
export type ReviewerResult = {
|
|
34
46
|
contractParity: "pass" | "fail";
|
|
@@ -55,6 +67,8 @@ export type PlatformDetail = {
|
|
|
55
67
|
stderrTail?: string;
|
|
56
68
|
};
|
|
57
69
|
layer3?: VisualJudgePlatformReport;
|
|
70
|
+
format?: StepResult;
|
|
71
|
+
tests?: StepResult;
|
|
58
72
|
};
|
|
59
73
|
export type VisualJudgeReport = {
|
|
60
74
|
ios?: VisualJudgePlatformReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,SAAS,UAAU,EAAE,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/android.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/android.ts"],"names":[],"mappings":"AASA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGvF,OAAO,KAAK,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAexE,eAAO,MAAM,kBAAkB,EAAE,aAehC,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA8ChF"}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
import { mkdir, rm, stat } from "node:fs/promises";
|
|
1
|
+
import { mkdir, readFile, rm, stat } from "node:fs/promises";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
import { scrubbedEnv } from "../../env.js";
|
|
4
|
-
import { resolve } from "node:path";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
5
|
import { trace } from "../../trace.js";
|
|
6
6
|
import { isStub } from "../../stub.js";
|
|
7
7
|
import { runRuby } from "../../ruby.js";
|
|
8
|
+
import { applicationIdFromGradle, renameAppDomainInput } from "../../app-domain.js";
|
|
8
9
|
import { japaneseRenamePairs, renamedTokens } from "../../japanese-nouns.js";
|
|
9
10
|
import { copySubstrate, SENTRY_CREDENTIAL_FILES } from "./copy.js";
|
|
11
|
+
import { runFormatter, traceFormat } from "../../validation/autoformat.js";
|
|
10
12
|
import { slugToPascal } from "../../slug.js";
|
|
13
|
+
// app/google-services.json: the paid template commits placeholder values (the
|
|
14
|
+
// google-services Gradle plugin fails the build without the file) and the
|
|
15
|
+
// developer keeps their own Firebase project's file in the working tree under
|
|
16
|
+
// skip-worktree. Copied from the working tree, the generated app would ship
|
|
17
|
+
// the template's Firebase config, which can't issue it FCM tokens; the
|
|
18
|
+
// placeholder builds the same and leaves Firebase to the app's own developer.
|
|
11
19
|
export const ANDROID_SKIP_RULES = {
|
|
12
20
|
anySegment: [
|
|
13
21
|
...SENTRY_CREDENTIAL_FILES,
|
|
@@ -22,6 +30,7 @@ export const ANDROID_SKIP_RULES = {
|
|
|
22
30
|
],
|
|
23
31
|
// Gradle's sdk.dir, written by Android Studio and gitignored.
|
|
24
32
|
keepIgnored: ["local.properties"],
|
|
33
|
+
committedOnly: ["app/google-services.json"],
|
|
25
34
|
};
|
|
26
35
|
export async function runAndroidWorker(domain) {
|
|
27
36
|
if (isStub("android")) {
|
|
@@ -39,8 +48,13 @@ export async function runAndroidWorker(domain) {
|
|
|
39
48
|
const renamePlan = [...productPairs, ...domain.renamePlan].filter((p) => p.from !== p.to);
|
|
40
49
|
const plan = renamePlan.map((p) => `${p.from}->${p.to}`).join(", ");
|
|
41
50
|
trace("android", `running scripts/ruby/rename.rb: ${plan}`);
|
|
42
|
-
const renameStats = await runRuby("rename.rb", { renamePlan, japaneseRenamePlan: japaneseRenamePairs(renamePlan), root: outDir });
|
|
51
|
+
const renameStats = await runRuby("rename.rb", { renamePlan, japaneseRenamePlan: japaneseRenamePairs(renamePlan), ...renameAppDomainInput(domain.slug, domain.appDomain), root: outDir });
|
|
43
52
|
trace("android", `scanned ${renameStats.files_scanned} files, changed ${renameStats.files_changed}, ${renameStats.substitutions} substitutions, ${renameStats.files_renamed} file/dir renames`);
|
|
53
|
+
const appId = await readApplicationId(outDir);
|
|
54
|
+
if (appId)
|
|
55
|
+
trace("android", `applicationId: ${appId}`);
|
|
56
|
+
const format = await runFormatter("android", outDir);
|
|
57
|
+
traceFormat("android", format);
|
|
44
58
|
await initGit(outDir);
|
|
45
59
|
trace("android", `done (out/${domain.slug}/android)`);
|
|
46
60
|
return {
|
|
@@ -48,8 +62,18 @@ export async function runAndroidWorker(domain) {
|
|
|
48
62
|
outDir: `./out/${domain.slug}/android`,
|
|
49
63
|
filesTouched: renameStats.files_changed + renameStats.files_renamed,
|
|
50
64
|
renamedFrom: renamedTokens(renamePlan),
|
|
65
|
+
format,
|
|
66
|
+
...(appId ? { appId } : {}),
|
|
51
67
|
};
|
|
52
68
|
}
|
|
69
|
+
async function readApplicationId(outDir) {
|
|
70
|
+
try {
|
|
71
|
+
return applicationIdFromGradle(await readFile(join(outDir, "app", "build.gradle.kts"), "utf8"));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
53
77
|
function buildProductRenamePairs(slug) {
|
|
54
78
|
const pascal = slugToPascal(slug);
|
|
55
79
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../../src/agents/workers/android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../../src/agents/workers/android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAwB,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAsB,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAU7C,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,uEAAuE;AACvE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,UAAU,EAAE;QACV,GAAG,uBAAuB;QAC1B,MAAM;QACN,SAAS;QACT,OAAO;QACP,SAAS;QACT,OAAO;QACP,SAAS;QACT,UAAU;QACV,cAAc;KACf;IACD,8DAA8D;IAC9D,WAAW,EAAE,CAAC,kBAAkB,CAAC;IACjC,aAAa,EAAE,CAAC,0BAA0B,CAAC;CAC5C,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB;IACvD,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAErE,KAAK,CAAC,SAAS,EAAE,0BAA0B,SAAS,OAAO,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAA0B,CAAC,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,CAAC,SAAS,EAAE,mCAAmC,IAAI,EAAE,CAAC,CAAC;IAE5D,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,WAAW,EACX,EAAE,UAAU,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,UAAU,CAAC,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAC1I,CAAC;IAEF,KAAK,CACH,SAAS,EACT,WAAW,WAAW,CAAC,aAAa,mBAAmB,WAAW,CAAC,aAAa,KAAK,WAAW,CAAC,aAAa,mBAAmB,WAAW,CAAC,aAAa,mBAAmB,CAC9K,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,KAAK;QAAE,KAAK,CAAC,SAAS,EAAE,kBAAkB,KAAK,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACrD,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,KAAK,CAAC,SAAS,EAAE,aAAa,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC;IAEtD,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS,MAAM,CAAC,IAAI,UAAU;QACtC,YAAY,EAAE,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,aAAa;QACnE,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC;QACtC,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,EAAE;QACrD,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,EAAE;KAC1C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AAGD,KAAK,UAAU,OAAO,CAAC,GAAW;IAChC,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,cAAc,EAAE,CAAC;;gBAC5B,aAAa,CAAC,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExF,KAAK,UAAU,oBAAoB,CAAC,MAAkB;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChC,KAAK,CAAC,SAAS,EAAE,yCAAyC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,CAAC,SAAS,EAAE,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAC;IAC7D,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,CAAC,SAAS,EAAE,aAAa,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC;IAEtD,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS,MAAM,CAAC,IAAI,UAAU;QACtC,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -3,6 +3,7 @@ export type CopySkipRules = {
|
|
|
3
3
|
anySegment?: readonly string[];
|
|
4
4
|
anySuffix?: readonly string[];
|
|
5
5
|
keepIgnored?: readonly string[];
|
|
6
|
+
committedOnly?: readonly string[];
|
|
6
7
|
};
|
|
7
8
|
export declare const SENTRY_CREDENTIAL_FILES: readonly string[];
|
|
8
9
|
export declare function copySubstrate(src: string, dest: string, rules: CopySkipRules): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/copy.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG;IAE1B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE/B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/copy.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG;IAE1B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE/B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAMhC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAMF,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAA0C,CAAC;AAQhG,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ClG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { cp, lstat } from "node:fs/promises";
|
|
1
|
+
import { cp, lstat, mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
|
-
import { relative, resolve, sep } from "node:path";
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { scrubbedEnv } from "../../env.js";
|
|
5
5
|
// Sentry's local credentials, gitignored in the templates: sentry-cli's auth
|
|
6
6
|
// token (.sentryclirc, sentry.properties). Never carried into a generated app,
|
|
@@ -18,6 +18,7 @@ export async function copySubstrate(src, dest, rules) {
|
|
|
18
18
|
const anySegment = new Set(rules.anySegment ?? []);
|
|
19
19
|
const anySuffix = rules.anySuffix ?? [];
|
|
20
20
|
const keepIgnored = rules.keepIgnored ?? [];
|
|
21
|
+
const committedOnly = rules.committedOnly ?? [];
|
|
21
22
|
const root = resolve(src);
|
|
22
23
|
const committable = await gitCommittablePaths(root);
|
|
23
24
|
await cp(root, dest, {
|
|
@@ -29,6 +30,8 @@ export async function copySubstrate(src, dest, rules) {
|
|
|
29
30
|
filter: async (source) => {
|
|
30
31
|
const segments = relative(root, source).split(sep).filter(Boolean);
|
|
31
32
|
const rel = segments.join("/");
|
|
33
|
+
if (committedOnly.includes(rel))
|
|
34
|
+
return false;
|
|
32
35
|
if (rootPaths.some((p) => rel === p || rel.startsWith(`${p}/`)))
|
|
33
36
|
return false;
|
|
34
37
|
if (segments.some((seg) => anySegment.has(seg)))
|
|
@@ -50,6 +53,18 @@ export async function copySubstrate(src, dest, rules) {
|
|
|
50
53
|
return true;
|
|
51
54
|
},
|
|
52
55
|
});
|
|
56
|
+
for (const rel of committedOnly) {
|
|
57
|
+
if (!committable?.has(rel))
|
|
58
|
+
continue;
|
|
59
|
+
// "./" makes git resolve the path from cwd, which may sit below the
|
|
60
|
+
// repository root.
|
|
61
|
+
const staged = await gitBytes(root, ["show", `:./${rel}`]);
|
|
62
|
+
if (staged === null)
|
|
63
|
+
continue;
|
|
64
|
+
const target = join(dest, ...rel.split("/"));
|
|
65
|
+
await mkdir(dirname(target), { recursive: true });
|
|
66
|
+
await writeFile(target, staged);
|
|
67
|
+
}
|
|
53
68
|
}
|
|
54
69
|
// Every committable file under root plus each directory on the way to one, as
|
|
55
70
|
// root-relative "/" paths; null when root isn't in a git work tree (or git is
|
|
@@ -66,13 +81,17 @@ async function gitCommittablePaths(root) {
|
|
|
66
81
|
}
|
|
67
82
|
return paths;
|
|
68
83
|
}
|
|
69
|
-
function gitOutput(cwd, args) {
|
|
84
|
+
async function gitOutput(cwd, args) {
|
|
85
|
+
const bytes = await gitBytes(cwd, args);
|
|
86
|
+
return bytes === null ? null : bytes.toString("utf8");
|
|
87
|
+
}
|
|
88
|
+
function gitBytes(cwd, args) {
|
|
70
89
|
return new Promise((done) => {
|
|
71
90
|
const child = spawn("git", [...args], { cwd, env: scrubbedEnv(), stdio: ["ignore", "pipe", "ignore"] });
|
|
72
91
|
const chunks = [];
|
|
73
92
|
child.stdout.on("data", (c) => chunks.push(c));
|
|
74
93
|
child.on("error", () => done(null));
|
|
75
|
-
child.on("close", (code) => done(code === 0 ? Buffer.concat(chunks)
|
|
94
|
+
child.on("close", (code) => done(code === 0 ? Buffer.concat(chunks) : null));
|
|
76
95
|
});
|
|
77
96
|
}
|
|
78
97
|
//# sourceMappingURL=copy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/agents/workers/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/agents/workers/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/ios.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../../src/agents/workers/ios.ts"],"names":[],"mappings":"AASA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGvF,OAAO,KAAK,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAoBxE,eAAO,MAAM,cAAc,EAAE,aAK5B,CAAC;AAEF,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA8C5E"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { mkdir, rm, stat } from "node:fs/promises";
|
|
1
|
+
import { mkdir, readdir, readFile, rm, stat } from "node:fs/promises";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
import { scrubbedEnv } from "../../env.js";
|
|
4
|
-
import { resolve } from "node:path";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
5
|
import { trace } from "../../trace.js";
|
|
6
6
|
import { isStub } from "../../stub.js";
|
|
7
7
|
import { runRuby } from "../../ruby.js";
|
|
8
|
+
import { bundleIdFromPbxproj, renameAppDomainInput } from "../../app-domain.js";
|
|
8
9
|
import { japaneseRenamePairs, renamedTokens } from "../../japanese-nouns.js";
|
|
9
10
|
import { copySubstrate, SENTRY_CREDENTIAL_FILES } from "./copy.js";
|
|
11
|
+
import { runFormatter, traceFormat } from "../../validation/autoformat.js";
|
|
10
12
|
import { slugToPascal } from "../../slug.js";
|
|
11
13
|
// RevenueCat.local.xcconfig is the developer's gitignored RevenueCat key for
|
|
12
14
|
// the template itself. Copied, it would switch billing on in the generated app
|
|
@@ -41,8 +43,13 @@ export async function runIosWorker(domain) {
|
|
|
41
43
|
const renamePlan = [...productPairs, ...domain.renamePlan].filter((p) => p.from !== p.to);
|
|
42
44
|
const plan = renamePlan.map((p) => `${p.from}->${p.to}`).join(", ");
|
|
43
45
|
trace("ios", `running scripts/ruby/rename.rb: ${plan}`);
|
|
44
|
-
const renameStats = await runRuby("rename.rb", { renamePlan, japaneseRenamePlan: japaneseRenamePairs(renamePlan), root: outDir });
|
|
46
|
+
const renameStats = await runRuby("rename.rb", { renamePlan, japaneseRenamePlan: japaneseRenamePairs(renamePlan), ...renameAppDomainInput(domain.slug, domain.appDomain), root: outDir });
|
|
45
47
|
trace("ios", `scanned ${renameStats.files_scanned} files, changed ${renameStats.files_changed}, ${renameStats.substitutions} substitutions, ${renameStats.files_renamed} file/dir renames`);
|
|
48
|
+
const appId = await readBundleId(outDir);
|
|
49
|
+
if (appId)
|
|
50
|
+
trace("ios", `bundle ID: ${appId}`);
|
|
51
|
+
const format = await runFormatter("ios", outDir);
|
|
52
|
+
traceFormat("ios", format);
|
|
46
53
|
await initGit(outDir);
|
|
47
54
|
trace("ios", `done (out/${domain.slug}/ios)`);
|
|
48
55
|
return {
|
|
@@ -50,8 +57,21 @@ export async function runIosWorker(domain) {
|
|
|
50
57
|
outDir: `./out/${domain.slug}/ios`,
|
|
51
58
|
filesTouched: renameStats.files_changed + renameStats.files_renamed,
|
|
52
59
|
renamedFrom: renamedTokens(renamePlan),
|
|
60
|
+
format,
|
|
61
|
+
...(appId ? { appId } : {}),
|
|
53
62
|
};
|
|
54
63
|
}
|
|
64
|
+
async function readBundleId(outDir) {
|
|
65
|
+
const project = (await readdir(outDir)).find((name) => name.endsWith(".xcodeproj"));
|
|
66
|
+
if (!project)
|
|
67
|
+
return undefined;
|
|
68
|
+
try {
|
|
69
|
+
return bundleIdFromPbxproj(await readFile(join(outDir, project, "project.pbxproj"), "utf8"));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
55
75
|
function buildProductRenamePairs(slug) {
|
|
56
76
|
const pascal = slugToPascal(slug);
|
|
57
77
|
return [
|