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 +77 -6
- package/README.md +59 -12
- package/SKILL.md +12 -12
- package/capability-registry.json +1 -1
- package/docs/ARCHITECTURE.md +28 -5
- package/docs/CHANGELOG.md +91 -17
- package/docs/CLI.md +115 -12
- package/docs/COMPATIBILITY.md +24 -0
- package/docs/CONTRIBUTING.md +2 -2
- package/docs/FORMAT.md +28 -0
- package/docs/INSTALL.md +239 -24
- package/docs/INTEGRATION.md +4 -4
- package/docs/LEVEL4.md +10 -10
- package/docs/LEVEL5.md +1 -1
- package/docs/PERMISSIONS.md +2 -2
- package/docs/PROVENANCE.md +27 -0
- package/docs/SECURITY.md +1 -1
- package/docs/SESSIONS.md +31 -0
- package/docs/UNINSTALL.md +47 -21
- package/docs/UPGRADE.md +59 -21
- package/docs/_config.yml +3 -1
- package/docs/index.md +17 -6
- package/docs/sessions.json +34 -0
- package/install/CHANGELOG.md +1 -1
- package/install/README.md +7 -7
- package/install/install.mjs +746 -147
- package/install/package.json +2 -2
- package/package.json +2 -2
- package/permission-policy.json +1 -1
- package/refs/protocol.md +1 -1
- package/schemas/handoff.schema.json +1 -1
- package/skill.json +11 -11
- package/tests/acceptance/acceptance.yaml +2 -2
- package/tools/agent-handoff.mjs +16 -404
- package/tools/agents-handoff.mjs +410 -0
- package/tools/capability-registry.mjs +2 -2
- package/tools/handoff.test.mjs +203 -0
- package/tools/lib/handoff-root.mjs +1 -1
- package/tools/runtime-engine.mjs +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
All notable changes to
|
|
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 `
|
|
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 `
|
|
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/
|
|
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/
|
|
135
|
-
or `./skills/
|
|
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
|
-
#
|
|
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
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+

|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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/
|
|
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
|
|
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:
|
|
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.
|
|
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/
|
|
29
|
-
| **L5 Collaborative** | Verified handoff dispatches a worker | none until run | `tools/
|
|
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/
|
|
104
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
105
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
106
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
107
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
108
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
109
|
-
HANDOFFS_ROOT=<store> node tools/
|
|
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/
|
|
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/` |
|
package/capability-registry.json
CHANGED
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -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
|
-
|
|
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/
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
16
|
-
[
|
|
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
|
|
34
|
-
`agents-handoff
|
|
35
|
-
release
|
|
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.
|
|
40
|
-
|
|
41
|
-
|
|
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 `
|
|
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 `
|
|
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/
|
|
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/
|
|
136
|
-
or `./skills/
|
|
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
|