@otalan/cli 1.2.2 → 1.3.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/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to `@otalan/cli` will be documented in this file.
4
4
 
5
+ ## 1.3.1 - 2026-05-18
6
+
7
+ ### Added
8
+
9
+ - Check for an already published bundle ID during `otalan bundle` when auth and project config are available.
10
+
11
+ ## 1.3.0 - 2026-05-18
12
+
13
+ ### Added
14
+
15
+ - Validate Capacitor and Expo bundle contents before writing output, rejecting native project/source files in OTA bundle data.
16
+
17
+ ### Changed
18
+
19
+ - Use `runtimeVersion` as the only bundle manifest, CLI option, and release API field for both Capacitor and Expo.
20
+
5
21
  ## 1.2.2 - 2026-05-13
6
22
 
7
23
  ### Changed
@@ -25,7 +41,7 @@ All notable changes to `@otalan/cli` will be documented in this file.
25
41
  - Switch `otalan publish` to the direct-upload release contract: create JSON upload metadata, upload the ZIP to the returned opaque `uploadUrl`, complete the ingest, then poll validation.
26
42
  - Stream the local ZIP through Bun's disk-backed file body during direct uploads instead of loading the full archive into memory.
27
43
  - Send the full generated Otalan Expo satellite manifest as `expoManifest` during publish instead of only raw Expo config.
28
- - Use the Expo `runtimeVersion` as the release `nativeVersion` sent to the API, matching the current Expo update matching contract.
44
+ - Use the Expo `runtimeVersion` as the release version sent to the API, matching the current Expo update matching contract.
29
45
  - Use the release bundle `publishedAt` timestamp for bundle lists, status summaries, rollback prompts, and published bundle ID hints.
30
46
 
31
47
  ## 1.1.1 - 2026-05-07
@@ -45,7 +61,7 @@ All notable changes to `@otalan/cli` will be documented in this file.
45
61
 
46
62
  - Let `otalan login` reuse the saved API URL and keep the saved CI key from a masked prompt.
47
63
  - Export Expo bundles into a project-local `.otalan/expo-export-*` folder so Expo accepts the output path.
48
- - Fall back to the resolved native version when Expo runtimeVersion is not configured or present in export metadata.
64
+ - Fall back to the resolved app version when Expo runtimeVersion is not configured or present in export metadata.
49
65
  - Clarify Capacitor and Expo bundling behavior in CLI help and README.
50
66
 
51
67
  ## 1.0.9 - 2026-05-06
@@ -88,7 +104,7 @@ All notable changes to `@otalan/cli` will be documented in this file.
88
104
 
89
105
  ### Added
90
106
 
91
- - Prompt interactively for bundle native version and bundle ID, with hints for the detected native version, local bundle ID, and active published bundle ID when available.
107
+ - Prompt interactively for bundle runtime version and bundle ID, with hints for the detected runtime version, local bundle ID, and active published bundle ID when available.
92
108
 
93
109
  ### Changed
94
110
 
@@ -124,5 +140,5 @@ Initial public release of the Otalan CLI.
124
140
  - Release publishing with rollout metadata and server-side validation polling.
125
141
  - Bundle listing, active bundle status, and rollback commands.
126
142
  - CI key login, project initialization, and API connectivity doctor checks.
127
- - Native version and Expo runtime version resolution helpers.
143
+ - Runtime version resolution helpers.
128
144
  - Public npm package metadata, license notices, and Bun-based CLI entrypoint.
package/README.md CHANGED
@@ -222,7 +222,7 @@ Example project config:
222
222
  }
