@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 +90 -4
- package/dist/bin.cjs +1113 -257
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-643B2AKG.js → chunk-MJYQ7YDH.js} +1075 -195
- package/dist/chunk-MJYQ7YDH.js.map +1 -0
- package/dist/index.cjs +1156 -259
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +188 -26
- package/dist/index.d.ts +188 -26
- package/dist/index.js +33 -3
- package/llms.txt +286 -33
- package/package.json +3 -3
- package/skills/odla/SKILL.md +8 -1
- package/skills/odla/references/build.md +17 -2
- package/skills/odla/references/sdks.md +2 -2
- package/skills/odla-migrate/references/phase-2-db.md +2 -2
- package/skills/odla-migrate/references/phase-3b-user-sync.md +15 -8
- package/skills/odla-migrate/references/phase-5-cutover.md +8 -2
- package/skills/odla-migrate/references/secrets-map.md +16 -2
- package/dist/chunk-643B2AKG.js.map +0 -1
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.
|
|
33
|
-
npm i -D --save-exact @odla-ai/cli@0.
|
|
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.
|
|
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.
|
|
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
|