@uru-intelligence/cli 0.3.61 → 0.4.12

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.
Files changed (5) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +109 -19
  3. package/dist/library.mjs +4439 -1704
  4. package/dist/uru.mjs +9738 -2806
  5. package/package.json +63 -60
package/CHANGELOG.md ADDED
@@ -0,0 +1,69 @@
1
+ # Uru CLI changelog
2
+
3
+ > Generated from `changes/cli/*.json`. Do not edit release rows by hand.
4
+
5
+ ## Unreleased
6
+
7
+ ### Breaking
8
+
9
+ - gem.validate and gem.build return a hosted job id immediately. Pass --wait to poll gem.build_job until the compile settles. — surfaces: cli, docs; reference: skills/uru-gems/SKILL.md
10
+ - Action: Update agents and scripts that expected a compiler result from uru gems validate or uru gems build. Print or store hosted_job_id, then poll gem.build_job, or pass --wait.
11
+
12
+ ### Security
13
+
14
+ - Bind npm publication to an attested candidate tarball and require the published cli_pin matrix before release success. — surfaces: cli, release; reference: docs/plans/cli-sdk-native-release-modernization/PLAN.md
15
+ - Action: Release operators must supply the exact candidate run, attempt, release-evidence artifact ID, and MCP commit to the protected publish workflow.
16
+ - Stop uru mcp config and install from printing or writing a live API token. Generated MCP config now points at the URU_API_KEY environment variable. — surfaces: cli; reference: apps/cli/src/local-commands.ts
17
+ - Action: Set URU_API_KEY in the MCP client environment. uru mcp config no longer embeds the current CLI token.
18
+
19
+ ### Added
20
+
21
+ - Add `uru link --verify` for local link diagnostics and `uru gems links create --verify` to run browser verification after link creation. — surfaces: cli, docs; reference: apps/cli/src/workspace-commands.ts
22
+ - Action: Use `uru link --verify` to confirm `.uru/project.json` and the remote Gem still resolve before source work. After `uru gems links create`, add `--verify` to run `gem.browser_verify` on the new Link's Gem.
23
+ - Add a side-effect-free internal CLI library entrypoint with a typed whoami foundation. _(internal)_ — surfaces: cli, sdk; reference: docs/plans/cli-sdk-native-release-modernization/DECISION_RECORDS.md
24
+ - Action: Programmatic callers must pass an explicit token and workspace; no public SDK compatibility promise is introduced.
25
+ - Add direct CLI access to Home pins and Focus rules from the shared operation registry. — surfaces: cli, docs; reference: content/docs/home.mdx
26
+ - Action: Use uru home <operation> --params-json '{...}' or the matching home.* operation ID.
27
+ - Add first-class CLI verbs for Gem filesystem, deploy, build diagnostics, components, page verify, public-tool delegations, and bindings. — surfaces: cli, docs; reference: docs/reference/uru-cli-mcp-operations.md
28
+ - Action: Use uru gems fs, uru gems deploy, uru gems build logs|inspect, uru gems verify, uru gems components, uru gems delegations, and uru gems bindings. These wrap existing gem.* operations.
29
+ - Add first-class Dataset list/history/jobs/inspect verbs and a uru distribution group for the 17 collection operations. — surfaces: cli, docs; reference: content/docs/guides/cli.mdx
30
+ - Action: Use uru datasets ls|inspect|history|jobs and uru distribution list|get|create|update. Dataset SQL stays uru datasets sql. DATA-008 export/typegen is not added.
31
+ - Add first-class Library upload, patch-preview, and favorite verbs, plus automations validate, delete, graph-patch, triggers, connections, and update. — surfaces: cli, docs; reference: docs/reference/uru-cli-mcp-operations.md
32
+ - Action: Use uru library upload|patch-preview|favorite and uru automations validate|delete|graph-patch|triggers|connections|update instead of operations run for those catalog ids. library write --create now accepts --folder-id.
33
+ - Add first-class uru gems bindings and uru gems api commands so tool-call source and connection bindings stay separate. — surfaces: cli; reference: apps/cli/src/gem-lifecycle-resource-commands.ts
34
+ - Action: Use uru gems bindings list|upsert|resolve to attach connections, and uru gems api describe|query|action|job to run declared Gem capabilities. Do not put connection ids in Gem source.
35
+ - Add MCP list/target commands, auth status, text-mode list tables, and regenerate the full CLI/MCP operations reference. — surfaces: cli, docs; reference: docs/reference/uru-cli-mcp-operations.md
36
+ - Action: Use uru mcp list, uru auth status, and uru docs search. List commands print tables in text mode; --json stays JSON. Prefer ${URU_API_KEY} in generated MCP config.
37
+ - Add TTY visual chrome for help, tables, doctor, and login without changing JSON or pipe output. — surfaces: cli; reference: apps/cli/src/visual.ts
38
+ - Action: No action is required. Color and box drawing appear only on a color TTY. Use --no-color, CI, or a pipe to keep the previous plain text.
39
+ - Add uru tools inspect and uru operations inspect, and accept --params-json @file or @- for large tool parameters. — surfaces: cli; reference: apps/cli/src/command-spec.ts
40
+ - Action: Use uru tools inspect <name> or uru operations inspect <operation-id> to print a contract. Pass --params-json @path.json or --params-json @- to load parameters from a file or stdin.
41
+ - Make uru update compare this CLI to the latest npm version and add --check --json. — surfaces: cli; reference: apps/cli/src/update-check.ts
42
+ - Action: No action is required. uru update never installs itself. Run uru update --check --json for machine output, or npm install -g @uru-intelligence/cli@latest to install.
43
+
44
+ ### Changed
45
+
46
+ - `uru logs --follow` streams Gem runtime logs over SSE for up to 30 minutes and falls back to polling when the stream route is missing. — surfaces: cli; reference: apps/cli/src/gem-lifecycle-commands.ts
47
+ - Action: No action is required. `--follow-duration-ms` now accepts up to 30 minutes (was 5).
48
+
49
+ ### Fixed
50
+
51
+ - JSON output for destructive CLI operations refused without `--yes` now includes `confirmationRequired: true` and a copy-paste `suggestedCommand` with `--yes` appended. — surfaces: cli; reference: apps/cli/src/cli-runtime.ts
52
+ - Action: No action is required. Agents and scripts can read `suggestedCommand` from JSON errors instead of guessing the confirmation flag.
53
+ - Keep the CLI login when you switch workspace. A leftover workspace from a previous switch no longer poisons the next login. `uru switch` marks the current workspace in the list. — surfaces: cli; reference: apps/cli/src/oauth-credential.ts
54
+ - Action: No action is required. After you switch workspace, the next command keeps the same login. A new login writes only the workspace the login response selected.
55
+ - Recover from a revoked CLI session without reusing the dead JWT. When the API returns `session_revoked`, the CLI now rotates the stored OAuth login once or clears it instead of sending the revoked token until local expiry. — surfaces: cli; reference: apps/cli/src/cli.ts
56
+ - Action: No action is required. Failures of this class now carry the `session_revoked` error code so they can be distinguished from a generic `auth_required` response.
57
+ - Report a non-JSON API response as what it is. A proxy or firewall that answers with an HTML page now produces the HTTP status and content type instead of `Unexpected token '<', "<!DOCTYPE "... is not valid JSON`. — surfaces: cli; reference: apps/cli/src/client.ts
58
+ - Action: No action is required. Failures of this class now carry the `non_json_response` error code, keep the auth exit code on a 401, and print a tip naming the likely cause.
59
+ - Report what a rejected credential actually means: `uru doctor` now runs a read-only data call instead of trusting `uru whoami`, API error envelopes are read in full, and auth advice follows where the token came from. — surfaces: cli; reference: apps/cli/src/doctor.ts
60
+ - Action: No action is required. `uru doctor` gains a `data access` check and fails when a credential validates but cannot execute tools; a token supplied through `--token` or `URU_TOKEN` is no longer told to run `uru login`.
61
+ - Send scope on uru automations create, honor --output/--json on uru tools run, and keep errorId plus httpStatus on JSON errors. — surfaces: cli; reference: apps/cli/src/local-commands.ts
62
+ - Action: uru automations create now sends scope=workspace by default. Pass --scope personal when creating a personal automation. JSON errors include errorId and httpStatus when the API provides them.
63
+ - Use the shared SemVer contract when deciding whether to show a CLI update notice. — surfaces: cli, release; reference: docs/plans/cli-sdk-native-release-modernization/PLAN.md
64
+ - Action: No action is required; prerelease and malformed registry versions now follow the same validation and ordering rules as release publication.
65
+
66
+ ### Internal
67
+
68
+ - Retain an executable compatibility probe for the paused Stricli migration decision. _(internal)_ — surfaces: cli; reference: docs/plans/cli-sdk-native-release-modernization/DECISION_RECORDS.md
69
+ - Action: Do not adopt Stricli until a pinned upstream release passes this probe and the required seven-slice hard-cut proof.
package/README.md CHANGED
@@ -46,7 +46,7 @@ bun src/index.ts gems versions diff 'library/Golden Gems/My Gem.gem' 13 14
46
46
  bun src/index.ts gems versions restore 'library/Golden Gems/My Gem.gem' 12
