@controllerai/cli 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/api/client.js +239 -13
  2. package/dist/api/client.js.map +1 -1
  3. package/dist/commands/agent.js +84 -10
  4. package/dist/commands/agent.js.map +1 -1
  5. package/dist/commands/approval.js +34 -0
  6. package/dist/commands/approval.js.map +1 -0
  7. package/dist/commands/auth.js +5 -4
  8. package/dist/commands/auth.js.map +1 -1
  9. package/dist/commands/branch.js +32 -1
  10. package/dist/commands/branch.js.map +1 -1
  11. package/dist/commands/connection.js +41 -0
  12. package/dist/commands/connection.js.map +1 -1
  13. package/dist/commands/expr.js +36 -0
  14. package/dist/commands/expr.js.map +1 -1
  15. package/dist/commands/file.js +70 -0
  16. package/dist/commands/file.js.map +1 -0
  17. package/dist/commands/flow.js +143 -26
  18. package/dist/commands/flow.js.map +1 -1
  19. package/dist/commands/node.js +66 -7
  20. package/dist/commands/node.js.map +1 -1
  21. package/dist/commands/run.js +50 -1
  22. package/dist/commands/run.js.map +1 -1
  23. package/dist/commands/trigger.js +4 -1
  24. package/dist/commands/trigger.js.map +1 -1
  25. package/dist/commands/workflow.js +149 -35
  26. package/dist/commands/workflow.js.map +1 -1
  27. package/dist/config.js +7 -1
  28. package/dist/config.js.map +1 -1
  29. package/dist/errors.js +2 -3
  30. package/dist/errors.js.map +1 -1
  31. package/dist/index.js +4 -0
  32. package/dist/index.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skills/controllerai-agents/SKILL.md +32 -30
  35. package/skills/controllerai-node-config/SKILL.md +1 -1
  36. package/skills/controllerai-runs/SKILL.md +1 -1
  37. package/skills/controllerai-triggers/SKILL.md +2 -0
  38. package/skills/controllerai-workflows/SKILL.md +9 -7
  39. package/skills/controllerai-workflows/references/command-map.md +1 -1
  40. package/skills/manifest.json +45 -45
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@controllerai/cli",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "Build and operate Controller AI workflows and agents from any AI coding agent (beta)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,17 +5,17 @@ description: Design, assemble, test, publish, and share user-facing Controller A
5
5
 
6
6
  # Controller AI agents
7
7
 
8
- An agent has one mutable draft and immutable published versions. Its capabilities may be ready integration actions, workflow tools, or both. Build on the draft, verify through a draft conversation, and publish the agent last. Editing the draft never updates the live agent by itself.
8
+ An agent has one mutable draft and immutable published versions. Capabilities are ready integration actions, workflow tools, or both. Build on the draft, verify through a draft conversation, publish last. Editing the draft never updates the live agent by itself.
9
9
 
10
- Agent design is a lifecycle — hold the whole arc, not just the current step:
10
+ Agent design is a lifecycle — hold the whole arc:
11
11
 
