@odla-ai/cli 0.7.1 → 0.9.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/README.md CHANGED
@@ -29,8 +29,8 @@ For a project you keep working in, install it as a dev dependency so the
29
29
  shorter `npx odla-ai` form works and the version is pinned by your lockfile:
30
30
 
31
31
  ```bash
32
- npm view @odla-ai/cli@0.7.1 version
33
- npm i -D --save-exact @odla-ai/cli@0.7.1
32
+ npm view @odla-ai/cli@0.9.0 version
33
+ npm i -D --save-exact @odla-ai/cli@0.9.0
34
34
  ```
35
35
 
36
36
  ## Prerequisites
@@ -59,7 +59,15 @@ npx odla-ai provision --dry-run
59
59
  npx odla-ai provision --write-dev-vars --push-secrets
60
60
  npx odla-ai smoke --env dev
61
61
  npx odla-ai secrets push --env dev
62
+ npx odla-ai secrets set clerk_webhook_secret --env dev --stdin
63
+ npx odla-ai secrets set-clerk-key --env dev --from-env CLERK_SECRET_KEY
62
64
  npx odla-ai security run . --env dev --ack-redacted-source
65
+ npx odla-ai security github connect --env dev # infers owner/name from git origin
66
+ npx odla-ai security plan --env dev
67
+ npx odla-ai security sources --env dev
68
+ npx odla-ai security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
69
+ npx odla-ai security status <job-id>
70
+ npx odla-ai security report <job-id>
63
71
  npx odla-ai admin ai show
64
72
  npx odla-ai admin ai models
65
73
  npx odla-ai admin ai set security --discovery-provider anthropic --discovery-model claude-opus-4-8 --validation-provider openai --validation-model gpt-5.5 --enabled
@@ -127,7 +135,7 @@ when provisioning has not written `.odla/credentials.local.json`.
127
135
 
128
136
  The bundled build/migration skills add a passive pre-ship gate with
129
137
  `@odla-ai/security`: after the exact-version availability check, run
130
- `npm i -D --save-exact @odla-ai/security@0.2.1`, then
138
+ `npm i -D --save-exact @odla-ai/security@0.2.2`, then
131
139
  `npx odla-security scan . --profile odla --out .odla/security/pre-ship --fail-on high --fail-on-candidates critical`.
132
140
  The passive scan remains a separate binary: it makes no model calls and does
133
141
  not execute target code. After explicit redacted-source approval,
@@ -152,12 +160,74 @@ carries a bounded `Retry-After` only when the upstream supplied one. The CLI
152
160
  does not echo arbitrary response text or silently change the admin-selected
153
161
  model.
154
162
  Before installing the exact release, require
155
- `npm view @odla-ai/security@0.2.1 version` to succeed before installation. An
163
+ `npm view @odla-ai/security@0.2.2 version` to succeed before installation. An
156
164
  exact-version `E404` means the release is unavailable, not that the security
157
165
  preflight passed, and does not prove the package name is absent. odla's own
158
166
  engineering environment uses an equivalent internal gate; customer projects
159
167
  should use the published `odla-security` command above.
160
168
 
