@odla-ai/cli 0.30.0 → 0.30.2

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
@@ -594,9 +594,8 @@ interface ProvisionOptions {
594
594
  * true records an explicit request; false is the only production suppression. */
595
595
  open?: boolean;
596
596
  /** Cap the handshake-approval wait, in seconds. When it elapses the command
597
- * exits with the pending handshake persisted; rerunning resumes it. Defaults
598
- * to the handshake's own expiry on an interactive terminal and 90 seconds
599
- * everywhere else (agent tool shells kill long-running commands). */
597
+ * exits pending; rerunning requests a new code. Defaults to the handshake's
598
+ * own expiry on an interactive terminal and 90 seconds everywhere else. */
600
599
  wait?: number;
601
600
  /** Test/embedding override for opening the approval URL. Defaults to the OS browser opener. */
602
601
  openApprovalUrl?: (url: string) => Promise<void>;
@@ -629,6 +628,8 @@ interface ProvisionPlan {
629
628
  interface SmokeOptions {
630
629
  configPath: string;
631
630
  env?: string;
631
+ /** Verify the deployed Worker without reading local db/o11y credentials. */
632
+ runtime?: boolean;
632
633
  /** Developer-token override used only for owner-visible calendar health. */
633
634
  token?: string;
634
635
  /** Existing odla account email used only when a fresh device handshake is required. */
@@ -1255,10 +1256,10 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1255
1256
  * Verify a live, already-provisioned environment end-to-end. Resolves the target
1256
1257
  * env (`options.env`, else `dev`, else the first declared env). Explicit `prod`
1257
1258
  * remains addressable after one-shot `provision --live` even when ordinary
1258
- * provision defaults stay dev-only. Reads the local credentials file and checks
1259
- * that it belongs to this app and holds the credentials required by the enabled
1260
- * services otherwise it throws pointing the user at
1261
- * `odla-ai provision --write-dev-vars`.
1259
+ * provision defaults stay dev-only. Local mode reads the private service
1260
+ * credentials and performs direct db checks. `runtime` mode never reads those
1261
+ * values: it verifies Registry state, the deployed Worker link, anonymous
1262
+ * integration probes, and owner-visible calendar health instead.
1262
1263
  *
1263
1264
  * It then makes service-aware network calls: fetches the registry public-config
1264
1265
  * (and, when `ai.provider` is configured, asserts the live provider matches);
package/dist/index.d.ts CHANGED
@@ -594,9 +594,8 @@ interface ProvisionOptions {
594
594
  * true records an explicit request; false is the only production suppression. */
595
595
  open?: boolean;
596
596
  /** Cap the handshake-approval wait, in seconds. When it elapses the command
597
- * exits with the pending handshake persisted; rerunning resumes it. Defaults
598
- * to the handshake's own expiry on an interactive terminal and 90 seconds
599
- * everywhere else (agent tool shells kill long-running commands). */
597
+ * exits pending; rerunning requests a new code. Defaults to the handshake's
598
+ * own expiry on an interactive terminal and 90 seconds everywhere else. */
600
599
  wait?: number;
601
600
  /** Test/embedding override for opening the approval URL. Defaults to the OS browser opener. */
602
601
  openApprovalUrl?: (url: string) => Promise<void>;
@@ -629,6 +628,8 @@ interface ProvisionPlan {
629
628
  interface SmokeOptions {
630
629
  configPath: string;
631
630
  env?: string;
631
+ /** Verify the deployed Worker without reading local db/o11y credentials. */
632
+ runtime?: boolean;
632
633
  /** Developer-token override used only for owner-visible calendar health. */
633
634
  token?: string;
634
635
  /** Existing odla account email used only when a fresh device handshake is required. */
@@ -1255,10 +1256,10 @@ declare function installSkill(options?: SkillInstallOptions): SkillInstallResult
1255
1256
  * Verify a live, already-provisioned environment end-to-end. Resolves the target
1256
1257
  * env (`options.env`, else `dev`, else the first declared env). Explicit `prod`
1257
1258
  * remains addressable after one-shot `provision --live` even when ordinary
1258
- * provision defaults stay dev-only. Reads the local credentials file and checks
1259
- * that it belongs to this app and holds the credentials required by the enabled
1260
- * services otherwise it throws pointing the user at
1261
- * `odla-ai provision --write-dev-vars`.
1259
+ * provision defaults stay dev-only. Local mode reads the private service
1260
+ * credentials and performs direct db checks. `runtime` mode never reads those
1261
+ * values: it verifies Registry state, the deployed Worker link, anonymous
1262
+ * integration probes, and owner-visible calendar health instead.
1262
1263
  *
1263
1264
  * It then makes service-aware network calls: fetches the registry public-config
1264
1265
  * (and, when `ai.provider` is configured, asserts the live provider matches);
package/dist/index.js CHANGED
@@ -56,7 +56,7 @@ import {
56
56
  startHostedSecurityJob,
57
57
  surfacePaths,
58
58
  validateInvocation
59
- } from "./chunk-PPSXHZJI.js";
59
+ } from "./chunk-3HFNKDZV.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.30.0",
3
+ "version": "0.30.2",
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",
@@ -113,9 +113,8 @@ guessing which platform/credential steps need manual work. Then:
113
113
  control, open that exact URL now.** If you do not, give it to the human
114
114
  verbatim; never wait silently or start a substitute handshake. Outside an
115
115
  interactive terminal the wait is capped (90s default,
116
- `--wait <seconds>`); exit code 75 means still pending: the handshake is
117
- persisted, so once the human approves, re-run the same command and it
118
- resumes the same code and collects the token. It creates the app,
116
+ `--wait <seconds>`); exit code 75 means still pending. The device code is
117
+ not cached: rerunning always opens a fresh code for human review. It creates the app,
119
118
  consuming a one-time exact-id reservation when the approved app is new,
120
119
  enables services, issues or reuses configured credentials (db key + o11y
121
120
  ingest token when enabled), composes declared integration schema/rules and
@@ -280,7 +279,10 @@ If approval is not available, comment on the runbook instead so an admin can fix
280
279
  it later.
281
280
 
282
281
  `npx @odla-ai/cli doctor` is an offline config check anytime;
283
- `npx @odla-ai/cli smoke --env dev` verifies a live deployment.
282
+ `npx @odla-ai/cli smoke --env dev` verifies a live deployment from local
283
+ service credentials. After `provision --push-secrets`, use
284
+ `npx @odla-ai/cli smoke --env dev --runtime`; it verifies the Worker and
285
+ anonymous integration routes without retrieving its db/o11y secrets.
284
286
  Use `calendar status --json` for safe connection state (`bookable`, booking
285
287
  and availability calendars) and `calendar calendars --json` to discover ids
286
288
  after consent; update checked-in config and re-provision. Disconnect always
@@ -81,10 +81,19 @@ do not retry with a guessed revision. Once claimed, use the repository's
81
81
  worktree procedure and mention the PM references in the execution chat:
82
82
 
83
83
  ```text
84
- @[Task title](pm:task/<task-id>)
85
- @[Goal title](pm:goal/<goal-id>)
84
+ [Task title](https://odla.ai/studio/pm/board/<task-id>)
85
+ [Goal title](https://odla.ai/studio/pm/goals/<goal-id>)
86
86
  ```
87
87
 
88
+ In user-facing chat, a UUID is never the record's label. Name the type and title
89
+ as a Markdown link to Studio, then add the state, consequence, or next action. A
90
+ useful handoff says, for example, `Ready task: [Replace UUID-only PM
91
+ handoffs](https://odla.ai/studio/pm/board/<task-id>) — ready to claim`, not
92
+ `Ready task: <task-id>`. When several records are related, explain that
93
+ relationship instead of returning an id inventory. Create and lifecycle
94
+ commands print the title-first link directly; `pm ... link <id>` reproduces it
95
+ later. Reserve `pm ... ref <id>` for structured odla Discussion markup.
96
+
88
97
  ## 5. Execute, review, and complete
89
98
 
90
99
  - Keep the task description/acceptance criteria current under its revision.
@@ -188,6 +188,41 @@ npx @odla-ai/cli pm task comments <task-id>
188
188
  Use `pm:task`, `pm:goal`, `pm:decision`, `pm:bug`, and `pm:runbook`. The message
189
189
  is communication; the referenced PM row remains the lifecycle authority.
190
190
 
191
+ ### Human-readable handoffs
192
+
193
+ A PM id is an implementation handle, not a useful description of work. In every
194
+ chat update, final response, review request, or handoff, lead with the record's
195
+ type and title as an ordinary Markdown link to its Studio record, then say what
196
+ happened or what the recipient should do. The UUID belongs in the link target,
197
+ not in the prose. Typed `pm:*` references are for odla Discussion, where they
198
+ render as PM chips; do not expose that internal markup in ordinary chat.
199
+
200
+ Do not write:
201
+
202
+ ```text
203
+ Accepted decision: 019fd392-1217-754c-a61d-3b0470bcd269
204
+ Ready task: 019fd392-dd02-7312-86d6-d255c5a983e7
205
+ Backup bug: 20f38d3d-7c02-54b5-8e33-f8b82e4ab125
206
+ ```
207
+
208
+ Write a compact semantic handoff instead:
209
+
210
+ ```text
211
+ Accepted decision: [Keep the legacy fallback through migration](https://odla.ai/studio/pm/decisions/<decision-id>) — rules out deleting it before production evidence is clean.
212
+ Ready task: [Replace UUID-only PM handoffs](https://odla.ai/studio/pm/board/<task-id>) — implementation is bounded and ready to claim.
213
+ Tracked bug: [PM create output hides the record title](https://odla.ai/studio/pm/bugs/<bug-id>) — retained if the task does not cover every output path.
214
+ ```
215
+
216
+ The CLI reinforces this convention: successful creates and lifecycle changes
217
+ print title-first, copy-ready links, such as
218
+ `created bug: [Checkout 500s on retry](https://odla.ai/studio/pm/bugs/<bug-id>)`
219
+ and `decision: [Keep the fallback](https://odla.ai/studio/pm/decisions/<decision-id>)
220
+ → accepted`. Use `pm ... link <id>` to regenerate an ordinary Markdown link
221
+ later; use `pm ... ref <id>` only for structured odla Discussion markup.
222
+ Summarize the relationship between records instead of merely listing them; PM
223
+ contains the detail, while chat should make the state and next action
224
+ understandable before the recipient follows a link.
225
+
191
226
  In Studio, open any PM item and choose **Discuss** to open the owning project's
192
227
  Discussion composer with the same stable reference already inserted. The draft
193
228
  is retained in the URL across reload/back navigation but is not a write: review,