@odla-ai/cli 0.33.0 → 0.34.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/README.md +204 -112
- package/REQUIREMENTS.md +6 -0
- package/dist/bin.cjs +1027 -527
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-YSQORU5J.js → chunk-RUEM7ZTA.js} +998 -523
- package/dist/chunk-RUEM7ZTA.js.map +1 -0
- package/dist/{cli-U436OLYW.js → cli-NKNQLWOM.js} +2 -2
- package/dist/index.cjs +1001 -524
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +173 -4
- package/dist/index.d.ts +173 -4
- package/dist/index.js +5 -1
- package/package.json +2 -2
- package/skills/odla/SKILL.md +65 -35
- package/skills/odla/references/agent-identity.md +5 -5
- package/skills/odla/references/build.md +16 -15
- package/skills/odla/references/co-owners.md +1 -1
- package/skills/odla/references/pm-work-intake.md +12 -12
- package/skills/odla/references/pm.md +17 -17
- package/skills/odla/references/sdks.md +2 -2
- package/skills/odla-migrate/SKILL.md +23 -5
- package/skills/odla-migrate/references/phase-2-chapter.md +1 -1
- package/skills/odla-migrate/references/phase-2-db.md +11 -10
- package/skills/odla-migrate/references/phase-3-auth.md +2 -2
- package/skills/odla-migrate/references/phase-3b-user-sync.md +2 -2
- package/skills/odla-migrate/references/phase-4-ai.md +3 -3
- package/skills/odla-migrate/references/phase-5-cutover.md +5 -5
- package/skills/odla-migrate/references/project-state.md +4 -4
- package/skills/odla-migrate/references/secrets-map.md +6 -6
- package/skills/odla-migrate/references/troubleshooting.md +23 -23
- package/skills/odla-o11y-debug/SKILL.md +3 -3
- package/dist/chunk-YSQORU5J.js.map +0 -1
- /package/dist/{cli-U436OLYW.js.map → cli-NKNQLWOM.js.map} +0 -0
package/README.md
CHANGED
|
@@ -30,10 +30,10 @@ day.
|
|
|
30
30
|
Ask before you search the web or work from memory:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
npx @odla-ai/cli runbook ask "how do I roll back a bad publish?" # written, cited answer
|
|
34
|
-
npx @odla-ai/cli runbook search "restore a tenant" # the passages behind it
|
|
35
|
-
npx @odla-ai/cli runbook get release # the whole procedure
|
|
36
|
-
npx @odla-ai/cli runbook list # what exists
|
|
33
|
+
npx --yes @odla-ai/cli@latest runbook ask "how do I roll back a bad publish?" # written, cited answer
|
|
34
|
+
npx --yes @odla-ai/cli@latest runbook search "restore a tenant" # the passages behind it
|
|
35
|
+
npx --yes @odla-ai/cli@latest runbook get release # the whole procedure
|
|
36
|
+
npx --yes @odla-ai/cli@latest runbook list # what exists
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Reading works for any signed-in developer and needs no `odla.config.mjs` — the
|
|
@@ -45,9 +45,9 @@ Before an agent reads PM, Discussions, o11y, runbooks, or identity from a fresh
|
|
|
45
45
|
workspace, it can explain the selected context without authenticating:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
npx @odla-ai/cli context show --platform https://odla.ai --app <appId> --env prod --json
|
|
49
|
-
npx @odla-ai/cli context save production --platform https://odla.ai --app <appId> --env prod
|
|
50
|
-
npx @odla-ai/cli context show --context production --json
|
|
48
|
+
npx --yes @odla-ai/cli@latest context show --platform https://odla.ai --app <appId> --env prod --json
|
|
49
|
+
npx --yes @odla-ai/cli@latest context save production --platform https://odla.ai --app <appId> --env prod
|
|
50
|
+
npx --yes @odla-ai/cli@latest context show --context production --json
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
For each value, an explicit flag wins over the matching
|
|
@@ -81,13 +81,13 @@ project. The installed `references/agent-identity.md` runbook gives the full
|
|
|
81
81
|
cross-worktree recovery procedure.
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
ODLA_DEV_TOKEN=... npx @odla-ai/cli pm handoff --app <appId>
|
|
85
|
-
ODLA_DEV_TOKEN=... npx @odla-ai/cli discuss list --app <appId> --json
|
|
86
|
-
ODLA_DEV_TOKEN=... npx @odla-ai/cli o11y status --app <appId> --env prod --json
|
|
87
|
-
ODLA_DEV_TOKEN=... npx @odla-ai/cli whoami --json
|
|
88
|
-
npx @odla-ai/cli platform status --context production --json
|
|
89
|
-
npx @odla-ai/cli pm handoff --context production --json
|
|
90
|
-
npx @odla-ai/cli runbook new deploy --context production --title Deploy --file deploy.md
|
|
84
|
+
ODLA_DEV_TOKEN=... npx --yes @odla-ai/cli@latest pm handoff --app <appId>
|
|
85
|
+
ODLA_DEV_TOKEN=... npx --yes @odla-ai/cli@latest discuss list --app <appId> --json
|
|
86
|
+
ODLA_DEV_TOKEN=... npx --yes @odla-ai/cli@latest o11y status --app <appId> --env prod --json
|
|
87
|
+
ODLA_DEV_TOKEN=... npx --yes @odla-ai/cli@latest whoami --json
|
|
88
|
+
npx --yes @odla-ai/cli@latest platform status --context production --json
|
|
89
|
+
npx --yes @odla-ai/cli@latest pm handoff --context production --json
|
|
90
|
+
npx --yes @odla-ai/cli@latest runbook new deploy --context production --title Deploy --file deploy.md
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
Runbooks tell an agent how to operate; PM tells every agent what this project is
|
|
@@ -96,15 +96,15 @@ app is registered, start each session with the read-only aligned-work intake,
|
|
|
96
96
|
then read open bugs and recent decisions:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
|
-
npx odla-ai pm project list --app <productId>
|
|
100
|
-
npx odla-ai pm project add --app <productId> --name "My project"
|
|
101
|
-
npx odla-ai pm project use <projectId>
|
|
102
|
-
npx odla-ai pm next --app <appId> --project <projectId>
|
|
103
|
-
npx odla-ai pm handoff --app <appId>
|
|
104
|
-
npx odla-ai pm watch --app <appId> --entity task --jsonl
|
|
105
|
-
npx odla-ai pm bug list --app <appId> --status open
|
|
106
|
-
npx odla-ai pm goal list --app <appId> --status open
|
|
107
|
-
npx odla-ai pm decision list --app <appId> --limit 20
|
|
99
|
+
npx --yes @odla-ai/cli@latest pm project list --app <productId>
|
|
100
|
+
npx --yes @odla-ai/cli@latest pm project add --app <productId> --name "My project"
|
|
101
|
+
npx --yes @odla-ai/cli@latest pm project use <projectId>
|
|
102
|
+
npx --yes @odla-ai/cli@latest pm next --app <appId> --project <projectId>
|
|
103
|
+
npx --yes @odla-ai/cli@latest pm handoff --app <appId>
|
|
104
|
+
npx --yes @odla-ai/cli@latest pm watch --app <appId> --entity task --jsonl
|
|
105
|
+
npx --yes @odla-ai/cli@latest pm bug list --app <appId> --status open
|
|
106
|
+
npx --yes @odla-ai/cli@latest pm goal list --app <appId> --status open
|
|
107
|
+
npx --yes @odla-ai/cli@latest pm decision list --app <appId> --limit 20
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
`pm handoff` is the authoritative unresolved-state view: unmet goals, every
|
|
@@ -129,8 +129,8 @@ Refine a Backlog task with `--goal` (or an accepted
|
|
|
129
129
|
and claim the reviewed revision:
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
npx odla-ai pm task ready <id> --expected-revision <n>
|
|
133
|
-
npx odla-ai pm task claim <id> --expected-revision <n>
|
|
132
|
+
npx --yes @odla-ai/cli@latest pm task ready <id> --expected-revision <n>
|
|
133
|
+
npx --yes @odla-ai/cli@latest pm task claim <id> --expected-revision <n>
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
Ready is stored as `todo` for API compatibility. Claims are atomic and assign
|
|
@@ -160,7 +160,7 @@ When diagnosing a deployed app, agents can request one parseable observability
|
|
|
160
160
|
snapshot instead of scraping Studio or composing collector routes themselves:
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
|
-
npx odla-ai o11y status --app <appId> --env prod --minutes 60 --json
|
|
163
|
+
npx --yes @odla-ai/cli@latest o11y status --app <appId> --env prod --minutes 60 --json
|
|
164
164
|
```
|
|
165
165
|
|
|
166
166
|
Schema v9 keeps application RED, an `applicationVersions` breakdown of
|
|
@@ -186,6 +186,87 @@ jobs, missing canary configuration, stale probes, and partial
|
|
|
186
186
|
socket-reconciliation coverage remain explicit fields. Authentication progress
|
|
187
187
|
is stderr-only, so stdout is a single JSON document.
|
|
188
188
|
|
|
189
|
+
Repository-controlled SLO monitoring lives under `o11y.monitoring`. Objectives
|
|
190
|
+
can consume Kitesurf routes or bounded observations of existing o11y error,
|
|
191
|
+
latency, and protected-canary signals. A minimal route policy detects both
|
|
192
|
+
short outages and sustained error-budget burn, and sends incident and digest
|
|
193
|
+
email:
|
|
194
|
+
|
|
195
|
+
```js
|
|
196
|
+
export default {
|
|
197
|
+
services: ["o11y"],
|
|
198
|
+
links: { prod: "https://example.com" },
|
|
199
|
+
o11y: {
|
|
200
|
+
monitoring: {
|
|
201
|
+
probes: [{
|
|
202
|
+
id: "home", route: "/", envs: ["prod"], every: "5m",
|
|
203
|
+
expect: { status: 200, titleIncludes: "Example", textIncludes: ["Welcome"] },
|
|
204
|
+
}],
|
|
205
|
+
slos: [{
|
|
206
|
+
id: "availability", name: "Public availability",
|
|
207
|
+
indicator: { type: "probe-success", probes: ["home"] },
|
|
208
|
+
target: 0.999, window: "28d",
|
|
209
|
+
alerts: {
|
|
210
|
+
spike: { badChecks: 2, withinChecks: 3, recoverAfter: 2 },
|
|
211
|
+
trend: { burnRate: 1, shortWindow: "6h", longWindow: "3d", minBadChecks: 2 },
|
|
212
|
+
},
|
|
213
|
+
}],
|
|
214
|
+
notifications: {
|
|
215
|
+
prod: {
|
|
216
|
+
email: ["oncall@example.com"], timezone: "America/Costa_Rica",
|
|
217
|
+
daily: "08:00", weekly: { day: "monday", at: "08:00" },
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
For a service-performance objective, omit `probes` and select an existing o11y
|
|
226
|
+
metric. The comparator describes a successful observation, so this example
|
|
227
|
+
requires each five-minute request p95 to be at most 500ms:
|
|
228
|
+
|
|
229
|
+
```js
|
|
230
|
+
slos: [{
|
|
231
|
+
id: "request-latency", name: "Request p95 at or below 500ms",
|
|
232
|
+
indicator: {
|
|
233
|
+
type: "o11y-metric", metric: "latency_p95", comparator: "lte",
|
|
234
|
+
threshold: 500, every: "5m", observationWindow: "5m",
|
|
235
|
+
},
|
|
236
|
+
target: 0.99, window: "28d",
|
|
237
|
+
}]
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
`error_rate`, `latency_p95`, `synthetic_success`, and
|
|
241
|
+
`synthetic_publish_to_visible` are supported. The checked-in odla-db first
|
|
242
|
+
rollout is `ops/monitoring/odla-db.config.mjs`:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npx --yes @odla-ai/cli@latest monitor plan --config ops/monitoring/odla-db.config.mjs --env prod --json
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Preview and apply the normalized policy, then inspect or exercise it through
|
|
249
|
+
stable JSON:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
npx --yes @odla-ai/cli@latest monitor plan --env prod --json
|
|
253
|
+
npx --yes @odla-ai/cli@latest monitor apply --env prod --yes --json
|
|
254
|
+
npx --yes @odla-ai/cli@latest monitor status --app <appId> --env prod --json
|
|
255
|
+
npx --yes @odla-ai/cli@latest monitor run home --app <appId> --env prod --json
|
|
256
|
+
npx --yes @odla-ai/cli@latest monitor incidents --app <appId> --env prod --runs --json
|
|
257
|
+
npx --yes @odla-ai/cli@latest monitor report --app <appId> --env prod --period weekly --json
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Only scheduled `good` and `bad` outcomes enter the application SLO denominator.
|
|
261
|
+
Kitesurf failures, missing Analytics Engine evidence, stale canaries, query
|
|
262
|
+
failures, and scheduler gaps are retained as `monitor_error`/`missed` and
|
|
263
|
+
degrade monitoring health separately, so no traffic or a broken monitor cannot
|
|
264
|
+
manufacture success or downtime. Probe responses retain bounded metadata only;
|
|
265
|
+
page content and accessibility trees are never returned by the CLI or stored.
|
|
266
|
+
Each applied desired-state revision starts a fresh SLO event series and closes
|
|
267
|
+
open incidents as `config_revision_changed`; results produced by different
|
|
268
|
+
thresholds, routes, assertions, or notification policy are never blended.
|
|
269
|
+
|
|
189
270
|
For platform-wide operations, `platform status --json` requests only the
|
|
190
271
|
short-lived, admin-approved `platform:status:read` capability and reads the
|
|
191
272
|
same `odla.platform-status/v1` snapshot as Studio. It works outside a project
|
|
@@ -204,10 +285,10 @@ For repository-managed settings, compare checked-in intent with the live
|
|
|
204
285
|
owner-visible Registry projection before provisioning:
|
|
205
286
|
|
|
206
287
|
```bash
|
|
207
|
-
npx odla-ai config diff --json
|
|
208
|
-
npx odla-ai config plan --json > .odla/config-plan.json
|
|
209
|
-
npx odla-ai config apply --plan .odla/config-plan.json --json
|
|
210
|
-
npx odla-ai operations wait <operation-id> --json
|
|
288
|
+
npx --yes @odla-ai/cli@latest config diff --json
|
|
289
|
+
npx --yes @odla-ai/cli@latest config plan --json > .odla/config-plan.json
|
|
290
|
+
npx --yes @odla-ai/cli@latest config apply --plan .odla/config-plan.json --json
|
|
291
|
+
npx --yes @odla-ai/cli@latest operations wait <operation-id> --json
|
|
211
292
|
```
|
|
212
293
|
|
|
213
294
|
`diff` and `plan` are read-only and request only a short-lived,
|
|
@@ -258,8 +339,8 @@ JSDoc, and neither from memory.
|
|
|
258
339
|
**After you change something, ask which runbooks you invalidated:**
|
|
259
340
|
|
|
260
341
|
```bash
|
|
261
|
-
npx @odla-ai/cli runbook impact # vs origin/main, uncommitted work included
|
|
262
|
-
npx @odla-ai/cli runbook impact --base HEAD~1
|
|
342
|
+
npx --yes @odla-ai/cli@latest runbook impact # vs origin/main, uncommitted work included
|
|
343
|
+
npx --yes @odla-ai/cli@latest runbook impact --base HEAD~1
|
|
263
344
|
```
|
|
264
345
|
|
|
265
346
|
It diffs the working tree, works out which surfaces moved — a package, its
|
|
@@ -270,7 +351,7 @@ before you call the change finished. Fixing what it finds is one command and
|
|
|
270
351
|
takes effect immediately:
|
|
271
352
|
|
|
272
353
|
```bash
|
|
273
|
-
npx @odla-ai/cli runbook edit db --note "retract replaced the null write"
|
|
354
|
+
npx --yes @odla-ai/cli@latest runbook edit db --note "retract replaced the null write"
|
|
274
355
|
```
|
|
275
356
|
|
|
276
357
|
Platform runbook edits need admin or the `platform:runbook:write` capability,
|
|
@@ -283,7 +364,7 @@ but never grants authority.
|
|
|
283
364
|
**Is the corpus itself still true?**
|
|
284
365
|
|
|
285
366
|
```bash
|
|
286
|
-
npx odla-ai runbook lint
|
|
367
|
+
npx --yes @odla-ai/cli@latest runbook lint
|
|
287
368
|
```
|
|
288
369
|
|
|
289
370
|
Because a runbook is edited without a release, its text can name a command that
|
|
@@ -300,16 +381,20 @@ the procedure and nothing else.
|
|
|
300
381
|
## Install
|
|
301
382
|
|
|
302
383
|
No install needed — the package ships a single `odla-ai` binary, so npx can run
|
|
303
|
-
it directly
|
|
384
|
+
it directly. Agents and one-off setup should resolve the current published CLI
|
|
385
|
+
explicitly:
|
|
304
386
|
|
|
305
387
|
```bash
|
|
306
|
-
npx @odla-ai/cli init --app-id my-app --name "My App"
|
|
388
|
+
npx --yes @odla-ai/cli@latest init --app-id my-app --name "My App"
|
|
307
389
|
```
|
|
308
390
|
|
|
309
391
|
For a project you keep working in, install it as a dev dependency so the
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
392
|
+
lockfile records the CLI/runtime graph used by that application. Use
|
|
393
|
+
`npx --no-install odla-ai` only when deliberately testing that pinned graph;
|
|
394
|
+
agent orchestration examples use `@latest` so a stale workspace or cache does
|
|
395
|
+
not silently select an older CLI. ODLA is under active development: use a
|
|
396
|
+
normal dependency declaration, commit the lockfile, and let `npm ci` reproduce
|
|
397
|
+
the resolved graph:
|
|
313
398
|
|
|
314
399
|
```bash
|
|
315
400
|
npm view @odla-ai/cli version
|
|
@@ -338,61 +423,62 @@ npm ls @odla-ai/cli
|
|
|
338
423
|
## Commands
|
|
339
424
|
|
|
340
425
|
```bash
|
|
341
|
-
npx odla-ai
|
|
342
|
-
npx odla-ai runbook
|
|
343
|
-
npx odla-ai runbook
|
|
344
|
-
npx odla-ai runbook
|
|
345
|
-
npx odla-ai runbook
|
|
346
|
-
npx odla-ai runbook
|
|
347
|
-
npx odla-ai runbook
|
|
348
|
-
npx odla-ai runbook
|
|
349
|
-
npx odla-ai
|
|
350
|
-
npx odla-ai
|
|
351
|
-
npx odla-ai
|
|
352
|
-
npx odla-ai
|
|
353
|
-
npx odla-ai
|
|
354
|
-
npx odla-ai
|
|
355
|
-
npx odla-ai
|
|
356
|
-
npx odla-ai config
|
|
357
|
-
npx odla-ai config
|
|
358
|
-
npx odla-ai
|
|
359
|
-
npx odla-ai operations
|
|
360
|
-
npx odla-ai
|
|
361
|
-
npx odla-ai calendar
|
|
362
|
-
npx odla-ai calendar
|
|
363
|
-
npx odla-ai calendar
|
|
364
|
-
npx odla-ai
|
|
365
|
-
npx
|
|
366
|
-
npx odla-ai code connect --
|
|
426
|
+
npx --yes @odla-ai/cli@latest auth login --app my-app --email owner@example.com --no-open --wait 600
|
|
427
|
+
npx --yes @odla-ai/cli@latest runbook ask "how do I roll back a bad publish?"
|
|
428
|
+
npx --yes @odla-ai/cli@latest runbook search "restore a tenant" --limit 5
|
|
429
|
+
npx --yes @odla-ai/cli@latest runbook get release
|
|
430
|
+
npx --yes @odla-ai/cli@latest runbook list
|
|
431
|
+
npx --yes @odla-ai/cli@latest runbook impact --base origin/main
|
|
432
|
+
npx --yes @odla-ai/cli@latest runbook lint
|
|
433
|
+
npx --yes @odla-ai/cli@latest runbook edit db --note "what changed"
|
|
434
|
+
npx --yes @odla-ai/cli@latest runbook comment release --body "step 4 no longer applies"
|
|
435
|
+
npx --yes @odla-ai/cli@latest context show --app my-app --env prod --json
|
|
436
|
+
npx --yes @odla-ai/cli@latest whoami
|
|
437
|
+
npx --yes @odla-ai/cli@latest setup
|
|
438
|
+
npx --yes @odla-ai/cli@latest init --app-id my-app --name "My App"
|
|
439
|
+
npx --yes @odla-ai/cli@latest doctor
|
|
440
|
+
npx --yes @odla-ai/cli@latest ai models --env dev # exact models this app may select; no admin grant
|
|
441
|
+
npx --yes @odla-ai/cli@latest config diff --json
|
|
442
|
+
npx --yes @odla-ai/cli@latest config plan --json > .odla/config-plan.json
|
|
443
|
+
npx --yes @odla-ai/cli@latest config apply --plan .odla/config-plan.json --json
|
|
444
|
+
npx --yes @odla-ai/cli@latest operations get <operation-id> --json
|
|
445
|
+
npx --yes @odla-ai/cli@latest operations wait <operation-id> --timeout 60 --json
|
|
446
|
+
npx --yes @odla-ai/cli@latest calendar status --env dev
|
|
447
|
+
npx --yes @odla-ai/cli@latest calendar calendars --env dev
|
|
448
|
+
npx --yes @odla-ai/cli@latest calendar connect --env dev --no-open
|
|
449
|
+
npx --yes @odla-ai/cli@latest calendar disconnect --env dev --yes
|
|
450
|
+
npx --yes @odla-ai/cli@latest capabilities --json
|
|
451
|
+
npx --yes @odla-ai/cli@latest code connect --platform https://odla.ai --app-id my-app --env dev --email owner@example.com --no-open
|
|
452
|
+
npx --yes @odla-ai/cli@latest code connect --env prod --once --no-open # bounded enrollment + heartbeat proof
|
|
367
453
|
# install SDKs, write the Worker, and create wrangler.jsonc before secret push
|
|
368
|
-
npx odla-ai provision --dry-run
|
|
369
|
-
npx odla-ai provision --email owner@example.com --write-dev-vars --push-secrets
|
|
454
|
+
npx --yes @odla-ai/cli@latest provision --dry-run
|
|
455
|
+
npx --yes @odla-ai/cli@latest provision --email owner@example.com --write-dev-vars --push-secrets --no-open --wait 600
|
|
370
456
|
# recovery when the selected agent credential has no live app.manage grant
|
|
371
|
-
npx odla-ai provision --request-grant --email owner@example.com --write-dev-vars --push-secrets
|
|
372
|
-
npx odla-ai smoke --env dev
|
|
373
|
-
npx odla-ai agent jobs --env dev --state dead_letter --json
|
|
374
|
-
npx odla-ai agent retry <job-id> --env dev --json
|
|
375
|
-
npx odla-ai discuss watch <topic-id> --jsonl
|
|
376
|
-
npx odla-ai discuss watch <topic-id> --cursor <saved-cursor> --jsonl
|
|
377
|
-
npx odla-ai secrets push --env dev
|
|
378
|
-
npx odla-ai secrets set clerk_webhook_secret --env dev --stdin
|
|
379
|
-
npx odla-ai secrets set-clerk-key --env dev --from-env CLERK_SECRET_KEY
|
|
380
|
-
npx odla-ai security run . --env dev --ack-redacted-source
|
|
381
|
-
npx odla-ai security github connect --env dev # infers owner/name from git origin
|
|
382
|
-
npx odla-ai security plan --env dev
|
|
383
|
-
npx odla-ai security sources --env dev
|
|
384
|
-
npx odla-ai security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
|
|
385
|
-
npx odla-ai security status <job-id>
|
|
386
|
-
npx odla-ai security report <job-id>
|
|
387
|
-
npx odla-ai admin ai show --context production --email owner@example.com
|
|
388
|
-
npx odla-ai admin ai models --context production
|
|
389
|
-
npx odla-ai admin ai set security --context production --discovery-provider anthropic --discovery-model claude-opus-4-8 --validation-provider openai --validation-model gpt-5.5 --enabled
|
|
390
|
-
npx odla-ai admin ai credentials --context production
|
|
391
|
-
npx odla-ai admin ai credential set anthropic --context production --from-env ANTHROPIC_API_KEY
|
|
392
|
-
npx odla-ai admin ai usage --context production --app-id my-app --env prod --limit 50
|
|
393
|
-
npx odla-ai admin ai audit --context production --limit 25
|
|
394
|
-
npx odla-ai skill install
|
|
395
|
-
npx odla-ai version
|
|
457
|
+
npx --yes @odla-ai/cli@latest provision --request-grant --email owner@example.com --write-dev-vars --push-secrets --no-open --wait 600
|
|
458
|
+
npx --yes @odla-ai/cli@latest smoke --env dev
|
|
459
|
+
npx --yes @odla-ai/cli@latest agent jobs --env dev --state dead_letter --json
|
|
460
|
+
npx --yes @odla-ai/cli@latest agent retry <job-id> --env dev --json
|
|
461
|
+
npx --yes @odla-ai/cli@latest discuss watch <topic-id> --jsonl
|
|
462
|
+
npx --yes @odla-ai/cli@latest discuss watch <topic-id> --cursor <saved-cursor> --jsonl
|
|
463
|
+
npx --yes @odla-ai/cli@latest secrets push --env dev
|
|
464
|
+
npx --yes @odla-ai/cli@latest secrets set clerk_webhook_secret --env dev --stdin
|
|
465
|
+
npx --yes @odla-ai/cli@latest secrets set-clerk-key --env dev --from-env CLERK_SECRET_KEY
|
|
466
|
+
npx --yes @odla-ai/cli@latest security run . --env dev --ack-redacted-source
|
|
467
|
+
npx --yes @odla-ai/cli@latest security github connect --env dev --no-open # infers owner/name from git origin
|
|
468
|
+
npx --yes @odla-ai/cli@latest security plan --env dev
|
|
469
|
+
npx --yes @odla-ai/cli@latest security sources --env dev
|
|
470
|
+
npx --yes @odla-ai/cli@latest security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
|
|
471
|
+
npx --yes @odla-ai/cli@latest security status <job-id>
|
|
472
|
+
npx --yes @odla-ai/cli@latest security report <job-id>
|
|
473
|
+
npx --yes @odla-ai/cli@latest admin ai show --context production --email owner@example.com --no-open
|
|
474
|
+
npx --yes @odla-ai/cli@latest admin ai models --context production
|
|
475
|
+
npx --yes @odla-ai/cli@latest admin ai set security --context production --discovery-provider anthropic --discovery-model claude-opus-4-8 --validation-provider openai --validation-model gpt-5.5 --enabled
|
|
476
|
+
npx --yes @odla-ai/cli@latest admin ai credentials --context production
|
|
477
|
+
npx --yes @odla-ai/cli@latest admin ai credential set anthropic --context production --from-env ANTHROPIC_API_KEY
|
|
478
|
+
npx --yes @odla-ai/cli@latest admin ai usage --context production --app-id my-app --env prod --limit 50
|
|
479
|
+
npx --yes @odla-ai/cli@latest admin ai audit --context production --limit 25
|
|
480
|
+
npx --yes @odla-ai/cli@latest skill install
|
|
481
|
+
npx --yes @odla-ai/cli@latest version
|
|
396
482
|
```
|
|
397
483
|
|
|
398
484
|
Before a non-dry provisioning run, the executable verifies two independent
|
|
@@ -472,8 +558,8 @@ New configs contain only the `dev` environment. After the development flow is
|
|
|
472
558
|
healthy, initialize the existing app's live instance without editing the config:
|
|
473
559
|
|
|
474
560
|
```sh
|
|
475
|
-
npx @odla-ai/cli provision --live --dry-run
|
|
476
|
-
npx @odla-ai/cli provision --live --yes --push-secrets
|
|
561
|
+
npx --yes @odla-ai/cli@latest provision --live --dry-run
|
|
562
|
+
npx --yes @odla-ai/cli@latest provision --live --yes --push-secrets
|
|
477
563
|
```
|
|
478
564
|
|
|
479
565
|
`--live` targets only `prod`, enables every configured service, provisions its
|
|
@@ -514,16 +600,22 @@ credential set.
|
|
|
514
600
|
the exact project id does not exist yet, approval reserves that id for this
|
|
515
601
|
credential instead of failing: the credential may create only that app once,
|
|
516
602
|
and Registry binds its reviewed grant to the new app incarnation.
|
|
517
|
-
Every real CLI handshake prints exactly one canonical `/studio?code=…` URL
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
603
|
+
Every real CLI handshake prints exactly one canonical `/studio?code=…` URL.
|
|
604
|
+
Interactive humans may use the CLI's best-effort browser launch. Agents use
|
|
605
|
+
the current published CLI with `--no-open --wait 600`, immediately surface
|
|
606
|
+
that exact URL and code as a clickable human approval action, and preserve
|
|
607
|
+
the same foreground process:
|
|
608
|
+
|
|
609
|
+
```bash
|
|
610
|
+
npx --yes @odla-ai/cli@latest auth login --app <appId> --email <odla-account> --no-open --wait 600
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
The CLI owns protocol polling. An agent must not call OS `open`, use browser
|
|
614
|
+
control, curl a handshake endpoint, build a shell wait loop, detach the
|
|
615
|
+
process, or start a substitute handshake. The device code stays only in the
|
|
616
|
+
running process. If that process exits 75, the old code cannot be collected;
|
|
617
|
+
a later invocation requests a new code and never resumes an older request
|
|
618
|
+
from `.odla/`.
|
|
527
619
|
2. Creates the platform app if needed. For a new id, this consumes the exact-id
|
|
528
620
|
reservation approved in step 1; it is not ambient project-creation authority.
|
|
529
621
|
3. Enables configured services in every configured environment. Calendar
|
|
@@ -568,8 +660,8 @@ working sibling runtime.
|
|
|
568
660
|
Inventory and retire one successful deployment without disturbing any sibling:
|
|
569
661
|
|
|
570
662
|
```sh
|
|
571
|
-
npx @odla-ai/cli credentials list --env dev
|
|
572
|
-
npx @odla-ai/cli credentials revoke <receipt-id>
|
|
663
|
+
npx --yes @odla-ai/cli@latest credentials list --env dev
|
|
664
|
+
npx --yes @odla-ai/cli@latest credentials revoke <receipt-id>
|
|
573
665
|
```
|
|
574
666
|
|
|
575
667
|
The inventory contains only receipt, target, state, and timestamp metadata.
|
|
@@ -580,7 +672,7 @@ Verify a deployment that intentionally keeps db/o11y credentials only on the
|
|
|
580
672
|
Worker:
|
|
581
673
|
|
|
582
674
|
```sh
|
|
583
|
-
npx @odla-ai/cli smoke --env dev --runtime
|
|
675
|
+
npx --yes @odla-ai/cli@latest smoke --env dev --runtime
|
|
584
676
|
```
|
|
585
677
|
|
|
586
678
|
Runtime smoke never reads `.odla/credentials.local.json`. It checks Registry
|
|
@@ -742,10 +834,10 @@ or SSH `origin`; pass `--repo owner/name` when it cannot. It opens GitHub's
|
|
|
742
834
|
installation/authorization page and polls that exact odla attempt:
|
|
743
835
|
|
|
744
836
|
```bash
|
|
745
|
-
npx odla-ai security github connect --env dev
|
|
746
|
-
npx odla-ai security plan --env dev
|
|
747
|
-
npx odla-ai security sources --env dev
|
|
748
|
-
npx odla-ai security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
|
|
837
|
+
npx --yes @odla-ai/cli@latest security github connect --env dev --no-open
|
|
838
|
+
npx --yes @odla-ai/cli@latest security plan --env dev
|
|
839
|
+
npx --yes @odla-ai/cli@latest security sources --env dev
|
|
840
|
+
npx --yes @odla-ai/cli@latest security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
|
|
749
841
|
```
|
|
750
842
|
|
|
751
843
|
`security plan` is the owner-readable disclosure preflight. It shows the exact
|
|
@@ -868,7 +960,7 @@ LLM-usage records. The human owns the device approval, production consent, and
|
|
|
868
960
|
explicit destructive rotation. Studio is where people view telemetry and
|
|
869
961
|
perform manual recovery, configure System AI, and inspect app/run-attributed
|
|
870
962
|
platform usage; its o11y token control is not the normal setup path.
|
|
871
|
-
Run `npx odla-ai capabilities` for the human-readable contract or add `--json`
|
|
963
|
+
Run `npx --yes @odla-ai/cli@latest capabilities` for the human-readable contract or add `--json`
|
|
872
964
|
when an agent or tool needs to branch on it without scraping prose.
|
|
873
965
|
|
|
874
966
|
`setup` (and `skill install`) installs one complete offline runbook bundle at
|
package/REQUIREMENTS.md
CHANGED
|
@@ -60,6 +60,12 @@ Agnacl, but none should mention or special-case Agnacl.
|
|
|
60
60
|
- Every real CLI handshake must attempt to open that canonical approval URL,
|
|
61
61
|
including in CI, SSH, display-less, and agent-driven shells. `--no-open` is
|
|
62
62
|
the only production suppression; failures must visibly repeat the manual action.
|
|
63
|
+
- Installed agent instructions must require `--no-open --wait 600`, an explicit
|
|
64
|
+
clickable human approval checkpoint, and preservation of the same foreground
|
|
65
|
+
CLI process. They must prohibit OS `open`, browser-control opening, direct
|
|
66
|
+
handshake polling, shell wait loops, detached execution, and replacement
|
|
67
|
+
handshakes while that process is alive. Exit 75 must be described as loss of
|
|
68
|
+
the in-memory device code; a later invocation creates a fresh code.
|
|
63
69
|
- Cached developer tokens must be mode `0600`, gitignored, and reused until
|
|
64
70
|
expiry.
|
|
65
71
|
- Minted developer tokens must have a metadata-only inventory (owner, label,
|