169
+ For a server-side, commit-pinned review, connect one repository through the
170
+ source-read-only odla GitHub App. The CLI infers `owner/name` from a safe GitHub HTTPS
171
+ or SSH `origin`; pass `--repo owner/name` when it cannot. It opens GitHub's
172
+ installation/authorization page and polls that exact odla attempt:
173
+
174
+ ```bash
175
+ npx odla-ai security github connect --env dev
176
+ npx odla-ai security plan --env dev
177
+ npx odla-ai security sources --env dev
178
+ npx odla-ai security run --source <source-id> --ref main --env dev --plan-digest <digest-from-security-plan> --ack-redacted-source
179
+ ```
180
+
181
+ `security plan` is the owner-readable disclosure preflight. It shows the exact
182
+ admin-selected discovery and validation provider/model, immutable policy
183
+ versions, per-route call/input/output bounds, prompt bundle,
184
+ redaction/report contracts, credential readiness, provider independence,
185
+ report retention, the no-target-execution boundary, and a digest covering that
186
+ complete processing contract.
187
+ `security sources` includes the same plan (and returns `{ plan, sources }` with
188
+ `--json`). A source run fetches it again and refuses to enqueue while either
189
+ route is disabled, lacks a usable platform credential, or is not independently
190
+ routed. Copy the displayed digest into `--plan-digest`; the CLI requires it in
191
+ addition to `--ack-redacted-source` and refuses to let a generic acknowledgement
192
+ silently approve a refetched plan. The enqueue request carries the plan digest
193
+ and both expected policy versions. After verifying the user-supplied plan
194
+ digest, the CLI fetches and prints odla.ai's exact source/ref/profile execution
195
+ intent. A second server-computed digest binds that selection, the redacted
196
+ disclosure, and the plan digest; the CLI sends it as
197
+ `expectedExecutionDigest`. A concurrent selection or admin change returns
198
+ `intent_conflict`, `plan_conflict`, `policy_conflict`, or `security_ai_not_ready` instead of
199
+ silently switching providers or models. Fetch and review a fresh `security
200
+ plan`, then explicitly acknowledge its new digest.
201
+ An omitted `--ref` is previewed as the source's explicit current default-branch
202
+ name. If that default changes before enqueue, odla.ai rejects the stale intent;
203
+ it never defers the choice to GitHub HEAD at Workflow execution time.
204
+
205
+ The source job defaults to follow, renders the normalized report, and applies
206
+ the same `--fail-on high`, `--fail-on-candidates critical`, and incomplete
207
+ coverage gate; use `--no-follow` only to enqueue. `security status <job-id>` and
208
+ `security report <job-id>` recover or inspect a prior job. `security github
209
+ disconnect --source <source-id> --env dev --yes` revokes odla's saved source
210
+ without requiring a GitHub-side uninstall.
211
+
212
+ The client sends only the opaque odla `sourceId`, ref, profile, and explicit
213
+ `sourceDisclosure: "redacted"`; it has no PAT, GitHub installation id, provider
214
+ key, provider, or model flag. odla.ai verifies repository access, resolves the
215
+ ref to an immutable commit SHA, fetches the bounded snapshot server-side, and
216
+ routes bounded best-effort credential-pattern-redacted snippets through the admin-selected System AI discovery
217
+ and independent-validation models. GitHub read authorization is **not** source
218
+ disclosure consent, which is why `--ack-redacted-source` remains required.
219
+ The retained schema has no archive, file-body, explicit source-excerpt, context
220
+ packet, raw provider-response, execution-trace, or reproduction-output field.
221
+ The private normalized report does retain bounded best-effort credential-pattern-redacted
222
+ model-derived prose and repository-relative paths for up to 90 days, so treat
223
+ it as sensitive because that prose can reveal source semantics or an
224
+ unrecognized secret. GitHub and
225
+ provider retention/residency terms remain separate. GitHub
226
+ Checks contain counts/coverage and link to the authenticated Studio report.
227
+ Target code is not executed, and even complete coverage is not proof of
228
+ security; unscheduled, shallow, blocked, budget-exhausted, and projection-
229
+ truncated work stays visible.
230
+
161
231
  `admin ai show|models|set|credentials|credential set|usage|audit` manages platform-funded System
162
232
  AI (`o11y.triage`, `security.discovery`, `security.validation`). It uses a
163
233
  separate, mode-`0600` `.odla/admin-token.local.json` cache. Studio displays the
@@ -193,6 +263,22 @@ redacted plan without spawning anything. For the normal path, use
193
263
  `provision --write-dev-vars --push-secrets` so service enablement, credential
194
264
  issuance, local config, and deployed secret transfer stay one composition.
195
265
 
266
+ `secrets set <name> --env <env>` stores one named secret in that env's tenant
267
+ vault — the same write-only slot Studio's Secrets panel fills (for example
268
+ `clerk_webhook_secret` for synced auth). The value may come only from
269
+ `--from-env <NAME>` or `--stdin`, so a producer command pipes straight into the
270
+ vault without the secret ever appearing on argv, in output, or in an agent's
271
+ transcript; it is encrypted at rest and readable back only by that tenant's
272
+ app API key, never by the CLI, Studio, or the developer token. `$`-prefixed
273
+ names are platform-reserved. `secrets set-clerk-key --env <env>` stores the
274
+ app's Clerk secret key in the reserved `$clerk_secret` slot so the platform can
275
+ resolve the app's users (invites, member lookups); reserved secrets are never
276
+ readable by app keys. It refuses an `sk_test_` key for a prod-named env and
277
+ requires `--yes` to put an `sk_live_` key into a non-prod env, since live users
278
+ would sync into a non-prod tenant. Both commands authenticate with the
279
+ developer token (`$ODLA_DEV_TOKEN`, the cached token, or a fresh device
280
+ approval), and prod-named envs require `--yes`, matching `secrets push`.
281
+
196
282
  ## Who does what
197
283
 
198
284
  If a change is deterministic from `odla.config.mjs`, the CLI owns it: app and