{
  "markdown": "# Claude Recall Plugin v2.4.0\n\nA [Claude Code](https://docs.anthropic.com/en/docs/claude-code) plugin that persists conversation context across sessions, `/clear` commands, and compaction events. It adds cross-session search, tagging, highlight sharing between sessions, and observability.\n\n> **Marketplace Status:** Published in Anthropic's community marketplace as `recall@claude-community` (`/plugin marketplace add anthropics/claude-plugins-community`, then install `recall`). The catalog tracks this repo's `main`.\n>\n> **Pre-built Marketplace:** [claude-recall-marketplace](https://github.com/bledden/claude-recall-marketplace) (the same release, and the only reliable path for the VSCode extension)\n\n---\n\n## Why Recall (vs. native Claude Code)\n\nClaude Code ships with `/recap`, `/resume`, and a `memory/` directory. Recall is positioned around what those do **not** cover:\n\n- **Cross-project full-text search (FTS5).** Native `/recap` and `/resume` operate within the current session/project. Recall indexes every exchange into SQLite FTS5 and searches across **all** sessions in a project (`--all`) or across **every** project (`--global`) — including past, closed sessions.\n- **Tagging.** Apply manual tags to sessions or individual exchanges, plus automatic keyword extraction, then query them across projects (`/recall tag`, `/recall tags`, `/recall search --tag`). The native `memory/` directory is freeform notes, not a queryable tag index.\n- **Highlight & connection sharing between parallel sessions.** Link two live sessions and share findings as lightweight highlights delivered to a connected session's inbox (`/recall connect`, `/recall highlight`, `/recall inbox`). Native Claude Code has no mechanism to push a finding from one session to another.\n- **The exact commands Claude ran.** Tool calls (shell commands, files edited, URLs fetched) are indexed alongside the prose, so \"how did we spin up that pod\" returns the real command line from the real session, not a reconstruction.\n\nIf you only need to re-anchor within the current session, native `/recap` / `/resume` may be enough. Recall is for cross-session, cross-project retrieval, tagging, and sharing.\n\n---\n\n## Requirements\n\n- **Claude Code** 2.1.x or later (uses the `Stop` hook and the `SessionStart` `compact` matcher; see the 2.1.x note below), or **Claude Cowork** (macOS desktop app)\n- **Python 3.6+** (for hook and script execution)\n\n---\n\n## UPDATE: Claude Code 2.1.x Breaking Change\n\n**As of Claude Code 2.1.x, local plugins no longer persist across sessions.** This is an undocumented breaking change from 2.0.x behavior. See [issue #17089](https://github.com/anthropics/claude-code/issues/17089).\n\nCustom plugins now **require a marketplace structure** to work reliably with the VSCode extension. The `--plugin-dir` flag only works with the CLI, not VSCode.\n\n---\n\n## Installation\n\n### Claude Cowork (macOS Desktop App)\n\n**From GitHub:**\n1. Open the Claude Desktop app\n2. Navigate to the **Cowork** tab\n3. Click **\"Plugins\"** in the left sidebar\n4. Click **\"Add from GitHub\"**\n5. Enter: `https://github.com/bledden/claude-recall-plugin`\n\n**From zip file:**\n1. **[Download claude-recall-plugin.zip](https://github.com/bledden/claude-recall-plugin/releases/latest/download/claude-recall-plugin.zip)**\n2. In the Cowork **Plugins** sidebar, click **\"Upload plugin\"**\n3. Select the downloaded `claude-recall-plugin.zip` file\n\nThe plugin will appear in your Cowork plugins list. Invoke with `/recall` during a Cowork session.\n\n### Claude Code: Option 1 - Pre-Built Marketplace (Recommended for VSCode)\n\nThis is the recommended method: it always serves the latest release, and it is the only reliable method for the VSCode extension. (The community-marketplace listing `recall@claude-community` serves the same release.)\n\n```bash\nclaude plugin marketplace add https://github.com/bledden/claude-recall-marketplace\nclaude plugin install recall@recall-local\n```\n\nThe plugin will now persist across sessions in both CLI and VSCode.\n\n<details>\n<summary><strong>Alternative: Build Your Own Marketplace</strong></summary>\n\nIf you prefer to create your own local marketplace:\n\n**Step 1: Clone and set up marketplace structure**\n\n```bash\n# Clone this repo\ngit clone https://github.com/bledden/claude-recall-plugin.git\n\n# Create a marketplace wrapper\nmkdir -p claude-recall-marketplace/.claude-plugin\nmkdir -p claude-recall-marketplace/plugins\ncp -R claude-recall-plugin claude-recall-marketplace/plugins/recall\n```\n\n**Step 2: Create the marketplace manifest**\n\nCreate `claude-recall-marketplace/.claude-plugin/marketplace.json`:\n\n```json\n{\n  \"$schema\": \"https://anthropic.com/claude-code/marketplace.schema.json\",\n  \"name\": \"recall-local\",\n  \"version\": \"2.2.2\",\n  \"description\": \"Local marketplace for the recall plugin\",\n  \"owner\": {\n    \"name\": \"your-name\",\n    \"email\": \"your-email@example.com\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"recall\",\n      \"description\": \"Recover conversation context when Claude loses track\",\n      \"source\": \"./plugins/recall\",\n      \"category\": \"productivity\"\n    }\n  ]\n}\n```\n\n**Step 3: Register and install**\n\n```bash\nclaude plugin marketplace add /path/to/claude-recall-marketplace\nclaude plugin install recall@recall-local\n```\n\n</details>\n\n### Claude Code: Option 2 - Shell Alias (CLI Only)\n\nThis method works for the terminal but **does not work with the VSCode extension**.\n\n```bash\ngit clone https://github.com/bledden/claude-recall-plugin.git\n```\n\n**For Zsh (default on macOS):**\n```bash\necho \"alias claude='claude --plugin-dir /path/to/claude-recall-plugin'\" >> ~/.zshrc\nsource ~/.zshrc\n```\n\n**For Bash:**\n```bash\necho \"alias claude='claude --plugin-dir /path/to/claude-recall-plugin'\" >> ~/.bashrc\nsource ~/.bashrc\n```\n\n### Claude Code: Option 3 - Plugin Install Command (Not Recommended)\n\n```bash\nclaude plugins install https://github.com/bledden/claude-recall-plugin\n```\n\n> **Warning:** This method does not reliably persist in Claude Code 2.1.x. The plugin may disappear after restarting. Use Option 1 instead.\n\n---\n\n## Migration from v1.0.1\n\nMigration is automatic. On the first prompt after upgrading to v2.0.0, the hook migrates your existing `index.json` into SQLite and renames the file to `index.json.migrated`. No manual steps required.\n\n**Rollback:** If you need to go back to v1.0.1, rename `index.json.migrated` to `index.json`. v1.0.1 ignores `recall.db`.\n\n---\n\n## Quick Start\n\nWhen Claude seems to have lost context, run:\n\n```\n/recall:recall\n```\n\nThis will:\n1. Show you a timestamped index of all exchanges in your session\n2. Present a menu asking what you'd like to recall\n3. Fetch and display the exchanges you select\n4. Summarize where you left off\n\n---\n\n## Full Command Reference\n\n### Core Commands\n\n```\n/recall                             Interactive menu (index + options)\n/recall last5                       Last 5 exchanges, current session\n/recall last10                      Last N exchanges (lastN — any positive N)\n/recall around 2pm                  Exchanges around a time\n/recall search <keyword>            Search current session\n```\n\n### Cross-Session and Cross-Project Search\n\n```\n/recall search <keyword> --all              Search all sessions, current project\n/recall search <keyword> --global           Search across ALL projects\n/recall search <keyword> --project <name>   Search a specific project by name\n/recall search <keyword> --half-life 0      Rank by relevance only (default: 30-day recency half-life)\n```\n\n### Session Management\n\n```\n/recall sessions                    List all sessions (current project)\n/recall sessions --all              List sessions across all projects\n/recall sessions --project <name>   List sessions in a specific project by name\n/recall session <id> last10         Browse a specific past session\n```\n\n> **`--project` matching:** For `search --project <name>` and `sessions --project <name>`, `<name>` is matched as an **unanchored substring** of the stored project path (`LIKE '%name%'`, case-sensitive) — any session whose project path contains the substring matches.\n>\n> **`tags --project` is different:** `/recall tags --project <hash>` expects a project **HASH** (exact match), *not* a name/path. This is distinct from `sessions --project <name>`, which takes a name/path.\n\n### Tagging\n\n```\n/recall tag <name>                  Tag the current session\n/recall tag <name> #<exchange>      Tag a specific exchange by number\n/recall tags                        Show all tags\n/recall tags --project <hash>       Show tags for a specific project HASH (exact match)\n/recall search --tag <name>         Find sessions and exchanges by tag\n```\n\n### Cross-Session Sharing\n\n```\n/recall highlight \"summary\"              Flag a finding for connected sessions\n/recall connect <session-id> \"topic\"     Watch another session for highlights\n/recall connect --latest \"topic\"         Watch most recent active session (same project)\n/recall disconnect <session-id>          Stop watching a session\n/recall inbox                            View new highlights from connected sessions\n```\n\n### Configuration\n\n```\n/recall config check_mode decay          Enable decay-based polling (default: explicit)\n/recall config delivery_mode inject      Auto-inject highlights as system messages (default: silent)\n/recall config auto_highlight true       Enable heuristic highlight detection (default: false)\n/recall config skill_enabled true        Enable the recall-assistant skill (default: false)\n/recall config detection_signals explicit,behavioral,temporal   Configure context-loss detection signals\n/recall config auto_run_highlight true   Auto-flag findings without asking (default: false)\n```\n\n### Maintenance\n\n```\n/recall stats                               Storage statistics\n/recall usage                               How often /recall has been invoked (by command, month, project)\n/recall prune --session <id>                Delete a specific session\n/recall prune --before 2026-01-01           Delete all sessions before a date\n/recall export --session <id>               Export a session to JSON (always JSON)\n```\n\n### Time Format Support\n\nThe plugin understands various time formats:\n\n| Format | Example |\n|--------|---------|\n| 12-hour | `2pm`, `2:30pm`, `2:30 pm` |\n| 24-hour | `14:30`, `14:00` |\n| With date (month day) | `jan 5 2pm`, `dec 25 10am` |\n| With date (numeric) | `1/5 2pm`, `12/25 10:30am` |\n| Relative | `yesterday 2pm`, `today 10am` |\n\n---\n\n## Features\n\n### 1. Per-Turn Capture and /clear Survival\n\nEvery completed turn is indexed by a `Stop` hook the moment Claude finishes responding (with a `UserPromptSubmit` pass as belt-and-braces and a final catch-up on `SessionEnd`), so the last thing said in a session is never lost. The whole reply is kept: all of Claude's text blocks between two prompts are merged into one exchange, not just the first \"let me look\" block. Context is persisted to SQLite before `/clear` executes, so clearing the window no longer means losing the record of what happened.\n\n### 2. Cross-Session Search\n\nSearch across all sessions in a project with `--all`, or across every project you've worked in with `--global`. Results include session ID, project, timestamp, and a content preview.\n\n```\n/recall search \"auth flow\" --all\n/recall search \"triton kernel\" --global\n```\n\n### 3. Post-Compaction Recovery\n\nWhen a session resumes after compaction (`SessionStart` with `matcher: \"compact\"`), the plugin injects a brief context-recovery note into Claude's context (`additionalContext`): how much of this session and project is indexed, recent topics, the last few exchange previews, and a reminder that `/recall` recovers the detail the summary dropped.\n\n### 4. Auto-Tagging\n\nTechnical terms are extracted automatically from each exchange — function names, file paths, identifiers, command names. These feed into FTS5 search so you can find exchanges without remembering the exact wording.\n\n### 5. Manual Tagging\n\nApply your own tags to sessions or individual exchanges for cross-project discovery:\n\n```\n/recall tag auth-refactor\n/recall tag metal-backend #42\n```\n\nTags are queryable across all sessions and projects.\n\n### 6. Cross-Session Context Sharing\n\nShare findings between parallel sessions working on related problems. Highlights are lightweight tag-pointers, not full context — checks are token-efficient. Full context is pulled on demand via `/recall search`.\n\n**Two highlight creation paths:**\n\n- **Explicit** (default): Claude proactively runs `/recall highlight \"summary\"` when it produces a finding worth sharing — a bug fix, performance technique, architectural insight, or config that solved a problem.\n- **Auto-detect** (opt-in): Enable with `/recall config auto_highlight true`. The hook scans assistant responses for solution signals (e.g., \"the fix is\", \"the solution\", \"resolved by\"). If 2+ signals appear in one exchange and the response is 25+ words, a highlight is created automatically with `source='auto'`.\n\n**Check frequency:**\n\nBy default, connections are `check_mode=explicit` — highlights only appear when you run `/recall inbox`. Enable decay polling with `/recall config check_mode decay`: starts checking every 7th prompt, grows by 3 each time, caps at every 30th prompt.\n\n**Delivery modes:**\n\n- `silent` (default): highlights queue silently, view with `/recall inbox`\n- `inject`: highlights are injected as system messages automatically\n\n**Natural language support:** Claude translates \"watch session abc123 for kernel work\" into `/recall connect abc123 \"kernel work\"` automatically.\n\n```\n/recall connect abc123 \"CUDA reduction kernels\"\n/recall connect --latest \"Blackwell dispatch work\"\n/recall inbox\n```\n\n### 7. Recall Assistant Skill (Opt-In)\n\nAn optional skill that teaches Claude to proactively use the recall plugin. Enable with `/recall config skill_enabled true`.\n\nWhen enabled, Claude will:\n- **Detect context loss** — explicit phrases (\"didn't we already...\", \"remind me what...\") are caught *deterministically by the `UserPromptSubmit` hook*, which injects a `[Recall]` suggestion (so it no longer depends on the model noticing); behavioral signals (contradicting itself) and temporal signals (post-compaction) stay model-driven\n- **Suggest highlighting** — when Claude produces a transferable finding, it suggests `/recall highlight` (or auto-runs it if `auto_run_highlight` is enabled)\n- **Translate natural language** — \"keep an eye on session abc123\" becomes `/recall connect abc123 \"...\"`\n- **Suggest inbox checks** — when working on topics that overlap with connected sessions\n\nThe skill is fully opt-in and respects all existing opt-in gates. It never auto-runs connect, disconnect, or inbox commands.\n\n### 8. Concurrent Session Safety\n\nMultiple Claude sessions in the same project write to the same database without conflicts (SQLite WAL mode allows concurrent reads and serializes writes). Each session also resolves *its own* identity from the native, per-session `CLAUDE_CODE_SESSION_ID` that Claude Code injects into every command — so `/recall` always returns the current session's history, never a concurrent session's, even with several sessions open at once.\n\n### 9. SQLite Storage\n\nAll context is stored in a single SQLite database (`recall.db`) with FTS5 for full-text search. No JSON files, no external dependencies beyond Python's built-in `sqlite3` module.\n\n### 10. Timestamped Conversation Index\n\nEvery exchange is indexed with its timestamp:\n\n```\nSession started: Jan 5, 2026 at 9:00 AM (Jan 5 - Jan 7)\nTotal exchanges: 117\n\nShowing page 1 of 6 (most recent first):\n\nJan 7:\n#117 [5:13 pm] \"root@dendritic-distillation:~/dendritic# ls...\"\n#116 [2:49 pm] \"Yes, give me the command to kick that off\"\n\nJan 6:\n#115 [1:33 pm] \"It looks like the experiment is complete...\"\n```\n\n### 11. Full-Content Search\n\nSearch looks in user prompts, assistant responses and the tool calls of each exchange. Multi-word queries use AND logic — both terms must appear anywhere in the exchange. Force exact phrase matching by quoting: `search \"the fix is\"`. Terms are stemmed (`kernel` matches `kernels`). Results are **ranked**: BM25 relevance re-weighted by recency (a hit 30 days old keeps half its weight; `--half-life 0` for pure relevance), best match first, and every hit shows the passage that matched:\n\n```\n### Exchange #162 [Sep 5 6:41 pm]\n\n> Match: $ cd ~/Documents/claude-recall-plugin «gh» «pr» ready 2 …\n```\n\n```\n/recall search dimension\n/recall search \"auth flow\"\n```\n\nResults show up to 10 most recent matches, grouped by date.\n\n### 12. Observability Logging\n\nEvery `/recall` invocation is logged:\n\n```\n~/.claude/recall-events.log\n```\n\nLog format:\n```\n2026-01-05T16:45:00+00:00 | session=abc123 | exchanges=72 | CONTEXT_RECALL_TRIGGERED\n```\n\n### 13. Tool-Call Capture\n\nEvery tool call Claude makes in a turn is stored as one compact line — `$ ssh root@ssh.runpod.io -p 22222`, `Edit /p/kernel.py`, `Grep BLOCK_S in /p`, `WebFetch https://…` — under the exchange's **Tools run**, and it is searchable. Tool *output* is never stored, so the store stays small (a 20 MB transcript indexes to well under 1 MB of tool lines).\n\n### 14. Secrets Redaction\n\nCredential-looking strings are replaced with `[REDACTED:<kind>]` before storage: well-known token formats, `KEY=value` assignments with secret-like names, and phrasings like \"my password is …\". Pattern-based, not a guarantee — see [PRIVACY.md](PRIVACY.md).\n\n### 15. Claude Invokes Recall on Its Own\n\n`/recall:recall` is a skill whose description carries trigger phrases (\"didn't we already\", \"what was that command\", \"earlier you said\", \"last time\", …). When the user refers to earlier work, Claude invokes it without being asked, runs the most specific search directly (no menu), and quotes what it recovered. The separate, opt-in `recall-assistant` skill adds behavioural/temporal detection and cross-session suggestions.\n\n### 16. Pagination\n\nLong sessions are paginated (20 exchanges per page):\n\n```\nShowing page 1 of 6 (most recent first)\n\nNavigation:\n- Show newer: page 1\n- Show older: page 2\n```\n\n---\n\n## Usage Examples\n\n### Claude lost context mid-task\n\n```\n/recall last5\n```\n\n### Find a specific discussion from earlier\n\n```\n/recall search \"API endpoint\"\n```\n\n### Find something across all sessions in this project\n\n```\n/recall search \"gradient checkpointing\" --all\n```\n\n### Find a concept you worked on in a different project\n\n```\n/recall search \"WAL mode\" --global\n```\n\n### Return to work from yesterday afternoon\n\n```\n/recall around \"yesterday 3pm\"\n```\n\n### Tag a session for later reference\n\n```\n/recall tag metal-backend\n```\n\n### Browse a past session\n\n```\n/recall sessions\n/recall session abc123 last10\n```\n\n### Clean up old sessions\n\n```\n/recall prune --before 2026-01-01\n```\n\n### Share a finding with a parallel session\n\n```\n/recall highlight \"threadgroup size 512 optimal for Blackwell dispatch\"\n```\n\n### Watch another session for highlights\n\n```\n/recall connect abc123 \"CUDA reduction kernel work\"\n# or connect to the most recent active session in this project:\n/recall connect --latest \"Metal backend optimizations\"\n```\n\n### Check for new highlights from connected sessions\n\n```\n/recall inbox\n```\n\n---\n\n## How It Works\n\n### Hooks\n\nFive hook registrations:\n\n- **SessionStart** — Exports the session's env vars (a legacy fallback for resolving the current session/project; the native `CLAUDE_CODE_SESSION_ID` is preferred).\n- **SessionStart (`matcher: \"compact\"`)** — After a compaction, injects a context-recovery note into Claude's context (`additionalContext`) so it re-anchors on the session state.\n- **UserPromptSubmit** — Indexes any completed turns not yet captured, runs connection checks (decay mode), auto-highlight detection, and the deterministic proactive-recall suggestion (all if enabled). Anything Claude must act on is returned as `additionalContext`; `systemMessage` is reserved for user-facing notices.\n- **Stop** — Indexes the turn that just completed. The transcript can lag the in-memory turn; whatever is on disk is stored now and any assistant blocks that land later are appended to the same exchange (FTS kept in sync), so nothing is orphaned.\n- **SessionEnd** — Drains the remaining backlog in committed passes (7s budget), then finalizes the session record.\n\n### Storage\n\nSQLite with FTS5 for full-text search and WAL mode for concurrent session safety. All data lives in a single file — no external services, no dependencies beyond Python's standard library.\n\n### Tagging\n\nA hybrid approach: auto-tags are extracted from exchange content at index time; manual tags are applied via `/recall tag`. Both are searchable via FTS5.\n\n### Cross-Session Sharing\n\nHighlights are created via two paths: explicit (Claude runs `/recall highlight`) or auto-detection (heuristic scan of assistant responses, opt-in). Connections are opt-in links between sessions stored in the `connections` table. The `UserPromptSubmit` hook checks connections on each prompt when `check_mode=decay` is set. Delivery is either silent (queue for `/recall inbox`) or injected as a system message.\n\n---\n\n## Data Storage\n\n```\n~/.claude/context-recall/recall.db     Single SQLite database (WAL mode, FTS5)\n~/.claude/recall-events.log            Recall event log (unchanged from v1)\n```\n\nThe database contains six tables:\n- `sessions` — one row per session, with project, timestamps, and metadata (including per-session config like `auto_highlight`)\n- `exchanges` — one row per exchange: user text, merged assistant text, and `tool_text` (one line per tool call)\n- `tags` — session and exchange-level tags\n- `highlights` — findings flagged for sharing, linked to a session and exchange; `source` field distinguishes explicit vs auto-detected\n- `connections` — opt-in links between sessions; stores `check_mode`, `check_interval`, `delivery_mode`, and `last_checked_at`\n- `invocations` (v2.2.3+) — one row per recall command invocation (timestamp, session, project hash, command, args); powers `/recall usage`\n\nAn FTS5 virtual table (porter stemming, schema v5) indexes prompts, replies, previews and tool calls; searches rank by BM25 × recency and return match snippets.\n\n---\n\n## Analyzing Recall Patterns\n\n```bash\n# View recent recall events\ntail -20 ~/.claude/recall-events.log\n\n# Count recalls per day\ncut -dT -f1 ~/.claude/recall-events.log | uniq -c\n\n# Find sessions with frequent recalls (portable: BSD/macOS sed too)\nsed -n 's/.*session=\\([^ ]*\\).*/\\1/p' ~/.claude/recall-events.log | sort | uniq -c | sort -rn\n\n# Count total recalls\nwc -l ~/.claude/recall-events.log\n```\n\n---\n\n## Plugin Structure\n\n```\nclaude-recall-plugin/\n├── .claude-plugin/\n│   └── plugin.json                  # Plugin metadata (v2.4.0)\n├── skills/\n│   ├── recall/\n│   │   └── SKILL.md                 # The /recall:recall skill (Claude can invoke it on its own)\n│   └── recall-assistant/\n│       └── SKILL.md                 # Opt-in proactive assistant skill\n├── hooks/\n│   ├── hooks.json                   # Hook config (SessionStart, SessionStart:compact, UserPromptSubmit, Stop, SessionEnd)\n│   ├── session_start.py             # Exports session env vars (legacy fallback)\n│   ├── prompt_submit.py             # Incremental indexer (shared; continuation-append) + auto-tagging + proactive recall\n│   ├── stop.py                      # Per-turn capture (Stop)\n│   ├── post_compact.py              # Post-compaction recovery note (SessionStart: compact)\n│   └── session_end.py               # Final catch-up index + session finalization\n├── scripts/\n│   ├── db.py                        # SQLite layer (FTS5, WAL, all CRUD)\n│   ├── utils.py                     # Shared utilities: session/project resolution, redaction, tool-call extraction, time parsing\n│   ├── auto_tagger.py               # TF-based keyword extraction\n│   ├── highlight.py                 # Highlight creation (explicit + auto-detect)\n│   ├── manage_connections.py        # Connect, disconnect, inbox, config\n│   ├── manage_tags.py               # Tag CRUD, search by tag\n│   ├── manage_sessions.py           # Session list, prune, export, stats\n│   ├── fetch_exchanges.py           # Fetch exchanges by query\n│   └── show_index.py                # Paginated index display\n├── tests/                          # 459 tests: unit + integration + skill evals + external-review regressions\n│                                    #   + stress (scale/concurrent/clear/sharing)\n│                                    #   run with `python3 -m pytest -q` (see pytest.ini)\n├── pytest.ini                      # Collects test_*.py AND stress_test_*.py\n├── docs/\n│   └── superpowers/\n│       ├── specs/                   # Design specifications\n│       └── plans/                   # Implementation plans\n├── README.md\n├── CHANGELOG.md\n├── PRIVACY.md\n├── LICENSE\n└── .gitignore\n```\n\n---\n\n## Running Tests\n\n```bash\ncd claude-recall-plugin\n\n# Full suite — unit, integration, and stress (459 tests)\n# pytest.ini collects both test_*.py and stress_test_*.py\npython3 -m pytest -q\n```\n\n---\n\n## Contributing\n\n1. Fork the repository\n2. Make your changes\n3. Run tests: `python3 -m pytest tests/ -v`\n4. Submit a pull request\n\n---\n\n## Privacy and Data Handling\n\nAll data is stored **locally on your machine** in `~/.claude/context-recall/`. The plugin makes no network requests, includes no telemetry, and shares no data with any external service.\n\nFor full details on what data is stored, how to delete it, and your control options, see [PRIVACY.md](PRIVACY.md).\n\n---\n\n## Security\n\n### Reporting Vulnerabilities\n\nTo report a security vulnerability, please open an issue at [github.com/bledden/claude-recall-plugin/issues](https://github.com/bledden/claude-recall-plugin/issues) or contact the author directly via GitHub.\n\n### Security Practices\n\n- All SQL queries use parameterized statements\n- No dynamic code execution of any kind\n- No external network requests or downloads\n- Error messages do not leak file paths or internal state\n- Transcript reads are bounded (2MB / 1000 messages per hook invocation; progress banks across prompts so large transcripts converge) and a turn is only committed once it is complete\n- Stored text is capped: 1,000 chars per user prompt, 4,000 chars per assistant reply, 2,000 chars of tool-call lines; tool output and thinking are never stored\n- Credential-looking strings are redacted before storage (see PRIVACY.md)\n- Hook commands quote the interpreter and script path (plugin roots with spaces work)\n- Database directory created with restricted permissions (0o700)\n- Hook stdin reads bounded to 1MB\n\n---\n\n## Known Limitations\n\n- **Claude Cowork requires zip upload** — Cowork does not yet support marketplace installation; upload the plugin zip file manually via the Plugins sidebar\n- **VSCode extension requires marketplace** — Due to a [breaking change in 2.1.x](https://github.com/anthropics/claude-code/issues/17089), the VSCode extension requires the marketplace installation method\n- **No semantic/embedding search** — Search is keyword-based via SQLite FTS5; embedding/vector search is not supported yet\n- **Cross-session sharing is polling-based** — No real-time push; highlights appear on the next check interval or via `/recall inbox`\n\n---\n\n## Troubleshooting\n\n**`Unknown skill: recall:recall` (often on Linux)** — this means the plugin's command didn't load, not that anything in the plugin is broken. It's the [2.1.x local-plugin breaking change](https://github.com/anthropics/claude-code/issues/17089): non-marketplace installs (a `--plugin-dir` flag or shell alias) no longer persist. Fix: install from a **marketplace** (see [Installation](#installation)), then `/reload-plugins` (or restart). The recall *scripts* still work regardless of the wrapper, which is why the plugin can also be driven conversationally (\"use `/recall` to catch up\") even when the `/recall:recall` command is missing.\n\n**Hooks don't seem to fire on Linux** — if your environment ships `python` but not `python3` on `PATH`, upgrade to **v2.2.2+** (hooks now probe for `python3` and fall back to `python`).\n\n**`/recall` shows an old or partial session** — on very large, actively-growing transcripts the indexer catches up incrementally over several turns (2 MB per hook run) and always makes progress, even on a single multi-MB record; `SessionEnd` drains whatever is left. **v2.3+** captures each turn as it completes via the `Stop` hook, so the most recent exchange is normally already there. `/recall usage` reports your invocation history.\n\n---\n\n## Uninstalling\n\n**If installed via marketplace:**\n```bash\nclaude plugin uninstall recall@recall-local\nclaude plugin marketplace remove recall-local\n```\n\n**If using shell alias:**\nRemove the alias line from your `~/.zshrc` or `~/.bashrc`, then run `source ~/.zshrc` or `source ~/.bashrc`.\n\n**Removing stored data:**\n```bash\nrm -rf ~/.claude/context-recall/\n```\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full version history.\n\n---\n\n## License\n\nMIT License - see LICENSE file for details.\n",
  "bytes": 28938,
  "sha": "008c20a4208aac8ff215ee2a9eeba5af13459d966bb27ddd76ccc54151cc1175",
  "repo_slug": "bledden/claude-recall-plugin",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_bledden_claude_recall_plugin_recall_a70cd855/readme"
}