Lisa ↔ Coding-Agent Parity (RESEARCH)
Lisa is distributed for multiple coding agents: Claude Code is the
production path, with Codex, Cursor (cursor-agent), Antigravity (agy),
and GitHub Copilot (copilot) as additional install targets. When any agent
ships a new capability, or when a Lisa feature exists for one agent ahead of
the others, the picture of "what's portable, what isn't, where Lisa
polyfills, what's deliberately agent-only" drifts. This skill is the
repeatable research protocol for refreshing that picture.
This skill is research-only. Its output is a four-part artifact — a
universal feature catalog, a support matrix, a plugin-distributability
matrix, and per-cell Lisa polyfill designs. It does not write installer
code, build per-agent plugin variants, or modify Lisa's source tree.
Implementation work is the sibling skill
[[lisa-coding-agent-parity-implement]], which consumes this artifact as
its primary input.
The transport for querying agents non-interactively — adapter slots,
dry-run, write guards, parallel dispatch — lives in
[[harness-parity-council]] (.agents/skills/harness-parity-council/). Use
that skill whenever this protocol says "query the agents." Web research
uses WebSearch + WebFetch.
Core principle: empirical, not documentary
Do not trust documentation OR assumptions alone. Both lie. Examples
from the canonical run that produced this skill:
- Codex's [[reference-codex-hooks-capabilities]] memory said plugin-bundled
hooks silently don't run; Codex 0.125.0 actually supports plugin hooks
for ten events including
SubagentStart, SubagentStop, and
PostCompact. The memory was stale.
- agy's
agy plugin --help advertises agy plugin import claude as an
import source; at runtime that command returns "No claude extensions
found" and never imports any of the registered Claude marketplace
plugins. Docs implied feasibility; runtime falsified it.
- agy's plugin validator accepts the full Claude 7-event
hooks.json
schema and agy plugin install correctly writes the file into the
installed plugin tree; none of the registered hooks fire during a real
agy -p session. Validator and runtime are separate code paths.
Every claim in the four-part artifact must be backed by one of:
- Documentation read — a publicly-published official doc, GitHub
issue, or canonical community example. Tag
[VERIFIED-DOC] with the
URL.
- Source-read — inspecting the installed binary, its
--help,
config home, vendored source, or generated schemas. Tag [VERIFIED].
- Runtime capture — running a real CLI invocation and observing
actual behavior (capture hook stdin, install a probe plugin, observe
what loads). Tag
[VERIFIED-BY-RUN] with the command and a short
observed-output snippet.
Treat [UNKNOWN] and [VERIFIED-DOC]-only claims as preliminary — they
should be upgraded to [VERIFIED-BY-RUN] before they're load-bearing for
a polyfill design in Step 4.
The coding agents in scope
The skill scopes to whatever five agents Lisa currently distributes to. As
of this skill's last revision: Claude Code, Codex, Cursor (cursor-agent),
Antigravity (agy), GitHub Copilot. No agent is the baseline.
Capabilities flow in any direction — Codex may have a hook event Claude
lacks; agy may have a first-class plugin manager Codex lacks; Cursor may
have a Tab-specific hook event nobody else has. Every such asymmetry is a
first-class row in the catalog.
Claude remains the lead orchestrator (per
[[harness-parity-council]]) — it drives the research and writes the final
synthesis — but Claude is not the reference implementation. No agent's
claim about its own internals is overridden without an empirical
counter-example, regardless of which agent makes the claim.
| Agent |
CLI |
Config home |
Distribution today |
| Claude Code |
claude |
~/.claude/ |
GitHub marketplace (CodySwannGT/lisa) |
| Codex |
codex |
~/.codex/ |
lisa apply + .agents/plugins/marketplace.json |
| Cursor |
cursor-agent |
~/.cursor/, shares ~/.claude/plugins/ |
Cursor reads .claude-plugin/ natively |
| Antigravity |
agy |
~/.gemini/config/, ~/.gemini/antigravity-cli/ |
agy plugin install <local-path> against an agy-shaped variant |
| GitHub Copilot |
copilot |
~/.copilot/ |
copilot plugin install lisa@CodySwannGT/lisa (registered already) |
When the fleet changes (new CLI added, existing CLI dropped), update this
table as the first action of a research pass.
Prerequisites
- All five CLIs installed and authed on this machine.
claude and codex
are the historical baseline; cursor-agent, agy, and copilot were
added on the coding-agent-parity worktree.
harness-parity-council available under .agents/skills/ — run
node .agents/skills/harness-parity-council/runtime-adapters.mjs to
confirm resolved command slots, base flags, and help/version probes
before starting.
- Each CLI's non-interactive entry point understood:
claude -p / codex exec / cursor-agent -p / agy -p /
copilot -p. Resume flags: --continue / resume --last /
--connect / --resume / -c.
- Filesystem access is available so probes can install throwaway plugins
under isolated config homes (
CODEX_HOME, etc.) and observe behavior.
CLI invocation matrix (model + effort)
When this skill drives a CLI to investigate or empirically verify
behavior, use the model and reasoning-effort settings below. Do not pick
a smaller model or a lower effort silently — research verdicts depend on
the other side reasoning carefully about its own internals.
| CLI |
Model |
Effort / Thinking |
Invocation |
claude |
Opus 4.7 |
high |
claude --model opus --effort high |
codex |
GPT-5.5 |
medium |
codex -m gpt-5.5 -c model_reasoning_effort=medium |
copilot |
GPT-5.5 |
medium |
copilot --model gpt-5.5 --effort medium |
cursor |
Composer 2.5 |
n/a (no thinking variant) |
cursor-agent --model composer-2.5 |
agy |
Gemini 3.5 Flash |
medium |
set in-app via Model Selection (no CLI flag — agy exposes no model/effort flags as of v1.0.3) |
Notes:
agy exposes no --model/effort flag. Set Gemini 3.5 Flash, medium
via the Antigravity app's Model Selection; the CLI honors it. agy is
also prone to misinterpreting structured prompts (treats long briefs as
meta-questions about CLI flags). Use short, direct prompts; fall back
to direct source-read when agy goes off-script.
cursor-agent has no thinking variant for Composer 2.5; for
deep-reasoning questions route to claude or codex.
- For all five, pass the non-interactive print flag when scripting and
bound long runs with a timeout (
agy in particular can hang).
The protocol
Research proceeds in four steps. Each step's output is appended to a
single artifact file at /tmp/parity-research.md (or a Lisa-local temp
path) so the four steps form one continuous document. Earlier steps'
outputs are inputs to later steps.
Step 1 — Universal feature aggregate
Build the union catalog of every feature each in-scope agent exposes.
Cast a wide net: this is the foundation that Steps 2-4 depend on, and
omitting features here propagates errors down the chain.
Method — combine three sources for each agent:
Web/doc research (WebSearch + WebFetch): official docs, GitHub
issues, release notes, community feature catalogs. Sources to canvass
per agent:
- Claude Code:
code.claude.com/docs, anthropic blog, GitHub
marketplace plugin examples.
- Codex:
developers.openai.com/codex/, GitHub releases for codex-cli,
core-plugins/src/manifest.rs schema.
- Cursor:
cursor.com/docs, the bundled index.js (loader source),
community marketplace examples.
- Antigravity (agy):
antigravity.google/docs/*, Google Cloud
community blog (Medium), agy plugin --help subcommand surface.
- Copilot:
docs.github.com/en/copilot/*, the cli-plugin-reference
page, generated TypeScript declarations under
~/Library/Caches/copilot/pkg/.../rpc.d.ts.
CLI self-query: <cli> --help and every visible subcommand's
--help. Walk the help tree fully.
Council brief (via [[harness-parity-council]]): send each agent
the same brief asking it to enumerate every feature it exposes —
not just plugin-related ones. Include tool surfaces, model
selection, output formats, session resumption, sandbox modes, ACP,
MCP transports, workspaces/worktrees, keybindings, auth methods,
image/voice input, IDE integrations, update mechanism, telemetry,
etc. Tag the prompt with the symmetric framing from §1z.
Categories to canvass (use as a checklist — not exhaustive; add as
discovered):
- Authoring surfaces: skills, sub-agents, slash commands, hooks,
MCP servers, rules/instructions, memory files, custom prompts,
workflows, role personas, LSP servers, app connectors.
- Distribution & lifecycle: plugin manifest, plugin marketplace,
plugin install/enable/disable/validate, version pinning, update
mechanism, session-only loading, marketplace registry.
- Runtime modes: interactive vs print (
-p), agent client protocol
(ACP), plan mode, ask mode, headless, sandbox modes, trust mode,
worktree mode, autopilot mode.
- Inputs & I/O: model selection, reasoning effort, output formats
(text/json/stream-json), streaming, image attachments, voice input,
context windows, prompt caching, multi-line input, custom
keybindings.
- Tools: file edit/write, shell, web fetch, web search, code
search, file read, glob, MCP tool exposure, tool allowlist /
permission gates, allowed-paths, allowed-URLs, sub-agent invocation.
- Auth & identity: API key, OAuth, login subcommand, account
identity, organization policy gates, telemetry/analytics defaults.
- Integrations: IDE integration (VS Code, JetBrains, etc.),
shell integration, Git integration, commit attribution, scheduling
/ cron, notifications.
- Hook events: every event name each agent exposes (PreToolUse,
PostToolUse, SessionStart, SessionEnd, SubagentStart, SubagentStop,
UserPromptSubmit, Stop, PreCompact, PostCompact, Notification,
PermissionRequest, beforeShellExecution, beforeTabFileRead, …).
Output of Step 1 — a flat list of every distinct feature found across
the union of all five agents, each with a short description and the
agent(s) that surfaced it. Do not classify per-agent support yet — that's
Step 2. Aim for breadth; minimum ~60 distinct features for a
five-agent fleet. Save to the artifact under heading
## Step 1 — Universal feature catalog.
Step 2 — Support matrix
For each feature in the Step 1 catalog, fill a row showing which agents
natively support that feature. No assumptions about plugin
distributability yet — that's Step 3. Step 2 is purely "does this agent
have this feature, in any form (config, CLI flag, plugin-bundled, anywhere)."
Cell forms:
✅ — supported natively. Name the exact mechanism in parentheses.
✅* — supported with a caveat (only in interactive mode; only at user
level; only when feature-flag X enabled). State the caveat.
❌ — explicitly not supported (verified by source-read or runtime
capture, not just absence from docs).
⚠ unverified — claim from docs only, runtime not probed.
Empirical bar: every ✅ cell needs a [VERIFIED-BY-RUN] tag with a
command + observed output, or a [VERIFIED-DOC] tag with URL. [UNKNOWN]
cells are allowed but flagged for Step 4 follow-up.
Output of Step 2 — markdown table, rows = Step 1 features, columns =
agents. Save under ## Step 2 — Support matrix.
Step 3 — Plugin-distributability matrix
For each ✅ or ✅* cell from Step 2, answer the separate question: can
this feature be packaged inside that agent's plugin format, such that a
user gets the feature by installing the plugin? This is a different
matrix from Step 2 because many features (CLI flags, OS-level integrations,
auth methods) are agent-supported but not plugin-distributable.
Cell forms:
📦 yes — bundleable in the agent's plugin manifest. Name the manifest
field or directory convention (e.g. skills/<n>/SKILL.md, manifest
hooks block).
📦* yes-with-caveat — bundleable but the runtime behavior differs from
the standalone case (e.g. agy's hooks/hooks.json validates and installs
but doesn't fire in -p mode — [VERIFIED-BY-RUN]).
❌ no — the feature exists on this agent but cannot be carried in its
plugin format (e.g. MCP on agy: lives at user-config or project-config
scope, NOT in plugin).
n/a — feature isn't supported on this agent at all (cell was ❌ in
Step 2).
Empirical bar: for any 📦 yes cell, an empirical probe should have
either installed a plugin carrying that feature and observed it loading,
or read a public canonical plugin that does so. 📦* yes-with-caveat
cells MUST have [VERIFIED-BY-RUN] evidence — the caveat is the whole
point.
Output of Step 3 — same row/column layout as Step 2, different cell
semantics. Save under ## Step 3 — Plugin-distributability matrix.
Step 4 — Lisa polyfill designs
For each (feature, agent) cell that is one of:
❌ in Step 2 (agent doesn't support the feature at all), or
❌ no or 📦* yes-with-caveat in Step 3 (agent supports it but it's
not distributable via plugin, or it's distributable but runtime
behavior is broken),
design how Lisa would polyfill the gap. This is the design step, not
the implementation step — output is prose + sketch, not code.
Per-cell deliverable:
- Cell ID:
<feature> × <agent>
- Gap classification:
- Type A: feature absent on this agent entirely.
- Type B: feature present but not plugin-distributable.
- Type C: feature plugin-distributable but runtime-broken in
headless mode.
- Polyfill strategy — one of:
- Translate: emit the feature in a different shape the agent does
support (e.g. Codex commands → Lisa skills with
lisa- prefix).
- Wrap: invoke a non-plugin Lisa installer at
lisa apply time to
write the feature into a non-plugin location (e.g. agy MCP → write
~/.gemini/config/mcp_config.json).
- Bake: fold the feature's content into a different surface the
agent does auto-load (e.g. agy rules → bake
rules/eager/*.md
bodies into AGENTS.md).
- Skip: document as agent-only, do not polyfill (e.g. Copilot LSP
servers — Lisa doesn't ship LSPs).
- Block: declare blocked, route to a separate work item to either
pressure upstream or rethink Lisa's reliance on the feature.
- Sketch — 3-5 sentences naming the file path Lisa would change in
the implementation phase, the data shape, and any caveats. NOT code.
- Empirical verification plan — the probe
lisa-coding-agent-parity-implement
will run to prove the polyfill works.
Polyfill collision check — before finalizing each design, check
whether the polyfill would collide with a native mechanism on a different
agent loading the same plugin (e.g. Lisa's plugin-bundled SessionStart
rules hook on Claude would double-fire on Cursor, which auto-loads
rules/ natively). Per-agent plugin artifacts (the Pattern B decision
from the plugins-surface pass) are the canonical fix.
Output of Step 4 — one subsection per gap cell. Save under
## Step 4 — Lisa polyfill designs.
Output artifact
The artifact is a single markdown file at /tmp/parity-research.md (or a
Lisa-local temp path) with four top-level sections matching Steps 1-4
plus a header summarizing the run (date, agent fleet, CLI versions
probed, evidence sources canvassed).
The artifact is the entire output of this skill. It is the input to
[[lisa-coding-agent-parity-implement]]. No installer code, no per-agent
plugin variants, no commits, no PRs — those belong to the implementation
skill.
Where each agent's plugin artifacts live (reference)
A reference for Step 1 / Step 3 work — where to look in Lisa's source
tree to understand each agent's existing surface, and where the agent's
installed plugins land on disk.
- Claude — Plugin manifest
plugins/src/<plugin>/.claude-plugin/plugin.json
with hooks block, auto-discovered skills/, agents/, commands/,
rules/ (NOT auto-loaded — Lisa polyfills via SessionStart hook).
Marketplace at .claude-plugin/marketplace.json at repo root, 8+
plugins listed. Installed: ~/.claude/plugins/. Plugin-root env var:
${CLAUDE_PLUGIN_ROOT}.
- Codex —
.codex-plugin/plugin.json pointer (skills + MCP); hooks
via .codex/hooks.json per-project, OR — as of codex-cli 0.125.0 —
via plugin-bundled hooks/hooks.json or inline manifest hooks field.
Hook events: ten total, including SubagentStart, SubagentStop,
PreCompact, PostCompact. Sub-agents are config-level
[agents.<role>], NOT a plugin component. Installed:
~/.codex/plugins/cache/<marketplace>/<plugin>/<version>/.
Marketplace: ~/.codex/config.toml [marketplaces.<n>]. Lisa installs
via src/codex/*-installer.ts (skills, agents, hooks, AGENTS.md,
marketplace, settings, manifest tracking).
- Cursor — Reads BOTH
.cursor-plugin/plugin.json AND
.claude-plugin/plugin.json natively (loader's
discoverComponents covers skills, agents, commands, rules).
Hooks auto-normalized from Claude event names. Installed plugins land
under ~/.claude/plugins/cache/ (Cursor shares Claude's tree).
Session-only via --plugin-dir <path>. Cursor-unique events:
beforeShellExecution, beforeTabFileRead.
- Antigravity (
agy) — Plugin manifest is bare plugin.json at
plugin root (NOT .claude-plugin/ or .gemini-plugin/). Components:
skills/, agents/, commands/ (auto-converted to skills!), hooks/hooks.json.
MCP is NOT a plugin component — lives at user ~/.gemini/config/mcp_config.json
or project .agents/mcp_config.json. Auto-loads AGENTS.md since
v1.20.3. Plugin-bundled hooks validate and install but DO NOT FIRE in
-p mode — Lisa cannot rely on agy plugin hooks for headless rule
injection (use AGENTS.md bake-in instead). Installed: ~/.gemini/config/plugins/<plugin-name>/.
Plugin manager: agy plugin install/uninstall/enable/disable/validate/link/import.
- Copilot — Manifest lookup:
plugin.json → .plugin/plugin.json →
.github/plugin/plugin.json → .claude-plugin/plugin.json. Components:
skills/<n>/SKILL.md (default) or manifest skills path;
agents/<n>.agent.md (NOTE the .agent.md extension — adapter needed
vs Claude's <n>.md); manifest hooks; manifest mcpServers; LSP
servers via lspServers (Copilot-unique). MCP three layers: User
~/.copilot/mcp-config.json, Workspace .mcp.json, Plugin. Installed:
~/.copilot/installed-plugins/<marketplace>/<plugin>/ or _direct/.
CodySwannGT/lisa is already a registered marketplace.
Known capability references (memory)
Update these after a research pass surfaces new capabilities. They are
the institutional memory that lets the next pass start from current
knowledge rather than redoing CLI source-reads from scratch.
- [[reference-codex-hooks-capabilities]] — Codex hook events (currently
stale; 0.125.0 expanded the event list — update after next implementation).
- [[reference-codex-plugin-skill-loading]] —
.codex-plugin/ skills pointer.
- [[reference-codex-commit-attribution]] — Codex commit-attribution gates.
- [[reference-codex-http-mcp-plugin-shape]] — Codex accepts Claude's
{type,url} MCP shape.
- [[reference-codex-automations]] — Codex automations / scheduling.
- [[reference-codex-cli-collaboration]] —
codex exec non-interactive
patterns.
- [[reference-lisa-hook-delivery]] — how Lisa hooks reach projects.
Per-agent capability memory for Cursor, agy, Copilot does not yet exist —
write the first one whenever this skill produces a [VERIFIED-BY-RUN]
load-bearing finding about that agent.
Worked example — the plugins-surface research pass (2026-05-28)
The canonical reference run. Topic: Lisa's plugin surface across all five
agents.
- Step 1 surfaced ~30 features focused on plugin packaging (skills,
sub-agents, slash commands, hooks, MCP, rules, memory, settings,
marketplace, version pinning, enable/disable, etc.).
- Step 2 filled the support matrix with a mix of
[VERIFIED-BY-RUN]
(agy via direct probes + plugin install; Cursor via --plugin-dir
smoke test; Copilot via marketplace browse) and [VERIFIED-DOC]
(codex hooks event list).
- Step 3 flipped multiple cells that looked positive in Step 2:
agy MCP (supported, but ❌ not plugin-distributable — file lives
outside the plugin), agy hooks (supported AND plugin-distributable
per the validator, but
📦* — runtime DOES NOT FIRE in -p mode).
- Step 4 produced polyfill designs including: Codex commands →
Lisa-prefixed skills (Translate); agy MCP →
mcp-installer.ts
writing user-config (Wrap); agy rules → bake into AGENTS.md (Bake);
Copilot LSP servers → not portable (Skip).
The full artifact is at /tmp/plugins-plan.md (the research-output file
from that run). Sections 1a, 1z, 5, 5.5, 5.6 of that artifact carry the
canonical examples for the matrix-cell formats above.
That pass also surfaced that the previously stale [[reference-codex-hooks-capabilities]]
memory needed updating — Codex 0.125.0 expanded the hook event list.
Definition of done
- Step 1 catalog covers a clear majority of each agent's documented
feature surface — ~60+ distinct features for a five-agent fleet, with
no obvious omissions in any of the canvass categories above.
- Step 2 support matrix has every cell labeled (✅ / ✅* / ❌ /
⚠ unverified), and every load-bearing claim is tagged with
[VERIFIED-DOC] (URL), [VERIFIED] (source-read command), or
[VERIFIED-BY-RUN] (CLI invocation + observed output).
- Step 3 plugin-distributability matrix has every cell labeled
(📦 / 📦* / ❌ / n/a). The split between Step 2 support and Step 3
distributability is explicit — no conflation.
- Step 4 has one polyfill design per gap cell, each with: gap type,
polyfill strategy, file/data sketch, collision check, and
verification plan for
lisa-coding-agent-parity-implement.
- The artifact at
/tmp/parity-research.md (or chosen path) is a
single coherent markdown document.
- Capability memory entries are updated for any agent whose surface
changed materially during the research pass.
Out of scope explicitly: no installer code, no plugin variant
generation, no commits, no PRs, no lisa apply modifications. Those
belong to [[lisa-coding-agent-parity-implement]].
Handoff to implementation
When this skill completes, the artifact at /tmp/parity-research.md
(or chosen path) is the input contract for
[[lisa-coding-agent-parity-implement]]. The implementation skill:
- Reads the artifact.
- Picks a scope (one polyfill, one full agent, one feature surface,
etc. — depends on the implementation skill's own gating).
- Authors the installers / plugin variants / build-script changes.
- Runs the per-cell empirical verifications spec'd in Step 4.
- Lands the work.
This skill never executes any of those steps. If a user invokes this
skill and asks for "implementation" or "apply this," reject the request
and point at the sibling skill.
1---2name: lisa-coding-agent-parity3description: This skill should be used when Lisa needs to research feature parity across the coding agents it can install into — Claude Code, Codex, Cursor (cursor-agent), Antigravity (agy), and GitHub Copilot. It produces a four-part research artifact (universal feature catalog, support matrix, plugin-distributability matrix, polyfill designs for the gaps) drawn from both web/documentation research and direct CLI queries. RESEARCH ONLY — implementation lives in the sibling skill `lisa-coding-agent-parity-implement`, which consumes this artifact. Use whenever the agent fleet changes (new CLI added, existing CLI ships a capability), when Lisa needs an updated picture of where parity stands, or before opening any implementation work that touches multiple agents.4---56# Lisa ↔ Coding-Agent Parity (RESEARCH)78Lisa is distributed for **multiple coding agents**: Claude Code is the9production path, with Codex, Cursor (`cursor-agent`), Antigravity (`agy`),10and GitHub Copilot (`copilot`) as additional install targets. When any agent11ships a new capability, or when a Lisa feature exists for one agent ahead of12the others, the picture of "what's portable, what isn't, where Lisa13polyfills, what's deliberately agent-only" drifts. This skill is the14repeatable research protocol for refreshing that picture.1516**This skill is research-only.** Its output is a four-part artifact — a17universal feature catalog, a support matrix, a plugin-distributability18matrix, and per-cell Lisa polyfill designs. **It does not write installer19code, build per-agent plugin variants, or modify Lisa's source tree.**20Implementation work is the sibling skill21[[lisa-coding-agent-parity-implement]], which consumes this artifact as22its primary input.2324The transport for querying agents non-interactively — adapter slots,25dry-run, write guards, parallel dispatch — lives in26[[harness-parity-council]] (`.agents/skills/harness-parity-council/`). Use27that skill whenever this protocol says "query the agents." Web research28uses WebSearch + WebFetch.2930## Core principle: empirical, not documentary3132**Do not trust documentation OR assumptions alone.** Both lie. Examples33from the canonical run that produced this skill:3435- Codex's [[reference-codex-hooks-capabilities]] memory said plugin-bundled36 hooks silently don't run; Codex 0.125.0 actually supports plugin hooks37 for ten events including `SubagentStart`, `SubagentStop`, and38 `PostCompact`. The memory was stale.39- agy's `agy plugin --help` advertises `agy plugin import claude` as an40 import source; at runtime that command returns "No claude extensions41 found" and never imports any of the registered Claude marketplace42 plugins. Docs implied feasibility; runtime falsified it.43- agy's plugin validator accepts the full Claude 7-event `hooks.json`44 schema and `agy plugin install` correctly writes the file into the45 installed plugin tree; **none of the registered hooks fire during a real46 `agy -p` session.** Validator and runtime are separate code paths.4748Every claim in the four-part artifact must be backed by one of:49501. **Documentation read** — a publicly-published official doc, GitHub51 issue, or canonical community example. Tag `[VERIFIED-DOC]` with the52 URL.532. **Source-read** — inspecting the installed binary, its `--help`,54 config home, vendored source, or generated schemas. Tag `[VERIFIED]`.553. **Runtime capture** — running a real CLI invocation and observing56 actual behavior (capture hook stdin, install a probe plugin, observe57 what loads). Tag `[VERIFIED-BY-RUN]` with the command and a short58 observed-output snippet.5960Treat `[UNKNOWN]` and `[VERIFIED-DOC]`-only claims as preliminary — they61should be upgraded to `[VERIFIED-BY-RUN]` before they're load-bearing for62a polyfill design in Step 4.6364## The coding agents in scope6566The skill scopes to whatever five agents Lisa currently distributes to. As67of this skill's last revision: Claude Code, Codex, Cursor (`cursor-agent`),68Antigravity (`agy`), GitHub Copilot. **No agent is the baseline.**69Capabilities flow in any direction — Codex may have a hook event Claude70lacks; agy may have a first-class plugin manager Codex lacks; Cursor may71have a Tab-specific hook event nobody else has. Every such asymmetry is a72first-class row in the catalog.7374Claude remains the lead **orchestrator** (per75[[harness-parity-council]]) — it drives the research and writes the final76synthesis — but Claude is not the reference implementation. No agent's77claim about its own internals is overridden without an empirical78counter-example, regardless of which agent makes the claim.7980| Agent | CLI | Config home | Distribution today |81| --------------- | -------------- | ----------------------------------------------- | -------------------------------------------------------------------- |82| Claude Code | `claude` | `~/.claude/` | GitHub marketplace (`CodySwannGT/lisa`) |83| Codex | `codex` | `~/.codex/` | `lisa apply` + `.agents/plugins/marketplace.json` |84| Cursor | `cursor-agent` | `~/.cursor/`, shares `~/.claude/plugins/` | Cursor reads `.claude-plugin/` natively |85| Antigravity | `agy` | `~/.gemini/config/`, `~/.gemini/antigravity-cli/` | `agy plugin install <local-path>` against an agy-shaped variant |86| GitHub Copilot | `copilot` | `~/.copilot/` | `copilot plugin install lisa@CodySwannGT/lisa` (registered already) |8788When the fleet changes (new CLI added, existing CLI dropped), update this89table as the first action of a research pass.9091## Prerequisites9293- All five CLIs installed and authed on this machine. `claude` and `codex`94 are the historical baseline; `cursor-agent`, `agy`, and `copilot` were95 added on the `coding-agent-parity` worktree.96- `harness-parity-council` available under `.agents/skills/` — run97 `node .agents/skills/harness-parity-council/runtime-adapters.mjs` to98 confirm resolved command slots, base flags, and help/version probes99 before starting.100- Each CLI's non-interactive entry point understood:101 `claude -p` / `codex exec` / `cursor-agent -p` / `agy -p` /102 `copilot -p`. Resume flags: `--continue` / `resume --last` /103 `--connect` / `--resume` / `-c`.104- Filesystem access is available so probes can install throwaway plugins105 under isolated config homes (`CODEX_HOME`, etc.) and observe behavior.106107### CLI invocation matrix (model + effort)108109When this skill drives a CLI to investigate or empirically verify110behavior, use the model and reasoning-effort settings below. Do not pick111a smaller model or a lower effort silently — research verdicts depend on112the other side reasoning carefully about its own internals.113114| CLI | Model | Effort / Thinking | Invocation |115| --------- | ---------------- | ------------------------- | ------------------------------------------------------------------------------------------------ |116| `claude` | Opus 4.7 | high | `claude --model opus --effort high` |117| `codex` | GPT-5.5 | medium | `codex -m gpt-5.5 -c model_reasoning_effort=medium` |118| `copilot` | GPT-5.5 | medium | `copilot --model gpt-5.5 --effort medium` |119| `cursor` | Composer 2.5 | n/a (no thinking variant) | `cursor-agent --model composer-2.5` |120| `agy` | Gemini 3.5 Flash | medium | set in-app via Model Selection (no CLI flag — `agy` exposes no model/effort flags as of v1.0.3) |121122Notes:123124- **`agy`** exposes no `--model`/effort flag. Set Gemini 3.5 Flash, medium125 via the Antigravity app's Model Selection; the CLI honors it. agy is126 also prone to misinterpreting structured prompts (treats long briefs as127 meta-questions about CLI flags). Use short, direct prompts; fall back128 to direct source-read when agy goes off-script.129- **`cursor-agent`** has no thinking variant for Composer 2.5; for130 deep-reasoning questions route to `claude` or `codex`.131- For all five, pass the non-interactive print flag when scripting and132 bound long runs with a timeout (`agy` in particular can hang).133134## The protocol135136Research proceeds in four steps. Each step's output is appended to a137single artifact file at `/tmp/parity-research.md` (or a Lisa-local temp138path) so the four steps form one continuous document. Earlier steps'139outputs are inputs to later steps.140141### Step 1 — Universal feature aggregate142143Build the **union catalog** of every feature each in-scope agent exposes.144Cast a wide net: this is the foundation that Steps 2-4 depend on, and145omitting features here propagates errors down the chain.146147**Method** — combine three sources for each agent:1481491. **Web/doc research** (WebSearch + WebFetch): official docs, GitHub150 issues, release notes, community feature catalogs. Sources to canvass151 per agent:152 - Claude Code: `code.claude.com/docs`, anthropic blog, GitHub153 marketplace plugin examples.154 - Codex: `developers.openai.com/codex/`, GitHub releases for `codex-cli`,155 `core-plugins/src/manifest.rs` schema.156 - Cursor: `cursor.com/docs`, the bundled `index.js` (loader source),157 community marketplace examples.158 - Antigravity (agy): `antigravity.google/docs/*`, Google Cloud159 community blog (Medium), `agy plugin --help` subcommand surface.160 - Copilot: `docs.github.com/en/copilot/*`, the `cli-plugin-reference`161 page, generated TypeScript declarations under162 `~/Library/Caches/copilot/pkg/.../rpc.d.ts`.1631642. **CLI self-query**: `<cli> --help` and every visible subcommand's165 `--help`. Walk the help tree fully.1661673. **Council brief** (via [[harness-parity-council]]): send each agent168 the same brief asking it to enumerate every feature it exposes —169 *not just plugin-related ones*. Include tool surfaces, model170 selection, output formats, session resumption, sandbox modes, ACP,171 MCP transports, workspaces/worktrees, keybindings, auth methods,172 image/voice input, IDE integrations, update mechanism, telemetry,173 etc. Tag the prompt with the symmetric framing from §1z.174175**Categories to canvass** (use as a checklist — not exhaustive; add as176discovered):177178- **Authoring surfaces**: skills, sub-agents, slash commands, hooks,179 MCP servers, rules/instructions, memory files, custom prompts,180 workflows, role personas, LSP servers, app connectors.181- **Distribution & lifecycle**: plugin manifest, plugin marketplace,182 plugin install/enable/disable/validate, version pinning, update183 mechanism, session-only loading, marketplace registry.184- **Runtime modes**: interactive vs print (`-p`), agent client protocol185 (ACP), plan mode, ask mode, headless, sandbox modes, trust mode,186 worktree mode, autopilot mode.187- **Inputs & I/O**: model selection, reasoning effort, output formats188 (text/json/stream-json), streaming, image attachments, voice input,189 context windows, prompt caching, multi-line input, custom190 keybindings.191- **Tools**: file edit/write, shell, web fetch, web search, code192 search, file read, glob, MCP tool exposure, tool allowlist /193 permission gates, allowed-paths, allowed-URLs, sub-agent invocation.194- **Auth & identity**: API key, OAuth, login subcommand, account195 identity, organization policy gates, telemetry/analytics defaults.196- **Integrations**: IDE integration (VS Code, JetBrains, etc.),197 shell integration, Git integration, commit attribution, scheduling198 / cron, notifications.199- **Hook events**: every event name each agent exposes (PreToolUse,200 PostToolUse, SessionStart, SessionEnd, SubagentStart, SubagentStop,201 UserPromptSubmit, Stop, PreCompact, PostCompact, Notification,202 PermissionRequest, beforeShellExecution, beforeTabFileRead, …).203204**Output of Step 1** — a flat list of every distinct feature found across205the union of all five agents, each with a short description and the206agent(s) that surfaced it. Do not classify per-agent support yet — that's207Step 2. Aim for breadth; minimum ~60 distinct features for a208five-agent fleet. Save to the artifact under heading209`## Step 1 — Universal feature catalog`.210211### Step 2 — Support matrix212213For each feature in the Step 1 catalog, fill a row showing which agents214natively support that feature. **No assumptions about plugin215distributability yet** — that's Step 3. Step 2 is purely "does this agent216have this feature, in any form (config, CLI flag, plugin-bundled, anywhere)."217218Cell forms:219220- `✅` — supported natively. Name the exact mechanism in parentheses.221- `✅*` — supported with a caveat (only in interactive mode; only at user222 level; only when feature-flag X enabled). State the caveat.223- `❌` — explicitly not supported (verified by source-read or runtime224 capture, not just absence from docs).225- `⚠ unverified` — claim from docs only, runtime not probed.226227**Empirical bar**: every `✅` cell needs a `[VERIFIED-BY-RUN]` tag with a228command + observed output, or a `[VERIFIED-DOC]` tag with URL. `[UNKNOWN]`229cells are allowed but flagged for Step 4 follow-up.230231**Output of Step 2** — markdown table, rows = Step 1 features, columns =232agents. Save under `## Step 2 — Support matrix`.233234### Step 3 — Plugin-distributability matrix235236For each `✅` or `✅*` cell from Step 2, answer the separate question: **can237this feature be packaged inside that agent's plugin format, such that a238user gets the feature by installing the plugin?** This is a different239matrix from Step 2 because many features (CLI flags, OS-level integrations,240auth methods) are agent-supported but not plugin-distributable.241242Cell forms:243244- `📦 yes` — bundleable in the agent's plugin manifest. Name the manifest245 field or directory convention (e.g. `skills/<n>/SKILL.md`, manifest246 `hooks` block).247- `📦* yes-with-caveat` — bundleable but the runtime behavior differs from248 the standalone case (e.g. agy's hooks/hooks.json validates and installs249 but doesn't fire in `-p` mode — `[VERIFIED-BY-RUN]`).250- `❌ no` — the feature exists on this agent but cannot be carried in its251 plugin format (e.g. MCP on agy: lives at user-config or project-config252 scope, NOT in plugin).253- `n/a` — feature isn't supported on this agent at all (cell was `❌` in254 Step 2).255256**Empirical bar**: for any `📦 yes` cell, an empirical probe should have257either installed a plugin carrying that feature and observed it loading,258or read a public canonical plugin that does so. `📦* yes-with-caveat`259cells MUST have `[VERIFIED-BY-RUN]` evidence — the caveat is the whole260point.261262**Output of Step 3** — same row/column layout as Step 2, different cell263semantics. Save under `## Step 3 — Plugin-distributability matrix`.264265### Step 4 — Lisa polyfill designs266267For each (feature, agent) cell that is one of:268- `❌` in Step 2 (agent doesn't support the feature at all), or269- `❌ no` or `📦* yes-with-caveat` in Step 3 (agent supports it but it's270 not distributable via plugin, or it's distributable but runtime271 behavior is broken),272273design **how Lisa would polyfill the gap.** This is the design step, not274the implementation step — output is prose + sketch, not code.275276**Per-cell deliverable**:2772781. **Cell ID**: `<feature> × <agent>`2792. **Gap classification**:280 - **Type A**: feature absent on this agent entirely.281 - **Type B**: feature present but not plugin-distributable.282 - **Type C**: feature plugin-distributable but runtime-broken in283 headless mode.2843. **Polyfill strategy** — one of:285 - **Translate**: emit the feature in a different shape the agent does286 support (e.g. Codex commands → Lisa skills with `lisa-` prefix).287 - **Wrap**: invoke a non-plugin Lisa installer at `lisa apply` time to288 write the feature into a non-plugin location (e.g. agy MCP → write289 `~/.gemini/config/mcp_config.json`).290 - **Bake**: fold the feature's content into a different surface the291 agent does auto-load (e.g. agy rules → bake `rules/eager/*.md`292 bodies into AGENTS.md).293 - **Skip**: document as agent-only, do not polyfill (e.g. Copilot LSP294 servers — Lisa doesn't ship LSPs).295 - **Block**: declare blocked, route to a separate work item to either296 pressure upstream or rethink Lisa's reliance on the feature.2974. **Sketch** — 3-5 sentences naming the file path Lisa would change in298 the implementation phase, the data shape, and any caveats. NOT code.2995. **Empirical verification plan** — the probe `lisa-coding-agent-parity-implement`300 will run to prove the polyfill works.301302**Polyfill collision check** — before finalizing each design, check303whether the polyfill would collide with a native mechanism on a different304agent loading the same plugin (e.g. Lisa's plugin-bundled SessionStart305rules hook on Claude would double-fire on Cursor, which auto-loads306`rules/` natively). Per-agent plugin artifacts (the Pattern B decision307from the plugins-surface pass) are the canonical fix.308309**Output of Step 4** — one subsection per gap cell. Save under310`## Step 4 — Lisa polyfill designs`.311312## Output artifact313314The artifact is a single markdown file at `/tmp/parity-research.md` (or a315Lisa-local temp path) with four top-level sections matching Steps 1-4316plus a header summarizing the run (date, agent fleet, CLI versions317probed, evidence sources canvassed).318319The artifact is the entire output of this skill. It is the input to320[[lisa-coding-agent-parity-implement]]. No installer code, no per-agent321plugin variants, no commits, no PRs — those belong to the implementation322skill.323324## Where each agent's plugin artifacts live (reference)325326A reference for Step 1 / Step 3 work — where to look in Lisa's source327tree to understand each agent's existing surface, and where the agent's328installed plugins land on disk.329330- **Claude** — Plugin manifest `plugins/src/<plugin>/.claude-plugin/plugin.json`331 with `hooks` block, auto-discovered `skills/`, `agents/`, `commands/`,332 `rules/` (NOT auto-loaded — Lisa polyfills via SessionStart hook).333 Marketplace at `.claude-plugin/marketplace.json` at repo root, 8+334 plugins listed. Installed: `~/.claude/plugins/`. Plugin-root env var:335 `${CLAUDE_PLUGIN_ROOT}`.336- **Codex** — `.codex-plugin/plugin.json` pointer (skills + MCP); hooks337 via `.codex/hooks.json` per-project, OR — as of codex-cli 0.125.0 —338 via plugin-bundled `hooks/hooks.json` or inline manifest `hooks` field.339 Hook events: ten total, including `SubagentStart`, `SubagentStop`,340 `PreCompact`, `PostCompact`. Sub-agents are config-level341 `[agents.<role>]`, NOT a plugin component. Installed:342 `~/.codex/plugins/cache/<marketplace>/<plugin>/<version>/`.343 Marketplace: `~/.codex/config.toml` `[marketplaces.<n>]`. Lisa installs344 via `src/codex/*-installer.ts` (skills, agents, hooks, AGENTS.md,345 marketplace, settings, manifest tracking).346- **Cursor** — Reads BOTH `.cursor-plugin/plugin.json` AND347 `.claude-plugin/plugin.json` natively (loader's348 `discoverComponents` covers `skills`, `agents`, `commands`, `rules`).349 Hooks auto-normalized from Claude event names. Installed plugins land350 under `~/.claude/plugins/cache/` (Cursor shares Claude's tree).351 Session-only via `--plugin-dir <path>`. Cursor-unique events:352 `beforeShellExecution`, `beforeTabFileRead`.353- **Antigravity (`agy`)** — Plugin manifest is **bare `plugin.json` at354 plugin root** (NOT `.claude-plugin/` or `.gemini-plugin/`). Components:355 `skills/`, `agents/`, `commands/` (auto-converted to skills!), `hooks/hooks.json`.356 MCP is NOT a plugin component — lives at user `~/.gemini/config/mcp_config.json`357 or project `.agents/mcp_config.json`. Auto-loads `AGENTS.md` since358 v1.20.3. Plugin-bundled hooks validate and install but DO NOT FIRE in359 `-p` mode — Lisa cannot rely on agy plugin hooks for headless rule360 injection (use AGENTS.md bake-in instead). Installed: `~/.gemini/config/plugins/<plugin-name>/`.361 Plugin manager: `agy plugin install/uninstall/enable/disable/validate/link/import`.362- **Copilot** — Manifest lookup: `plugin.json` → `.plugin/plugin.json` →363 `.github/plugin/plugin.json` → `.claude-plugin/plugin.json`. Components:364 `skills/<n>/SKILL.md` (default) or manifest `skills` path;365 `agents/<n>.agent.md` (NOTE the `.agent.md` extension — adapter needed366 vs Claude's `<n>.md`); manifest `hooks`; manifest `mcpServers`; LSP367 servers via `lspServers` (Copilot-unique). MCP three layers: User368 `~/.copilot/mcp-config.json`, Workspace `.mcp.json`, Plugin. Installed:369 `~/.copilot/installed-plugins/<marketplace>/<plugin>/` or `_direct/`.370 `CodySwannGT/lisa` is already a registered marketplace.371372## Known capability references (memory)373374Update these after a research pass surfaces new capabilities. They are375the institutional memory that lets the next pass start from current376knowledge rather than redoing CLI source-reads from scratch.377378- [[reference-codex-hooks-capabilities]] — Codex hook events (currently379 stale; 0.125.0 expanded the event list — update after next implementation).380- [[reference-codex-plugin-skill-loading]] — `.codex-plugin/` skills pointer.381- [[reference-codex-commit-attribution]] — Codex commit-attribution gates.382- [[reference-codex-http-mcp-plugin-shape]] — Codex accepts Claude's383 `{type,url}` MCP shape.384- [[reference-codex-automations]] — Codex automations / scheduling.385- [[reference-codex-cli-collaboration]] — `codex exec` non-interactive386 patterns.387- [[reference-lisa-hook-delivery]] — how Lisa hooks reach projects.388389Per-agent capability memory for Cursor, agy, Copilot does not yet exist —390write the first one whenever this skill produces a `[VERIFIED-BY-RUN]`391load-bearing finding about that agent.392393## Worked example — the plugins-surface research pass (2026-05-28)394395The canonical reference run. Topic: Lisa's plugin surface across all five396agents.397398- **Step 1** surfaced ~30 features focused on plugin packaging (skills,399 sub-agents, slash commands, hooks, MCP, rules, memory, settings,400 marketplace, version pinning, enable/disable, etc.).401- **Step 2** filled the support matrix with a mix of `[VERIFIED-BY-RUN]`402 (agy via direct probes + plugin install; Cursor via `--plugin-dir`403 smoke test; Copilot via marketplace browse) and `[VERIFIED-DOC]`404 (codex hooks event list).405- **Step 3** flipped multiple cells that looked positive in Step 2:406 agy MCP (supported, but ❌ not plugin-distributable — file lives407 outside the plugin), agy hooks (supported AND plugin-distributable408 per the validator, but `📦*` — runtime DOES NOT FIRE in `-p` mode).409- **Step 4** produced polyfill designs including: Codex commands →410 Lisa-prefixed skills (Translate); agy MCP → `mcp-installer.ts`411 writing user-config (Wrap); agy rules → bake into AGENTS.md (Bake);412 Copilot LSP servers → not portable (Skip).413414The full artifact is at `/tmp/plugins-plan.md` (the research-output file415from that run). Sections 1a, 1z, 5, 5.5, 5.6 of that artifact carry the416canonical examples for the matrix-cell formats above.417418That pass also surfaced that the previously stale [[reference-codex-hooks-capabilities]]419memory needed updating — Codex 0.125.0 expanded the hook event list.420421## Definition of done422423- Step 1 catalog covers a clear majority of each agent's documented424 feature surface — ~60+ distinct features for a five-agent fleet, with425 no obvious omissions in any of the canvass categories above.426- Step 2 support matrix has every cell labeled (✅ / ✅* / ❌ /427 ⚠ unverified), and every load-bearing claim is tagged with428 `[VERIFIED-DOC]` (URL), `[VERIFIED]` (source-read command), or429 `[VERIFIED-BY-RUN]` (CLI invocation + observed output).430- Step 3 plugin-distributability matrix has every cell labeled431 (📦 / 📦* / ❌ / n/a). The split between Step 2 support and Step 3432 distributability is explicit — no conflation.433- Step 4 has one polyfill design per gap cell, each with: gap type,434 polyfill strategy, file/data sketch, collision check, and435 verification plan for `lisa-coding-agent-parity-implement`.436- The artifact at `/tmp/parity-research.md` (or chosen path) is a437 single coherent markdown document.438- Capability memory entries are updated for any agent whose surface439 changed materially during the research pass.440441**Out of scope explicitly**: no installer code, no plugin variant442generation, no commits, no PRs, no `lisa apply` modifications. Those443belong to [[lisa-coding-agent-parity-implement]].444445## Handoff to implementation446447When this skill completes, the artifact at `/tmp/parity-research.md`448(or chosen path) is the input contract for449[[lisa-coding-agent-parity-implement]]. The implementation skill:4504511. Reads the artifact.4522. Picks a scope (one polyfill, one full agent, one feature surface,453 etc. — depends on the implementation skill's own gating).4543. Authors the installers / plugin variants / build-script changes.4554. Runs the per-cell empirical verifications spec'd in Step 4.4565. Lands the work.457458This skill never executes any of those steps. If a user invokes this459skill and asks for "implementation" or "apply this," reject the request460and point at the sibling skill.