47
47
  bun src/index.ts gems releases create 'library/Golden Gems/My Gem.gem' 14
48
48
  bun src/index.ts gems releases list 'library/Golden Gems/My Gem.gem'
49
- bun src/index.ts gems links create 'library/Golden Gems/My Gem.gem' --name Client --version 14
49
+ bun src/index.ts gems links create 'library/Golden Gems/My Gem.gem' --name Client --pin --version 14
50
50
  bun src/index.ts gems links set-version 'library/Golden Gems/My Gem.gem' <link-id> 14
51
51
  bun src/index.ts gems runs list 'library/Golden Gems/My Gem.gem'
52
52
  bun src/index.ts gems runs show 'library/Golden Gems/My Gem.gem' <run-id>
@@ -61,30 +61,47 @@ bun src/index.ts library search revenue
61
61
  bun src/index.ts library mkdir 'library/Golden Gems'
62
62
  bun src/index.ts library read 'library/Contexts/Client Brief.md'
63
63
  bun src/index.ts library write 'library/Contexts/Client Brief.md' --file ./brief.md --create
64
- bun src/index.ts library write 'library/Prompts/Sales Email.md' --content "Draft the follow-up." --create
64
+ bun src/index.ts library write 'library/Prompts/Sales Email.md' --content "Draft the follow-up." --create --folder-id <folder-id>
65
+ bun src/index.ts library patch-preview 'library/Prompts/Sales Email.md' --content "*** Begin Patch\n..."
66
+ bun src/index.ts library favorite 'library/Contexts/Client Brief.md'
67
+ bun src/index.ts library upload 'library/Assets/logo.png' --file ./logo.png
68
+ bun src/index.ts library upload complete --upload-id <id> --bucket <bucket> --object-path <path> --filename logo.png --size-bytes 1024
65
69
  bun src/index.ts library patch 'library/Prompts/Sales Email.md' --stdin
