agents-handoff 2.0.2 → 2.0.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to agent-handoff are recorded here.
3
+ All notable changes to agents-handoff are recorded here.
4
4
 
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases before 2.0.0
@@ -15,6 +15,77 @@ version, and it is the version published to npm: the repository root is the
15
15
 
16
16
  Add entries under the matching heading as changes land.
17
17
 
18
+ ## [2.0.4] - 2026-10-09
19
+
20
+ ### Added
21
+
22
+ - A demo animation on the README and the documentation home page: one run installing into every
23
+ harness, a session captured and verified, and an installation proved against the published
24
+ tarball (`assets/handoff-demo.gif`).
25
+ - **[Compatibility](https://github.com/Alot1z/agent-handoff/blob/main/docs/COMPATIBILITY.md)**
26
+ (`docs/COMPATIBILITY.md`) now records what was measured rather than what
27
+ is assumed: Node 26 verified, and Bun verified as an alternative runtime — the engine's
28
+ verbs run unchanged there, and the suite passes 34/34 with `bun test --timeout 30000` (Bun's
29
+ default 5-second per-test timeout is shorter than the suite's child-process tests). It also
30
+ states why the artifacts are JavaScript rather than TypeScript: the contracts are the
31
+ versioned JSON Schemas the runtime validates against, and a build step would put a compiler
32
+ between a user and a working tool.
33
+
34
+ ### Fixed
35
+
36
+ - `--update` and `--verify` reported "no installations found" on a machine whose copies predate
37
+ the 2.0.3 rename, because they only looked for `agents-handoff/`. Both now recognise the
38
+ `agent-handoff/` directory every earlier release installed and act on it in place.
39
+ - The global-root search missed `~/.config`, which is where a desktop client keeps its
40
+ account-skill store on Windows too — so that store's installation was invisible to `--list`,
41
+ `--update`, `--verify` and `doctor` even though the client kept reading it.
42
+
43
+ ### Changed
44
+
45
+ - `remove` states what it keeps before asking, so its confirmation matches what it does.
46
+
47
+ ## [2.0.3] - 2026-10-09
48
+
49
+ ### Added
50
+
51
+ - **Named harness targets.** One run can install the skill into Claude Code, Codex CLI and the
52
+ harness-neutral `~/.agents/skills` at once: `--claude`, `--codex`, `--agents`,
53
+ `--harness claude,codex` (repeatable), `--all` for every harness whose directory exists on
54
+ this machine, `--skills-dir <dir>` for any other stack, and `--project` for the
55
+ per-repository form. Every target gets its own copy and its own install record.
56
+ - **`verify-package`**, a verb that checks an installation against the package npm is actually
57
+ serving for its version: it verifies the downloaded tarball against the registry's own
58
+ `integrity` and `shasum`, compares the published file set with the installed one file by
59
+ file, and compares the tarball sha256 with the value recorded for that install. `--record`
60
+ stores the tarball hashes in the install record, so later runs compare with a stored value.
61
+ - The install record (`.agents-handoff-install.json`) now carries a `package` block — name,
62
+ version, registry, tarball URL, and the sha256/sha512/integrity/shasum filled in by
63
+ `verify-package` — so an installation can be checked against the published artifact rather
64
+ than only against itself.
65
+ - Installing from the repository without publishing: `npx github:Alot1z/agent-handoff` runs the
66
+ same installer straight from GitHub, and the installation guide documents both that and the
67
+ clone-and-run path.
68
+ - Five installer behaviour tests — multi-harness install with a record per target, `--update`
69
+ over every installation, `--verify` failing on a tampered copy, `remove` keeping user data,
70
+ and `verify-package` refusing a version npm does not serve. The suite is 34 tests.
71
+
72
+ ### Changed
73
+
74
+ - `--update` and `--verify` with no harness flag now act on **every** installation found on the
75
+ machine instead of the one resolved target. A machine holding the skill in `~/.claude/skills`
76
+ and in `~/.agents/skills` has two copies, and updating only the resolved one left the other
77
+ silently stale; both verbs print a per-target summary.
78
+ - The runtime layer's entry point is `tools/agents-handoff.mjs`, matching the product name.
79
+ `tools/agent-handoff.mjs` is installed alongside it as a forwarder, so notes and scripts that
80
+ name the old path keep working.
81
+
82
+ ### Fixed
83
+
84
+ - `remove` deleted anything that was not one of three expected directory names, which meant a
85
+ handoff store kept under any other name was destroyed by `remove --force`. Removal is now
86
+ driven by the install manifest — what an install owns is what it copied — and the run prints
87
+ the entries it deliberately kept, including the store and `handoff.config.json`.
88
+
18
89
  ## [2.0.2] - 2026-10-09
19
90
 
20
91
  ### Added
@@ -49,7 +120,7 @@ Add entries under the matching heading as changes land.
49
120
  the development tree has. Sources are written in the shipped tree's terms and resolved against
50
121
  both layouts, and an install that cannot resolve a source now fails with the missing paths
51
122
  instead of warning and continuing.
52
- - CI failed on every run: the runtime-layer smoke test ran `agent-handoff.mjs list`, which is not
123
+ - CI failed on every run: the runtime-layer smoke test ran `agents-handoff.mjs list`, which is not
53
124
  a verb of that tool (it exits 2). The step builds a handoff into a scratch store and runs
54
125
  `index`, a verb that exists.
55
126
  - The shipped version disagreed across files: `SKILL.md` said 2.0.0 while `skill.json` and
@@ -107,7 +178,7 @@ documentation site.
107
178
 
108
179
  ### Added
109
180
 
110
- - **Capture engine** (`tools/handoff.mjs`, published as the `agent-handoff` bin). `build`
181
+ - **Capture engine** (`tools/handoff.mjs`, published as the `agents-handoff` bin). `build`
111
182
  reads a JSONL or plain-text transcript and writes a handoff directory:
112
183
  `HANDOFF.md`, `HANDOFF.summary.json`, `HANDOFF.llm.json`, `timeline.jsonl`, `TOOLS.md`,
113
184
  `manifest.json`. Also `list`, `show`, `verify`, `rename`, `retitle` and `config`.
@@ -121,7 +192,7 @@ documentation site.
121
192
  - **Store-root resolution** (`tools/lib/handoff-root.mjs`): `HANDOFFS_ROOT`, then
122
193
  `handoff.config.json` found by walking up, then a `handoffs/` directory on the same walk,
123
194
  then the skill directory. Reported by `handoff.mjs config`.
124
- - **Runtime layer** (`tools/agent-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
195
+ - **Runtime layer** (`tools/agents-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
125
196
  `federated-merge`, `self-improve`, `index`. Every mutating command takes a lock, backs up
126
197
  before writing, verifies after applying, and rolls back on failure.
127
198
  - **Bounded execution** (`tools/runtime-engine.mjs`): risk classes `R0`–`R4` evaluated against
@@ -131,8 +202,8 @@ documentation site.
131
202
  `command` probes that report `healthy` / `unhealthy` / `unknown` with the evidence behind
132
203
  each verdict.
133
204
  - **Installer** (`install/`, package `agents-handoff`): `install`, `update`, `remove`,
134
- `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agent-handoff`,
135
- or `./skills/agent-handoff`.
205
+ `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agents-handoff`,
206
+ or `./skills/agents-handoff`.
136
207
  - **Documentation site** at <https://alot1z.github.io/agent-handoff/>, built by GitHub Pages
137
208
  from `docs/`.
138
209
  - **CI** (`.github/workflows/ci.yml`): the test suite on Node 18, 20 and 22, a runtime-layer
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # agent-handoff
1
+ # agents-handoff
2
2
 
3
3
  **[Installation guide →](https://alot1z.github.io/agent-handoff/INSTALL.html)** · **[Documentation →](https://alot1z.github.io/agent-handoff/)** · **[Changelog](CHANGELOG.md)**
4
4
 
@@ -8,22 +8,68 @@
8
8
 
9
9
  One handoff format for every AI coding harness. A working session — messages, tool calls,
10
10
  reasoning, and the provenance to prove where each byte came from — is captured as a folder
11
- that a fresh agent can continue from with zero shared memory.
11
+ that a fresh agent can continue from with zero shared memory. Zero runtime dependencies,
12
+ Node.js 18 or newer, nothing read from the network at run time.
12
13
 
13
- - Zero runtime dependencies; Node.js 18 or newer.
14
- - Reads any JSONL or plain-text transcript, whatever produced it.
15
- - Every artifact carries a sha256 provenance chain, and `verify` recomputes it.
16
- - Writes are backed up, verified and rolled back on failure.
14
+ ![agents-handoff: one install into every harness, a verified handoff, and an installation
15
+ proved against the published npm tarball](assets/handoff-demo.gif)
16
+
17
+ *An abbreviated run of 2.0.3: `--all` installs into every harness found, a session is captured
18
+ and verified, and `--verify-package` proves the installed copy is the published one. The sample
19
+ session is illustrative; the command and output shapes are the real ones.*
17
20
 
18
21
  ## Install
19
22
 
20
23
  ```bash
21
- npx agents-handoff
22
- npx agents-handoff where # show the resolved install root, and why it was chosen
24
+ npx agents-handoff --all # every harness found on this machine, in one run
25
+ ```
26
+
27
+ That is the whole install. Choose your stack instead — one harness, several, or a skills
28
+ directory of your own:
29
+
30
+ | Command | Installs into |
31
+ |---|---|
32
+ | `npx agents-handoff --claude` | `~/.claude/skills` — Claude Code |
33
+ | `npx agents-handoff --codex` | `~/.codex/skills` — Codex CLI |
34
+ | `npx agents-handoff --agents` | `~/.agents/skills` — the harness-neutral store |
35
+ | `npx agents-handoff --harness claude,codex` | the named harnesses, in one run |
36
+ | `npx agents-handoff --project --claude` | `./.claude/skills` — this repository only |
37
+ | `npx agents-handoff --skills-dir <dir>` | any other stack, exactly |
38
+
39
+ Without a harness flag the installer resolves the global root rather than hard-coding one and
40
+ reports which it chose — `npx agents-handoff where` prints the same decision on its own.
41
+
42
+ ### Or straight from the repository
43
+
44
+ ```bash
45
+ npx github:Alot1z/agent-handoff --claude # run the installer from GitHub, no npm
46
+ ```
47
+
48
+ ```bash
49
+ git clone https://github.com/Alot1z/agent-handoff.git
50
+ cd agent-handoff
51
+ node install/install.mjs --all # the same installer, run from the tree
52
+ ```
53
+
54
+ ### Update it, and check it against the published package
55
+
56
+ ```bash
57
+ npx agents-handoff --update # every installation found, one run
58
+ npx agents-handoff --verify --provenance # every installation, against its own record
59
+ npx agents-handoff --verify-package --record # against the tarball npm is serving
60
+ npx agents-handoff --doctor # what is here, and is it intact
61
+ npx agents-handoff --remove # removes the skill; your store is kept
23
62
  ```
24
63
 
25
- The installer resolves the global root instead of hard-coding one. The resolution order,
26
- the location targets and the requirements are in the
64
+ Every install writes `.agents-handoff-install.json` beside the skill: a sha256 over the
65
+ installed file set, what it was installed from, and a `package` block naming the version it
66
+ should match. `verify` recomputes that hash and fails when a file changed, so an installation
67
+ is checkable rather than merely present; `verify-package` fetches the published tarball,
68
+ checks it against the registry's own integrity and shasum, and compares the installed files
69
+ with the package file by file — `--record` stores the tarball hashes in the install record.
70
+ `update` and `verify` with no harness flag act on **every** installation found, and `remove`
71
+ deletes only what the install manifest owns, printing what it kept, so a store survives under
72
+ any name. The resolution order, the location targets and the requirements are in the
27
73
  **[installation guide](https://alot1z.github.io/agent-handoff/INSTALL.html)** and
28
74
  [docs/INSTALL.md](docs/INSTALL.md).
29
75
 
@@ -86,13 +132,14 @@ Full documentation is published at **<https://alot1z.github.io/agent-handoff/>**
86
132
 
87
133
  ```
88
134
  tools/handoff.mjs capture engine (the CLI above)
89
- tools/agent-handoff.mjs runtime layer: auto, verify-gate, promote, merge, self-improve, index, dispatch
135
+ tools/agents-handoff.mjs runtime layer: auto, verify-gate, promote, merge, self-improve, index, dispatch
136
+ tools/agent-handoff.mjs forwarder to the above, kept so older notes keep working
90
137
  tools/runtime-engine.mjs bounded execution and the permission gate
91
138
  tools/capability-registry.mjs capability health probes
92
139
  tools/lib/ shared store-root resolution
93
140
  docs/ refs/ templates/ documentation, reference material, output templates
94
141
  schemas/ handoff payload and configuration schemas
95
- install/ the npx installer package
142
+ install/ the installer behind the agents-handoff npx package
96
143
  tests/ acceptance fixture and a minimal transcript
97
144
  ```
98
145
 
package/SKILL.md CHANGED
@@ -1,12 +1,12 @@
1
1
  ---
2
- name: agent-handoff
2
+ name: agents-handoff
3
3
  description: >-
4
4
  Write, verify, and hand off complete AI working sessions across any harness
5
5
  (Claude Code, Codex, DeepSeek Harness, plain JSONL or text logs). Captures a
6
6
  session as a portable, sha256-proven handoff folder a fresh agent can continue
7
7
  from with zero shared memory, with versioned contracts, an evidence gate, and
8
8
  backup/verify/rollback on every write. Zero runtime dependencies, no network.
9
- version: 2.0.2
9
+ version: 2.0.4
10
10
  domain: orchestration
11
11
  tokens: 900
12
12
  allowed-tools: Bash(node:*), Read, Edit, Write
@@ -25,8 +25,8 @@ conversation anywhere, with provenance for every artifact.
25
25
  | **L1 Metadata** | Always (frontmatter above) | ~100 | name + description |
26
26
  | **L2 Instructions** | This file, when triggered | <5k | core workflow + commands below |
27
27
  | **L3 Resources** | As needed | none until read | `docs/`, `templates/`, `refs/`, `tools/handoff.mjs` |
28
- | **L4 Dynamic** | When you need runtime/self-adapting | none until run | `tools/agent-handoff.mjs`: auto, verify-gate, promote, merge, self-improve |
29
- | **L5 Collaborative** | Verified handoff dispatches a worker | none until run | `tools/agent-handoff.mjs` dispatch + `docs/LEVEL5.md` |
28
+ | **L4 Dynamic** | When you need runtime/self-adapting | none until run | `tools/agents-handoff.mjs`: auto, verify-gate, promote, merge, self-improve |
29
+ | **L5 Collaborative** | Verified handoff dispatches a worker | none until run | `tools/agents-handoff.mjs` dispatch + `docs/LEVEL5.md` |
30
30
 
31
31
  ## What this skill is (capabilities + contracts)
32
32
 
@@ -100,13 +100,13 @@ FOLLOW_UP:
100
100
 
101
101
  ### D. Level 4 runtime + L5 dispatch
102
102
  ```bash
103
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs auto --source <file> --session <id> --harness <h> --project <p>
104
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs verify-gate <id-prefix>
105
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs promote <id-prefix>
106
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs merge <a> <b>
107
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs self-improve
108
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs index
109
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs dispatch <id-prefix> --task "<objective>" [--broker <orchestrator-root> --live]
103
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs auto --source <file> --session <id> --harness <h> --project <p>
104
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs verify-gate <id-prefix>
105
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs promote <id-prefix>
106
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs merge <a> <b>
107
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs self-improve
108
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs index
109
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs dispatch <id-prefix> --task "<objective>" [--broker <orchestrator-root> --live]
110
110
  ```
111
111
  Dispatch re-runs the evidence gate first; carries manifest sha256; dry-run by default
112
112
  (autonomy ladder: workflow-execute requires explicit --live).
@@ -137,7 +137,7 @@ Dispatch re-runs the evidence gate first; carries manifest sha256; dry-run by de
137
137
  | Fresh-session bootstrap | `refs/bootstrap.md` |
138
138
  | Brief discipline | `refs/brief-checklist.md` |
139
139
  | Engine source | `tools/handoff.mjs` |
140
- | L4 runtime | `tools/agent-handoff.mjs` |
140
+ | L4 runtime | `tools/agents-handoff.mjs` |
141
141
  | L4/L5 design | `docs/LEVEL4.md`, `docs/LEVEL5.md` |
142
142
  | Cross-harness adapters | `refs/ADAPTERS.md` |
143
143
  | Handoff format + schema | `docs/FORMAT.md`, `templates/` |
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "id": "filesystem.write",
13
13
  "kind": "dir-writable",
14
- "target": ".agent-handoff",
14
+ "target": ".agents-handoff",
15
15
  "required": true,
16
16
  "purpose": "persist runtime state and checkpoints"
17
17
  },
@@ -11,7 +11,7 @@ elsewhere means either pasting the chat back in, or starting from memory. Both l
11
11
  that matters: the exact turns, the tool calls, and the ability to prove which source bytes
12
12
  produced the brief you are reading.
13
13
 
14
- agent-handoff turns the session into files instead. A directory of plain text and JSON, a
14
+ agents-handoff turns the session into files instead. A directory of plain text and JSON, a
15
15
  hash chain over it, and a fixed folder layout. Anything that can read a file can continue
16
16
  from one, with no shared memory between the two sessions.
17
17
 
@@ -22,10 +22,10 @@ Five layers, each with one job, and each usable without the ones above it.
22
22
  | Layer | File | Job |
23
23
  |---|---|---|
24
24
  | Capture engine | `tools/handoff.mjs` | Turns one transcript into one handoff folder. Passive: something has to invoke it. |
25
- | Runtime layer | `tools/agent-handoff.mjs` | Acts on the state of the store: staleness, gates, composition, imports, index. |
25
+ | Runtime layer | `tools/agents-handoff.mjs` | Acts on the state of the store: staleness, gates, composition, imports, index. |
26
26
  | Bounded execution | `tools/runtime-engine.mjs` | Decides whether an operation may run, before running it. |
27
27
  | Capability probes | `tools/capability-registry.mjs` | Reports what a declared capability actually does on this machine. |
28
- | Distribution | `install/install.mjs` | Puts the skill where a client will look for it. |
28
+ | Distribution | `install/install.mjs` | Puts the skill where a client will look for it — one harness, several at once, or an exact directory — and records what it installed. |
29
29
 
30
30
  The capture engine has no opinion about installation, and the runtime layer has no opinion
31
31
  about transcripts — it shells out to the engine for builds and verification. That split is
@@ -90,6 +90,23 @@ What the chain detects: a manifest edited by hand, a truncated or extended timel
90
90
  payload that no longer parses. What it does not do is prove that the source was authentic —
91
91
  read [PROVENANCE.md](PROVENANCE.md) for the precise boundary.
92
92
 
93
+ ## Install provenance
94
+
95
+ A handoff folder proves what it was built from. An installation answers a different question:
96
+ what is on this machine, and where did it come from. The installer writes
97
+ `.agents-handoff-install.json` into every copy it makes, and `verify` re-hashes the same file
98
+ set to compare the copy with that record.
99
+
100
+ | Value | Definition |
101
+ |---|---|
102
+ | `files_sha256` | SHA-256 over the sorted `path\0sha256(file)` lines of every manifest file. |
103
+ | `files` | Per-file sha256 values, so a mismatch names the file that changed. |
104
+ | `source` | `tree` for a copy made from a checkout or archive beside the installer, or `archive` with the tag and the archive's own sha256 when the copy was fetched. |
105
+
106
+ The install record is a record, not a signature: it proves what was installed and detects
107
+ drift, and it cannot prove the tree it came from was trustworthy. That distinction is stated
108
+ in full in [PROVENANCE.md](PROVENANCE.md).
109
+
93
110
  ## Concurrency and write safety
94
111
 
95
112
  Every mutating runtime command takes a lock before touching the store. Locks live in
@@ -145,19 +162,25 @@ stated in the command reference rather than left for a caller to discover.
145
162
 
146
163
  ```
147
164
  tools/handoff.mjs capture engine
148
- tools/agent-handoff.mjs runtime layer
165
+ tools/agents-handoff.mjs runtime layer
166
+ tools/agent-handoff.mjs forwarder from the runtime layer's pre-rename path
149
167
  tools/runtime-engine.mjs bounded execution
150
168
  tools/capability-registry.mjs capability probes
151
169
  tools/lib/handoff-root.mjs store-root resolution (single owner)
152
170
  tools/handoff.test.mjs the hermetic test suite
153
171
  docs/ this documentation and the Pages site
172
+ docs/SESSIONS.md the session index, rendered from a real store
173
+ .github/scripts/ generators and checks: the session index, the doc link check
154
174
  refs/ reference material: adapters, protocol, roles, brief checklist
155
175
  templates/ handoff templates and the LLM payload schema
156
176
  schemas/ the portable handoff payload schema
157
- install/ the npx installer package
177
+ install/ the installer behind the agents-handoff npx package
158
178
  tests/ acceptance fixture and a minimal transcript
159
179
  ```
160
180
 
181
+ Inside an installed copy — not in this repository — the installer adds
182
+ `.agents-handoff-install.json`, the record of what landed there and what it was made from.
183
+
161
184
  The documentation site at <https://alot1z.github.io/agent-handoff/> is built by GitHub Pages
162
185
  directly from `docs/`. `docs/_data/nav.yml` is the navigation, `docs/_config.yml` is the
163
186
  Jekyll configuration, and `.github/scripts/check-docs.mjs` fails CI when a page is missing
package/docs/CHANGELOG.md CHANGED
@@ -4,7 +4,7 @@ title: Changelog
4
4
 
5
5
  # Changelog
6
6
 
7
- All notable changes to agent-handoff are recorded here.
7
+ All notable changes to agents-handoff are recorded here.
8
8
 
9
9
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
10
10
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases before 2.0.0
@@ -12,15 +12,86 @@ were development builds and were never published, so they are not listed.
12
12
 
13
13
  The version in [package.json](https://github.com/Alot1z/agent-handoff/blob/main/package.json)
14
14
  and [skill.json](https://github.com/Alot1z/agent-handoff/blob/main/skill.json) is the release
15
- version. The version of the separate installer package is in
16
- [install/package.json](https://github.com/Alot1z/agent-handoff/blob/main/install/package.json)
17
- and has its own
18
- [changelog](https://github.com/Alot1z/agent-handoff/blob/main/install/CHANGELOG.md).
15
+ version, and it is the version published to npm: the repository root is the
16
+ [`agents-handoff`](https://www.npmjs.com/package/agents-handoff) package.
19
17
 
20
18
  ## [Unreleased]
21
19
 
22
20
  Add entries under the matching heading as changes land.
23
21
 
22
+ ## [2.0.4] - 2026-10-09
23
+
24
+ ### Added
25
+
26
+ - A demo animation on the README and the documentation home page: one run installing into every
27
+ harness, a session captured and verified, and an installation proved against the published
28
+ tarball (`assets/handoff-demo.gif`).
29
+ - **[Compatibility](https://github.com/Alot1z/agent-handoff/blob/main/docs/COMPATIBILITY.md)**
30
+ (`docs/COMPATIBILITY.md`) now records what was measured rather than what
31
+ is assumed: Node 26 verified, and Bun verified as an alternative runtime — the engine's
32
+ verbs run unchanged there, and the suite passes 34/34 with `bun test --timeout 30000` (Bun's
33
+ default 5-second per-test timeout is shorter than the suite's child-process tests). It also
34
+ states why the artifacts are JavaScript rather than TypeScript: the contracts are the
35
+ versioned JSON Schemas the runtime validates against, and a build step would put a compiler
36
+ between a user and a working tool.
37
+
38
+ ### Fixed
39
+
40
+ - `--update` and `--verify` reported "no installations found" on a machine whose copies predate
41
+ the 2.0.3 rename, because they only looked for `agents-handoff/`. Both now recognise the
42
+ `agent-handoff/` directory every earlier release installed and act on it in place.
43
+ - The global-root search missed `~/.config`, which is where a desktop client keeps its
44
+ account-skill store on Windows too — so that store's installation was invisible to `--list`,
45
+ `--update`, `--verify` and `doctor` even though the client kept reading it.
46
+
47
+ ### Changed
48
+
49
+ - `remove` states what it keeps before asking, so its confirmation matches what it does.
50
+
51
+ ## [2.0.3] - 2026-10-09
52
+
53
+ ### Added
54
+
55
+ - **Named harness targets.** One run can install the skill into Claude Code, Codex CLI and the
56
+ harness-neutral `~/.agents/skills` at once: `--claude`, `--codex`, `--agents`,
57
+ `--harness claude,codex` (repeatable), `--all` for every harness whose directory exists on
58
+ this machine, `--skills-dir <dir>` for any other stack, and `--project` for the
59
+ per-repository form. Every target gets its own copy and its own install record.
60
+ - **`verify-package`**, a verb that checks an installation against the package npm is actually
61
+ serving for its version: it verifies the downloaded tarball against the registry's own
62
+ `integrity` and `shasum`, compares the published file set with the installed one file by
63
+ file, and compares the tarball sha256 with the value recorded for that install. `--record`
64
+ stores the tarball hashes in the install record, so later runs compare with a stored value.
65
+ - The install record (`.agents-handoff-install.json`) now carries a `package` block — name,
66
+ version, registry, tarball URL, and the sha256/sha512/integrity/shasum filled in by
67
+ `verify-package` — so an installation can be checked against the published artifact rather
68
+ than only against itself.
69
+ - Installing from the repository without publishing: `npx github:Alot1z/agent-handoff` runs the
70
+ same installer straight from GitHub, and the installation guide documents both that and the
71
+ clone-and-run path.
72
+ - Five installer behaviour tests — multi-harness install with a record per target, `--update`
73
+ over every installation, `--verify` failing on a tampered copy, `remove` keeping user data,
74
+ and `verify-package` refusing a version npm does not serve. The suite is 34 tests.
75
+
76
+ ### Changed
77
+
78
+ - `--update` and `--verify` with no harness flag now act on **every** installation found on the
79
+ machine instead of the one resolved target. A machine holding the skill in `~/.claude/skills`
80
+ and in `~/.agents/skills` has two copies, and updating only the resolved one left the other
81
+ silently stale; both verbs print a per-target summary.
82
+ - The runtime layer's entry point is `tools/agents-handoff.mjs`, matching the product name.
83
+ `tools/agent-handoff.mjs` is installed alongside it as a forwarder, so notes and scripts that
84
+ name the old path keep working.
85
+
86
+ ### Fixed
87
+
88
+ - `remove` deleted anything that was not one of three expected directory names, which meant a
89
+ handoff store kept under any other name was destroyed by `remove --force`. Removal is now
90
+ driven by the install manifest — what an install owns is what it copied — and the run prints
91
+ the entries it deliberately kept, including the store and `handoff.config.json`.
92
+
93
+ ## [2.0.2] - 2026-10-09
94
+
24
95
  ### Added
25
96
 
26
97
  - **[Session index](https://alot1z.github.io/agent-handoff/SESSIONS.html)** (`docs/SESSIONS.md`):
@@ -30,16 +101,19 @@ Add entries under the matching heading as changes land.
30
101
  the engine from the two transcripts this repository ships, and
31
102
  `.github/scripts/build-sessions-index.mjs --check` fails the build when the page and the store
32
103
  disagree.
33
- - The installer is published to npm from the release workflow: a tag publishes `install/` as
34
- `agents-handoff`, skips a version npm already has, and reports — without failing the
35
- release — when `NPM_TOKEN` is not configured.
104
+ - The skill is published to npm as
105
+ [`agents-handoff`](https://www.npmjs.com/package/agents-handoff), from the repository root,
106
+ and the release workflow publishes it on a tag: it skips a version npm already has, and
107
+ reports — without failing the release — when `NPM_TOKEN` is not configured. The package
108
+ carries the skill tree, so `npx agents-handoff` installs with no download.
109
+ - `npm test`, `npm run check:docs` and `npm run check:session-index` are wired into
110
+ `prepublishOnly`, so a tree whose suite, links or session index are stale cannot be published.
36
111
 
37
112
  ### Changed
38
113
 
39
- - `npx agents-handoff` now installs the skill as documented. The published package
40
- carries `install/` alone, so the installer downloads the archive for the requested version and
41
- copies from it. It previously looked for the skill files beside itself, found none, and
42
- reported success while installing nothing.
114
+ - `npx agents-handoff` now installs the skill as documented. It previously looked for the skill
115
+ files beside itself, found none, and reported success while installing nothing; a bare copy of
116
+ `install/` still falls back to downloading the archive for the requested version.
43
117
  - The clean-checkout suite builds its fixture from the shipped projection rather than the
44
118
  development tree, which is what let the installer's broken source paths pass every local test.
45
119
 
@@ -50,7 +124,7 @@ Add entries under the matching heading as changes land.
50
124
  the development tree has. Sources are written in the shipped tree's terms and resolved against
51
125
  both layouts, and an install that cannot resolve a source now fails with the missing paths
52
126
  instead of warning and continuing.
53
- - CI failed on every run: the runtime-layer smoke test ran `agent-handoff.mjs list`, which is not
127
+ - CI failed on every run: the runtime-layer smoke test ran `agents-handoff.mjs list`, which is not
54
128
  a verb of that tool (it exits 2). The step builds a handoff into a scratch store and runs
55
129
  `index`, a verb that exists.
56
130
  - The shipped version disagreed across files: `SKILL.md` said 2.0.0 while `skill.json` and
@@ -108,7 +182,7 @@ documentation site.
108
182
 
109
183
  ### Added
110
184
 
111
- - **Capture engine** (`tools/handoff.mjs`, published as the `agent-handoff` bin). `build`
185
+ - **Capture engine** (`tools/handoff.mjs`, published as the `agents-handoff` bin). `build`
112
186
  reads a JSONL or plain-text transcript and writes a handoff directory:
113
187
  `HANDOFF.md`, `HANDOFF.summary.json`, `HANDOFF.llm.json`, `timeline.jsonl`, `TOOLS.md`,
114
188
  `manifest.json`. Also `list`, `show`, `verify`, `rename`, `retitle` and `config`.
@@ -122,7 +196,7 @@ documentation site.
122
196
  - **Store-root resolution** (`tools/lib/handoff-root.mjs`): `HANDOFFS_ROOT`, then
123
197
  `handoff.config.json` found by walking up, then a `handoffs/` directory on the same walk,
124
198
  then the skill directory. Reported by `handoff.mjs config`.
125
- - **Runtime layer** (`tools/agent-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
199
+ - **Runtime layer** (`tools/agents-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
126
200
  `federated-merge`, `self-improve`, `index`. Every mutating command takes a lock, backs up
127
201
  before writing, verifies after applying, and rolls back on failure.
128
202
  - **Bounded execution** (`tools/runtime-engine.mjs`): risk classes `R0`–`R4` evaluated against
@@ -132,8 +206,8 @@ documentation site.
132
206
  `command` probes that report `healthy` / `unhealthy` / `unknown` with the evidence behind
133
207
  each verdict.
134
208
  - **Installer** (`install/`, package `agents-handoff`): `install`, `update`, `remove`,
135
- `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agent-handoff`,
136
- or `./skills/agent-handoff`.
209
+ `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agents-handoff`,
210
+ or `./skills/agents-handoff`.
137
211
  - **Documentation site** at <https://alot1z.github.io/agent-handoff/>, built by GitHub Pages
138
212
  from `docs/`.
139
213
  - **CI** (`.github/workflows/ci.yml`): the test suite on Node 18, 20 and 22, a runtime-layer