Repository navigation
Releases: six5536/agent-harness-adapter
Releases · six5536/agent-harness-adapter
Release list
v0.2.2
v0.2.1
This release is a fix of the 0.2.0 release process.
v0.2.0
Released: 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 install
without--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 a
context.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 are
schema/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.
v0.1.0
Released: 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(module
agent_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) and
ManifestTool, aToolover it.hook::wire: the hook contract (version 1):input_json,parse_answer,
answer_json;HookInput,ToolCall,Event,ToolKindandAnswer
are 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 asshared, 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) and
agents(any agent that readsAGENTS.md). hook:Event,HookInput,ToolCall/ToolKind,Answer(Allow,
Deny,Continue,Context),Output,emitthrough a harness, and
LoopGuard. 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.