@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.
- package/dist/api/client.js +239 -13
- package/dist/api/client.js.map +1 -1
- package/dist/commands/agent.js +84 -10
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/approval.js +34 -0
- package/dist/commands/approval.js.map +1 -0
- package/dist/commands/auth.js +5 -4
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/branch.js +32 -1
- package/dist/commands/branch.js.map +1 -1
- package/dist/commands/connection.js +41 -0
- package/dist/commands/connection.js.map +1 -1
- package/dist/commands/expr.js +36 -0
- package/dist/commands/expr.js.map +1 -1
- package/dist/commands/file.js +70 -0
- package/dist/commands/file.js.map +1 -0
- package/dist/commands/flow.js +143 -26
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/node.js +66 -7
- package/dist/commands/node.js.map +1 -1
- package/dist/commands/run.js +50 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/trigger.js +4 -1
- package/dist/commands/trigger.js.map +1 -1
- package/dist/commands/workflow.js +149 -35
- package/dist/commands/workflow.js.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/errors.js +2 -3
- package/dist/errors.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/controllerai-agents/SKILL.md +32 -30
- package/skills/controllerai-node-config/SKILL.md +1 -1
- package/skills/controllerai-runs/SKILL.md +1 -1
- package/skills/controllerai-triggers/SKILL.md +2 -0
- package/skills/controllerai-workflows/SKILL.md +9 -7
- package/skills/controllerai-workflows/references/command-map.md +1 -1
- package/skills/manifest.json +45 -45
package/package.json
CHANGED
|
@@ -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.
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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.
|
|
48
|
-
Before attaching
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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,
|
|
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 (
|
|
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|
|
|
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
|
```
|
package/skills/manifest.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"skillSetVersion": "2026.08.13
|
|
3
|
+
"skillSetVersion": "2026.08.22.13",
|
|
4
4
|
"minCliVersion": "0.2.0",
|
|
5
|
-
"latestCliVersion": "0.2.
|
|
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
|
|
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
|
|
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
|
|
30
|
-
"sha256": "
|
|
31
|
-
"size":
|
|
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
|
|
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
|
|
42
|
-
"sha256": "
|
|
43
|
-
"size":
|
|
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
|
|
53
|
-
"sha256": "
|
|
54
|
-
"size":
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
122
|
-
"sha256": "
|
|
123
|
-
"size":
|
|
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
|
|
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
|
|
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
|
|
145
|
-
"sha256": "
|
|
146
|
-
"size":
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
231
|
-
"sha256": "
|
|
232
|
-
"size":
|
|
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
|
|
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
|
|
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
|
}
|