@controllerai/cli 0.2.26 → 0.2.28
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/commands/skills.js +0 -1
- package/dist/commands/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/controllerai-workflows/references/command-map.md +0 -1
- package/skills/manifest.json +36 -53
- package/skills-mcp/controllerai-brain/SKILL.md +73 -0
- package/skills-mcp/controllerai-data/SKILL.md +1 -1
- package/skills-mcp/controllerai-expressions/SKILL.md +1 -1
- package/skills-mcp/controllerai-integration-actions/SKILL.md +1 -1
- package/skills-mcp/controllerai-node-config/SKILL.md +1 -1
- package/skills-mcp/controllerai-node-config/references/prop-and-readiness.md +2 -2
- package/skills-mcp/controllerai-runs/SKILL.md +2 -2
- package/skills-mcp/controllerai-start/SKILL.md +2 -3
- package/skills-mcp/controllerai-triggers/SKILL.md +3 -3
- package/skills-mcp/controllerai-workflows/SKILL.md +0 -1
- package/skills-mcp/manifest.json +41 -53
- package/skills/controllerai-template-setup/SKILL.md +0 -132
- package/skills/controllerai-template-setup/agents/openai.yaml +0 -4
- package/skills-mcp/controllerai-start/references/mcp-tool-map.md +0 -178
- package/skills-mcp/controllerai-template-setup/SKILL.md +0 -10
- package/skills-mcp/controllerai-workflows/references/command-map.md +0 -1
|
@@ -33,7 +33,7 @@ Filtering records in expressions belongs to `controllerai-expressions`; configur
|
|
|
33
33
|
## Rules
|
|
34
34
|
|
|
35
35
|
1. **Persisting in workflow data needs a schema and a create-record node.** A flow output or an AI structured result is not stored anywhere by itself; a named external destination is written through its integration.
|
|
36
|
-
2. **Inspect existing schemas first and treat field IDs as contracts.** Relabel with
|
|
36
|
+
2. **Inspect existing schemas first and treat field IDs as contracts.** Relabel with `display` alone in `schema_type_update`; renaming the `custom.*` key or a field ID strands the stored values under the old key.
|
|
37
37
|
3. **Read the whole schema before updating it, then read the echo.** The field list is replaced, not merged; disclose every removed field and confirm the persisted shape matches intent.
|
|
38
38
|
4. **Never feed a query result into a direct create or update.** Its keys are display names; rebuild the fields object by write key and omit `id`, `createdAt` and `updatedAt`. The native Update, Update multiple and Delete nodes are the opposite case: they take the stored record itself.
|
|
39
39
|
5. **Work on the store the request names; development is the default.** Before any live write, say that published and triggered runs read that store.
|
|
@@ -17,7 +17,7 @@ Node discovery, connections and static props belong to `controllerai-node-config
|
|
|
17
17
|
|
|
18
18
|
Expressions are written in a restricted JavaScript-like language and compiled into the engine's expression tree. It is not JavaScript: no loops, assignments, `new`, regular expressions, optional chaining, object literals (the `{ ignoreEmptyConstraints: true }` filter options object is the one accepted object) or library methods beyond what the compiler catalog advertises. A program is optional `const` declarations followed by one final expression.
|
|
19
19
|
|
|
20
|
-
**Everything is typed.** An expression can only be written against a known type. An integration node's output type is usually learned from a representative development run, or from a supported output selector or a declared provider sample, and `
|
|
20
|
+
**Everything is typed.** An expression can only be written against a known type. An integration node's output type is usually learned from a representative development run, or from a supported output selector or a declared provider sample, and `node_status` says which route applies; `custom.*` types describe data-store records and AI structured outputs; `dataRecord.custom.x` is a stored record of that shape with its identity (`id`, `createdAt`, `updatedAt`), while bare `custom.x` is the shape alone; `list.` prefixes a list of any type. When an expression cannot be authored, the cause is usually a missing upstream type.
|
|
21
21
|
|
|
22
22
|
**Scope** comes from the destination's expression context: `flow.<name>` is a flow input, `inputs.<name>` a wired node input (usually already unwrapped), `item` the current loop item where the context exposes it, `workflowData("custom.type")` the records of an active collection on the current rail, and `now` and `isLiveVersion` constants. Bindings are display-derived and de-duplicated by the context; display labels and old spellings are not bindings.
|
|
23
23
|
|
|
@@ -79,7 +79,7 @@ A connection change redirects a connected published action at once. A descriptio
|
|
|
79
79
|
- `agent_conversation_deny` — `conversationId`, `message`, `requestId`
|
|
80
80
|
|
|
81
81
|
`agent_test` takes `rail: "draft"` and `waitSeconds`; approve and deny take the `requestId` from the pending request.
|
|
82
|
-
`
|
|
82
|
+
`agent_test` is a one-shot that opens a new conversation; when a follow-up or an approval is expected, create one draft conversation and send into it as in `controllerai-agents`. When confirmation is on, inspect the pending action and its exact arguments, then approve or deny in that same conversation and read the history for the terminal result. Direct actions do not create workflow execution IDs: never invent one.
|
|
83
83
|
|
|
84
84
|
## Verify
|
|
85
85
|
|
|
@@ -21,7 +21,7 @@ A **node** is a configured instance of a **component**: an integration action, a
|
|
|
21
21
|
|
|
22
22
|
**Props** come in kinds: static values; optional props that exist in the catalog and appear once enabled; option-backed props whose values come from static lists or a provider lookup; reload selectors (`reloadProps: true`) that change the schema of later props; and expression-capable props that take a dynamic value. Options are resolved in prop order: an earlier single-choice selector gates later lookups. `optionsAvailability` reports `available`, `blocked_upstream` with `blockedBy`, or `dynamic_upstream`; when the field is absent, availability is unknown, not available.
|
|
23
23
|
|
|
24
|
-
**Readiness** (the node status read) reports distinct blockers: `missingConnection`, `missingRequiredProps`, `disabledRequiredProps` (the selector that activates them is named in `blockedBy` and `next`), `pendingReloadProps`, an unset subflow target or an invalid static option, and `dynamicSelectorNotes` (non-blocking: dependents still reflect the last concrete selection). `readyForExpressions` means the connection and the required and reload props are complete; `readyForRun` means it can execute; `readyForDownstreamExpressions` additionally means the output type is concrete. Readiness does not check wiring. `outputTypeStatus` is `concrete`, `unresolved` or `none` (a sink or control node has no output); an unresolved integration output is learned from a representative run, a supported output selector or a declared sample, and adoption changes only that node, so two instances of a generic component can learn different shapes. `next` is diagnostic guidance phrased as a
|
|
24
|
+
**Readiness** (the node status read) reports distinct blockers: `missingConnection`, `missingRequiredProps`, `disabledRequiredProps` (the selector that activates them is named in `blockedBy` and `next`), `pendingReloadProps`, an unset subflow target or an invalid static option, and `dynamicSelectorNotes` (non-blocking: dependents still reflect the last concrete selection). `readyForExpressions` means the connection and the required and reload props are complete; `readyForRun` means it can execute; `readyForDownstreamExpressions` additionally means the output type is concrete. Readiness does not check wiring. `outputTypeStatus` is `concrete`, `unresolved` or `none` (a sink or control node has no output); an unresolved integration output is learned from a representative run, a supported output selector or a declared sample, and adoption changes only that node, so two instances of a generic component can learn different shapes. `next` is diagnostic guidance phrased as a command line: apply it with the matching typed tool rather than executing it blindly.
|
|
25
25
|
|
|
26
26
|
## Rules
|
|
27
27
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- `readyForExpressions`: connection and required/reload props complete. The source still has to be wired before its binding appears in expression context.
|
|
13
13
|
- `readyForRun`: runnable; the run may be what discovers the output type.
|
|
14
14
|
- `readyForDownstreamExpressions`: runnable and the process output type is concrete enough for downstream field bindings. Require this, not `readyForRun`, before binding downstream fields.
|
|
15
|
-
- `next`: diagnostic guidance for the next step, phrased as a
|
|
15
|
+
- `next`: diagnostic guidance for the next step, phrased as a command line; apply it with the matching typed tool.
|
|
16
16
|
|
|
17
17
|
## Prop channels
|
|
18
18
|
|
|
@@ -46,4 +46,4 @@ For a component whose dependent schema exists only after a concrete selection: s
|
|
|
46
46
|
|
|
47
47
|
Resolve an unresolved output by setting the component's supported output or data-type selector, by running the configured node with representative inputs, or by declaring a documented provider sample as unverified. A discovery run (`controllerai-runs`) probes a component that is not in the graph on a scratch node: it deletes that node afterwards, keeps the scratch flow for reuse, and never types a node in the real flow.
|
|
48
48
|
|
|
49
|
-
A completed run passes its exact node-execution ID back for ownership, workflow, node, component-snapshot and terminal-state checks, then the persisted output shape is adopted for that non-static node only. Read `outputTypeAdoption` (or `outputTypeAdoptions`) in the run result: `no_observed_output` means the run produced no reusable output, which is expected for a sink or control node and, for a data-producing action, a reason to rerun with representative data only when a downstream binding needs the type; `error` means stop and surface it. After adoption, re-read `
|
|
49
|
+
A completed run passes its exact node-execution ID back for ownership, workflow, node, component-snapshot and terminal-state checks, then the persisted output shape is adopted for that non-static node only. Read `outputTypeAdoption` (or `outputTypeAdoptions`) in the run result: `no_observed_output` means the run produced no reusable output, which is expected for a sink or control node and, for a data-producing action, a reason to rerun with representative data only when a downstream binding needs the type; `error` means stop and surface it. After adoption, re-read `node_status` and the expression context. An example response alone never establishes a type.
|
|
@@ -22,7 +22,7 @@ Expression authoring belongs to `controllerai-expressions`, branch and loop stru
|
|
|
22
22
|
|
|
23
23
|
**Three scopes.** A node run isolates the node's own configuration and does not execute wired upstream nodes; `runScope.endToEndValidationRequired` is computed from the wiring before the run and says that upstream-derived values need a containing-flow check, while `resolvedConfigs` shows what they actually were. A flow run executes the wiring and proves `inputs.<name>` expressions and the return contract. A discovery run creates a scratch node from a component that is not in the graph inside a reusable scratch flow, executes it and deletes the node (the flow stays), only to learn what it returns; it types nothing in the real flow.
|
|
24
24
|
|
|
25
|
-
**Inputs are keyed by ID.** `
|
|
25
|
+
**Inputs are keyed by ID.** `run_inputs` lists the exact input IDs a node or flow reads. A flow lists every declared input with a `used` flag: supply the used ones (an omitted used input falls back to its saved test value), and values for unused inputs are accepted and ignored. An isolated node run must receive every referenced `flowInputs[].id` or it fails before executing with `ISOLATED_FLOW_CONTEXT_REQUIRED`. Explicit `null`, `""`, `false` and `0` are supplied values; dates are plain ISO-8601 text.
|
|
26
26
|
|
|
27
27
|
**The evidence.** `status` and `errorMessage`; `skipReason` (`only_when_false`, `upstream_skipped`); `runScope`; `resolvedConfigs`, where a null entry on a dynamic prop that the contract did not intend is a silent expression failure on an otherwise green run, and each entry's `resolutionWarnings` (an explicit `[]` means the resolver reported nothing; the value still has to match the contract); the output shape and values; and the adoption result, `outputTypeAdoption` on a node run or `outputTypeAdoptions` on a flow run, where `adopted` or `already_typed` lets the node status converge, `no_observed_output` means the run returned no reusable shape, and each entry's `adoptedNodeIds` must be empty or name only its own node.
|
|
28
28
|
|
|
@@ -37,7 +37,7 @@ Expression authoring belongs to `controllerai-expressions`, branch and loop stru
|
|
|
37
37
|
5. **Find the first divergence, not the last error.** Walk the execution tree, classify each node as completed, failed, skipped on purpose, skipped unexpectedly or absent; later failures are usually consequences.
|
|
38
38
|
6. **Verify the effect where it lives.** Data writes: query the same store. Files: open the artifact. Provider actions: the provider's result, not the execution ID.
|
|
39
39
|
7. **Never let a stalled run become a duplicate.** Inspect the returned execution; rerun only after it reached a terminal state and the cause is understood.
|
|
40
|
-
8. **Adoption stays on the tested node.** Stop if `adoptedNodeIds` names a sibling, and re-read `
|
|
40
|
+
8. **Adoption stays on the tested node.** Stop if `adoptedNodeIds` names a sibling, and re-read `node_status` and downstream expression contexts after a type is adopted.
|
|
41
41
|
|
|
42
42
|
## Recipes
|
|
43
43
|
|
|
@@ -54,10 +54,10 @@ If the outcome does not reveal whether the user wants an assistant or an automat
|
|
|
54
54
|
|
|
55
55
|
These apply in every domain skill.
|
|
56
56
|
|
|
57
|
-
1. **
|
|
57
|
+
1. **Typed tools only.** Use the Controller AI MCP tools for every operation, and never a private endpoint or a raw request in place of a missing capability.
|
|
58
58
|
2. **Resolve the exact target before the first write.** Prefer an explicit ID or an object already tied to the workflow. On account-wide lists, match exact name or ID and owner, read back ID, name and owner, and keep those IDs. Never take the first or a similar result, because a write to the wrong object is a change the user did not ask for. "The latest" is fine only when the user asked for it and timestamps prove it.
|
|
59
59
|
3. **Discover, never invent.** Action keys, prop names, option values, schemas, field IDs, models and expression bindings come from live discovery (`integration_action_list`, `expr_operation_list`, the node's own props). Returned metadata beats any example in these skills.
|
|
60
|
-
4. **One mutation, then read it back.** Inspect the complete result of every mutation (
|
|
60
|
+
4. **One mutation, then read it back.** Inspect the complete result of every mutation (`isError` and the whole structured content, or the artifact it points to) before projecting a field; a missing projected field is not a failed write. Before retrying a create, read the returned ID or the exact inventory and prove the first call created nothing.
|
|
61
61
|
5. **A missing business rule is a blocker, not a guess.** Ask when a choice changes the result; never infer a rule from names or sample data. Routine implementation choices are yours: make them and disclose them.
|
|
62
62
|
6. **Consequential runs are real.** Development and test labels do not sandbox providers. A send, write, delete or spend needs a safe target and clear intent; if the user declines a test, deliver the build untested and say so. Existing explicit authorization persists: do not ask again just because publishing is the next step.
|
|
63
63
|
7. **Evidence beyond a green status.** Inspect inputs, resolved configs, outputs, skips, warnings and the stored or external effect. A run that finished is not proof the data is right.
|
|
@@ -79,4 +79,3 @@ Before saying a deliverable works, hold the evidence for it: the created objects
|
|
|
79
79
|
|
|
80
80
|
Give the user what was created and where it lives, whether each piece is draft or live, what was verified and what was not, which defaults you chose, and what still needs them: a connection to authorize, a decision, a publish. Reference the platform docs at https://docs.getcontroller.ai (index at https://docs.getcontroller.ai/llms.txt) for the execution and cost model, the type system and the full command and expression references; when a doc and live discovery disagree, live discovery wins.
|
|
81
81
|
|
|
82
|
-
Read [references/mcp-tool-map.md](references/mcp-tool-map.md) when you need the MCP tool and parameter names for a CLI command; names are derived from the command path with reviewed exceptions, so never guess one.
|
|
@@ -28,13 +28,13 @@ Flow inputs and mapping expressions belong to `controllerai-expressions`; readin
|
|
|
28
28
|
|
|
29
29
|
## Rules
|
|
30
30
|
|
|
31
|
-
1. **The start condition is the user's decision.** Create a source only with an explicit
|
|
31
|
+
1. **The start condition is the user's decision.** Create a source only with an explicit `sourceBasis`: `explicit-in-request`, `user-answer`, or `inferred-from-existing-workflow` when preserving an existing source. The backend rejects an assumption; when the request does not say when the automation runs, ask one focused question first.
|
|
32
32
|
2. **Copy the exact `nodeSlug` and `eventKey`** from the search result; never derive an event key from its display name, because keys are opaque and display names collide across providers.
|
|
33
33
|
3. **Ask for the timezone** when the user says "at 9am" without one, and never infer a production cadence from a test sample, whose timing is a test artifact.
|
|
34
34
|
4. **Repair in place.** Keep the trigger's canvas ID and source when fixing its mapping or readiness; replacing a trigger changes captured IDs and may change a webhook URL, so replace only when the source itself must change, then recapture every ID.
|
|
35
|
-
5. **Delete a retired start; disable a paused one.** "Stop starting itself", "retire" and "no longer" mean delete: a disabled trigger still exists and can be re-enabled, so it is not retired. Never delete the owning flow to remove a trigger (that destroys the graph and its callers), and pass exactly one
|
|
35
|
+
5. **Delete a retired start; disable a paused one.** "Stop starting itself", "retire" and "no longer" mean delete: a disabled trigger still exists and can be re-enabled, so it is not retired. Never delete the owning flow to remove a trigger (that destroys the graph and its callers), and pass exactly one `enabled` value.
|
|
36
36
|
6. **Arm ambient dispatch only on the user's decision, and disarm when setup ends**, including a failed or abandoned setup. Capture needs no arming; arming executes a half-built development flow on real traffic, so explain that before adding the acknowledgement. Keeping both rails armed is an uncommon, explicit user choice, never a default, and routine tests use replay.
|
|
37
|
-
7. **Never mix the
|
|
37
|
+
7. **Never mix the state parameters or the acknowledgements.** `trigger_set_enabled.enabled`, `trigger_test_events_set.allowed`, `target: "dev" | "live"`; `acknowledgeDualRun` only while arming, `workflow_publish.acknowledgeDualDispatch` only while publishing an armed trigger, `confirmLive` only for one live replay. Never add an acknowledgement on your own initiative.
|
|
38
38
|
8. **Audit every trigger before a publish**, not only the one you touched; users forget starts left enabled or armed in other flows.
|
|
39
39
|
9. **A captured event is not a run.** For create or mapping work, verify received inputs, outputs and effects on a development replay; an event with no execution and an execution with empty inputs are different faults. Read-only diagnosis, a deletion (verified through the list and status) and a user-declined test need no replay.
|
|
40
40
|
10. **A draft-only request stops at development proof**, and a delete-only or disable-only task needs no replay.
|
|
@@ -105,4 +105,3 @@ Evidence that a build works: validation reports zero errors, or each remaining e
|
|
|
105
105
|
|
|
106
106
|
What was built, what ran and what it returned, whether it is published, and any connection or product decision still pending. Share returned product links only; never guess one.
|
|
107
107
|
|
|
108
|
-
When a task spans several domains, the generated tool map in `controllerai-start` lists every tool and its parameters by CLI command family.
|
package/skills-mcp/manifest.json
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"skillSetVersion": "2026.10.
|
|
3
|
+
"skillSetVersion": "2026.10.20.1",
|
|
4
4
|
"minCliVersion": "0.2.0",
|
|
5
|
-
"latestCliVersion": "0.2.
|
|
5
|
+
"latestCliVersion": "0.2.28",
|
|
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-mcp/2026.10.
|
|
13
|
-
"sha256": "
|
|
14
|
-
"size":
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"path": "controllerai-start/references/mcp-tool-map.md",
|
|
18
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.05.1/controllerai-start/references/mcp-tool-map.md",
|
|
19
|
-
"sha256": "29797a84536d335304262b003b4a197ad18a4919780e2cfc9f7137d9a477407d",
|
|
20
|
-
"size": 27234
|
|
12
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-start/SKILL.md",
|
|
13
|
+
"sha256": "b68d413619879e2553e625d1569ad6fed13e90b1f00cb5eaff2963bb48476ad7",
|
|
14
|
+
"size": 10858
|
|
21
15
|
}
|
|
22
16
|
]
|
|
23
17
|
},
|
|
@@ -26,15 +20,9 @@
|
|
|
26
20
|
"files": [
|
|
27
21
|
{
|
|
28
22
|
"path": "controllerai-workflows/SKILL.md",
|
|
29
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
30
|
-
"sha256": "
|
|
31
|
-
"size":
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"path": "controllerai-workflows/references/command-map.md",
|
|
35
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.05.1/controllerai-workflows/references/command-map.md",
|
|
36
|
-
"sha256": "3a1fe464d00c2ae734dab11db3b338436d91a9c32dd8a1b3f1843ac4200a739c",
|
|
37
|
-
"size": 89
|
|
23
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-workflows/SKILL.md",
|
|
24
|
+
"sha256": "ef78a776417d6f17cd60da27db385088875ddd1db6483428232d4e6e8c6f69df",
|
|
25
|
+
"size": 9408
|
|
38
26
|
}
|
|
39
27
|
]
|
|
40
28
|
},
|
|
@@ -43,15 +31,15 @@
|
|
|
43
31
|
"files": [
|
|
44
32
|
{
|
|
45
33
|
"path": "controllerai-node-config/SKILL.md",
|
|
46
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
47
|
-
"sha256": "
|
|
48
|
-
"size":
|
|
34
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-node-config/SKILL.md",
|
|
35
|
+
"sha256": "601fd973979b28e92ce33ceecc4ef86f2e79d8e23ca947e8620c1ca1bf5c0e7d",
|
|
36
|
+
"size": 11934
|
|
49
37
|
},
|
|
50
38
|
{
|
|
51
39
|
"path": "controllerai-node-config/references/prop-and-readiness.md",
|
|
52
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
53
|
-
"sha256": "
|
|
54
|
-
"size":
|
|
40
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-node-config/references/prop-and-readiness.md",
|
|
41
|
+
"sha256": "443e454844dc87d9dec06e5aa78d61e3bed4a201060bda277601befaca7eb6e5",
|
|
42
|
+
"size": 5331
|
|
55
43
|
}
|
|
56
44
|
]
|
|
57
45
|
},
|
|
@@ -60,13 +48,13 @@
|
|
|
60
48
|
"files": [
|
|
61
49
|
{
|
|
62
50
|
"path": "controllerai-expressions/SKILL.md",
|
|
63
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
64
|
-
"sha256": "
|
|
51
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-expressions/SKILL.md",
|
|
52
|
+
"sha256": "8e10c12e8e2c9650d8bd0918f7d318fb24e910fbf2e9d90ae9ee18835a7324fb",
|
|
65
53
|
"size": 10495
|
|
66
54
|
},
|
|
67
55
|
{
|
|
68
56
|
"path": "controllerai-expressions/references/dsl-and-recipes.md",
|
|
69
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
57
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-expressions/references/dsl-and-recipes.md",
|
|
70
58
|
"sha256": "741b03033cb655dde95be99dcf6e00295b1b2d4f385ad42bbf4bb3c4001c9973",
|
|
71
59
|
"size": 4915
|
|
72
60
|
}
|
|
@@ -77,13 +65,13 @@
|
|
|
77
65
|
"files": [
|
|
78
66
|
{
|
|
79
67
|
"path": "controllerai-flow-control/SKILL.md",
|
|
80
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
68
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-flow-control/SKILL.md",
|
|
81
69
|
"sha256": "4bacfc3b7501565e0e5984b19d9223da1b5bf770875db804b5e6827d33efa967",
|
|
82
70
|
"size": 12367
|
|
83
71
|
},
|
|
84
72
|
{
|
|
85
73
|
"path": "controllerai-flow-control/references/patterns.md",
|
|
86
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
74
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-flow-control/references/patterns.md",
|
|
87
75
|
"sha256": "a849179afb512e8fc0c3c833a1a2c737c5108e8ab8941c9fa261767671eceb01",
|
|
88
76
|
"size": 4704
|
|
89
77
|
}
|
|
@@ -94,13 +82,13 @@
|
|
|
94
82
|
"files": [
|
|
95
83
|
{
|
|
96
84
|
"path": "controllerai-runs/SKILL.md",
|
|
97
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
98
|
-
"sha256": "
|
|
85
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-runs/SKILL.md",
|
|
86
|
+
"sha256": "a11349238a4b07e0c701fcbe049c510ea43fc3480c3b94ae299023b4a10bf475",
|
|
99
87
|
"size": 9312
|
|
100
88
|
},
|
|
101
89
|
{
|
|
102
90
|
"path": "controllerai-runs/references/debugging.md",
|
|
103
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
91
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-runs/references/debugging.md",
|
|
104
92
|
"sha256": "616d13ea43785e4d11bdb50b9e4098126fbc470ee2568b250e1af5f15cab3edf",
|
|
105
93
|
"size": 3162
|
|
106
94
|
}
|
|
@@ -111,13 +99,13 @@
|
|
|
111
99
|
"files": [
|
|
112
100
|
{
|
|
113
101
|
"path": "controllerai-triggers/SKILL.md",
|
|
114
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
115
|
-
"sha256": "
|
|
116
|
-
"size":
|
|
102
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-triggers/SKILL.md",
|
|
103
|
+
"sha256": "c45cc45e4a8b6ff7eae6ec8cfcae36f63fbcdc6a78de704af3e14385885acafb",
|
|
104
|
+
"size": 12412
|
|
117
105
|
},
|
|
118
106
|
{
|
|
119
107
|
"path": "controllerai-triggers/references/lifecycle.md",
|
|
120
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
108
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-triggers/references/lifecycle.md",
|
|
121
109
|
"sha256": "519d9f858ee2ec8ab5f1c988e547f5a8c5478f4da3d454236354ade9800ed044",
|
|
122
110
|
"size": 3438
|
|
123
111
|
}
|
|
@@ -128,13 +116,13 @@
|
|
|
128
116
|
"files": [
|
|
129
117
|
{
|
|
130
118
|
"path": "controllerai-data/SKILL.md",
|
|
131
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
132
|
-
"sha256": "
|
|
133
|
-
"size":
|
|
119
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-data/SKILL.md",
|
|
120
|
+
"sha256": "0d811acf8f3564cc07bdbf80d247199408c9f3120f3ab709141e7f416621e216",
|
|
121
|
+
"size": 12505
|
|
134
122
|
},
|
|
135
123
|
{
|
|
136
124
|
"path": "controllerai-data/references/data-rails.md",
|
|
137
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
125
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-data/references/data-rails.md",
|
|
138
126
|
"sha256": "6d22c72b3b2da83cfaf078683ef41ec2b6f3b9b249789ab2bd23d01d6710c261",
|
|
139
127
|
"size": 2843
|
|
140
128
|
}
|
|
@@ -145,13 +133,13 @@
|
|
|
145
133
|
"files": [
|
|
146
134
|
{
|
|
147
135
|
"path": "controllerai-ai-nodes/SKILL.md",
|
|
148
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
136
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-ai-nodes/SKILL.md",
|
|
149
137
|
"sha256": "a5ff387776661a193b75c9a0a8e4973b87904e9da5d10d48a2f10bdcf758693d",
|
|
150
138
|
"size": 9522
|
|
151
139
|
},
|
|
152
140
|
{
|
|
153
141
|
"path": "controllerai-ai-nodes/references/selection-and-testing.md",
|
|
154
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
142
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-ai-nodes/references/selection-and-testing.md",
|
|
155
143
|
"sha256": "66b235b9e81645ab877b31443505c7b07ea3f2e5a357053f266c121415f8cf5c",
|
|
156
144
|
"size": 3111
|
|
157
145
|
}
|
|
@@ -162,8 +150,8 @@
|
|
|
162
150
|
"files": [
|
|
163
151
|
{
|
|
164
152
|
"path": "controllerai-integration-actions/SKILL.md",
|
|
165
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
166
|
-
"sha256": "
|
|
153
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-integration-actions/SKILL.md",
|
|
154
|
+
"sha256": "5cdf3ca6a0031fe97a76081ceaabdf53ae6cdc25ebf285725c8ecd5f05bd9904",
|
|
167
155
|
"size": 10142
|
|
168
156
|
}
|
|
169
157
|
]
|
|
@@ -173,26 +161,26 @@
|
|
|
173
161
|
"files": [
|
|
174
162
|
{
|
|
175
163
|
"path": "controllerai-agents/SKILL.md",
|
|
176
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
164
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-agents/SKILL.md",
|
|
177
165
|
"sha256": "f93bbe8dee0c0686352531a60249f9a5da696107dc49d8f1e2bf9ff6639e141a",
|
|
178
166
|
"size": 13060
|
|
179
167
|
},
|
|
180
168
|
{
|
|
181
169
|
"path": "controllerai-agents/references/instructions-and-versioning.md",
|
|
182
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
170
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-agents/references/instructions-and-versioning.md",
|
|
183
171
|
"sha256": "88b059e74aef03ccb12a53815d1090e5449090ff6dfd863b6cef5a12b434cb65",
|
|
184
172
|
"size": 5644
|
|
185
173
|
}
|
|
186
174
|
]
|
|
187
175
|
},
|
|
188
176
|
{
|
|
189
|
-
"name": "controllerai-
|
|
177
|
+
"name": "controllerai-brain",
|
|
190
178
|
"files": [
|
|
191
179
|
{
|
|
192
|
-
"path": "controllerai-
|
|
193
|
-
"url": "https://getcontroller.ai/skills-mcp/2026.10.
|
|
194
|
-
"sha256": "
|
|
195
|
-
"size":
|
|
180
|
+
"path": "controllerai-brain/SKILL.md",
|
|
181
|
+
"url": "https://getcontroller.ai/skills-mcp/2026.10.20.1/controllerai-brain/SKILL.md",
|
|
182
|
+
"sha256": "792121d1637f815259252233aa929a00820fec4382859803a856d9cf5240afb1",
|
|
183
|
+
"size": 7549
|
|
196
184
|
}
|
|
197
185
|
]
|
|
198
186
|
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: controllerai-template-setup
|
|
3
|
-
description: Complete an assisted Controller AI agent-template setup from the injected setup brief. Use when the system prompt contains a `## Template Setup` section with copied workflows, required connections, expected workflow tools, and a brief.
|
|
4
|
-
---
|
|
5
|
-
<!-- generated from .claude/skills by cli/scripts/render-skills.mjs; edit the source -->
|
|
6
|
-
|
|
7
|
-
# Assisted template setup
|
|
8
|
-
|
|
9
|
-
## Use this when
|
|
10
|
-
|
|
11
|
-
Use this skill first whenever the system prompt contains `## Template Setup`. That block is the authoritative inventory for one copied agent and its workflows; the brief decides which customer-specific values to collect, while the completion check decides whether every workflow is live and every expected workflow tool is attached.
|
|
12
|
-
|
|
13
|
-
Load `controllerai-node-config` for props, options, connections and node readiness, `controllerai-runs` for development checks, `controllerai-workflows` for validation and publication, and `controllerai-agents` for workflow-tool attachment. The setup procedure below owns their order.
|
|
14
|
-
|
|
15
|
-
## How it works
|
|
16
|
-
|
|
17
|
-
Read the entire injected block before acting. Its exact sections are `## Template Setup`, `### Copied Workflows`, `### Required Connections`, `### Expected Workflow Tools`, `### Brief`, and `### Completion Rule`; the opening fields are `Template`, `Template description`, and `Agent`. Keep every agent ID, copied workflow ID, source workflow-template ID, node ID, `nodeSlug`, `flow ID`, tool description, and `requiresConfirmation` value paired with its displayed name. Never rediscover one of these targets by a similar name.
|
|
18
|
-
|
|
19
|
-
The copied workflows are development drafts. Setup is complete only after every workflow under `### Copied Workflows` has been configured, checked, and published, and every binding under `### Expected Workflow Tools` is attached to the copied agent. Publishing the workflows does not publish the agent.
|
|
20
|
-
|
|
21
|
-
## Rules
|
|
22
|
-
|
|
23
|
-
1. **Explain before asking.** Before any connection handoff or brief question, explain what the template will do in exactly two plain-language sentences, using the template description and brief without exposing IDs, slugs, props, or commands. The kickoff already approves the template's shape, so do not insert the generic new-build planning round.
|
|
24
|
-
2. **Connections come first and are never optional.** Do not ask a brief decision while a connection required by the current graph is missing. A brief may offer an optional branch, but not an optional connection: if the user declines that branch, remove or disable the branch as the brief directs so the declined integration is no longer required.
|
|
25
|
-
3. **Ask one brief decision at a time.** Read the target's current props and any option list before framing that decision, ask in user-facing labels, end the turn, and wait. Do not bundle the next decision into the same message.
|
|
26
|
-
4. **Configure only what the brief asks for.** Do not infer channels, sheets, calendars, schedules, recipients, filters, defaults, or optional behavior from names or sample data. Preserve copied configuration that the brief does not direct you to change.
|
|
27
|
-
5. **Never publish a placeholder.** Values such as `TODO`, example IDs, angle-bracket placeholders, setup notes, unset required props, and a declined branch that still needs its connection are blockers. Fix or remove the affected path before publication.
|
|
28
|
-
6. **Use development evidence.** Check the smallest relevant node or flow after configuration, then the containing flow when an isolated node cannot prove wiring or expressions. A successful status without the intended output is not evidence.
|
|
29
|
-
7. **Treat completion failure as the repair list.** A failed completion returns `Agent template setup is incomplete:` followed by one bullet per problem. Fix exactly those bullets and nothing else. Do not redesign the template, add speculative tools, or mark success around a failed completion command.
|
|
30
|
-
|
|
31
|
-
## Procedure
|
|
32
|
-
|
|
33
|
-
### Establish the setup
|
|
34
|
-
|
|
35
|
-
Run `cai template-setup status --json` when starting or resuming. Continue only for the active setup bound to this thread; a missing, failed, or abandoned state is a stop condition, and a completed state should be reported without repeating setup. Read the block inventory, then give the required two-sentence explanation before asking the user to do or choose anything.
|
|
36
|
-
|
|
37
|
-
### Resolve every connection
|
|
38
|
-
|
|
39
|
-
For each unique `nodeSlug` in `### Required Connections`, inspect active accounts:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
cai connection list --integration <nodeSlug> --json
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
If none exists, request the connection:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
cai connection request <nodeSlug> --json
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Tell the user in one plain sentence which service to connect and why, then stop and wait. If several accounts exist and the brief does not identify one, ask which displayed account to use and wait. After the user responds, verify with a fresh list; a connect card or a promise to connect is not authorization evidence.
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
cai connection list --integration <nodeSlug> --json
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Bind the selected active connection to every matching node, using its copied workflow ID explicitly, and read readiness back:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
cai node set-connection <nodeId> --connection <connectionId> --workflow <workflowId> --json
|
|
61
|
-
cai node status <nodeId> --workflow <workflowId> --json
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Do not move to brief decisions until all connections still required by the graph are bound. When the user declines an optional branch, make the brief-directed removal or disablement first, then confirm the remaining nodes no longer require that integration.
|
|
65
|
-
|
|
66
|
-
### Resolve brief decisions
|
|
67
|
-
|
|
68
|
-
Take the decisions in brief order. Before each question, inspect the exact target:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
cai node props <nodeId> --workflow <workflowId> --json
|
|
72
|
-
cai node options <nodeId> --prop <exactName> --workflow <workflowId> --json
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Fetch option lists only after the connection and upstream selectors they depend on exist. If a selector reveals later props, set it, read props again, and only then prepare the next question. Present the returned labels, retain their exact values, and after the user's answer make one write and read it back:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
cai node set <nodeId> --prop <exactName> --value '<returned-value>' --label '<returned-label>' --workflow <workflowId> --json
|
|
79
|
-
cai node props <nodeId> --workflow <workflowId> --json
|
|
80
|
-
cai node status <nodeId> --workflow <workflowId> --json
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
For a free-form value, respect the prop's type and ask for it in normal assistant text. If the brief does not call for a decision, do not create one.
|
|
84
|
-
|
|
85
|
-
### Check and publish every workflow
|
|
86
|
-
|
|
87
|
-
Use safe representative inputs on development and inspect the actual output:
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
cai run node <nodeId> --inputs '<json>' --workflow <workflowId> --json
|
|
91
|
-
cai run flow <flowId> --inputs '<json>' --workflow <workflowId> --json
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Choose the node or flow that proves the configured decision; run the containing flow where wiring matters. Resolve every placeholder and readiness blocker, then publish each copied workflow listed in the block, including one with no expected tool:
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
cai workflow publish --workflow <workflowId> --json
|
|
98
|
-
cai workflow status --workflow <workflowId> --json
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Attach the expected tools and complete
|
|
102
|
-
|
|
103
|
-
For every line under `### Expected Workflow Tools`, attach that exact `(workflow ID, flow ID)` pair to the block's agent ID. Preserve the supplied description; omit `--description` only when it is `(none)`. Include `--require-confirmation` exactly when `requiresConfirmation` is `true`, and omit it when false.
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
cai agent add-workflow <agentId> --workflow-id <workflowId> --flow <flowId> --description '<description>' --require-confirmation --json
|
|
107
|
-
cai agent tools <agentId> --json
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Do not attach an extra flow and do not publish the agent. Once every expected pair reads back, run:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
cai template-setup complete --json
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Success requires the returned setup status to be `completed`. If it fails, the error lists every remaining problem as a bullet. Each bullet maps to one repair:
|
|
117
|
-
|
|
118
|
-
- `<workflow> has unpublished changes`: the development state differs from the live release; publish that workflow again.
|
|
119
|
-
- `<node> in <workflow> has no connected account`: bind an active connection to that node, then publish again.
|
|
120
|
-
- `<workflow / flowId> is not present in the published workflow`: the expected flow is missing from the live release; restore it and publish.
|
|
121
|
-
- `<workflow / flowId> is missing its workflow tool binding`: attach that exact pair to the agent.
|
|
122
|
-
- `<workflow / flowId> must require confirmation`: update the tool so confirmation is required.
|
|
123
|
-
|
|
124
|
-
Verify each repair with the same read-back commands, then run completion again.
|
|
125
|
-
|
|
126
|
-
## Verify
|
|
127
|
-
|
|
128
|
-
Every connection still required by the final graph is active and bound; every brief decision reads back with the user's value; development evidence proves the configured path; each copied workflow has a live release; the agent tool list contains every expected workflow/flow pair with the supplied description and confirmation policy; and `cai template-setup complete` returns `completed`.
|
|
129
|
-
|
|
130
|
-
## Report
|
|
131
|
-
|
|
132
|
-
Tell the user what the configured template now does, the choices applied, what the development checks proved, and that its workflows are live and its tools attached. Name any untested external effect or remaining blocker plainly; never call a setup complete unless the completion command did.
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
interface:
|
|
2
|
-
display_name: "Controller AI Template Setup"
|
|
3
|
-
short_description: "Finish guided agent-template setup"
|
|
4
|
-
default_prompt: "Use $controllerai-template-setup to finish the assisted template setup in this builder thread, following its brief one decision at a time."
|