@rosthq/cli 0.5.29 → 0.5.31

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgPnG;AA+bD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmPnG;AA6cD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
package/dist/index.js CHANGED
@@ -41758,7 +41758,7 @@ When operating through CLI or MCP, create fewer seats first and ask for confirma
41758
41758
  order: 30,
41759
41759
  title: "Charter design playbook",
41760
41760
  summary: "How to draft strong Charters that work for human, agent, and hybrid seats.",
41761
- version: "2026-06-20.1",
41761
+ version: "2026-06-30.1",
41762
41762
  public: true,
41763
41763
  audiences: ["human", "cli", "mcp", "in_app_agent"],
41764
41764
  stages: ["charter_design", "staffing"],
@@ -41815,7 +41815,9 @@ List and read first, then draft, then leave activation to a human.
41815
41815
  - Draft one: \`{{cli}} command charter.draft --json '{"seat_id":"<seat-id>"}'\` (scope: seat or tenant-admin); draft every eligible seat with \`charter.draft_all\` / \`rost_draft_all_charters\`. Draft commands are not gated \u2014 they produce a draft \`charter_version_id\`. \`charter.draft_all\` only drafts **active** seats and returns the real result: \`{ drafted, skipped, draft_ids, skipped_seats: [{ seat_id, reason }] }\` where \`reason\` is \`seat_not_active\` (the seat is still draft/vacant \u2014 confirm it first) or \`charter_exists\` (it already has a draft/active Charter). Read \`skipped_seats\` to see why a freshly-built graph drafted fewer Charters than it has seats.
41816
41816
  - Edit a draft: \`charter.update_draft\` / \`rost_update_charter_draft\` with the \`charter_version_id\` and the new \`doc\`.
41817
41817
 
41818
- In the app, \`/charters\` is both a drafting queue and a governance library. It shows active Charters, draft amendments, seats missing Charters, unsigned manifests, and steward-review gaps. Opening a live Charter is a review mode: read the active version, inspect its governance state, and open an amendment draft when the job needs to change. Active Charter content is never silently edited in place.
41818
+ In the app, \`/charters\` is both a drafting queue and a governance library. It shows active Charters, draft amendments, seats missing Charters, unsigned manifests, and steward-review gaps. \`/charters/builder\` is the seat picker for Charter Builder: start there when you need to draft a missing Charter, continue an amendment, or review which seats are still missing operating contracts. Opening a live Charter is a review mode: read the active version, inspect its governance state, and open an amendment draft when the job needs to change. Active Charter content is never silently edited in place.
41819
+
41820
+ Daily and weekly measurable rows can carry Signal metadata: unit, numeric target, direction, cadence, and source. When a human approves a Charter, those structured measurables materialize into tenant Signal definitions for that seat. Free-text, monthly, and quarterly measurable prose remains accountability text until a human converts it into a supported structured Signal or creates the Signal separately.
41819
41821
 
41820
41822
  ## When to stop for confirmation
41821
41823
 
@@ -42071,7 +42073,7 @@ The dry run is a real sandbox rehearsal, not a stamp. It executes a mock-provide
42071
42073
  order: 80,
42072
42074
  title: "Sync rhythm playbook",
42073
42075
  summary: "How Signal, Friction, Cascade, and Sync Briefs turn weekly meetings into decision time.",
42074
- version: "2026-06-20.2",
42076
+ version: "2026-06-30.1",
42075
42077
  public: true,
42076
42078
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42077
42079
  stages: ["operating_rhythm"],
@@ -42119,7 +42121,7 @@ The Sync Brief should answer:
42119
42121
 
42120
42122
  On screen the brief reads in plain terms: Signal exceptions, goal progress, task review, ranked Friction, and agent activity. Where a section has no source data, it lists gaps to confirm \u2014 the missing inputs a human should know about before the meeting \u2014 rather than a blank section.
42121
42123
 
42122
- Before the first brief exists, the Sync pages are readiness views. They show the next scheduled compile and the source areas that will feed it: Signal, Cascade, Tasks, Friction, and Agents. Use those links to add the missing source data; there is no manual compile button until the system has an idempotent persisted operation to run.
42124
+ Before the first brief exists, the Sync pages are readiness views. They show the next scheduled compile and the source areas that will feed it: Signal, Cascade, Tasks, Friction, and Agents. Use those links to add missing source data, or use Compile now to run the same idempotent persisted compile operation immediately when the company uses company-wide Sync Briefs. If the company is configured for per-cluster briefs, compile the target cluster from CLI or MCP with a cluster id until the UI offers a cluster selector. Once a brief exists, the page shows whether it covers the current period, when it was compiled, and which sections were omitted or compiled with gaps.
42123
42125
 
42124
42126
  The same readiness model appears around the meeting loop. Steward shows the governance loop even when no decision is waiting: which agent seats are stewarded, how many escalations are open, and recent raised/decided counts. Tasks explains when nothing is due and points to recently completed or agent-blocked work when it exists. The agent fleet shows configuration completeness per staffed agent seat \u2014 steward chain, lane/trigger/substrate, credentials, tools, model, dry run, and go-live \u2014 with links to the exact setup surface rather than a generic action button.
42125
42127
 
@@ -42257,7 +42259,7 @@ Use the lower-level commands after health names a finding: \`agent.get_run\` for
42257
42259
  order: 46,
42258
42260
  title: "Tool access and vault",
42259
42261
  summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
42260
- version: "2026-06-29.1",
42262
+ version: "2026-06-30.1",
42261
42263
  public: true,
42262
42264
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42263
42265
  stages: ["staffing"],
@@ -42307,15 +42309,15 @@ For an API with no dedicated connector, the generic REST tool lets a seat call a
42307
42309
 
42308
42310
  ## Gmail connector
42309
42311
 
42310
- The native Gmail handlers run inside the same broker boundary as the REST and Slack connectors: every call passes the server guard and writes an audit row, and the vaulted Google OAuth token is bound only inside a credential closure \u2014 the agent never sees it, and both the access and refresh tokens are redacted from anything a handler returns. \`gmail.read\` (read scoped inbox) and \`gmail.draft\` (compose a draft, never send) are autonomous-eligible. \`gmail.send\` is approval-gated: it never sends autonomously \u2014 it holds the action for steward approval. A sandbox dry run previews the intended read/draft/held-send with no Gmail request and without opening the vault. Live external Gmail send stays gated on Google verification and domain cutover (DER-880 / DER-881); the draft and send-with-approval paths are live now.
42312
+ The native Gmail handlers run inside the same broker boundary as the REST and Slack connectors: every call passes the server guard and writes an audit row, and the vaulted Google OAuth token is bound only inside a credential closure \u2014 the agent never sees it, and both the access and refresh tokens are redacted from anything a handler returns. \`gmail.read\` (read scoped inbox) and \`gmail.draft\` (compose a draft, never send) are autonomous-eligible when a tenant has a connected Google credential. \`gmail.send\` is approval-gated: it never sends autonomously \u2014 it holds the action for steward approval. A sandbox dry run previews the intended read/draft/held-send with no Gmail request and without opening the vault. For partner demos before Google verification is complete, use sandbox dry runs, setup previews, and approval-held examples as the demo-safe substitute. Live external Gmail send stays gated on Google verification and domain cutover (DER-880 / DER-881).
42311
42313
 
42312
42314
  ## Google connector status
42313
42315
 
42314
- Google can be connected from Settings once the workspace OAuth app is configured. The connection flow requests offline access for Gmail read/compose and Sheets, stores the returned credential in the vault, and records only account and scope metadata in the integration row. The test action refreshes the vaulted credential and performs a minimal Gmail profile read. Gmail read/draft, bounded Sheets read, and approval-held Sheets write handlers now run through the guarded broker; connecting Google still does not bypass the signed Charter manifest, tenant policy ceiling, credential vault, or tool-call audit. Sheet grants should use exact signed argument bindings for approved spreadsheet ids and ranges.
42316
+ Google can be connected from Settings once the workspace OAuth app is configured. The connection flow requests offline access for Gmail read/compose and Sheets, stores the returned credential in the vault, and records only account and scope metadata in the integration row. The test action refreshes the vaulted credential and performs a minimal Gmail profile read. Gmail read/draft, bounded Sheets read, and approval-held Sheets write handlers run through the guarded broker when Google is connected; connecting Google still does not bypass the signed Charter manifest, tenant policy ceiling, credential vault, or tool-call audit. Sheet grants should use exact signed argument bindings for approved spreadsheet ids and ranges.
42315
42317
 
42316
42318
  CLI and MCP can inspect connector readiness without seeing secrets: \`integration.list\` / \`rost_list_integrations\` lists connected providers and health metadata, \`integration.status\` / \`rost_get_integration_status\` reads one provider by id or name, and \`integration.test\` / \`rost_test_integration_connection\` runs the installed provider-specific health check. For Google, the test refreshes the vaulted OAuth credential and reads the Gmail profile, then records only account, scope, and health metadata.
42317
42319
 
42318
- \`integration.readiness\` / \`{{cli}} integration readiness --provider google --json\` / \`rost_check_integration_readiness\` returns the same setup checklist Settings shows: OAuth env and callback status, tenant connection state, granted scopes, latest test state, external verification/CASA caveats, handler availability, and the next Linear issue or action. The checklist is metadata-only. It never returns access tokens, refresh tokens, client secrets, vault refs, or raw provider responses.
42320
+ \`integration.readiness\` / \`{{cli}} integration readiness --provider google --json\` / \`rost_check_integration_readiness\` returns the same setup checklist Settings shows: OAuth env and callback status, tenant connection state, granted scopes, latest test state, the demo-safe partner path, external verification/CASA caveats, handler availability, and the next Linear issue or action. The checklist is metadata-only. It never returns access tokens, refresh tokens, client secrets, vault refs, or raw provider responses.
42319
42321
 
42320
42322
  ## One write-only credential flow across every surface
42321
42323
 
@@ -42346,7 +42348,7 @@ There is exactly one way to give a connected tool its credential, and it is the
42346
42348
  order: 47,
42347
42349
  title: "Available tools guide",
42348
42350
  summary: "How to think about tool categories available to seats and what each category should be used for.",
42349
- version: "2026-06-29.1",
42351
+ version: "2026-06-30.1",
42350
42352
  public: true,
42351
42353
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42352
42354
  stages: ["staffing"],
@@ -42392,14 +42394,14 @@ Agents should explain the job, the required tool category, the minimum permissio
42392
42394
 
42393
42395
  Every tool call passes the server-side guard first: the guard checks the call against the seat's signed permission manifest and records a tool-call audit row for **every** call \u2014 allowed, denied, or escalated. Tool selection is never authorization. Only an allowed call reaches its handler. A connected credential is bound into the handler for the duration of the call only; the secret never appears in the result, the audit summary, logs, or the model's context.
42394
42396
 
42395
- External connectors are being rolled out provider by provider, conservatively (read and draft before send; write behind approval). A selected tool is only a permission until a live handler exists and the seat has the required credential or binding. Today the built-in execution path supports internal status reporting, the generic REST connector when a signed host/method/path allowlist and credential exist, \`slack.post_message\` for a bound Slack channel, and Google handlers for \`gmail.read\`, \`gmail.draft\`, \`sheets.read\`, and approval-held \`sheets.write\` when Google is connected. \`gmail.send\` remains held for approval and live external send stays gated on Google verification. Other provider entries remain configuration-only until their connector ships, so nothing runs silently.`
42397
+ External connectors are being rolled out provider by provider, conservatively (read and draft before send; write behind approval). A selected tool is only a permission until a live handler exists and the seat has the required credential or binding. Today the built-in execution path supports internal status reporting, the generic REST connector when a signed host/method/path allowlist and credential exist, \`slack.post_message\` for a bound Slack channel, and Google handlers for \`gmail.read\`, \`gmail.draft\`, \`sheets.read\`, and approval-held \`sheets.write\` when Google is connected. \`gmail.send\` remains held for approval and live external send stays gated on Google verification. Before that verification is complete, partner demos should show sandbox dry runs, setup previews, and approval-held examples rather than claim production Google readiness. Other provider entries remain configuration-only until their connector ships, so nothing runs silently.`
42396
42398
  },
