@rosthq/cli 0.5.16 → 0.5.18
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/dist/index.js +191 -20
- package/dist/index.js.map +3 -3
- package/dist/operations.d.ts.map +1 -1
- package/package.json +1 -1
- package/prompts/how-tos/human-confirmations.md +4 -1
package/dist/index.js
CHANGED
|
@@ -41830,7 +41830,7 @@ Drafting can be assisted by agents. Activation is a human decision. When authori
|
|
|
41830
41830
|
order: 40,
|
|
41831
41831
|
title: "Agent staffing playbook",
|
|
41832
41832
|
summary: "How to decide whether a seat should be human, agent, or hybrid, and how to go live safely.",
|
|
41833
|
-
version: "2026-06-
|
|
41833
|
+
version: "2026-06-20.1",
|
|
41834
41834
|
public: true,
|
|
41835
41835
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
41836
41836
|
stages: ["staffing"],
|
|
@@ -41891,6 +41891,12 @@ Two creation paths, both draft-first. Read the stock-agents guide for templates
|
|
|
41891
41891
|
- Run on demand: \`{{cli}} agent run-now --seat-id <seat-id>\` / \`agent.run_now\` / \`rost_run_agent_now\` queues an immediate live run without changing the saved schedule. Cloud agents dispatch to the Inngest executor; runner agents queue work for the paired runner. The command is ungated but still requires a live staffed agent and the normal server-side tool guard.
|
|
41892
41892
|
- Audit what an agent did (Trust Card): \`{{cli}} command agent.list_runs --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_runs\` returns the seat's run history with per-run tool-call and guard-held counts; \`{{cli}} agent get-run --seat-id <seat-id> --run-id <run-id>\` / \`agent.get_run\` / \`rost_get_agent_run_diagnostics\` reads one run's transcript reference, token/cost usage, outcome, and product-visible run errors; \`{{cli}} command agent.list_tool_calls --json '{"seat_id":"<seat-id>"}'\` / \`rost_list_agent_tool_calls\` returns the tool-call ledger with each call's guard result. Both list commands include a \`denied_tool_call_count\` rollup \u2014 the actions held because they exceeded the charter. Pass \`{"seat_id":"<seat-id>","held_only":true}\` to \`agent.list_tool_calls\` for only the held calls. The web seat page shows the same facts as a Trust Card.
|
|
41893
41893
|
|
|
41894
|
+
## Review readiness before go-live
|
|
41895
|
+
|
|
41896
|
+
The fleet page and seat page should make readiness inspectable, not implied. A staffed agent row shows whether the Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state are complete. Each missing item links to the exact setup surface that fixes it: seat staffing, the Charter Builder, agent operations, runner settings, vault settings, or tool configuration.
|
|
41897
|
+
|
|
41898
|
+
After an agent runs, review its completed work as well as its telemetry. Seat pages combine explicit deliverables, work-log evidence, and successful run summaries into a readable output trail with safe evidence links labelled as internal, Linear, GitHub, or external. Held confirmations and escalations remain visible until decided or expired: confirmations can be approved or rejected from the seat page, while escalations link to the Steward queue for the human decision.
|
|
41899
|
+
|
|
41894
41900
|
## When to stop for confirmation
|
|
41895
41901
|
|
|
41896
41902
|
\`agent.create_from_template\`, \`agent.create_custom\`, \`staffing.assign_user\`, \`agent.go_live\`, \`agent.update_schedule\`, and \`mcp_token.create\` are \`human_required\`; \`agent.configure_tools\` and \`credential.ingress\` are \`credential_flow\` (both gate through the vault-backed credential path with human approval; \`agent.configure_tools\` stages the request and only \`credential.ingress\` takes the raw secret, as a vault reference); \`agent.decommission\` is \`dangerous\`. \`agent.run_now\` is not human-gated because it does not expand authority or change the schedule; it only queues an immediate run for an already-live agent. An agent may draft, configure (with vault refs), dry-run, and request an on-demand run; the human approves go-live, credentials, schedule changes, and decommission. \`run_dry_run\` is ungated by human approval, but it is **precondition-gated**: the seat's permission manifest must be signed first (\`charter.sign_manifest\`). Attempting a dry run before sign-off returns a clean \`COMMAND_PRECONDITION_FAILED\` naming \`charter.sign_manifest\`, not a generic failure. Go-live after a passed dry run is \`human_required\`. See the confirmations guide.
|
|
@@ -42133,7 +42139,7 @@ Decisions should be recorded as human decisions. Handoffs should attach to seats
|
|
|
42133
42139
|
order: 45,
|
|
42134
42140
|
title: "How agents work",
|
|
42135
42141
|
summary: "How {{brand}} agents operate inside seats, use Charters, report work, and escalate beyond authority.",
|
|
42136
|
-
version: "2026-06-20.
|
|
42142
|
+
version: "2026-06-20.4",
|
|
42137
42143
|
public: true,
|
|
42138
42144
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
42139
42145
|
stages: ["staffing", "operating_rhythm"],
|
|
@@ -42225,20 +42231,20 @@ Before an agent goes live, the sandbox dry run rehearses this against fake data
|
|
|
42225
42231
|
|
|
42226
42232
|
## What humans should review
|
|
42227
42233
|
|
|
42228
|
-
The Agents page shows fleet health first: live state, recent runs, failed runs, open held actions, last activity, cost, and the next operator action. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason.
|
|
42234
|
+
The Agents page shows fleet health first: live state, recent runs, failed runs, open held actions, last activity, cost, and the next operator action. It also shows configuration completeness for each staffed agent seat: Steward chain, lane or runtime substrate, vaulted credentials, granted tools, model config, sandbox dry run, and go-live state, each with a remediation link when incomplete. A seat's Trust Card drills into the same facts: run history, one-run detail, tool-call outcomes, product-visible errors, transcript references, and held confirmations or escalations. Open confirmations stay visible until they are decided or expire, even when they are older than the default activity window. Approving or rejecting a held confirmation from the seat page is scoped to that seat; rejection can include a short reason.
|
|
42229
42235
|
|
|
42230
|
-
Review the first dry runs, fleet overview, tool-call audit rows, escalations, and Signal impact. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. Scheduled agents are checked in rounded five-minute buckets, so a minute-level cron inside the bucket queues one work order for that bucket rather than one order per minute. Sandbox dry runs do not count as real turns. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
|
|
42236
|
+
Review the first dry runs, fleet overview, tool-call audit rows, escalations, deliverables, and Signal impact. A seat's completed-work area combines explicit deliverables, work-log evidence, and successful run summaries into one operator-facing trail with safe links labelled as internal, Linear, GitHub, or external. The fleet view at \`/agents\` shows every staffed agent seat at a glance; the agent-native equivalents are \`{{cli}} command agent.list_fleet --json '{}'\` / \`rost_list_agent_fleet\` for the compact overview, and \`{{cli}} agent fleet-digest --json\` / \`agent.fleet_digest\` / \`rost_get_dogfood_fleet_health_digest\` for the daily dogfood evidence bundle. The digest returns live/idle state, 24h/7d turns, 7d/30d spend, recent failed runs, unresolved product errors, failed notifications, and a next action per seat. Fleet real-turn counts use the same seat-run association as \`agent.list_runs\`, filtered to real runs. Scheduled agents are checked in rounded five-minute buckets, so a minute-level cron inside the bucket queues one work order for that bucket rather than one order per minute. Sandbox dry runs do not count as real turns. If the agent is repeatedly blocked, revise the Charter or split the seat. If the agent is taking too much judgment, narrow its autonomous scope.`
|
|
42231
42237
|
},
|
|
42232
42238
|
{
|
|
42233
42239
|
slug: "tool-access-and-vault",
|
|
42234
42240
|
order: 46,
|
|
42235
42241
|
title: "Tool access and vault",
|
|
42236
42242
|
summary: "How to give agents access to tools without exposing raw credentials or expanding authority by accident.",
|
|
42237
|
-
version: "2026-06-20.
|
|
42243
|
+
version: "2026-06-20.5",
|
|
42238
42244
|
public: true,
|
|
42239
42245
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
42240
42246
|
stages: ["staffing"],
|
|
42241
|
-
relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.list", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
|
|
42247
|
+
relatedCommandIds: ["charter.sign_manifest", "credential.ingress", "agent.configure_tools", "integration.list", "integration.readiness", "integration.status", "integration.test", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "confirmation.approve"],
|
|
42242
42248
|
legal: {
|
|
42243
42249
|
publicRisk: "low",
|
|
42244
42250
|
notes: [
|
|
@@ -42288,6 +42294,8 @@ Google can be connected from Settings once the workspace OAuth app is configured
|
|
|
42288
42294
|
|
|
42289
42295
|
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.
|
|
42290
42296
|
|
|
42297
|
+
\`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.
|
|
42298
|
+
|
|
42291
42299
|
## One write-only credential flow across every surface
|
|
42292
42300
|
|
|
42293
42301
|
There is exactly one way to give a connected tool its credential, and it is the same on every surface (agent setup, Charter Builder, CLI, MCP). Connecting a tool only authorizes the access \u2014 it never captures a secret. When a connected tool needs a credential, you stage a vault-backed *request* (provider, scope, and a credential name \u2014 all labels, never the secret). You then provide the actual secret separately through the vault-backed ingress flow from Settings. No {{brand}} surface ever has a field that accepts raw secret material, so a secret can never reach a prompt, log, event, or tool argument.
|
|
@@ -42370,7 +42378,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
42370
42378
|
order: 48,
|
|
42371
42379
|
title: "CLI and MCP installation guide",
|
|
42372
42380
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
42373
|
-
version: "2026-06-20.
|
|
42381
|
+
version: "2026-06-20.12",
|
|
42374
42382
|
public: true,
|
|
42375
42383
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
42376
42384
|
stages: ["company_setup", "staffing"],
|
|
@@ -42409,7 +42417,11 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
42409
42417
|
"agent.fleet_digest",
|
|
42410
42418
|
"agent.get_run",
|
|
42411
42419
|
"agent.list_runs",
|
|
42412
|
-
"agent.list_tool_calls"
|
|
42420
|
+
"agent.list_tool_calls",
|
|
42421
|
+
"integration.list",
|
|
42422
|
+
"integration.readiness",
|
|
42423
|
+
"integration.status",
|
|
42424
|
+
"integration.test"
|
|
42413
42425
|
],
|
|
42414
42426
|
legal: {
|
|
42415
42427
|
publicRisk: "low",
|
|
@@ -42783,12 +42795,13 @@ These ergonomic wrappers (including the \`{{cli}} agent\` group) require **{{cli
|
|
|
42783
42795
|
| \`{{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\` |
|
|
42784
42796
|
| \`{{cli}} runner list|status|work-orders|revoke\` | \`runner.list\`, \`runner.status\`, \`work_order.list\`, \`runner.revoke\` | Inspect runners and work orders; revoke a runner. | Tenant | \`{{cli}} runner list --json\` |
|
|
42785
42797
|
| \`{{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\` |
|
|
42786
|
-
| \`{{cli}} integration list|status|test\` | \`integration.list\`, \`integration.status\`, \`integration.test\` | List connector metadata, read one connector's health, and run the provider-specific connection test without exposing credentials. | Tenant | \`{{cli}} integration
|
|
42798
|
+
| \`{{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\` |
|
|
42787
42799
|
| \`{{cli}} settings get|update\` | \`settings.get\`, \`settings.update\` | Read tenant settings; update budget caps. | Tenant | \`{{cli}} settings get --json\` |
|
|
42788
42800
|
| \`{{cli}} member invite|update|remove\` | \`member.invite\`, \`member.update\`, \`member.remove\` | Manage tenant members. | Tenant | \`{{cli}} member invite --email ops@example.com --role member\` |
|
|
42789
42801
|
| \`{{cli}} agent templates|create|setup|tools|dry-run|go-live|status|run-now|fleet-digest|get-run|show\` | \`agent_template.list\`, \`agent.create_from_template\`, \`agent.create_custom\`, \`agent_setup.get\`, \`agent_setup.update\`, \`agent.configure_tools\`, \`agent.run_dry_run\`, \`agent.go_live\`, \`agent.status\`, \`agent.run_now\`, \`agent.fleet_digest\`, \`agent.get_run\`, \`agent.show_markdown\` | Run the full agent setup and operation flow: list templates, create a draft from a template or guided custom answers (with \`--model\` and \`--effort\`), read or answer setup state, connect or decline tools, dry-run, go live, run on demand, capture the fleet-health digest, read one run's transcript/error diagnostics, and show a markdown readout. Create and go-live stop at human gates; the dry-run is ungated by human approval but requires a signed manifest first. | Tenant and seat | \`{{cli}} agent fleet-digest --json\` |
|
|
42790
42802
|
| \`{{cli}} tools list\` | \`tool.catalog\` | List the discoverable tool catalog the builder reads (id, scope tiers, credential requirement, access policy, and execution-boundary guidance). | Tenant | \`{{cli}} tools list --json\` |
|
|
42791
42803
|
| \`{{cli}} skills list|get|file|assigned|check-dependencies\` | \`skill.list\`, \`skill.get\`, \`skill.file.get\`, \`skill.assigned.list\`, \`skill.check_dependencies\` | Discover reusable Skills, read descriptors and stored package files, list approved Seat assignments, and compare required/optional tool dependencies with a Seat's signed Charter manifest. Skills are instructions, not authority. | Tenant and seat | \`{{cli}} skills list --json\`; \`{{cli}} skills file --slug invoice-review --path SKILL.md\` |
|
|
42804
|
+
| \`{{cli}} skills create|update-draft|import|publish|assign|revoke\` | \`skill.create\`, \`skill.update_draft\`, \`skill.import_github\`, \`skill.import_upload\`, \`skill.publish\`, \`skill.assign_to_seat\`, \`skill.revoke_from_seat\` | Create or import bounded text Skill packages, publish reviewed immutable versions, propose or approve Seat assignments, and revoke future use without deleting historical activations. Publish, revoke, and approved assignment stop at human confirmation; blocked required tools cannot be approved. | Tenant and seat | \`{{cli}} skills import github --url https://github.com/acme/skills/tree/main/ap --json\`; \`{{cli}} skills assign --seat-id <id> --slug invoice-review --json\` |
|
|
42792
42805
|
| \`{{cli}} model list\` | \`model.catalog\` | List guided model tiers with recommendations, token prices, cost bands, best-fit work, and model ids for \`--model\`. | Tenant | \`{{cli}} model list --json\` |
|
|
42793
42806
|
| \`{{cli}} compass show\` | \`compass.show_markdown\` | Render the current Compass as a clean markdown card for review. | Tenant | \`{{cli}} compass show --markdown\` |
|
|
42794
42807
|
| \`{{cli}} charter show\` | \`charter.show_markdown\` | Render a seat's Charter as a clean markdown card for review. | Tenant | \`{{cli}} charter show --seat-id <id> --markdown\` |
|
|
@@ -42917,6 +42930,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
42917
42930
|
| \`rost_send_test_notification\` | \`notification.test\` | Emit an in-app test notification to the acting human. | Tenant | Call with \`{}\`. |
|
|
42918
42931
|
| \`rost_list_notification_errors\` | \`notification.list_errors\` | List recent failed notification deliveries with linked \`error_log_id\`, source, seat id, and run id when available. | Tenant | Call with optional \`limit\`; \`source=run\` rows can be followed with \`agent.get_run\`. |
|
|
42919
42932
|
| \`rost_list_integrations\` | \`integration.list\` | List connected integration metadata and latest health state. | Tenant | Call with \`{}\` or \`{"provider":"google"}\`; no secrets or vault refs are returned. |
|
|
42933
|
+
| \`rost_check_integration_readiness\` | \`integration.readiness\` | Return the connector setup checklist: OAuth env/callback, tenant connection, scopes, latest test state, external verification/CASA, handler availability, and DER-coded next actions. | Tenant | Call with \`{"provider":"google"}\`; metadata only, no secrets or vault refs. |
|
|
42920
42934
|
| \`rost_get_integration_status\` | \`integration.status\` | Read one integration's metadata by provider or integration id. | Tenant | Call with \`{"provider":"google"}\` or \`{"integration_id":"<id>"}\`. |
|
|
42921
42935
|
| \`rost_test_integration_connection\` | \`integration.test\` | Run the provider-specific connection test and update integration health. | Tenant | Call with \`{"provider":"google"}\`; result is bounded metadata only. |
|
|
42922
42936
|
| \`rost_invite_member\` | \`member.invite\` | Create a pending tenant invite for a human teammate. | Tenant | Call with \`email\` and \`role\`. |
|
|
@@ -42958,6 +42972,13 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
42958
42972
|
| \`rost_get_skill_file\` | \`skill.file.get\` | Read stored Skill package file content by slug and package path; paths resolve only inside the stored package payload. Seat-scoped reads are available through \`rost://skills/{slug}/files/{path}\`. | Tenant-admin | Call with \`{"slug":"invoice-review","path":"SKILL.md"}\`. |
|
|
42959
42973
|
| \`rost_list_assigned_skills\` | \`skill.assigned.list\` | List approved Skill assignments for a Seat, including immutable version, dependency status, rationale, and approval time. Seat-scoped reads are available through \`rost://seat/{id}/skills\`. | Tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`. |
|
|
42960
42974
|
| \`rost_check_skill_dependencies\` | \`skill.check_dependencies\` | Compare a Skill version's required and optional tools with a Seat's active or draft Charter permission manifest. Returns ready/blocked/warning and suggested \`agent.configure_tools\` input; it never grants permissions. | Tenant-admin | Call with \`{"seat_id":"<seat-id>","slug":"invoice-review"}\`. |
|
|
42975
|
+
| \`rost_create_skill\` | \`skill.create\` | Create a tenant Skill draft or pending-review Skill from a bounded text package. | Tenant-admin | Call with \`{"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}\`. |
|
|
42976
|
+
| \`rost_update_skill_draft\` | \`skill.update_draft\` | Replace or create the current unpublished draft version for an existing Skill. | Tenant-admin | Call with \`{"slug":"invoice-review","package":{"files":[{"path":"SKILL.md","content":"..."}]}}\`. |
|
|
42977
|
+
| \`rost_import_github_skill\` | \`skill.import_github\` | Import a public GitHub Skill package into pending review or draft after validation. | Tenant-admin | Call with \`{"url":"https://github.com/acme/skills/tree/main/ap","status":"pending_review"}\`. |
|
|
42978
|
+
| \`rost_import_uploaded_skill\` | \`skill.import_upload\` | Import a bounded structured text package. MCP does not accept direct binary uploads in this release. | Tenant-admin | Call with \`{"package":{"files":[{"path":"SKILL.md","content":"..."}]},"status":"draft"}\`. |
|
|
42979
|
+
| \`rost_publish_skill\` | \`skill.publish\` | Human-gated publication of an unpublished Skill version. Published versions are immutable and assignable. | Tenant-admin | Call with \`{"slug":"invoice-review"}\`; non-interactive callers receive a confirmation handoff. |
|
|
42980
|
+
| \`rost_assign_skill_to_seat\` | \`skill.assign_to_seat\` | Propose or human-approve a published Skill version for a Seat after dependency checks. Missing required tools block approval; optional tools warn. | Tenant-admin | Call with \`{"seat_id":"<seat-id>","slug":"invoice-review","status":"proposed","rationale":"Use for AP exception work."}\`. |
|
|
42981
|
+
| \`rost_revoke_skill_from_seat\` | \`skill.revoke_from_seat\` | Human-gated revocation that stops future Skill use without deleting historical activations. | Tenant-admin | Call with \`{"assignment_id":"<assignment-id>"}\`; non-interactive callers receive a confirmation handoff. |
|
|
42961
42982
|
| \`rost_list_model_catalog\` | \`model.catalog\` | List guided model tiers \u2014 recommendations, token prices, cost bands, best-fit work, and model ids for \`--model\`. | Tenant | Call with \`{}\`. |
|
|
42962
42983
|
|
|
42963
42984
|
### Seat-scoped operating tools
|
|
@@ -43144,7 +43165,7 @@ Retrieve the narrowest relevant guide before making a setup recommendation. Pref
|
|
|
43144
43165
|
order: 60,
|
|
43145
43166
|
title: "Cascade guide",
|
|
43146
43167
|
summary: "How to connect company goals to seat-level work without turning {{brand}} into a project-management tool.",
|
|
43147
|
-
version: "2026-06-20.
|
|
43168
|
+
version: "2026-06-20.2",
|
|
43148
43169
|
public: true,
|
|
43149
43170
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
43150
43171
|
stages: ["operating_rhythm"],
|
|
@@ -43197,6 +43218,10 @@ Cascade warnings are advisory, not blockers. They point to setup that should be
|
|
|
43197
43218
|
- Agent goal missing human accountability parent: an agent-owned goal has no human or hybrid goal in its ancestry.
|
|
43198
43219
|
- Orphaned goal branch: the owner seat or parent chain no longer reaches an active Compass objective.
|
|
43199
43220
|
|
|
43221
|
+
On \`/cascade\`, the screen renders the full goal depth, not just one or two levels. Off-track descendant branches stay open so the operator can see why a parent rolled up to risk.
|
|
43222
|
+
|
|
43223
|
+
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.
|
|
43224
|
+
|
|
43200
43225
|
## What does not belong
|
|
43201
43226
|
|
|
43202
43227
|
Do not put every task into Cascade. Small errands, private notes, and work with no strategic connection should stay out. Cascade should answer whether the company is moving toward its stated outcomes.
|
|
@@ -43288,7 +43313,7 @@ Agents may record readings when the Charter allows it. Agent-reported readings s
|
|
|
43288
43313
|
order: 62,
|
|
43289
43314
|
title: "Friction guide",
|
|
43290
43315
|
summary: "How to capture issues with evidence, rank them, and resolve them without losing ownership.",
|
|
43291
|
-
version: "2026-06-
|
|
43316
|
+
version: "2026-06-20.1",
|
|
43292
43317
|
public: true,
|
|
43293
43318
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
43294
43319
|
stages: ["operating_rhythm"],
|
|
@@ -43337,6 +43362,8 @@ Friction is where operational issues become visible. A good Friction item is spe
|
|
|
43337
43362
|
|
|
43338
43363
|
Agents should file Friction when a measurable breaks, a tool fails, a repeated exception appears, or the Charter says a condition must be escalated. The agent should attach evidence and avoid deciding beyond its scope.
|
|
43339
43364
|
|
|
43365
|
+
In the app, operational evidence is summarized for humans instead of shown as the primary interface. Incident fields, proposed tool calls, schedules, payload labels, and source links render as readable fields with raw details tucked behind supporting context when useful. Secret-shaped values stay redacted.
|
|
43366
|
+
|
|
43340
43367
|
## Operate Friction, tasks, and escalations from CLI or MCP
|
|
43341
43368
|
|
|
43342
43369
|
Friction, tasks, and escalations are the issue-to-action loop. A seat files, a task carries the work, and an escalation routes a decision a seat cannot make alone.
|
|
@@ -43358,7 +43385,7 @@ Resolving Friction should produce one of four outcomes: a decision, a task, a Ch
|
|
|
43358
43385
|
order: 70,
|
|
43359
43386
|
title: "Steward queue guide",
|
|
43360
43387
|
summary: "How Stewards review escalations, approve agent boundaries, and keep agents accountable.",
|
|
43361
|
-
version: "2026-06-
|
|
43388
|
+
version: "2026-06-20.1",
|
|
43362
43389
|
public: true,
|
|
43363
43390
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
43364
43391
|
stages: ["staffing", "operating_rhythm"],
|
|
@@ -43395,6 +43422,8 @@ Read the seat, Charter, evidence, and recommended action. Decide the narrow ques
|
|
|
43395
43422
|
|
|
43396
43423
|
In the app, the evidence is shown as a legible card, not raw data: a proposed tool call lists the tool and its summarized arguments, and any attached context shows as labeled fields. Values that read like credentials are redacted, so you can decide without seeing secret material.
|
|
43397
43424
|
|
|
43425
|
+
When nothing is waiting, the Steward page still proves the governance loop. It shows which agent or hybrid seats the human stewards, how many escalations were raised or decided recently, and whether any are open. That empty state is an operating summary, not a dead end.
|
|
43426
|
+
|
|
43398
43427
|
## Work the queue from CLI or MCP
|
|
43399
43428
|
|
|
43400
43429
|
The Steward reads the queue from any surface but decides as a human.
|
|
@@ -43471,11 +43500,11 @@ Stop before: approving a Charter, signing a manifest, connecting a tool or crede
|
|
|
43471
43500
|
order: 72,
|
|
43472
43501
|
title: "Settings guide",
|
|
43473
43502
|
summary: "How to use Settings as the control plane for company access, channels, providers, tokens, and operating defaults.",
|
|
43474
|
-
version: "2026-06-20.
|
|
43503
|
+
version: "2026-06-20.7",
|
|
43475
43504
|
public: true,
|
|
43476
43505
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
43477
43506
|
stages: ["company_setup", "staffing"],
|
|
43478
|
-
relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.status", "integration.test", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
|
|
43507
|
+
relatedCommandIds: ["onboarding.create_invite", "mcp_token.create", "mcp_token.revoke", "mcp_token.list", "integration.list", "integration.readiness", "integration.status", "integration.test", "settings.get", "settings.update", "settings.sync_brief_scope.get", "settings.sync_brief_scope.update"],
|
|
43479
43508
|
legal: { publicRisk: "low", notes: ["{{brand}}-native settings guidance."] },
|
|
43480
43509
|
sources: [
|
|
43481
43510
|
{
|
|
@@ -43505,11 +43534,11 @@ Start with members and invites, then provider and channel connections, then MCP
|
|
|
43505
43534
|
|
|
43506
43535
|
Settings lifecycle timestamps are display metadata for tokens, connected machines, integrations, and stored credentials. They may be emitted by the database as either timestamp values or strings, but Settings renders them as safe labels rather than treating timestamp formatting failures as page-level failures.
|
|
43507
43536
|
|
|
43508
|
-
When a settings source is temporarily unavailable, the app keeps the route open and marks affected sections as unavailable instead of showing raw errors or stale-looking editable values. Budget and Sync Brief controls stay read-only until their server-backed data can be loaded.
|
|
43537
|
+
When a settings source is temporarily unavailable, the app keeps the route open and marks affected sections as unavailable instead of showing raw errors or stale-looking editable values. Budget and Sync Brief controls stay read-only until their server-backed data can be loaded. Notification timestamps and integration test timestamps follow the same safe-label rule, so a malformed or missing timestamp becomes \`Unknown\` or unavailable copy rather than a page crash.
|
|
43509
43538
|
|
|
43510
43539
|
## Integration health
|
|
43511
43540
|
|
|
43512
|
-
\`integration.list\` lists connector metadata for CLI and MCP operators, \`integration.status\` reads one provider or integration id, and \`integration.test\` runs the installed provider-specific health check. These commands return account labels, scopes, capabilities, timestamps, and health only; they never return vault references, access tokens, refresh tokens, or raw provider responses. Google's test refreshes the vaulted OAuth credential and reads the Gmail profile as the minimal live check. Settings exposes the same Google
|
|
43541
|
+
\`integration.list\` lists connector metadata for CLI and MCP operators, \`integration.readiness\` returns the setup checklist, \`integration.status\` reads one provider or integration id, and \`integration.test\` runs the installed provider-specific health check. These commands return account labels, scopes, capabilities, timestamps, checklist status, DER-coded next actions, and health only; they never return vault references, access tokens, refresh tokens, client secrets, or raw provider responses. Google's test refreshes the vaulted OAuth credential and reads the Gmail profile as the minimal live check. Settings exposes the same Google readiness facts and test action beside Connect/Reconnect, showing whether OAuth env, callback registration, tenant connection, scopes, tests, Google verification/CASA, and Gmail/Sheets handler slices are ready or still waiting on DER-880, DER-881, DER-866, DER-867, or DER-869.
|
|
43513
43542
|
|
|
43514
43543
|
Reconnects keep historical rows for audit, but provider status in Settings, CLI, and MCP prefers the current connected row first, then the latest error or disconnected row.
|
|
43515
43544
|
|
|
@@ -43772,7 +43801,7 @@ Templates may draft. Humans approve. A stock agent should not go live until a hu
|
|
|
43772
43801
|
order: 77,
|
|
43773
43802
|
title: "Troubleshooting guide",
|
|
43774
43803
|
summary: "How users and agents should diagnose common setup, tool, Signal, Friction, and MCP problems.",
|
|
43775
|
-
version: "2026-06-
|
|
43804
|
+
version: "2026-06-20.1",
|
|
43776
43805
|
public: true,
|
|
43777
43806
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
43778
43807
|
stages: ["company_setup", "staffing", "operating_rhythm"],
|
|
@@ -43805,10 +43834,12 @@ Before calling a command that changes state, discover its exact shape so you do
|
|
|
43805
43834
|
- Onboarding seems stuck: call \`onboarding.status\` / \`rost_onboard_status\` and inspect missing graph, Charter, Compass, or staffing steps.
|
|
43806
43835
|
- Graph looks wrong: read \`graph.get\` / \`rost://graph\` to confirm seat ids, parents, and occupancy before mutating.
|
|
43807
43836
|
- Agent cannot act: check the Charter, permission manifest, Steward chain, and token scope with \`agent.status\` / \`rost_get_agent_status\` and \`seat.get\`.
|
|
43837
|
+
- Agent looks incomplete: open the fleet row on \`/agents\` and follow the configuration readiness links for the missing Steward chain, lane/substrate, credentials, tools, model config, sandbox dry run, or go-live state.
|
|
43808
43838
|
- Signal looks wrong: read \`signal.list\` / \`rost_list_signals\` and check owner seat, cadence, target, and evidence.
|
|
43809
43839
|
- Friction is noisy: read \`friction.list\` and check whether the underlying Charter or measurable is unclear.
|
|
43810
43840
|
- Escalations are aging: read \`escalation.list\` / \`rost_list_escalations\`; a human resolves through the Steward queue.
|
|
43811
43841
|
- 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\`).
|
|
43842
|
+
- 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.
|
|
43812
43843
|
|
|
43813
43844
|
## Surface-specific failures
|
|
43814
43845
|
|
|
@@ -45074,6 +45105,7 @@ function parseSemver(value) {
|
|
|
45074
45105
|
}
|
|
45075
45106
|
|
|
45076
45107
|
// src/operations.ts
|
|
45108
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
45077
45109
|
var UsageError = class extends Error {
|
|
45078
45110
|
};
|
|
45079
45111
|
function parseFlags(args, booleanFlags = /* @__PURE__ */ new Set()) {
|
|
@@ -45775,6 +45807,17 @@ var integrationWrapper = (context, args) => dispatch(context, "integration", arg
|
|
|
45775
45807
|
return integrations.map((entry) => formatIntegrationLine(asRecord(entry))).join("\n");
|
|
45776
45808
|
});
|
|
45777
45809
|
},
|
|
45810
|
+
readiness: (ctx, rest) => {
|
|
45811
|
+
const parsed = parseFlags(rest);
|
|
45812
|
+
const body = withOptional({}, { provider: optionalValue(parsed, "provider") });
|
|
45813
|
+
return execute(ctx, parsed, "integration.readiness", body, (output) => {
|
|
45814
|
+
const connectors = asArray(asRecord(output).connectors);
|
|
45815
|
+
if (connectors.length === 0) {
|
|
45816
|
+
return "No connector readiness facts found.";
|
|
45817
|
+
}
|
|
45818
|
+
return connectors.map((entry) => formatIntegrationReadiness(asRecord(entry))).join("\n\n");
|
|
45819
|
+
});
|
|
45820
|
+
},
|
|
45778
45821
|
status: (ctx, rest) => {
|
|
45779
45822
|
const parsed = parseFlags(rest);
|
|
45780
45823
|
const body = integrationLookupBody(parsed);
|
|
@@ -45808,9 +45851,24 @@ function integrationLookupBody(parsed) {
|
|
|
45808
45851
|
function formatIntegrationLine(record2) {
|
|
45809
45852
|
return `${field(record2, "provider")} status=${field(record2, "status")} account=${field(record2, "account_email")} last_test=${field(record2, "last_test_result")} id=${field(record2, "id")}`;
|
|
45810
45853
|
}
|
|
45854
|
+
function formatIntegrationReadiness(record2) {
|
|
45855
|
+
const checks = asArray(record2.checks).map((entry) => {
|
|
45856
|
+
const check2 = asRecord(entry);
|
|
45857
|
+
const issue2 = field(check2, "linear_issue") === "\u2014" ? "" : ` ${field(check2, "linear_issue")}`;
|
|
45858
|
+
return ` - ${field(check2, "label")}: ${field(check2, "status")}${issue2} \u2014 ${field(check2, "detail")}`;
|
|
45859
|
+
});
|
|
45860
|
+
const actions = asArray(record2.next_actions).map((entry) => ` - ${String(entry)}`);
|
|
45861
|
+
return [
|
|
45862
|
+
`${field(record2, "provider")} readiness=${field(record2, "overall_status")} id=${field(record2, "integration_id")}`,
|
|
45863
|
+
field(record2, "summary"),
|
|
45864
|
+
checks.length > 0 ? ["checks:", ...checks].join("\n") : "",
|
|
45865
|
+
actions.length > 0 ? ["next:", ...actions].join("\n") : ""
|
|
45866
|
+
].filter((line) => line.length > 0).join("\n");
|
|
45867
|
+
}
|
|
45811
45868
|
function integrationUsage(bin) {
|
|
45812
|
-
return `Usage: ${bin} integration list|status|test [--json]
|
|
45869
|
+
return `Usage: ${bin} integration list|readiness|status|test [--json]
|
|
45813
45870
|
${bin} integration list [--provider <name>]
|
|
45871
|
+
${bin} integration readiness [--provider google]
|
|
45814
45872
|
${bin} integration status --provider <name>
|
|
45815
45873
|
${bin} integration test --provider <name>`;
|
|
45816
45874
|
}
|
|
@@ -46192,7 +46250,89 @@ function formatDependencyCheck(output) {
|
|
|
46192
46250
|
render("optional", asArray(record2.optional))
|
|
46193
46251
|
].join("\n");
|
|
46194
46252
|
}
|
|
46253
|
+
function packageFromSkillFile(filePath) {
|
|
46254
|
+
return {
|
|
46255
|
+
files: [{ path: "SKILL.md", content: readFileSync2(filePath, "utf8") }]
|
|
46256
|
+
};
|
|
46257
|
+
}
|
|
46258
|
+
function formatSkillWrite(label) {
|
|
46259
|
+
return (output) => {
|
|
46260
|
+
const skill = asRecord(asRecord(output).skill);
|
|
46261
|
+
const warnings = asArray(asRecord(skill.validation).warnings).length;
|
|
46262
|
+
return [
|
|
46263
|
+
`${label}: \`${field(skill, "slug")}\` v${field(skill, "version")} (${field(skill, "skill_version_id")})`,
|
|
46264
|
+
`status: ${field(skill, "status")}`,
|
|
46265
|
+
`content_sha256: ${field(skill, "content_sha256")}`,
|
|
46266
|
+
`validation_warnings: ${warnings}`
|
|
46267
|
+
].join("\n");
|
|
46268
|
+
};
|
|
46269
|
+
}
|
|
46270
|
+
function formatAssignment(output) {
|
|
46271
|
+
const record2 = asRecord(output);
|
|
46272
|
+
const assignment = asRecord(record2.assignment);
|
|
46273
|
+
return [
|
|
46274
|
+
`Skill assignment ${field(record2, "approval_status")}: \`${field(assignment, "slug")}\` v${field(assignment, "version")} \u2192 seat ${field(assignment, "seat_id")}`,
|
|
46275
|
+
`assignment_id: ${field(assignment, "assignment_id")}`,
|
|
46276
|
+
`skill_version_id: ${field(assignment, "skill_version_id")}`,
|
|
46277
|
+
`dependency_status: ${field(asRecord(record2.dependency_status), "status")}`,
|
|
46278
|
+
`next: ${field(record2, "local_sync_next_step")}`
|
|
46279
|
+
].join("\n");
|
|
46280
|
+
}
|
|
46281
|
+
function formatRevocation(output) {
|
|
46282
|
+
const record2 = asRecord(output);
|
|
46283
|
+
return [
|
|
46284
|
+
`Skill assignment revoked: \`${field(record2, "slug")}\` from seat ${field(record2, "seat_id")}`,
|
|
46285
|
+
`assignment_id: ${field(record2, "assignment_id")}`,
|
|
46286
|
+
`skill_version_id: ${field(record2, "skill_version_id")}`,
|
|
46287
|
+
`next: ${field(record2, "local_sync_next_step")}`
|
|
46288
|
+
].join("\n");
|
|
46289
|
+
}
|
|
46195
46290
|
var skillsWrapper = (context, args) => dispatch(context, "skills", args, {
|
|
46291
|
+
create: (ctx, rest) => {
|
|
46292
|
+
const parsed = parseFlags(rest);
|
|
46293
|
+
const body = withOptional({ package: packageFromSkillFile(requireValue2(parsed, "file")) }, {
|
|
46294
|
+
status: optionalValue(parsed, "status")
|
|
46295
|
+
});
|
|
46296
|
+
return execute(ctx, parsed, "skill.create", body, formatSkillWrite("Skill draft created"));
|
|
46297
|
+
},
|
|
46298
|
+
"update-draft": (ctx, rest) => {
|
|
46299
|
+
const parsed = parseFlags(rest);
|
|
46300
|
+
const body = withOptional({
|
|
46301
|
+
slug: requireValue2(parsed, "slug"),
|
|
46302
|
+
package: packageFromSkillFile(requireValue2(parsed, "file"))
|
|
46303
|
+
}, {
|
|
46304
|
+
status: optionalValue(parsed, "status")
|
|
46305
|
+
});
|
|
46306
|
+
return execute(ctx, parsed, "skill.update_draft", body, formatSkillWrite("Skill draft updated"));
|
|
46307
|
+
},
|
|
46308
|
+
publish: (ctx, rest) => {
|
|
46309
|
+
const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["allow-warnings"]));
|
|
46310
|
+
const body = withOptional({ allow_warnings: parsed.flags.has("allow-warnings") }, {
|
|
46311
|
+
slug: optionalValue(parsed, "slug"),
|
|
46312
|
+
skill_version_id: optionalValue(parsed, "skill-version-id")
|
|
46313
|
+
});
|
|
46314
|
+
return execute(ctx, parsed, "skill.publish", body, formatSkillWrite("Skill published"));
|
|
46315
|
+
},
|
|
46316
|
+
import: (ctx, rest) => {
|
|
46317
|
+
const [kind, ...remaining] = rest;
|
|
46318
|
+
if (kind === "github") {
|
|
46319
|
+
const parsed = parseFlags(remaining);
|
|
46320
|
+
const body = withOptional({ url: requireValue2(parsed, "url") }, {
|
|
46321
|
+
ref: optionalValue(parsed, "ref"),
|
|
46322
|
+
path: optionalValue(parsed, "path"),
|
|
46323
|
+
status: optionalValue(parsed, "status")
|
|
46324
|
+
});
|
|
46325
|
+
return execute(ctx, parsed, "skill.import_github", body, formatSkillWrite("GitHub skill imported"));
|
|
46326
|
+
}
|
|
46327
|
+
if (kind === "upload") {
|
|
46328
|
+
const parsed = parseFlags(remaining);
|
|
46329
|
+
const body = withOptional({ package: packageFromSkillFile(requireValue2(parsed, "file")) }, {
|
|
46330
|
+
status: optionalValue(parsed, "status")
|
|
46331
|
+
});
|
|
46332
|
+
return execute(ctx, parsed, "skill.import_upload", body, formatSkillWrite("Uploaded skill imported"));
|
|
46333
|
+
}
|
|
46334
|
+
throw new UsageError(`Usage: ${ctx.binName} skills import github|upload ...`);
|
|
46335
|
+
},
|
|
46196
46336
|
list: (ctx, rest) => {
|
|
46197
46337
|
const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["include-archived"]));
|
|
46198
46338
|
const body = withOptional({}, {
|
|
@@ -46224,15 +46364,46 @@ var skillsWrapper = (context, args) => dispatch(context, "skills", args, {
|
|
|
46224
46364
|
skill_version_id: optionalValue(parsed, "skill-version-id")
|
|
46225
46365
|
});
|
|
46226
46366
|
return execute(ctx, parsed, "skill.check_dependencies", body, formatDependencyCheck);
|
|
46367
|
+
},
|
|
46368
|
+
assign: (ctx, rest) => {
|
|
46369
|
+
const parsed = parseFlags(rest, /* @__PURE__ */ new Set(["approve", "allow-blocked-proposal"]));
|
|
46370
|
+
const body = withOptional({
|
|
46371
|
+
seat_id: requireValue2(parsed, "seat-id"),
|
|
46372
|
+
status: parsed.flags.has("approve") ? "approved" : "proposed",
|
|
46373
|
+
rationale: optionalValue(parsed, "rationale") ?? "Skill assignment requested from the CLI.",
|
|
46374
|
+
allow_blocked_proposal: parsed.flags.has("allow-blocked-proposal")
|
|
46375
|
+
}, {
|
|
46376
|
+
slug: optionalValue(parsed, "slug") ?? optionalValue(parsed, "skill"),
|
|
46377
|
+
skill_version_id: optionalValue(parsed, "skill-version-id")
|
|
46378
|
+
});
|
|
46379
|
+
return execute(ctx, parsed, "skill.assign_to_seat", body, formatAssignment);
|
|
46380
|
+
},
|
|
46381
|
+
revoke: (ctx, rest) => {
|
|
46382
|
+
const parsed = parseFlags(rest);
|
|
46383
|
+
const body = withOptional({}, {
|
|
46384
|
+
assignment_id: optionalValue(parsed, "assignment-id"),
|
|
46385
|
+
seat_id: optionalValue(parsed, "seat-id"),
|
|
46386
|
+
slug: optionalValue(parsed, "slug") ?? optionalValue(parsed, "skill"),
|
|
46387
|
+
skill_version_id: optionalValue(parsed, "skill-version-id"),
|
|
46388
|
+
rationale: optionalValue(parsed, "rationale")
|
|
46389
|
+
});
|
|
46390
|
+
return execute(ctx, parsed, "skill.revoke_from_seat", body, formatRevocation);
|
|
46227
46391
|
}
|
|
46228
46392
|
}, skillsUsage(context.binName));
|
|
46229
46393
|
function skillsUsage(bin) {
|
|
46230
|
-
return `Usage: ${bin} skills list|get|file|assigned|check-dependencies [--json]
|
|
46394
|
+
return `Usage: ${bin} skills create|update-draft|publish|import|list|get|file|assigned|check-dependencies|assign|revoke [--json]
|
|
46395
|
+
${bin} skills create --file ./SKILL.md [--status draft|pending_review]
|
|
46396
|
+
${bin} skills update-draft --slug <slug> --file ./SKILL.md [--status draft|pending_review]
|
|
46397
|
+
${bin} skills import github --url <github-url> [--ref <ref>] [--path <dir>] [--status draft|pending_review]
|
|
46398
|
+
${bin} skills import upload --file ./SKILL.md [--status draft|pending_review]
|
|
46399
|
+
${bin} skills publish (--slug <slug>|--skill-version-id <id>) [--allow-warnings]
|
|
46231
46400
|
${bin} skills list [--status draft|pending_review|published|archived] [--visibility private|seat|tenant] [--query <text>]
|
|
46232
46401
|
${bin} skills get --slug <slug>
|
|
46233
46402
|
${bin} skills file --slug <slug> --path SKILL.md
|
|
46234
46403
|
${bin} skills assigned [--seat-id <id>] [--seat <id>]
|
|
46235
|
-
${bin} skills check-dependencies --seat-id <id> (--slug <slug>|--skill-version-id <id>)
|
|
46404
|
+
${bin} skills check-dependencies --seat-id <id> (--slug <slug>|--skill-version-id <id>)
|
|
46405
|
+
${bin} skills assign --seat-id <id> (--slug <slug>|--skill-version-id <id>) [--approve] [--allow-blocked-proposal]
|
|
46406
|
+
${bin} skills revoke (--assignment-id <id>|--seat-id <id> --slug <slug>)`;
|
|
46236
46407
|
}
|
|
46237
46408
|
var modelWrapper = (context, args) => dispatch(context, "model", args, {
|
|
46238
46409
|
list: (ctx, rest) => {
|