66
70
  bun src/index.ts library cp 'library/Notes/Brief.md' 'library/Archive/Brief.md'
67
71
  bun src/index.ts library mv 'library/Notes/Draft.md' 'library/Notes/Final.md'
68
72
  bun src/index.ts library rm 'library/Notes/Old.md'
69
73
  bun src/index.ts library restore 'library/Notes/Old.md'
74
+ bun src/index.ts datasets ls --limit 50 --json
70
75
  bun src/index.ts datasets query revenue_rows --limit 50 --response-format concise --json
71
- bun src/index.ts library ls --params-json '{"path":"library","resource_type":"dataset"}'
72
- # Copy the exact resourceSlug from Library discovery; never infer it from name.
73
- bun src/index.ts datasets get --params-json '{"dataset_id":"revenue-rows"}'
74
- bun src/index.ts datasets rows-upsert --params-json '{"dataset_id":"revenue-rows","rows":[{"name":"Acme"}]}'
75
- bun src/index.ts datasets manage-create --params-json '{"title":"Revenue Rows","data_schema":{"properties":[]}}'
76
+ # Registry-family commands accept canonical camelCase fields and adapt them at
77
+ # the tool-protocol boundary.
78
+ bun src/index.ts datasets get revenue-rows
79
+ bun src/index.ts datasets history revenue-rows --limit 20
80
+ bun src/index.ts datasets jobs revenue-rows --limit 20
81
+ bun src/index.ts datasets rows --params-json '{"op":"upsert","datasetId":"revenue-rows","rows":[{"name":"Acme"}]}'
82
+ bun src/index.ts datasets create --params-json '{"title":"Revenue Rows","properties":[{"clientKey":"name","name":"Name","type":"title","required":true,"nullable":false,"position":0,"config":{}}]}'
83
+ bun src/index.ts datasets sql --params-json '{"sql":"SELECT 1"}'
84
+ bun src/index.ts distribution list --limit 20
85
+ bun src/index.ts distribution get <collection-id>
86
+ bun src/index.ts distribution create "Client pack" --scope workspace
76
87
 
77
88
  # Automation helpers over the platform tool surface.
78
- bun src/index.ts automations ls --status active --view summary
89
+ bun src/index.ts automations ls --limit 100
79
90
  bun src/index.ts automations get <automation-id>
80
91
  bun src/index.ts automations create "Daily revenue digest" --status draft
92
+ bun src/index.ts automations update <automation-id> --description "Nightly digest"
81
93
  bun src/index.ts automations enable <automation-id>
94
+ bun src/index.ts automations validate <automation-id> --mode structural --graph-json '{}'
95
+ bun src/index.ts automations graph-patch <automation-id> --patch-json '{"ops":[]}'
96
+ bun src/index.ts automations triggers list <automation-id>
97
+ bun src/index.ts automations connections list
98
+ bun src/index.ts automations delete <automation-id> --yes
82
99
  bun src/index.ts automations trigger <automation-id> --input-message "Run now"
83
100
  bun src/index.ts automations runs ls <automation-id> --scope workspace --limit 20
84
101
  bun src/index.ts automations runs tail <run-id> --level warn
85
102
  bun src/index.ts automations runs cancel <run-id> --yes
86
103
 
87
- # Raw platform-tool escape hatch for diagnostics and parity.
104
+ # Raw platform-tool escape hatch for diagnostics and low-level operations.
88
105
  bun src/index.ts tools ls
89
106
  bun src/index.ts tools schema gem_control_plane --json
90
107
  bun src/index.ts tools run gem_control_plane --params-json '{"op":"inspect","path":"library/Golden Gems/My Gem.gem"}'
@@ -95,16 +112,27 @@ bun src/index.ts operations ls --family automations
95
112
  bun src/index.ts operations run gem.inspect --params-json '{"path":"library/Golden Gems/My Gem.gem"}'
96
113
  bun src/index.ts library search "client brief"
97
114
  bun src/index.ts docs library_fs
115
+ bun src/index.ts docs search library_fs
98
116
  bun src/index.ts api platform/tools/search_tools/execute -F query=gem
117
+ bun src/index.ts api /api/platform/tools/search_tools/execute -F query=gem
99
118
 
100
- # MCP client config helper. Prefer a scoped API key for real installs.
119
+ # MCP client config helper. Prefer ${URU_API_KEY} or --api-key. List never prints keys.
120
+ bun src/index.ts mcp list
121
+ bun src/index.ts mcp list --target cursor
101
122
  bun src/index.ts mcp config --api-key "$URU_API_KEY"
123
+ bun src/index.ts mcp install --target cursor
102
124
  bun src/index.ts mcp install --path ~/.config/claude-code/mcp.json --api-key "$URU_API_KEY"
125
+ bun src/index.ts mcp remove --target cursor
126
+
127
+ # Local auth facts. Never prints a JWT.
128
+ bun src/index.ts auth status --json
129
+ bun src/index.ts doctor --json
103
130
 
104
131
  # Local shell integration.
105
132
  bun src/index.ts complete bash
106
133
  bun src/index.ts complete zsh
107
134
  bun src/index.ts complete fish
