@agentproto/corpus-cli 0.1.0-alpha.1 → 0.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +43 -8
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.mjs +15 -4
- package/dist/index.mjs.map +1 -1
- package/dist/specs/resources/aip-10/draft/KNOWLEDGE.schema.json +457 -0
- package/dist/specs/resources/aip-11/draft/LESSON.schema.json +149 -0
- package/dist/specs/resources/aip-12/draft/PLAYBOOK.schema.json +349 -0
- package/dist/specs/resources/aip-13/draft/WORK_ITEM.schema.json +547 -0
- package/dist/specs/resources/aip-14/draft/TOOL.schema.json +169 -0
- package/dist/specs/resources/aip-15/draft/WORKFLOW.schema.json +356 -0
- package/dist/specs/resources/aip-16/draft/IO.schema.json +64 -0
- package/dist/specs/resources/aip-17/draft/RUNNER.schema.json +81 -0
- package/dist/specs/resources/aip-18/draft/COLLECTION.schema.json +436 -0
- package/dist/specs/resources/aip-19/draft/SECRETS.schema.json +261 -0
- package/dist/specs/resources/aip-20/draft/WORK.schema.json +371 -0
- package/dist/specs/resources/aip-21/draft/AGENCY.schema.json +454 -0
- package/dist/specs/resources/aip-22/draft/OFFICE.schema.json +390 -0
- package/dist/specs/resources/aip-23/draft/IDENTITY.schema.json +358 -0
- package/dist/specs/resources/aip-24/draft/ASSEMBLY.schema.json +411 -0
- package/dist/specs/resources/aip-25/draft/PERSONA.schema.json +257 -0
- package/dist/specs/resources/aip-26/draft/CODE.schema.json +172 -0
- package/dist/specs/resources/aip-28/draft/INTENT.schema.json +215 -0
- package/dist/specs/resources/aip-29/draft/CLI.schema.json +339 -0
- package/dist/specs/resources/aip-3/draft/SKILL.schema.json +206 -0
- package/dist/specs/resources/aip-30/draft/DRIVER.schema.json +237 -0
- package/dist/specs/resources/aip-31/draft/HTTP.schema.json +80 -0
- package/dist/specs/resources/aip-32/draft/MCP.schema.json +88 -0
- package/dist/specs/resources/aip-33/draft/SDK.schema.json +60 -0
- package/dist/specs/resources/aip-34/draft/WORKSPACE.schema.json +252 -0
- package/dist/specs/resources/aip-35/draft/STORAGE.schema.json +237 -0
- package/dist/specs/resources/aip-36/draft/SANDBOX.schema.json +246 -0
- package/dist/specs/resources/aip-38/draft/POLICY.schema.json +217 -0
- package/dist/specs/resources/aip-39/draft/ACTION.schema.json +134 -0
- package/dist/specs/resources/aip-4/draft/DESIGN.schema.json +189 -0
- package/dist/specs/resources/aip-40/draft/EXTENSION.schema.json +116 -0
- package/dist/specs/resources/aip-41/draft/ROUTINE.schema.json +345 -0
- package/dist/specs/resources/aip-42/draft/AGENT.schema.json +268 -0
- package/dist/specs/resources/aip-44/draft/ACP.schema.json +170 -0
- package/dist/specs/resources/aip-45/draft/AGENT-CLI.schema.json +371 -0
- package/dist/specs/resources/aip-47/draft/ROLE.schema.json +199 -0
- package/dist/specs/resources/aip-48/draft/MultiAgentRuntime.schema.json +108 -0
- package/dist/specs/resources/aip-5/draft/TEMPLATE.schema.json +231 -0
- package/dist/specs/resources/aip-6/draft/COMPANY.schema.json +268 -0
- package/dist/specs/resources/aip-7/draft/GOVERNANCE.schema.json +581 -0
- package/dist/specs/resources/aip-8/draft/AGENCY.schema.json +518 -0
- package/dist/specs/resources/aip-9/draft/OPERATOR.schema.json +297 -0
- package/package.json +2 -2
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://agentproto.sh/schemas/aip-13/WORK_ITEM.schema.json",
|
|
4
|
+
"title": "agentwork/v1 frontmatter (AIP-13)",
|
|
5
|
+
"description": "Validates the YAML frontmatter portion of an AIP-13 doctype. The `schema` discriminator selects between the work-item branch (project / initiative / task — the original `work/v1` doctype, with the `kind` field discriminating the three variants) and the workspace branch (`work.workspace/v1` — used both as the workspace-root manifest at the company root and as a per-consumer view that extends a parent manifest).",
|
|
6
|
+
"oneOf": [{ "$ref": "#/$defs/workItem" }, { "$ref": "#/$defs/workspace" }],
|
|
7
|
+
"$defs": {
|
|
8
|
+
"workItem": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"required": ["schema", "slug", "kind", "title", "status", "scope"],
|
|
11
|
+
"properties": {
|
|
12
|
+
"schema": {
|
|
13
|
+
"const": "work/v1",
|
|
14
|
+
"description": "Spec discriminator. Always 'work/v1' for the project / initiative / task doctypes."
|
|
15
|
+
},
|
|
16
|
+
"slug": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"minLength": 2,
|
|
19
|
+
"maxLength": 64,
|
|
20
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$",
|
|
21
|
+
"description": "Machine identifier. Lowercase, digits, dashes. Unique within (company, kind)."
|
|
22
|
+
},
|
|
23
|
+
"kind": {
|
|
24
|
+
"enum": ["project", "initiative", "task"],
|
|
25
|
+
"description": "The doctype variant. Drives per-kind constraints."
|
|
26
|
+
},
|
|
27
|
+
"title": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"minLength": 1,
|
|
30
|
+
"maxLength": 200,
|
|
31
|
+
"description": "Human-readable display title."
|
|
32
|
+
},
|
|
33
|
+
"status": {
|
|
34
|
+
"enum": [
|
|
35
|
+
"open",
|
|
36
|
+
"claimed",
|
|
37
|
+
"in-progress",
|
|
38
|
+
"blocked",
|
|
39
|
+
"done",
|
|
40
|
+
"archived"
|
|
41
|
+
],
|
|
42
|
+
"description": "Current status. Transitions enforced by the host."
|
|
43
|
+
},
|
|
44
|
+
"parent": {
|
|
45
|
+
"oneOf": [
|
|
46
|
+
{ "type": "null" },
|
|
47
|
+
{
|
|
48
|
+
"type": "object",
|
|
49
|
+
"required": ["kind", "ref"],
|
|
50
|
+
"additionalProperties": false,
|
|
51
|
+
"properties": {
|
|
52
|
+
"kind": { "enum": ["project", "initiative"] },
|
|
53
|
+
"ref": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"description": "Containment axis — what this is part of. Cascade-delete semantics. Null for top-level."
|
|
61
|
+
},
|
|
62
|
+
"scope": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"additionalProperties": false,
|
|
65
|
+
"properties": {
|
|
66
|
+
"company": {
|
|
67
|
+
"type": ["string", "null"],
|
|
68
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
69
|
+
},
|
|
70
|
+
"role": {
|
|
71
|
+
"type": ["string", "null"],
|
|
72
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
73
|
+
},
|
|
74
|
+
"operator": {
|
|
75
|
+
"type": ["string", "null"],
|
|
76
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
77
|
+
},
|
|
78
|
+
"project": {
|
|
79
|
+
"type": ["string", "null"],
|
|
80
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"description": "Applicability axis — most-restrictive non-empty field wins; AND across fields. Inherits from parent when empty."
|
|
84
|
+
},
|
|
85
|
+
"assignee": {
|
|
86
|
+
"oneOf": [
|
|
87
|
+
{ "type": "null" },
|
|
88
|
+
{
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": ["kind", "ref"],
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"properties": {
|
|
93
|
+
"kind": { "enum": ["operator", "user"] },
|
|
94
|
+
"ref": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"description": "Ownership axis — tasks only. Null = unclaimed."
|
|
99
|
+
},
|
|
100
|
+
"lead": {
|
|
101
|
+
"oneOf": [
|
|
102
|
+
{ "type": "null" },
|
|
103
|
+
{
|
|
104
|
+
"type": "object",
|
|
105
|
+
"required": ["kind", "ref"],
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"properties": {
|
|
108
|
+
"kind": { "enum": ["operator", "user"] },
|
|
109
|
+
"ref": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"description": "Ownership axis — projects and initiatives only. Null = unassigned."
|
|
114
|
+
},
|
|
115
|
+
"members": {
|
|
116
|
+
"type": "array",
|
|
117
|
+
"items": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"required": ["kind", "ref"],
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"properties": {
|
|
122
|
+
"kind": { "enum": ["operator", "user", "role"] },
|
|
123
|
+
"ref": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"default": [],
|
|
127
|
+
"description": "Projects only — explicit member list when access is narrower than role-based."
|
|
128
|
+
},
|
|
129
|
+
"attachments": {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"additionalProperties": false,
|
|
132
|
+
"properties": {
|
|
133
|
+
"artifacts": { "type": "array", "items": { "type": "string" } },
|
|
134
|
+
"wiki": {
|
|
135
|
+
"type": "array",
|
|
136
|
+
"items": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"lessons": {
|
|
142
|
+
"type": "array",
|
|
143
|
+
"items": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
"conversations": { "type": "array", "items": { "type": "string" } },
|
|
149
|
+
"deliverables": {
|
|
150
|
+
"type": "array",
|
|
151
|
+
"items": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
"objectives": {
|
|
157
|
+
"type": "array",
|
|
158
|
+
"items": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"description": "Inert references — informational only. NOT containment. Removing target MUST NOT cascade."
|
|
165
|
+
},
|
|
166
|
+
"governance": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"additionalProperties": false,
|
|
169
|
+
"properties": {
|
|
170
|
+
"approval_required": { "type": "boolean", "default": false },
|
|
171
|
+
"signers": {
|
|
172
|
+
"type": "array",
|
|
173
|
+
"items": {
|
|
174
|
+
"type": "object",
|
|
175
|
+
"required": ["kind", "ref"],
|
|
176
|
+
"additionalProperties": false,
|
|
177
|
+
"properties": {
|
|
178
|
+
"kind": { "enum": ["operator", "user", "role"] },
|
|
179
|
+
"ref": { "type": "string" }
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"default": []
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"description": "AIP-7 governance hooks."
|
|
186
|
+
},
|
|
187
|
+
"deadline": {
|
|
188
|
+
"type": ["string", "null"],
|
|
189
|
+
"format": "date-time",
|
|
190
|
+
"description": "Optional ISO 8601 deadline."
|
|
191
|
+
},
|
|
192
|
+
"priority": {
|
|
193
|
+
"enum": ["low", "normal", "high"],
|
|
194
|
+
"default": "normal"
|
|
195
|
+
},
|
|
196
|
+
"labels": {
|
|
197
|
+
"type": "array",
|
|
198
|
+
"items": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
|
|
199
|
+
"default": []
|
|
200
|
+
},
|
|
201
|
+
"metadata": {
|
|
202
|
+
"type": "object",
|
|
203
|
+
"additionalProperties": true,
|
|
204
|
+
"default": {},
|
|
205
|
+
"description": "Vendor extensions under metadata.<vendor>.<field>."
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"allOf": [
|
|
209
|
+
{
|
|
210
|
+
"if": {
|
|
211
|
+
"properties": { "kind": { "const": "task" } },
|
|
212
|
+
"required": ["kind"]
|
|
213
|
+
},
|
|
214
|
+
"then": {
|
|
215
|
+
"not": { "required": ["lead"] },
|
|
216
|
+
"description": "Tasks MUST NOT use 'lead' — they have an 'assignee'."
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"if": {
|
|
221
|
+
"properties": { "kind": { "const": "project" } },
|
|
222
|
+
"required": ["kind"]
|
|
223
|
+
},
|
|
224
|
+
"then": {
|
|
225
|
+
"not": { "required": ["assignee"] },
|
|
226
|
+
"description": "Projects MUST NOT use 'assignee' — they have a 'lead'."
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"if": {
|
|
231
|
+
"properties": { "kind": { "const": "initiative" } },
|
|
232
|
+
"required": ["kind"]
|
|
233
|
+
},
|
|
234
|
+
"then": {
|
|
235
|
+
"not": { "required": ["assignee"] },
|
|
236
|
+
"description": "Initiatives MUST NOT use 'assignee' — they have a 'lead'."
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"if": {
|
|
241
|
+
"properties": {
|
|
242
|
+
"kind": { "not": { "const": "project" } }
|
|
243
|
+
},
|
|
244
|
+
"required": ["kind"]
|
|
245
|
+
},
|
|
246
|
+
"then": {
|
|
247
|
+
"not": { "required": ["members"] },
|
|
248
|
+
"description": "Only projects MAY declare 'members'."
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"if": {
|
|
253
|
+
"anyOf": [
|
|
254
|
+
{ "not": { "required": ["parent"] } },
|
|
255
|
+
{ "properties": { "parent": { "const": null } } }
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
"then": {
|
|
259
|
+
"properties": {
|
|
260
|
+
"scope": { "required": ["company"] }
|
|
261
|
+
},
|
|
262
|
+
"description": "Top-level doctypes (no parent) MUST set scope.company."
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
"workspace": {
|
|
268
|
+
"type": "object",
|
|
269
|
+
"required": ["schema", "name", "title", "description", "version"],
|
|
270
|
+
"additionalProperties": false,
|
|
271
|
+
"description": "Workspace manifest doctype. Used both as the root manifest of a work tree (no `extends`) and as a per-consumer view (with `extends`). The same schema validates both modes; the host distinguishes by whether `extends` is set. Mirrors the AIP-10 `knowledge.workspace/v1` shape so the registry-of-views pattern is uniform across the AIP family.",
|
|
272
|
+
"properties": {
|
|
273
|
+
"schema": {
|
|
274
|
+
"const": "work.workspace/v1",
|
|
275
|
+
"description": "Discriminator for the workspace manifest doctype."
|
|
276
|
+
},
|
|
277
|
+
"name": {
|
|
278
|
+
"type": "string",
|
|
279
|
+
"minLength": 2,
|
|
280
|
+
"maxLength": 96,
|
|
281
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$",
|
|
282
|
+
"description": "Stable kebab-case identifier for the workspace or view."
|
|
283
|
+
},
|
|
284
|
+
"title": {
|
|
285
|
+
"type": "string",
|
|
286
|
+
"minLength": 1,
|
|
287
|
+
"maxLength": 200,
|
|
288
|
+
"description": "Human-readable workspace title."
|
|
289
|
+
},
|
|
290
|
+
"description": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"minLength": 1,
|
|
293
|
+
"maxLength": 2000,
|
|
294
|
+
"description": "One-paragraph statement of purpose: what this workspace (or view) is for and who uses it."
|
|
295
|
+
},
|
|
296
|
+
"version": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[A-Za-z0-9.-]+)?$",
|
|
299
|
+
"description": "Semantic version of the WORKSPACE shape. Bump on itemKinds / statuses / lints / scope-default changes. Independent of the work tree's content version."
|
|
300
|
+
},
|
|
301
|
+
"extends": {
|
|
302
|
+
"type": "string",
|
|
303
|
+
"minLength": 1,
|
|
304
|
+
"maxLength": 512,
|
|
305
|
+
"pattern": "^(\\.\\./|\\./)[^\\s]+/WORK\\.md$",
|
|
306
|
+
"description": "OPTIONAL — relative path to a parent WORK.md. Presence makes the manifest a VIEW; absence makes it a WORKSPACE ROOT. Recursive composition: parents may themselves declare `extends`. Maximum chain depth is 8."
|
|
307
|
+
},
|
|
308
|
+
"appliesTo": {
|
|
309
|
+
"type": "array",
|
|
310
|
+
"items": {
|
|
311
|
+
"type": "string",
|
|
312
|
+
"pattern": "^(ws://(operators|companies|skills)/[a-z][a-z0-9-]*|\\.\\./[^\\s]+)$",
|
|
313
|
+
"description": "Either a ws:// ref to an AIP-9 operator / AIP-6 company / AIP-3 skill, or a relative path to a consumer workspace folder."
|
|
314
|
+
},
|
|
315
|
+
"uniqueItems": true,
|
|
316
|
+
"description": "OPTIONAL — list of consumers this VIEW adapts the workspace for. Hosts MUST refuse the view if any binding does not resolve. Not inherited; views declare their own scope."
|
|
317
|
+
},
|
|
318
|
+
"executor": {
|
|
319
|
+
"type": "string",
|
|
320
|
+
"pattern": "^ws://operators/[a-z][a-z0-9-]*$",
|
|
321
|
+
"description": "OPTIONAL — AIP-9 operator that runs work items emitted by this workspace (e.g. picks up `claimed` tasks, drives `in-progress`). The host activates this operator for the workspace's automation passes."
|
|
322
|
+
},
|
|
323
|
+
"governance": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"minLength": 1,
|
|
326
|
+
"maxLength": 512,
|
|
327
|
+
"description": "OPTIONAL — AIP-7 policy or audit binding. May be a path to an AIP-7 policy file or a ws:// ref. Approval gates on status transitions and assignment changes flow through this ref."
|
|
328
|
+
},
|
|
329
|
+
"knowledge": {
|
|
330
|
+
"type": "string",
|
|
331
|
+
"minLength": 1,
|
|
332
|
+
"maxLength": 512,
|
|
333
|
+
"description": "OPTIONAL — AIP-10 wiki this workspace refers to. Typically a `ws://wikis/<slug>/KNOWLEDGE.md` ref or a relative path to a KNOWLEDGE.md. Lets work items resolve `attachments.wiki[]` against the bound wiki by default."
|
|
334
|
+
},
|
|
335
|
+
"itemKinds": {
|
|
336
|
+
"type": "array",
|
|
337
|
+
"items": {
|
|
338
|
+
"type": "object",
|
|
339
|
+
"required": ["name"],
|
|
340
|
+
"additionalProperties": false,
|
|
341
|
+
"properties": {
|
|
342
|
+
"name": {
|
|
343
|
+
"type": "string",
|
|
344
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
345
|
+
"description": "Kind name. Matches the `kind` field on a work-item doctype. Merge key when composing with extends parent."
|
|
346
|
+
},
|
|
347
|
+
"enabled": {
|
|
348
|
+
"type": "boolean",
|
|
349
|
+
"default": true,
|
|
350
|
+
"description": "Whether this kind is allowed in the workspace. Child views can disable a parent's kind by setting `enabled: false`."
|
|
351
|
+
},
|
|
352
|
+
"fields": {
|
|
353
|
+
"type": "array",
|
|
354
|
+
"items": {
|
|
355
|
+
"type": "string",
|
|
356
|
+
"pattern": "^[a-z][A-Za-z0-9_]*$"
|
|
357
|
+
},
|
|
358
|
+
"default": [],
|
|
359
|
+
"description": "Canonical fields beyond the base spec. Child views append fields to parent's set."
|
|
360
|
+
},
|
|
361
|
+
"icon": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"maxLength": 8,
|
|
364
|
+
"description": "OPTIONAL — display hint, typically a single emoji."
|
|
365
|
+
},
|
|
366
|
+
"description": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"maxLength": 1000,
|
|
369
|
+
"description": "OPTIONAL — prose describing what items of this kind capture."
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
"default": [],
|
|
374
|
+
"description": "Work-item kinds this workspace tracks. Merge-by-name against the extends parent: a child entry with the same name replaces the parent's; new names are appended. Custom kinds (beyond project / initiative / task) are allowed when an adapter understands them."
|
|
375
|
+
},
|
|
376
|
+
"statuses": {
|
|
377
|
+
"type": "array",
|
|
378
|
+
"items": {
|
|
379
|
+
"type": "object",
|
|
380
|
+
"required": ["id", "label"],
|
|
381
|
+
"additionalProperties": false,
|
|
382
|
+
"properties": {
|
|
383
|
+
"id": {
|
|
384
|
+
"type": "string",
|
|
385
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
386
|
+
"description": "Stable kebab-case status id. Merge key when composing with extends parent."
|
|
387
|
+
},
|
|
388
|
+
"label": {
|
|
389
|
+
"type": "string",
|
|
390
|
+
"minLength": 1,
|
|
391
|
+
"maxLength": 64,
|
|
392
|
+
"description": "Human-readable status label."
|
|
393
|
+
},
|
|
394
|
+
"terminal": {
|
|
395
|
+
"type": "boolean",
|
|
396
|
+
"default": false,
|
|
397
|
+
"description": "Whether this status is terminal (e.g. done, cancelled). Terminal states accept no further transitions except to `archived`-equivalents."
|
|
398
|
+
},
|
|
399
|
+
"transitionsTo": {
|
|
400
|
+
"type": "array",
|
|
401
|
+
"items": {
|
|
402
|
+
"type": "string",
|
|
403
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
404
|
+
},
|
|
405
|
+
"uniqueItems": true,
|
|
406
|
+
"default": [],
|
|
407
|
+
"description": "Allowed next status ids. The host MUST refuse transitions outside this list."
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
"default": [],
|
|
412
|
+
"description": "Status state machine. Merge-by-id against the extends parent: a child entry with the same id replaces the parent's; new ids are appended. A child that flips a parent status's `terminal` classification SHOULD trigger a `work_status_drift` warning."
|
|
413
|
+
},
|
|
414
|
+
"scope": {
|
|
415
|
+
"type": "object",
|
|
416
|
+
"additionalProperties": false,
|
|
417
|
+
"properties": {
|
|
418
|
+
"defaultContainment": {
|
|
419
|
+
"type": "string",
|
|
420
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$",
|
|
421
|
+
"description": "OPTIONAL — slug of a default parent project/initiative new items default to."
|
|
422
|
+
},
|
|
423
|
+
"defaultApplicability": {
|
|
424
|
+
"type": "array",
|
|
425
|
+
"items": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$"
|
|
428
|
+
},
|
|
429
|
+
"uniqueItems": true,
|
|
430
|
+
"default": [],
|
|
431
|
+
"description": "OPTIONAL — default applicability axis values (role / operator / project slugs) for new items in this view."
|
|
432
|
+
},
|
|
433
|
+
"defaultOwner": {
|
|
434
|
+
"type": "string",
|
|
435
|
+
"pattern": "^ws://operators/[a-z][a-z0-9-]*$",
|
|
436
|
+
"description": "OPTIONAL — AIP-9 operator slug used as default `assignee` (tasks) or `lead` (projects/initiatives) when new items are created without explicit ownership."
|
|
437
|
+
},
|
|
438
|
+
"ownershipPolicy": {
|
|
439
|
+
"enum": ["strict", "inherit", "open"],
|
|
440
|
+
"default": "inherit",
|
|
441
|
+
"description": "How ownership is enforced. 'strict' = ownership MUST match scope.applicability; 'inherit' = empty ownership inherits from containment chain; 'open' = any operator may claim regardless of scope."
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"description": "Defaults for the three orthogonal scope axes (containment / applicability / ownership). Each leaf field overrides independently across the extends chain."
|
|
445
|
+
},
|
|
446
|
+
"lints": {
|
|
447
|
+
"type": "array",
|
|
448
|
+
"items": {
|
|
449
|
+
"type": "object",
|
|
450
|
+
"required": ["id", "kind", "appliesTo", "severity"],
|
|
451
|
+
"additionalProperties": false,
|
|
452
|
+
"properties": {
|
|
453
|
+
"id": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
456
|
+
"description": "Stable kebab-case lint id. Merge key when composing with extends parent."
|
|
457
|
+
},
|
|
458
|
+
"kind": {
|
|
459
|
+
"enum": [
|
|
460
|
+
"missing-owner",
|
|
461
|
+
"overdue",
|
|
462
|
+
"orphan",
|
|
463
|
+
"broken-ref",
|
|
464
|
+
"stale",
|
|
465
|
+
"scope-widening",
|
|
466
|
+
"custom"
|
|
467
|
+
],
|
|
468
|
+
"description": "Lint algorithm. 'custom' delegates to a host-defined check identified by `id`."
|
|
469
|
+
},
|
|
470
|
+
"appliesTo": {
|
|
471
|
+
"type": "string",
|
|
472
|
+
"pattern": "^([a-z][a-z0-9-]*|\\*)$",
|
|
473
|
+
"description": "Item kind name (e.g. 'task') or '*' for all kinds."
|
|
474
|
+
},
|
|
475
|
+
"severity": {
|
|
476
|
+
"enum": ["error", "warn", "info"],
|
|
477
|
+
"description": "Lint severity. Child views may soften (warn -> info) but governance policies may forbid that."
|
|
478
|
+
},
|
|
479
|
+
"params": {
|
|
480
|
+
"type": "object",
|
|
481
|
+
"additionalProperties": true,
|
|
482
|
+
"default": {},
|
|
483
|
+
"description": "Kind-specific parameters. e.g. { days: 14 } for 'overdue'; { days: 30 } for 'stale'."
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
"default": [],
|
|
488
|
+
"description": "Lint rules. Merge-by-id against the extends parent: a child entry with the same id replaces the parent's; new ids are appended."
|
|
489
|
+
},
|
|
490
|
+
"defaults": {
|
|
491
|
+
"type": "object",
|
|
492
|
+
"additionalProperties": false,
|
|
493
|
+
"properties": {
|
|
494
|
+
"workflow": {
|
|
495
|
+
"type": "string",
|
|
496
|
+
"minLength": 1,
|
|
497
|
+
"maxLength": 512,
|
|
498
|
+
"description": "OPTIONAL — default AIP-15 WORKFLOW.md path or ref. Items without an explicit workflow inherit this one."
|
|
499
|
+
},
|
|
500
|
+
"approvalClass": {
|
|
501
|
+
"type": "string",
|
|
502
|
+
"pattern": "^(auto|always|on-mutate|policy:[^\\s]+)$",
|
|
503
|
+
"description": "OPTIONAL — default AIP-7 approval class for status transitions and ownership changes. 'auto' = no approval; 'always' = approval on every change; 'on-mutate' = only on field mutation; 'policy:<ref>' = delegate to a named policy."
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
"description": "Default workflow / approval bindings. Each leaf field overrides independently across the extends chain."
|
|
507
|
+
},
|
|
508
|
+
"display": {
|
|
509
|
+
"type": "object",
|
|
510
|
+
"additionalProperties": false,
|
|
511
|
+
"properties": {
|
|
512
|
+
"homePage": {
|
|
513
|
+
"type": "string",
|
|
514
|
+
"pattern": "^[a-z][a-z0-9-]*[a-z0-9]$",
|
|
515
|
+
"description": "OPTIONAL — slug of the work item to use as the workspace landing page."
|
|
516
|
+
},
|
|
517
|
+
"defaultGrouping": {
|
|
518
|
+
"enum": ["kind", "status", "owner"],
|
|
519
|
+
"description": "Default grouping for list / board UIs."
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
"description": "Display hints for UIs that render the workspace. Runtime-agnostic."
|
|
523
|
+
},
|
|
524
|
+
"metadata": {
|
|
525
|
+
"type": "object",
|
|
526
|
+
"additionalProperties": true,
|
|
527
|
+
"default": {},
|
|
528
|
+
"description": "Vendor-specific extensions, namespaced under <vendor>. Deep-merged across the extends chain."
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
"allOf": [
|
|
532
|
+
{
|
|
533
|
+
"description": "A view (any manifest with appliesTo set) MUST extend a parent. A workspace-root manifest has neither field.",
|
|
534
|
+
"if": {
|
|
535
|
+
"required": ["appliesTo"],
|
|
536
|
+
"properties": {
|
|
537
|
+
"appliesTo": { "type": "array", "minItems": 1 }
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"then": {
|
|
541
|
+
"required": ["extends"]
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
]
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|