agents-handoff 0.0.0-stage → 2.0.2

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 (54) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/LICENSE +21 -0
  3. package/README.md +110 -2
  4. package/SKILL.md +147 -0
  5. package/capability-registry.json +27 -0
  6. package/docs/ARCHITECTURE.md +164 -0
  7. package/docs/CHANGELOG.md +151 -0
  8. package/docs/CLI.md +196 -0
  9. package/docs/COMPATIBILITY.md +124 -0
  10. package/docs/CONTRIBUTING.md +134 -0
  11. package/docs/FORMAT.md +157 -0
  12. package/docs/INSTALL.md +179 -0
  13. package/docs/INTEGRATION.md +188 -0
  14. package/docs/LEVEL4.md +202 -0
  15. package/docs/LEVEL5.md +96 -0
  16. package/docs/PERMISSIONS.md +145 -0
  17. package/docs/PROVENANCE.md +83 -0
  18. package/docs/SECURITY.md +93 -0
  19. package/docs/SESSIONS.md +66 -0
  20. package/docs/TROUBLESHOOTING.md +158 -0
  21. package/docs/UNINSTALL.md +122 -0
  22. package/docs/UPGRADE.md +139 -0
  23. package/docs/_config.yml +16 -0
  24. package/docs/_data/nav.yml +36 -0
  25. package/docs/_layouts/default.html +31 -0
  26. package/docs/assets/style.css +88 -0
  27. package/docs/index.md +83 -0
  28. package/handoff.config.example.json +35 -0
  29. package/handoff.config.schema.json +117 -0
  30. package/install/CHANGELOG.md +48 -0
  31. package/install/README.md +76 -0
  32. package/install/install.mjs +856 -0
  33. package/install/package.json +39 -0
  34. package/package.json +66 -4
  35. package/permission-policy.json +33 -0
  36. package/refs/ADAPTERS.md +33 -0
  37. package/refs/bootstrap.md +59 -0
  38. package/refs/brief-checklist.md +79 -0
  39. package/refs/handbook.md +58 -0
  40. package/refs/protocol.md +117 -0
  41. package/refs/roles.md +75 -0
  42. package/refs/validator.md +73 -0
  43. package/schemas/handoff.schema.json +275 -0
  44. package/skill.json +147 -0
  45. package/templates/HANDOFF.llm.schema.json +144 -0
  46. package/templates/HANDOFF.template.md +40 -0
  47. package/tests/acceptance/acceptance.yaml +209 -0
  48. package/tests/fixtures/minimal-transcript.jsonl +2 -0
  49. package/tools/agent-handoff.mjs +410 -0
  50. package/tools/capability-registry.mjs +120 -0
  51. package/tools/handoff.mjs +398 -0
  52. package/tools/handoff.test.mjs +465 -0
  53. package/tools/lib/handoff-root.mjs +161 -0
  54. package/tools/runtime-engine.mjs +330 -0