135
+ bun src/index.ts complete powershell
108
136
  ```
109
137
 
110
138
  Generated MCP configs use non-interactive `npx -y` and pin
@@ -140,7 +168,7 @@ explicit token/API-key paths:
140
168
  - `uru login --token ...` stores the token in OS credential storage when available: macOS Keychain, Linux `secret-tool`/libsecret, or Windows Credential Manager via PowerShell
141
169
  - `uru login --token ... --insecure-storage` is the explicit plaintext fallback
142
170
  - Linux token storage requires `secret-tool` (often installed as `libsecret-tools`); Windows token storage requires PowerShell access to Credential Manager. If the OS store is unavailable, login fails closed with an actionable `--insecure-storage` fallback message.
143
- - browser/device credentials renew within five minutes of session expiry and when switching workspaces
171
+ - browser/device credentials renew within five minutes of session expiry. A workspace switch is request scope and does not rotate the login.
144
172
  - interactive commands with missing or expired stored auth start browser login and then retry the command without printing login success text to stdout
145
173
  - `--no-input` disables implicit login and exits `4` when authentication is missing
146
174
  - `uru logout` invalidates the current CLI session, revokes the renewable OAuth credential, and clears local auth state
@@ -150,6 +178,9 @@ explicit token/API-key paths:
150
178
  - config file permissions: `0600`
151
179
  - linked project state: `.uru/project.json` with `{workspaceId, gemId, libraryPath}`
152
180
  - no credentials are written to `.uru/project.json`
181
+ - `uru auth status` reports logged-in / workspace / storage / expiry and never prints a JWT. `uru whoami` stays a server identity call.
182
+ - `uru switch` sets the local default workspace. `uru link` binds this directory to one Gem. `--workspace` / `URU_WORKSPACE_ID` override one invocation.
183
+ - The screen says Agent; Library paths and schemas say persona (`library/Agents/Name.persona.md`).
153
184
  - Gem-scoped deploy tokens for CI use `uru tokens create|ls|revoke`
154
185
  - `uru tokens create` requires `--name` plus exactly one lifetime flag:
155
186
  `--expiry <duration>` or `--expires-at <iso timestamp>`
@@ -162,6 +193,21 @@ explicit token/API-key paths:
162
193
  file
163
194
  - `uru env run -- <cmd>` overlays local values and redacts all non-empty values from captured output
164
195
 
196
+ ## CI cookbook
197
+
198
+ Use a Gem-scoped token, never a session JWT, and fail closed:
199
+
200
+ ```bash
201
+ uru tokens create 'library/Golden Gems/My Gem.gem' --name CI --expiry 30d --json
202
+ export URU_TOKEN=<token-from-create-once>
203
+ export URU_WORKSPACE_ID=<workspace-id>
204
+ uru --no-input doctor --json
205
+ uru --no-input auth status --json
206
+ uru --no-input whoami --json
207
+ ```
208
+
209
+ `--no-input` exits instead of opening a browser. `auth status` and `doctor` warn if the token lives in `--insecure-storage` and do not print the token. `env pull` writes names only; it does not download secret values.
210
+
165
211
  ## Install shape
166
212
 
167
213
  The package name is `@uru-intelligence/cli`; the installed binary is still `uru`:
@@ -178,6 +224,17 @@ For one-off usage:
178
224
  printf '%s' "$URU_TOKEN" | npx @uru-intelligence/cli whoami --token-stdin --json
179
225
  ```
180
226
 
227
+ The package root is a side-effect-free library entry. It does not execute a
228
+ command, read local CLI configuration, install signal handlers, write output,
229
+ or start network activity on import. The package currently exposes only the
230
+ fail-closed internal `createUruClient` foundation: callers must supply a token
231
+ and an explicit workspace, every call accepts cancellation, and it validates
232
+ the authenticated workspace before returning a typed result. DG-1 has not
233
+ accepted a public high-level SDK compatibility promise, so no broader SDK or
234
+ raw API surface is implied by this export. The executable remains the `uru`
235
+ binary; `@uru-intelligence/cli/cli` is an explicit executable subpath for
236
+ packaging tools, not an SDK API.
237
+
181
238
  ## Release validation