42397
42399
  {
42398
42400
  slug: "mcp-and-cli-guide",
42399
42401
  order: 48,
42400
42402
  title: "CLI and MCP installation guide",
42401
42403
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
42402
- version: "2026-06-28.3",
42404
+ version: "2026-06-30.2",
42403
42405
  public: true,
42404
42406
  audiences: ["human", "cli", "mcp", "in_app_agent"],
42405
42407
  stages: ["company_setup", "staffing"],
@@ -42522,9 +42524,9 @@ Commands below use angle-bracket placeholders. The CLI prints the real, fully-re
42522
42524
  A {{brand}} **account** (the human identity) is created with Google sign-in \u2014 in the browser at \`/signup\`, or headlessly via \`{{cli}} login --device\` (a human approves the code in any browser). A **company** (tenant) can then be created either way:
42523
42525
 
42524
42526
  - **Browser:** at \`/signup\`, name your company, then return to the CLI.
42525
- - **Headless (no browser step):** once logged in, run \`{{cli}} signup --company "<name>"\`. This provisions the company for your session and makes it your active tenant, so \`{{cli}} onboard status\` and every other tenant-scoped command work immediately. This is the recommended path for an autonomous agent setting up from scratch.
42527
+ - **Headless (no browser step):** once logged in, run \`{{cli}} signup --company "<name>"\`. If the account has no active company yet, this provisions the first company for your session and makes it active, so \`{{cli}} onboard status\` and every other tenant-scoped command work immediately. This is the recommended path for an autonomous agent setting up from scratch.
42526
42528
 
42527
- If you run a tenant-scoped command before any company exists, the CLI tells you both options. You only get one company per signup; running \`{{cli}} signup --company\` again returns your existing company rather than creating a duplicate.
42529
+ If you run a tenant-scoped command before any company exists, the CLI tells you both options. \`{{cli}} signup --company\` is not a second-company creation command: running it again returns the active company, names the company you requested, and says that no new company was created. The default output is human-readable; add \`--json\` only when an automation needs the raw command output. To inspect or switch among companies you can already access, use \`{{cli}} tenants\` and \`{{cli}} use <tenant-slug-or-id>\`. Additional company creation is not exposed as a public self-serve CLI path in this milestone.
42528
42530
 
42529
42531
  ## Install the CLI
42530
42532
 
@@ -42788,7 +42790,7 @@ These are the security posture rules for operating after install \u2014 a checkl
42788
42790
  | \`{{cli}} login\` | Open browser login and store the CLI session. | User session | \`{{cli}} login\` |
42789
42791
  | \`{{cli}} login --device\` | Device-code login for a headless agent: prints a short code + URL, a human approves in any browser, the CLI polls until authorized \u2014 no browser session needed on the agent's machine. | User session | \`{{cli}} login --device\` |
42790
42792
  | \`{{cli}} logout\` | Clear the local CLI session. | Local session | \`{{cli}} logout\` |
42791
- | \`{{cli}} signup [--company "<name>"]\` | With no flag, open/print the web signup page. With \`--company\`, create the company headlessly for the logged-in session (no browser step) \u2014 it becomes your active tenant. | Public (\`--company\` needs a login session) | \`{{cli}} signup --company "Acme"\` |
42793
+ | \`{{cli}} signup [--company "<name>"] [--json]\` | With no flag, open/print the web signup page. With \`--company\`, bootstrap the first company headlessly for the logged-in session. If one is already active, it returns that company and says no new company was created. Add \`--json\` for machine-readable output. | Public (\`--company\` needs a login session) | \`{{cli}} signup --company "Acme"\` |
42792
42794
  | \`{{cli}} whoami\` | Show the authenticated user, accessible tenant roles, and the active tenant (\`current_tenant_id\`). | User | \`{{cli}} whoami\` |
42793
42795
  | \`{{cli}} tenants\` | List tenants the user can access; the active one is marked \`current\`. | User | \`{{cli}} tenants\` |
42794
42796
  | \`{{cli}} use <tenant>\` | Select a tenant slug or id as the active tenant for the session. It persists, so a following \`{{cli}} whoami\` reports it as \`current_tenant_id\`. | User | \`{{cli}} use acme-ops\` |
@@ -42848,7 +42850,7 @@ The signed-in app exposes the same Skill command surface under **Skills** in the
42848
42850
  | \`{{cli}} escalation list|get|resolve|reject\` | \`escalation.list\`, \`escalation.get\`, \`escalation.resolve\`, \`escalation.reject\` | Work the steward escalation queue. | Steward | \`{{cli}} escalation list --json\` |
42849
42851
  | \`{{cli}} error list|resolve|supersede\` | \`error_log.list\`, \`error_log.resolve\`, \`error_log.supersede\` | List active, acknowledged, resolved, or superseded product error logs and let a human acknowledge, resolve, or supersede stale errors with evidence links. | Tenant | \`{{cli}} error list --resolved active --json\`; \`{{cli}} error resolve --error-log-id <id> --reason "Fixed in PR #123"\` |
42850
42852
  | \`{{cli}} sync brief|compile|complete\` | \`sync.brief.get\`, \`sync.brief.compile\`, \`sync.run.complete\` | Compile, read, and complete a weekly Sync. | Tenant | \`{{cli}} sync brief --json\` |
42851
- | \`{{cli}} runner list|status|diagnose|repair|work-orders|revoke|serve\` | \`runner.list\`, \`runner.status\`, \`runner.diagnose\`, \`runner.repair\`, \`work_order.list\`, \`runner.revoke\`, runner endpoint APIs | Inspect runners and work orders, diagnose offline runners, get repair guidance, revoke a runner, or run the headless local runner loop. | Tenant | \`{{cli}} runner diagnose --runner-id <id> --json\`; \`{{cli}} runner serve --once\` |
42853
+ | \`{{cli}} runner list|status|diagnose|repair|work-orders|revoke|serve\` | \`runner.list\`, \`runner.status\`, \`runner.diagnose\`, \`runner.repair\`, \`work_order.list\`, \`runner.revoke\`, runner endpoint APIs | Inspect heartbeat and execute-readiness evidence, inspect work orders, diagnose offline runners, get repair guidance, revoke a runner, or run the headless local runner loop. | Tenant | \`{{cli}} runner diagnose --runner-id <id> --json\`; \`{{cli}} runner serve --once\` |
42852
42854
  | \`{{cli}} notification settings|test|errors\` | \`notification.settings.get\`, \`notification.test\`, \`notification.list_errors\` | Read notification settings, send a test, and list failed deliveries with linked product error source, seat id, and run id when available. | Tenant | \`{{cli}} notification errors --limit 10 --json\` |
42853
42855
  | \`{{cli}} integration list|readiness|status|test\` | \`integration.list\`, \`integration.readiness\`, \`integration.status\`, \`integration.test\` | List connector metadata, read the setup-readiness checklist, read one connector's health, and run the provider-specific connection test without exposing credentials. | Tenant | \`{{cli}} integration readiness --provider google --json\` |
42854
42856
  | \`{{cli}} system health\` | \`system.health\` | Read the scoped system-health snapshot across agent runs, unresolved errors, Signals, Cascade setup, work loop, integrations, runners, notifications, and Sync Brief readiness. | Tenant, member, or seat token | \`{{cli}} system health --json\`; \`{{cli}} system health --seat <id> --json\` |
@@ -43007,8 +43009,8 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
43007
43009
  | \`rost_configure_agent_tools\` | \`agent.configure_tools\` | Connect or decline proposed tools and stage credential-ingress requests (vault refs only). | Seat or tenant-admin | Never send raw secrets; expect a credential confirmation. |
43008
43010
  | \`rost_run_agent_dry_run\` | \`agent.run_dry_run\` | Run the sandbox dry run for a draft agent; durable and idempotent per Charter version. | Seat or tenant-admin | Call after the manifest is signed; ungated by human approval, but precondition-gated on a signed manifest. |
43009
43011
  | \`rost_list_mcp_tokens\` | \`mcp_token.list\` | List MCP token metadata (never token material). | Tenant | Call with \`{}\` or \`{"include_revoked":true}\`. |
43010
- | \`rost_list_runners\` | \`runner.list\` | List local runners and their online/offline/revoked state. | Tenant | Call with \`{}\`. |
43011
- | \`rost_runner_status\` | \`runner.status\` | Read a single runner's capability and state. | Tenant | Call with \`runner_id\`. |
43012
+ | \`rost_list_runners\` | \`runner.list\` | List local runners with heartbeat health, execution readiness, queue counts, and recent result evidence. | Tenant | Call with \`{}\`. |
43013
+ | \`rost_runner_status\` | \`runner.status\` | Read a single runner's capability, heartbeat health, and execute-readiness state. | Tenant | Call with \`runner_id\`. |
43012
43014
  | \`rost_diagnose_runner\` | \`runner.diagnose\` | Return runner health, capabilities, and repair guidance without secrets. | Tenant | Call with \`runner_id\`; actionable repair guidance exposes restart, re-pair, or missing CLI steps. |
43013
43015
  | \`rost_runner_repair_guidance\` | \`runner.repair\` | Return focused repair steps for a runner: restart, re-pair, revoke stale, or install missing CLI runtime. | Tenant | Call with \`runner_id\` and optional \`issue\` (restart, re_pair, revoke_stale, missing_cli_runtime). |
43014
43016
  | \`rost_start_runner_pairing\` | \`runner.pairing.start\` | Open a runner pairing session and return the human pairing code. | Tenant-admin | Call with \`name\` and \`platform\`; owner/admin only. |
@@ -43554,7 +43556,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
43554
43556
  order: 60,
43555
43557
  title: "Cascade guide",
43556
43558
  summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
43557
- version: "2026-06-28.1",
43559
+ version: "2026-06-30.1",
43558
43560
  public: true,
43559
43561
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43560
43562
  stages: ["operating_rhythm"],
@@ -43614,7 +43616,7 @@ On \`/cascade\`, the screen renders the full goal depth, not just one or two lev
43614
43616
 
43615
43617
  ## Goal progress and at-risk goals
43616
43618
 
43617
- A goal can carry a quantified progress (0-100) distinct from its on/off/done status. Report it with \`goal.set_progress\`; when an agent reports progress it lands as a proposal a human approves before the goal moves. \`goal.list_at_risk\` projects which goals are off pace by comparing progress against the elapsed fraction of the cycle window (deterministic date math, no forecast model). Off-pace goals surface on \`/cascade\`, on the owner home, in the weekly Sync Brief, and as a weekly owner alert. Status-only goals (no progress recorded) are simply excluded from the projection.
43619
+ A goal can carry a quantified progress (0-100) distinct from its on/off/done status. Report it with \`goal.set_progress\`; when an agent reports progress it lands as a proposal a human approves before the goal moves. \`goal.list_at_risk\` projects which goals are off pace by comparing progress against the elapsed fraction of the cycle window (deterministic date math, no forecast model). Off-pace goals surface on \`/cascade\`, on the owner home, in the weekly Sync Brief, and as a weekly owner alert. Status-only goals (no progress recorded) are excluded from the projection and render as pending measurement, not as proven on track.
43618
43620
 
43619
43621
  On human and function seat pages, goal visibility includes both direct goals and descendant seat goals from the Responsibility Graph subtree, so a manager can review team progress without double-owning the agent's work.
43620
43622
 
@@ -43709,7 +43711,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
43709
43711
  order: 62,
43710
43712
  title: "Friction guide",
43711
43713
  summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
43712
- version: "2026-06-20.1",
43714
+ version: "2026-06-29.1",
43713
43715
  public: true,
43714
43716
  audiences: ["human", "cli", "mcp", "in_app_agent"],
43715
43717
  stages: ["operating_rhythm"],
@@ -44076,7 +44078,7 @@ Every notification should include the seat, cause, evidence, and requested decis
44076
44078
  order: 75,
44077
44079
  title: "Local runner guide",
44078
44080
  summary: "How local agent sessions and runner surfaces should operate through {{brand}} without bypassing Charters or audit.",
44079
- version: "2026-06-21.1",
44081
+ version: "2026-06-30.1",
44080
44082
  public: true,
44081
44083
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44082
44084
  stages: ["staffing", "operating_rhythm"],
@@ -44105,10 +44107,10 @@ The local runner is for human-controlled local agent work. It should retrieve {{
44105
44107
  ## Inspect and control runners from CLI or MCP
44106
44108
 
44107
44109
  - Pair a new runner: \`runner.pairing.start\` / \`rost_start_runner_pairing\` with \`name\` and \`platform\` returns a human pairing code. This is owner/admin-only because it mints a short-lived runner pairing session that leads to machine credentials.
44108
- - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows online/offline/revoked state; \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner.
44110
+ - Inspect: \`{{cli}} runner list --json\` / \`runner.list\` / \`rost_list_runners\` shows heartbeat state plus execution readiness. A runner is execute-ready only when it has a live heartbeat, a detected local Claude or Codex runtime, and recent claim/result evidence or active queue processing. \`{{cli}} runner status\` / \`runner.status\` / \`rost_runner_status\` reads one runner with the same execution detail, due queue count, claimed/running counts, and recent result timestamps.
44109
44111
  - Diagnose (DER-949): \`{{cli}} runner diagnose --runner-id <id>\` / \`runner.diagnose\` / \`rost_diagnose_runner\` returns health, capabilities, and repair guidance without exposing secrets. Use when a runner is offline or stale to get actionable next steps.
44110
44112
  - Repair steps (DER-949): \`{{cli}} runner repair --runner-id <id> [--issue restart|re_pair|revoke_stale|missing_cli_runtime]\` / \`runner.repair\` / \`rost_repair_runner\` returns focused repair instructions. The optional \`issue\` flag narrows to a specific kind of repair (restart the app, re-pair, revoke a stale runner, or install a missing CLI runtime).
44111
- - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent, or use \`agent.run_now\` / \`rost_run_agent_now\` when an operator wants the product to queue and dispatch an immediate live run from a seat id; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`.
44113
+ - Work orders: \`{{cli}} runner work-orders\` / \`work_order.list\` / \`rost_list_work_orders\`; queue with \`work_order.enqueue\` / \`rost_enqueue_work_order\` for a live scheduled agent, or use \`agent.run_now\` / \`rost_run_agent_now\` when an operator wants the product to queue and dispatch an immediate live run from a seat id; cancel with \`work_order.cancel\` / \`rost_cancel_work_order\`. The operator Settings page mirrors queued, claimed, running, and recent completed runner evidence so online does not imply can execute.
44112
44114
  - Revoke: \`{{cli}} runner revoke\` / \`runner.revoke\` / \`rost_revoke_runner\` so a runner can no longer authenticate.
44113
44115
 
44114
44116
  ## Owner-initiated headless pairing
@@ -44120,6 +44122,7 @@ Use this flow when a headless or desktop runner cannot use the interactive web c
44120
44122
  3. The runner calls \`POST /api/runner/pairing/claim\` with \`{"user_code":"ABCD-2345"}\`.
44121
44123
  4. The response returns \`runner_id\`, \`runner_secret\`, \`name\`, and \`platform\`. Store the runner secret only on the runner machine.
44122
44124
  5. The runner sends heartbeats with \`Authorization: Bearer <runner_secret>\` and then claims work orders.
44125
+ 6. For a local smoke, run the headless runner in explicit one-shot execute mode: \`RUNNER_EXECUTE=1 RUNNER_ONCE=1 node apps/runner/scripts/headless-runner.mjs\`. It heartbeats once, claims at most one due read-only work order, reports the result, and exits nonzero if no executable work was claimed or result reporting failed. Without \`RUNNER_ONCE=1\`, the headless runner stays alive and continues heartbeating.
44123
44126
 
44124
44127
  ## When to stop for confirmation
44125
44128
 
@@ -44244,7 +44247,7 @@ Templates may draft. Humans approve. A stock agent should not go live until a hu
44244
44247
  order: 77,
44245
44248
  title: "Troubleshooting guide",
44246
44249
  summary: "How users and agents should diagnose common setup, tool, Signal, Friction, and MCP problems.",
44247
- version: "2026-06-20.1",
44250
+ version: "2026-06-29.1",
44248
44251
  public: true,
44249
44252
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44250
44253
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -44283,6 +44286,7 @@ Before calling a command that changes state, discover its exact shape so you do
44283
44286
  - Escalations are aging: read \`escalation.list\` / \`rost_list_escalations\`; a human resolves through the Steward queue.
44284
44287
  - MCP access fails: revoke and recreate the narrowest token after checking scope (\`mcp_token.revoke\` then \`{{cli}} mcp install --client <client> --scope seat --seat-id <seat-id>\`; standalone \`mcp install\` requires an explicit \`--scope\`).
44285
44288
  - Settings section unavailable: keep the route open, read which section is marked unavailable, and retry or fix that source directly. Do not treat a missing Settings panel as permission to write blind values; budget and Sync Brief settings stay read-only until their data loads.
44289
+ - Org-intake upload failed: read the safe parse status and reason, then ask the human for a better source file or continue by chat. Browser org intake accepts bounded CSV, text, PDF, DOCX, XLSX, PNG, and JPEG files; extraction failures are retryable and should not be worked around by pasting raw binary, stack traces, secrets, or full customer exports into a prompt.
44286
44290
 
44287
44291
  ## Surface-specific failures
44288
44292
 
@@ -44296,7 +44300,7 @@ Before calling a command that changes state, discover its exact shape so you do
44296
44300
 
44297
44301
  These are the common blockers when adding an agent (see the add-agents guide and the custom agents guide):
44298
44302
 
44299
- - Missing Steward: an agent occupancy or go-live is blocked because no Steward chain resolves to a human. Name a human Steward on the seat, then retry. The no-orphan-agent rule is enforced server-side; do not route around it.
44303
+ - Missing Steward: an agent occupancy or go-live is blocked because no Steward chain resolves to a human. Use the inline steward-chain fix when the builder offers a human-occupied candidate, or name a human Steward on the seat, then retry. The no-orphan-agent rule is enforced server-side; do not route around it.
44300
44304
  - Failed dry run: the draft is kept and the failure reason is shown. Read it with \`agent.status\` / \`rost_get_agent_status\`, fix the Charter, manifest, or tool decision, then \`agent.run_dry_run\` again. A passed dry run is required before go-live.
44301
44305
  - Declined tool: declining a proposed tool updates the permission manifest and the dry-run task. If the agent then cannot complete the task, either grant a narrower tool or adjust the Charter so the work still routes safely or escalates.
44302
44306
  - Expired confirmation: a pending human gate expired before approval. Re-issue the gated command (for example \`agent.create_from_template\`, \`charter.sign_manifest\`, or \`agent.go_live\`) and approve the new confirmation; an agent never approves its own request.
@@ -44316,7 +44320,7 @@ Name the failing surface, collect evidence, recommend the smallest correction, a
44316
44320
  order: 78,
44317
44321
  title: "AI model data handling guide",
44318
44322
  summary: "How {{brand}} cloud agents, local MCP sessions, runners, BYOK, and connected tools handle model-bound data.",
44319
- version: "2026-06-22.1",
44323
+ version: "2026-06-29.1",
44320
44324
  public: true,
44321
44325
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44322
44326
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -44341,27 +44345,27 @@ Name the failing surface, collect evidence, recommend the smallest correction, a
44341
44345
  {
44342
44346
  label: "OpenAI API data controls",
44343
44347
  url: "https://developers.openai.com/api/docs/guides/your-data",
44344
- note: "Official API data-use and retention controls verified 2026-06-22."
44348
+ note: "Official API data-use and retention controls verified 2026-06-29."
44345
44349
  },
44346
44350
  {
44347
44351
  label: "OpenAI enterprise privacy",
44348
44352
  url: "https://openai.com/enterprise-privacy/",
44349
- note: "Official enterprise privacy and API retention summary verified 2026-06-22."
44353
+ note: "Official enterprise privacy and API retention summary verified 2026-06-29."
44350
44354
  },
44351
44355
  {
44352
44356
  label: "OpenAI Codex with ChatGPT plan",
44353
44357
  url: "https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan",
44354
- note: "Official Codex plan data-control scope verified 2026-06-22."
44358
+ note: "Official Codex plan data-control scope verified 2026-06-29."
44355
44359
  },
44356
44360
  {
44357
44361
  label: "Anthropic API and data retention",
44358
44362
  url: "https://platform.claude.com/docs/en/manage-claude/api-and-data-retention",
44359
- note: "Official Claude API ZDR, HIPAA, and retention scope verified 2026-06-22."
44363
+ note: "Official Claude API ZDR, HIPAA, and retention scope verified 2026-06-29."
44360
44364
  },
44361
44365
  {
44362
44366
  label: "Claude Code data usage",
44363
44367
  url: "https://code.claude.com/docs/en/data-usage",
44364
- note: "Official local Claude Code data-flow, training, and retention summary verified 2026-06-22."
44368
+ note: "Official local Claude Code data-flow, training, and retention summary verified 2026-06-29."
44365
44369
  },
44366
44370
  {
44367
44371
  label: "Reference corpus and docs spec",
@@ -44464,9 +44468,9 @@ If sensitive data appears by accident, stop, do not repeat it, and route cleanup
44464
44468
 
44465
44469
  ## Provider policy checkpoints
44466
44470
 
44467
- For platform-managed \`cloud\` runs and BYOK Anthropic \`cloud\` runs, check the Anthropic account, workspace, model, and contract. As of 2026-06-22, official Anthropic Claude API documentation says retained API data is not used for model training without express permission, that some API features are ZDR-eligible while others are not, and that ZDR, HIPAA readiness, model-specific retention requirements, consumer products, Claude Code, and third-party integrations each have their own scope.
44471
+ For platform-managed \`cloud\` runs and BYOK Anthropic \`cloud\` runs, check the Anthropic account, workspace, model, and contract. As of 2026-06-29, official Anthropic Claude API documentation says retained API data is not used for model training without express permission, that some API features are ZDR-eligible while others are not, and that ZDR, HIPAA readiness, model-specific retention requirements, consumer products, Claude Code, and third-party integrations each have their own scope.
44468
44472
 
44469
- For local OpenAI API-key clients running through \`mcp_session\` or \`runner\`, check the customer's OpenAI organization, project, endpoint, and API data controls. As of 2026-06-22, official OpenAI API documentation says API data is not used to train or improve OpenAI models unless the customer explicitly opts in, and default abuse-monitoring logs may retain customer content for up to 30 days unless approved controls apply. OpenAI says zero data retention is available only for eligible customers, endpoints, and use cases.
44473
+ For local OpenAI API-key clients running through \`mcp_session\` or \`runner\`, check the customer's OpenAI organization, project, endpoint, and API data controls. As of 2026-06-29, official OpenAI API documentation says API data is not used to train or improve OpenAI models unless the customer explicitly opts in, and default abuse-monitoring logs may retain customer content for up to 30 days unless approved controls apply. OpenAI says zero data retention is available only for eligible customers, endpoints, and use cases.
44470
44474
 
44471
44475
  For Codex specifically, first identify whether the operator is using Codex through a ChatGPT Free/Plus/Pro, Business, Enterprise, Edu, API, or other workspace path. Official OpenAI Codex help says ChatGPT training data controls apply to whether content processed through Codex may be used to improve OpenAI models when Codex is used with a ChatGPT plan, and that Pro and Plus conversations may be used unless training is disabled. Do not give a Codex user the OpenAI API answer unless they are actually using an API-governed Codex path.
44472
44476
 
@@ -44490,7 +44494,7 @@ When asked about AI data handling:
44490
44494
  order: 79,
44491
44495
  title: "Security model guide",
44492
44496
  summary: "How {{brand}} protects tenant data, credentials, tool calls, and human decisions across web, MCP, CLI, and agents.",
44493
- version: "2026-06-21.5",
44497
+ version: "2026-06-29.1",
44494
44498
  public: true,
44495
44499
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44496
44500
  stages: ["company_setup", "staffing", "operating_rhythm"],
@@ -44921,7 +44925,7 @@ This worked document **omits** \`unanswered_boundaries\` and \`seat_type_recomme
44921
44925
  order: 43,
44922
44926
  title: "Agent builder guide",
44923
44927
  summary: "The full agent setup sequence on the CLI/MCP path \u2014 seat, steward, job, boundaries, tools, credentials, model, schedule, dry-run, go-live \u2014 with the structured model config and access tiers.",
44924
- version: "2026-06-20.2",
44928
+ version: "2026-06-29.1",
44925
44929
  public: true,
44926
44930
  audiences: ["cli", "mcp", "in_app_agent"],
44927
44931
  stages: ["staffing"],
@@ -44969,13 +44973,15 @@ Building teams of controlled agent workers is the product's core differentiator.
44969
44973
  3. **Job** \u2014 what the seat owns. On \`agent.create_custom\` this is the operational answers (what it owns, what success looks like, what it must never do alone); for a strong contract, submit the full Charter directly via \`charter.update_draft\` (see the charter-authoring deep-dive).
44970
44974
  4. **Boundaries** \u2014 the Charter's \`decision_authority\` (can-do / must-ask / never / escalate), \`escalation_rules\`, and \`budget\`. Conservative by default: send/spend/irreversible actions are approval-gated or escalated.
44971
44975
  5. **Tools** \u2014 pick from the discoverable catalog (\`{{cli}} tools list\`); each tool has a default scope tier and access policy. Connect or decline via \`agent.configure_tools\`. Selecting a tool records permission; live handlers execute later only behind the signed manifest, server guard, required credential or binding, and connector-specific approval boundary.
44972
- 6. **Credentials** \u2014 a tool that needs access declares a credential-ingress request (provider, scope, secret name). The secret itself flows through the vault-backed ingress command as a vault ref \u2014 never paste a secret into a builder command.
44976
+ 6. **Credentials and provider readiness** \u2014 a tool that needs access declares a credential-ingress request (provider, scope, secret name). The secret itself flows through the vault-backed ingress command as a vault ref \u2014 never paste a secret into a builder command. For Google-backed tools, inspect the provider readiness shown in Settings or the builder: not connected, connected but untested, connected and tested, or failed. Use \`integration.test\` / \`rost_test_integration_connection\` or the builder Test connection action to refresh the same safe status facts; do not infer authorization from a connected credential.
44973
44977
  7. **Operating instructions** \u2014 the runtime composes the agent's context from its Charter; you do not write a system prompt.
44974
44978
  8. **Model** \u2014 select the structured model config (see below). Read \`{{cli}} model list\` / \`model.catalog\` first when you are unsure; it returns the recommended default, effort, token price estimates, cost band, and best-fit work for each tier. If \`agent.create_custom\` omits \`model_config\`, {{brand}} recommends a tier from the supplied responsibility answers.
44975
44979
  9. **Heartbeat** \u2014 set the schedule (\`schedule_cron\`) for a recurring agent; a live scheduled agent must keep a steward chain.
44976
44980
  10. **Dry-run** \u2014 \`agent.run_dry_run\` rehearses in sandbox after the manifest is signed; it is ungated by human approval but requires a signed manifest.
44977
44981
  11. **Go-live** \u2014 \`agent.go_live\` is \`human_required\`. Prepare everything and surface the go-live to a human; never go live on a human's behalf.
44978
44982
 
44983
+ If \`agent_setup.get\` returns \`next_action: "set_steward"\`, use the returned steward-remediation candidates or choose an existing human-occupied seat with \`agent_setup.update --json '{"seat_id":"<agent-seat-id>","steward_seat_id":"<human-seat-id>"}'\`. If no human-occupied candidate exists, create or staff a human seat first. Do not bypass the no-orphan-agent guard; go-live remains blocked until the chain resolves to a person.
44984
+
44979
44985
  ## Choosing the model (structured config)
44980
44986
 
44981
44987
  The agent's model is a structured object, not a bare string:
@@ -47611,7 +47617,7 @@ function formatSystemHealth(output) {
47611
47617
  `signals: off_track=${field(signals, "off_track_count")} pending=${field(signals, "pending_count")}`,
47612
47618
  `cascade: recommendations=${field(cascade, "recommendation_count")} warnings=${field(cascade, "warning_count")}`,
47613
47619
  `work_loop: open_issues=${field(workLoop, "open_issue_count")} friction_without_task=${field(workLoop, "friction_without_task_count")} open_or_stalled_tasks=${field(workLoop, "open_or_stalled_task_count")}`,
47614
- `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
47620
+ `connectivity: runners=${field(connectivity, "runner_count")} offline_runners=${field(connectivity, "offline_runner_count")} not_ready_runners=${field(connectivity, "not_execute_ready_runner_count")} integrations=${field(connectivity, "integration_count")} disconnected_integrations=${field(connectivity, "disconnected_integration_count")} failed_notifications=${field(connectivity, "failed_notification_count")}`,
47615
47621
  `sync: latest_brief=${field(sync, "latest_brief_at")} missing_latest_brief=${field(sync, "missing_latest_brief")} flagged_gaps=${field(sync, "flagged_gap_count")}`
47616
47622
  );
