Skip to content

feat(zero): add 15 agents/harnesses to the install matrix#63

Merged
spencercharest merged 4 commits into
mainfrom
spencer/agents-matrix-expansion
Jul 2, 2026
Merged

feat(zero): add 15 agents/harnesses to the install matrix#63
spencercharest merged 4 commits into
mainfrom
spencer/agents-matrix-expansion

Conversation

@spencercharest

@spencercharest spencercharest commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Folds every open ZERO-294 adapter PR into plugins/zero/agents.json, the remote matrix that drives zero init. 15 new entries, 2 harnesses judged not-addable, 2 existing entries (kiro, warp) re-verified as already complete. All load-bearing claims were re-verified against current docs/source on 2026-07-02 (the adapter PRs are from ~June 2026); each folded PR gets a closing comment pointing here. No changes to hooks/hooks.json semantics or ensure-runner.sh — no new host qualified for the daily update sweep (see auto-update column).

One small CI edit rode along: version-check's lockstep step used to grep for any "version" string in JSON under plugins/ — the new Copilot/Cursor hook fragments legitimately contain a nested "version": 1 (their hosts' dialect), so the step now probes for a top-level version key with jq (discovered set now matches the Makefile MANIFESTS exactly).

One deliberate scope cut: only matrix entries are imported. The adapter PRs' template dirs, build scripts, and plugin packaging (e.g. #37's Copilot marketplace/plugin manifests) stay on their branches; follow-ups below list what it would take to graduate those hosts to plugin installs.

New entries

