factoryhub 0.1.0 → 0.1.1
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/README.md +9 -3
- package/factories/index.json +231 -0
- package/factories/newsletter-note/README.md +11 -0
- package/factories/newsletter-note/agents/reviewer/agent.md +10 -0
- package/factories/newsletter-note/agents/writer/agent.md +11 -0
- package/factories/newsletter-note/factory.yaml +12 -0
- package/factories/newsletter-note/flow.yaml +45 -0
- package/factories/newsletter-note/mindburn.tests.yaml +80 -0
- package/factories/release-desk/README.md +13 -0
- package/factories/release-desk/agents/editor/agent.md +10 -0
- package/factories/release-desk/agents/reviewer/agent.md +10 -0
- package/factories/release-desk/factory.yaml +13 -0
- package/factories/release-desk/flow.yaml +67 -0
- package/factories/release-desk/mindburn.tests.yaml +163 -0
- package/factories/short-video-cut/README.md +11 -0
- package/factories/short-video-cut/agents/reviewer/agent.md +10 -0
- package/factories/short-video-cut/agents/writer/agent.md +11 -0
- package/factories/short-video-cut/factory.yaml +13 -0
- package/factories/short-video-cut/flow.yaml +46 -0
- package/factories/short-video-cut/mindburn.tests.yaml +80 -0
- package/factories/video-facts/README.md +11 -0
- package/factories/video-facts/agents/analyst/agent.md +10 -0
- package/factories/video-facts/agents/reviewer/agent.md +10 -0
- package/factories/video-facts/factory.yaml +13 -0
- package/factories/video-facts/flow.yaml +39 -0
- package/factories/video-facts/mindburn.tests.yaml +34 -0
- package/factories/video-to-posts/README.md +35 -0
- package/factories/video-to-posts/agents/analyst/agent.md +10 -0
- package/factories/video-to-posts/agents/reviewer/agent.md +10 -0
- package/factories/video-to-posts/agents/writer/agent.md +11 -0
- package/factories/video-to-posts/factory.yaml +12 -0
- package/factories/video-to-posts/flow.yaml +62 -0
- package/factories/video-to-posts/mindburn.tests.yaml +34 -0
- package/factories/week-of-posts/README.md +11 -0
- package/factories/week-of-posts/agents/reviewer/agent.md +10 -0
- package/factories/week-of-posts/agents/writer/agent.md +11 -0
- package/factories/week-of-posts/factory.yaml +12 -0
- package/factories/week-of-posts/flow.yaml +46 -0
- package/factories/week-of-posts/mindburn.tests.yaml +80 -0
- package/package.json +15 -2
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/commands/export.mjs +0 -1
- package/packages/cli/src/commands/get.mjs +0 -1
- package/packages/cli/src/commands/inspect.mjs +0 -1
- package/packages/cli/src/commands/list.mjs +1 -6
- package/packages/cli/src/commands/login.mjs +161 -0
- package/packages/cli/src/commands/logout.mjs +43 -0
- package/packages/cli/src/commands/mcp.mjs +0 -1
- package/packages/cli/src/commands/new.mjs +0 -1
- package/packages/cli/src/commands/pack.mjs +0 -1
- package/packages/cli/src/commands/publish.mjs +62 -0
- package/packages/cli/src/commands/pull.mjs +59 -0
- package/packages/cli/src/commands/push.mjs +115 -0
- package/packages/cli/src/commands/resume.mjs +0 -1
- package/packages/cli/src/commands/run.mjs +182 -20
- package/packages/cli/src/commands/runs.mjs +52 -0
- package/packages/cli/src/commands/search.mjs +0 -1
- package/packages/cli/src/commands/validate.mjs +1 -3
- package/packages/cli/src/commands/whoami.mjs +34 -0
- package/packages/cli/src/hosted.mjs +159 -0
- package/packages/cli/src/main.mjs +80 -14
- package/packages/cli/src/tool-sources.mjs +272 -0
- package/packages/cli/src/util.mjs +37 -0
- package/packages/engine/lib/credentials.mjs +121 -0
- package/packages/engine/lib/hosted.mjs +119 -0
- package/packages/engine/lib/hub.mjs +376 -24
- package/packages/engine/lib/nango.mjs +157 -0
- package/packages/engine/lib/node.mjs +161 -33
- package/packages/engine/lib/providers.mjs +8 -3
- package/packages/engine/lib/run.mjs +70 -9
- package/packages/engine/lib/text.mjs +5 -0
- package/packages/engine/package.json +8 -2
- package/packages/engine/src/factory-engine.mjs +415 -68
- package/packages/engine/src/flow-sources.mjs +135 -0
- package/packages/engine/src/mcp-client.mjs +429 -0
- package/packages/engine/src/run.mjs +81 -5
- package/packages/engine/src/tool-sources.mjs +566 -0
- package/packages/mcp/package.json +1 -1
- package/packages/mcp/src/server.mjs +47 -17
- package/packages/sdk/package.json +28 -0
- package/packages/sdk/src/index.d.ts +163 -0
- package/packages/sdk/src/index.mjs +266 -0
- package/spec/README.md +7 -1
- package/spec/factory-format.md +264 -19
- package/spec/schema/factory.yaml.json +815 -0
- package/spec/schema/flow.schema.json +24 -2
- package/spec/skill-export.md +3 -0
|
@@ -0,0 +1,815 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://factory.mindburn.org/schemas/factory.yaml.json",
|
|
4
|
+
"title": "factory.yaml",
|
|
5
|
+
"description": "A whole factory in one file. Each section is one file of the factory bundle; factoryhub turns it back into the bundle, byte for byte.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"format"
|
|
10
|
+
],
|
|
11
|
+
"patternProperties": {
|
|
12
|
+
"^x-": {
|
|
13
|
+
"description": "A note of yours: kept in your text as you wrote it, never a file of the bundle."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"properties": {
|
|
17
|
+
"format": {
|
|
18
|
+
"const": "mindburn.factory.yaml/v1",
|
|
19
|
+
"description": "The layout of this file. Required."
|
|
20
|
+
},
|
|
21
|
+
"factory": {
|
|
22
|
+
"description": "factory.yaml of the bundle: the name, what the factory produces and when to use it, and the default model.",
|
|
23
|
+
"anyOf": [
|
|
24
|
+
{
|
|
25
|
+
"$ref": "#/definitions/factoryFile"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "The exact text of factory.yaml, as one JSON string. The writer uses this only for a file a YAML block cannot carry byte for byte."
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"flow": {
|
|
34
|
+
"description": "flow.yaml of the bundle: title, licence, tags, inputs, steps (work, checks, approvals, deliver) and outputs.",
|
|
35
|
+
"anyOf": [
|
|
36
|
+
{
|
|
37
|
+
"$ref": "#/definitions/flowFile"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "The exact text of flow.yaml, as one JSON string. The writer uses this only for a file a YAML block cannot carry byte for byte."
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"agents": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"description": "One entry per agent (agents/<name>/agent.md): its settings, and its standing instructions under instructions: |.",
|
|
48
|
+
"propertyNames": {
|
|
49
|
+
"pattern": "^[a-z0-9][a-z0-9_-]{0,40}$"
|
|
50
|
+
},
|
|
51
|
+
"additionalProperties": {
|
|
52
|
+
"anyOf": [
|
|
53
|
+
{
|
|
54
|
+
"$ref": "#/definitions/agent"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "The exact text of agent.md, as one JSON string."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "null",
|
|
62
|
+
"description": "Only for foreman: the bundle has no coordinator file."
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"tests": {
|
|
68
|
+
"description": "mindburn.tests.yaml: the author's examples. Each runs the factory on its inputs and checks the result.",
|
|
69
|
+
"anyOf": [
|
|
70
|
+
{
|
|
71
|
+
"$ref": "#/definitions/testsFile"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"type": "string",
|
|
75
|
+
"description": "The exact text of mindburn.tests.yaml, as one JSON string. The writer uses this only for a file a YAML block cannot carry byte for byte."
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"requirements": {
|
|
80
|
+
"description": "mindburn.requirements.yaml: the recommended and minimum model, and an expected cost the author declares.",
|
|
81
|
+
"anyOf": [
|
|
82
|
+
{
|
|
83
|
+
"$ref": "#/definitions/requirementsFile"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "The exact text of mindburn.requirements.yaml, as one JSON string. The writer uses this only for a file a YAML block cannot carry byte for byte."
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"package": {
|
|
92
|
+
"description": "mindburn.package.yaml, kept as written.",
|
|
93
|
+
"anyOf": [
|
|
94
|
+
{
|
|
95
|
+
"type": "object"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"type": "string",
|
|
99
|
+
"description": "The exact text of mindburn.package.yaml, as one JSON string. The writer uses this only for a file a YAML block cannot carry byte for byte."
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"samples": {
|
|
104
|
+
"type": "object",
|
|
105
|
+
"description": "Sample files under examples/, by their path there.",
|
|
106
|
+
"additionalProperties": {
|
|
107
|
+
"anyOf": [
|
|
108
|
+
{
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "The file's text: a | block (|- when it has no final line break), or one JSON string."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"type": "object",
|
|
114
|
+
"additionalProperties": false,
|
|
115
|
+
"required": [
|
|
116
|
+
"sha256",
|
|
117
|
+
"bytes"
|
|
118
|
+
],
|
|
119
|
+
"description": "Keeps this file exactly as it is in the version you started from: a file over 32768 bytes is written this way. Replace it with a | block to change it.",
|
|
120
|
+
"properties": {
|
|
121
|
+
"sha256": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"description": "SHA-256 of the file in the version you started from.",
|
|
124
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
125
|
+
},
|
|
126
|
+
"bytes": {
|
|
127
|
+
"type": "integer",
|
|
128
|
+
"minimum": 0,
|
|
129
|
+
"description": "Its length in UTF-8 bytes."
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"files": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"description": "Every other file of the bundle by its path: README.md, LICENSE, CHANGELOG.md, skills, prompts, schemas… Files over 32768 bytes may be references.",
|
|
139
|
+
"additionalProperties": {
|
|
140
|
+
"anyOf": [
|
|
141
|
+
{
|
|
142
|
+
"type": "string",
|
|
143
|
+
"description": "The file's text: a | block (|- when it has no final line break), or one JSON string."
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"type": "object",
|
|
147
|
+
"additionalProperties": false,
|
|
148
|
+
"required": [
|
|
149
|
+
"sha256",
|
|
150
|
+
"bytes"
|
|
151
|
+
],
|
|
152
|
+
"description": "Keeps this file exactly as it is in the version you started from: a file over 32768 bytes is written this way. Replace it with a | block to change it.",
|
|
153
|
+
"properties": {
|
|
154
|
+
"sha256": {
|
|
155
|
+
"type": "string",
|
|
156
|
+
"description": "SHA-256 of the file in the version you started from.",
|
|
157
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
158
|
+
},
|
|
159
|
+
"bytes": {
|
|
160
|
+
"type": "integer",
|
|
161
|
+
"minimum": 0,
|
|
162
|
+
"description": "Its length in UTF-8 bytes."
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"definitions": {
|
|
171
|
+
"factoryFile": {
|
|
172
|
+
"type": "object",
|
|
173
|
+
"required": [
|
|
174
|
+
"schemaVersion",
|
|
175
|
+
"name",
|
|
176
|
+
"description"
|
|
177
|
+
],
|
|
178
|
+
"properties": {
|
|
179
|
+
"schemaVersion": {
|
|
180
|
+
"const": "v1alpha1",
|
|
181
|
+
"description": "The version of factory.yaml."
|
|
182
|
+
},
|
|
183
|
+
"name": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"description": "The factory's name: lowercase letters, digits and hyphens.",
|
|
186
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
|
|
187
|
+
"maxLength": 64
|
|
188
|
+
},
|
|
189
|
+
"description": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"description": "What the factory produces and when to use it. Shown on its card and given to every agent."
|
|
192
|
+
},
|
|
193
|
+
"repositories": {
|
|
194
|
+
"type": "array",
|
|
195
|
+
"description": "Repositories a harness would check out. This runner reads none."
|
|
196
|
+
},
|
|
197
|
+
"agentDefaults": {
|
|
198
|
+
"type": "object",
|
|
199
|
+
"description": "Defaults for every agent.",
|
|
200
|
+
"properties": {
|
|
201
|
+
"harness": {
|
|
202
|
+
"type": "object",
|
|
203
|
+
"properties": {
|
|
204
|
+
"type": {
|
|
205
|
+
"type": "string",
|
|
206
|
+
"description": "The harness, such as claude."
|
|
207
|
+
},
|
|
208
|
+
"model": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"description": "The default model, such as claude-haiku-5-5."
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"model": {
|
|
215
|
+
"type": "string",
|
|
216
|
+
"description": "The default model."
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
"flowFile": {
|
|
223
|
+
"type": "object",
|
|
224
|
+
"required": [
|
|
225
|
+
"steps"
|
|
226
|
+
],
|
|
227
|
+
"description": "flow.yaml. A field not listed here is kept exactly as written; this runner reads only the fields it knows.",
|
|
228
|
+
"properties": {
|
|
229
|
+
"flow": {
|
|
230
|
+
"const": "mindburn.flow/v1",
|
|
231
|
+
"description": "The flow format this runner reads."
|
|
232
|
+
},
|
|
233
|
+
"title": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"description": "The title people see.",
|
|
236
|
+
"maxLength": 200
|
|
237
|
+
},
|
|
238
|
+
"author": {
|
|
239
|
+
"type": "string",
|
|
240
|
+
"description": "Who wrote it."
|
|
241
|
+
},
|
|
242
|
+
"version": {
|
|
243
|
+
"type": [
|
|
244
|
+
"string",
|
|
245
|
+
"number"
|
|
246
|
+
],
|
|
247
|
+
"description": "The author's version, such as \"1.2.0\". Quote it so YAML keeps it as text."
|
|
248
|
+
},
|
|
249
|
+
"license": {
|
|
250
|
+
"type": "string",
|
|
251
|
+
"description": "Under which licence others may use it: an SPDX identifier such as MIT or Apache-2.0.",
|
|
252
|
+
"examples": [
|
|
253
|
+
"MIT",
|
|
254
|
+
"Apache-2.0",
|
|
255
|
+
"CC-BY-4.0"
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
"tags": {
|
|
259
|
+
"anyOf": [
|
|
260
|
+
{
|
|
261
|
+
"type": "array",
|
|
262
|
+
"items": {
|
|
263
|
+
"type": "string"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"type": "string"
|
|
268
|
+
}
|
|
269
|
+
],
|
|
270
|
+
"description": "Words people find it by."
|
|
271
|
+
},
|
|
272
|
+
"time": {
|
|
273
|
+
"type": "string",
|
|
274
|
+
"description": "How long a run takes, in words, such as \"about 1 minute\"."
|
|
275
|
+
},
|
|
276
|
+
"requires": {
|
|
277
|
+
"type": "array",
|
|
278
|
+
"items": {
|
|
279
|
+
"anyOf": [
|
|
280
|
+
{
|
|
281
|
+
"const": "scoped-context",
|
|
282
|
+
"description": "Steps share only the inputs and results their context names."
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"const": "multiple-outputs",
|
|
286
|
+
"description": "The flow delivers several documents, listed under outputs."
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"const": "blocking-checks",
|
|
290
|
+
"description": "A check may say on_fail: stop and hold refused work until the owner releases it."
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"const": "tool-sources",
|
|
294
|
+
"description": "Steps may use tools of the sources this flow declares (RFC 0017, proposed). A runner without it refuses the flow."
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"type": "string",
|
|
298
|
+
"description": "A feature another runner defines."
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
"description": "Execution features this flow needs. A runner without one refuses the flow. This runner has scoped-context, multiple-outputs."
|
|
303
|
+
},
|
|
304
|
+
"sources": {
|
|
305
|
+
"type": "object",
|
|
306
|
+
"description": "RFC 0017 (proposed): the services this flow uses tools from, by source key, at most 8. They mean something only with requires: [tool-sources]; otherwise they are kept and have no effect. Plain data: no command, header, environment variable or credential.",
|
|
307
|
+
"propertyNames": {
|
|
308
|
+
"pattern": "^[a-z0-9][a-z0-9_-]{0,40}$"
|
|
309
|
+
},
|
|
310
|
+
"maxProperties": 8
|
|
311
|
+
},
|
|
312
|
+
"inputs": {
|
|
313
|
+
"type": "object",
|
|
314
|
+
"description": "What a person gives the factory, at most 8. The key is the input's name.",
|
|
315
|
+
"maxProperties": 8,
|
|
316
|
+
"additionalProperties": {
|
|
317
|
+
"$ref": "#/definitions/input"
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"steps": {
|
|
321
|
+
"type": "object",
|
|
322
|
+
"description": "The steps, at most 24, in order. The key is the step's name.",
|
|
323
|
+
"minProperties": 1,
|
|
324
|
+
"maxProperties": 24,
|
|
325
|
+
"additionalProperties": {
|
|
326
|
+
"$ref": "#/definitions/step"
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
"done": {
|
|
330
|
+
"type": "array",
|
|
331
|
+
"items": {
|
|
332
|
+
"type": [
|
|
333
|
+
"string",
|
|
334
|
+
"object"
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
"description": "What a finished result must be: checks call them criteria."
|
|
338
|
+
},
|
|
339
|
+
"outputs": {
|
|
340
|
+
"type": "array",
|
|
341
|
+
"minItems": 1,
|
|
342
|
+
"maxItems": 24,
|
|
343
|
+
"description": "The documents to deliver, each from a work or deliver step, in order.",
|
|
344
|
+
"items": {
|
|
345
|
+
"type": "object",
|
|
346
|
+
"additionalProperties": false,
|
|
347
|
+
"required": [
|
|
348
|
+
"step",
|
|
349
|
+
"title"
|
|
350
|
+
],
|
|
351
|
+
"properties": {
|
|
352
|
+
"step": {
|
|
353
|
+
"type": "string",
|
|
354
|
+
"description": "The step whose result this is."
|
|
355
|
+
},
|
|
356
|
+
"title": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"description": "The document's title.",
|
|
359
|
+
"maxLength": 200
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"composition": {
|
|
365
|
+
"type": "object",
|
|
366
|
+
"description": "Written by factoryhub when it composed this flow from others: the compiler, the intent and the source hashes. Keep it as it is."
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"if": {
|
|
370
|
+
"required": [
|
|
371
|
+
"requires"
|
|
372
|
+
],
|
|
373
|
+
"properties": {
|
|
374
|
+
"requires": {
|
|
375
|
+
"type": "array",
|
|
376
|
+
"contains": {
|
|
377
|
+
"const": "tool-sources"
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"then": {
|
|
383
|
+
"properties": {
|
|
384
|
+
"sources": {
|
|
385
|
+
"type": "object",
|
|
386
|
+
"propertyNames": {
|
|
387
|
+
"pattern": "^[a-z0-9][a-z0-9_-]{0,40}$"
|
|
388
|
+
},
|
|
389
|
+
"maxProperties": 8,
|
|
390
|
+
"additionalProperties": {
|
|
391
|
+
"$ref": "#/definitions/source"
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
"source": {
|
|
398
|
+
"type": "object",
|
|
399
|
+
"additionalProperties": false,
|
|
400
|
+
"required": [
|
|
401
|
+
"title",
|
|
402
|
+
"mcp",
|
|
403
|
+
"tools"
|
|
404
|
+
],
|
|
405
|
+
"description": "A service that offers tools. Its tools are named in a step's tools as <source>/<tool>.",
|
|
406
|
+
"properties": {
|
|
407
|
+
"title": {
|
|
408
|
+
"type": "string",
|
|
409
|
+
"description": "The name a person sees when they connect it.",
|
|
410
|
+
"minLength": 1,
|
|
411
|
+
"maxLength": 100
|
|
412
|
+
},
|
|
413
|
+
"mcp": {
|
|
414
|
+
"type": "object",
|
|
415
|
+
"additionalProperties": false,
|
|
416
|
+
"minProperties": 1,
|
|
417
|
+
"description": "How to reach it over MCP: an address, a registry name, or both.",
|
|
418
|
+
"properties": {
|
|
419
|
+
"url": {
|
|
420
|
+
"type": "string",
|
|
421
|
+
"description": "The server's Streamable HTTP address: https, a host name, no user name, query or fragment.",
|
|
422
|
+
"format": "uri",
|
|
423
|
+
"pattern": "^https://"
|
|
424
|
+
},
|
|
425
|
+
"registry": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"description": "Its name in the official MCP Registry, such as com.example/tracker."
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
"target": {
|
|
432
|
+
"type": "object",
|
|
433
|
+
"additionalProperties": false,
|
|
434
|
+
"required": [
|
|
435
|
+
"label"
|
|
436
|
+
],
|
|
437
|
+
"description": "What a grant to this source is limited to.",
|
|
438
|
+
"properties": {
|
|
439
|
+
"label": {
|
|
440
|
+
"type": "string",
|
|
441
|
+
"description": "What a person chooses, such as Project.",
|
|
442
|
+
"minLength": 1,
|
|
443
|
+
"maxLength": 40
|
|
444
|
+
},
|
|
445
|
+
"help": {
|
|
446
|
+
"type": "string",
|
|
447
|
+
"description": "How to choose it.",
|
|
448
|
+
"maxLength": 200
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
"tools": {
|
|
453
|
+
"type": "object",
|
|
454
|
+
"minProperties": 1,
|
|
455
|
+
"maxProperties": 24,
|
|
456
|
+
"propertyNames": {
|
|
457
|
+
"pattern": "^[A-Za-z0-9_.-]{1,128}$"
|
|
458
|
+
},
|
|
459
|
+
"additionalProperties": {
|
|
460
|
+
"$ref": "#/definitions/sourceTool"
|
|
461
|
+
},
|
|
462
|
+
"description": "The tools this flow may use, by the name the source gives them."
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
},
|
|
466
|
+
"sourceTool": {
|
|
467
|
+
"type": "object",
|
|
468
|
+
"additionalProperties": false,
|
|
469
|
+
"required": [
|
|
470
|
+
"effect"
|
|
471
|
+
],
|
|
472
|
+
"properties": {
|
|
473
|
+
"effect": {
|
|
474
|
+
"enum": [
|
|
475
|
+
"read",
|
|
476
|
+
"write",
|
|
477
|
+
"external",
|
|
478
|
+
"irreversible"
|
|
479
|
+
],
|
|
480
|
+
"description": "read changes nothing; write changes something inside the granted system; external sends data out of it; irreversible cannot be undone. Changes wait for a person to approve the exact payload."
|
|
481
|
+
},
|
|
482
|
+
"title": {
|
|
483
|
+
"type": "string",
|
|
484
|
+
"description": "Plain words for the consent.",
|
|
485
|
+
"maxLength": 100
|
|
486
|
+
},
|
|
487
|
+
"target": {
|
|
488
|
+
"type": "string",
|
|
489
|
+
"description": "The argument that carries the target. Only when the source declares target."
|
|
490
|
+
},
|
|
491
|
+
"idempotency": {
|
|
492
|
+
"type": "string",
|
|
493
|
+
"description": "The argument that carries an idempotency key. Only for a change."
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
"input": {
|
|
498
|
+
"anyOf": [
|
|
499
|
+
{
|
|
500
|
+
"type": "string",
|
|
501
|
+
"description": "What the person should enter."
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
"type": "object",
|
|
505
|
+
"additionalProperties": false,
|
|
506
|
+
"properties": {
|
|
507
|
+
"type": {
|
|
508
|
+
"enum": [
|
|
509
|
+
"text",
|
|
510
|
+
"longtext",
|
|
511
|
+
"url"
|
|
512
|
+
],
|
|
513
|
+
"description": "text (one line), longtext (pasted text) or url."
|
|
514
|
+
},
|
|
515
|
+
"label": {
|
|
516
|
+
"type": "string",
|
|
517
|
+
"description": "The label shown on the form."
|
|
518
|
+
},
|
|
519
|
+
"help": {
|
|
520
|
+
"type": "string",
|
|
521
|
+
"description": "What to enter, with an example."
|
|
522
|
+
},
|
|
523
|
+
"optional": {
|
|
524
|
+
"type": "boolean",
|
|
525
|
+
"description": "true: the person may leave it empty."
|
|
526
|
+
},
|
|
527
|
+
"required": {
|
|
528
|
+
"type": "boolean",
|
|
529
|
+
"description": "false: the same as optional: true."
|
|
530
|
+
},
|
|
531
|
+
"visibility": {
|
|
532
|
+
"enum": [
|
|
533
|
+
"public",
|
|
534
|
+
"private"
|
|
535
|
+
],
|
|
536
|
+
"description": "public: the value may go to public research steps."
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
]
|
|
541
|
+
},
|
|
542
|
+
"step": {
|
|
543
|
+
"type": "object",
|
|
544
|
+
"description": "One step. A field not listed here is kept as written; this runner warns that it does not read it.",
|
|
545
|
+
"properties": {
|
|
546
|
+
"title": {
|
|
547
|
+
"type": "string",
|
|
548
|
+
"description": "What people see for this step."
|
|
549
|
+
},
|
|
550
|
+
"agent": {
|
|
551
|
+
"type": "string",
|
|
552
|
+
"description": "The agent who does it: a name under agents. An approve step is the owner's."
|
|
553
|
+
},
|
|
554
|
+
"kind": {
|
|
555
|
+
"enum": [
|
|
556
|
+
"work",
|
|
557
|
+
"check",
|
|
558
|
+
"approve",
|
|
559
|
+
"deliver"
|
|
560
|
+
],
|
|
561
|
+
"description": "work: does part of the job. check: an agent holds earlier work against criteria and sends it back. approve: the owner decides. deliver: writes the result."
|
|
562
|
+
},
|
|
563
|
+
"needs": {
|
|
564
|
+
"anyOf": [
|
|
565
|
+
{
|
|
566
|
+
"type": "string",
|
|
567
|
+
"description": "One earlier step."
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"type": "array",
|
|
571
|
+
"items": {
|
|
572
|
+
"type": "string"
|
|
573
|
+
},
|
|
574
|
+
"description": "Earlier steps this one waits for. Without needs, a step waits for the one written before it."
|
|
575
|
+
}
|
|
576
|
+
]
|
|
577
|
+
},
|
|
578
|
+
"checks": {
|
|
579
|
+
"type": "string",
|
|
580
|
+
"description": "check: the earlier step it checks. Default: the work it needs."
|
|
581
|
+
},
|
|
582
|
+
"shows": {
|
|
583
|
+
"type": "string",
|
|
584
|
+
"description": "approve: the earlier step the owner sees. Default: the work it needs."
|
|
585
|
+
},
|
|
586
|
+
"tools": {
|
|
587
|
+
"type": "array",
|
|
588
|
+
"items": {
|
|
589
|
+
"anyOf": [
|
|
590
|
+
{
|
|
591
|
+
"enum": [
|
|
592
|
+
"web_search",
|
|
593
|
+
"web_fetch"
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"type": "string",
|
|
598
|
+
"pattern": "^[a-z0-9][a-z0-9_-]{0,40}/[A-Za-z0-9_.-]{1,128}$",
|
|
599
|
+
"description": "A tool of a declared source, as <source>/<tool> (RFC 0017)."
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"type": "string",
|
|
603
|
+
"description": "A tool another harness names; this runner cannot run a step that needs it."
|
|
604
|
+
}
|
|
605
|
+
]
|
|
606
|
+
},
|
|
607
|
+
"description": "Tools this step may use. This runner has web_search and web_fetch."
|
|
608
|
+
},
|
|
609
|
+
"task": {
|
|
610
|
+
"type": "string",
|
|
611
|
+
"description": "What to do, in plain words. A check's task is what passing means."
|
|
612
|
+
},
|
|
613
|
+
"rounds": {
|
|
614
|
+
"type": "integer",
|
|
615
|
+
"minimum": 0,
|
|
616
|
+
"maximum": 5,
|
|
617
|
+
"description": "check: how often it may send work back. approve: how often the owner may ask for changes (default 3)."
|
|
618
|
+
},
|
|
619
|
+
"context": {
|
|
620
|
+
"type": "object",
|
|
621
|
+
"additionalProperties": false,
|
|
622
|
+
"description": "Share only these inputs and earlier results with the step.",
|
|
623
|
+
"properties": {
|
|
624
|
+
"inputs": {
|
|
625
|
+
"type": "object",
|
|
626
|
+
"additionalProperties": {
|
|
627
|
+
"type": "string"
|
|
628
|
+
}
|
|
629
|
+
},
|
|
630
|
+
"artifacts": {
|
|
631
|
+
"type": "object",
|
|
632
|
+
"additionalProperties": {
|
|
633
|
+
"type": "string"
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
"public": {
|
|
637
|
+
"type": "boolean",
|
|
638
|
+
"description": "true: public research that may never receive private facts."
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
"criteria": {
|
|
643
|
+
"type": "array",
|
|
644
|
+
"items": {
|
|
645
|
+
"type": "string"
|
|
646
|
+
},
|
|
647
|
+
"description": "check: what the work must meet."
|
|
648
|
+
},
|
|
649
|
+
"mcp": {
|
|
650
|
+
"type": "array",
|
|
651
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
652
|
+
},
|
|
653
|
+
"mcpServers": {
|
|
654
|
+
"type": "array",
|
|
655
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
656
|
+
},
|
|
657
|
+
"mcp_servers": {
|
|
658
|
+
"type": "array",
|
|
659
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
660
|
+
},
|
|
661
|
+
"connectors": {
|
|
662
|
+
"type": "array",
|
|
663
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
664
|
+
},
|
|
665
|
+
"plugins": {
|
|
666
|
+
"type": "array",
|
|
667
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
668
|
+
},
|
|
669
|
+
"skills": {
|
|
670
|
+
"type": "array",
|
|
671
|
+
"description": "A tool or connection another harness names. This runner cannot run a step that needs it; the step is kept for a harness that can."
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
},
|
|
675
|
+
"agent": {
|
|
676
|
+
"type": "object",
|
|
677
|
+
"properties": {
|
|
678
|
+
"description": {
|
|
679
|
+
"type": "string",
|
|
680
|
+
"description": "What this agent is for, in one line."
|
|
681
|
+
},
|
|
682
|
+
"agentType": {
|
|
683
|
+
"enum": [
|
|
684
|
+
"CUSTOM",
|
|
685
|
+
"REVIEW",
|
|
686
|
+
"FOREMAN"
|
|
687
|
+
],
|
|
688
|
+
"description": "CUSTOM does work, REVIEW checks it, FOREMAN coordinates (factoryhub writes one from the flow)."
|
|
689
|
+
},
|
|
690
|
+
"instructions": {
|
|
691
|
+
"type": "string",
|
|
692
|
+
"description": "The agent's role and standing instructions, in prose: instructions: | and the text indented under it."
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
},
|
|
696
|
+
"testsFile": {
|
|
697
|
+
"type": "object",
|
|
698
|
+
"additionalProperties": false,
|
|
699
|
+
"required": [
|
|
700
|
+
"version",
|
|
701
|
+
"cases"
|
|
702
|
+
],
|
|
703
|
+
"properties": {
|
|
704
|
+
"version": {
|
|
705
|
+
"const": 1
|
|
706
|
+
},
|
|
707
|
+
"cases": {
|
|
708
|
+
"type": "object",
|
|
709
|
+
"minProperties": 1,
|
|
710
|
+
"maxProperties": 8,
|
|
711
|
+
"propertyNames": {
|
|
712
|
+
"pattern": "^[a-z][a-z0-9_-]{0,63}$"
|
|
713
|
+
},
|
|
714
|
+
"additionalProperties": {
|
|
715
|
+
"type": "object",
|
|
716
|
+
"additionalProperties": false,
|
|
717
|
+
"required": [
|
|
718
|
+
"inputs",
|
|
719
|
+
"expect"
|
|
720
|
+
],
|
|
721
|
+
"properties": {
|
|
722
|
+
"name": {
|
|
723
|
+
"type": "string",
|
|
724
|
+
"description": "What this example shows.",
|
|
725
|
+
"maxLength": 100
|
|
726
|
+
},
|
|
727
|
+
"inputs": {
|
|
728
|
+
"type": "object",
|
|
729
|
+
"description": "A value for each input."
|
|
730
|
+
},
|
|
731
|
+
"expect": {
|
|
732
|
+
"type": "object",
|
|
733
|
+
"additionalProperties": false,
|
|
734
|
+
"minProperties": 1,
|
|
735
|
+
"properties": {
|
|
736
|
+
"contains": {
|
|
737
|
+
"type": "array",
|
|
738
|
+
"items": {
|
|
739
|
+
"type": "string"
|
|
740
|
+
},
|
|
741
|
+
"description": "Text the result must contain."
|
|
742
|
+
},
|
|
743
|
+
"excludes": {
|
|
744
|
+
"type": "array",
|
|
745
|
+
"items": {
|
|
746
|
+
"type": "string"
|
|
747
|
+
},
|
|
748
|
+
"description": "Text the result must not contain."
|
|
749
|
+
},
|
|
750
|
+
"min_length": {
|
|
751
|
+
"type": "integer",
|
|
752
|
+
"minimum": 0,
|
|
753
|
+
"maximum": 100000
|
|
754
|
+
},
|
|
755
|
+
"max_length": {
|
|
756
|
+
"type": "integer",
|
|
757
|
+
"minimum": 0,
|
|
758
|
+
"maximum": 100000
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
"requirementsFile": {
|
|
768
|
+
"type": "object",
|
|
769
|
+
"properties": {
|
|
770
|
+
"models": {
|
|
771
|
+
"type": "object",
|
|
772
|
+
"properties": {
|
|
773
|
+
"minimum": {
|
|
774
|
+
"type": "string",
|
|
775
|
+
"description": "The least capable model that works."
|
|
776
|
+
},
|
|
777
|
+
"recommended": {
|
|
778
|
+
"type": "string",
|
|
779
|
+
"description": "The model the author recommends."
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
},
|
|
783
|
+
"expected_cost": {
|
|
784
|
+
"type": "object",
|
|
785
|
+
"required": [
|
|
786
|
+
"currency",
|
|
787
|
+
"min",
|
|
788
|
+
"max",
|
|
789
|
+
"model",
|
|
790
|
+
"basis"
|
|
791
|
+
],
|
|
792
|
+
"properties": {
|
|
793
|
+
"currency": {
|
|
794
|
+
"const": "USD"
|
|
795
|
+
},
|
|
796
|
+
"min": {
|
|
797
|
+
"type": "number"
|
|
798
|
+
},
|
|
799
|
+
"max": {
|
|
800
|
+
"type": "number"
|
|
801
|
+
},
|
|
802
|
+
"model": {
|
|
803
|
+
"type": "string",
|
|
804
|
+
"description": "The models it was measured with."
|
|
805
|
+
},
|
|
806
|
+
"basis": {
|
|
807
|
+
"type": "string",
|
|
808
|
+
"description": "How the author arrived at it."
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
}
|