47617
47623
  return lines.join("\n");
@@ -47754,25 +47760,48 @@ function signupUrl(appUrl2) {
47754
47760
  return new URL("/signup", ensureTrailingSlash2(appUrl2)).toString();
47755
47761
  }
47756
47762
  function parseSignupCompany(args) {
47763
+ const json2 = args.includes("--json");
47757
47764
  const index = args.indexOf("--company");
47758
47765
  if (index === -1) {
47759
- return { companyName: null };
47766
+ return { companyName: null, json: json2 };
47760
47767
  }
47761
47768
  const value = args[index + 1];
47762
47769
  if (value === void 0 || value.startsWith("--") || value.trim() === "") {
47763
47770
  throw new Error(`--company requires a value, e.g. ${cliBrand.binName} signup --company "Acme"`);
47764
47771
  }
47765
- return { companyName: value };
47772
+ return { companyName: value, json: json2 };
47766
47773
  }
47767
- async function runSignupProvision(io, client, companyName, run2) {
47774
+ var signupProvisionOutputSchema = external_exports.object({
47775
+ tenant_id: external_exports.string().min(1),
47776
+ slug: external_exports.string().min(1),
47777
+ name: external_exports.string().min(1),
47778
+ created: external_exports.boolean()
47779
+ }).loose();
47780
+ async function runSignupProvision(io, client, companyName, run2, options = {}) {
47768
47781
  const exitCode = await run2(io, client, "signup.provision_tenant", { company_name: companyName });
47769
- if (exitCode === 0) {
47782
+ if (exitCode.exitCode === 0) {
47783
+ const parsed = signupProvisionOutputSchema.safeParse(exitCode.output);
47784
+ if (!parsed.success) {
47785
+ return exitCode.exitCode;
47786
+ }
47787
+ if (options.json === true) {
47788
+ io.stdout.write(`${JSON.stringify(parsed.data, null, 2)}
47789
+ `);
47790
+ return exitCode.exitCode;
47791
+ }
47792
+ if (!parsed.data.created) {
47793
+ io.stdout.write(
47794
+ `No new company was created. Your account already has active company '${parsed.data.name}' (${parsed.data.slug}); requested '${companyName}' was not provisioned. Run '${cliBrand.binName} tenants' to see companies or '${cliBrand.binName} use ${parsed.data.slug}' to keep working there.
47795
+ `
47796
+ );
47797
+ return exitCode.exitCode;
47798
+ }
47770
47799
  io.stdout.write(
47771
- `Company '${companyName}' is ready and active. Run '${cliBrand.binName} onboard status' to continue setup.
47800
+ `Company '${parsed.data.name}' is ready and active. Run '${cliBrand.binName} onboard status' to continue setup.
47772
47801
  `
47773
47802
  );
47774
47803
  }
47775
- return exitCode;
47804
+ return exitCode.exitCode;
47776
47805
  }
47777
47806
  async function runSignup(io, appUrl2, openBrowser2 = tryOpenBrowser) {
47778
47807
  const url2 = signupUrl(appUrl2);
@@ -48717,9 +48746,12 @@ async function main(argv = process.argv.slice(2), options = {}) {
48717
48746
  return 0;
48718
48747
  }
48719
48748
  let signupCompany = null;
48749
+ let signupJson = false;
48720
48750
  if (command === "signup") {
48721
48751
  try {
48722
- signupCompany = parseSignupCompany(args).companyName;
48752
+ const signupOptions = parseSignupCompany(args);
48753
+ signupCompany = signupOptions.companyName;
48754
+ signupJson = signupOptions.json;
48723
48755
  } catch (error51) {
48724
48756
  io.stderr.write(`${redactForLog(error51 instanceof Error ? error51.message : String(error51))}
48725
48757
  `);
@@ -48826,7 +48858,7 @@ Run ${cliBrand.binName} login --device again if the next command asks you to aut
48826
48858
  await maybePrintSignupBootstrap(io, client, config2.appUrl);
48827
48859
  }
48828
48860
  if (command === "signup") {
48829
- return runSignupProvision(io, client, signupCompany, (signupIo, signupClient, commandId, body) => printCommandOutput(signupIo, signupClient, commandId, body));
48861
+ return runSignupProvision(io, client, signupCompany, (signupIo, signupClient, commandId, body) => executeCommandWithResult(signupIo, signupClient, commandId, body), { json: signupJson });
48830
48862
  }
48831
48863
  if (command === "whoami") {
48832
48864
  return printCommandOutput(io, client, "user.whoami");
@@ -49159,6 +49191,14 @@ async function printCommandOutput(io, client, commandId, body = {}, format, opti
49159
49191
  return printCommandError2(io, error51);
49160
49192
  }
49161
49193
  }
49194
+ async function executeCommandWithResult(io, client, commandId, body = {}) {
49195
+ try {
49196
+ const result = await client.execute(commandId, body);
49197
+ return { exitCode: 0, output: result.output };
49198
+ } catch (error51) {
49199
+ return { exitCode: printCommandError2(io, error51) };
49200
+ }
49201
+ }
49162
49202
  function pendingConfirmationFromError2(error51) {
49163
49203
  if (!(error51 instanceof CommandClientError) || !error51.response || error51.response.ok || error51.response.error.code !== "COMMAND_CONFIRMATION_REQUIRED") {
49164
49204
  return null;