223
223
  ```
224
224
 
225
- `otalan.config.json` only links the repo to an Otalan project/app. Bundle and release targeting data such as `target`, `platform`, `nativeVersion`, `runtimeVersion`, and `bundleId` live in `.otalan/bundle/manifest.json`.
225
+ `otalan.config.json` only links the repo to an Otalan project/app. Bundle and release targeting data such as `target`, `platform`, `runtimeVersion`, and `bundleId` live in `.otalan/bundle/manifest.json`.
226
226
 
227
227
  ## Command Reference
228
228
 
@@ -338,17 +338,17 @@ Current behavior:
338
338
  - Expo stores the generated Otalan satellite manifest in `.otalan/bundle/manifest.json`, including `launchAsset`, `assets`, `runtimeVersion`, `bundleId`, and `expoConfig`
339
339
  - both outputs produce a ZIP plus `manifest.json`
340
340
  - source map files (`*.map`) are omitted from bundle ZIPs by default; the CLI prints the omitted file count when any are skipped
341
- - `--platform` is required so the CLI exports the selected platform and resolves the correct native/runtime version
341
+ - native project/source files are rejected before bundle output is written; OTA bundles must only contain generated web/update assets
342
+ - when `otalan login` and `otalan init` are configured, the CLI checks that the selected `bundleId` is not already published for the selected platform, runtimeVersion, and channel before writing bundle output
343
+ - `--platform` is required so the CLI exports the selected platform and resolves the correct runtime version
342
344
 
343
- Native version defaults:
345
+ Runtime version defaults:
344
346
 
345
- - In an interactive terminal, `otalan bundle` prompts for the native version after showing the detected active native version.
346
- - Capacitor iOS reads `CFBundleShortVersionString` from `Info.plist` and resolves `$(MARKETING_VERSION)` from the Xcode project when needed
347
- - Capacitor Android reads `versionName` from `android/app/build.gradle` or `build.gradle.kts`
348
- - Expo reads the selected platform version from Expo config and falls back to the top-level Expo `version`
349
- - Expo runtimeVersion reads `--runtime-version`, Expo export metadata, or Expo config runtimeVersion policies/strings; if none are present, the CLI falls back to the resolved native version
350
- - Expo publishes use `runtimeVersion` as the Otalan release `nativeVersion` because Expo update checks send `expo-runtime-version`
351
- - `--native-version` overrides auto-detection
347
+ - In an interactive terminal, `otalan bundle` prompts for the runtime version after showing the detected active runtime version.
348
+ - Capacitor iOS defaults runtimeVersion from `CFBundleShortVersionString` in `Info.plist` and resolves `$(MARKETING_VERSION)` from the Xcode project when needed
349
+ - Capacitor Android defaults runtimeVersion from `versionName` in `android/app/build.gradle` or `build.gradle.kts`
350
+ - Expo runtimeVersion reads `--runtime-version`, Expo export metadata, or Expo config runtimeVersion policies/strings; if none are present, the CLI falls back to the selected platform Expo `version`
351
+ - `--runtime-version` overrides auto-detection
352
352
 
353
353
  For Expo projects, the recommended app config is:
354
354
 
@@ -385,10 +385,11 @@ otalan bundle --target expo --platform ios --bundle-id 1.0.5
385
385
  If you omit `bundleId`:
386
386
 
387
387
  - in an interactive terminal, the CLI prompts for a bundle ID and shows the local bundle ID from `.otalan/bundle/manifest.json` when available
388
- - when `otalan login` and `otalan init` are configured, the prompt also shows the active published bundle ID for the selected platform/native version/channel
388
+ - when `otalan login` and `otalan init` are configured, the prompt also shows the active published bundle ID for the selected platform/runtime version/channel
389
389
  - published bundle hints use `--channel`, defaulting to `production`
390
+ - duplicate published bundle ID checks use the same `--channel` value and default to `production`
390
391
  - pressing Enter without a bundle ID keeps the automatic bundle ID behavior
391
- - the CLI reads `nativeVersion` from the selected native platform and adds a short hash suffix
392
+ - the CLI reads `runtimeVersion` from the selected platform and adds a short hash suffix
392
393
  - example: `1.0.0-abc123def456`
393
394
 
394
395
  If you want to take the bundle ID from `package.json` instead:
@@ -402,20 +403,20 @@ otalan bundle --target expo --platform ios --bundle-from-package
402
403
 
403
404
  Publishes the current bundle output with rollout metadata.
404
405
 
405
- `otalan publish` uses the `bundleId`, `platform`, and release version stored in `.otalan/bundle/manifest.json`. Capacitor uses `nativeVersion`; Expo uses `runtimeVersion`. To release `1.0.5`, set it when you run `otalan bundle --bundle-id 1.0.5`.
406
+ `otalan publish` uses the `bundleId`, `platform`, and `runtimeVersion` stored in `.otalan/bundle/manifest.json`. To release `1.0.5`, set it when you run `otalan bundle --bundle-id 1.0.5`.
406
407
 
407
408
  Current behavior:
408
409
 
409
410
  - `channel` is chosen at publish time
410
411
  - publishes are mandatory by default
411
412
  - default rollout is `100`
412
- - `--platform` and `--native-version` can override the manifest, but only if they match it
413
+ - `--platform` and `--runtime-version` can override the manifest, but only if they match it
413
414
  - `--output-dir` lets you publish a bundle from a non-default folder
414
415
  - `--rollout-percent` accepts an integer from `0` to `100`
415
416
  - `--optional` marks the update as non-mandatory
416
417
  - `--release-notes` attaches release notes to the published bundle
417
418
  - Expo publish forwards the full generated Otalan satellite manifest when present
418
- - Expo publish sends `runtimeVersion` as the API `nativeVersion` and normalizes the serialized `expoManifest.nativeVersion` to the same value for server validation
419
+ - Expo publish sends the generated manifest with `runtimeVersion`
419
420
  - Otalan validates the release ZIP before the publish completes
420
421
  - active rollouts can be paused and resumed later without changing the selected bundle
421
422
 
@@ -458,9 +459,9 @@ Remote bundle tables display the API `publishedAt` timestamp, not the bundle row
458
459
 
459
460
  Default resolution order:
460
461
 
461
- 1. `--native-version`
462
+ 1. `--runtime-version`
462
463
  2. `.otalan/bundle/manifest.json` if present and the manifest platform matches the selected platform
463
- 3. native version derived from the selected platform in the local app project
464
+ 3. runtime version derived from the selected platform in the local app project
464
465
  4. interactive prompt
465
466
 
466
467
  ```bash