id detect (dir / exe) install hooks fragment auto-update source PR key sources (verified 2026-07-02)
qwen-code .qwen / qwen yesqwen extensions install https://github.com/officialzeroxyz/zero-plugins:zero --auto-update --consent (minCli 1.14.0) full (SessionStart/UserPromptSubmit/PreToolUse into ~/.qwen/settings.json; Claude-compatible incl. permissionDecision; ms timeouts) native --auto-update; excluded from sweep (extensions update re-prompts consent — Gemini precedent) #40 qwen-code docs (hooks, skills, extensions), v0.19.5 install.ts; install verified live on this machine (non-interactive, scratch $HOME)
copilot .copilot / copilot no — steps need the Copilot plugin packaging from #37 (not on main); shipping known-failing steps is worse sessionStart only into Zero-owned ~/.copilot/hooks/zero.json (Copilot dialect: version:1, camelCase, timeoutSec); context injection degraded (Copilot reads top-level additionalContext), runner provisioning intact. userPromptSubmitted is notification-only; preToolUse wants top-level permissionDecision → both omitted gap (→ follow-up: land packaging, then install block + copilot plugin update zero sweep line) #37 docs.github.com Copilot CLI plugin/config-dir/hooks/skills references
continue-cli .continue / cn no — no plugin installer (PR flow was clone+build+cp) full, claude-verbatim into ~/.continue/settings.json — verified against continuedev/continue source: shape identical incl. statusMessage, parses hookSpecificOutput incl. permissionDecision, shell tool literally named Bash gap #44 continuedev/continue hookConfig.ts, types.ts, fireHook.ts, builtInToolNames.ts; docs.continue.dev MCP
devin .config/devin / devin no — devin mcp add only configures MCP; no plugin installer SessionStart + UserPromptSubmit into ~/.config/devin/config.json — Devin hooks are Claude-shaped and explicitly accept hookSpecificOutput.additionalContext. auto-approve omitted (tool names are read/edit/grep/glob/exec, approval contract is {"decision":"approve"} on PermissionRequest) gap (devin update updates Devin, not our files) #47 docs.devin.ai CLI config-file/hooks/skills/mcp/commands
cursor .cursor / agent no — no installer CLI; MCP deeplink is interactive sessionStart only into ~/.cursor/hooks.json (version:1, seconds). Degraded-but-safe: Cursor is fail-open on unrecognized JSON output; provisioning works, context message lost. beforeSubmitPrompt needs Cursor's additional_context → zero-context would be a no-op → omitted; auto-approve stdin+stdout incompatible → omitted gap; cloud agents don't run user-level hooks (documented) #45 cursor.com/docs agent/hooks, context/skills, context/mcp, cli/installation (exe renamed cursor-agentagent ~Jan 2026)
goose .config/goose / goose no — goose plugin install <git-url> is real & non-interactive but root-manifest-only (verified in source); zero-plugins has no root manifest, no subdir syntax SessionStart only as a manifest-less hook-only Open Plugin at ~/.agents/plugins/zero/hooks/hooks.json (documented discovery). Goose discards hook stdout (side-effect only): zero-context would convey nothing → omitted; no permission decisions → auto-approve omitted gap (native --auto-update becomes available once a goose-installable source exists) #41 goose-docs.ai hooks/plugins/skills; aaif-goose/goose plugins/formats/* source
amp .config/amp / amp no — plugins are manually-placed TypeScript files; amp plugin install doesn't exist in the manual none — hooks are TS Plugin API code, no JSON target gap #43 ampcode.com/manual
antigravity .gemini / agy no — only verified install is from a local repo checkout; remote semantics unverified, no published artifact none, deliberately: Antigravity has JSON hooks but a strict native stdout contract, and PreToolUse has been observed failing closed (blocks all tool calls) — our Claude-wrapper output risks bricking sessions. #39 itself shipped dialect-adapter scripts rather than reusing ours gap #39 google-antigravity/antigravity-cli, Google codelabs, GCP community articles; manaflow-ai/cmux#4768
cline .cline / cline no — cline plugin install installs AgentPlugin TS artifacts (Zero ships none); MCP marketplace listing still pending none — hook surface is in flux (SDK TS plugins / executable-file dirs; customization/hooks doc is now a stub). Worst freshness case: no session-start hook, so the runner doesn't self-refresh either gap #49 docs.cline.bot config.md, sdk/plugins.md, customization/hooks.md, skills.md. MCP path corrected to ~/.cline/data/settings/cline_mcp_settings.json (PR had ~/.cline/mcp.json)
crush .local/share/crush / crush no — no install command of any kind none — crush.json is JSON but the only hook event is PreToolUse (no session-start/prompt-submit), and its stdin/stdout dialect (lowercase bash, top-level {decision,context}) is incompatible with auto-approve-zero.sh → documented gap gap #56 charmbracelet/crush README + docs/hooks (still PreToolUse-only)
hermes .hermes / hermes no — hermes plugins install owner/repo --enable is non-interactive but needs a repo that IS a Hermes plugin at root; none exists under officialzeroxyz none — hooks live in YAML (~/.hermes/config.yaml), not deep-mergeable; stdout contract is Hermes-specific; shell hooks trigger consent prompts we must not pre-accept gap (→ follow-up: dedicated Hermes plugin repo) #55 hermes-agent.nousresearch.com docs (plugins, hooks, skills, mcp)
kilo-code .config/kilo / kilo no — kilo plugin <module> installs npm JS modules (we ship none); marketplace listings unpublished none — no hooks key in kilo.jsonc (lifecycle hooks are an open feature request); event surface is JS plugins gap; best native path later: Zero-hosted remote-skill index via skills.urls #54 kilo.ai docs (cli, settings, skills, mcp, plugins); Kilo-Org/kilocode#5827
opencode .config/opencode / opencode no — opencode plugin @zeroxyz/opencode-zero target still npm E404 none — hooks are JS/TS plugin modules only; no JSON hook config exists gap (revisit when the npm plugin ships) #38 opencode.ai docs (skills, plugins, cli, mcp); npm registry 404 re-confirmed
trae .trae / trae no — trae command is an app/project launcher; skills/MCP via UI or trae:// deeplinks none — Trae has no hook system at all (warp posture) gap #51 docs.trae.ai (skills, set-up, mcp, rules); trae-community/trae-skills
zed .config/zed / zed no — MCP/extension installs are in-app UI; ACP flow interactive none — no hook system (proposal zed-industries/zed#57890 unshipped) gap #52 zed.dev/docs ai/skills, ai/mcp, configuring-zed

Skills-dir notes: .agents/skills is included only where the host verifiably reads the portable tree (copilot, cursor, crush, goose, amp, kilo, opencode, zed, warp, antigravity); hosts that don't (cline, continue, devin, hermes, qwen, trae) list only their native dir. .claude/skills compat paths some hosts read are deliberately not listed — the claude-code entry already populates that tree.

MCP note: no entry carries a standalone.mcp block — MCP config targets are only needed for ephemeral environments where auth session data cannot be written to disk, and every matrix host is persistent. The pre-existing kiro/warp blocks are removed here too. The researched per-host MCP surfaces (file paths, dialects, JSONC/YAML caveats) remain documented in each closed adapter PR if that changes.

Not added, and why

  • Roo Code (feat(roo): add ZERO-294 Roo Code adapter #53) — product shut down 2026-05-15; RooCodeInc/Roo-Code archived with an explicit shutdown notice, docs 301 to a static archive, extension end-of-lifed. The PR (June 2026) predates awareness of this. Vendor migration path is Kilo Code (added) / Cline (added).
  • Replit Agent (feat(replit): add ZERO-294 Replit Agent adapter #50) — no local footprint the matrix can target: no supported local CLI, no $HOME config dir (skills live at the cloud Repl's project root; MCP is UI/install-link managed). Follow-ups are product-side listings (Add-to-Replit link for https://mcp.zero.xyz, Skills directory), not matrix entries.

Reconciled existing entries

  • Kiro (feat(kiro): add ZERO-294 Kiro adapter #42) — fragment re-verified correct against current docs (agentSpawn/userPromptSubmit, timeout_ms; preToolUse can only block → auto-approve stays omitted). No install path exists (Powers install is IDE-UI-only; kiro-cli mcp add requires login). One verified nuance: Kiro reads only .kiro/skills + ~/.kiro/skills; the entry's .agents/skills is kept anyway as the deliberate portable-tree convention (the standalone installer writes it; harmless if Kiro ignores it).
  • Warp (feat(warp): add ZERO-294 Warp adapter #46) — still correct: hooks feature request Feature Request: Agent Lifecycle Hooks for Observability warpdotdev/warp#7834 still open; no non-interactive install; ~/.warp/.mcp.json as a user-level MCP file is now explicitly confirmed by Warp's docs.

Auto-update story (summary)

  • Sweep (ensure-runner.sh, unchanged): still claude + codex only. No new host has a non-interactive plugin update command that's safe to run in the background today.
  • Native: gemini-cli (existing) and qwen-code (new) via --auto-update at install. Qwen is excluded from the sweep because qwen extensions update re-prompts consent when the extension's consent string changes — auto-answering would be a consent bypass (binding Gemini precedent).
  • Gap — every standalone-only host: skills/hook files written by zero init are refreshed only when init re-runs. Hosts with a SessionStart-ish fragment (continue-cli, devin, cursor, copilot, goose, kiro, qwen-code fallback) at least self-refresh the runner each session; cline/amp/crush/hermes/kilo/opencode/trae/zed/warp/antigravity don't even get that. This is the top CLI follow-up below.

CLI changes required (none made here)

  1. Standalone freshness mechanism (the big one): matrix-driven files have no re-run trigger. Suggested: teach ensure-runner.sh's daily background sweep to invoke an idempotent zero init --refresh (re-fetch skill + re-merge fragments for detected hosts only), or have the runner CLI self-trigger re-registration once daily. Idempotency is already proven (E2E below).
  2. If standalone.mcp ever extends beyond ephemeral hosts: per-host MCP config surfaces were researched and verified for all 14 hosts but deliberately not carried (see MCP note above); the data lives in the closed adapter PRs. Implementation caveats recorded there: several targets are JSONC (zed, kilo) or YAML (continue, goose, hermes) — a strict-JSON deep-merge will not suffice; and for opencode/qwen/devin the target is the host's main config file (merge under the right key, never overwrite).
  3. Copilot graduation: land the Copilot plugin packaging from feat(copilot): add ZERO-294 GitHub Copilot adapter #37's branch (.github/plugin/marketplace.json, plugins/zero/.github/plugin/plugin.json + hooks/copilot-hooks.json + mcp-copilot.json; plugin manifest must join the Makefile MANIFESTS list), then add the install block (copilot plugin marketplace add officialzeroxyz/zero-plugins + copilot plugin install zero@zero-plugins, minCli 1.14.0) and smoke-test copilot plugin update zero for the sweep. feat(copilot): add ZERO-294 GitHub Copilot adapter #37's Docker run already proved the install is non-interactive.
  4. Goose graduation: publish a goose-installable git source (root-level plugin.json or gemini-extension.json — goose cannot install from a monorepo subdir; verified in source), then goose plugin install --auto-update <url>. Caveat: the graduation must migrate/remove the standalone ~/.agents/plugins/zero hook-only dir (goose bails on name collision).
  5. Hermes graduation: publish a dedicated officialzeroxyz repo that is a Hermes plugin at root (or verify subdir install), then hermes plugins install officialzeroxyz/<repo> --enable; verify hermes plugins update interactivity before any sweep entry.
  6. New-script consideration (only if wanted): Crush (PreToolUse-only, own dialect) and Antigravity (native stdout contract, fail-closed risk) can only get hooks via host-dialect wrapper scripts served from plugins/zero/hooks/feat(crush): add ZERO-294 Crush adapter #56 and feat(antigravity): add ZERO-294 adapter #39 have working prototypes on their branches. Cline would additionally need a "copy executable file into a hooks dir" install mode, which the schema can't express today.
  7. Schema wishes: platform-aware detect dirs (Windows: Devin uses %APPDATA%\devin, Zed %APPDATA%\Zed — dir detection never fires there), and an optional per-entry "graduation" pointer (install source to re-check) so gaps like opencode's npm package don't need a human to remember.
  8. Stale-entry check (pre-existing): Antigravity CLI replaced Gemini CLI on 2026-06-18 (agy plugin import gemini migrates). The existing gemini-cli entry still works but should be re-verified/retired on its own timeline. Both it and antigravity intentionally share detect.dir .gemini (exe disambiguates).

Flagged uncertainties

  • cursor: whether the agent CLI (vs the IDE) executes sessionStart hooks from ~/.cursor/hooks.json — docs are IDE-centric; worst case the hook is a no-op for CLI sessions. Unrecognized-JSON tolerance is inferred from the documented fail-open default, not observed live.
  • goose: manifest-less hook-only plugin discovery is documented but wasn't executed end-to-end.
  • copilot: docs define the sessionStart output contract but not unknown-key handling; silently-ignore is overwhelmingly likely (and the fragment lives in a Zero-owned file, so blast radius is the hook itself).
  • trae: ~/.trae/skills as the global skills path is community-documented (trae-community org); official docs only expose an "Apply to Global" UI. One in-product check recommended before leaning on it.
  • kilo/crush/opencode detect dirs: XDG-path dirs (.config/kilo, .local/share/crush, .config/opencode) fail soft for users overriding XDG_* and for extension-only installs that haven't created them yet; exe detection covers part of that.
  • continue-cli: if cn ever rewrites ~/.continue/settings.json from memory it could drop merged keys; docs treat the file as a hooks source, so preservation is expected.
  • qwen-code: hook name field included defensively (docs list it; required-ness unclear). The standalone fragment merge was E2E-tested here; the PR's hook validation was against the extension manifest path.

Validation performed

  • jq . valid; hooks-fragment-sync parity re-checked locally (claude-code + codex fragments byte-equal to hooks/hooks.json modulo placeholder rewrite).
  • Schema-validated against the real consumer (zero repo @ latest main, agentsMatrixSchema + filterMatrix): 21/21 entries parse; at CLI 1.14.1 all kept; at 1.11.0 exactly qwen-code is version-gated out; org allowlist drops nothing; all fragment script refs resolve to plugins/zero/hooks/; no hook-file collisions (first-fragment-wins dedupe never triggers).
  • E2E smoke: served this branch's agents.json + SKILL.md + hooks/*.sh from a local static server; ran init --standalone from CLI source with a scratch $HOME, twice. All 9 hook targets land in the right host dialects; re-runs are idempotent (no duplicate entries); merging into pre-seeded user configs preserves user hooks/settings and appends ours.
  • Live install test (qwen): qwen extensions install https://github.com/officialzeroxyz/zero-plugins:zero --auto-update --consent with a scratch $HOME completed non-interactively; extension installed & enabled with skills/hooks and a generated qwen-extension.json (MCP wired to https://mcp.zero.xyz). Plain repo-URL install (no :zero) opens an interactive marketplace picker — that's why the entry uses the marketplace-url:plugin-name form.
  • make minor run exactly once (1.7.0 → 1.8.0, all manifests in lockstep).

🤖 Generated with Claude Code

Folds the ZERO-294 adapter PRs (#37-#56, excl. #48/#58) into
plugins/zero/agents.json: amp, antigravity, cline, continue-cli, copilot,
crush, cursor, devin, goose, hermes, kilo-code, opencode, qwen-code, trae,
zed. Roo Code (#53) and Replit Agent (#50) are not addable (product shut
down / no local footprint). Existing kiro (#42) and warp (#46) entries were
re-verified and stand as-is.

qwen-code is plugin-installable (verified live: non-interactive marketplace
install with --consent, native --auto-update); everything else is
standalone-only. Hook fragments added where the host has a JSON hook config
whose semantics tolerate our scripts: continue-cli (full Claude-compatible),
devin (SessionStart+UserPromptSubmit), qwen-code (full, ms timeouts),
copilot/cursor/goose (SessionStart only, host dialects).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
spencercharest and others added 3 commits July 2, 2026 15:21
agents.json now carries host hook-dialect fragments that legitimately
contain a nested "version" field (Copilot/Cursor hooks files); the grep
matched it and lockstep failed on a non-manifest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MCP config targets are only needed for ephemeral environments where auth
session data cannot be written to disk; the new entries are all persistent
hosts. kiro/warp keep their pre-existing blocks. The researched per-host
MCP surfaces remain documented in the closed adapter PRs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MCP config targets are only for ephemeral environments where auth session
data cannot be written to disk; no matrix entry needs one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@spencercharest
spencercharest marked this pull request as ready for review July 2, 2026 23:02
@spencercharest
spencercharest merged commit 409a9b8 into main Jul 2, 2026
4 checks passed
@spencercharest
spencercharest deleted the spencer/agents-matrix-expansion branch July 2, 2026 23:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant