@tacuchi/agent-workflow-cli 21.0.0 → 21.1.0
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 +1 -0
- package/dist/application/capability/compose.js +161 -0
- package/dist/application/capability/compose.js.map +1 -0
- package/dist/application/capability/descriptor-loader.js +109 -0
- package/dist/application/capability/descriptor-loader.js.map +1 -0
- package/dist/application/capability/design-handler.js +299 -0
- package/dist/application/capability/design-handler.js.map +1 -0
- package/dist/application/capability/dispatcher.js +312 -0
- package/dist/application/capability/dispatcher.js.map +1 -0
- package/dist/application/capability/durable-effect.js +220 -0
- package/dist/application/capability/durable-effect.js.map +1 -0
- package/dist/application/capability/installed-inventory.js +168 -0
- package/dist/application/capability/installed-inventory.js.map +1 -0
- package/dist/application/capability/readiness.js +204 -0
- package/dist/application/capability/readiness.js.map +1 -0
- package/dist/application/capability/resolution.js +264 -0
- package/dist/application/capability/resolution.js.map +1 -0
- package/dist/application/capability/wrapper.js +187 -0
- package/dist/application/capability/wrapper.js.map +1 -0
- package/dist/application/context/manifest.js +11 -5
- package/dist/application/context/manifest.js.map +1 -1
- package/dist/application/context/measure.js +5 -2
- package/dist/application/context/measure.js.map +1 -1
- package/dist/application/context/plan-service.js +6 -6
- package/dist/application/context/plan-service.js.map +1 -1
- package/dist/application/design/design-bundle-service.js +148 -0
- package/dist/application/design/design-bundle-service.js.map +1 -0
- package/dist/application/design/design-proposal-service.js +69 -0
- package/dist/application/design/design-proposal-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +275 -7
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +100 -0
- package/dist/application/design/design-record-service.js.map +1 -0
- package/dist/application/flow/advance.js +533 -0
- package/dist/application/flow/advance.js.map +1 -0
- package/dist/application/flow/flow-service.js +65 -0
- package/dist/application/flow/flow-service.js.map +1 -0
- package/dist/application/flow/run-projection.js +80 -0
- package/dist/application/flow/run-projection.js.map +1 -0
- package/dist/application/flow/run-state-service.js +107 -0
- package/dist/application/flow/run-state-service.js.map +1 -0
- package/dist/application/flow/submit.js +423 -0
- package/dist/application/flow/submit.js.map +1 -0
- package/dist/application/resume-service.js +23 -10
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/install-skill.js +11 -0
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -0
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/skills-resolver-service.js +8 -2
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +4 -1
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +13 -1
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/capability.js +182 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/flow.js +71 -0
- package/dist/cli/commands/flow.js.map +1 -0
- package/dist/cli/commands/index.js +4 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/skills.js +55 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +5 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +6 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +6 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +5 -0
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +5 -1
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/domain/capability/descriptor.js +553 -0
- package/dist/domain/capability/descriptor.js.map +1 -0
- package/dist/domain/capability/effects.js +90 -0
- package/dist/domain/capability/effects.js.map +1 -0
- package/dist/domain/capability/protocol.js +494 -0
- package/dist/domain/capability/protocol.js.map +1 -0
- package/dist/domain/contract-reader.js +84 -0
- package/dist/domain/contract-reader.js.map +1 -0
- package/dist/domain/design/adapter.js +161 -0
- package/dist/domain/design/adapter.js.map +1 -0
- package/dist/domain/design/artifact.js +148 -4
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +263 -4
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/direct.js +108 -0
- package/dist/domain/design/direct.js.map +1 -0
- package/dist/domain/design/external-send.js +65 -0
- package/dist/domain/design/external-send.js.map +1 -0
- package/dist/domain/design/maturity.js +71 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/offline.js +92 -0
- package/dist/domain/design/offline.js.map +1 -0
- package/dist/domain/design/profiles.js +212 -0
- package/dist/domain/design/profiles.js.map +1 -0
- package/dist/domain/design/proposal.js +234 -0
- package/dist/domain/design/proposal.js.map +1 -0
- package/dist/domain/design/render-bundle.js +0 -0
- package/dist/domain/design/render-bundle.js.map +1 -0
- package/dist/domain/design/rendition.js +472 -0
- package/dist/domain/design/rendition.js.map +1 -0
- package/dist/domain/design/sources.js +180 -0
- package/dist/domain/design/sources.js.map +1 -0
- package/dist/domain/design/validation.js +12 -68
- package/dist/domain/design/validation.js.map +1 -1
- package/dist/domain/design/visual-evidence.js +155 -0
- package/dist/domain/design/visual-evidence.js.map +1 -0
- package/dist/domain/flow/answer.js +459 -0
- package/dist/domain/flow/answer.js.map +1 -0
- package/dist/domain/flow/authority.js +2276 -0
- package/dist/domain/flow/authority.js.map +1 -0
- package/dist/domain/flow/authorization.js +62 -0
- package/dist/domain/flow/authorization.js.map +1 -0
- package/dist/domain/flow/directive.js +421 -0
- package/dist/domain/flow/directive.js.map +1 -0
- package/dist/domain/flow/rules.js +140 -0
- package/dist/domain/flow/rules.js.map +1 -0
- package/dist/domain/flow/run-state.js +317 -0
- package/dist/domain/flow/run-state.js.map +1 -0
- package/dist/domain/harnesses.js +21 -0
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/skills.js +13 -14
- package/dist/domain/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +5 -5
- package/skills/w/context/MANIFEST.json +38 -1
- package/skills/w/harness/HARNESS.md +20 -0
- package/skills/w/loops/CHASSIS.md +11 -20
- package/skills/w/loops/CODE-POLICIES.md +9 -15
- package/skills/w/loops/plan-exec-loop/LOOP.md +11 -13
- package/skills/w/loops/plan-new-loop/LOOP.md +6 -4
- package/skills/w/loops/plan-refine-loop/LOOP.md +5 -3
- package/skills/w/loops/quick-loop/LOOP.md +18 -26
- package/skills/w/loops/spec-refine-loop/LOOP.md +14 -18
- package/skills/w/modules/COMPACTION.md +2 -6
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +2 -0
- package/skills/w/modules/DESIGN-REFERENCES.md +15 -11
- package/skills/w/modules/IDEATION-GATE.md +3 -3
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +17 -36
- package/skills/w/modules/PLAN-INPUT.md +5 -3
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +3 -1
- package/skills/w/modules/PLAN-SPLIT-GATE.md +7 -5
- package/skills/w/modules/PROMPT-CONTINUITY.md +3 -1
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +4 -4
- package/skills/w/roles/README.md +2 -0
- package/skills/w/roles/design/CONTRACT.md +80 -0
- package/skills/w/roles/design/ROLE.md +7 -0
- package/skills/w/schemas/capability-descriptor.schema.json +260 -0
- package/skills/w/schemas/design/design-render-bundle.v1.schema.json +191 -0
- package/skills/w/schemas/design/design-rendition.v1.schema.json +232 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +29 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://workline.dev/schemas/capability-descriptor.schema.json",
|
|
4
|
+
"title": "Workline capability descriptor v1",
|
|
5
|
+
"description": "The cross-cutting contract an Agent Skill declares to become invocable by Workline. Not a design format and not part of the UI Design Package catalog: it says what a capability IS — operations, inputs, outputs, context, interaction, effects, floor, degradations, off policy and retirement — for any capability, design included.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"contract_version",
|
|
10
|
+
"name",
|
|
11
|
+
"purpose",
|
|
12
|
+
"exposure",
|
|
13
|
+
"default_operation",
|
|
14
|
+
"operations",
|
|
15
|
+
"floor",
|
|
16
|
+
"degradations",
|
|
17
|
+
"compatibility"
|
|
18
|
+
],
|
|
19
|
+
"properties": {
|
|
20
|
+
"contract_version": {
|
|
21
|
+
"description": "Version of THIS contract, not of the skill. An unknown value stops validation before any field is read.",
|
|
22
|
+
"const": 1
|
|
23
|
+
},
|
|
24
|
+
"name": {
|
|
25
|
+
"description": "The capability's only public identity. There is no parallel role ID: the binding slot and the capability are one name.",
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
28
|
+
},
|
|
29
|
+
"purpose": {
|
|
30
|
+
"description": "What the capability resolves, in one sentence. Discovery and generated help derive from here rather than restating it.",
|
|
31
|
+
"type": "string",
|
|
32
|
+
"minLength": 1
|
|
33
|
+
},
|
|
34
|
+
"exposure": {
|
|
35
|
+
"description": "Routes the capability opens. A skill declaring neither gets no Workline surface — installing a utility does not make it a capability.",
|
|
36
|
+
"type": "array",
|
|
37
|
+
"minItems": 1,
|
|
38
|
+
"uniqueItems": true,
|
|
39
|
+
"items": { "enum": ["direct", "compose"] }
|
|
40
|
+
},
|
|
41
|
+
"default_operation": {
|
|
42
|
+
"description": "Operation assumed when a caller names none. Null when every invocation must be explicit.",
|
|
43
|
+
"type": ["string", "null"],
|
|
44
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
45
|
+
},
|
|
46
|
+
"operations": {
|
|
47
|
+
"description": "The finite operation catalog. Anything outside it is refused, never improvised.",
|
|
48
|
+
"type": "array",
|
|
49
|
+
"minItems": 1,
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"additionalProperties": false,
|
|
53
|
+
"required": [
|
|
54
|
+
"name",
|
|
55
|
+
"summary",
|
|
56
|
+
"exposure",
|
|
57
|
+
"workspace",
|
|
58
|
+
"interaction",
|
|
59
|
+
"inputs",
|
|
60
|
+
"output",
|
|
61
|
+
"effects",
|
|
62
|
+
"off"
|
|
63
|
+
],
|
|
64
|
+
"properties": {
|
|
65
|
+
"name": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
68
|
+
},
|
|
69
|
+
"summary": {
|
|
70
|
+
"type": "string",
|
|
71
|
+
"minLength": 1
|
|
72
|
+
},
|
|
73
|
+
"exposure": {
|
|
74
|
+
"description": "Routes this operation answers on. Always a subset of the capability's own exposure.",
|
|
75
|
+
"type": "array",
|
|
76
|
+
"minItems": 1,
|
|
77
|
+
"uniqueItems": true,
|
|
78
|
+
"items": { "enum": ["direct", "compose"] }
|
|
79
|
+
},
|
|
80
|
+
"workspace": {
|
|
81
|
+
"description": "Whether the operation needs a Workline workspace. Being outside one returns an explicit result and never initializes Workline implicitly.",
|
|
82
|
+
"enum": ["required", "optional", "standalone"]
|
|
83
|
+
},
|
|
84
|
+
"interaction": {
|
|
85
|
+
"description": "Whether one attempt is the whole conversation, or the operation may answer `needs_input` and continue.",
|
|
86
|
+
"enum": ["single_pass", "needs_input"]
|
|
87
|
+
},
|
|
88
|
+
"inputs": {
|
|
89
|
+
"type": "array",
|
|
90
|
+
"items": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"additionalProperties": false,
|
|
93
|
+
"required": ["name", "kind", "required", "sensitivity", "schema"],
|
|
94
|
+
"properties": {
|
|
95
|
+
"name": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
98
|
+
},
|
|
99
|
+
"kind": { "enum": ["text", "reference", "attachment", "selection"] },
|
|
100
|
+
"required": { "type": "boolean" },
|
|
101
|
+
"sensitivity": {
|
|
102
|
+
"description": "Reading a sensitive source is never authorized by the invocation alone.",
|
|
103
|
+
"enum": ["public", "sensitive"]
|
|
104
|
+
},
|
|
105
|
+
"schema": {
|
|
106
|
+
"description": "Canonical format id when the input is schema-bearing, else null.",
|
|
107
|
+
"type": ["string", "null"],
|
|
108
|
+
"pattern": "^[a-z][a-z0-9.-]*/v[1-9][0-9]*$"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"output": {
|
|
114
|
+
"type": "object",
|
|
115
|
+
"additionalProperties": false,
|
|
116
|
+
"required": ["kind", "schema", "completeness"],
|
|
117
|
+
"properties": {
|
|
118
|
+
"kind": {
|
|
119
|
+
"description": "A typed value, a durable reference, or both. Host prose is never the payload a flow consumes.",
|
|
120
|
+
"enum": ["value", "reference", "value_and_reference"]
|
|
121
|
+
},
|
|
122
|
+
"schema": {
|
|
123
|
+
"type": ["string", "null"],
|
|
124
|
+
"pattern": "^[a-z][a-z0-9.-]*/v[1-9][0-9]*$"
|
|
125
|
+
},
|
|
126
|
+
"completeness": {
|
|
127
|
+
"description": "Completeness values this operation may report. A dimension separate from the outcome: `completed` still requires the requested profile's completeness.",
|
|
128
|
+
"type": "array",
|
|
129
|
+
"minItems": 1,
|
|
130
|
+
"uniqueItems": true,
|
|
131
|
+
"items": { "enum": ["complete", "partial"] }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"effects": {
|
|
136
|
+
"description": "Every class of effect the operation may exercise. An undeclared effect is never exercised, so `read_only` is a declaration and not the absence of one.",
|
|
137
|
+
"type": "array",
|
|
138
|
+
"minItems": 1,
|
|
139
|
+
"items": {
|
|
140
|
+
"type": "object",
|
|
141
|
+
"additionalProperties": false,
|
|
142
|
+
"required": ["class", "idempotent", "authorization", "approval"],
|
|
143
|
+
"properties": {
|
|
144
|
+
"class": {
|
|
145
|
+
"enum": [
|
|
146
|
+
"read_only",
|
|
147
|
+
"local_additive",
|
|
148
|
+
"mutate_overwrite",
|
|
149
|
+
"execute",
|
|
150
|
+
"network_external",
|
|
151
|
+
"destructive"
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
"idempotent": { "type": "boolean" },
|
|
155
|
+
"authorization": {
|
|
156
|
+
"description": "Granted by the invocation itself, or by a preflight the human sees first.",
|
|
157
|
+
"enum": ["invocation", "preflight"]
|
|
158
|
+
},
|
|
159
|
+
"approval": { "enum": ["none", "visible"] }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"off": {
|
|
164
|
+
"description": "What binding the capability `off` does to this operation. Never reverted by a host, a wrapper or a legacy name.",
|
|
165
|
+
"enum": ["blocked", "allowed"]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"floor": {
|
|
171
|
+
"description": "What runs with nothing installed. A capability a core gate needs carries its own implementation, so a missing external skill never blocks SPEC, PLAN or QUICK.",
|
|
172
|
+
"type": "object",
|
|
173
|
+
"additionalProperties": false,
|
|
174
|
+
"required": ["builtin", "kind", "improvements"],
|
|
175
|
+
"properties": {
|
|
176
|
+
"builtin": { "type": "boolean" },
|
|
177
|
+
"kind": { "enum": ["core", "feature"] },
|
|
178
|
+
"improvements": {
|
|
179
|
+
"description": "`host_selected` means the host decides which compatible improvements contribute and in what order; Workline imposes no universal precedence.",
|
|
180
|
+
"enum": ["host_selected", "none"]
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"degradations": {
|
|
185
|
+
"description": "The observable reasons a run may fall back, and what each one does. A cause not declared here is not a degradation, it is a failure.",
|
|
186
|
+
"type": "array",
|
|
187
|
+
"items": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"additionalProperties": false,
|
|
190
|
+
"required": ["cause", "action"],
|
|
191
|
+
"properties": {
|
|
192
|
+
"cause": {
|
|
193
|
+
"enum": [
|
|
194
|
+
"opaque_selection",
|
|
195
|
+
"incompatible_improvement",
|
|
196
|
+
"invalid_binding",
|
|
197
|
+
"digest_changed"
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
"action": { "enum": ["floor", "reject"] }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"compatibility": {
|
|
205
|
+
"type": "object",
|
|
206
|
+
"additionalProperties": false,
|
|
207
|
+
"required": [
|
|
208
|
+
"status",
|
|
209
|
+
"minimum_contract_version",
|
|
210
|
+
"improves",
|
|
211
|
+
"retired_names",
|
|
212
|
+
"retired_formats"
|
|
213
|
+
],
|
|
214
|
+
"properties": {
|
|
215
|
+
"status": { "enum": ["active", "deprecated"] },
|
|
216
|
+
"minimum_contract_version": {
|
|
217
|
+
"type": "integer",
|
|
218
|
+
"minimum": 1
|
|
219
|
+
},
|
|
220
|
+
"improves": {
|
|
221
|
+
"description": "What this descriptor improves, in its OWN words. Null when the descriptor IS the capability. Installed never implies compatible: the resolution verifies this claim against the capability being resolved before the improvement contributes or produces any effect.",
|
|
222
|
+
"type": ["object", "null"],
|
|
223
|
+
"additionalProperties": false,
|
|
224
|
+
"required": ["capability", "operations", "contract_version"],
|
|
225
|
+
"properties": {
|
|
226
|
+
"capability": {
|
|
227
|
+
"type": "string",
|
|
228
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
229
|
+
},
|
|
230
|
+
"operations": {
|
|
231
|
+
"type": "array",
|
|
232
|
+
"minItems": 1,
|
|
233
|
+
"items": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"contract_version": {
|
|
239
|
+
"type": "integer",
|
|
240
|
+
"minimum": 1
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"retired_names": {
|
|
245
|
+
"description": "Names that are NOT aliases. A binding, invocation or descriptor using one fails with guidance to adopt the live name; it never resolves silently.",
|
|
246
|
+
"type": "array",
|
|
247
|
+
"items": {
|
|
248
|
+
"type": "string",
|
|
249
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"retired_formats": {
|
|
253
|
+
"description": "Formats unsupported as a source: never read, imported, converted or migrated, and unable to satisfy a gate. The files themselves are left intact.",
|
|
254
|
+
"type": "array",
|
|
255
|
+
"items": { "type": "string", "minLength": 1 }
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://workline.dev/schemas/design/design-render-bundle.v1.schema.json",
|
|
4
|
+
"title": "Workline UI Design Package v1 — Render Context Bundle",
|
|
5
|
+
"description": "The single exchange payload every renderer and adapter receives. Deterministic for a baseline, a selection and an adapter profile: the digest is taken over canonical JSON without `digest` and without `generated`, so two equivalent runs seal the same bytes. It carries context, never authority — an integration transforms it over its own copy and the package stays untouched.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"package",
|
|
11
|
+
"baseline",
|
|
12
|
+
"baseline_digest",
|
|
13
|
+
"adapter",
|
|
14
|
+
"roots",
|
|
15
|
+
"closure",
|
|
16
|
+
"assets",
|
|
17
|
+
"data_classification",
|
|
18
|
+
"accessibility",
|
|
19
|
+
"losses",
|
|
20
|
+
"digest",
|
|
21
|
+
"generated"
|
|
22
|
+
],
|
|
23
|
+
"properties": {
|
|
24
|
+
"schema": {
|
|
25
|
+
"const": "workline.design-render-bundle/v1"
|
|
26
|
+
},
|
|
27
|
+
"package": {
|
|
28
|
+
"description": "The package this bundle was cut from.",
|
|
29
|
+
"type": "string",
|
|
30
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})$"
|
|
31
|
+
},
|
|
32
|
+
"baseline": {
|
|
33
|
+
"description": "The published revision the selection was read at.",
|
|
34
|
+
"$ref": "#/$defs/revision"
|
|
35
|
+
},
|
|
36
|
+
"baseline_digest": {
|
|
37
|
+
"$ref": "#/$defs/digest"
|
|
38
|
+
},
|
|
39
|
+
"adapter": {
|
|
40
|
+
"description": "Which profile, at which version, this bundle was cut for. Determinism is a promise PER profile version: a profile that changes what it needs produces a different bundle.",
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"required": ["profile", "version"],
|
|
44
|
+
"properties": {
|
|
45
|
+
"profile": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
|
|
48
|
+
},
|
|
49
|
+
"version": {
|
|
50
|
+
"type": "integer",
|
|
51
|
+
"minimum": 1
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"roots": {
|
|
56
|
+
"description": "The selection, sorted. A selection is a set, so the order it was typed in is not part of the bundle. An anchor is allowed here: a root may ask for one state.",
|
|
57
|
+
"type": "array",
|
|
58
|
+
"minItems": 1,
|
|
59
|
+
"uniqueItems": true,
|
|
60
|
+
"items": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"closure": {
|
|
66
|
+
"description": "Every revision the selection reaches, ordered by reference, with the content type and the digest of the bytes found on disk.",
|
|
67
|
+
"type": "array",
|
|
68
|
+
"items": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
"required": ["ref", "kind", "path", "content_type", "sha256", "states"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"ref": {
|
|
74
|
+
"description": "The revision, never anchored: the states demanded travel in `states`.",
|
|
75
|
+
"type": "string",
|
|
76
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
|
|
77
|
+
},
|
|
78
|
+
"kind": {
|
|
79
|
+
"enum": ["flow", "screen", "rule", "token", "rendition"]
|
|
80
|
+
},
|
|
81
|
+
"path": {
|
|
82
|
+
"description": "Package-relative path. Never absolute and never escaping the package.",
|
|
83
|
+
"type": "string",
|
|
84
|
+
"minLength": 1
|
|
85
|
+
},
|
|
86
|
+
"content_type": {
|
|
87
|
+
"description": "Declared, not sniffed: a renderer decides how to read a member from this field.",
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1
|
|
90
|
+
},
|
|
91
|
+
"sha256": {
|
|
92
|
+
"$ref": "#/$defs/digest"
|
|
93
|
+
},
|
|
94
|
+
"states": {
|
|
95
|
+
"description": "State anchors the selection asked for. Empty means the whole revision.",
|
|
96
|
+
"type": "array",
|
|
97
|
+
"uniqueItems": true,
|
|
98
|
+
"items": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"assets": {
|
|
107
|
+
"description": "The assets this bundle is allowed to hand over — only bytes the package custodies.",
|
|
108
|
+
"type": "array",
|
|
109
|
+
"items": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"additionalProperties": false,
|
|
112
|
+
"required": ["digest", "path", "content_type"],
|
|
113
|
+
"properties": {
|
|
114
|
+
"digest": {
|
|
115
|
+
"$ref": "#/$defs/digest"
|
|
116
|
+
},
|
|
117
|
+
"path": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"pattern": "^assets/"
|
|
120
|
+
},
|
|
121
|
+
"content_type": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"minLength": 1
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"data_classification": {
|
|
129
|
+
"description": "How the material was prepared. `synthetic` is the default; `real` is an authorization somebody had to give.",
|
|
130
|
+
"enum": ["synthetic", "redacted", "real"]
|
|
131
|
+
},
|
|
132
|
+
"accessibility": {
|
|
133
|
+
"description": "The accessibility obligations the selected revisions state. A design states them; a rendition never discharges them.",
|
|
134
|
+
"type": "array",
|
|
135
|
+
"items": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"additionalProperties": false,
|
|
138
|
+
"required": ["ref", "statement"],
|
|
139
|
+
"properties": {
|
|
140
|
+
"ref": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
143
|
+
},
|
|
144
|
+
"statement": {
|
|
145
|
+
"type": "string",
|
|
146
|
+
"minLength": 1
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"losses": {
|
|
152
|
+
"description": "What this profile cannot represent, enumerated instead of omitted. A loss is part of the result, not a defect.",
|
|
153
|
+
"type": "array",
|
|
154
|
+
"items": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"additionalProperties": false,
|
|
157
|
+
"required": ["subject", "why"],
|
|
158
|
+
"properties": {
|
|
159
|
+
"subject": {
|
|
160
|
+
"description": "What is lost: `capability:pull`, `section:localization`, `medium:motion`.",
|
|
161
|
+
"type": "string",
|
|
162
|
+
"minLength": 1
|
|
163
|
+
},
|
|
164
|
+
"why": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"minLength": 1
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"digest": {
|
|
172
|
+
"description": "Over canonical JSON of this object WITHOUT `digest` and WITHOUT `generated`. That exclusion is the determinism boundary made checkable.",
|
|
173
|
+
"$ref": "#/$defs/digest"
|
|
174
|
+
},
|
|
175
|
+
"generated": {
|
|
176
|
+
"description": "YYYY-MM-DD. Outside the seal: a date is not part of what was selected.",
|
|
177
|
+
"type": "string",
|
|
178
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"$defs": {
|
|
182
|
+
"revision": {
|
|
183
|
+
"type": "integer",
|
|
184
|
+
"minimum": 1
|
|
185
|
+
},
|
|
186
|
+
"digest": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://workline.dev/schemas/design/design-rendition.v1.schema.json",
|
|
4
|
+
"title": "Workline UI Design Package v1 — Design Rendition",
|
|
5
|
+
"description": "What a picture of a design knows about itself. Three separations never collapse here: fidelity is a property of the picture and never moves the screen's maturity; staleness against the source is DERIVED (`source_digest` is recomputable from the sources' bytes) while sync with the provider is a claim and lives inside `provider`; and a locator locates without ever identifying — it never replaces the Workline id, revision or digest, and never carries a credential.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"id",
|
|
11
|
+
"revision",
|
|
12
|
+
"supersedes",
|
|
13
|
+
"purpose",
|
|
14
|
+
"medium",
|
|
15
|
+
"fidelity",
|
|
16
|
+
"tool",
|
|
17
|
+
"format",
|
|
18
|
+
"context",
|
|
19
|
+
"sources",
|
|
20
|
+
"source_digest",
|
|
21
|
+
"coverage",
|
|
22
|
+
"files",
|
|
23
|
+
"provider",
|
|
24
|
+
"access",
|
|
25
|
+
"interaction_evidence",
|
|
26
|
+
"data_classification"
|
|
27
|
+
],
|
|
28
|
+
"properties": {
|
|
29
|
+
"schema": {
|
|
30
|
+
"const": "workline.design-rendition/v1"
|
|
31
|
+
},
|
|
32
|
+
"id": {
|
|
33
|
+
"description": "Qualified identity WITHOUT the revision — the revision is its own field.",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/VIS-(?:[0-9]{3}|[1-9][0-9]{3,})$"
|
|
36
|
+
},
|
|
37
|
+
"revision": {
|
|
38
|
+
"type": "integer",
|
|
39
|
+
"minimum": 1
|
|
40
|
+
},
|
|
41
|
+
"supersedes": {
|
|
42
|
+
"description": "An EARLIER revision of this same rendition, or null.",
|
|
43
|
+
"type": ["string", "null"],
|
|
44
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/VIS-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
|
|
45
|
+
},
|
|
46
|
+
"purpose": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1
|
|
49
|
+
},
|
|
50
|
+
"medium": {
|
|
51
|
+
"description": "What kind of artifact it is. Only `prototype` and `storyboard` can sustain interaction evidence — a still frame cannot show a transition.",
|
|
52
|
+
"enum": ["static_image", "document", "interactive_html", "prototype", "storyboard"]
|
|
53
|
+
},
|
|
54
|
+
"fidelity": {
|
|
55
|
+
"description": "How polished the PICTURE is. Deliberately not sharing vocabulary with maturity: raising fidelity never promotes a screen.",
|
|
56
|
+
"enum": ["low", "medium", "high"]
|
|
57
|
+
},
|
|
58
|
+
"tool": {
|
|
59
|
+
"description": "The tool that produced it, as a human would name it.",
|
|
60
|
+
"type": "string",
|
|
61
|
+
"minLength": 1
|
|
62
|
+
},
|
|
63
|
+
"format": {
|
|
64
|
+
"description": "Closed so it can be cross-checked against the file actually on disk.",
|
|
65
|
+
"enum": ["svg", "png", "jpeg", "webp", "pdf", "html"]
|
|
66
|
+
},
|
|
67
|
+
"context": {
|
|
68
|
+
"description": "The same design looks different depending on where it was rendered.",
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
"required": ["platform", "viewport", "theme", "locale", "variants"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"platform": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 1
|
|
76
|
+
},
|
|
77
|
+
"viewport": {
|
|
78
|
+
"description": "`1280x800`, `390x844`, or a named breakpoint.",
|
|
79
|
+
"type": "string",
|
|
80
|
+
"minLength": 1
|
|
81
|
+
},
|
|
82
|
+
"theme": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"minLength": 1
|
|
85
|
+
},
|
|
86
|
+
"locale": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"minLength": 1
|
|
89
|
+
},
|
|
90
|
+
"variants": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"uniqueItems": true,
|
|
93
|
+
"items": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"minLength": 1
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"sources": {
|
|
101
|
+
"description": "The exact revisions this rendition was produced from, with the bytes it saw. An anchor is meaningful here: a preview of one state is a preview of one state.",
|
|
102
|
+
"type": "array",
|
|
103
|
+
"minItems": 1,
|
|
104
|
+
"items": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"required": ["ref", "sha256"],
|
|
108
|
+
"properties": {
|
|
109
|
+
"ref": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
112
|
+
},
|
|
113
|
+
"sha256": {
|
|
114
|
+
"$ref": "#/$defs/digest"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"source_digest": {
|
|
120
|
+
"description": "One digest over the canonical list of `sources`. Recomputable from the package as it stands right now — that is what makes obsolescence detectable instead of asserted.",
|
|
121
|
+
"$ref": "#/$defs/digest"
|
|
122
|
+
},
|
|
123
|
+
"coverage": {
|
|
124
|
+
"description": "What this rendition demonstrates, in the screen's own vocabulary. The reverse direction of the screen's classification matrix; the handoff gate crosses the two.",
|
|
125
|
+
"type": "object",
|
|
126
|
+
"additionalProperties": false,
|
|
127
|
+
"required": ["criteria", "states"],
|
|
128
|
+
"properties": {
|
|
129
|
+
"criteria": {
|
|
130
|
+
"type": "array",
|
|
131
|
+
"uniqueItems": true,
|
|
132
|
+
"items": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"pattern": "^S\\d{3}/AC-(?:[A-Z]+-)?\\d+$"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"states": {
|
|
138
|
+
"type": "array",
|
|
139
|
+
"uniqueItems": true,
|
|
140
|
+
"items": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"files": {
|
|
148
|
+
"description": "The local evidence, relative to the rendition's OWN directory. Never empty: a rendition with no local file is exactly the evidence that disappears when the provider does.",
|
|
149
|
+
"type": "array",
|
|
150
|
+
"minItems": 1,
|
|
151
|
+
"items": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"additionalProperties": false,
|
|
154
|
+
"required": ["path", "sha256"],
|
|
155
|
+
"properties": {
|
|
156
|
+
"path": {
|
|
157
|
+
"description": "`preview.svg` — relative to this rendition's folder, never escaping it.",
|
|
158
|
+
"type": "string",
|
|
159
|
+
"minLength": 1
|
|
160
|
+
},
|
|
161
|
+
"sha256": {
|
|
162
|
+
"$ref": "#/$defs/digest"
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"provider": {
|
|
168
|
+
"description": "The external object, when there is one. `sync` lives in here because it only means something once a provider copy exists.",
|
|
169
|
+
"type": ["object", "null"],
|
|
170
|
+
"additionalProperties": false,
|
|
171
|
+
"required": ["name", "locator", "version", "sync"],
|
|
172
|
+
"properties": {
|
|
173
|
+
"name": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"minLength": 1
|
|
176
|
+
},
|
|
177
|
+
"locator": {
|
|
178
|
+
"description": "Provider-shaped keys (`file_key`, `node_id`, `project_id`, `artifact`, …). The key set is the adapter profile's business, not this schema's. Never a credential.",
|
|
179
|
+
"type": "object",
|
|
180
|
+
"minProperties": 1,
|
|
181
|
+
"additionalProperties": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"minLength": 1
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"version": {
|
|
187
|
+
"description": "The provider's own version identity, or null when it has no stable one.",
|
|
188
|
+
"type": ["string", "null"],
|
|
189
|
+
"minLength": 1
|
|
190
|
+
},
|
|
191
|
+
"sync": {
|
|
192
|
+
"description": "A CLAIM about the provider's copy, not a derivation. `unknown` is the honest answer without consulting it.",
|
|
193
|
+
"enum": ["in_sync", "diverged", "unknown"]
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"access": {
|
|
198
|
+
"description": "Who can reach the editable original, as a class. `local_only` is what keeps working when the provider does not.",
|
|
199
|
+
"enum": ["local_only", "public", "link_shared", "team", "private"]
|
|
200
|
+
},
|
|
201
|
+
"interaction_evidence": {
|
|
202
|
+
"description": "A trigger, a transition and an outcome — what a still frame cannot show. Null for a static rendition.",
|
|
203
|
+
"type": ["object", "null"],
|
|
204
|
+
"additionalProperties": false,
|
|
205
|
+
"required": ["trigger", "transition", "outcome"],
|
|
206
|
+
"properties": {
|
|
207
|
+
"trigger": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"minLength": 1
|
|
210
|
+
},
|
|
211
|
+
"transition": {
|
|
212
|
+
"type": "string",
|
|
213
|
+
"minLength": 1
|
|
214
|
+
},
|
|
215
|
+
"outcome": {
|
|
216
|
+
"type": "string",
|
|
217
|
+
"minLength": 1
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"data_classification": {
|
|
222
|
+
"description": "How the material shown was prepared. `synthetic` is the default; `real` is an authorization somebody had to give.",
|
|
223
|
+
"enum": ["synthetic", "redacted", "real"]
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"$defs": {
|
|
227
|
+
"digest": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|