@growthub/cli 0.14.2 → 0.14.3
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/assets/worker-kits/growthub-custom-workspace-starter-v1/SKILL.md +4 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/agent-outcomes/route.js +85 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/apps/route.js +187 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/apply/route.js +36 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/patch/preflight/route.js +152 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-sources/route.js +21 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/route.js +88 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +72 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/swarm-condition/route.js +2 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-source/route.js +21 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/workflow/publish/route.js +338 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceLensPanel.jsx +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +22 -165
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-publish.js +179 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +89 -5
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-app-registry.js +539 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-config.js +11 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +23 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-outcome-receipts.js +157 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-patch-policy.js +400 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +10 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/skills/governed-workspace-mutation/SKILL.md +203 -0
- package/package.json +2 -2
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: governed-workspace-mutation
|
|
3
|
+
description: The two canonical workspace API calls and the verified mutation protocol — PATCH /api/workspace (4-field allowlist) and POST /api/workspace/sandbox-run (sandbox execution). Read this before changing workspace configuration or executing anything, in any agent harness. Every shape and error below was verified against the live workspace runtime, not inferred from docs.
|
|
4
|
+
triggers:
|
|
5
|
+
- change workspace config
|
|
6
|
+
- patch the workspace
|
|
7
|
+
- add a data model object
|
|
8
|
+
- run a sandbox
|
|
9
|
+
- execute a workflow row
|
|
10
|
+
- publish a draft graph
|
|
11
|
+
progressiveDisclosure: false
|
|
12
|
+
sessionMemory:
|
|
13
|
+
path: .growthub-fork/project.md
|
|
14
|
+
selfEval:
|
|
15
|
+
criteria:
|
|
16
|
+
- Every mutation went through PATCH /api/workspace or POST /api/workspace/sandbox-run — no direct config/sidecar file writes while the app is running, no invented routes.
|
|
17
|
+
- PATCH bodies contain only changed allowlisted keys, never the whole config.
|
|
18
|
+
- Each mutation was verified by its success envelope before any dependent step ran.
|
|
19
|
+
- Draft graphs were proven with useDraft true before being published onto the row.
|
|
20
|
+
- No credential value crossed the wire — env-ref names only.
|
|
21
|
+
maxRetries: 3
|
|
22
|
+
traceTo: .growthub-fork/trace.jsonl
|
|
23
|
+
helpers: []
|
|
24
|
+
subSkills: []
|
|
25
|
+
mcpTools: []
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Governed Workspace Mutation — the two canonical calls
|
|
29
|
+
|
|
30
|
+
This workspace already contains the machinery you would otherwise write. Dashboards, widgets, data objects, API registry rows, sandbox environments, and agent-swarm graphs are **governed objects that hold state** in `growthub.config.json`. You do not code features against them — you mutate them through exactly **two** API calls, and the runtime does validation, persistence, run history, and row stamping for you.
|
|
31
|
+
|
|
32
|
+
| Intent | The one true call |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Change workspace configuration | `PATCH /api/workspace` |
|
|
35
|
+
| Execute a `sandbox-environment` row (incl. agent-swarm graphs) | `POST /api/workspace/sandbox-run` |
|
|
36
|
+
|
|
37
|
+
Everything else is a read (`GET /api/workspace`) or a specialised governed lane (`refresh-sources`, `test-source`, `helper/query|apply`, `patch/preflight`, `workflow/publish`). There is no third mutation path. Route truth in this tree: `apps/workspace/app/api/workspace/route.js`, `apps/workspace/app/api/workspace/sandbox-run/route.js`, `apps/workspace/app/api/workspace/patch/preflight/route.js`, `apps/workspace/app/api/workspace/workflow/publish/route.js`.
|
|
38
|
+
|
|
39
|
+
**This boundary is runtime-enforced, not advisory.** `PATCH /api/workspace` runs every body through the mutation policy (`apps/workspace/lib/workspace-patch-policy.js`) before any write; violations return **HTTP 422** with structured `violations[] = { code, path, message }`. An agent that ignores this card does not get a different outcome — it gets a 422. SDK types: `@growthub/api-contract/workspace-patch`.
|
|
40
|
+
|
|
41
|
+
## First-session traversal (token-budgeted, any harness)
|
|
42
|
+
|
|
43
|
+
Seven reads, in order, regardless of how the operator has personalised the workspace — these anchors are invariant:
|
|
44
|
+
|
|
45
|
+
1. `SKILL.md` (workspace root) — discovery entry
|
|
46
|
+
2. `.growthub-fork/project.md` — session memory (your prior state)
|
|
47
|
+
3. `AGENTS.md` — agent contract
|
|
48
|
+
4. `.growthub-fork/policy.json` — what you may touch
|
|
49
|
+
5. tail of `.growthub-fork/trace.jsonl` — recent governed events
|
|
50
|
+
6. `GET /api/workspace` → `workspaceConfig` + `workspaceConfigPersistence` — live config and whether saves are possible (`canSave`, `guidance`)
|
|
51
|
+
7. `apps/workspace/lib/workspace-schema.js` — what valid edits look like (only when you are about to mutate)
|
|
52
|
+
|
|
53
|
+
Then state your plan in terms of governed objects, not new code.
|
|
54
|
+
|
|
55
|
+
## The verified mutation protocol (runtime-enforced)
|
|
56
|
+
|
|
57
|
+
Every mutation follows **read → preflight → prove → publish → confirm**. This is not ceremony the agent may skip — the runtime enforces the load-bearing steps.
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
1. READ GET /api/workspace → workspaceConfig, persistence mode
|
|
61
|
+
2. PREFLIGHT POST /api/workspace/patch/preflight → dry-runs the exact PATCH gates
|
|
62
|
+
(mutation policy + merged-config schema) and returns structured reasons;
|
|
63
|
+
fix every reason before the real PATCH
|
|
64
|
+
3. PROVE data sources → POST /api/workspace/test-source
|
|
65
|
+
sandbox rows → POST /api/workspace/sandbox-run (the run IS the test)
|
|
66
|
+
workflow drafts → sandbox-run with {"useDraft": true} — executes the draft
|
|
67
|
+
without publishing; stamps the run + its draftSha256
|
|
68
|
+
into the server-owned run history
|
|
69
|
+
4. PUBLISH config keys → PATCH /api/workspace with ONLY the changed allowlisted key
|
|
70
|
+
workflow drafts → POST /api/workspace/workflow/publish — the ONLY transition
|
|
71
|
+
from draft to live (see below)
|
|
72
|
+
5. CONFIRM require the success envelope before any dependent step. A failed call
|
|
73
|
+
means nothing downstream may be applied.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Drafting on behalf of a user? Prefer the helper lane — `POST /api/workspace/helper/query` proposes (no writes), a human reviews, `helper/apply` validates and writes with a receipt (its final `ok: true` is only reachable after the write succeeds). The PATCH allowlist is the helper's hard ceiling too (`docs/WORKSPACE_HELPER_CONTRACT_V1.md` in the source repo).
|
|
77
|
+
|
|
78
|
+
## Workflow publish — server-authoritative
|
|
79
|
+
|
|
80
|
+
Live workflow state on sandbox-environment rows is **publish-owned**. The mutation policy blocks direct PATCH from: changing `orchestrationGraph` / `orchestrationConfig` / `orchestrationPublishedAt` / `orchestrationDeltas`, bumping `version`, or transitioning `lifecycleStatus` to `"live"` (echoing persisted values is always fine; moving a live row back to draft — pausing — remains a direct operator action).
|
|
81
|
+
|
|
82
|
+
`POST /api/workspace/workflow/publish` with `{ objectId, name }` verifies, against server-owned state:
|
|
83
|
+
|
|
84
|
+
1. a saved draft exists (`orchestrationDraftConfig` / `orchestrationDraftGraph`);
|
|
85
|
+
2. the draft test passed (`orchestrationDraftTestPassed`) **and** the tested config equals the saved draft byte-for-byte;
|
|
86
|
+
3. **lineage**: the row's `orchestrationDraftLastRunId` resolves to a record in the sandbox run history whose `exitCode` is 0 and whose `draftSha256` (stamped by sandbox-run from the exact graph it executed, before execution) matches this draft — the attestation fields alone are PATCH-writable and therefore never trusted;
|
|
87
|
+
4. the draft parses as a valid orchestration graph.
|
|
88
|
+
|
|
89
|
+
Then it bumps `version`, moves draft → live, clears draft state, stamps `orchestrationPublishedAt`, appends the `orchestrationDeltas` record (with `publishedSha256`), sets `lifecycleStatus: "live"`, and persists. Failure codes: `no_draft`, `draft_not_tested`, `draft_changed_after_test`, `draft_run_not_verified`, `invalid_graph`, `read_only`.
|
|
90
|
+
|
|
91
|
+
## Call 1 — `PATCH /api/workspace`
|
|
92
|
+
|
|
93
|
+
**Permanent allowlist — exactly four keys:** `dashboards`, `widgetTypes`, `canvas`, `dataModel`. Verified live: any other key is rejected before validation.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Read first (response key: workspaceConfig; persistence: workspaceConfigPersistence)
|
|
97
|
+
curl -s "$WS/api/workspace" | jq '.workspaceConfig.dataModel'
|
|
98
|
+
|
|
99
|
+
# Patch ONLY the key you changed — each allowlisted key is replaced whole,
|
|
100
|
+
# so send the complete updated value FOR THAT KEY and nothing else.
|
|
101
|
+
curl -s -X PATCH "$WS/api/workspace" -H 'content-type: application/json' \
|
|
102
|
+
-d '{"dataModel": {"objects": [ ... ]}}'
|
|
103
|
+
# Success → 200 {"workspaceConfig": <next full config>}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Observed error envelopes — handle all of them, never retry blindly:**
|
|
107
|
+
|
|
108
|
+
| Status | Observed body | Agent action |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| 400 | `{"error":"patch contains unknown fields","details":[...],"allowed":["dashboards","widgetTypes","canvas","dataModel"]}` | Remove the key. There is no other route — `branding`, `capabilities`, `integrations`, `id`, `provenance` are read-only through this API. |
|
|
111
|
+
| 400 | `{"error":"patch must be a plain object"}` | Body must be a JSON object, not an array/scalar. |
|
|
112
|
+
| 400 | `{"error":"invalid workspace config: <joined errors>","details":[...]}` | Fix each entry in `details`; read `workspace-schema.js`, don't guess. |
|
|
113
|
+
| 422 | `{"error":"patch rejected by workspace mutation policy","violations":[{code,path,message}],"preflight":...}` | Read each violation's `message` — it names the governed alternative (publish route, refresh-sources, source records). Never look for a workaround; preflight the corrected body. |
|
|
114
|
+
| 409 | `{"error":"workspace config is read-only in this runtime", "guidance": ...}` | Surface `guidance` to the user (edit `growthub.config.json` locally, or `WORKSPACE_CONFIG_ALLOW_FS_WRITE=true` on a writable runtime). Never work around it. |
|
|
115
|
+
| 500 | persistence fault | Report; do not mutate files behind the adapter's back. |
|
|
116
|
+
|
|
117
|
+
**Status precision:** unknown top-level keys — including full-config bodies and `workspaceSourceRecords` — are caught by the route's legacy allowlist check first and return **400** with `allowed[]`; the policy's named reasons for those cases (`unknown_field`, `full_config_body`, `source_records_through_patch`) surface through **preflight**. The **422** policy rejection covers content violations *inside* allowlisted keys: `live_workflow_field`, `live_publish_via_patch`, `credential_field`, `history_smuggling`, `oversized_patch` (2 MB body), `oversized_row` (128 KB, echoes exempt), `oversized_object` (500 rows), `oversized_node_config` (64 KB).
|
|
118
|
+
|
|
119
|
+
**Validator facts verified live:**
|
|
120
|
+
|
|
121
|
+
- A fresh workspace has **no `dataModel` key** — your first `dataModel` PATCH creates it.
|
|
122
|
+
- Every `dataModel.objects[]` entry requires `id` (unique non-empty string), `label` (non-empty string), `rows` (array). `columns` must be a string array when present.
|
|
123
|
+
- Secret-shaped fields are rejected by name on sandbox rows (`apiKey`, `token`, `accessToken`, `refreshToken`, `bearer`, `password`, `secret`, `sessionKey`) with: *"auth secrets must stay in the local CLI's own store"*. Rows carry `authRef` / env-ref **names** only.
|
|
124
|
+
- `dataModel` edits must not create widgets or touch `canvas` as a side effect. Binding an object to a dashboard is a separate action on an existing View widget.
|
|
125
|
+
- `workspaceSourceRecords` is GET-only hydration; sidecar writes flow through `POST /api/workspace/refresh-sources`, never PATCH.
|
|
126
|
+
|
|
127
|
+
## Call 2 — `POST /api/workspace/sandbox-run`
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
curl -s -X POST "$WS/api/workspace/sandbox-run" -H 'content-type: application/json' \
|
|
131
|
+
-d '{"objectId": "<object id>", "name": "<row Name>"}'
|
|
132
|
+
# Draft proof: add "useDraft": true (+ optional "draftGraph") — runs the draft
|
|
133
|
+
# orchestration graph without publishing it onto the row.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Row-shape facts verified live (the traps):**
|
|
137
|
+
|
|
138
|
+
- The row's identity column is **`Name` — capital N** (Data Model grid convention). A row keyed `name` returns 404 `no sandbox row named <x> in object <y>`.
|
|
139
|
+
- The executed payload is **`row.command`** (for `local-process`: written to a temp entry file and run by `bash`/`node`/`python3` per `runtime`). For agent hosts, `row.instructions` is prefixed above `command`. Unknown columns are stored but **silently not executed** — a row with only `prompt` "succeeds" with empty stdout.
|
|
140
|
+
- Object lookup requires both `id` match **and** `objectType: "sandbox-environment"`.
|
|
141
|
+
- Other observed failures: unregistered adapter → 404 with a `hint`; unsupported runtime → 400 with `supportedRuntimes`; `runLocality: "serverless"` requires `schedulerRegistryId` (validator-enforced) and rejects `local-agent-host`.
|
|
142
|
+
|
|
143
|
+
**Success envelope (observed):** `{ ok: true, status: "connected", runId, adapter, runtime, exitCode, durationMs, persisted: true, sourceId: "sandbox:<objectId>:<slug(Name)>", response }` — `response` carries `stdout`, `stderr`, `envRefsResolved`/`envRefsMissing` (slug names only, never values), `networkAllow`, `allowList`, `browserAccess`, `adapterMeta`, `exports`.
|
|
144
|
+
|
|
145
|
+
**Side effects you get for free — never replicate manually:** a versioned record appended to `growthub.source-records.json` under the `sourceId` (history accumulates per invocation), and the row stamped with `status`, `lastTested`, `lastRunId`, `lastSourceId`, `lastResponse`.
|
|
146
|
+
|
|
147
|
+
## Agent Outcome Loop V1 — receipts, lanes, and the cockpit
|
|
148
|
+
|
|
149
|
+
Every mutation lane emits the **same canonical receipt** (`@growthub/api-contract/workspace-outcome::AgentOutcomeReceipt`) into the server-owned stream `workspace:agent-outcomes` in `growthub.source-records.json`. A receipt answers: what was intended, what changed, was it preflighted, was it proven (runId/sourceId/draftSha256), was it published (version/publishedSha256), what should happen next (`nextActions`), and how to roll back or replay (`rollbackRef`). Receipts are secret-redacted and bounded — summaries and references, never raw payloads.
|
|
150
|
+
|
|
151
|
+
**Lane classification — every lane is named; none is an unlabelled bypass:**
|
|
152
|
+
|
|
153
|
+
| Lane | Route | Trust class |
|
|
154
|
+
|---|---|---|
|
|
155
|
+
| `untrusted-direct` | `PATCH /api/workspace` (+ preflight) | Full policy firewall |
|
|
156
|
+
| `execution-proof` | `POST /api/workspace/sandbox-run` | Produces run lineage |
|
|
157
|
+
| `server-authoritative` | `POST /api/workspace/workflow/publish` | Owns draft → live |
|
|
158
|
+
| `governed-proposal` | `POST /api/workspace/helper/apply` | Privileged: human-reviewed; swarm graphs are server-built/validated (`buildSandboxRowFromSwarmProposal`), never model-authored verbatim |
|
|
159
|
+
|
|
160
|
+
**The cockpit:** `GET /api/workspace/agent-outcomes` returns the receipt stream (newest first) plus a derived governance summary — blocked attempts, publishes, drafts awaiting test, drafts tested-but-unpublished, live rows with failed last runs, live rows without proof, helper applies. This is how an operator manages a workspace full of agents without reading logs.
|
|
161
|
+
|
|
162
|
+
**First-session continuation:** before acting, read the stream. Cite `receiptId`s, continue from `nextActions`, and inspect `rollbackRef` (previous version + delta index for publishes; sourceId for runs) before redoing anyone's work. Rejections come with `repairPlan[]` — follow it instead of retrying variations.
|
|
163
|
+
|
|
164
|
+
## Applications as governed entities (Control Plane V1)
|
|
165
|
+
|
|
166
|
+
Applications are first-class governed objects, not loose files. The source of truth is the `workspace-app-registry` Data Model object (objectType `"app-surface"`, preset ships in the Data Model) — one row per application, referencing its governed parts by id: `dashboardIds`, `workflowRefs` (`objectId:RowName`), `dataSourceIds`, `registryIds`. Rows mutate through the normal PATCH lane (policy + receipts apply).
|
|
167
|
+
|
|
168
|
+
- **Read the fleet first:** `GET /api/workspace/apps` — registered apps with resolved links, health rollup (`ready`/`blocked`/`empty` + computed blockers), the single next action with a deep link into the real surface, the app-scoped **assignment packet** (goal, blockers, allowed routes, forbidden actions, expected evidence, object refs), plus `detected[]` filesystem app surfaces (advisory — registration is the governed act) and the Fleet lens state.
|
|
169
|
+
- **Work app-scoped:** take the assignment packet's `objectRefs` as your mutation scope; everything outside it is out of bounds. **Scope is runtime-enforced on every governed route, not just PATCH** — send `x-growthub-app-scope: <appId>` on every call. Rejections are a structured `AppScopeViolation` envelope (`violationType`, `offendingPaths`, `repairPlan[]`, `allowedObjectIds`) — follow the repair plan, never route-shop.
|
|
170
|
+
|
|
171
|
+
**Scope-enforcement matrix (what the header does per route):**
|
|
172
|
+
|
|
173
|
+
| Route | Scoped behavior |
|
|
174
|
+
|---|---|
|
|
175
|
+
| `PATCH /api/workspace` | changed/new dataModel objects + dashboards must be in the app's refs; `canvas`/`widgetTypes` are workspace-global → rejected |
|
|
176
|
+
| `POST /api/workspace/patch/preflight` | returns `appScopeVerdict` — mirrors the real PATCH exactly; if `allowed:false`, the PATCH will 422 identically |
|
|
177
|
+
| `POST /api/workspace/sandbox-run` | workflow must be in `workflowRefs` (or its object in scope) |
|
|
178
|
+
| `POST /api/workspace/workflow/publish` | same workflow check; publish is never blocked by app health (it's how "not live" blockers clear) |
|
|
179
|
+
| `POST /api/workspace/test-source` | `integrationId` must be in the app's `registryIds` |
|
|
180
|
+
| `POST /api/workspace/refresh-sources` | every `sourceIds[]` entry must be in `dataSourceIds` (or a derived sidecar sourceId) |
|
|
181
|
+
| `POST /api/workspace/helper/apply` | **operator-only** — always rejected under app scope (`route_operator_only`) |
|
|
182
|
+
|
|
183
|
+
Need a wider scope? Register the object/ref on the app's registry row first — that edit is itself in scope via the registry object. Every scoped rejection and success lands in the receipt stream with `appId`, and receipts carry a server-side `seq` + `prevReceiptSha256` hash chain (tamper-evident; a signed anchor is future work).
|
|
184
|
+
- **Humans see the same truth:** the Fleet lens renders in Workspace Lens (`/workspace-lens`, filter "Fleet") with one card step per app; `GET /api/workspace/swarm-condition?lensId=fleet` is the same state as an agent packet. SDK: `@growthub/api-contract/workspace-apps`.
|
|
185
|
+
|
|
186
|
+
## Workspace-first rule
|
|
187
|
+
|
|
188
|
+
Before writing any code, ask: **does a governed object already represent this?** A scheduled job is a sandbox row. An external API is an API Registry row. A data view is a Data Model object bound to a View widget. A multi-agent workflow is a sandbox row with an `agent-swarm-v1` orchestration graph. If the capability exists as an object, your work is two API calls — not a new module. Extend objects; do not deviate into parallel code paths.
|
|
189
|
+
|
|
190
|
+
## Anti-patterns — the runtime blocks these; don't waste tokens trying
|
|
191
|
+
|
|
192
|
+
- Writing `growthub.config.json` or `growthub.source-records.json` directly while the app is the runtime authority, or inventing a new mutation route/server action.
|
|
193
|
+
- PATCHing the whole config back (`full_config_body`), keys outside the allowlist (400), or `workspaceSourceRecords` (`source_records_through_patch`).
|
|
194
|
+
- PATCHing live workflow fields, bumping `version`, or setting `lifecycleStatus: "live"` directly (`live_workflow_field` / `live_publish_via_patch` — use `workflow/publish`).
|
|
195
|
+
- Forging the draft attestation via PATCH — publish cross-checks the run history's `draftSha256` (`draft_run_not_verified`).
|
|
196
|
+
- Proceeding after a failed PATCH or publish.
|
|
197
|
+
- Smuggling run history into rows (`history_smuggling`) or inlining megabyte payloads (`oversized_*`) — bulk data lives in source records.
|
|
198
|
+
- Executing sandbox/swarm work via ad-hoc shell instead of `sandbox-run` (you lose run lineage and row stamping).
|
|
199
|
+
- Putting credential values in rows, prompts, or PATCH bodies (`credential_field` + schema rejection).
|
|
200
|
+
- Hand-editing `.growthub-fork/trace.jsonl` or `policy.json` — CLI-written, append-only.
|
|
201
|
+
- Keying sandbox rows with lowercase `name`, or putting the payload anywhere but `command`.
|
|
202
|
+
|
|
203
|
+
If this workspace's route files have diverged from this card, the route files win — runtime implementation overrides docs.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@growthub/cli",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.3",
|
|
4
4
|
"description": "CLI control plane for Growthub Local and Agent Workspace as Code: export, fork, inspect, operate, sync, and optionally activate governed AI workspaces.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@aws-sdk/client-s3": "^3.888.0",
|
|
45
45
|
"@clack/prompts": "^0.10.0",
|
|
46
|
-
"@growthub/api-contract": "1.
|
|
46
|
+
"@growthub/api-contract": "1.5.0",
|
|
47
47
|
"ajv": "^8.18.0",
|
|
48
48
|
"ajv-formats": "^3.0.1",
|
|
49
49
|
"better-auth": "1.4.18",
|