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,340 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lstutzman/wowbagger/schemas/core-inspect-workbench-response.json",
4
+ "title": "inspect --workbench --json success response, projection version 1",
5
+ "description": "The opt-in bounded affordance projection. `result` carries exactly `workbench`. It is one observation of the named snapshot: not a lease, not a reservation, and not a promise that an option stays executable after the returned revision.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "ok",
10
+ "command",
11
+ "contract_version",
12
+ "result"
13
+ ],
14
+ "properties": {
15
+ "ok": {
16
+ "const": true
17
+ },
18
+ "command": {
19
+ "const": "inspect"
20
+ },
21
+ "contract_version": {
22
+ "const": 5
23
+ },
24
+ "result": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "workbench": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "projection_version": {
33
+ "const": 1
34
+ },
35
+ "as_of": {
36
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
37
+ },
38
+ "snapshot": {
39
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/snapshotWitness"
40
+ },
41
+ "observation": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "properties": {
45
+ "authority": {
46
+ "const": "observed-snapshot"
47
+ },
48
+ "rechecked_by": {
49
+ "const": [
50
+ "revision",
51
+ "lock",
52
+ "claim-fence",
53
+ "reconciliation",
54
+ "candidate-validation"
55
+ ]
56
+ }
57
+ },
58
+ "required": [
59
+ "authority",
60
+ "rechecked_by"
61
+ ]
62
+ },
63
+ "item": {
64
+ "type": "object",
65
+ "additionalProperties": false,
66
+ "properties": {
67
+ "id": {
68
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
69
+ },
70
+ "number": {
71
+ "type": "integer",
72
+ "minimum": 1
73
+ },
74
+ "title": {
75
+ "type": "string"
76
+ },
77
+ "title_truncated": {
78
+ "type": "boolean"
79
+ },
80
+ "kind": {
81
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/kind"
82
+ },
83
+ "status": {
84
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/status"
85
+ },
86
+ "priority": {
87
+ "type": "integer"
88
+ },
89
+ "parent": {
90
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
91
+ },
92
+ "created": {
93
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
94
+ },
95
+ "updated": {
96
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
97
+ },
98
+ "revision": {
99
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/revision"
100
+ },
101
+ "ready": {
102
+ "type": "boolean"
103
+ },
104
+ "depends_on": {
105
+ "type": "object",
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "entries": {
109
+ "type": "array",
110
+ "items": {
111
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
112
+ },
113
+ "maxItems": 50
114
+ },
115
+ "total": {
116
+ "type": "integer",
117
+ "minimum": 0
118
+ },
119
+ "truncated": {
120
+ "type": "boolean"
121
+ }
122
+ },
123
+ "description": "Declared prerequisites, bounded.",
124
+ "required": [
125
+ "entries",
126
+ "total",
127
+ "truncated"
128
+ ]
129
+ },
130
+ "related": {
131
+ "type": "object",
132
+ "additionalProperties": false,
133
+ "properties": {
134
+ "entries": {
135
+ "type": "array",
136
+ "items": {
137
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
138
+ },
139
+ "maxItems": 50
140
+ },
141
+ "total": {
142
+ "type": "integer",
143
+ "minimum": 0
144
+ },
145
+ "truncated": {
146
+ "type": "boolean"
147
+ }
148
+ },
149
+ "description": "Related items, bounded.",
150
+ "required": [
151
+ "entries",
152
+ "total",
153
+ "truncated"
154
+ ]
155
+ }
156
+ },
157
+ "required": [
158
+ "id",
159
+ "title",
160
+ "title_truncated",
161
+ "kind",
162
+ "status",
163
+ "created",
164
+ "updated",
165
+ "revision",
166
+ "ready",
167
+ "depends_on",
168
+ "related"
169
+ ]
170
+ },
171
+ "transition_options": {
172
+ "type": "array",
173
+ "description": "One option per allowed lifecycle target, in ascending status order. A terminal item has none.",
174
+ "items": {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "properties": {
178
+ "to_status": {
179
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/status"
180
+ },
181
+ "action": {
182
+ "type": [
183
+ "string",
184
+ "null"
185
+ ],
186
+ "enum": [
187
+ "accept",
188
+ "kill",
189
+ "archive",
190
+ "restore",
191
+ "complete",
192
+ "defer",
193
+ "undefer",
194
+ null
195
+ ]
196
+ },
197
+ "decision_required": {
198
+ "type": "boolean"
199
+ },
200
+ "minimum_date": {
201
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
202
+ },
203
+ "enabled": {
204
+ "type": "boolean"
205
+ },
206
+ "precondition_issues": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "properties": {
210
+ "entries": {
211
+ "type": "array",
212
+ "items": {
213
+ "type": "object",
214
+ "additionalProperties": false,
215
+ "properties": {
216
+ "code": {
217
+ "type": "string"
218
+ },
219
+ "field": {
220
+ "type": [
221
+ "string",
222
+ "null"
223
+ ]
224
+ },
225
+ "message": {
226
+ "type": "string"
227
+ },
228
+ "related_ids": {
229
+ "type": "object",
230
+ "additionalProperties": false,
231
+ "properties": {
232
+ "entries": {
233
+ "type": "array",
234
+ "items": {
235
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/itemId"
236
+ },
237
+ "maxItems": 50
238
+ },
239
+ "total": {
240
+ "type": "integer",
241
+ "minimum": 0
242
+ },
243
+ "truncated": {
244
+ "type": "boolean"
245
+ }
246
+ },
247
+ "description": "The related item IDs the issue names, bounded.",
248
+ "required": [
249
+ "entries",
250
+ "total",
251
+ "truncated"
252
+ ]
253
+ },
254
+ "item_created": {
255
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
256
+ },
257
+ "item_updated": {
258
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
259
+ }
260
+ },
261
+ "description": "The transition vocabulary, with `related_ids` reshaped as a bounded collection because that list grows with the ledger.",
262
+ "required": [
263
+ "code",
264
+ "field",
265
+ "message",
266
+ "related_ids"
267
+ ]
268
+ },
269
+ "maxItems": 50
270
+ },
271
+ "total": {
272
+ "type": "integer",
273
+ "minimum": 0
274
+ },
275
+ "truncated": {
276
+ "type": "boolean"
277
+ }
278
+ },
279
+ "description": "Observed section 8 precondition issues, bounded.",
280
+ "required": [
281
+ "entries",
282
+ "total",
283
+ "truncated"
284
+ ]
285
+ },
286
+ "blockers": {
287
+ "type": "object",
288
+ "additionalProperties": false,
289
+ "properties": {
290
+ "entries": {
291
+ "type": "array",
292
+ "items": {
293
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/transitionBlocker"
294
+ },
295
+ "maxItems": 50
296
+ },
297
+ "total": {
298
+ "type": "integer",
299
+ "minimum": 0
300
+ },
301
+ "truncated": {
302
+ "type": "boolean"
303
+ }
304
+ },
305
+ "description": "Observed section 8 multi-item blockers, bounded.",
306
+ "required": [
307
+ "entries",
308
+ "total",
309
+ "truncated"
310
+ ]
311
+ }
312
+ },
313
+ "required": [
314
+ "to_status",
315
+ "action",
316
+ "decision_required",
317
+ "minimum_date",
318
+ "enabled",
319
+ "precondition_issues",
320
+ "blockers"
321
+ ]
322
+ }
323
+ }
324
+ },
325
+ "required": [
326
+ "projection_version",
327
+ "as_of",
328
+ "snapshot",
329
+ "observation",
330
+ "item",
331
+ "transition_options"
332
+ ]
333
+ }
334
+ },
335
+ "required": [
336
+ "workbench"
337
+ ]
338
+ }
339
+ }
340
+ }
@@ -0,0 +1,242 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lstutzman/wowbagger/schemas/core-list-error-response.json",
4
+ "title": "list --json refusal responses",
5
+ "description": "Every documented `list` refusal. A refusal never carries a partial page beside the error.",
6
+ "type": "object",
7
+ "oneOf": [
8
+ {
9
+ "title": "invalid-request",
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "required": [
13
+ "ok",
14
+ "command",
15
+ "contract_version",
16
+ "error"
17
+ ],
18
+ "properties": {
19
+ "ok": {
20
+ "const": false
21
+ },
22
+ "command": {
23
+ "const": "list"
24
+ },
25
+ "contract_version": {
26
+ "const": 5
27
+ },
28
+ "error": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "code": {
33
+ "const": "invalid-request"
34
+ },
35
+ "message": {
36
+ "type": "string"
37
+ },
38
+ "details": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "properties": {
42
+ "issues": {
43
+ "type": "array",
44
+ "minItems": 1,
45
+ "items": {
46
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/requestIssue"
47
+ }
48
+ }
49
+ },
50
+ "required": [
51
+ "issues"
52
+ ]
53
+ }
54
+ },
55
+ "required": [
56
+ "code",
57
+ "message",
58
+ "details"
59
+ ]
60
+ }
61
+ }
62
+ },
63
+ {
64
+ "title": "ledger-invalid",
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "required": [
68
+ "ok",
69
+ "command",
70
+ "contract_version",
71
+ "error"
72
+ ],
73
+ "properties": {
74
+ "ok": {
75
+ "const": false
76
+ },
77
+ "command": {
78
+ "const": "list"
79
+ },
80
+ "contract_version": {
81
+ "const": 5
82
+ },
83
+ "error": {
84
+ "type": "object",
85
+ "additionalProperties": false,
86
+ "properties": {
87
+ "code": {
88
+ "const": "ledger-invalid"
89
+ },
90
+ "message": {
91
+ "type": "string"
92
+ },
93
+ "details": {
94
+ "type": "object",
95
+ "additionalProperties": false,
96
+ "properties": {
97
+ "validation_errors": {
98
+ "type": "array",
99
+ "minItems": 1,
100
+ "items": {
101
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/validationError"
102
+ }
103
+ }
104
+ },
105
+ "required": [
106
+ "validation_errors"
107
+ ]
108
+ }
109
+ },
110
+ "required": [
111
+ "code",
112
+ "message",
113
+ "details"
114
+ ]
115
+ }
116
+ }
117
+ },
118
+ {
119
+ "title": "list-response-too-large",
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "required": [
123
+ "ok",
124
+ "command",
125
+ "contract_version",
126
+ "error"
127
+ ],
128
+ "properties": {
129
+ "ok": {
130
+ "const": false
131
+ },
132
+ "command": {
133
+ "const": "list"
134
+ },
135
+ "contract_version": {
136
+ "const": 5
137
+ },
138
+ "error": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "properties": {
142
+ "code": {
143
+ "const": "list-response-too-large"
144
+ },
145
+ "message": {
146
+ "type": "string"
147
+ },
148
+ "details": {
149
+ "type": "object",
150
+ "additionalProperties": false,
151
+ "properties": {
152
+ "max_list_response_bytes": {
153
+ "const": 131072
154
+ },
155
+ "response_bytes": {
156
+ "type": "integer",
157
+ "minimum": 0
158
+ },
159
+ "page_size": {
160
+ "type": "integer",
161
+ "minimum": 1
162
+ }
163
+ },
164
+ "required": [
165
+ "max_list_response_bytes",
166
+ "response_bytes",
167
+ "page_size"
168
+ ]
169
+ }
170
+ },
171
+ "required": [
172
+ "code",
173
+ "message",
174
+ "details"
175
+ ]
176
+ }
177
+ }
178
+ },
179
+ {
180
+ "title": "list-snapshot-changed",
181
+ "type": "object",
182
+ "additionalProperties": false,
183
+ "required": [
184
+ "ok",
185
+ "command",
186
+ "contract_version",
187
+ "error"
188
+ ],
189
+ "properties": {
190
+ "ok": {
191
+ "const": false
192
+ },
193
+ "command": {
194
+ "const": "list"
195
+ },
196
+ "contract_version": {
197
+ "const": 5
198
+ },
199
+ "error": {
200
+ "type": "object",
201
+ "additionalProperties": false,
202
+ "properties": {
203
+ "code": {
204
+ "const": "list-snapshot-changed"
205
+ },
206
+ "message": {
207
+ "type": "string"
208
+ },
209
+ "details": {
210
+ "type": "object",
211
+ "additionalProperties": false,
212
+ "properties": {
213
+ "mismatch": {
214
+ "enum": [
215
+ "snapshot",
216
+ "query"
217
+ ]
218
+ },
219
+ "cursor_snapshot_revision": {
220
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/revision"
221
+ },
222
+ "current_snapshot_revision": {
223
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/revision"
224
+ }
225
+ },
226
+ "required": [
227
+ "mismatch",
228
+ "cursor_snapshot_revision",
229
+ "current_snapshot_revision"
230
+ ]
231
+ }
232
+ },
233
+ "required": [
234
+ "code",
235
+ "message",
236
+ "details"
237
+ ]
238
+ }
239
+ }
240
+ }
241
+ ]
242
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lstutzman/wowbagger/schemas/core-list-query.json",
4
+ "title": "list request, query version 1",
5
+ "description": "The strict JSON request `list` reads from bounded stdin or a host-created request file. Query version 1 is its own version domain: a shape this core does not recognize is refused by `query_version`, not by the core contract version.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "query_version",
10
+ "as_of",
11
+ "sort"
12
+ ],
13
+ "properties": {
14
+ "query_version": {
15
+ "const": 1
16
+ },
17
+ "as_of": {
18
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/isoDate"
19
+ },
20
+ "sort": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": [
24
+ "field",
25
+ "direction"
26
+ ],
27
+ "properties": {
28
+ "field": {
29
+ "enum": [
30
+ "created",
31
+ "id",
32
+ "number",
33
+ "priority",
34
+ "status",
35
+ "title",
36
+ "updated"
37
+ ]
38
+ },
39
+ "direction": {
40
+ "enum": [
41
+ "ascending",
42
+ "descending"
43
+ ]
44
+ }
45
+ }
46
+ },
47
+ "filters": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": [],
51
+ "properties": {
52
+ "status": {
53
+ "type": "array",
54
+ "minItems": 1,
55
+ "uniqueItems": true,
56
+ "items": {
57
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/status"
58
+ }
59
+ },
60
+ "kind": {
61
+ "type": "array",
62
+ "minItems": 1,
63
+ "uniqueItems": true,
64
+ "items": {
65
+ "$ref": "https://github.com/lstutzman/wowbagger/schemas/common.json#/$defs/kind"
66
+ }
67
+ },
68
+ "ready": {
69
+ "type": "boolean"
70
+ },
71
+ "number": {
72
+ "type": "array",
73
+ "minItems": 1,
74
+ "uniqueItems": true,
75
+ "items": {
76
+ "type": "integer",
77
+ "minimum": 1
78
+ }
79
+ },
80
+ "title_contains": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ }
84
+ },
85
+ "description": "A conjunction of closed filters. An empty or repeated array is invalid-request, never a silently widened query."
86
+ },
87
+ "page_size": {
88
+ "type": "integer",
89
+ "minimum": 1,
90
+ "maximum": 200
91
+ },
92
+ "cursor": {
93
+ "type": "string",
94
+ "minLength": 1,
95
+ "description": "An opaque cursor from a previous list response, replayed unchanged with the same query."
96
+ }
97
+ }
98
+ }