182
239
 
183
240
  Before publishing, run the full local CLI gate and the staging CLI/MCP smoke with a staging-scoped token. The smoke reads credentials from env or macOS Keychain and never prints the token. To avoid putting a token in shell history, store it as `uru_staging_smoke_token` with `security add-generic-password -a "$USER" -s uru_staging_smoke_token -w '<token>' -U`.
@@ -191,14 +248,47 @@ URU_CLI_MCP_STAGING_SMOKE_TARGET=staging \
191
248
  ```
192
249
 
193
250
  Publish the scoped CLI only through the **Publish Uru CLI to npm** workflow on
194
- `main`. It first verifies that the exact pinned `uru-mcp` release exists, runs
195
- release validation, publishes through npm trusted publishing from a
196
- GitHub-hosted runner in the protected `production` environment, and then
197
- requires a separate live-registry job to verify the exact published version.
198
- The registry smoke intentionally runs `npm exec` from a clean OS temporary
199
- directory so the monorepo workspace cannot shadow the published package. The
200
- source repository is private, so npm OIDC authenticates the publish without a
201
- long-lived token but cannot emit a public provenance attestation.
251
+ `main`. A release request must identify the candidate certification workflow
252
+ run ID, attempt, and exact retained bundle artifact ID; the publisher never
253
+ selects `latest` evidence. Before it reads the release record, it verifies the
254
+ candidate's GitHub DSSE/in-toto artifact attestations for both the canonical
255
+ release record and the exact `uru_cli.tgz`, pins the builder repository,
256
+ candidate workflow path, development ref policy, run/attempt, predicate type,
257
+ and source-bundle identity, then recomputes the build-input inventory at
258
+ `main`.
259
+
260
+ The workflow publishes that retained tarball from a sterile private temporary
261
+ directory with `npm publish --ignore-scripts`; it never rebuilds, repacks, or
262
+ rewrites it. npm trusted publishing runs only from the protected `production`
263
+ environment. The registry smoke compares npm `dist.integrity` to the certified
264
+ SRI and runs `npm exec` from a clean OS temporary directory so the monorepo
265
+ workspace cannot shadow the published package. It then invokes the complete
266
+ published `cli_pin` certification matrix for both staging and production. A
267
+ value-free publication-state artifact records the observed npm SRI even when a
268
+ publish response or a later gate fails. Re-dispatching the same immutable
269
+ candidate selector resumes only when npm already serves that exact certified
270
+ SRI; it then repeats the registry and published-matrix proof before evidence,
271
+ tag, or GitHub release creation. A different SRI fails closed. A changed source
272
+ or failed certification needs a higher-version forward fix; no npm version is
273
+ ever rewritten.
274
+
275
+ The workflow requires the immutable, no-bypass CLI tag policy before npm
276
+ publication and revalidates it before tag creation. GitHub hides a ruleset's
277
+ bypass actors from an ordinary workflow token, so the two policy-check steps
278
+ mint a short-lived, repository-scoped GitHub App token solely to inspect that
279
+ property. The App's client ID is the `production` environment variable
280
+ `CLI_RULESET_AUDIT_APP_CLIENT_ID`; its private key is the matching
281
+ `CLI_RULESET_AUDIT_APP_PRIVATE_KEY` environment secret. Its administration
282
+ write grant is required for visibility only and is never available to the npm
283
+ publication step or the tag/release creation step. Only after published evidence
284
+ is retained does the workflow create the annotated
285
+ `uru-cli-vX.Y.Z` tag at the exact dispatched `main` commit and a GitHub release
286
+ with generated notes. The final job verifies an existing tag is annotated and
287
+ points to that same commit before it can resume an interrupted GitHub-release
288
+ request; it never changes the npm package, repoints a tag, or treats a draft or
289
+ prerelease as success. Before the first use, repository policy must contain an
290
+ active, no-bypass `refs/tags/uru-cli-v*` rule that blocks both updates and
291
+ deletions; the workflow queries and requires it before creating the tag.
202
292
 
203
293
  ```bash
204
294
  bun --filter=@uru-intelligence/cli run smoke:registry