@odla-ai/cli 0.28.1 → 0.29.0

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/dist/index.d.cts CHANGED
@@ -572,6 +572,10 @@ interface LocalCredentials {
572
572
  /** Controls one dev-first provisioning run; production mutation requires `yes`. */
573
573
  interface ProvisionOptions {
574
574
  configPath: string;
575
+ /** Initialize only the live (`prod`) environment of an existing sandbox
576
+ * app, even when the dev-first project config has not added `prod` to
577
+ * `envs` yet. The normal production `yes` gate still applies. */
578
+ live?: boolean;
575
579
  dryRun?: boolean;
576
580
  rotateKeys?: boolean;
577
581
  /** Rotate only the o11y ingest token; leaves db keys unchanged. */
@@ -1248,9 +1252,10 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1248
1252
 
1249
1253
  /**
1250
1254
  * Verify a live, already-provisioned environment end-to-end. Resolves the target
1251
- * env (`options.env`, else `dev`, else the first declared env) and requires it to
1252
- * be declared in the config. Reads the local credentials file and checks that it
1253
- * belongs to this app and holds the credentials required by the enabled
1255
+ * env (`options.env`, else `dev`, else the first declared env). Explicit `prod`
1256
+ * remains addressable after one-shot `provision --live` even when ordinary
1257
+ * provision defaults stay dev-only. Reads the local credentials file and checks
1258
+ * that it belongs to this app and holds the credentials required by the enabled
1254
1259
  * services — otherwise it throws pointing the user at
1255
1260
  * `odla-ai provision --write-dev-vars`.
1256
1261
  *
package/dist/index.d.ts CHANGED
@@ -572,6 +572,10 @@ interface LocalCredentials {
572
572
  /** Controls one dev-first provisioning run; production mutation requires `yes`. */
573
573
  interface ProvisionOptions {
574
574
  configPath: string;
575
+ /** Initialize only the live (`prod`) environment of an existing sandbox
576
+ * app, even when the dev-first project config has not added `prod` to
577
+ * `envs` yet. The normal production `yes` gate still applies. */
578
+ live?: boolean;
575
579
  dryRun?: boolean;
576
580
  rotateKeys?: boolean;
577
581
  /** Rotate only the o11y ingest token; leaves db keys unchanged. */
@@ -1248,9 +1252,10 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1248
1252
 
1249
1253
  /**
1250
1254
  * Verify a live, already-provisioned environment end-to-end. Resolves the target
1251
- * env (`options.env`, else `dev`, else the first declared env) and requires it to
1252
- * be declared in the config. Reads the local credentials file and checks that it
1253
- * belongs to this app and holds the credentials required by the enabled
1255
+ * env (`options.env`, else `dev`, else the first declared env). Explicit `prod`
1256
+ * remains addressable after one-shot `provision --live` even when ordinary
1257
+ * provision defaults stay dev-only. Reads the local credentials file and checks
1258
+ * that it belongs to this app and holds the credentials required by the enabled
1254
1259
  * services — otherwise it throws pointing the user at
1255
1260
  * `odla-ai provision --write-dev-vars`.
1256
1261
  *
package/dist/index.js CHANGED
@@ -56,7 +56,7 @@ import {
56
56
  startHostedSecurityJob,
57
57
  surfacePaths,
58
58
  validateInvocation
59
- } from "./chunk-STJCWZJU.js";
59
+ } from "./chunk-YTVLTADT.js";
60
60
  import {
61
61
  exitCodeFor,
62
62
  redactSecrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odla-ai/cli",
3
- "version": "0.28.1",
3
+ "version": "0.29.0",
4
4
  "description": "Agent-operable CLI for odla provisioning, calendar consent and connection lifecycle, System AI administration, Worker secrets, security jobs, and smoke checks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/cli",
@@ -57,7 +57,7 @@
57
57
  "prepublishOnly": "npm run build"
58
58
  },
59
59
  "dependencies": {
60
- "@odla-ai/ai": "0.12.1",
60
+ "@odla-ai/ai": "0.13.0",
61
61
  "@odla-ai/apps": "0.10.5",
62
62
  "@odla-ai/brand": "0.5.0",
63
63
  "@odla-ai/db": "0.10.1",
@@ -54,9 +54,10 @@ State which path you're taking and what you'll build in one line; get a nod.
54
54
  a sandbox (env `dev`, tenant `<appId>--dev`) and a live one (env `prod`,
55
55
  tenant `<appId>`). "prod" names the app's live DATABASE, never a different
56
56
  odla — there is only one odla.ai. Keep `envs: ["dev"]` and verify the tenant
57
- before any write or deploy. Add `prod` only at the explicit go-live
58
- checkpoint. That first live `provision --dry-run` review,
59
- `provision --yes --push-secrets`, and deploy are human checkpoints.
57
+ before any write or deploy. At the explicit go-live checkpoint, use
58
+ `provision --live`; add `prod` to `envs` only if normal later provision runs
59
+ should manage both. That first live `provision --live --dry-run` review,
60
+ `provision --live --yes --push-secrets`, and deploy are human checkpoints.
60
61
  3. **Rules are default-deny.** A namespace with no rule is invisible; a write
61
62
  with no rule is rejected. Never widen a rule just to clear a 403 — edit
62
63
  `src/odla/rules.mjs` deliberately, and flag rule changes to the human.
@@ -141,9 +142,10 @@ guessing which platform/credential steps need manual work. Then:
141
142
  --ack-redacted-source`.
142
143
  The source job follows, reports, and gates by default. Never request a PAT or
143
144
  treat GitHub read approval as redacted-snippet disclosure consent.
144
- 6. **ship** ⏸ — after adding `prod`, run `npx @odla-ai/cli provision --dry-run`,
145
- show the human, then `npx @odla-ai/cli provision --yes --push-secrets` and
146
- `npx wrangler deploy`.
145
+ 6. **ship** ⏸ — run `npx @odla-ai/cli provision --live --dry-run`, show the
146
+ human, then `npx @odla-ai/cli provision --live --yes --push-secrets` and
147
+ `npx wrangler deploy`. Add `prod` to `envs` only when future ordinary
148
+ provision runs should target both environments.
147
149
 
148
150
  ## Track the work in PM, as you go
149
151
 
@@ -167,12 +167,18 @@ supplied one. Surface either without looping or manufacturing a provider key.
167
167
 
168
168
  ## 6. Ship ⏸ human checkpoint
169
169
 
170
- Add `"prod"` to `envs`, provision again (prod tenant = the bare `appId`), then:
170
+ Initialize live after the sandbox is healthy (prod tenant = the bare `appId`), then:
171
171
 
172
172
  ```
173
- npx @odla-ai/cli provision --yes --push-secrets # prod mutation + configured Worker secrets
173
+ npx @odla-ai/cli provision --live --yes --push-secrets # prod mutation + configured Worker secrets
174
174
  npx wrangler deploy
175
175
  ```
176
176
 
177
+ `--live` targets only prod and does not require adding it to the dev-first
178
+ `envs` list. Add `"prod"` to `envs` only if ordinary future provision runs
179
+ should manage sandbox and live together. If calendar is enabled, predeclare
180
+ `calendar.google.availabilityCalendars.prod`; the live Google connection still
181
+ has its own consent checkpoint.
182
+
177
183
  Verify with `npx @odla-ai/cli smoke --env prod`. Point env vars at the service
178
184
  custom domains, never `*.workers.dev` (Workers can't fetch same-account workers.dev).
@@ -39,8 +39,9 @@ Every environment's tenant is the same across all owners (prod's tenant is the
39
39
  bare app id; `dev` is `<appId>--dev`). So multiple co-owners deploying to
40
40
  **production** all read and write the **same** prod database — each with their
41
41
  own key. Treat first-prod provision/deploy as the usual human checkpoint
42
- (`provision --dry-run` review, then `provision --yes --push-secrets`), and never
43
- rotate another owner's credentials on their behalf.
42
+ (`provision --live --dry-run` review, then
43
+ `provision --live --yes --push-secrets`), and never rotate another owner's
44
+ credentials on their behalf.
44
45
 
45
46
  ## If provision says the credential lacks `app.manage`
46
47