Releases: Libr-AI/CommonHarness
Release list
v0.8.0 — skill-distillation gate
What's new
- Skill-distillation gate — at task close-out, the implementer judges (from the finished task's brief/phases, spec, and diff) whether it established a reusable, generalisable procedure future tasks will repeat — e.g. "add an API endpoint end-to-end", "wire a new drag-drop group". Conservatively: most tasks yield nothing, and it proposes only a high-value candidate. If there is one, it names it, explains when it's used and what it covers, and asks whether to distil it. On your yes it writes a tool-agnostic
.harness/skills/<name>/SKILL.md(name + when-to-use trigger + numbered steps + links).- Skills are team-shared (committed), never overwritten by
harness upgrade, and read back by future sessions — the coordinator and implementer list.harness/skills/on startup and apply a matching skill. - New
harness skillslists the library. New[skills] distill = "auto" | "off"gate (defaultauto). - This captures reusable procedures, distinct from
MEMORY.md(facts/conventions) anddocs/ARCHITECTURE.md(the change-X→which-files map).
- Skills are team-shared (committed), never overwritten by
Compatibility
Backward-compatible. .harness/skills/ starts empty and the gate stays silent until a task genuinely warrants a skill. Existing projects: harness upgrade picks up the new gate/templates and creates the empty .harness/skills/ dir; your work is untouched.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.8.0/install.sh | bashv0.7.2 — fenced task-brief template + clearer upgrade messaging
Fixes
- Your brief-template customization survives
harness upgrade..harness/templates/task-brief.mdis now a fenced fragment: the upstream skeleton lives betweenharness:begin/end(refreshed on upgrade), and a new "Project brief conventions" section outside the fence is preserved across upgrades. The coordinator folds those conventions into every brief it writes. Previously the whole template was Managed, so upgrading reset any project tailoring. - Clearer
harness upgrademessaging. It now states it applies the templates bundled with the installed CLI, and that picking up a newer release means installing that CLI first — fixing the confusion where runningupgradewithout reinstalling the CLI looked like the templates "didn't update."
Migration
Existing projects whose task-brief.md predates the fence are skipped on upgrade (the template now has a fence, the file doesn't). To adopt the fenced structure: back up your edits, delete .harness/templates/task-brief.md, and re-run harness upgrade (or paste the <!-- harness:begin/end --> markers around the skeleton by hand).
Upgrade is two steps
# 1) upgrade the CLI itself (fetches the new tag)
rm -rf ~/.commonharness/v0.7.2
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.7.2/install.sh | bash
# 2) apply the new templates to a project
cd <project> && harness upgradev0.7.1 — fix kickoff truncation
Fix
- Kickoff no longer truncated. A session kickoff is emitted inline wrapped in a code block; the two templates emitted as kickoffs each contained a
fenced example (start-implementer's session-log header, start-coordinator's CURRENT.md update). That inner fence closed the wrapping code block early, so the kickoff was cut off at the `### Session <ISO-timestamp> — <tool> — Phase <n>` line. Both examples are now inline text, so the full kickoff survives being pasted inside a code block. A regression test asserts the kickoff templates contain nofence.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.7.1/install.sh | bashv0.7.0 — config-preserving `harness upgrade`
What's new
harness upgrade(config-preserving) — previously a stub; upgrading meantharness init --force, which regeneratedharness.config.tomland reset your tuned values. Nowharness upgrade:- Refreshes the Managed protocol/template files (
AGENTS.md,.harness/{workflow,triage,templates}, the Claude/Cursor/Codex integrations) to the installed version. - Preserves
harness.config.toml— overlays your existing values ([verify]/[paths]/[branch]/ mode / lang / …) onto the new structure, adds new sections with defaults, bumpsharness_version. Reads the preset from your config (no--presetneeded). - Never touches your work —
active/,archive/,MEMORY.md,CURRENT.md,TODO.md,docs/specs/are left as-is. An in-progress task survives the upgrade.
- Refreshes the Managed protocol/template files (
Run it from the project root, then git diff to review.
harness upgrade
git diffCaveat: Managed files are refreshed from upstream, so manual edits to
AGENTS.md/workflow.md/ templates / integration hooks are replaced. Keep project-specific content inCONTRIBUTING.md(outside theharness:begin/endfence), your own.harness/docs, ordocs/ARCHITECTURE.md.
Compatibility
harness init --force is unchanged (still regenerates the config from the preset). Backward-compatible — upgrading even a v0.2.0-era project keeps its tuned config and adds the sections introduced since.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.7.0/install.sh | bashv0.6.0 — persistent planning backlog (TODO.md) + durable session-boundary handoff
What's new
- Persistent planning backlog (
.harness/TODO.md) — the coordinator's cross-session todo list: tasks scoped / split / merged / prioritised but not yet turned into a brief. The in-chat plan dies with a coordinator session; this file survives it (team-shared, committed, never overwritten on re-init). A fresh coordinator's Backlog gate reads it on startup and — if non-empty — proposes the queued tasks in a recommended order and asks which brief to start before opening one; empty/absent → the normal "what do you want to do?" flow. The coordinator maintains it as it plans, and removes an item once its brief exists. - Durable session-boundary handoff —
AGENTS.mdnow carries a role-agnostic rule (re-injected at SessionStart, so it survives long sessions): at every boundary, emit the complete next kickoff inline with the task-id already filled — in full every time, never abbreviated, never a pointer-to-file, never "do you have it?".start-coordinatorstep 12,start-implementerstep 11, andworkflow.mdare unified to it. This fixes the degradation where later phase hand-offs stopped emitting the prefilled kickoff as a session grew. - Resident coordinator — the coordinator is now a standing planner across the whole project (not one-shot). Phase-to-phase hand-offs are the implementer's own job; the coordinator suggests starting a fresh session only after a very large task — capturing remaining work in
TODO.mdfirst.
Compatibility
Backward-compatible. .harness/TODO.md starts empty, so the Backlog gate stays silent until you queue something. Existing projects: re-render with harness init --force to pick up the new templates (your TODO.md / MEMORY.md / CURRENT.md / active/ / archive/ are preserved).
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.6.0/install.sh | bashv0.5.0 — agent-driven memory-import gate; MEMORY at every entry point
What's new
- Memory-import gate (agent-driven) — adopting harness into a project an agent already worked on? On the first
harness start, the coordinator looks for prior agent memory about this project and offers to unify it into.harness/MEMORY.mdso every tool reads it going forward. It detects intelligently (by purpose, tolerating name/case variants — no fixed filename list), in two places: the repo, and your user-level store scoped to this project — Claude Code~/.claude/projects/<repo>/, Codex session logs (~/.codex/sessions), CursorworkspaceStorage. Only if it finds prior memory does it ask which source to import (repo / user-level / both), then distils into.harness/MEMORY.md(relocating any architecture doc, rebuilding task history into.harness/archive/, reconciling same-name conflicts). Detection lives in the agent, not the CLI — the previousADOPT-PENDINGCLI scan is removed. - MEMORY at every entry point — the Claude Code / Codex SessionStart hooks now also surface
.harness/MEMORY.md(previously onlyCURRENT.md+AGENTS.md+ the architecture doc). Combined with the Cursor rule and the coordinator/implementer prompts, the unified memory is loaded in every session — not just when a protocol prompt is pasted. - Cleaner coordinator hand-off — points you to the saved brief for review instead of dumping its full contents inline; returns only the ready-to-paste implementer kickoff (task-id prefilled).
Compatibility
Backward-compatible. Gated by [adoption] on_init (default auto). No prior memory → the gate finds nothing and stays silent. Existing projects keep working; re-render with harness init --force to pick up the new templates.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.5.0/install.sh | bashv0.4.0 — brownfield adoption gate + architecture doc as global basis
What's new
- Adoption gate (brownfield onboarding) — installing into a project that already has agent context (a
MEMORY.md, adocs/folder, or agent instruction docs)?harness initdetects it and writes.harness/ADOPT-PENDING. The firstharness startruns an adoption task that distils prior context into.harness/MEMORY.md(linking anything not distilled — nothing is lost), relocates the architecture doc intodocs/ARCHITECTURE.md, rebuilds prior task history into.harness/archive/, and reconciles same-name conflicts (AGENTS.md/CONTRIBUTING.md/CLAUDE.md). Human-confirmed at every step. Gated by[adoption] on_init. - Config gate — the chosen preset only seeds
harness.config.toml; it doesn't know your project. On the firstharness start, the coordinator inspects the real repo (manifest, lockfile, scripts, source/test dirs — for any stack) and proposes corrected[verify]/[paths], then edits the config after you confirm. So picking a preset that doesn't fit (e.g.python-uvon a Node app) still converges on a correct config — no hand-editing. Detection lives in the agent, not the CLI, keeping the tool universal. - Architecture doc as a global basis —
docs/ARCHITECTURE.md(path configurable) is read at every entry point — coordinator, implementer, the CursoralwaysApplyrule, and the SessionStart hooks (Claude + Codex). On scaffold the coordinator asks whether you'll provide one and records it viaharness arch. - New CLI —
harness arch [yes|no]. Newnodepreset. New config blocks[adoption]/[architecture]. - Cleaner install — tag installs no longer print git's harmless "is not a commit!" warning / detached-HEAD block.
Compatibility
Backward-compatible. Existing and clean projects are unaffected: no prior context → no adoption task; the config gate only proposes changes you confirm. New config blocks are absent-safe. Greenfield still routes to the scaffold path.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.4.0/install.sh | bashv0.3.0 — Codex hooks, settings merge safety, multi-developer mode, i18n
What's new
- Codex hooks —
harness initnow generates.codex/hooks.json+ an executablecheck-harness-state.shwhencodex_mcpis enabled (previously only the MCP skill was rendered, so the protocol'sPreToolUse/SessionStartchecks never fired in a Codex session). - settings.json merge safety — harness now owns only the
hookskey of.claude/settings.jsonand.codex/hooks.json. Re-rendering replaceshookswhile preserving every other top-level key you add (permissions,env, …), even under--force, soharness upgradeno longer clobbers project-added settings. - Multi-developer mode —
.harness/CURRENT.mdis now per-clone local state (git-ignored); the shared truth across a team is the committed.harness/active/brief set. New[collaboration] mode(solo|team) set viaharness mode;harness statusgains a team view listing every active brief with owner + branch. - Language (i18n) — conversation always mirrors the user; files written into the repo use
[language].artifacts, confirmed once and persisted viaharness lang <code>. The coordinator confirms collaboration mode + artifact language on firstharness start. - Coordinator inline handoff — the coordinator now returns the task brief inline as markdown plus a ready-to-paste implementer kickoff with the task-id already filled, removing manual copy steps.
Compatibility
Backward-compatible. Existing projects default to solo behavior (the single-task flow is unchanged); [collaboration] / [language] are absent-safe (treated as unset). harness init --force and re-renders are safe — the new JSON hooks-merge and .gitignore handling are idempotent.
Install
curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.3.0/install.sh | bashv0.2.0 — scaffold path + TODO gate + Spec gate
What's new
- Scaffold path — third triage outcome for greenfield bootstraps. 4 pre-named phases: architecture decisions → directory skeleton → first runnable module → CONTRIBUTING fill + CI.
- Greenfield detection at
harness init: auto-detects (no manifest + no source dirs + no architecture doc + README ≤200B) or force with--greenfield/--no-greenfield..harness/SCAFFOLD-PENDINGmarker drives the routing. - TODO gate — coordinator auto-detects unfilled
🛠 TODO (project maintainers)blocks inCONTRIBUTING.mdand proposes afill-contributingprep task that scans manifest/CI/formatter configs, presents candidates, writes only after user confirms. - Spec gate — for tasks crossing 2+ cross-cutting dirs / introducing new external deps / changing external interfaces / affecting the data model, the brief gains a
spec: docs/specs/<task-id>.mdfield and a Phase 0 to write the spec. Subsequent phases re-read the spec as the design authority.
Compatibility
Brownfield projects unchanged: same triage flow, no marker, no default spec emission. harness init --force re-runs are safe on existing projects.
Install
bash curl -fsSL https://raw.githubusercontent.com/Libr-AI/CommonHarness/v0.2.0/install.sh | bash