@controllerai/cli 0.2.25 → 0.2.27
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/connection.js +12 -5
- package/dist/commands/connection.js.map +1 -1
- package/dist/commands/skills.js +0 -1
- package/dist/commands/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/controllerai-integration-actions/SKILL.md +2 -2
- package/skills/controllerai-node-config/SKILL.md +1 -1
- package/skills/controllerai-workflows/references/command-map.md +0 -1
- package/skills/manifest.json +40 -57
- 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 +3 -3
- package/skills-mcp/controllerai-node-config/SKILL.md +2 -2
- 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 +37 -60
- 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
package/skills/manifest.json
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"skillSetVersion": "2026.
|
|
3
|
+
"skillSetVersion": "2026.10.15.1",
|
|
4
4
|
"minCliVersion": "0.2.0",
|
|
5
|
-
"latestCliVersion": "0.2.
|
|
5
|
+
"latestCliVersion": "0.2.27",
|
|
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.
|
|
12
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-start/SKILL.md",
|
|
13
13
|
"sha256": "5034c98ea02fe27fdb492a768c025deee7724a77e053e9d7ab204ce72b34cb08",
|
|
14
14
|
"size": 11414
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"path": "controllerai-start/agents/openai.yaml",
|
|
18
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
18
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-start/agents/openai.yaml",
|
|
19
19
|
"sha256": "3240c24df8ba5ebfb67bc3e9dbce97f4a78384c352123210197a2dbf27c51150",
|
|
20
20
|
"size": 226
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "controllerai-start/references/mcp-tool-map.md",
|
|
24
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
24
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-start/references/mcp-tool-map.md",
|
|
25
25
|
"sha256": "f7adfaf1332a0a28ca6ad7a45b2f30f3fbba4e6a4ec031f5115843f36fd7828f",
|
|
26
26
|
"size": 27396
|
|
27
27
|
}
|
|
@@ -32,21 +32,21 @@
|
|
|
32
32
|
"files": [
|
|
33
33
|
{
|
|
34
34
|
"path": "controllerai-workflows/SKILL.md",
|
|
35
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
35
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-workflows/SKILL.md",
|
|
36
36
|
"sha256": "a2419265809b6f822ed22be4cfbfc1c56107e7afffffc41a0f527fd93018dc8a",
|
|
37
37
|
"size": 9472
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"path": "controllerai-workflows/agents/openai.yaml",
|
|
41
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
41
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-workflows/agents/openai.yaml",
|
|
42
42
|
"sha256": "6fb00a93a5f83fc2664679eb633ab07b477105472f8790fcf6dbcca913921a84",
|
|
43
43
|
"size": 251
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"path": "controllerai-workflows/references/command-map.md",
|
|
47
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
48
|
-
"sha256": "
|
|
49
|
-
"size":
|
|
47
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-workflows/references/command-map.md",
|
|
48
|
+
"sha256": "39b2a270a23ef9c41189971235c36bd55f5d73986fd914306b2b21f3939535a4",
|
|
49
|
+
"size": 2103
|
|
50
50
|
}
|
|
51
51
|
]
|
|
52
52
|
},
|
|
@@ -55,19 +55,19 @@
|
|
|
55
55
|
"files": [
|
|
56
56
|
{
|
|
57
57
|
"path": "controllerai-node-config/SKILL.md",
|
|
58
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
59
|
-
"sha256": "
|
|
60
|
-
"size":
|
|
58
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-node-config/SKILL.md",
|
|
59
|
+
"sha256": "0b98f226c7ba5bde4bb1d30a819ced4e72599cbd39951fcdc7eb61a8067eaaf4",
|
|
60
|
+
"size": 11861
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"path": "controllerai-node-config/agents/openai.yaml",
|
|
64
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
64
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-node-config/agents/openai.yaml",
|
|
65
65
|
"sha256": "7fbd6f0c1f9ea40c41051d532736a4718895cfa397608a2c716300bcf4256df1",
|
|
66
66
|
"size": 242
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
"path": "controllerai-node-config/references/prop-and-readiness.md",
|
|
70
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
70
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-node-config/references/prop-and-readiness.md",
|
|
71
71
|
"sha256": "6a1aa046bac6c5f1a68cbe242bdeb584f9a01e2de7248742460064a4d2708f75",
|
|
72
72
|
"size": 5583
|
|
73
73
|
}
|
|
@@ -78,19 +78,19 @@
|
|
|
78
78
|
"files": [
|
|
79
79
|
{
|
|
80
80
|
"path": "controllerai-expressions/SKILL.md",
|
|
81
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
81
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-expressions/SKILL.md",
|
|
82
82
|
"sha256": "01240f493ec5bbd1ed562f988d243e3797577eee5ccc9d207f8bc45485b99108",
|
|
83
83
|
"size": 10310
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
"path": "controllerai-expressions/agents/openai.yaml",
|
|
87
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
87
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-expressions/agents/openai.yaml",
|
|
88
88
|
"sha256": "280d1f4d0a44cb5cfd3e5649e0a123b91b57b1484dcbc3a02ace988233234bc3",
|
|
89
89
|
"size": 249
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
"path": "controllerai-expressions/references/dsl-and-recipes.md",
|
|
93
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
93
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-expressions/references/dsl-and-recipes.md",
|
|
94
94
|
"sha256": "efe4a5eba0ea7636387443af0a6cc082a41209404b92c3af5c8a029075db70f6",
|
|
95
95
|
"size": 5197
|
|
96
96
|
}
|
|
@@ -101,19 +101,19 @@
|
|
|
101
101
|
"files": [
|
|
102
102
|
{
|
|
103
103
|
"path": "controllerai-flow-control/SKILL.md",
|
|
104
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
104
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-flow-control/SKILL.md",
|
|
105
105
|
"sha256": "c535a1ff61cc65cca53af083081935dc8672f7ce5d048dbb29334808428feec3",
|
|
106
106
|
"size": 11563
|
|
107
107
|
},
|
|
108
108
|
{
|
|
109
109
|
"path": "controllerai-flow-control/agents/openai.yaml",
|
|
110
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
110
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-flow-control/agents/openai.yaml",
|
|
111
111
|
"sha256": "164adf3b887bf9f67bba9cd210b5b49935c29ea0f52f76325fe5df517d279592",
|
|
112
112
|
"size": 229
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"path": "controllerai-flow-control/references/patterns.md",
|
|
116
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
116
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-flow-control/references/patterns.md",
|
|
117
117
|
"sha256": "f1a718de837dc541e58914f40b4a89e6e81ba80afac37731e381db73a4712d90",
|
|
118
118
|
"size": 4901
|
|
119
119
|
}
|
|
@@ -124,19 +124,19 @@
|
|
|
124
124
|
"files": [
|
|
125
125
|
{
|
|
126
126
|
"path": "controllerai-runs/SKILL.md",
|
|
127
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
127
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-runs/SKILL.md",
|
|
128
128
|
"sha256": "5eeda1f95f8c18c12b968d6c2ea9008c2dd99d8953268c4ffd06652f43a91516",
|
|
129
129
|
"size": 9196
|
|
130
130
|
},
|
|
131
131
|
{
|
|
132
132
|
"path": "controllerai-runs/agents/openai.yaml",
|
|
133
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
133
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-runs/agents/openai.yaml",
|
|
134
134
|
"sha256": "63180f12974e19ce7b714695944608760e4132bfb88947543e52616098a88f5c",
|
|
135
135
|
"size": 234
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
"path": "controllerai-runs/references/debugging.md",
|
|
139
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
139
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-runs/references/debugging.md",
|
|
140
140
|
"sha256": "341f9e056445bdffdcc67771fd62b28fb2125a661d5d8a5c4fb16bcac57417c0",
|
|
141
141
|
"size": 3127
|
|
142
142
|
}
|
|
@@ -147,19 +147,19 @@
|
|
|
147
147
|
"files": [
|
|
148
148
|
{
|
|
149
149
|
"path": "controllerai-triggers/SKILL.md",
|
|
150
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
150
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-triggers/SKILL.md",
|
|
151
151
|
"sha256": "c8a88bb69a0e032f1fd2716e1a2cd0690e62ae0b9bb996bf30643d4bd3b8fab2",
|
|
152
152
|
"size": 11800
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
155
|
"path": "controllerai-triggers/agents/openai.yaml",
|
|
156
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
156
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-triggers/agents/openai.yaml",
|
|
157
157
|
"sha256": "56aa1bd33e54045d88002ade0c420be7bca37ac39433e6eedccef2e22bbd9515",
|
|
158
158
|
"size": 239
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
"path": "controllerai-triggers/references/lifecycle.md",
|
|
162
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
162
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-triggers/references/lifecycle.md",
|
|
163
163
|
"sha256": "4dce6484b6abaa0eaf4ddbe366e60480180fc5b5aeb7e3c975bbe316b88dc0e5",
|
|
164
164
|
"size": 3340
|
|
165
165
|
}
|
|
@@ -170,19 +170,19 @@
|
|
|
170
170
|
"files": [
|
|
171
171
|
{
|
|
172
172
|
"path": "controllerai-data/SKILL.md",
|
|
173
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
173
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-data/SKILL.md",
|
|
174
174
|
"sha256": "1418b287af30968634c69dbdbd54d22354f5f79f52389e6d1c94a87421c20e78",
|
|
175
175
|
"size": 12059
|
|
176
176
|
},
|
|
177
177
|
{
|
|
178
178
|
"path": "controllerai-data/agents/openai.yaml",
|
|
179
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
179
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-data/agents/openai.yaml",
|
|
180
180
|
"sha256": "5c54b0a714086088213c679fb904a69a599374847f9aa1d6c0756172c2a2f227",
|
|
181
181
|
"size": 219
|
|
182
182
|
},
|
|
183
183
|
{
|
|
184
184
|
"path": "controllerai-data/references/data-rails.md",
|
|
185
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
185
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-data/references/data-rails.md",
|
|
186
186
|
"sha256": "0c03f25a099d168b8ae1fe54087ce59d06fcfc8631046927a996a88f0c4f9835",
|
|
187
187
|
"size": 2819
|
|
188
188
|
}
|
|
@@ -193,19 +193,19 @@
|
|
|
193
193
|
"files": [
|
|
194
194
|
{
|
|
195
195
|
"path": "controllerai-ai-nodes/SKILL.md",
|
|
196
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
196
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-ai-nodes/SKILL.md",
|
|
197
197
|
"sha256": "4e4bdf53e300adedf5e03f282687d0d20e200baf056cd59bf8df98d7b8b21403",
|
|
198
198
|
"size": 8940
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
201
|
"path": "controllerai-ai-nodes/agents/openai.yaml",
|
|
202
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
202
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-ai-nodes/agents/openai.yaml",
|
|
203
203
|
"sha256": "3ba8b8bb6f0cd4b0d5675ebda0af10bb79dc7a42e394eb98479343c83da92599",
|
|
204
204
|
"size": 256
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"path": "controllerai-ai-nodes/references/selection-and-testing.md",
|
|
208
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
208
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-ai-nodes/references/selection-and-testing.md",
|
|
209
209
|
"sha256": "66b235b9e81645ab877b31443505c7b07ea3f2e5a357053f266c121415f8cf5c",
|
|
210
210
|
"size": 3111
|
|
211
211
|
}
|
|
@@ -216,13 +216,13 @@
|
|
|
216
216
|
"files": [
|
|
217
217
|
{
|
|
218
218
|
"path": "controllerai-integration-actions/SKILL.md",
|
|
219
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
220
|
-
"sha256": "
|
|
221
|
-
"size":
|
|
219
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-integration-actions/SKILL.md",
|
|
220
|
+
"sha256": "c759259543bb82da9ec544ae6ea762f50cd658c3009b19cf84582878ac8e1294",
|
|
221
|
+
"size": 10452
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"path": "controllerai-integration-actions/agents/openai.yaml",
|
|
225
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
225
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-integration-actions/agents/openai.yaml",
|
|
226
226
|
"sha256": "82ee62aa48a644e658c9bb6a78c417dc15eb4f3ec9f4abc9081b6d24d16fe92d",
|
|
227
227
|
"size": 262
|
|
228
228
|
}
|
|
@@ -233,40 +233,23 @@
|
|
|
233
233
|
"files": [
|
|
234
234
|
{
|
|
235
235
|
"path": "controllerai-agents/SKILL.md",
|
|
236
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
236
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-agents/SKILL.md",
|
|
237
237
|
"sha256": "6a666beace10fa2511d02163df365b3e02ed627fec8c65255bcc834142a6fa35",
|
|
238
238
|
"size": 12254
|
|
239
239
|
},
|
|
240
240
|
{
|
|
241
241
|
"path": "controllerai-agents/agents/openai.yaml",
|
|
242
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
242
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-agents/agents/openai.yaml",
|
|
243
243
|
"sha256": "f4684ec904f3ebb051bb48460375756899c3316fbb16304aad5fff3d89692b09",
|
|
244
244
|
"size": 293
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
247
|
"path": "controllerai-agents/references/instructions-and-versioning.md",
|
|
248
|
-
"url": "https://getcontroller.ai/skills/2026.
|
|
248
|
+
"url": "https://getcontroller.ai/skills/2026.10.15.1/controllerai-agents/references/instructions-and-versioning.md",
|
|
249
249
|
"sha256": "88b059e74aef03ccb12a53815d1090e5449090ff6dfd863b6cef5a12b434cb65",
|
|
250
250
|
"size": 5644
|
|
251
251
|
}
|
|
252
252
|
]
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
"name": "controllerai-template-setup",
|
|
256
|
-
"files": [
|
|
257
|
-
{
|
|
258
|
-
"path": "controllerai-template-setup/SKILL.md",
|
|
259
|
-
"url": "https://getcontroller.ai/skills/2026.09.19.1/controllerai-template-setup/SKILL.md",
|
|
260
|
-
"sha256": "6ed665a2b33f8197fb990a30c296a69ab1d0e334bd10998e851508fa99d2d603",
|
|
261
|
-
"size": 9316
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
"path": "controllerai-template-setup/agents/openai.yaml",
|
|
265
|
-
"url": "https://getcontroller.ai/skills/2026.09.19.1/controllerai-template-setup/agents/openai.yaml",
|
|
266
|
-
"sha256": "0abb1b4691e3163eb6c2f27404ce3512aabf86d048f0eedbac587415004146e3",
|
|
267
|
-
"size": 275
|
|
268
|
-
}
|
|
269
|
-
]
|
|
270
253
|
}
|
|
271
254
|
],
|
|
272
255
|
"surfaces": {
|
|
@@ -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
|
|
|
@@ -31,7 +31,7 @@ Building the agent itself belongs to `controllerai-agents`; a workflow node for
|
|
|
31
31
|
## Rules
|
|
32
32
|
|
|
33
33
|
1. **Capture and reuse the exact identities**: integration slug, action key, connection ID when required, tool ID. Narrow the query or raise the result limit when more matches exist; never derive an identifier from a label.
|
|
34
|
-
2. **A required missing connection is a handoff, not a substitution.** Keep the
|
|
34
|
+
2. **A required missing connection is a handoff, not a substitution.** Keep the chosen integration and action, give the platform authorization route, stop there, and never request provider credentials in chat. Never swap in `registry_http-http-request`, which is never agent-attachable; a raw endpoint the user mentions is context, not an instruction to hand-roll the call.
|
|
35
35
|
3. **Decide the approval policy before attaching.** For an action that sends, posts, spends or deletes, choose `true` or explicitly tell the user it will run unattended; prefer confirmation for permission changes, irreversible writes or an ambiguous destination, and omit it for reads and low-risk reversible operations the user asked to run autonomously. Mention the confirmation choice in the report to the user.
|
|
36
36
|
4. **Attach once.** Read the tool list before and after; the final list holds one intended direct attachment.
|
|
37
37
|
5. **A stored active connection is not proof of authorization.** For an action that needs one, only a representative action test proves the provider still accepts it.
|
|
@@ -52,7 +52,7 @@ Building the agent itself belongs to `controllerai-agents`; a workflow node for
|
|
|
52
52
|
|
|
53
53
|
- `connection_list` — `integration`
|
|
54
54
|
|
|
55
|
-
Skip this step when the catalog says the native action needs no connection.
|
|
55
|
+
Skip this step when the catalog says the native action needs no connection. Offer a `shared: true` row (a teammate's account) only when the user has none; use it after a yes.
|
|
56
56
|
|
|
57
57
|
Use the active connection whose `integration` matches exactly. If none exists, `connection_connect_url` (it takes the `nodeSlug`) returns a `url`: show it as a markdown link, ask the user to finish, then `connection_list` with `integration` and use the new ID.
|
|
58
58
|
|
|
@@ -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
|
|
|
@@ -48,7 +48,7 @@ Narrow a broad result with `integration_search`, then `integration_action_list`.
|
|
|
48
48
|
|
|
49
49
|
- `connection_list` — `integration`
|
|
50
50
|
|
|
51
|
-
One active connection: use its ID. Several: follow the user's stated preference, otherwise ask which account. None: add the node without a connection and hand off.
|
|
51
|
+
A row with `shared: true` is a teammate's account shared with the organization, which the user may use. One active connection of the user's own: use its ID. Several: follow the user's stated preference, otherwise ask which account. None of their own but a shared one: name it and ask whether to use it or connect their own; bind it only after a yes. None at all: add the node without a connection and hand off.
|
|
52
52
|
|
|
53
53
|
Call `connection_connect_url` with the `nodeSlug`, show the returned `url` as a markdown link, ask the user to finish, then `connection_list` for that integration and bind the new ID. A URL is a handoff, not a completed authorization.
|
|
54
54
|
|
|
@@ -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.
|