@@ -471,7 +472,7 @@ otalan bundles --platform ios --channel production
471
472
 
472
473
  Reactivates an older bundle for the same tuple.
473
474
 
474
- `rollback` uses the same native-version default order as `bundles`. Pass `--native-version` if you want to override the detected default.
475
+ `rollback` uses the same runtime-version default order as `bundles`. Pass `--runtime-version` if you want to override the detected default.
475
476
 
476
477
  ```bash
477
478
  otalan rollback --bundle-id 1.0.0-web.1 --platform ios --channel production
@@ -481,7 +482,7 @@ otalan rollback --bundle-id 1.0.0-web.1 --platform ios --channel production
481
482
 
482
483
  Pauses delivery of the currently active bundle for the selected release tuple.
483
484
 
484
- `pause` uses the same native-version default order as `bundles`. The active bundle remains selected, but new OTA checks stop receiving it until you resume the rollout.
485
+ `pause` uses the same runtime-version default order as `bundles`. The active bundle remains selected, but new OTA checks stop receiving it until you resume the rollout.
485
486
 
486
487
  ```bash
487
488
  otalan pause --platform ios --channel production
@@ -491,7 +492,7 @@ otalan pause --platform ios --channel production
491
492
 
492
493
  Resumes delivery of the currently active bundle for the selected release tuple.
493
494
 
494
- `resume` uses the same native-version default order as `bundles`.
495
+ `resume` uses the same runtime-version default order as `bundles`.
495
496
 
496
497
  ```bash
497
498
  otalan resume --platform ios --channel production
@@ -503,7 +504,7 @@ Shows the active bundle for the selected release tuple.
503
504
 
504
505
  The active bundle summary displays `publishedAt` as `Published at`.
505
506
 
506
- `status` also uses the same native-version default order as `bundles`.
507
+ `status` also uses the same runtime-version default order as `bundles`.
507
508
 
508
509
  ```bash
509
510
  otalan status --platform ios --channel production
@@ -517,7 +518,7 @@ otalan status --platform ios --channel production
517
518
  {
518
519
  "target": "capacitor",
519
520
  "hash": "sha256...",
520
- "nativeVersion": "1.0.0",
521
+ "runtimeVersion": "1.0.0",
521
522
  "bundleId": "1.0.0-abcdef123456",
522
523
  "createdAt": "2026-04-07T12:00:00.000Z",
523
524
  "platform": "ios"
@@ -530,7 +531,6 @@ otalan status --platform ios --channel production
530
531
  {
531
532
  "target": "expo",
532
533
  "hash": "sha256...",
533
- "nativeVersion": "1.0.0",
534
534
  "runtimeVersion": "1.0.0",
535
535
  "bundleId": "1.0.0-abcdef123456",
536
536
  "launchAsset": "bundles/ios-xxxxx.js",