@@ -0,0 +1,275 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Agent-Handoff",
4
+ "description": "Portable execution state for agent-handoff — canonical handoff schema v1.0",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "handoff_id",
9
+ "mission_id",
10
+ "task_id",
11
+ "created_at",
12
+ "updated_at",
13
+ "source",
14
+ "state",
15
+ "next_action"
16
+ ],
17
+ "properties": {
18
+ "schema_version": {
19
+ "type": "string",
20
+ "pattern": "^1\\.0$",
21
+ "description": "Schema version for compatibility checking"
22
+ },
23
+ "handoff_id": {
24
+ "type": "string",
25
+ "minLength": 1,
26
+ "description": "Unique handoff identifier"
27
+ },
28
+ "mission_id": {
29
+ "type": "string",
30
+ "minLength": 1,
31
+ "description": "Mission this handoff belongs to"
32
+ },
33
+ "task_id": {
34
+ "type": "string",
35
+ "minLength": 1,
36
+ "description": "Task this handoff is for"
37
+ },
38
+ "created_at": {
39
+ "type": "string",
40
+ "format": "date-time",
41
+ "description": "ISO 8601 creation timestamp"
42
+ },
43
+ "updated_at": {
44
+ "type": "string",
45
+ "format": "date-time",
46
+ "description": "ISO 8601 last update timestamp"
47
+ },
48
+ "source": {
49
+ "type": "object",
50
+ "required": ["agent", "runtime", "version"],
51
+ "properties": {
52
+ "agent": { "type": "string" },
53
+ "runtime": { "type": "string" },
54
+ "version": { "type": "string" }
55
+ },
56
+ "description": "Source agent/runtime that created this handoff"
57
+ },
58
+ "target": {
59
+ "type": "object",
60
+ "properties": {
61
+ "agent": { "type": "string" },
62
+ "runtime": { "type": "string" },
63
+ "version": { "type": "string" }
64
+ },
65
+ "description": "Target agent/runtime for resume"
66
+ },
67
+ "input_contract": {
68
+ "type": "object",
69
+ "description": "Input contract for the session that produced this handoff"
70
+ },
71
+ "state": {
72
+ "type": "object",
73
+ "required": ["status", "current_action"],
74
+ "properties": {
75
+ "status": {
76
+ "type": "string",
77
+ "enum": ["PENDING", "ACTIVE", "COMPLETED", "SATISFIED", "NOT_APPLICABLE", "BLOCKED", "FAILED", "IN_PROGRESS"]
78
+ },
79
+ "current_action": { "type": "string" },
80
+ "completed_work": {
81
+ "type": "array",
82
+ "items": { "type": "string" }
83
+ },
84
+ "pending_work": {
85
+ "type": "array",
86
+ "items": { "type": "string" }
87
+ },
88
+ "blockers": {
89
+ "type": "array",
90
+ "items": { "type": "object" }
91
+ },
92
+ "unknowns": {
93
+ "type": "array",
94
+ "items": { "type": "object" }
95
+ },
96
+ "assumptions": {
97
+ "type": "array",
98
+ "items": { "type": "object" }
99
+ }
100
+ }
101
+ },
102
+ "execution": {
103
+ "type": "object",
104
+ "properties": {
105
+ "last_operation": { "type": "string" },
106
+ "result": { "type": "string" },
107
+ "exit_code": { "type": ["integer", "null"] },
108
+ "changed_files": {
109
+ "type": "array",
110
+ "items": { "type": "string" }
111
+ }
112
+ }
113
+ },
114
+ "capabilities": {
115
+ "type": "object",
116
+ "properties": {
117
+ "required": {
118
+ "type": "array",
119
+ "items": { "$ref": "#/definitions/capability" }
120
+ },
121
+ "selected": {
122
+ "type": "array",
123
+ "items": { "$ref": "#/definitions/capability" }
124
+ },
125
+ "unavailable": {
126
+ "type": "array",
127
+ "items": { "$ref": "#/definitions/capability" }
128
+ }
129
+ }
130
+ },
131
+ "permissions": {
132
+ "type": "object",
133
+ "properties": {
134
+ "current": {
135
+ "type": "array",
136
+ "items": { "type": "string" }
137
+ },
138
+ "approvals": {
139
+ "type": "array",
140
+ "items": { "type": "object" }
141
+ }
142
+ }
143
+ },
144
+ "checkpoint": {
145
+ "type": "object",
146
+ "required": ["checkpoint_id", "state_hash", "created_at"],
147
+ "properties": {
148
+ "checkpoint_id": { "type": "string" },
149
+ "predecessor_checkpoint": { "type": "string" },
150
+ "state_summary": { "type": "string" },
151
+ "state_hash": { "type": "string" },
152
+ "created_at": { "type": "string", "format": "date-time" },
153
+ "completed_work": { "type": "array", "items": { "type": "string" } },
154
+ "verified_work": { "type": "array", "items": { "type": "string" } },
155
+ "pending_work": { "type": "array", "items": { "type": "string" } },
156
+ "artifact_manifest": { "type": "array", "items": { "type": "object" } },
157
+ "environment_fingerprint": { "type": "string" },
158
+ "capability_requirements": { "type": "array", "items": { "type": "string" } },
159
+ "permission_state": { "type": "array", "items": { "type": "string" } },
160
+ "verification_results": { "type": "array", "items": { "type": "object" } },
161
+ "next_action": { "type": "string" },
162
+ "recovery_notes": { "type": "string" }
163
+ }
164
+ },
165
+ "artifacts": {
166
+ "type": "object",
167
+ "properties": {
168
+ "manifest": {
169
+ "type": "array",
170
+ "items": {
171
+ "type": "object",
172
+ "required": ["path", "purpose"],
173
+ "properties": {
174
+ "path": { "type": "string" },
175
+ "purpose": { "type": "string" },
176
+ "canonical": { "type": "boolean" },
177
+ "generated": { "type": "boolean" },
178
+ "source_of_truth": { "type": "string" }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ },
184
+ "evidence": {
185
+ "type": "object",
186
+ "properties": {
187
+ "verified": {
188
+ "type": "array",
189
+ "items": { "type": "object" }
190
+ },
191
+ "observed": {
192
+ "type": "array",
193
+ "items": { "type": "object" }
194
+ },
195
+ "unresolved": {
196
+ "type": "array",
197
+ "items": { "type": "object" }
198
+ }
199
+ }
200
+ },
201
+ "decisions": {
202
+ "type": "array",
203
+ "items": {
204
+ "type": "object",
205
+ "required": ["decision", "reason"],
206
+ "properties": {
207
+ "decision": { "type": "string" },
208
+ "reason": { "type": "string" },
209
+ "timestamp": { "type": "string" }
210
+ }
211
+ }
212
+ },
213
+ "errors": {
214
+ "type": "array",
215
+ "items": {
216
+ "type": "object",
217
+ "required": ["error", "timestamp"],
218
+ "properties": {
219
+ "error": { "type": "string" },
220
+ "timestamp": { "type": "string" },
221
+ "resolved": { "type": "boolean" }
222
+ }
223
+ }
224
+ },
225
+ "next_action": {
226
+ "type": "object",
227
+ "required": ["objective"],
228
+ "properties": {
229
+ "objective": { "type": "string" },
230
+ "reason": { "type": "string" },
231
+ "preconditions": { "type": "array", "items": { "type": "string" } },
232
+ "required_capabilities": { "type": "array", "items": { "type": "string" } },
233
+ "required_permissions": { "type": "array", "items": { "type": "string" } },
234
+ "verification": { "type": "array", "items": { "type": "string" } }
235
+ }
236
+ }
237
+ },
238
+ "definitions": {
239
+ "capability": {
240
+ "type": "object",
241
+ "required": ["id", "name", "type", "provider"],
242
+ "properties": {
243
+ "id": { "type": "string" },
244
+ "name": { "type": "string" },
245
+ "type": { "type": "string" },
246
+ "provider": { "type": "string" },
247
+ "purpose": { "type": "string" },
248
+ "inputs": { "type": "array", "items": { "type": "string" } },
249
+ "outputs": { "type": "array", "items": { "type": "string" } },
250
+ "prerequisites": { "type": "array", "items": { "type": "string" } },
251
+ "dependencies": { "type": "array", "items": { "type": "string" } },
252
+ "supports": { "type": "array", "items": { "type": "string" } },
253
+ "does_not_support": { "type": "array", "items": { "type": "string" } },
254
+ "side_effects": { "type": "array", "items": { "type": "string" } },
255
+ "risk_class": { "type": "string", "enum": ["R0", "R1", "R2", "R3", "R4"] },
256
+ "permission_level": { "type": "string" },
257
+ "scope": { "type": "array", "items": { "type": "string" } },
258
+ "targets": { "type": "array", "items": { "type": "string" } },
259
+ "reversibility": { "type": "string" },
260
+ "availability": { "type": "string", "enum": ["available", "unavailable", "degraded"] },
261
+ "health": { "type": "string", "enum": ["healthy", "unhealthy", "unknown"] },
262
+ "version": { "type": "string" },
263
+ "platform": { "type": "array", "items": { "type": "string" } },
264
+ "architecture": { "type": "array", "items": { "type": "string" } },
265
+ "cost": { "type": "string" },
266
+ "latency": { "type": "string" },
267
+ "failure_modes": { "type": "array", "items": { "type": "string" } },
268
+ "verification_method": { "type": "string" },
269
+ "provenance": { "type": "string" },
270
+ "trust": { "type": "string", "enum": ["BUILT_IN", "PROJECT", "LOCAL", "USER_AUTHORIZED_EXTERNAL", "EXTERNAL", "UNTRUSTED"] }
271
+ }
272
+ }
273
+ },
274
+ "additionalProperties": false
275
+ }
package/skill.json ADDED
@@ -0,0 +1,147 @@
1
+ {
2
+ "name": "agent-handoff",
3
+ "version": "2.0.2",
4
+ "description": "Write, verify, and hand off complete AI working sessions across any harness (Claude Code, Codex, DeepSeek Harness, plain JSONL or text logs). Cross-harness session capture + verified continuation.",
5
+ "domain": "orchestration",
6
+ "installer": {
7
+ "type": "npx",
8
+ "package": "agents-handoff",
9
+ "packageVersion": "2.0.2",
10
+ "repository": "https://github.com/Alot1z/agent-handoff",
11
+ "installCommand": "npx agents-handoff"
12
+ },
13
+ "locations": {
14
+ "source": "skills/agent-handoff/",
15
+ "global": {
16
+ "windows": "<store>/<account-id>/<profile-id>/agent-handoff/ (resolved, see docs/INSTALL.md)",
17
+ "posix": "~/.config/<client>/account-skills/<account-id>/<profile-id>/agent-handoff/ (resolved)"
18
+ },
19
+ "local": "./local/skills/agent-handoff/",
20
+ "project": "./skills/agent-handoff/"
21
+ },
22
+ "dependencies": {
23
+ "node": ">=18.0.0",
24
+ "external": []
25
+ },
26
+ "commands": {
27
+ "build": "node tools/handoff.mjs build --source <input> [--session id] [--harness name] [--model name] [--project name] [--objective text]",
28
+ "build-alias": "node tools/handoff.mjs --handoff --source <input>",
29
+ "list": "node tools/handoff.mjs list [project-or-prefix]",
30
+ "show": "node tools/handoff.mjs show <id-prefix>",
31
+ "verify": "node tools/handoff.mjs verify <id-prefix>",
32
+ "rename": "node tools/handoff.mjs rename <id-prefix> <new-project>",
33
+ "retitle": "node tools/handoff.mjs retitle <id-prefix> <new-name>"
34
+ },
35
+ "l4": {
36
+ "runtime": "node tools/agent-handoff.mjs <verb> [args]",
37
+ "verbs": [
38
+ "auto",
39
+ "verify-gate",
40
+ "promote",
41
+ "merge",
42
+ "self-improve",
43
+ "index",
44
+ "dispatch"
45
+ ]
46
+ },
47
+ "handoff": {
48
+ "default_dir": "handoffs/",
49
+ "config_file": "handoff.config.json",
50
+ "environment": {
51
+ "HANDOFFS_ROOT": "Override default handoffs location"
52
+ },
53
+ "max_brief_tokens": 30000,
54
+ "schema_version": "2.0.0"
55
+ },
56
+ "update": {
57
+ "check_url": "https://github.com/Alot1z/agent-handoff/releases/latest",
58
+ "auto_check": true,
59
+ "installer": "npx agents-handoff --update"
60
+ },
61
+ "secrets": {
62
+ "required": false,
63
+ "warning": "Never commit secrets. Use environment variables or local secrets file.",
64
+ "envVars": []
65
+ },
66
+ "files": {
67
+ "source": [
68
+ "SKILL.md",
69
+ "README.md",
70
+ "tools/handoff.mjs",
71
+ "tools/agent-handoff.mjs",
72
+ "tools/handoff.test.mjs",
73
+ "tools/capability-registry.mjs",
74
+ "tools/runtime-engine.mjs",
75
+ "tools/lib/handoff-root.mjs",
76
+ "schemas/handoff.schema.json",
77
+ "templates/*.md",
78
+ "templates/*.json",
79
+ "refs/*.md",
80
+ "install/",
81
+ "tests/"
82
+ ],
83
+ "published": [
84
+ "SKILL.md",
85
+ "README.md",
86
+ "LICENSE",
87
+ "package.json",
88
+ "skill.json",
89
+ "capability-registry.json",
90
+ "permission-policy.json",
91
+ "handoff.config.schema.json",
92
+ "handoff.config.example.json",
93
+ "tools/handoff.mjs",
94
+ "tools/agent-handoff.mjs",
95
+ "tools/handoff.test.mjs",
96
+ "tools/capability-registry.mjs",
97
+ "tools/runtime-engine.mjs",
98
+ "tools/lib/handoff-root.mjs",
99
+ "schemas/handoff.schema.json",
100
+ "templates/HANDOFF.template.md",
101
+ "templates/HANDOFF.llm.schema.json",
102
+ "tests/acceptance/acceptance.yaml",
103
+ "tests/fixtures/minimal-transcript.jsonl",
104
+ "refs/ADAPTERS.md",
105
+ "refs/handbook.md",
106
+ "refs/protocol.md",
107
+ "refs/roles.md",
108
+ "refs/validator.md",
109
+ "refs/brief-checklist.md",
110
+ "refs/bootstrap.md",
111
+ "docs/index.md",
112
+ "docs/INSTALL.md",
113
+ "docs/UPGRADE.md",
114
+ "docs/UNINSTALL.md",
115
+ "docs/INTEGRATION.md",
116
+ "docs/LEVEL4.md",
117
+ "docs/LEVEL5.md",
118
+ "docs/FORMAT.md",
119
+ "docs/PERMISSIONS.md",
120
+ "docs/SECURITY.md",
121
+ "docs/COMPATIBILITY.md",
122
+ "docs/PROVENANCE.md",
123
+ "docs/CONTRIBUTING.md",
124
+ "install/install.mjs",
125
+ "install/README.md",
126
+ "install/package.json",
127
+ "CHANGELOG.md",
128
+ "docs/ARCHITECTURE.md",
129
+ "docs/CLI.md",
130
+ "docs/TROUBLESHOOTING.md",
131
+ "docs/CHANGELOG.md",
132
+ "install/CHANGELOG.md"
133
+ ],
134
+ "local_only": [
135
+ "local/",
136
+ "projects/",
137
+ "links/",
138
+ "tasks/",
139
+ "private research corpus and internal design notes",
140
+ "docs/ARCHITECTURE-UPDATES.md",
141
+ ".env",
142
+ "*.key",
143
+ "*.pem",
144
+ "secrets/"
145
+ ]
146
+ }
147
+ }
@@ -0,0 +1,144 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "AgentSessionHandoff v1",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "session",
8
+ "generated_at",
9
+ "counts",
10
+ "timeline",
11
+ "provenance"
12
+ ],
13
+ "properties": {
14
+ "schema_version": {
15
+ "type": "string", "description": "2.0.0 or 2.0.0-summary"
16
+ },
17
+ "session": {
18
+ "type": "object",
19
+ "required": [
20
+ "id",
21
+ "harness"
22
+ ],
23
+ "properties": {
24
+ "id": {
25
+ "type": "string"
26
+ },
27
+ "harness": {
28
+ "type": "string"
29
+ },
30
+ "model": {
31
+ "type": "string"
32
+ },
33
+ "thread": {
34
+ "type": "string"
35
+ }
36
+ }
37
+ },
38
+ "generated_at": {
39
+ "type": "string"
40
+ },
41
+ "objective": {
42
+ "type": "string"
43
+ },
44
+ "state_now": {
45
+ "type": "string"
46
+ },
47
+ "open_loops": {
48
+ "type": "array",
49
+ "items": {
50
+ "type": "string"
51
+ }
52
+ },
53
+ "evidence_class": {
54
+ "enum": [
55
+ "OBSERVED",
56
+ "VERIFIED",
57
+ "DERIVED"
58
+ ]
59
+ },
60
+ "counts": {
61
+ "type": "object",
62
+ "properties": {
63
+ "USER": {
64
+ "type": "integer"
65
+ },
66
+ "AGENT": {
67
+ "type": "integer"
68
+ },
69
+ "THOUGHT": {
70
+ "type": "integer"
71
+ },
72
+ "TOOL": {
73
+ "type": "integer"
74
+ }
75
+ }
76
+ },
77
+ "timeline": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "object",
81
+ "required": [
82
+ "seq",
83
+ "class",
84
+ "text"
85
+ ],
86
+ "properties": {
87
+ "seq": {
88
+ "type": "integer"
89
+ },
90
+ "ts": {
91
+ "type": [
92
+ "string",
93
+ "integer"
94
+ ]
95
+ },
96
+ "class": {
97
+ "enum": [
98
+ "USER",
99
+ "AGENT",
100
+ "THOUGHT",
101
+ "TOOL",
102
+ "OTHER"
103
+ ],
104
+ "description": "OTHER = kept for raw fidelity (system/meta turns), omitted from human render tables"
105
+ },
106
+ "text": {
107
+ "type": "string"
108
+ }
109
+ }
110
+ }
111
+ },
112
+ "tool_calls": {
113
+ "type": "array"
114
+ },
115
+ "provenance": {
116
+ "type": "object",
117
+ "required": [
118
+ "sources",
119
+ "raw_sha256",
120
+ "total_turns"
121
+ ],
122
+ "properties": {
123
+ "sources": {
124
+ "type": "array",
125
+ "items": {
126
+ "type": "string"
127
+ }
128
+ },
129
+ "raw_sha256": {
130
+ "type": "string"
131
+ },
132
+ "manifest_sha256": {
133
+ "type": "string"
134
+ },
135
+ "watermark": {
136
+ "type": "integer"
137
+ },
138
+ "total_turns": {
139
+ "type": "integer"
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
@@ -0,0 +1,40 @@
1
+ # Handoff: <SESSION-ID>
2
+
3
+ **Harness:** <claude-code|codex|dsh|ci|generic> | **Model:** <name>
4
+ **Updated:** <ISO> | **Turns:** N | **Watermark:** seq <= N | **Revision:** R
5
+
6
+ ## Objective (verbatim head)
7
+
8
+ ```
9
+ <first USER (else AGENT) turn, <=400 chars, never paraphrased>
10
+ ```
11
+
12
+ ## State right now (verbatim tail)
13
+
14
+ ```
15
+ <last AGENT (else USER) turn tail, <=1200 chars>
16
+ ```
17
+
18
+ ## Open loops / next steps
19
+ - <lines matching next step|todo|blocked|open loop|remaining>
20
+
21
+ ## Timeline (recent turns)
22
+
23
+ | seq | class | text (head 140) |
24
+ |---:|---|---|
25
+ | 0 | USER | ... |
26
+
27
+ <!-- classes: USER · AGENT · THOUGHT (reasoning) · TOOL (tool_use/result) · OTHER (raw-fidelity meta, omitted from render) -->
28
+
29
+ ## Tool calls (full)
30
+ - [seq] ts: excerpt <=500 chars
31
+
32
+ ## Provenance
33
+ - sources: <original store paths>
34
+ - raw sha256: <hash of exact ingested bytes>
35
+ - manifest sha256: <self-hash of manifest minus this field>
36
+ - incremental: revisions=N (update-not-recreate; watermark skips emitted turns)
37
+
38
+ !! Laws: RAW IS NEVER ALTERED — handoffs RENDER from canonical/vault data · objectives verbatim ·
39
+ re-run = merge not duplicate (watermark) · every artifact carries sha256 provenance · works on ANY
40
+ harness that emits JSONL or plain text (refs/ADAPTERS.md).