wowbagger 0.1.0-alpha.7 → 0.1.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +213 -1
- package/README.md +282 -35
- package/adapters/claude-code/wowbagger-adapter.json +1 -1
- package/adapters/codex/wowbagger-adapter.json +1 -1
- package/adapters/opencode/wowbagger-adapter.json +1 -1
- package/assets/wowbagger-v1-more-whimsical.jpg +0 -0
- package/assets/wowbagger-v2-less-whimsical.jpg +0 -0
- package/assets/wowbagger-v3-herding-agent-cats.jpg +0 -0
- package/assets/wowbagger-v4-robot-agent-herding.jpg +0 -0
- package/assets/wowbagger-v5-typing-cats-circuit-staff.jpg +0 -0
- package/docs/adapter-contract.md +66 -6
- package/docs/host-contract.md +287 -0
- package/docs/mutation-contract.md +558 -17
- package/docs/work-claim-contract.md +56 -24
- package/package.json +20 -2
- package/schemas/bare-ready-result.json +27 -0
- package/schemas/bare-validation-result.json +23 -0
- package/schemas/common.json +470 -0
- package/schemas/core-capabilities-response.json +346 -0
- package/schemas/core-envelope.json +141 -0
- package/schemas/core-inspect-response.json +37 -0
- package/schemas/core-inspect-workbench-response.json +340 -0
- package/schemas/core-list-error-response.json +242 -0
- package/schemas/core-list-query.json +98 -0
- package/schemas/core-list-response.json +140 -0
- package/schemas/core-report-response.json +379 -0
- package/schemas/core-transition-error-response.json +852 -0
- package/schemas/core-transition-request.json +47 -0
- package/schemas/core-transition-response.json +49 -0
- package/schemas/index.json +108 -0
- package/schemas/ledger-mutation-refusal.json +288 -0
- package/schemas/report-config-v1.json +140 -0
- package/schemas/report-config-v2.json +242 -0
- package/skills/wowbagger/SKILL.md +165 -39
- package/src/adapter/core-probe.js +87 -7
- package/src/claim-capabilities.js +4 -5
- package/src/claim-coordinator.js +15 -2
- package/src/claim-prospective.js +151 -0
- package/src/claim-publication.js +49 -9
- package/src/claim-sync.js +66 -0
- package/src/cli.js +671 -49
- package/src/extension-provision.js +33 -0
- package/src/git-autocommit.js +36 -6
- package/src/git-reconciliation.js +53 -9
- package/src/launch.js +52 -0
- package/src/lifecycle.js +153 -0
- package/src/limits.js +39 -0
- package/src/list.js +365 -0
- package/src/mutation.js +145 -118
- package/src/projection.js +39 -0
- package/src/report-graph.js +122 -21
- package/src/report-html.js +219 -51
- package/src/report-view.js +189 -0
- package/src/report.js +145 -15
- package/src/validate.js +4 -1
- package/src/workbench.js +117 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,180 @@ consolidation. The first tagged release inherits this file.
|
|
|
7
7
|
|
|
8
8
|
## Unreleased
|
|
9
9
|
|
|
10
|
+
## 0.1.0-alpha.9 - 2026-08-23
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **A public Wowbagger brand asset.** The repository now carries an optimized
|
|
15
|
+
1024px image of Bowerick Wowbagger directing robotic agent cats at consoles
|
|
16
|
+
with a circuit-lit shepherd's staff. The asset is included in the npm
|
|
17
|
+
package for README and GitHub presentation.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **Public product prose now describes the current engine.** README, npm
|
|
22
|
+
metadata, Claude plugin metadata, marketplace metadata, and the installed
|
|
23
|
+
skill now explain report sequencing dashboards, named views, facets, graph
|
|
24
|
+
filtering, guarded CAS mutations, claims, fencing, reconciliation, and the
|
|
25
|
+
separation between core and host responsibilities.
|
|
26
|
+
- **Agent onboarding is explicit.** The README and skill include a concise
|
|
27
|
+
agent TL;DR, exact core setup checks, the separate plugin/skills installer
|
|
28
|
+
routes, and the response-loss rule.
|
|
29
|
+
|
|
30
|
+
## 0.1.0-alpha.8 - 2026-08-23
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **A published launch seam for a host that cannot run a shell.** The package
|
|
35
|
+
now declares `exports`, and its main entry `wowbagger` exposes
|
|
36
|
+
`CORE_SCRIPT_PATH`, `MINIMUM_NODE_MAJOR`, and `resolveCoreLaunch(argv)`, which
|
|
37
|
+
returns the exact process tuple a direct-core host needs: an absolute Node
|
|
38
|
+
executable, an argument array whose first element is the absolute
|
|
39
|
+
`bin/wowbagger.js`, and `shell: false`. A host that resolves its own runtime
|
|
40
|
+
gets `resolveCoreLaunch(argv, { nodeExecutable })`, and a relative or bare
|
|
41
|
+
executable name is refused rather than left for PATH to answer. The script
|
|
42
|
+
path is also resolvable on its own as `wowbagger/wowbagger.js` for a host that
|
|
43
|
+
wants the path without importing anything. Deep imports that already worked —
|
|
44
|
+
`wowbagger/src/limits.js` and every other published path — keep resolving
|
|
45
|
+
through an explicit `"./*"` subpath. No command accepts, refuses, emits, or
|
|
46
|
+
writes anything different.
|
|
47
|
+
|
|
48
|
+
- **The machine contract ships as JSON Schema, not only as prose and fixtures.**
|
|
49
|
+
Seventeen JSON Schema 2020-12 documents under `schemas/` are published with
|
|
50
|
+
the package and resolvable as `wowbagger/schemas/<file>.json`, with
|
|
51
|
+
`schemas/index.json` naming each one's response domain and that domain's
|
|
52
|
+
version. They cover the core envelope and its four exact root shapes, the
|
|
53
|
+
capabilities envelope with every advertised limit as a constant, the two bare
|
|
54
|
+
results, the list query and its page and refusals, the default and workbench
|
|
55
|
+
inspect projections, the transition request, success, and every documented
|
|
56
|
+
refusal with its mutation state, the `ledger-mutation` fence refusals, report
|
|
57
|
+
configuration versions 1 and 2, and the report responses including a named
|
|
58
|
+
view. Every schema fixes its root members exactly and pins the version of its
|
|
59
|
+
own domain, so a core envelope refuses a namespaced refusal, a version 4
|
|
60
|
+
envelope, or an extra root member, and a version 1 report configuration
|
|
61
|
+
refuses a version 2 one. Exactness reaches the members too: an item core must
|
|
62
|
+
carry both relation lists, because the core view always emits them, and a
|
|
63
|
+
refusal raised before a commit is established pins its state to `unchanged`
|
|
64
|
+
rather than admitting the indeterminate state that only an interrupted write
|
|
65
|
+
can report. The validator is a test-only dependency; the runtime still has
|
|
66
|
+
exactly one dependency.
|
|
67
|
+
|
|
68
|
+
### Documentation
|
|
69
|
+
|
|
70
|
+
- **`docs/host-contract.md` publishes the direct-core host boundary.** One
|
|
71
|
+
document now states what a UI plugin or other non-agent consumer needs and
|
|
72
|
+
what it must supply itself: the package resolution seam and the four-part
|
|
73
|
+
launch — Node.js 20 or later, an absolute Node executable, the absolute
|
|
74
|
+
`wowbagger.js`, an argument array, and `shell: false`; bounded stdin or a
|
|
75
|
+
host-created request file, never shell source and never inline unbounded argv
|
|
76
|
+
JSON; captured stdout and stderr; the owning-host path rule for a worktree, a
|
|
77
|
+
plain folder, direct SSH, and WSL, with no cross-runtime path guessing;
|
|
78
|
+
namespace-first response dispatch and the exit table; every advertised limit
|
|
79
|
+
with its exact value; the once-only dispatch sequence for a lost response; and
|
|
80
|
+
the seventeen packaged JSON Schemas by domain. It states that a missing
|
|
81
|
+
executable is a host-level result rather than malformed Wowbagger JSON, that
|
|
82
|
+
the host owns executable discovery, working directory, timeout, cancellation,
|
|
83
|
+
process-tree containment, stream caps, and routing, and that Wowbagger will
|
|
84
|
+
not add automatic transitions, mirrored ledger state, operation identity,
|
|
85
|
+
remote routing, or a daemon. The full `inspect` read is documented as
|
|
86
|
+
deliberately unbounded, with the reason. The README, the installed skill, and
|
|
87
|
+
`SPEC.md` section 10 point at it, and it ships in the npm package.
|
|
88
|
+
- **The public version and lifecycle vocabulary agrees with the runtime.**
|
|
89
|
+
`SPEC.md` section 10 said core mutation contracts 1 and 2 were defined and
|
|
90
|
+
that the runtime emitted version 2; it now says 1 through 5 and version 5. The
|
|
91
|
+
mutation contract's status line said versions 1, 2, and 3 with the runtime on
|
|
92
|
+
3; it now says 1 through 5 and version 5. `deferred` has been a real status
|
|
93
|
+
since it shipped, but `SPEC.md` omitted it from the status field, the
|
|
94
|
+
lifecycle table, the transition table, the terminal-date invariants, the
|
|
95
|
+
decision-action list, and the terminal-decision table, and the mutation
|
|
96
|
+
contract omitted the `deferred` date from the lossless core view; all seven
|
|
97
|
+
now name it, along with the `resolve`, `defer`, and `undefer` decision actions
|
|
98
|
+
the validator has always accepted. No behaviour changed: these were prose
|
|
99
|
+
omissions, and the tests that guard them read the vocabularies from
|
|
100
|
+
`src/lifecycle.js` and `src/validate.js` rather than retyping them.
|
|
101
|
+
- **Response loss is a named contract instead of folklore.** The mutation
|
|
102
|
+
contract, the adapter contract, the README, and the installed skill now carry
|
|
103
|
+
the same sequence for a mutation whose response never arrived: dispatch once,
|
|
104
|
+
never replay, invalidate the inspected revision, reconnect, then re-read the
|
|
105
|
+
ledger. The mutation contract's new section 10 table separates the outcomes a
|
|
106
|
+
caller may act on — committed success, proven non-write, committed recovery,
|
|
107
|
+
unknown publication — from the two that establish nothing, a signalled or
|
|
108
|
+
timed-out transport and a missing envelope, and states that a later item state
|
|
109
|
+
never proves that the lost dispatch caused it. Adapter contract section 6.2
|
|
110
|
+
documents the `mutation_outcome: "unknown"` envelope and its per-command
|
|
111
|
+
`recovery` object exactly as the adapter emits them, and states that exit 4
|
|
112
|
+
`revision-conflict` is a proven non-write that is never relabelled response
|
|
113
|
+
loss. There is no operation ID, durable outcome store, or replay endpoint;
|
|
114
|
+
adding correlation requires a new contract decision. No command accepts,
|
|
115
|
+
refuses, emits, or writes anything different. Two conformance vectors now pin
|
|
116
|
+
the core's own exit-6 `write-outcome-unknown` and `post-commit-recovery-required`
|
|
117
|
+
envelopes at the adapter's process-outcome seam, taking the adapter vector set
|
|
118
|
+
to 212 assertions.
|
|
119
|
+
- **The exit tables state where `report` actually lands.** Both contracts filed
|
|
120
|
+
exit 1 as a bare-result-only condition and exit 3 as every invalid ledger,
|
|
121
|
+
while `report` answers an invalid ledger, an unreadable input, and a failed
|
|
122
|
+
publication at exit 1. The mutation contract now carries an exit 1 row naming
|
|
123
|
+
those codes, lists `report-config-invalid` and `report-view-not-found` in its
|
|
124
|
+
exit 2 row, and scopes exit 3 to every command except `report`; the host
|
|
125
|
+
contract's exit 1 and exit 3 conditions say the same. Two guards assert the
|
|
126
|
+
rows against the codes the runtime emits.
|
|
127
|
+
|
|
128
|
+
### Changed
|
|
129
|
+
|
|
130
|
+
- **The report filters by facet groups instead of one value at a time.** The
|
|
131
|
+
drill-down's single-value mapped-field selects and its All/Ready/Blocked/
|
|
132
|
+
Ineligible buttons are gone. In their place is one group of checkbox chips per
|
|
133
|
+
dimension of the open set — Readiness, Status, Kind, and every configured
|
|
134
|
+
mapped field, so a mapped `class: bug` is a chip rather than a value hidden in
|
|
135
|
+
a dropdown. Values inside a group are alternatives, groups narrow each other,
|
|
136
|
+
and the search box is one more condition; every chip states the count it would
|
|
137
|
+
leave, measured against the search and the other groups but never against its
|
|
138
|
+
own, so two selections in one group cannot make their siblings read zero. A
|
|
139
|
+
visible result count, per-chip selected state, and `Clear filters` are new, and
|
|
140
|
+
opening a Work next or Attention row still clears whatever detached its card,
|
|
141
|
+
facets included.
|
|
142
|
+
- **The ledger graph filters by lifecycle status.** One chip group above the
|
|
143
|
+
stage carries the statuses the ledger holds, all selected, with `Select all`
|
|
144
|
+
and `Clear`. Deselecting a status drops its nodes, every link incident to one,
|
|
145
|
+
and their labels, reheats the layout in place, and takes a hidden node off the
|
|
146
|
+
hover card; the roster and node count follow the same selection, and an empty
|
|
147
|
+
selection draws an empty graph that says so. The legend, the WebGL-less
|
|
148
|
+
roster, camera interaction, and the no-fetch contract are unchanged, and
|
|
149
|
+
nothing here reads or writes the ledger.
|
|
150
|
+
|
|
151
|
+
### Fixed
|
|
152
|
+
|
|
153
|
+
- **A report failure before publication says so, and never arrives causeless.**
|
|
154
|
+
An output path the filesystem cannot resolve — a `--out` under a regular
|
|
155
|
+
file, an unreadable directory on the way to it — was a raw runtime error
|
|
156
|
+
escaping into the command's catch-all, answered as `report-write-failed` with
|
|
157
|
+
empty `details` even though nothing had been rendered or replaced. It is now
|
|
158
|
+
`report-read-failed` with `details.operation` naming which resolution failed,
|
|
159
|
+
`details.path` naming the path the caller configured or passed, and
|
|
160
|
+
`details.cause` naming the filesystem's own code. An error no report path
|
|
161
|
+
throws on purpose still answers `report-write-failed`, because nothing
|
|
162
|
+
reached the output path, but it now carries `{operation, cause}` instead of
|
|
163
|
+
`{}`. Every `details.cause` is a bounded token — an error code, or the
|
|
164
|
+
error's kind when the runtime gave no code — so a publication failure no
|
|
165
|
+
longer republishes a runtime message, and the paths, credentials, and
|
|
166
|
+
run-specific values a message carries stay out of the envelope. Atomic
|
|
167
|
+
publication is unchanged: a report already at the selected path survives
|
|
168
|
+
every one of these refusals.
|
|
169
|
+
- **An empty named view stops blaming the reader.** A view whose criteria
|
|
170
|
+
matched nothing rendered the drill-down's `No items match these filters.` and
|
|
171
|
+
the graph's `No status is selected`, sending a reader to controls that could
|
|
172
|
+
not bring an item back. A named artifact with no items now states
|
|
173
|
+
`No ledger item matches this view's criteria.` and, in the graph, that it has
|
|
174
|
+
nothing to draw — visibly, without waiting for scripting. A report that holds
|
|
175
|
+
items keeps the filter and status copy, which is the honest answer when the
|
|
176
|
+
reader is the one who narrowed it, and the base report's bytes are unchanged.
|
|
177
|
+
- **`core-report-response.json` named a member the report never emitted.** The
|
|
178
|
+
published `ledger-invalid` refusal required `details.validation_errors`,
|
|
179
|
+
which is the mutation commands' member name; `report` has always emitted
|
|
180
|
+
`details.errors`. A consumer validating a real refusal against the shipped
|
|
181
|
+
schema failed on the runtime's own bytes. The schema now states `errors`, and
|
|
182
|
+
a live invalid-ledger report run is validated against it.
|
|
183
|
+
|
|
10
184
|
## 0.1.0-alpha.7 - 2026-08-18
|
|
11
185
|
|
|
12
186
|
### Changed
|
|
@@ -157,6 +331,44 @@ consolidation. The first tagged release inherits this file.
|
|
|
157
331
|
|
|
158
332
|
### Added
|
|
159
333
|
|
|
334
|
+
- **`inspect` answers a bounded per-item lifecycle affordance projection.**
|
|
335
|
+
`inspect --ledger <dir> (--id <id> | --number <n>) --workbench --as-of
|
|
336
|
+
YYYY-MM-DD --json` returns, from one complete validated ledger snapshot,
|
|
337
|
+
`result.workbench`: the projection version, the as-of date, the ledger
|
|
338
|
+
snapshot witness, an `observation` member, a bounded item summary, and one
|
|
339
|
+
`transition_options` entry for every lifecycle target the native edge table
|
|
340
|
+
allows out of that item's kind and status. Each option names its target
|
|
341
|
+
status, its generated decision action or `null`, whether a caller-supplied
|
|
342
|
+
summary and rationale are required, the minimum legal transition date
|
|
343
|
+
`max(created, updated)`, its observed enabled state, and the observed
|
|
344
|
+
precondition issues and multi-item blockers in the exact `transition`
|
|
345
|
+
vocabulary. A workbench can now show a person which transitions an item can
|
|
346
|
+
take without duplicating lifecycle logic and without submitting a mutating
|
|
347
|
+
probe.
|
|
348
|
+
|
|
349
|
+
The read is an observation, not a lease, and says so in the response:
|
|
350
|
+
`observation.authority` is `observed-snapshot` and `observation.rechecked_by`
|
|
351
|
+
names what a later `transition` rechecks under lock — revision, lock, claim
|
|
352
|
+
fence, reconciliation, and candidate validation. It writes no item, lock,
|
|
353
|
+
claim journal, reconciliation log, or Git state, and it takes no lock.
|
|
354
|
+
`transition` and the projection share one lifecycle definition
|
|
355
|
+
(`src/lifecycle.js`), and a differential guard dispatches every projected
|
|
356
|
+
option and every unadvertised target through the real mutation, so an
|
|
357
|
+
advertised affordance cannot drift from what the mutation does.
|
|
358
|
+
|
|
359
|
+
Every variable-size field is bounded and says what it left out: the projected
|
|
360
|
+
title, the relation lists, each option's issues and blockers, and the related
|
|
361
|
+
IDs inside an issue. `--workbench` requires `--as-of`, an unpaired `--as-of`
|
|
362
|
+
is refused rather than ignored, and an `inspect` invocation without
|
|
363
|
+
`--workbench` is byte-identical to before. `capabilities` advertises
|
|
364
|
+
`operations.inspect.workbench` and the three exact bounds
|
|
365
|
+
`max_workbench_title_characters`, `max_workbench_collection_entries`, and
|
|
366
|
+
`max_workbench_response_bytes`; the core contract version stays 5, and the
|
|
367
|
+
projection is negotiated by its own `projection_version`. An invalid ledger is
|
|
368
|
+
`ledger-invalid` at exit 3 with no projection attached, and a projection that
|
|
369
|
+
would exceed its response bound is refused whole with
|
|
370
|
+
`workbench-response-too-large` at exit 2.
|
|
371
|
+
|
|
160
372
|
- **The conformance suite now measures real core outcomes end to end.** A new
|
|
161
373
|
equivalence case, `16-core-outcome-e2e`, carries nine hand-authored scenarios
|
|
162
374
|
that each run the direct real core in one isolated temporary workspace and,
|
|
@@ -570,7 +782,7 @@ consolidation. The first tagged release inherits this file.
|
|
|
570
782
|
every read and every guarded mutation on that ledger, including ones that
|
|
571
783
|
never touch the misplaced item, so the refusal has to say where the item
|
|
572
784
|
belongs. The claim fence is not involved: `claim-verify` reports no finding
|
|
573
|
-
on such a ledger, refuting
|
|
785
|
+
on such a ledger, refuting an earlier consumer report that a
|
|
574
786
|
root-misplaced item makes the fence report `stale-write-detected` with
|
|
575
787
|
`actual_revision: null`. Fixtures pin both configuration orders — layout
|
|
576
788
|
bound first, and layout bound after the item was already committed at the
|