Changelog
This file records the notable changes of each release of agent-harness-adapter. git-cliff writes the notes of each release from the commits of the release, and the notes of 0.1.0 and 0.2.0 were written by hand. While agent-harness-adapter is pre-1.0, a minor version might contain breaking changes.
[0.2.1] - 2026-10-19
This release completes the publish of 0.2.0, which stopped before the Node binding and its Windows addon reached npm. It publishes every crate and package at 0.2.1, and changes nothing else.
[0.2.0] - 2026-10-18
This release is the first that the public repository publishes, from an export of the project’s own repository, and it includes the fixes of 0.1.1, which was never released.
Added
- One agent setup in the standard places:
agent-harness-adapter installwithout--manifestuses the config.agents/agent-harness-adapter.toml(found from the working directory upwards;~/.agents/at user scope), and the first install writes it, withAGENTS.md,.agents/skills,.agents/hooks.json,.mcp.jsonand.agents/agentsas the sources. - Sources:
{ from = "<path>" }forinstructions,skills,hooks,mcp_serversandagents(library:Integration::instructions_from,skills_from,hooks_from,mcp_servers_from,agents_from). An agent that loads a source where it is gets nothing written (shared … (…, in place)); Claude Code gets@AGENTS.mdinCLAUDE.mdand Gemini CLI acontext.fileNameentry; the others a copy. Missing sources are listed (in text output, only those that are not an unused standard place). - The hooks file
.agents/hooks.json, in Claude Code’s hooks format: each event becomes one hook that runsagent-harness-adapter hook --hooks <path> <harness> <event>, which runs the matching entries through the shell at hook time, in every agent.agent-harness-adapter schema hooks. - Harness choice:
--harness, else the installed harnesses, else (in a terminal) a question, with the agents found onPATHpicked. Each harness names its program (Harness::program). hook::file::tool_part: a tool’s hooks as entries of the hooks file, for a harness that loads.agents/hooks.jsonnatively.- Migration from Claude Code: the first
install(orinstall --migrate) movesCLAUDE.md’s text,.claude/skills, Claude Code’s hooks and.claude/agentsinto the standard places. A conflict with what is already there is a note on the first install, and refused with--migrate. - A harness that does not run an event the hooks use says so in its notes;
Devin (no pre-compact), OpenCode and Kilo Code (no session end) name the
events they run (
Harness::hook_events). statusexits 1 when an install would change something (InstallResult::in_sync).- The bindings find the config when no manifest is given (Python
None, Nodenull). - A new documentation site, https://six5536.github.io/agent-harness-adapter/
(Astro Starlight, replacing the mdBook site): a landing page whose terminal
shows the command’s real output, a page per item (instructions, skills,
hooks with what each agent can do, MCP servers and subagents, commands,
scopes), Coming from Claude Code, a page per language, the reference
(config,
.agents/hooks.json, the hook contract, harnesses, schemas) and API references for Node (TypeDoc) and Python (pdoc). Its examples run in CI. It deploys on release tags.
Changed
- Breaking: the hook contract is Claude Code’s hook protocol, in every
harness: Claude Code’s input (each harness’s tool calls named as Claude
Code names them,
Harness::claude_tool, plusharnessandtool_kind), and Claude Code’s answers (exit 2,decision,hookSpecificOutput). In Claude Code a hook’s output passes through unchanged.hook::wire,parse_hook,answer_hookandrun_hookspeak it; the schemas areschema/hook-input.jsonandschema/hook-answer.json. uninstallwithout--harnessremoves every installed harness.installandstatustake--manifestoptionally.- The READMEs lead with the point and link to the site, which holds the only copy of the reference (manifest keys, hook contract, harness table).
Removed
- Breaking: the v1 hook contract (
{"v": 1, …}in,{"answer": …}out),wire::VERSIONand the bindings’HOOK_VERSION.
Fixed
- The library’s module docs (
lib.rs), the Python package’s docstring and the Node binding’s header list every built-in harness: Kilo Code, Qwen Code and Devin were missing (and OpenCode from the bindings). - The Python and Node READMEs’ examples are valid code (
import agent_harness_adapter as aha,const aha = require(…)); the Python README says the package is not on PyPI yet. The library README’s module list names every harness.
[0.1.0] - 2026-10-07
First release: the library agent-harness-adapter-core and the
agent-harness-adapter command (crate agent-harness-adapter, npm
@six5536/agent-harness-adapter).
Added
agent-harness-adaptercommand:install,uninstallandstatusfrom a manifest file,hook(runs a harness’s hook through a command that speaks the hook contract),schema(the contracts’ JSON Schemas, also inschema/). Prebuilt binaries for Linux and macOS (x64, arm64) and Windows (x64) through npm and the GitHub release.- Python binding
six5536-agent-harness-adapter(moduleagent_harness_adapter):install,uninstall,status,parse_hook,answer_hook,run_hook,schema; abi3 wheels for CPython 3.9+. - Node binding
@six5536/agent-harness-adapter-node:install,uninstall,status,parseHook,answerHook,runHook,schema, with TypeScript types; prebuilt addons for Linux (glibc), macOS and Windows. fs::home_dir,harness::expand(all).manifest:Manifest(TOML or JSON, version 1; text inline or from files; skills declared or read from a skill directory (dir); per-scope tables; mistakes reported with their place) andManifestTool, aToolover it.hook::wire: the hook contract (version 1):input_json,parse_answer,answer_json;HookInput,ToolCall,Event,ToolKindandAnswerare serde types.harness::installed: the harnesses recorded at a scope.harness::uninstall(UninstallOptions): takes a tool’s integration back out, keeping the user’s content and edits and whatever another installed harness still reads;Action::Removed/Action::Kept;ExternalPart::removable/remove. In the command and both bindings too.integration:Integration, declared once per scope without naming a harness: an instructions block, skills (Skill, orSkill::from_dirfor an existing skill directory, itsSKILL.mdkept as it is), hooks (Hook), MCP servers (McpServer), allowed commands and MCP tools (allow_command,allow_mcp_tool), subagents (Agent), slash commands (Command), and raw parts for one harness (a raw part may stand for an item the harness does not render).Itemnames each kind.harness: theHarnesscontract (render, reads, hook events, hook parsing and answers, notes),builtin()andfind();install/statusover a set of harnesses withInstallOptions,InstallResult,HarnessResult,PartResult(State,Option<Action>,by);Part(files,region,merge,external);MergeOp(array_entry,object_member,owned_entries,group_entries) withEntryMatch(Prefix,Contains,Any); JSON and TOML merges that keep the file’s style;DeclinedStore/TomlDeclined;Markers; scopesproject,userandlocal.- Shared locations: per item, the fewest locations every harness in the set
loads; the others report the part as
shared, and a warning names any agent that may load something twice. - Harnesses:
claude(Claude Code),codex(OpenAI Codex CLI),factory(Factory Droid),gemini(Gemini CLI),copilot(GitHub Copilot),cursor(Cursor),pi(Pi, through a generated TypeScript extension),opencode(OpenCode, through a generated plugin),kilo(Kilo Code, the same plugin),qwen(Qwen Code),devin(Devin CLI and Devin Local) andagents(any agent that readsAGENTS.md). hook:Event,HookInput,ToolCall/ToolKind,Answer(Allow,Deny,Continue,Context),Output,emitthrough a harness, andLoopGuard. Hook commands are any command line, with optional{harness}and{event}placeholders, and may differ per harness (Hook::command_for).report(Finding,Report,Severity),cli,fs.Errorwith one variant per kind of refusal.- Optional feature
schemars:JsonSchemaon the result types, and the schemas of the result, the manifest and the hook contract. - MSRV 1.85.