wowbagger 0.1.0-alpha.7 → 0.1.0-alpha.8

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +193 -1
  2. package/README.md +194 -16
  3. package/adapters/claude-code/wowbagger-adapter.json +1 -1
  4. package/adapters/codex/wowbagger-adapter.json +1 -1
  5. package/adapters/opencode/wowbagger-adapter.json +1 -1
  6. package/docs/adapter-contract.md +66 -6
  7. package/docs/host-contract.md +287 -0
  8. package/docs/mutation-contract.md +558 -17
  9. package/docs/work-claim-contract.md +56 -24
  10. package/package.json +14 -1
  11. package/schemas/bare-ready-result.json +27 -0
  12. package/schemas/bare-validation-result.json +23 -0
  13. package/schemas/common.json +470 -0
  14. package/schemas/core-capabilities-response.json +346 -0
  15. package/schemas/core-envelope.json +141 -0
  16. package/schemas/core-inspect-response.json +37 -0
  17. package/schemas/core-inspect-workbench-response.json +340 -0
  18. package/schemas/core-list-error-response.json +242 -0
  19. package/schemas/core-list-query.json +98 -0
  20. package/schemas/core-list-response.json +140 -0
  21. package/schemas/core-report-response.json +379 -0
  22. package/schemas/core-transition-error-response.json +852 -0
  23. package/schemas/core-transition-request.json +47 -0
  24. package/schemas/core-transition-response.json +49 -0
  25. package/schemas/index.json +108 -0
  26. package/schemas/ledger-mutation-refusal.json +288 -0
  27. package/schemas/report-config-v1.json +140 -0
  28. package/schemas/report-config-v2.json +242 -0
  29. package/skills/wowbagger/SKILL.md +151 -38
  30. package/src/adapter/core-probe.js +87 -7
  31. package/src/claim-capabilities.js +4 -5
  32. package/src/claim-coordinator.js +15 -2
  33. package/src/claim-prospective.js +151 -0
  34. package/src/claim-publication.js +49 -9
  35. package/src/claim-sync.js +66 -0
  36. package/src/cli.js +671 -49
  37. package/src/extension-provision.js +33 -0
  38. package/src/git-autocommit.js +36 -6
  39. package/src/git-reconciliation.js +53 -9
  40. package/src/launch.js +52 -0
  41. package/src/lifecycle.js +153 -0
  42. package/src/limits.js +39 -0
  43. package/src/list.js +365 -0
  44. package/src/mutation.js +145 -118
  45. package/src/projection.js +39 -0
  46. package/src/report-graph.js +122 -21
  47. package/src/report-html.js +219 -51
  48. package/src/report-view.js +189 -0
  49. package/src/report.js +145 -15
  50. package/src/validate.js +4 -1
  51. package/src/workbench.js +117 -0
