agentmemory-capture
OpenCode plugin for agentmemory — full Claude Code hook parity: session lifecycle (create/idle/status/compacted/update/diff/delete/error), messages & prompts (chat.message, message.updated user+assistant, message.removed), tool lifecycle (ToolPart states with timing), part tracking (subtask, step-finish, reasoning, file, patch, compaction, agent, retry), file enrichment pipeline, permissions, task tracking (w/ priority), commands, config & model tracking. 22 hooks, 2 slash commands.
pinned to #93ae9bcupdated 2 months ago
Ask your AI client: “install plugins/agentmemory-capture”.
Requires the metahub MCP server installed in your client. Set up MCP.
mh install plugins/agentmemory-capturemetahub onboarded this repo on the author's behalf.
If you own github.com/rohitg00/agentmemory on GitHub, claim the listing to take over publishing. Your claim preserves the existing eval history and badges; only the curator label is replaced with verified-publisher on your next publish.
Stars
24,963
Last commit
2 months ago
Latest release
published
- #agentmemory
- #agents
- #ai
- #claude
- #claudecode
- #codex
- #copilot
- #cursor
- #genai
- #harness
- #hermes
- #memory
- #openclaw
What's bundled
Items extracted from this plugin's manifest + directory tree.
Commands (2)
/recallSearch past session observations and lessons for relevant context. Wrap the `memory_smart_search` and `memory_lesson_recall` MCP tools./rememberExplicitly save an insight, decision, or learning to agentmemory for future sessions. Wraps the `memory_save` MCP tool.
Automated checks the publisher passed at publish time — structure, docs, safety, and whether the artifact behaves as claimed.93ae9bc· 2 months ago
Behavioral checks ran but aren't published for this artifact; the static checks above ran at publish time.
Kind-specific
3 passed1 warningPlugin: bundled artifacts presentwarn
Couldn't find a skills/ subdir or an MCP server config inside the plugin
A plugin is most useful when it bundles ≥ 1 skill or an MCP server.
Plugin: manifest fields complete
Plugin: bundle shape
2 commands
Plugin: manifest location
manifest at plugin.json
Release history
1- releasecurrent93ae9bcwarn2 months ago
Contents
agentmemory for OpenCode
<strong>Your OpenCode agents remember everything. No more re-explaining.</strong>
<sub>Persistent cross-session memory via agentmemory — 95.2% retrieval accuracy on LongMemEval-S.</sub>
Quick start
1. Start the agentmemory server
npx @agentmemory/agentmemory
The server starts on http://localhost:3111.
2. Configure the MCP server
Add to ~/.config/opencode/opencode.json or your project's .opencode/opencode.json:
{
"mcp": {
"agentmemory": {
"type": "local",
"command": ["npx", "-y", "@agentmemory/mcp"],
"enabled": true
}
}
}
3. Install the plugin
Add to ~/.config/opencode/opencode.json:
{
"plugin": ["./plugins/agentmemory-capture.ts"]
}
Copy the plugin file from this repo:
mkdir -p ~/.config/opencode/plugins
cp plugin/opencode/agentmemory-capture.ts ~/.config/opencode/plugins/
4. Add the slash commands
Copy the commands into your project or global .opencode/commands/ directory:
mkdir -p ~/.config/opencode/commands
cp plugin/opencode/commands/recall.md ~/.config/opencode/commands/
cp plugin/opencode/commands/remember.md ~/.config/opencode/commands/
Restart OpenCode or open a new session. The plugin auto-captures everything.
What gets captured
Session lifecycle
| Event | Hook | agentmemory API |
|---|---|---|
| Session start | session.created | POST /session/start |
| Idle → summarize | session.idle + session.status (idle) | POST /summarize |
| Status transitions | session.status (idle/busy/retry) | POST /observe |
| Compaction | session.compacted | POST /summarize + POST /observe |
| Metadata updates | session.updated | POST /observe |
| Code change tracking | session.diff | POST /observe |
| Session delete | session.deleted | POST /session/end |
| Session error | session.error | POST /observe |
Messages & prompts
| Event | Hook | agentmemory API |
|---|---|---|
| User prompt (rich) | chat.message | POST /observe |
| User prompt metadata | message.updated (user) | POST /observe |
| Assistant response | message.updated (assistant) | POST /observe |
| Message removed (undo) | message.removed | POST /observe |
Parts & steps
| Event | Hook | agentmemory API |
|---|---|---|
| Subagent start | message.part.updated (subtask) | POST /observe |
| Tool completed | message.part.updated (tool completed) | POST /observe |
| Tool error | message.part.updated (tool error) | POST /observe |
| Step finish (cost/tokens) | message.part.updated (step-finish) | POST /observe |
| Reasoning trace | message.part.updated (reasoning) | POST /observe |
| Patch applied | message.part.updated (patch) | POST /observe |
| Auto/manual compaction | message.part.updated (compaction) | POST /observe |
| Agent selection | message.part.updated (agent) | POST /observe |
| API retry | message.part.updated (retry) | POST /observe |
File enrichment pipeline
| Event | Hook | agentmemory API |
|---|---|---|
| File tool params | tool.execute.before → stash paths | — |
| File edited | file.edited → stash paths | — |
| File part attached | message.part.updated (file) → stash paths | — |
| Enrichment inject | experimental.chat.system.transform | POST /enrich → output.system[] |
| Memory context inject | experimental.chat.system.transform | POST /context → output.system[] |
Permissions
| Event | Hook | agentmemory API |
|---|---|---|
| Permission prompt | permission.updated | POST /observe |
| Permission reply | permission.replied | POST /observe |
Tasks & commands
| Event | Hook | agentmemory API |
|---|---|---|
| Task tracking (w/ priority) | todo.updated | POST /observe |
| Command executed | command.executed | POST /observe |
Model & config
| Event | Hook | agentmemory API |
|---|---|---|
| LLM parameters | chat.params | POST /observe |
| Config loaded | config | POST /observe |
| Compaction (WIP) | experimental.session.compacting | POST /context → output.context[] |
File enrichment + memory injection (two-layer pipeline)
experimental.chat.system.transform fires before every LLM call and injects two layers of context:
-
Memory context (once per session): calls
/agentmemory/contextand injects project profile, recent session summaries, and important past observations into the system prompt. This is the OpenCode equivalent of Claude's MEMORY.md bridge — instead of syncing to a markdown file, context is injected directly into the system prompt. -
File enrichment (every turn with stashed files): calls
/agentmemory/enrichwith files stashed bytool.execute.before,file.edited, andmessage.part.updated(file parts). File-specific context (past observations, related bugs, semantic search) is injected into the system prompt.
System prompt = [OpenCode instructions] + [memory context] + [file enrichment] + [user message]
^ ^
first turn only every file-touching turn
Differences from Claude's PreToolUse:
| Dimension | Claude (PreToolUse) | OpenCode (two-hop pipeline) |
|---|---|---|
| Injection mechanism | stdout → context window | output.system[] → system prompt |
| Timing | Same turn (parallel with tool) | Next turn (before next LLM call) |
| File set | Per-tool (immediate) | Batched (all files since last enrichment) |
| Coverage | Edit/Write/Read/Glob/Grep only | Edit/Write/Read/Glob/Grep only |
| What gets injected | <agentmemory-file-context> + bug memories | Identical /enrich response |
MEMORY.md vs AGENTS.md: how context flows
Claude Code and OpenCode take fundamentally different approaches to injecting memory context into the agent's system prompt.
Claude Code: file-backed bridge (two-hop)
agentmemory ──write──▶ MEMORY.md ──read──▶ Claude system prompt
- The
claude-bridge/syncendpoint serializes agentmemory observations into aMEMORY.mdfile in the project root - Claude Code reads
MEMORY.mdon session start and prepends it to the system prompt - Sync is periodic — sessions only get fresh context when the bridge last ran (session end, pre-compact)
- Coupling: memory data lives in a git-trackable file, visible to CI, team members, and other tools
OpenCode: direct injection (one-hop)
agentmemory ──push──▶ OpenCode system prompt
experimental.chat.system.transformcalls/contextat runtime and pushes the response directly intooutput.system[]- Always current — context is fetched at session start (once) and before file-touching turns (per-batch)
- No file intermediary — no stale copies, no merge conflicts, no disk I/O
AGENTS.mdis a static instruction file for project conventions, coding standards, and tool guidance — agentmemory does not read or write it
Tradeoffs
| Dimension | Claude (MEMORY.md bridge) | OpenCode (direct injection) |
|---|---|---|
| Freshness | Stale between syncs | Always current (fetched at call time) |
| Visibility | Human-readable file in repo | In-memory injection only |
| Simplicity | Two moving parts (bridge + file) | One step (API → system prompt) |
| Team sharing | File is git-trackable, CI-friendly | Memory shared via agentmemory server API |
| Integration | Any tool can read MEMORY.md | Requires OpenCode plugin SDK |
Why OpenCode goes direct
agentmemory already persists everything in SQLite (data/state_store.db). Adding an intermediate MEMORY.md file would duplicate data, introduce sync lag, and require the model to re-parse structured context from markdown. Direct injection delivers the same data with lower latency and zero staleness — the agent always sees what agentmemory knows right now.
Slash commands
/recall <query>— Search past observations and lessons/remember <text>— Save an insight to long-term memory
Session instruction injection
Agentmemory usage instructions are injected into the system prompt on the first turn of every session via experimental.chat.system.transform (alongside memory context from /context). This is functionally equivalent to Claude Code's skills mechanism — the agent learns which agentmemory_memory_* tools to use and when, without needing separate skill invocations.
What's not covered (vs Claude Code plugin)
| Claude feature | Reason |
|---|---|
| SubagentStop | OpenCode's SubtaskPart type has no completion/result fields; subtask lifecycle ends are not exposed as distinct events in the OpenCode SDK |
| TaskCompleted | No team/teammate concept in OpenCode; todo.updated captures task state changes as a partial equivalent |
| Stop | session.compacted event handler exists; experimental.session.compacting injection hook defined in SDK but Go binary (v1.14.41) doesn't wire it — will auto-activate when upstream implements it |
| Skills (remember/recall/forget/session-history) | Covered by injected system instructions via experimental.chat.system.transform — agent receives usage guidance on first turn |
| Consolidation pipeline (crystals/auto + consolidate-pipeline) | Now called on session.deleted — mirrors Claude's CONSOLIDATION_ENABLED=true behavior |
| Claude MEMORY.md bridge | OpenCode-specific; OpenCode uses its own AGENTS.md mechanism, not Claude's MEMORY.md |
All other Claude Code hooks have direct or pipeline equivalents in this plugin. 12 of 12 Claude hook types covered.
Reviews
No reviews yet. Be the first.
Related
taste-skill
Frontend design taste skills including brutalist, minimalist, soft, redesign, stitch, and more
ui-ux-pro-max
UI/UX design intelligence. Searchable local database with 84 styles, 161 palettes, 73 font pairings, 25 charts, and 17 stacks (React, Next.js, Vue, Nuxt.js, Nuxt UI, Svelte, Astro, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX, Three.js). Use when designing, building, or reviewing UI: pages, components, color schemes, typography, layout, accessibility, animation, or data visualization.
career-ops
AI job search command center — evaluate offers, generate CVs, scan portals, track applications
mh install plugins/agentmemory-capture