12
12
  1. Write the instructions (the agent's system prompt).
13
13
  2. Add tools — workflow flows and/or ready integration actions.
14
14
  3. Set each tool's permission level WITH the user — HITL is a design decision.
15
- 4. Set tool descriptions (optional but powerful for workflow tools).
15
+ 4. Set tool descriptions (powerful for workflow tools).
16
16
  5. Add reference files (`txt, md, json, csv, html, xml`).
17
17
  6. Save — the draft IS the test environment.
18
- 7. Test it — and let the user test it in the product themselves.
18
+ 7. Test it — and let the user try it in the product.
19
19
  8. Publish when it looks good.
20
20
  9. Offer Slack access and organization sharing.
21
21
 
@@ -30,7 +30,7 @@ For each capability:
30
30
  - Put conversational judgment, when-to-use rules, tone, and escalation in agent instructions.
31
31
  - Put stable source material in a knowledge file.
32
32
 
33
- Do not create a one-node workflow merely to expose a ready action. Do not replace orchestration with several independent direct actions when ordering or data handling must be deterministic.
33
+ Do not create a one-node workflow merely to expose a ready action, or replace orchestration with several independent direct actions when ordering or data handling must be deterministic.
34
34
 
35
35
  ## 2. Build and verify capabilities
36
36
 
@@ -44,8 +44,8 @@ cai flow get <flowId> --json
44
44
  cai run flow <flowId> --inputs values.json --json
45
45
  ```
46
46
 
47
- Capture the successful workflow execution ID. Workflow inputs become tool parameters and outputs become its result.
48
- Before attaching a workflow tool, require a nonempty output contract and verify that the completed run returns it; otherwise the agent receives an empty result.
47
+ Capture the successful workflow execution ID. Inputs become tool parameters; outputs become its result.
48
+ Before attaching, require a nonempty output contract and verify the completed run returns it; otherwise the agent receives an empty result.
49
49
 
50
50
  ## 3. Create and assemble the draft
51
51
 
@@ -69,17 +69,15 @@ cai agent add-workflow <agentId> \
69
69
  --description "Use when ...; accepts ...; returns ..." \
70
70
  --json
71
71
 
72
- cai agent add-file <agentId> --file <path> --space knowledge --json
73
- cai agent add-file <agentId> --file <path> --space shared --json
74
- cai agent files <agentId> --space knowledge --json
75
- cai agent files <agentId> --space shared --live --json
72
+ cai agent add-file <agentId> --file <path> --space <knowledge|shared> --json
73
+ cai agent files <agentId> --space <knowledge|shared> [--live] --json
76
74
  cai agent tools <agentId> --json
77
75
  cai agent get <agentId> --json
78
76
  ```
79
77
 
80
- Use `cai agent files <agentId> [--space <knowledge|shared>] [--live]` to read file inventories. Adding with `--space shared` updates the live runtime file space immediately without publishing; an active agent sees it on the next turn, while a disabled agent sees it after enablement.
78
+ Adding with `--space shared` updates the live runtime file space immediately without publishing; an active agent sees it on the next turn, a disabled agent after enablement.
81
79
 
82
- Permission is part of agent design, not an afterthought. For every tool, settle the approval level WITH the user before attaching: present the tool list and ask which steps they want a human in the loop for ("should sending the email require your approval each time, or run automatically?"). The default is no approval. Add `--require-confirmation` for consequential writes, deletion, external communications, permission changes, purchases/spend, or an ambiguous destination; `cai agent update-tool` changes it later. Omitting the flag must be the user's informed autonomy decision, not an unnoticed default.
80
+ Permission is part of agent design. Settle each tool's approval level WITH the user before attaching: present the tool list and ask which steps need a human in the loop ("should sending the email require your approval each time, or run automatically?"). The default is no approval. Add `--require-confirmation` for consequential writes, deletion, external communications, permission changes, purchases/spend, or an ambiguous destination; `cai agent update-tool` changes it later. Omitting the flag must be an informed autonomy decision, not an unnoticed default.
83
81
 
84
82
  Keep the two modes straight:
85
83
 
@@ -91,9 +89,11 @@ Keep the two modes straight:
91
89
  | Runtime files | Current live runtime files, overlaid by development/test runtime files at the same path | Current live runtime files only |
92
90
  | Access | Owner only | Owner, plus organization members when shared; non-owners never see the draft |
93
91
 
94
- Publishing the agent snapshots its display name, instructions, tool identities, descriptions and approval policies, and knowledge files. It moves the live pointer and restamps every existing live conversation to that new version. It does not snapshot the selected runtime model.
92
+ Version pinning for workflow tools does not exist: live tools always track the workflow's latest release; publishing the workflow is what changes tool behavior. If the user asks to freeze a tool's version, say so plainly — even when framed as a condition — and still attach it (policy `latest`); never abandon the attachment over it.
95
93
 
96
- Publishing is a hard cutover: live conversations that are mid-turn are interrupted immediately (the person's in-flight answer never arrives), their unexecuted approval requests expire, and each conversation reopens on its own next message running the new version. Time publishes with that in mind and tell the user what a publish does to active conversations.
94
+ Publishing the agent snapshots name, instructions, tool identities, descriptions, approval policies, and knowledge files; it moves the live pointer and restamps every existing live conversation to the new version. It does not snapshot the runtime model.
95
+
96
+ Publishing is a hard cutover: mid-turn live conversations are interrupted (the person's in-flight answer never arrives), unexecuted approval requests expire, and each conversation reopens on its next message running the new version. Time publishes accordingly and tell the user.
97
97
 
98
98
  Runtime lifecycle changes do not require publishing:
99
99
 
@@ -103,15 +103,15 @@ cai agent update <agentId> --enabled --json
103
103
  cai agent delete <agentId> --confirm --json
104
104
  ```
105
105
 
106
- Disable pauses runtime immediately; enable resumes it immediately. Delete is soft: it revokes live access, requests best-effort termination of active sessions and pending approvals, retains conversation history but makes it inaccessible, has no CLI restore, and does not guard dependent workflows, which can fail later.
106
+ Disable pauses runtime immediately; enable resumes it. Delete is soft: it revokes live access, requests best-effort termination of active sessions and pending approvals, keeps history but makes it inaccessible, has no CLI restore, and does not guard dependent workflows.
107
107
 
108
108
  ## Runtime usage boundary
109
109
 
110
- The user's coding-agent subscription covers builder reasoning, but hosted agent tests and conversations consume Controller AI runtime usage from the organization's pool, and connected providers may add charges or side effects. Say so before starting a hosted test or calling this route free.
110
+ The user's coding-agent subscription covers builder reasoning, but hosted agent tests and conversations consume Controller AI runtime usage from the organization's pool, and connected providers may add charges or side effects. Say so before starting a hosted test.
111
111
 
112
112
  ## 4. Verify the draft as an agent
113
113
 
114
- Saving the draft is what updates the agent's Test environment — there is no separate deploy step for testing. Test conversations run each workflow tool's DEVELOPMENT version.
114
+ Saving the draft updates the agent's Test environment — there is no separate deploy step. Test conversations run each workflow tool's DEVELOPMENT version.
115
115
 
116
116
  ```bash
117
117
  cai agent test <agentId> --draft --message "<representative request>" --json
@@ -120,21 +120,21 @@ cai agent conversation history <conversationId> --json
120
120
 
121
121
  Test requests that should and should not select each tool. Verify exact arguments, truthful use of results, errors, and knowledge behavior.
122
122
 
123
- Also offer the user the agent's app page to try the draft hands-on before publishing (`create`/`publish`/`test` outputs include `appUrl` links when the app origin is known). Their impression outweighs your transcript reading.
123
+ Also offer the agent's app page so the user can try the draft hands-on before publishing (outputs include `appUrl` when the app origin is known); their impression outweighs your transcript reading.
124
124
 
125
125
  - For a workflow tool, correlate a side-effectful call with its terminal workflow execution ID.
126
126
  - For a direct integration action, inspect persisted conversation action events/run result and the intended external effect. Direct actions do not create workflow execution IDs.
127
127
 
128
- For pending approval, inspect the exact request before choosing:
128
+ For a pending approval, inspect the exact request first:
129
129
 
130
130
  ```bash
131
131
  cai agent conversation approve <conversationId> --request <requestId> --json
132
132
  cai agent conversation deny <conversationId> --request <requestId> --message "<reason>" --json
133
133
  ```
134
134
 
135
- The server resolves the tool from the permission request; do not pass a human-readable tool name. Do not approve merely to make a test continue.
135
+ The server resolves the tool from the permission request; do not pass a human-readable tool name, and do not approve merely to make a test continue.
136
136
 
137
- After `cai agent remove-tool`, test both a request that must no longer use the removed capability and a representative retained capability.
137
+ After `cai agent remove-tool`, test one request that must no longer use the removed capability and one retained capability.
138
138
 
139
139
  ## 5. Publish in dependency order
140
140
 
@@ -146,7 +146,7 @@ cai workflow status --json
146
146
  cai workflow publish --name "<release>" --json
147
147
  ```
148
148
 
149
- Publish the workflow only when its verified development state must become live and the user authorized it. Publishing a workflow already followed by any live agent changes that tool's live behavior immediately; do not republish the agent merely to pick up that workflow release.
149
+ Publish a workflow only when its verified development state must go live and the user authorized it. A workflow publish already followed by a live agent changes that tool's live behavior immediately; do not republish the agent merely to pick it up.
150
150
 
151
151
  Then publish the agent:
152
152
 
@@ -157,33 +157,35 @@ cai agent versions <agentId> --json
157
157
  cai agent test <agentId> --live --message "<representative request>" --json
158
158
  ```
159
159
 
160
+ `publish-preflight` is the arbiter of structural readiness, with blocker parity with the publish gate (missing/unpublished/unrunnable tool flows, broken connections). When it lists blockers, report them and stop. When `hasBlockers` is false and the user asked for a release, publish — except an error you actually watched happen (a failed Test turn, an errored tool call), which blocks even a green preflight; the shape or style of successful output never does.
161
+
160
162
  If publishing fails with `EMAIL_VERIFICATION_REQUIRED`, ask the human for the email address and run `cai signup email <address>`, then ask the human for the code delivered to their inbox and run `cai signup verify <code>`.
161
163
 
162
- Use this update loop for versioned agent state: edit the draft, read it back, verify in Test, publish the agent, then verify Live. A name, instruction, tool identity, tool description, approval-policy, or knowledge-file change is not reflected in the published agent version until the agent is published again.
164
+ Versioned agent state follows one loop: edit the draft, read back, verify in Test, publish, verify Live. Name, instruction, tool identity/description, approval-policy, and knowledge-file changes reach the published version only on the next agent publish.
163
165
 
164
- Published agent versions have no rollback — never promise to "revert" one. Recover forward: restore the wanted DRAFT and publish anew. For agents, read and reapply an earlier snapshot (`cai agent versions`, then get that version). For workflow tools, `cai workflow history` + `cai workflow restore <stateId>` restores the dev DEFINITION, not record data; then republish.
166
+ Published agent versions have no rollback — never promise to "revert" one. Recover forward: restore the wanted DRAFT and publish anew — for agents, reapply an earlier snapshot from `cai agent versions`; for workflow tools, `cai workflow history` + `cai workflow restore --state <stateId>` restores the dev DEFINITION (not record data), then republish.
165
167
 
166
- The explicit live-bound exceptions are:
168
+ The live-bound exceptions:
167
169
 
168
170
  - Workflow tools resolve the workflow's latest live release per runtime session, so a later workflow publish changes live behavior without another agent publish. An in-flight turn or approval episode may finish on its cached prior release; verify with a fresh Live conversation after the session refresh.
169
171
  - A direct action's connection and authorization grant are live security bindings, not frozen version data. Rebinding the grant can redirect Live immediately; failure, revocation, or detachment can block Live immediately. Detaching also edits the draft, so publish the agent afterward to remove the unavailable tool from the published tool list.
170
172
  - Runtime files are not part of the agent snapshot. Live conversations read current live runtime files; Test additionally overlays development/test runtime files, with the development copy winning on a path collision.
171
173
 
172
- Draft evidence does not prove the live agent. Test is owner-only. Shared users always run the latest published agent version and never receive draft instructions, draft tools, or draft knowledge.
174
+ Draft evidence does not prove the live agent. Test is owner-only; shared users always run the latest published agent version and never see draft instructions, tools, or knowledge.
173
175
 
174
176
  ## 6. Offer Slack and organization sharing
175
177
 
176
178
  After a successful publish, offer the next steps unprompted:
177
179
 
178
- - **Slack**: talking to the agent in Slack needs the Slack ↔ Controller AI connection plus per-agent Slack configuration (slug, channel), both set up in the product, not the CLI — point the user there and offer to walk them through it.
180
+ - **Slack**: talking to the agent in Slack needs the Slack ↔ Controller AI connection plus per-agent Slack configuration (slug, channel), both set up in the product — point the user there and offer a walkthrough.
179
181
  - **Sharing**: agents remain private unless the user explicitly asks for organization access:
180
182
 
181
183
  ```bash
182
184
  cai agent visibility <agentId> --value organization --json
183
185
  ```
184
186
 
185
- Organization members use the published version. Direct actions run through the owner's connected external account; usage comes from the organization's pool. Rebinding or revoking that live grant immediately affects published agents. Return to private visibility to revoke access.
187
+ Organization members use the published version. Direct actions run through the owner's connected external account; usage comes from the organization's pool. Rebinding or revoking that live grant immediately affects published agents; return to private visibility to revoke access.
186
188
 
187
189
  ## Final report
188
190
 
189
- State the agent ID/version, tool types and identities, confirmation policies, workflow execution evidence, direct-action conversation/run evidence, draft/live status, live connection bindings, organization access, and anything unverified.
191
+ State the agent ID/version, tools and confirmation policies, workflow execution IDs and direct-action conversation evidence, draft/live status, live connection bindings, organization access, and anything unverified.
@@ -35,7 +35,7 @@ cai connection list --node <nodeSlug> --json
35
35
 
36
36
  - One active connection: use its exact `connectionId`.
37
37
  - Several: use an explicit user preference; otherwise ask which account.
38
- - None: add the real component without `--connection`; `missingConnection: true` is a valid handoff state. Give the user `cai connection connect <nodeSlug> --wait`, share the printed link, and re-list connections after they finish. Bind the resulting ID with `cai node set-connection <nodeId> --connection <connectionId>`.
38
+ - None: add the real component without `--connection`; `missingConnection: true` is a valid handoff state. Get the link with `cai connection connect <nodeSlug> --no-open` and share it with the user right away — do not start with `--wait`, which blocks until they finish and delays sharing the link. After they confirm, run `cai connection list --integration <nodeSlug> --json` and bind the new ID with `cai node set-connection <nodeId> --connection <connectionId>`.
39
39
 
40
40
  Never substitute a connection from a similar slug.
41
41
 
@@ -40,7 +40,7 @@ cai run inputs <nodeId> --json
40
40
  cai run inputs <flowId> --flow --json
41
41
  ```
42
42
 
43
- Use returned opaque input IDs. A compact input file can be a flat map:
43
+ Use returned opaque input IDs. Flow mode lists EVERY declared input with a `used` flag: supply the used ones (an unsupplied used input falls back to its saved test value), while values keyed to unused inputs are accepted and ignored. A compact input file can be a flat map:
44
44
 
45
45
  ```json
46
46
  {
@@ -107,6 +107,8 @@ cai trigger create \
107
107
 
108
108
  Capture all returned IDs. `triggerId` is the canvas ID used for get/rename/toggle/delete. `backendTriggerId` is numeric and used for captured events and replay. They are not interchangeable.
109
109
 
110
+ Read a single trigger back with `cai trigger get <triggerId> --json` — the full record: node, event, connection, props, lifecycle. Read-back is always `get`; the CLI has no `describe` read command anywhere (`cai workflow set-description` is a setter).
111
+
110
112
  Follow returned `nextSteps` in order. Trigger payload does not automatically populate the target flow; define flow inputs, relink the run-subflow node if needed, and configure its mapping props.
111
113
 
112
114
  ## Remove or disable an automatic start
@@ -5,7 +5,7 @@ description: Build, inspect, edit, test, recover, and publish Controller AI work
5
5
 
6
6
  # Controller AI workflows
7
7
 
8
- Use `cai` as the control surface. Do not call Controller AI REST or MCP routes directly unless the CLI reports that a required capability is absent.
8
+ Use `cai` as the control surface. Never call Controller AI REST or MCP routes directly; when the CLI lacks a capability, say so and name the UI path instead of bypassing it.
9
9
 
10
10
  ## Establish context
11
11
 
@@ -38,11 +38,11 @@ It returns the whole map compactly — every flow with typed inputs/outputs, its
38
38
 
39
39
  ## Build protocol
40
40
 
41
- 1. Translate the request into inputs, steps, outputs, trigger, integrations, failure behavior, and publish intent.
41
+ 1. Translate the request into inputs, steps, outputs, trigger, integrations, failure behavior, and publish intent. When the request says to store, save, log, or record something and names no external destination, that means a data type plus a create-record node (`controllerai-data`) — a flow output alone does not persist anything. When the user names the destination (a spreadsheet, a CRM, another app, a file), write there with that integration's node instead; add a platform record only when the user also wants a copy kept here.
42
42
  2. Inspect the current workflow before editing: `cai workflow outline`, then `cai flow get <flowId>` for the flows you will touch.
43
43
  3. Create or select a flow. Define flow inputs and outputs before nodes that derive props from them.
44
44
  4. Build in execution order. After each material change, read it back with the corresponding `get`, `props`, `status`, or `list` command.
45
- 5. After a headless build, run `cai flow layout <flowId>` once per changed flow at the end; an open builder auto-tidies itself.
45
+ 5. Run `cai flow layout <flowId>` once per changed flow as the LAST step after a headless build or any batch of structural edits (adds, deletes, rewires) — add-time placement avoids overlap, but only layout produces clean left-to-right columns. An open builder adopts your layout automatically.
46
46
  6. Test on the development rail. Debug every failed or suspicious node; a green top-level status alone is insufficient.
47
47
  7. Re-read `cai workflow status`. Publish only when the user asked for a live change or clearly authorized deployment.
48
48
 
@@ -71,12 +71,12 @@ Load the narrow skill when the task reaches that surface:
71
71
  - Name nodes after the data they produce. Downstream input bindings are seeded from that name when wired.
72
72
  - Use `cai workflow save --name "<checkpoint>"` before a risky rewrite. Named saves and state renames work on every plan.
73
73
  - **Edit the graph with a plan-aware safety net.** Each save is a version state. `cai workflow history` has no age cutoff on Free, Max, or custom plans and a 90-day window on Pro/Starter; expand a group with `cai workflow history --group <groupId>` to get its state IDs. Restore with `cai workflow restore --state <stateId>` within 7 days on Free, 90 days on Pro/Starter, or without an age limit on Max/custom. Duplicate, delete, and refactor with that window in mind. Restore rolls back the DEFINITION (graph and schemas) only — record data is unversioned and stays as it is. External side effects (sent messages, provider calls) are equally outside the undo.
74
- - **Validate after structural edits, don't ask permission before them.** After deleting a flow, deleting a type, or a large refactor — and before publish — run `cai workflow validate` and fix what it lists: unlinked subflow callers, dangling type references, branch problems, trigger issues. Deleting a flow deletes its nodes, edges, inputs/outputs, and attached triggers, and breaks callers in other flows — exactly like deleting a function breaks its call sites; validate shows every break.
74
+ - **Validate after structural edits, don't ask permission before them.** After deleting a flow, deleting a type, or a large refactor — and before every publish — run `cai workflow validate` and fix what it lists. It is deep: required props, connections, wiring, expressions, output types, subflows, branches, trigger issues, grouped per red node. Publish refuses when validation reports errors; `--acknowledge-validation-errors` may only be used after the user explicitly approved publishing with the listed issues. Deleting a flow deletes its nodes, edges, inputs/outputs, and attached triggers, and breaks callers in other flows — exactly like deleting a function breaks its call sites; validate shows every break.
75
75
  - On a conflict, re-read current state and reapply intent. Do not replay stale IDs or whole documents.
76
76
  - Never delete a workflow without the user's explicit intent; the CLI requires `--yes` but that is not a substitute for authorization. `cai workflow delete` tears down deployed triggers and soft-deletes the workflow row. Historical workflow/version data remains stored, but there is currently no CLI restore command for the deleted row.
77
- - **Know the dependency graph before deleting or refactoring shared resources.** `cai deps` shows which agents attach this workflow as a tool (LIVE or draft), which workflows call it, and which connections it uses; `cai deps --account` maps the whole account. Deleting a workflow with agent dependents is refused server-side, and `--force` is a deprecated, inert compatibility flag. For a draft attachment, run `cai agent remove-tool <agentId> --tool <toolId>`. If it is also LIVE, publish that detached draft with `cai agent publish <agentId>`; if it is LIVE-only, publish the already-detached current draft or delete the agent. Then retry the workflow delete.
78
- - **Check the account feed when recent activity matters.** `cai events` lists what happened in the account, newest first: connections created, workflow edits/publishes/runs, agents created/published, members added. Filter with `--type` (comma-separated), `--since 30m|2h|7d|<ISO>`, `--for-workflow <id>`; page with `--cursor`. Typical uses: `cai events --type connection.created --since 10m` to see whether the user finished connecting, `cai events --since 24h` to catch up at session start, `cai events --for-workflow <id> --type workflow.run` for recent run activity. The feed cannot show connection deletions, settings changes, or member removals — absence there proves nothing.
79
- - **Share the platform, not just text.** At the right moments, hand the user the real product page — command outputs include `appUrl` when the app origin is known: after `workflow publish` (the live builder view), after development `run flow`/`run node` (the run page; live flow runs omit it), after `agent publish`/`test` (agent and conversation pages), and `connection connect` prints the connect link (use `--wait` to continue automatically once they connect). When the user asks for a link at any other time, don't guess URLs: `cai workflow get`, `cai workflow status`, and `cai agent get` include `appUrl`. When you cannot perform something (settings, product-only surfaces), give the link instead of apologizing.
77
+ - **Know the dependency graph before deleting or refactoring shared resources.** `cai deps` shows which agents attach this workflow as a tool (LIVE or draft), which workflows call it, and which connections it uses; `cai deps --account` maps the whole account. Deleting a workflow with agent dependents is refused server-side, and `--force` is a deprecated, inert compatibility flag. For a draft attachment, run `cai agent remove-tool <agentId> --tool <toolId>`. If it is also LIVE, publish that detached draft with `cai agent publish <agentId>`; if it is LIVE-only, publish the already-detached current draft or delete the agent. Publishing or deleting a dependent agent is its own live/destructive decision — get the user's explicit approval for that step first. Then retry the workflow delete.
78
+ - **Check the account feed when recent activity matters.** `cai events` lists what happened in the account, newest first: connections created, workflow edits/publishes/runs, agents created/published, members added. Filter with `--type` (comma-separated), `--since 30m|2h|7d|<ISO>`, `--for-workflow <id>`; page with `--cursor`. Typical uses: `cai events --type connection.created --since 10m` to see whether the user finished connecting, `cai events --since 24h` to catch up at session start, `cai events --for-workflow <id> --type workflow.run` for recent run activity. The feed cannot show connection deletions, settings changes, member removals, or any label/folder/share activity — absence there proves nothing. When the user asks you to reconstruct a past change the platform does not record (e.g. which workflow a label was removed from), say it is not recorded and change nothing; names or current state that merely suggest an answer are not evidence, and acting on a guess is worse than reporting the limitation.
79
+ - **Share the platform, not just text.** At the right moments, hand the user the real product page — command outputs include `appUrl` when the app origin is known: after `workflow publish` (the live builder view), after development `run flow`/`run node` (the run page; live flow runs omit it), after `agent publish`/`test` (agent and conversation pages), and `connection connect` prints the connect link (share the link first with `--no-open`; add `--wait` only after the link is already in front of the user). When the user asks for a link at any other time, don't guess URLs: `cai workflow get`, `cai workflow status`, and `cai agent get` include `appUrl`. When you cannot perform something (settings, product-only surfaces), give the link instead of apologizing.
80
80
  - Never silently weaken the request to make a test pass. Report an unsupported capability or ask about a real product decision.
81
81
 
82
82
  ## Completion gate
@@ -84,6 +84,7 @@ Load the narrow skill when the task reaches that surface:
84
84
  Before claiming success, verify all of the following:
85
85
 
86
86
  ```bash
87
+ cai workflow validate --json
87
88
  cai workflow status --json
88
89
  cai flow get <flowId> --json
89
90
  cai run flow <flowId> --inputs <values.json> --json
@@ -91,6 +92,7 @@ cai run flow <flowId> --inputs <values.json> --json
91
92
 
92
93
  Then confirm:
93
94
 
95
+ - **`cai workflow validate` reports `errors: 0`.** Every error is fixed, or explicitly reported to the user with what it breaks — never summarized away, never called cosmetic. A red canvas and a "done" claim cannot coexist.
94
96
  - Required node connections and props are complete.
95
97
  - Expressions compiled and their resolved configs are non-null.
96
98
  - Expected branch or error paths were exercised where practical.
@@ -9,7 +9,7 @@ cai connect
9
9
  cai doctor
10
10
  cai config reset [--local|--global]
11
11
  cai auth status
12
- cai workflow list|create|get|rename|describe|duplicate|delete
12
+ cai workflow list|create|get|rename|set-description|duplicate|delete
13
13
  cai workflow state|status|versions|releases|history|save|restore|publish
14
14
  cai use <workflowId>
15
15
  ```
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "skillSetVersion": "2026.08.13.4",
3
+ "skillSetVersion": "2026.08.22.13",
4
4
  "minCliVersion": "0.2.0",
5
- "latestCliVersion": "0.2.12",
5
+ "latestCliVersion": "0.2.13",
6
6
  "skills": [
7
7
  {
8
8
  "name": "controllerai-start",
9
9
  "files": [
10
10
  {
11
11
  "path": "controllerai-start/SKILL.md",
12
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-start/SKILL.md",
12
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-start/SKILL.md",
13
13
  "sha256": "909a169a3f66cbcd8a7dca712c9ca8c136fde973751bb04b7351a4d10ddd3ecf",
14
14
  "size": 4850
15
15
  },
16
16
  {
17
17
  "path": "controllerai-start/agents/openai.yaml",
18
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-start/agents/openai.yaml",
18
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-start/agents/openai.yaml",
19
19
  "sha256": "3240c24df8ba5ebfb67bc3e9dbce97f4a78384c352123210197a2dbf27c51150",
20
20
  "size": 226
21
21
  }
@@ -26,21 +26,21 @@
26
26
  "files": [
27
27
  {
28
28
  "path": "controllerai-workflows/SKILL.md",
29
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-workflows/SKILL.md",
30
- "sha256": "955195dc7417a1e03a511de9e1924e59bc5861212a5e3a453671f117eb9c1285",
31
- "size": 9313
29
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-workflows/SKILL.md",
30
+ "sha256": "880125241fe974f80e95de07eb4ab5730ecc75ee76dcac52b1b2439e9ca1667a",
31
+ "size": 10928
32
32
  },
33
33
  {
34
34
  "path": "controllerai-workflows/agents/openai.yaml",
35
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-workflows/agents/openai.yaml",
35
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-workflows/agents/openai.yaml",
36
36
  "sha256": "6fb00a93a5f83fc2664679eb633ab07b477105472f8790fcf6dbcca913921a84",
37
37
  "size": 251
38
38
  },
39
39
  {
40
40
  "path": "controllerai-workflows/references/command-map.md",
41
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-workflows/references/command-map.md",
42
- "sha256": "d4eb54c8a47f19894a4ece9f1268a1330f16e6c6104b2a7287f59839b6e211da",
43
- "size": 2900
41
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-workflows/references/command-map.md",
42
+ "sha256": "7f8e44536730bec29088803d2bb64d5d6128485101876f396ae111e22ccce66e",
43
+ "size": 2907
44
44
  }
45
45
  ]
46
46
  },
@@ -49,19 +49,19 @@
49
49
  "files": [
50
50
  {
51
51
  "path": "controllerai-node-config/SKILL.md",
52
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-node-config/SKILL.md",
53
- "sha256": "e49f308e97f8170092991df3129bf0aca4b87b3aef0c88046ac514d728bad79a",
54
- "size": 9312
52
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-node-config/SKILL.md",
53
+ "sha256": "97e02edd0e269d9f30e76922bdbead0d5b1e49091ab31caa54bb3462df25e6c2",
54
+ "size": 9457
55
55
  },
56
56
  {
57
57
  "path": "controllerai-node-config/agents/openai.yaml",
58
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-node-config/agents/openai.yaml",
58
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-node-config/agents/openai.yaml",
59
59
  "sha256": "7fbd6f0c1f9ea40c41051d532736a4718895cfa397608a2c716300bcf4256df1",
60
60
  "size": 242
61
61
  },
62
62
  {
63
63
  "path": "controllerai-node-config/references/prop-and-readiness.md",
64
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-node-config/references/prop-and-readiness.md",
64
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-node-config/references/prop-and-readiness.md",
65
65
  "sha256": "411dd946180d89119c87d2407d178b3b4c5cb1ea7c1eb459b2f207181bac1ef6",
66
66
  "size": 7081
67
67
  }
@@ -72,19 +72,19 @@
72
72
  "files": [
73
73
  {
74
74
  "path": "controllerai-expressions/SKILL.md",
75
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-expressions/SKILL.md",
75
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-expressions/SKILL.md",
76
76
  "sha256": "c3847a695528390f606cba16e5075ca813420734431ff365b81b1efa5997f2e2",
77
77
  "size": 7445
78
78
  },
79
79
  {
80
80
  "path": "controllerai-expressions/agents/openai.yaml",
81
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-expressions/agents/openai.yaml",
81
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-expressions/agents/openai.yaml",
82
82
  "sha256": "280d1f4d0a44cb5cfd3e5649e0a123b91b57b1484dcbc3a02ace988233234bc3",
83
83
  "size": 249
84
84
  },
85
85
  {
86
86
  "path": "controllerai-expressions/references/dsl-and-recipes.md",
87
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-expressions/references/dsl-and-recipes.md",
87
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-expressions/references/dsl-and-recipes.md",
88
88
  "sha256": "2bfb219a5e3e0f2bc6d4407ff509d4df5a4b3ba1e6f90c02fa4398142f815757",
89
89
  "size": 3677
90
90
  }
@@ -95,19 +95,19 @@
95
95
  "files": [
96
96
  {
97
97
  "path": "controllerai-flow-control/SKILL.md",
98
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-flow-control/SKILL.md",
98
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-flow-control/SKILL.md",
99
99
  "sha256": "8fe888ef7eceeef817fd18885c535b741d84349f5d8722eaddee6dfcfb0493bc",
100
100
  "size": 8313
101
101
  },
102
102
  {
103
103
  "path": "controllerai-flow-control/agents/openai.yaml",
104
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-flow-control/agents/openai.yaml",
104
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-flow-control/agents/openai.yaml",
105
105
  "sha256": "164adf3b887bf9f67bba9cd210b5b49935c29ea0f52f76325fe5df517d279592",
106
106
  "size": 229
107
107
  },
108
108
  {
109
109
  "path": "controllerai-flow-control/references/patterns.md",
110
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-flow-control/references/patterns.md",
110
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-flow-control/references/patterns.md",
111
111
  "sha256": "a3bb4c02fd431c29393a8172713eb9bce0b4042df11725489c923fd97ef9296b",
112
112
  "size": 2877
113
113
  }
@@ -118,19 +118,19 @@
118
118
  "files": [
119
119
  {
120
120
  "path": "controllerai-runs/SKILL.md",
121
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-runs/SKILL.md",
122
- "sha256": "7664ec8014da0417d15b68817ccfa9ddc37ec86ec42b376e74da4c43e60957e6",
123
- "size": 6991
121
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-runs/SKILL.md",
122
+ "sha256": "7ef956a13a01b44c48968f5b21d1ea9f23f8d18a26472d4ffc9da8c12936a750",
123
+ "size": 7194
124
124
  },
125
125
  {
126
126
  "path": "controllerai-runs/agents/openai.yaml",
127
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-runs/agents/openai.yaml",
127
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-runs/agents/openai.yaml",
128
128
  "sha256": "63180f12974e19ce7b714695944608760e4132bfb88947543e52616098a88f5c",
129
129
  "size": 234
130
130
  },
131
131
  {
132
132
  "path": "controllerai-runs/references/debugging.md",
133
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-runs/references/debugging.md",
133
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-runs/references/debugging.md",
134
134
  "sha256": "8c511d3f006c669af2afc7867356487b6de2404e0fd62c54da048c7acb635c41",
135
135
  "size": 2097
136
136
  }
@@ -141,19 +141,19 @@
141
141
  "files": [
142
142
  {
143
143
  "path": "controllerai-triggers/SKILL.md",
144
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-triggers/SKILL.md",
145
- "sha256": "d1b31a3eb4faa4263ef453d93460c1873cb8a7ee9aa4712092d15bd4676e174d",
146
- "size": 8024
144
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-triggers/SKILL.md",
145
+ "sha256": "dff0cff1ef0b92e1c7a05c33ca0cbf840c3cb15483b4d4713feebf88d23f24ee",
146
+ "size": 8279
147
147
  },
148
148
  {
149
149
  "path": "controllerai-triggers/agents/openai.yaml",
150
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-triggers/agents/openai.yaml",
150
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-triggers/agents/openai.yaml",
151
151
  "sha256": "56aa1bd33e54045d88002ade0c420be7bca37ac39433e6eedccef2e22bbd9515",
152
152
  "size": 239
153
153
  },
154
154
  {
155
155
  "path": "controllerai-triggers/references/lifecycle.md",
156
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-triggers/references/lifecycle.md",
156
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-triggers/references/lifecycle.md",
157
157
  "sha256": "06e0edcd5c36d7f4f005831f08b2c9f44898f075a911a2bbd471b6c9c00986e8",
158
158
  "size": 1890
159
159
  }
@@ -164,19 +164,19 @@
164
164
  "files": [
165
165
  {
166
166
  "path": "controllerai-data/SKILL.md",
167
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-data/SKILL.md",
167
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-data/SKILL.md",
168
168
  "sha256": "f385e85baa2af50f34d0a501d0bb031d22529200a4dda6ff87ad3b97fcd8e62b",
169
169
  "size": 7933
170
170
  },
171
171
  {
172
172
  "path": "controllerai-data/agents/openai.yaml",
173
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-data/agents/openai.yaml",
173
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-data/agents/openai.yaml",
174
174
  "sha256": "5c54b0a714086088213c679fb904a69a599374847f9aa1d6c0756172c2a2f227",
175
175
  "size": 219
176
176
  },
177
177
  {
178
178
  "path": "controllerai-data/references/data-rails.md",
179
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-data/references/data-rails.md",
179
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-data/references/data-rails.md",
180
180
  "sha256": "5eee23d08322823ca1a989382e707302be02fe34e01da9c2be6c14c385899bd0",
181
181
  "size": 1744
182
182
  }
@@ -187,19 +187,19 @@
187
187
  "files": [
188
188
  {
189
189
  "path": "controllerai-ai-nodes/SKILL.md",
190
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-ai-nodes/SKILL.md",
190
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-ai-nodes/SKILL.md",
191
191
  "sha256": "fcb2406e8b55a3ba657d8952daa28bb86a106e6bb2acea5837670d16eed971d2",
192
192
  "size": 3961
193
193
  },
194
194
  {
195
195
  "path": "controllerai-ai-nodes/agents/openai.yaml",
196
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-ai-nodes/agents/openai.yaml",
196
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-ai-nodes/agents/openai.yaml",
197
197
  "sha256": "3ba8b8bb6f0cd4b0d5675ebda0af10bb79dc7a42e394eb98479343c83da92599",
198
198
  "size": 256
199
199
  },
200
200
  {
201
201
  "path": "controllerai-ai-nodes/references/selection-and-testing.md",
202
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-ai-nodes/references/selection-and-testing.md",
202
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-ai-nodes/references/selection-and-testing.md",
203
203
  "sha256": "12fb32c422f9cec34c5830ce7dc2cf4f482b9d8b200bb11c45581a108ee81abe",
204
204
  "size": 1639
205
205
  }
@@ -210,13 +210,13 @@
210
210
  "files": [
211
211
  {
212
212
  "path": "controllerai-integration-actions/SKILL.md",
213
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-integration-actions/SKILL.md",
213
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-integration-actions/SKILL.md",
214
214
  "sha256": "015081ef4fc4c56890d02ea525b2af40ce2570b378efc6d9819abc7f43a1e559",
215
215
  "size": 5460
216
216
  },
217
217
  {
218
218
  "path": "controllerai-integration-actions/agents/openai.yaml",
219
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-integration-actions/agents/openai.yaml",
219
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-integration-actions/agents/openai.yaml",
220
220
  "sha256": "82ee62aa48a644e658c9bb6a78c417dc15eb4f3ec9f4abc9081b6d24d16fe92d",
221
221
  "size": 262
222
222
  }
@@ -227,19 +227,19 @@
227
227
  "files": [
228
228
  {
229
229
  "path": "controllerai-agents/SKILL.md",
230
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-agents/SKILL.md",
231
- "sha256": "f9b25d7477294701dca31dd9f5b3edb8c427bb27c5f87bc3667c8a0820d548e0",
232
- "size": 12266
230
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-agents/SKILL.md",
231
+ "sha256": "aed00eaf8bb838a495a4c61b25e611ba66f666a03eb749f0b2b708047bcdf66f",
232
+ "size": 12283
233
233
  },
234
234
  {
235
235
  "path": "controllerai-agents/agents/openai.yaml",
236
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-agents/agents/openai.yaml",
236
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-agents/agents/openai.yaml",
237
237
  "sha256": "f4684ec904f3ebb051bb48460375756899c3316fbb16304aad5fff3d89692b09",
238
238
  "size": 293
239
239
  },
240
240
  {
241
241
  "path": "controllerai-agents/references/instructions-and-versioning.md",
242
- "url": "https://getcontroller.ai/skills/2026.08.13.4/controllerai-agents/references/instructions-and-versioning.md",
242
+ "url": "https://getcontroller.ai/skills/2026.08.22.13/controllerai-agents/references/instructions-and-versioning.md",
243
243
  "sha256": "2dbd41d262c40776f4a8cb99537814e70d2ed4aedab327fa7b1cc7cfbf74064c",
244
244
  "size": 5086
245
245
  }