.plan/npx-distribution.md
Installation is slow and fragile: Current install clones the full git repo, runs npm install, and builds from source. The npm package already ships pre-built artifacts.
IDE coverage is limited: claude-mem only supports Claude Code (plugin) and Cursor (hooks installer). The AI coding tools landscape has exploded — Gemini CLI (95k stars), OpenCode (110k stars), Windsurf (~1M users), Codex CLI, Antigravity, Goose, Crush, Copilot CLI, and more all support extensibility.
plugin/ directory ships pre-built. No git clone or build needed.src/services/transcripts/ has a fully built schema-based JSONL tailer. It just needs schemas for more tools.openclaw/src/index.ts (1000+ lines). Needs to be wired into the npx installer.GEMINI.md context files, ~/.gemini/settings.json. This is the easiest high-value integration.npx skills by Vercel supports 41 agents — proving the multi-IDE installer UX works. Their agent detection pattern (check if config dir exists) is the right model.source field in hook payloads. No per-IDE worker instances.claude-mem-installer: Not a supplement — the complete replacement.npx claude-mem becomes a unified CLI: install, configure any IDE, manage the worker, search memory.
npx claude-mem # Interactive install + IDE selection
npx claude-mem install # Same as above
npx claude-mem install --ide windsurf # Direct IDE setup
npx claude-mem start / stop / status # Worker management
npx claude-mem search <query> # Search memory from terminal
npx claude-mem transcript watch # Start transcript watcher
Windows, macOS, and Linux are all first-class targets. Platform-specific considerations:
os.homedir() and path.join() everywhere — never hardcode / or ~#!/usr/bin/env node for the CLI entry point (cross-platform via Node)PATH, common install locations per platform (%USERPROFILE%\.bun\bin\bun.exe on Windows, ~/.bun/bin/bun on Unix)fs.chmod is a no-op on Windows; don't gate on itworker-service.ts patterns~/Library/Application Support/Code/ (macOS), ~/.config/Code/ (Linux), %APPDATA%/Code/ (Windows).bashrc/.zshrc on Unix, PowerShell profile on Windows (for PATH modifications if needed)Tier 1 — Native Hook/Plugin Systems (highest fidelity, real-time capture):
| Tool | Hooks | Config Location | Context Injection | Stars/Users |
|---|---|---|---|---|
| Claude Code | 5 lifecycle hooks | ~/.claude/settings.json | CLAUDE.md, plugins | ~25% market |
| Gemini CLI | 11 lifecycle hooks | ~/.gemini/settings.json | GEMINI.md | ~95k stars |
| OpenCode | 20+ event hooks + plugin SDK | ~/.config/opencode/opencode.json | AGENTS.md + rules dirs | ~110k stars |
| Windsurf | 11 Cascade hooks | .windsurf/hooks.json | .windsurf/rules/*.md | ~1M users |
| Codex CLI | notify hook | ~/.codex/config.toml | .codex/AGENTS.md, MCP | Growing (OpenAI) |
| OpenClaw | 8 event hooks + plugin SDK | ~/.openclaw/openclaw.json | MEMORY.md sync | ~196k stars |
Tier 2 — MCP Integration (tool-based, search + context injection):
| Tool | MCP Support | Config Location | Context Injection |
|---|---|---|---|
| Cursor | First-class | .cursor/mcp.json | .cursor/rules/*.mdc |
| Copilot CLI | First-class (default MCP) | ~/.copilot/config | .github/copilot-instructions.md |
| Antigravity | First-class + MCP Store | ~/.gemini/antigravity/mcp_config.json | .agent/rules/, GEMINI.md |
| Goose | Native MCP (co-developed protocol) | ~/.config/goose/config.yaml | MCP context |
| Crush | MCP + Skills | JSON config (charm.land schema) | Skills system |
| Roo Code | First-class | .roo/ | .roo/rules/*.md, AGENTS.md |
| Warp | MCP + Warp Drive | WARP.md + Warp Drive UI | WARP.md |
Tier 3 — Transcript File Watching (passive, file-based):
| Tool | Transcript Location | Format |
|---|---|---|
| Claude Code | ~/.claude/projects/<proj>/<session>.jsonl | JSONL |
| Codex CLI | ~/.codex/sessions/**/*.jsonl | JSONL |
| Gemini CLI | ~/.gemini/tmp/<hash>/chats/ | JSON |
| OpenCode | .opencode/ (SQLite) | SQLite — needs export |
| Component | Status | Location |
|---|---|---|
| Claude Code plugin | Complete | plugin/hooks/hooks.json |
| Cursor hooks installer | Complete | src/services/integrations/CursorHooksInstaller.ts |
| Platform adapters | Claude Code + Cursor + raw | src/cli/adapters/ |
| Transcript watcher | Complete (schema-based JSONL) | src/services/transcripts/ |
| Codex transcript schema | Sample exists | src/services/transcripts/config.ts |
| OpenClaw plugin | Complete (1000+ lines) | openclaw/src/index.ts |
| MCP server | Complete | plugin/scripts/mcp-server.cjs |
| Gemini CLI support | Not started | — |
| OpenCode support | Not started | — |
| Windsurf support | Not started | — |
npx skills (vercel-labs/skills/src/agents.ts): Check if config directory existsinstaller/src/steps/install.ts:29-83): registerMarketplace, registerPlugin, enablePluginInClaudeSettings — extract shared logic from existing installer into reusable modules (DRY with the new CLI)plugin/scripts/bun-runner.js): PATH lookup + common locations per platformsrc/services/integrations/CursorHooksInstaller.ts): Reference implementation for IDE hooks installationAdd bin field to package.json:
"bin": {
"claude-mem": "./dist/cli/index.js"
}
Create src/npx-cli/index.ts — a Node.js CLI router (NOT Bun) with command categories:
Install commands (pure Node.js, no Bun required):
npx claude-mem or npx claude-mem install → interactive install (IDE multi-select)npx claude-mem install --ide <name> → direct IDE setup (only for implemented IDEs; unimplemented ones error with "Support for <name> coming soon")npx claude-mem update → update to latest versionnpx claude-mem uninstall → remove plugin and IDE configsnpx claude-mem version → print versionRuntime commands (delegate to Bun via installed plugin):
npx claude-mem start → spawns bun worker-service.cjs startnpx claude-mem stop → spawns bun worker-service.cjs stopnpx claude-mem restart → spawns bun worker-service.cjs restartnpx claude-mem status → spawns bun worker-service.cjs statusnpx claude-mem search <query> → hits GET http://localhost:37777/api/search?q=<query>npx claude-mem transcript watch → starts transcript watcherRuntime commands must check for installation first: If plugin directory doesn't exist at ~/.claude/plugins/marketplaces/thedotmack/, print "claude-mem is not installed. Run: npx claude-mem install" and exit.
The install flow (fully replaces git clone + build):
import.meta.url or __dirname)plugin/ from the npm package to ~/.claude/plugins/marketplaces/thedotmack/plugin/ to ~/.claude/plugins/cache/thedotmack/claude-mem/<version>/~/.claude/plugins/known_marketplaces.json~/.claude/plugins/installed_plugins.json~/.claude/settings.jsonnpm install in the marketplace dir (for @chroma-core/default-embed — native ONNX binaries, can't be bundled)Interactive IDE selection (auto-detect + prompt):
~/.claude/ exists~/.gemini/ exists~/.config/opencode/ exists OR opencode in PATH~/.openclaw/ exists~/.codeium/windsurf/ exists~/.codex/ exists~/.cursor/ existscopilot in PATH (it's a CLI tool, not a config dir)~/.gemini/antigravity/ exists~/.config/goose/ exists OR goose in PATHcrush in PATHroo-code~/.warp/ exists OR warp in PATHThe runtime command routing:
bun-runner.js, platform-aware)bun worker-service.cjs <command> and pipe stdio throughsearch: HTTP request to running workerinstaller/src/steps/install.ts:29-83 for marketplace registration — extract to shared moduleplugin/scripts/bun-runner.js for Bun resolutionvercel-labs/skills/src/agents.ts for IDE auto-detection patternnpx claude-mem install copies plugin to correct directories on macOS, Linux, and Windowsnpx claude-mem start/stop/status work after installnpx claude-mem search "test" returns resultsnpx claude-mem start before install prints helpful error messagenpx claude-mem update and npx claude-mem uninstall work correctlynpx claude-mem version prints versionbun:sqlite in the CLI entry pointAdd CLI build step to scripts/build-hooks.js:
src/npx-cli/index.ts → dist/cli/index.js@clack/prompts and picocolors into the output (self-contained)#!/usr/bin/env nodeMove @clack/prompts and picocolors to main package.json as dev dependencies (bundled by esbuild into dist/cli/index.js)
Verify package.json files field: Currently ["dist", "plugin"]. dist/cli/index.js is already included since it's under dist/. No change needed.
Update prepublishOnly to ensure CLI is built before npm publish (already covered — npm run build calls build-hooks.js)
Pre-build OpenClaw plugin: Add an esbuild step that compiles openclaw/src/index.ts → openclaw/dist/index.js so it ships ready-to-use. No tsc at install time.
Add openclaw/dist/ to package.json files field (or add openclaw if the whole directory should ship)
npm run build produces dist/cli/index.js with correct shebangnpm run build produces openclaw/dist/index.js pre-builtnpm pack includes both dist/cli/index.js and openclaw/dist/node dist/cli/index.js --help works without Bunnpm pack --dry-run)Why first among new IDEs: Near-identical architecture to Claude Code. 11 lifecycle hooks with JSON stdin/stdout, same exit code conventions (0=success, 2=block), GEMINI.md context files. 95k GitHub stars. Lowest effort, highest confidence.
| Event | Map to claude-mem | Use |
|---|---|---|
SessionStart | session-init | Start tracking session |
BeforeAgent | user-prompt | Capture user prompt |
AfterAgent | observation | Capture full agent response |
BeforeTool | — | Skip (pre-execution, no result yet) |
AfterTool | observation | Capture tool name + input + response |
BeforeModel | — | Skip (too low-level, LLM request details) |
AfterModel | — | Skip (raw LLM response, redundant with AfterAgent) |
BeforeToolSelection | — | Skip (internal planning step) |
PreCompress | summary | Trigger summary before context compression |
Notification | — | Skip (system alerts, not session data) |
SessionEnd | session-end | Finalize session |
Mapped: 5 of 11 events. Skipped: 6 events that are either too low-level (BeforeModel/AfterModel), pre-execution (BeforeTool, BeforeToolSelection), or system-level (Notification).
packages/core/src/hooks/types.ts)Base input (all hooks receive):
{ session_id: string, transcript_path: string, cwd: string, hook_event_name: string, timestamp: string }
Event-specific fields:
| Event | Additional Fields |
|---|---|
SessionStart | source: "startup" | "resume" | "clear" |
SessionEnd | reason: "exit" | "clear" | "logout" | "prompt_input_exit" | "other" |
BeforeAgent | prompt: string |
AfterAgent | prompt: string, prompt_response: string, stop_hook_active: boolean |
BeforeTool | tool_name: string, tool_input: Record<string, unknown>, mcp_context?: McpToolContext, original_request_name?: string |
AfterTool | tool_name: string, tool_input: Record<string, unknown>, tool_response: Record<string, unknown>, mcp_context?: McpToolContext |
PreCompress | trigger: "auto" | "manual" |
Notification | notification_type: "ToolPermission", message: string, details: Record<string, unknown> |
Output (all hooks can return):
{ continue?: boolean, stopReason?: string, suppressOutput?: boolean, systemMessage?: string, decision?: "allow" | "deny" | "block" | "approve" | "ask", reason?: string, hookSpecificOutput?: Record<string, unknown> }
Advisory (non-blocking) hooks: SessionStart, SessionEnd, PreCompress, Notification — continue and decision fields are ignored.
Environment variables provided: GEMINI_PROJECT_DIR, GEMINI_SESSION_ID, GEMINI_CWD, CLAUDE_PROJECT_DIR (compat alias)
Create Gemini CLI platform adapter at src/cli/adapters/gemini-cli.ts:
NormalizedHookInputsession_id, transcript_path, cwd, hook_event_name, timestampSessionStart: source → session init metadataBeforeAgent: prompt → user prompt textAfterAgent: prompt + prompt_response → full conversation turnAfterTool: tool_name + tool_input + tool_response → observationPreCompress: trigger → summary triggerSessionEnd: reason → session finalizationCreate Gemini CLI hooks installer at src/services/integrations/GeminiCliHooksInstaller.ts:
~/.gemini/settings.json under the hooks key{
"hooks": {
"AfterTool": [{
"matcher": "*",
"hooks": [{ "name": "claude-mem", "type": "command", "command": "<path-to-hook-script>", "timeout": 5000 }]
}]
}
}
matcher uses regex for tool events, exact string for lifecycle events. "*" or "" matches all.sequential: boolean (default false = parallel execution)~/.gemini/GEMINI.md (append claude-mem section with <claude-mem-context> tags, same pattern as CLAUDE.md).gemini/settings.json > user ~/.gemini/settings.json > system /etc/gemini-cli/settings.jsonRegister gemini-cli in getPlatformAdapter() at src/cli/adapters/index.ts
Add Gemini CLI to installer IDE selection
npx claude-mem install --ide gemini-cli merges hooks into ~/.gemini/settings.jsonAfterTool events produce observations with correct tool_name, tool_input, tool_responseGEMINI.md gets claude-mem context sectionsession_id from base input is used for session tracking~/.gemini/settings.json — must deep mergetype: "runtime" — that's for internal extensions only; use type: "command"decision or continue fields on themWhy next: 110k stars, richest plugin ecosystem. OpenCode plugins are JS/TS modules auto-loaded from plugin directories. OpenCode also has a Claude Code compatibility fallback (reads ~/.claude/CLAUDE.md if no global AGENTS.md exists, controllable via OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=1).
packages/plugin/src/index.ts)Plugin signature:
import { type Plugin, tool } from "@opencode-ai/plugin"
export const ClaudeMemPlugin: Plugin = async (ctx) => {
// ctx: { client, project, directory, worktree, serverUrl, $ }
return { /* hooks object */ }
}
PluginInput type (6 properties, not 4):
type PluginInput = {
client: ReturnType<typeof createOpencodeClient> // OpenCode SDK client
project: Project // Current project info
directory: string // Current working directory
worktree: string // Git worktree path
serverUrl: URL // Server URL
$: BunShell // Bun shell API
}
Two hook mechanisms (important distinction):
Direct interceptor hooks — keys on the returned Hooks object, receive (input, output) allowing mutation:
tool.execute.before: (input: { tool, sessionID, callID }, output: { args })tool.execute.after: (input: { tool, sessionID, callID, args }, output: { title, output, metadata })shell.env, chat.message, chat.params, chat.headers, permission.ask, command.execute.beforeexperimental.session.compacting, experimental.chat.messages.transform, experimental.chat.system.transformBus event catch-all — generic event hook, receives { event } where event.type is the event name:
session.created, session.compacted, session.deleted, session.idle, session.error, session.status, session.updated, session.diffmessage.updated, message.part.updated, message.part.removed, message.removedfile.edited, file.watcher.updatedcommand.executed, todo.updated, installation.updated, server.connectedpermission.asked, permission.repliedlsp.client.diagnostics, lsp.updatedtui.prompt.append, tui.command.execute, tui.toast.showCustom tool registration (CORRECTED — name is the key, not positional arg):
return {
tool: {
claude_mem_search: tool({
description: "Search claude-mem memory database",
args: { query: tool.schema.string() },
async execute(args, context) {
// context: { sessionID, messageID, agent, directory, worktree, abort, metadata, ask }
const response = await fetch(`http://localhost:37777/api/search?q=${encodeURIComponent(args.query)}`)
return await response.text()
},
}),
},
}
Create OpenCode plugin at src/integrations/opencode-plugin/index.ts:
Plugin function receiving full PluginInput contexttool.execute.after for tool observation capture (gives tool, args, output)event for session lifecycle:| Mechanism | Event | Map to claude-mem |
|---|---|---|
| interceptor | tool.execute.after | observation (tool name + args + output) |
| bus event | session.created | session-init |
| bus event | message.updated | observation (assistant messages) |
| bus event | session.compacted | summary |
| bus event | file.edited | observation (file changes) |
| bus event | session.deleted | session-end |
claude_mem_search custom tool using correct tool({ description, args, execute }) APIlocalhost:37777 API endpoints from the pluginBuild the plugin in the esbuild pipeline → dist/opencode-plugin/index.js
Create OpenCode setup in installer (two options, prefer file-based):
~/.config/opencode/plugins/claude-mem.ts (auto-loaded at startup)~/.config/opencode/opencode.json under "plugin" array: ["claude-mem"]opencode.jsonc) and legacy config.json~/.config/opencode/AGENTS.md (or create it) with <claude-mem-context> tags"instructions" config key (supports file paths, globs, remote URLs)Add OpenCode to installer IDE selection
npx claude-mem install --ide opencode registers the plugin (file or npm)tool.execute.after interceptor produces observations with tool, args, outputsession.created, session.deleted) handle session lifecycleclaude_mem_search custom tool works in OpenCode sessionssession.diff for full capture — it's a summary diff, not raw datatool('name', schema, handler) — wrong signature. Name is the key in the tool:{} map(input, output) mutation pattern — they only receive { event }~/.config/opencode/ — respect OPENCODE_CONFIG_DIR env var if setWhy next: 11 Cascade hooks, ~1M users. Hook architecture uses JSON stdin with a consistent envelope format.
Naming pattern: pre_/post_ prefix + 5 action categories, plus 2 standalone post-only events.
| Event | Can Block? | Map to claude-mem | Use |
|---|---|---|---|
pre_user_prompt | Yes | session-init + context | Start session, inject context |
pre_read_code | Yes | — | Skip (pre-execution, can block file reads) |
post_read_code | No | — | Skip (too noisy, file reads are frequent) |
pre_write_code | Yes | — | Skip (pre-execution, can block writes) |
post_write_code | No | observation | Code generation |
pre_run_command | Yes | — | Skip (pre-execution, can block commands) |
post_run_command | No | observation | Shell command execution |
pre_mcp_tool_use | Yes | — | Skip (pre-execution, can block MCP calls) |
post_mcp_tool_use | No | observation | MCP tool results |
post_cascade_response | No | observation | Full AI response |
post_setup_worktree | No | — | Skip (informational) |
Mapped: 5 of 11 events (all post-action). Skipped: 4 pre-hooks (blocking-capable, pre-execution) + 2 low-value post-hooks.
Common envelope (all hooks):
{
"agent_action_name": "string",
"trajectory_id": "string",
"execution_id": "string",
"timestamp": "ISO 8601 string",
"tool_info": { /* event-specific payload */ }
}
Event-specific tool_info payloads:
| Event | tool_info fields |
|---|---|
pre_user_prompt | { user_prompt: string } |
pre_read_code / post_read_code | { file_path: string } |
pre_write_code / post_write_code | { file_path: string, edits: [{ old_string: string, new_string: string }] } |
pre_run_command / post_run_command | { command_line: string, cwd: string } |
pre_mcp_tool_use | { mcp_server_name: string, mcp_tool_name: string, mcp_tool_arguments: {} } |
post_mcp_tool_use | { mcp_server_name: string, mcp_tool_name: string, mcp_tool_arguments: {}, mcp_result: string } |
post_cascade_response | { response: string } (markdown) |
post_setup_worktree | { worktree_path: string, root_workspace_path: string } |
Exit codes: 0 = success, 2 = block (pre-hooks only; stderr shown to agent), any other = non-blocking warning.
Create Windsurf platform adapter at src/cli/adapters/windsurf.ts:
NormalizedHookInputagent_action_name, trajectory_id, execution_id, timestamp, tool_infotrajectory_id → sessionId, tool_info fields per event typepost_write_code: tool_info.file_path + tool_info.edits → file change observationpost_run_command: tool_info.command_line + tool_info.cwd → command observationpost_mcp_tool_use: tool_info.mcp_tool_name + tool_info.mcp_tool_arguments + tool_info.mcp_result → tool observationpost_cascade_response: tool_info.response → full AI response observationCreate Windsurf hooks installer at src/services/integrations/WindsurfHooksInstaller.ts:
~/.codeium/windsurf/hooks.json (user-level, for global coverage).windsurf/hooks.json if user chooses workspace-level install{
"hooks": {
"post_write_code": [{
"command": "<path-to-hook-script>",
"show_output": false,
"working_directory": "<optional>"
}]
}
}
~) is NOT supported in working_directory — use absolute paths.windsurf/rules/claude-mem-context.md (workspace-level; Windsurf rules are workspace-scoped)Register windsurf in getPlatformAdapter() at src/cli/adapters/index.ts
Add Windsurf to installer IDE selection
npx claude-mem install --ide windsurf creates hooks config at ~/.codeium/windsurf/hooks.jsontrajectory_id is used as session identifier.windsurf/rules/claude-mem-context.md (under 6K char limit)post_search_code, post_lint_code, on_error, pre_tool_execution) — they don't existtool_info envelope, not flat fields~) in working_directory — not supported, use absolute pathsCodex has both a notify hook (real-time) and transcript files (complete history). Use transcript watching only — it's more complete and avoids the complexity of dual capture paths. The notify hook is a simpler mechanism that doesn't provide enough granularity to justify maintaining two integration paths. If transcript watching proves insufficient, add the notify hook later.
Create Codex transcript schema — the sample in src/services/transcripts/config.ts is already production-quality. Verify against current Codex CLI JSONL format and update if needed.
Create Codex setup in installer:
~/.claude-mem/transcript-watch.json~/.codex/sessions/**/*.jsonl using existing CODEX_SAMPLE_SCHEMA.codex/AGENTS.md (Codex reads this natively)config.toml if it exists (read → parse → merge → write)Add Codex CLI to installer IDE selection
npx claude-mem install --ide codex creates transcript watch configAGENTS.md updated with context after sessionsconfig.toml is preservedPlugin is already fully built at openclaw/src/index.ts (~1000 lines). Has event hooks, SSE observation feed, MEMORY.md sync, slash commands. Only wiring into the installer is needed.
Wire OpenClaw into the npx installer:
~/.openclaw/ directoryopenclaw/dist/ (built in Phase 2) to OpenClaw plugins location~/.openclaw/openclaw.json under plugins.claude-memAdd OpenClaw to IDE selection TUI with hint about messaging channel support
npx claude-mem install --ide openclaw registers the pluginThese get the MCP server for free — it already exists at plugin/scripts/mcp-server.cjs. The installer just needs to write the right config files per IDE.
MCP-only integrations provide: search tools + context injection. They do NOT capture transcripts or tool usage in real-time.
Copilot CLI MCP setup:
~/.copilot/config (merge, not overwrite).github/copilot-instructions.mdcopilot command in PATHAntigravity MCP setup:
~/.gemini/antigravity/mcp_config.json (merge, not overwrite)~/.gemini/GEMINI.md (shared with Gemini CLI) and/or .agent/rules/claude-mem-context.md~/.gemini/antigravity/ existsGoose MCP setup:
~/.config/goose/config.yaml (YAML merge — use a lightweight YAML parser or write the block manually if config doesn't exist)~/.config/goose/ exists OR goose in PATHCrush MCP setup:
crush in PATHRoo Code MCP setup:
.roo/ or workspace settings.roo/rules/claude-mem-context.mdroo-codeWarp MCP setup:
WARP.md in project root for context injection (similar to CLAUDE.md)~/.warp/ exists OR warp in PATHFor each: Add to installer IDE detection and selection
JSON configs: Read → parse → deep merge → write back. YAML configs (Goose): If file exists, read and append the MCP block. If not, create from template. Avoid pulling in a full YAML parser library — write the MCP block as a string append with proper indentation if the format is predictable.
This is a full replacement, not a deprecation.
claude-mem-installer npm package (unpublish or mark deprecated with message pointing to npx claude-mem)install/public/install.sh → redirect to npx claude-meminstaller/ directory from the repository (it's replaced by src/npx-cli/)npm run build succeeds, produces dist/cli/index.js and openclaw/dist/index.jsnode dist/cli/index.js install works clean (no prior install)npx claude-mem start/stop/status/search all worknpx claude-mem update updates correctlynpx claude-mem uninstall cleans up all IDE configsnpx claude-mem version prints versionnpx claude-mem start before install shows helpful error| Integration | Type | Captures Sessions | Search via MCP | Context Injection |
|---|---|---|---|---|
| Claude Code | Plugin | Yes (hooks) | Yes | CLAUDE.md |
| Gemini CLI | Hooks | Yes (AfterTool, AfterAgent) | Yes (via hook) | GEMINI.md |
| OpenCode | Plugin | Yes (tool.execute.after, message.updated) | Yes (custom tool) | AGENTS.md / rules |
| Windsurf | Hooks | Yes (post_cascade_response, etc.) | Yes (via hook) | .windsurf/rules/ |
| Codex CLI | Transcript | Yes (JSONL watcher) | No (passive only) | .codex/AGENTS.md |
| OpenClaw | Plugin | Yes (event hooks) | Yes (slash commands) | MEMORY.md |
| Copilot CLI | MCP | No | Yes | copilot-instructions.md |
| Antigravity | MCP | No | Yes | .agent/rules/ |
| Goose | MCP | No | Yes | MCP context |
| Crush | MCP | No | Yes | Skills |
| Roo Code | MCP | No | Yes | .roo/rules/ |
| Warp | MCP | No | Yes | WARP.md |
| Phase | IDE/Tool | Integration Type | Stars/Users | Effort |
|---|---|---|---|---|
| 1-2 | (infrastructure) | npx CLI + build pipeline | All users | Medium |
| 3 | Gemini CLI | Hooks (Tier 1) | ~95k stars | Medium (near-identical to Claude Code) |
| 4 | OpenCode | Plugin (Tier 1) | ~110k stars | Medium (rich plugin SDK) |
| 5 | Windsurf | Hooks (Tier 1) | ~1M users | Medium |
| 6 | Codex CLI | Transcript (Tier 3) | Growing (OpenAI) | Low (schema already exists) |
| 7 | OpenClaw | Plugin (Tier 1) — pre-built | ~196k stars | Low (wire into installer) |
| 8 | Copilot CLI, Antigravity, Goose, Crush, Warp, Roo Code | MCP (Tier 2) | 20M+ combined | Low per IDE |
| 9 | (remove old installer) | — | — | Low |
| 10 | (final verification) | — | — | Low |
bun:sqlite. Runtime commands delegate to Bun; install commands don't need it.