@@ -0,0 +1,470 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lstutzman/wowbagger/schemas/common.json",
4
+ "title": "Shared Wowbagger contract definitions",
5
+ "description": "Definitions reused by the published Wowbagger schemas. This file declares no root constraint; validate an instance against a domain schema, never against this one.",
6
+ "$defs": {
7
+ "itemId": {
8
+ "type": "string",
9
+ "description": "A canonical Wowbagger item ID: wb_ followed by a 26-character ULID.",
10
+ "pattern": "^wb_[0-7][0-9A-HJKMNP-TV-Z]{25}$"
11
+ },
12
+ "revision": {
13
+ "type": "string",
14
+ "description": "An exact item or snapshot revision: SHA-256 over exact bytes, lowercase hexadecimal.",
15
+ "pattern": "^sha256:[0-9a-f]{64}$"
16
+ },
17
+ "isoDate": {
18
+ "type": "string",
19
+ "description": "An ISO calendar date, YYYY-MM-DD.",
20
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
21
+ },
22
+ "instant": {
23
+ "type": "string",
24
+ "description": "A canonical RFC 3339 UTC instant with an uppercase T and Z and no numeric offset.",
25
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?Z$"
26
+ },
27
+ "status": {
28
+ "type": "string",
29
+ "enum": [
30
+ "archived",
31
+ "backlog",
32
+ "deferred",
33
+ "done",
34
+ "in-progress",
35
+ "killed",
36
+ "triage"
37
+ ]
38
+ },
39
+ "kind": {
40
+ "type": "string",
41
+ "enum": [
42
+ "task",
43
+ "epic"
44
+ ]
45
+ },
46
+ "validationError": {
47
+ "type": "object",
48
+ "description": "One machine-readable validation error. Every error carries path, field, code, and message; a misplaced item also carries expected_path and remediation.",
49
+ "additionalProperties": false,
50
+ "required": [
51
+ "path",
52
+ "field",
53
+ "code",
54
+ "message"
55
+ ],
56
+ "properties": {
57
+ "path": {
58
+ "type": "string"
59
+ },
60
+ "field": {
61
+ "type": [
62
+ "string",
63
+ "null"
64
+ ]
65
+ },
66
+ "code": {
67
+ "type": "string"
68
+ },
69
+ "message": {
70
+ "type": "string"
71
+ },
72
+ "expected_path": {
73
+ "type": "string"
74
+ },
75
+ "remediation": {
76
+ "type": "string"
77
+ }
78
+ }
79
+ },
80
+ "requestIssue": {
81
+ "type": "object",
82
+ "description": "One deterministic invalid-request issue. Exactly path, code, and message.",
83
+ "additionalProperties": false,
84
+ "required": [
85
+ "path",
86
+ "code",
87
+ "message"
88
+ ],
89
+ "properties": {
90
+ "path": {
91
+ "type": "string"
92
+ },
93
+ "code": {
94
+ "type": "string",
95
+ "enum": [
96
+ "invalid-json",
97
+ "duplicate-key",
98
+ "missing-member",
99
+ "unknown-member",
100
+ "invalid-type",
101
+ "invalid-value",
102
+ "missing-argument",
103
+ "repeated-argument",
104
+ "unknown-argument",
105
+ "conflicting-argument"
106
+ ]
107
+ },
108
+ "message": {
109
+ "type": "string"
110
+ }
111
+ }
112
+ },
113
+ "error": {
114
+ "type": "object",
115
+ "description": "A core error object. Exactly code, message, and details.",
116
+ "additionalProperties": false,
117
+ "required": [
118
+ "code",
119
+ "message",
120
+ "details"
121
+ ],
122
+ "properties": {
123
+ "code": {
124
+ "type": "string"
125
+ },
126
+ "message": {
127
+ "type": "string"
128
+ },
129
+ "details": {
130
+ "type": "object"
131
+ }
132
+ }
133
+ },
134
+ "itemSnapshot": {
135
+ "type": "object",
136
+ "description": "The lossless item snapshot returned by inspect, create, transition, and patch.",
137
+ "additionalProperties": false,
138
+ "required": [
139
+ "id",
140
+ "path",
141
+ "revision",
142
+ "source_encoding",
143
+ "source_media_type",
144
+ "source_base64",
145
+ "core",
146
+ "body"
147
+ ],
148
+ "properties": {
149
+ "id": {
150
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
151
+ },
152
+ "path": {
153
+ "type": "string"
154
+ },
155
+ "revision": {
156
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/revision"
157
+ },
158
+ "source_encoding": {
159
+ "const": "base64"
160
+ },
161
+ "source_media_type": {
162
+ "const": "text/markdown; charset=utf-8"
163
+ },
164
+ "source_base64": {
165
+ "type": "string"
166
+ },
167
+ "core": {
168
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemCore"
169
+ },
170
+ "body": {
171
+ "type": "string"
172
+ }
173
+ }
174
+ },
175
+ "itemCore": {
176
+ "type": "object",
177
+ "description": "The normalized core view of one item. Consumer-owned extension members are not part of it.",
178
+ "required": [
179
+ "schema_version",
180
+ "id",
181
+ "title",
182
+ "kind",
183
+ "status",
184
+ "created",
185
+ "updated",
186
+ "provenance",
187
+ "depends_on",
188
+ "related"
189
+ ],
190
+ "properties": {
191
+ "schema_version": {
192
+ "type": "integer",
193
+ "enum": [
194
+ 1,
195
+ 2
196
+ ]
197
+ },
198
+ "id": {
199
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
200
+ },
201
+ "title": {
202
+ "type": "string",
203
+ "minLength": 1
204
+ },
205
+ "kind": {
206
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/kind"
207
+ },
208
+ "status": {
209
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/status"
210
+ },
211
+ "created": {
212
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
213
+ },
214
+ "updated": {
215
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
216
+ },
217
+ "number": {
218
+ "type": "integer",
219
+ "minimum": 1
220
+ },
221
+ "priority": {
222
+ "type": "integer"
223
+ },
224
+ "parent": {
225
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
226
+ },
227
+ "snoozed_until": {
228
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
229
+ },
230
+ "completed": {
231
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
232
+ },
233
+ "killed": {
234
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
235
+ },
236
+ "archived": {
237
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
238
+ },
239
+ "deferred": {
240
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
241
+ },
242
+ "depends_on": {
243
+ "type": "array",
244
+ "items": {
245
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
246
+ }
247
+ },
248
+ "related": {
249
+ "type": "array",
250
+ "items": {
251
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
252
+ }
253
+ },
254
+ "provenance": {
255
+ "type": "object",
256
+ "required": [
257
+ "source",
258
+ "recorded_at"
259
+ ],
260
+ "properties": {
261
+ "source": {
262
+ "type": "string",
263
+ "minLength": 1
264
+ },
265
+ "recorded_at": {
266
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/instant"
267
+ }
268
+ }
269
+ },
270
+ "decisions": {
271
+ "type": "array",
272
+ "items": {
273
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/decision"
274
+ }
275
+ }
276
+ },
277
+ "additionalProperties": false
278
+ },
279
+ "decision": {
280
+ "type": "object",
281
+ "required": [
282
+ "action",
283
+ "date",
284
+ "summary",
285
+ "rationale"
286
+ ],
287
+ "properties": {
288
+ "action": {
289
+ "type": "string",
290
+ "enum": [
291
+ "accept",
292
+ "complete",
293
+ "resolve",
294
+ "kill",
295
+ "archive",
296
+ "restore",
297
+ "defer",
298
+ "undefer",
299
+ "replace-dependency",
300
+ "waive-dependency",
301
+ "reparent",
302
+ "record"
303
+ ]
304
+ },
305
+ "date": {
306
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
307
+ },
308
+ "summary": {
309
+ "type": "string",
310
+ "minLength": 1
311
+ },
312
+ "rationale": {
313
+ "type": "string",
314
+ "minLength": 1
315
+ },
316
+ "rollup": {
317
+ "type": "array",
318
+ "items": {
319
+ "type": "object",
320
+ "additionalProperties": false,
321
+ "required": [
322
+ "id",
323
+ "status"
324
+ ],
325
+ "properties": {
326
+ "id": {
327
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
328
+ },
329
+ "status": {
330
+ "type": "string",
331
+ "enum": [
332
+ "done",
333
+ "killed"
334
+ ]
335
+ }
336
+ }
337
+ }
338
+ }
339
+ }
340
+ },
341
+ "snapshotWitness": {
342
+ "type": "object",
343
+ "description": "The ledger-snapshot witness: a digest over every item path and revision, with the whole validated item count.",
344
+ "additionalProperties": false,
345
+ "required": [
346
+ "revision",
347
+ "item_count"
348
+ ],
349
+ "properties": {
350
+ "revision": {
351
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/revision"
352
+ },
353
+ "item_count": {
354
+ "type": "integer",
355
+ "minimum": 0
356
+ }
357
+ }
358
+ },
359
+ "transitionIssue": {
360
+ "type": "object",
361
+ "description": "One observed transition precondition issue. Only the two date codes carry item_created and item_updated.",
362
+ "additionalProperties": false,
363
+ "required": [
364
+ "code",
365
+ "field",
366
+ "message",
367
+ "related_ids"
368
+ ],
369
+ "properties": {
370
+ "code": {
371
+ "type": "string"
372
+ },
373
+ "field": {
374
+ "type": [
375
+ "string",
376
+ "null"
377
+ ]
378
+ },
379
+ "message": {
380
+ "type": "string"
381
+ },
382
+ "related_ids": {
383
+ "type": "array",
384
+ "items": {
385
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
386
+ }
387
+ },
388
+ "item_created": {
389
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
390
+ },
391
+ "item_updated": {
392
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
393
+ }
394
+ }
395
+ },
396
+ "transitionBlocker": {
397
+ "type": "object",
398
+ "description": "One multi-item blocker the local backend cannot satisfy in a single-item write scope.",
399
+ "additionalProperties": false,
400
+ "required": [
401
+ "code",
402
+ "item_id",
403
+ "field"
404
+ ],
405
+ "properties": {
406
+ "code": {
407
+ "type": "string",
408
+ "enum": [
409
+ "child-disposition",
410
+ "dependent-cleanup",
411
+ "dependent-disposition"
412
+ ]
413
+ },
414
+ "item_id": {
415
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
416
+ },
417
+ "field": {
418
+ "type": "string"
419
+ }
420
+ }
421
+ },
422
+ "recoveryArtifact": {
423
+ "type": "object",
424
+ "required": [
425
+ "kind",
426
+ "path"
427
+ ],
428
+ "properties": {
429
+ "kind": {
430
+ "type": "string"
431
+ },
432
+ "path": {
433
+ "type": "string"
434
+ }
435
+ }
436
+ },
437
+ "lockOwner": {
438
+ "type": [
439
+ "object",
440
+ "null"
441
+ ],
442
+ "description": "The parsed lock record of the writer holding the lock, or null when the record could not be read; owner_diagnostic then says why.",
443
+ "additionalProperties": false,
444
+ "required": [
445
+ "lock_version",
446
+ "item_id",
447
+ "operation",
448
+ "writer_id",
449
+ "started_at"
450
+ ],
451
+ "properties": {
452
+ "lock_version": {
453
+ "const": 1
454
+ },
455
+ "item_id": {
456
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
457
+ },
458
+ "operation": {
459
+ "type": "string"
460
+ },
461
+ "writer_id": {
462
+ "type": "string"
463
+ },
464
+ "started_at": {
465
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/instant"
466
+ }
467
+ }
468
+ }
469
+ }
470
+ }