vinta-ai-workflows 0.6.1 → 0.7.0-alpha2
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/CHANGELOG.md +288 -0
- package/README.md +21 -13
- package/package.json +2 -1
- package/schemas/README.md +5 -1
- package/schemas/postmortem.v1.schema.json +339 -0
- package/schemas/vinta-ai-workflows-config.v1.schema.json +13 -1
- package/schemas/workflow.v1.schema.json +833 -0
- package/skills/vinta-bootstrap-ai-tools/SKILL.md +9 -1
- package/skills/vinta-derive-skills/SKILL.md +6 -2
- package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +622 -32
- package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/SKILL.md +24 -2
- package/skills/vinta-derive-skills/resources/plan-execution/README.md +21 -4
- package/skills/vinta-derive-skills/resources/plan-execution/partials/agent-models.md +30 -3
- package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/modular.md +27 -14
- package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/stacked.md +12 -18
- package/skills/vinta-derive-skills/resources/plan-execution/partials/implementer-prompt.md +19 -9
- package/skills/vinta-derive-skills/resources/plan-execution/partials/model-pick.md +25 -9
- package/skills/vinta-derive-skills/resources/plan-execution/partials/parallel-lanes.md +240 -0
- package/skills/vinta-derive-skills/resources/plan-execution/partials/review-layers.md +56 -5
- package/skills/vinta-derive-skills/resources/plan-execution/partials/worktree-seam.md +13 -6
- package/skills/vinta-derive-skills/resources/plan-execution/shell/amend-plan-template.md +17 -12
- package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-phase-template.md +5 -3
- package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-plan-template.md +94 -57
- package/skills/vinta-derive-skills/resources/plan-execution/shell/integrate-phase-template.md +2 -1
- package/skills/vinta-derive-skills/resources/plan-execution/shell/review-phase-template.md +16 -5
|
@@ -0,0 +1,833 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/vintasoftware/vinta-ai-workflows/schemas/workflow.v1.schema.json",
|
|
4
|
+
"title": "vinta-ai-maestro workflow",
|
|
5
|
+
"description": "An executable plan: the phase DAG, the pipelines phases run through, the capacity pools they contend for, and the gates they must pass. Lives at `ai-plans/<feature-kebab>.workflow.json` in a target project, emitted by `plan-feature` alongside the human-readable plan and executed by `vinta-ai-maestro`. GENERATED from packages/vinta-ai-maestro/src/types.ts — edit there, not here. See schemas/README.md for versioning rules.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"description": "Optional URL of this schema, for editor validation. Ignored at runtime.",
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"schema_version": {
|
|
13
|
+
"type": "number",
|
|
14
|
+
"const": 1,
|
|
15
|
+
"description": "Schema major version. Bumped only on breaking changes."
|
|
16
|
+
},
|
|
17
|
+
"id": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 1,
|
|
20
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
21
|
+
"description": "Stable identifier for this workflow. Used in branch names."
|
|
22
|
+
},
|
|
23
|
+
"plan_ref": {
|
|
24
|
+
"description": "The human-readable plan this was emitted alongside.",
|
|
25
|
+
"type": "string"
|
|
26
|
+
},
|
|
27
|
+
"plan_context_refs": {
|
|
28
|
+
"default": [],
|
|
29
|
+
"description": "Sections of the plan that bound every phase rather than any one of them — its Goals + Non-goals and its Guiding Decisions. Each is a file-and-anchor reference in the same form as `prompt_ref` (`ai-plans/PLAN.md#1-goals`), resolved by the same resolver and handed to the implementer and the reviewer verbatim, marked as plan-level. Empty — the default — means the prompts carry the phase brief alone.",
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"base_branch": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"minLength": 1,
|
|
39
|
+
"description": "What dependency-free nodes branch from."
|
|
40
|
+
},
|
|
41
|
+
"project": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"properties": {
|
|
44
|
+
"migrate_cmd": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"minLength": 1,
|
|
47
|
+
"description": "The project’s own migrate command. Run once per template database — never per lane, which is what makes the Nth lane cost a copy rather than a provision."
|
|
48
|
+
},
|
|
49
|
+
"databases": {
|
|
50
|
+
"default": {},
|
|
51
|
+
"description": "Roles a lane forks. An undeclared role means the lane has no database of its own.",
|
|
52
|
+
"type": "object",
|
|
53
|
+
"properties": {
|
|
54
|
+
"dev": {
|
|
55
|
+
"oneOf": [
|
|
56
|
+
{
|
|
57
|
+
"type": "object",
|
|
58
|
+
"properties": {
|
|
59
|
+
"engine": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"const": "sqlite"
|
|
62
|
+
},
|
|
63
|
+
"path": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"minLength": 1,
|
|
66
|
+
"description": "Repo-relative path of the database file, e.g. `db.sqlite3`. Copied per lane."
|
|
67
|
+
},
|
|
68
|
+
"connection_url_var": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"minLength": 1,
|
|
71
|
+
"description": "Env var the project reads its connection string from, set per lane."
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"required": [
|
|
75
|
+
"engine",
|
|
76
|
+
"path",
|
|
77
|
+
"connection_url_var"
|
|
78
|
+
],
|
|
79
|
+
"additionalProperties": false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "object",
|
|
83
|
+
"properties": {
|
|
84
|
+
"engine": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"const": "postgres"
|
|
87
|
+
},
|
|
88
|
+
"delivery": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"enum": [
|
|
91
|
+
"external",
|
|
92
|
+
"compose"
|
|
93
|
+
],
|
|
94
|
+
"description": "`external` forks a database on an already-running server — the cheap mode, and the one to prefer for pooling. `compose` boots the lane its own server on its own forked volume, which has no template to clone from and therefore no reset: such a lane is single-use and is re-provisioned rather than reset."
|
|
95
|
+
},
|
|
96
|
+
"name": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"minLength": 1,
|
|
99
|
+
"description": "The main checkout’s database name. Lane names derive from it."
|
|
100
|
+
},
|
|
101
|
+
"server_url": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"minLength": 1,
|
|
104
|
+
"description": "The server, without the database path segment, e.g. `postgres://localhost:5432`."
|
|
105
|
+
},
|
|
106
|
+
"connection_url_var": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"minLength": 1
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"required": [
|
|
112
|
+
"engine",
|
|
113
|
+
"delivery",
|
|
114
|
+
"name",
|
|
115
|
+
"server_url",
|
|
116
|
+
"connection_url_var"
|
|
117
|
+
],
|
|
118
|
+
"additionalProperties": false
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"description": "One forked database a lane gets its own copy of."
|
|
122
|
+
},
|
|
123
|
+
"test": {
|
|
124
|
+
"oneOf": [
|
|
125
|
+
{
|
|
126
|
+
"type": "object",
|
|
127
|
+
"properties": {
|
|
128
|
+
"engine": {
|
|
129
|
+
"type": "string",
|
|
130
|
+
"const": "sqlite"
|
|
131
|
+
},
|
|
132
|
+
"path": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"minLength": 1,
|
|
135
|
+
"description": "Repo-relative path of the database file, e.g. `db.sqlite3`. Copied per lane."
|
|
136
|
+
},
|
|
137
|
+
"connection_url_var": {
|
|
138
|
+
"type": "string",
|
|
139
|
+
"minLength": 1,
|
|
140
|
+
"description": "Env var the project reads its connection string from, set per lane."
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
"required": [
|
|
144
|
+
"engine",
|
|
145
|
+
"path",
|
|
146
|
+
"connection_url_var"
|
|
147
|
+
],
|
|
148
|
+
"additionalProperties": false
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"type": "object",
|
|
152
|
+
"properties": {
|
|
153
|
+
"engine": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"const": "postgres"
|
|
156
|
+
},
|
|
157
|
+
"delivery": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"enum": [
|
|
160
|
+
"external",
|
|
161
|
+
"compose"
|
|
162
|
+
],
|
|
163
|
+
"description": "`external` forks a database on an already-running server — the cheap mode, and the one to prefer for pooling. `compose` boots the lane its own server on its own forked volume, which has no template to clone from and therefore no reset: such a lane is single-use and is re-provisioned rather than reset."
|
|
164
|
+
},
|
|
165
|
+
"name": {
|
|
166
|
+
"type": "string",
|
|
167
|
+
"minLength": 1,
|
|
168
|
+
"description": "The main checkout’s database name. Lane names derive from it."
|
|
169
|
+
},
|
|
170
|
+
"server_url": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"minLength": 1,
|
|
173
|
+
"description": "The server, without the database path segment, e.g. `postgres://localhost:5432`."
|
|
174
|
+
},
|
|
175
|
+
"connection_url_var": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"minLength": 1
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"required": [
|
|
181
|
+
"engine",
|
|
182
|
+
"delivery",
|
|
183
|
+
"name",
|
|
184
|
+
"server_url",
|
|
185
|
+
"connection_url_var"
|
|
186
|
+
],
|
|
187
|
+
"additionalProperties": false
|
|
188
|
+
}
|
|
189
|
+
],
|
|
190
|
+
"description": "One forked database a lane gets its own copy of."
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"additionalProperties": false
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"required": [
|
|
197
|
+
"migrate_cmd"
|
|
198
|
+
],
|
|
199
|
+
"additionalProperties": false,
|
|
200
|
+
"description": "What a lane needs to be a working checkout of this project. Optional: with no project block a lane is a worktree and nothing else."
|
|
201
|
+
},
|
|
202
|
+
"defaults": {
|
|
203
|
+
"type": "object",
|
|
204
|
+
"properties": {
|
|
205
|
+
"harness": {
|
|
206
|
+
"type": "string",
|
|
207
|
+
"enum": [
|
|
208
|
+
"claude-code",
|
|
209
|
+
"codex",
|
|
210
|
+
"opencode"
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
"model": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"minLength": 1
|
|
216
|
+
},
|
|
217
|
+
"pipeline": {
|
|
218
|
+
"type": "string",
|
|
219
|
+
"minLength": 1,
|
|
220
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
221
|
+
},
|
|
222
|
+
"max_session_turns": {
|
|
223
|
+
"default": 12,
|
|
224
|
+
"description": "Turns one reused session slot may take before the next spawn starts fresh (§15.5). A shared session only ever grows; without a ceiling a long node eventually dies on a context-window error that reads as a broken harness.",
|
|
225
|
+
"type": "integer",
|
|
226
|
+
"minimum": 1,
|
|
227
|
+
"maximum": 9007199254740991
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"required": [
|
|
231
|
+
"harness",
|
|
232
|
+
"model",
|
|
233
|
+
"pipeline"
|
|
234
|
+
],
|
|
235
|
+
"additionalProperties": false
|
|
236
|
+
},
|
|
237
|
+
"crew": {
|
|
238
|
+
"default": {},
|
|
239
|
+
"description": "The agents this plan is staffed with, by id. Empty — the default — means the workflow is unstaffed and every node falls back to `model` / `defaults.model`, which is how workflows written before rosters existed keep running.",
|
|
240
|
+
"type": "object",
|
|
241
|
+
"propertyNames": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"minLength": 1,
|
|
244
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
245
|
+
},
|
|
246
|
+
"additionalProperties": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"properties": {
|
|
249
|
+
"role": {
|
|
250
|
+
"default": "implementer",
|
|
251
|
+
"description": "Implementers take phases; reviewers read them. No member does both, which is what makes self-review unrepresentable rather than merely unlikely.",
|
|
252
|
+
"type": "string",
|
|
253
|
+
"enum": [
|
|
254
|
+
"implementer",
|
|
255
|
+
"reviewer"
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
"tier": {
|
|
259
|
+
"type": "integer",
|
|
260
|
+
"minimum": 1,
|
|
261
|
+
"maximum": 4,
|
|
262
|
+
"description": "Difficulty tier this member is staffed at, per the plan skill’s rubric. It is a floor on what they may be handed, and the ordering the scheduler substitutes along."
|
|
263
|
+
},
|
|
264
|
+
"model": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"minLength": 1,
|
|
267
|
+
"description": "The model this tier resolves to for this run."
|
|
268
|
+
},
|
|
269
|
+
"harness": {
|
|
270
|
+
"description": "Overrides defaults.harness for this member.",
|
|
271
|
+
"type": "string",
|
|
272
|
+
"enum": [
|
|
273
|
+
"claude-code",
|
|
274
|
+
"codex",
|
|
275
|
+
"opencode"
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
"description": {
|
|
279
|
+
"description": "Why the plan staffed this tier.",
|
|
280
|
+
"type": "string"
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
"required": [
|
|
284
|
+
"tier",
|
|
285
|
+
"model"
|
|
286
|
+
],
|
|
287
|
+
"additionalProperties": false
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"resources": {
|
|
291
|
+
"type": "object",
|
|
292
|
+
"propertyNames": {
|
|
293
|
+
"type": "string",
|
|
294
|
+
"minLength": 1,
|
|
295
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
296
|
+
},
|
|
297
|
+
"additionalProperties": {
|
|
298
|
+
"type": "object",
|
|
299
|
+
"properties": {
|
|
300
|
+
"capacity": {
|
|
301
|
+
"type": "integer",
|
|
302
|
+
"minimum": 1,
|
|
303
|
+
"maximum": 9007199254740991,
|
|
304
|
+
"description": "Maximum concurrent holders. A starting hint for `lane` — see admission control."
|
|
305
|
+
},
|
|
306
|
+
"kind": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"enum": [
|
|
309
|
+
"worktree",
|
|
310
|
+
"semaphore"
|
|
311
|
+
],
|
|
312
|
+
"description": "`worktree` pools are provisioned lanes; `semaphore` pools are pure counters."
|
|
313
|
+
},
|
|
314
|
+
"description": {
|
|
315
|
+
"type": "string"
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
"required": [
|
|
319
|
+
"capacity",
|
|
320
|
+
"kind"
|
|
321
|
+
],
|
|
322
|
+
"additionalProperties": false
|
|
323
|
+
},
|
|
324
|
+
"description": "Named capacity pools. `lane` is required."
|
|
325
|
+
},
|
|
326
|
+
"gates": {
|
|
327
|
+
"default": {},
|
|
328
|
+
"type": "object",
|
|
329
|
+
"propertyNames": {
|
|
330
|
+
"type": "string",
|
|
331
|
+
"minLength": 1,
|
|
332
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
333
|
+
},
|
|
334
|
+
"additionalProperties": {
|
|
335
|
+
"type": "object",
|
|
336
|
+
"properties": {
|
|
337
|
+
"cmd": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"minLength": 1,
|
|
340
|
+
"description": "Shell command run in the node’s lane. Not an agent."
|
|
341
|
+
},
|
|
342
|
+
"requires": {
|
|
343
|
+
"default": [],
|
|
344
|
+
"description": "Resource pool ids acquired before the gate runs, in canonical order.",
|
|
345
|
+
"type": "array",
|
|
346
|
+
"items": {
|
|
347
|
+
"type": "string",
|
|
348
|
+
"minLength": 1,
|
|
349
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"timeout_s": {
|
|
353
|
+
"default": 1800,
|
|
354
|
+
"type": "integer",
|
|
355
|
+
"minimum": 1,
|
|
356
|
+
"maximum": 9007199254740991
|
|
357
|
+
},
|
|
358
|
+
"description": {
|
|
359
|
+
"type": "string"
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
"required": [
|
|
363
|
+
"cmd"
|
|
364
|
+
],
|
|
365
|
+
"additionalProperties": false
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"nodes": {
|
|
369
|
+
"minItems": 1,
|
|
370
|
+
"type": "array",
|
|
371
|
+
"items": {
|
|
372
|
+
"type": "object",
|
|
373
|
+
"properties": {
|
|
374
|
+
"id": {
|
|
375
|
+
"type": "string",
|
|
376
|
+
"minLength": 1,
|
|
377
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
378
|
+
},
|
|
379
|
+
"name": {
|
|
380
|
+
"type": "string",
|
|
381
|
+
"minLength": 1
|
|
382
|
+
},
|
|
383
|
+
"depends_on": {
|
|
384
|
+
"default": [],
|
|
385
|
+
"description": "Empty means the node branches from base_branch and may start immediately.",
|
|
386
|
+
"type": "array",
|
|
387
|
+
"items": {
|
|
388
|
+
"type": "object",
|
|
389
|
+
"properties": {
|
|
390
|
+
"node": {
|
|
391
|
+
"type": "string",
|
|
392
|
+
"minLength": 1,
|
|
393
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
394
|
+
"description": "The upstream node id."
|
|
395
|
+
},
|
|
396
|
+
"artifact": {
|
|
397
|
+
"type": "string",
|
|
398
|
+
"minLength": 1,
|
|
399
|
+
"description": "What this node needs from the upstream one — a model, a symbol, a migration, an endpoint. Required: it is what the implementer prompt uses to explain what the phase builds on, and a bare id with no reason is usually a plan smell."
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
"required": [
|
|
403
|
+
"node",
|
|
404
|
+
"artifact"
|
|
405
|
+
],
|
|
406
|
+
"additionalProperties": false
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
"prompt_ref": {
|
|
410
|
+
"type": "string",
|
|
411
|
+
"minLength": 1,
|
|
412
|
+
"description": "Where the phase brief lives, e.g. `plan.md#phase-1`."
|
|
413
|
+
},
|
|
414
|
+
"touches": {
|
|
415
|
+
"default": [],
|
|
416
|
+
"description": "Touch List. Same-wave overlap is warned about, never refused.",
|
|
417
|
+
"type": "array",
|
|
418
|
+
"items": {
|
|
419
|
+
"type": "string"
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
"pipeline": {
|
|
423
|
+
"description": "Overrides defaults.pipeline.",
|
|
424
|
+
"type": "string",
|
|
425
|
+
"minLength": 1,
|
|
426
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
427
|
+
},
|
|
428
|
+
"gates": {
|
|
429
|
+
"default": [],
|
|
430
|
+
"type": "array",
|
|
431
|
+
"items": {
|
|
432
|
+
"type": "string",
|
|
433
|
+
"minLength": 1,
|
|
434
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
"harness": {
|
|
438
|
+
"description": "Overrides defaults.harness.",
|
|
439
|
+
"type": "string",
|
|
440
|
+
"enum": [
|
|
441
|
+
"claude-code",
|
|
442
|
+
"codex",
|
|
443
|
+
"opencode"
|
|
444
|
+
]
|
|
445
|
+
},
|
|
446
|
+
"model": {
|
|
447
|
+
"description": "Overrides defaults.model. Mutually exclusive with `crew`, which carries a model.",
|
|
448
|
+
"type": "string"
|
|
449
|
+
},
|
|
450
|
+
"crew": {
|
|
451
|
+
"description": "The implementer this phase is assigned to. Their tier is the floor for it: a busier roster may hand the phase to a free implementer at that tier or above, never below. Its reviewer is not named here — it is the cheapest reviewer on the roster who is qualified for this phase, and it is never this member.",
|
|
452
|
+
"type": "string",
|
|
453
|
+
"minLength": 1,
|
|
454
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
455
|
+
},
|
|
456
|
+
"max_fix_rounds": {
|
|
457
|
+
"default": 2,
|
|
458
|
+
"type": "integer",
|
|
459
|
+
"minimum": 0,
|
|
460
|
+
"maximum": 9007199254740991
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"required": [
|
|
464
|
+
"id",
|
|
465
|
+
"name",
|
|
466
|
+
"prompt_ref"
|
|
467
|
+
],
|
|
468
|
+
"additionalProperties": false
|
|
469
|
+
}
|
|
470
|
+
},
|
|
471
|
+
"pipelines": {
|
|
472
|
+
"default": {},
|
|
473
|
+
"description": "Pipelines this workflow authors. Optional: `defaults.pipeline` may name one the package ships (see BUILT_IN_PIPELINES), and a declared id shadows a built-in of the same name. A pipeline is machinery, not plan data — requiring every emitted workflow to carry a verbatim copy would duplicate it into every plan, and a fix to the shipped one would never reach a plan already written.",
|
|
474
|
+
"type": "object",
|
|
475
|
+
"propertyNames": {
|
|
476
|
+
"type": "string",
|
|
477
|
+
"minLength": 1,
|
|
478
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
479
|
+
},
|
|
480
|
+
"additionalProperties": {
|
|
481
|
+
"type": "object",
|
|
482
|
+
"properties": {
|
|
483
|
+
"states": {
|
|
484
|
+
"minItems": 1,
|
|
485
|
+
"type": "array",
|
|
486
|
+
"items": {
|
|
487
|
+
"type": "object",
|
|
488
|
+
"properties": {
|
|
489
|
+
"id": {
|
|
490
|
+
"type": "string",
|
|
491
|
+
"minLength": 1,
|
|
492
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
493
|
+
},
|
|
494
|
+
"name": {
|
|
495
|
+
"type": "string",
|
|
496
|
+
"minLength": 1
|
|
497
|
+
},
|
|
498
|
+
"position": {
|
|
499
|
+
"type": "object",
|
|
500
|
+
"properties": {
|
|
501
|
+
"x": {
|
|
502
|
+
"type": "number"
|
|
503
|
+
},
|
|
504
|
+
"y": {
|
|
505
|
+
"type": "number"
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
"required": [
|
|
509
|
+
"x",
|
|
510
|
+
"y"
|
|
511
|
+
],
|
|
512
|
+
"additionalProperties": false,
|
|
513
|
+
"description": "Canvas position."
|
|
514
|
+
},
|
|
515
|
+
"onEnter": {
|
|
516
|
+
"default": [],
|
|
517
|
+
"description": "Effects run on entering the state.",
|
|
518
|
+
"type": "array",
|
|
519
|
+
"items": {
|
|
520
|
+
"type": "object",
|
|
521
|
+
"properties": {
|
|
522
|
+
"id": {
|
|
523
|
+
"type": "string",
|
|
524
|
+
"minLength": 1,
|
|
525
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
526
|
+
"description": "Unique within its containing state or transition."
|
|
527
|
+
},
|
|
528
|
+
"definitionId": {
|
|
529
|
+
"type": "string",
|
|
530
|
+
"enum": [
|
|
531
|
+
"spawn_agent",
|
|
532
|
+
"run_gate",
|
|
533
|
+
"git_branch",
|
|
534
|
+
"git_merge",
|
|
535
|
+
"git_push",
|
|
536
|
+
"open_pr",
|
|
537
|
+
"write_tracking",
|
|
538
|
+
"await_human",
|
|
539
|
+
"notify"
|
|
540
|
+
],
|
|
541
|
+
"description": "Which catalog verb this effect invokes."
|
|
542
|
+
},
|
|
543
|
+
"name": {
|
|
544
|
+
"description": "Display label. Falls back to definitionId.",
|
|
545
|
+
"type": "string"
|
|
546
|
+
},
|
|
547
|
+
"params": {
|
|
548
|
+
"default": {},
|
|
549
|
+
"description": "Arguments for the verb.",
|
|
550
|
+
"type": "object",
|
|
551
|
+
"propertyNames": {
|
|
552
|
+
"type": "string"
|
|
553
|
+
},
|
|
554
|
+
"additionalProperties": {}
|
|
555
|
+
},
|
|
556
|
+
"enabled": {
|
|
557
|
+
"default": true,
|
|
558
|
+
"type": "boolean"
|
|
559
|
+
},
|
|
560
|
+
"description": {
|
|
561
|
+
"type": "string"
|
|
562
|
+
},
|
|
563
|
+
"data": {
|
|
564
|
+
"type": "object",
|
|
565
|
+
"propertyNames": {
|
|
566
|
+
"type": "string"
|
|
567
|
+
},
|
|
568
|
+
"additionalProperties": {},
|
|
569
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
"required": [
|
|
573
|
+
"id",
|
|
574
|
+
"definitionId"
|
|
575
|
+
],
|
|
576
|
+
"additionalProperties": false
|
|
577
|
+
}
|
|
578
|
+
},
|
|
579
|
+
"onLeave": {
|
|
580
|
+
"default": [],
|
|
581
|
+
"description": "Effects run on leaving the state.",
|
|
582
|
+
"type": "array",
|
|
583
|
+
"items": {
|
|
584
|
+
"type": "object",
|
|
585
|
+
"properties": {
|
|
586
|
+
"id": {
|
|
587
|
+
"type": "string",
|
|
588
|
+
"minLength": 1,
|
|
589
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
590
|
+
"description": "Unique within its containing state or transition."
|
|
591
|
+
},
|
|
592
|
+
"definitionId": {
|
|
593
|
+
"type": "string",
|
|
594
|
+
"enum": [
|
|
595
|
+
"spawn_agent",
|
|
596
|
+
"run_gate",
|
|
597
|
+
"git_branch",
|
|
598
|
+
"git_merge",
|
|
599
|
+
"git_push",
|
|
600
|
+
"open_pr",
|
|
601
|
+
"write_tracking",
|
|
602
|
+
"await_human",
|
|
603
|
+
"notify"
|
|
604
|
+
],
|
|
605
|
+
"description": "Which catalog verb this effect invokes."
|
|
606
|
+
},
|
|
607
|
+
"name": {
|
|
608
|
+
"description": "Display label. Falls back to definitionId.",
|
|
609
|
+
"type": "string"
|
|
610
|
+
},
|
|
611
|
+
"params": {
|
|
612
|
+
"default": {},
|
|
613
|
+
"description": "Arguments for the verb.",
|
|
614
|
+
"type": "object",
|
|
615
|
+
"propertyNames": {
|
|
616
|
+
"type": "string"
|
|
617
|
+
},
|
|
618
|
+
"additionalProperties": {}
|
|
619
|
+
},
|
|
620
|
+
"enabled": {
|
|
621
|
+
"default": true,
|
|
622
|
+
"type": "boolean"
|
|
623
|
+
},
|
|
624
|
+
"description": {
|
|
625
|
+
"type": "string"
|
|
626
|
+
},
|
|
627
|
+
"data": {
|
|
628
|
+
"type": "object",
|
|
629
|
+
"propertyNames": {
|
|
630
|
+
"type": "string"
|
|
631
|
+
},
|
|
632
|
+
"additionalProperties": {},
|
|
633
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
"required": [
|
|
637
|
+
"id",
|
|
638
|
+
"definitionId"
|
|
639
|
+
],
|
|
640
|
+
"additionalProperties": false
|
|
641
|
+
}
|
|
642
|
+
},
|
|
643
|
+
"color": {
|
|
644
|
+
"type": "string"
|
|
645
|
+
},
|
|
646
|
+
"description": {
|
|
647
|
+
"type": "string"
|
|
648
|
+
},
|
|
649
|
+
"data": {
|
|
650
|
+
"type": "object",
|
|
651
|
+
"propertyNames": {
|
|
652
|
+
"type": "string"
|
|
653
|
+
},
|
|
654
|
+
"additionalProperties": {},
|
|
655
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
656
|
+
}
|
|
657
|
+
},
|
|
658
|
+
"required": [
|
|
659
|
+
"id",
|
|
660
|
+
"name",
|
|
661
|
+
"position"
|
|
662
|
+
],
|
|
663
|
+
"additionalProperties": false
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
"transitions": {
|
|
667
|
+
"default": [],
|
|
668
|
+
"type": "array",
|
|
669
|
+
"items": {
|
|
670
|
+
"type": "object",
|
|
671
|
+
"properties": {
|
|
672
|
+
"id": {
|
|
673
|
+
"type": "string",
|
|
674
|
+
"minLength": 1,
|
|
675
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
676
|
+
},
|
|
677
|
+
"name": {
|
|
678
|
+
"type": "string"
|
|
679
|
+
},
|
|
680
|
+
"from": {
|
|
681
|
+
"type": "string",
|
|
682
|
+
"minLength": 1,
|
|
683
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
684
|
+
"description": "Source state id."
|
|
685
|
+
},
|
|
686
|
+
"to": {
|
|
687
|
+
"type": "string",
|
|
688
|
+
"minLength": 1,
|
|
689
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
690
|
+
"description": "Target state id."
|
|
691
|
+
},
|
|
692
|
+
"trigger": {
|
|
693
|
+
"description": "Event name that fires this transition.",
|
|
694
|
+
"type": "string"
|
|
695
|
+
},
|
|
696
|
+
"guard": {
|
|
697
|
+
"description": "Opaque boolean expression over the documented guard context (review.verdict, gate.exit_code, human.answer, fix_rounds, node.*, run.*). Evaluated by a restricted evaluator with no host access.",
|
|
698
|
+
"type": "string"
|
|
699
|
+
},
|
|
700
|
+
"effects": {
|
|
701
|
+
"default": [],
|
|
702
|
+
"type": "array",
|
|
703
|
+
"items": {
|
|
704
|
+
"type": "object",
|
|
705
|
+
"properties": {
|
|
706
|
+
"id": {
|
|
707
|
+
"type": "string",
|
|
708
|
+
"minLength": 1,
|
|
709
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
710
|
+
"description": "Unique within its containing state or transition."
|
|
711
|
+
},
|
|
712
|
+
"definitionId": {
|
|
713
|
+
"type": "string",
|
|
714
|
+
"enum": [
|
|
715
|
+
"spawn_agent",
|
|
716
|
+
"run_gate",
|
|
717
|
+
"git_branch",
|
|
718
|
+
"git_merge",
|
|
719
|
+
"git_push",
|
|
720
|
+
"open_pr",
|
|
721
|
+
"write_tracking",
|
|
722
|
+
"await_human",
|
|
723
|
+
"notify"
|
|
724
|
+
],
|
|
725
|
+
"description": "Which catalog verb this effect invokes."
|
|
726
|
+
},
|
|
727
|
+
"name": {
|
|
728
|
+
"description": "Display label. Falls back to definitionId.",
|
|
729
|
+
"type": "string"
|
|
730
|
+
},
|
|
731
|
+
"params": {
|
|
732
|
+
"default": {},
|
|
733
|
+
"description": "Arguments for the verb.",
|
|
734
|
+
"type": "object",
|
|
735
|
+
"propertyNames": {
|
|
736
|
+
"type": "string"
|
|
737
|
+
},
|
|
738
|
+
"additionalProperties": {}
|
|
739
|
+
},
|
|
740
|
+
"enabled": {
|
|
741
|
+
"default": true,
|
|
742
|
+
"type": "boolean"
|
|
743
|
+
},
|
|
744
|
+
"description": {
|
|
745
|
+
"type": "string"
|
|
746
|
+
},
|
|
747
|
+
"data": {
|
|
748
|
+
"type": "object",
|
|
749
|
+
"propertyNames": {
|
|
750
|
+
"type": "string"
|
|
751
|
+
},
|
|
752
|
+
"additionalProperties": {},
|
|
753
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
754
|
+
}
|
|
755
|
+
},
|
|
756
|
+
"required": [
|
|
757
|
+
"id",
|
|
758
|
+
"definitionId"
|
|
759
|
+
],
|
|
760
|
+
"additionalProperties": false
|
|
761
|
+
}
|
|
762
|
+
},
|
|
763
|
+
"data": {
|
|
764
|
+
"type": "object",
|
|
765
|
+
"propertyNames": {
|
|
766
|
+
"type": "string"
|
|
767
|
+
},
|
|
768
|
+
"additionalProperties": {},
|
|
769
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
770
|
+
}
|
|
771
|
+
},
|
|
772
|
+
"required": [
|
|
773
|
+
"id",
|
|
774
|
+
"from",
|
|
775
|
+
"to"
|
|
776
|
+
],
|
|
777
|
+
"additionalProperties": false
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
"initialStateIds": {
|
|
781
|
+
"minItems": 1,
|
|
782
|
+
"type": "array",
|
|
783
|
+
"items": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"minLength": 1,
|
|
786
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
"finalStateIds": {
|
|
790
|
+
"default": [],
|
|
791
|
+
"type": "array",
|
|
792
|
+
"items": {
|
|
793
|
+
"type": "string",
|
|
794
|
+
"minLength": 1,
|
|
795
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$"
|
|
796
|
+
}
|
|
797
|
+
},
|
|
798
|
+
"data": {
|
|
799
|
+
"type": "object",
|
|
800
|
+
"propertyNames": {
|
|
801
|
+
"type": "string"
|
|
802
|
+
},
|
|
803
|
+
"additionalProperties": {},
|
|
804
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
805
|
+
}
|
|
806
|
+
},
|
|
807
|
+
"required": [
|
|
808
|
+
"states",
|
|
809
|
+
"initialStateIds"
|
|
810
|
+
],
|
|
811
|
+
"additionalProperties": false,
|
|
812
|
+
"description": "A per-phase pipeline, authored in vinta-state-machine-editor."
|
|
813
|
+
}
|
|
814
|
+
},
|
|
815
|
+
"data": {
|
|
816
|
+
"type": "object",
|
|
817
|
+
"propertyNames": {
|
|
818
|
+
"type": "string"
|
|
819
|
+
},
|
|
820
|
+
"additionalProperties": {},
|
|
821
|
+
"description": "Host-owned passthrough. Preserved verbatim and never interpreted."
|
|
822
|
+
}
|
|
823
|
+
},
|
|
824
|
+
"required": [
|
|
825
|
+
"schema_version",
|
|
826
|
+
"id",
|
|
827
|
+
"base_branch",
|
|
828
|
+
"defaults",
|
|
829
|
+
"resources",
|
|
830
|
+
"nodes"
|
|
831
|
+
],
|
|
832
|
+
"additionalProperties": false
|
|
833
|
+
}
|