{"id":47683113,"url":"https://github.com/lopadova/claude-mem-sync","last_synced_at":"2026-04-02T14:10:39.970Z","repository":{"id":346378857,"uuid":"1185210679","full_name":"lopadova/claude-mem-sync","owner":"lopadova","description":"Team memory sharing for claude-mem — sync AI memories across developers, with Claude Code plugin, github action and knowledge distillation","archived":false,"fork":false,"pushed_at":"2026-03-24T12:38:12.000Z","size":1609,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-24T12:56:04.999Z","etag":null,"topics":["ai","ai-agents","ai-memory","ant","artificial-intelligence","chroma","claude","claude-agents","claude-code","claude-code-plugin","claude-hook","claude-plugin","long-term-memory","memory-engine","rag","supermemory"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lopadova.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-18T10:54:26.000Z","updated_at":"2026-03-24T12:38:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lopadova/claude-mem-sync","commit_stats":null,"previous_names":["lopadova/claude-mem-sync"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/lopadova/claude-mem-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopadova%2Fclaude-mem-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopadova%2Fclaude-mem-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopadova%2Fclaude-mem-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopadova%2Fclaude-mem-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lopadova","download_url":"https://codeload.github.com/lopadova/claude-mem-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopadova%2Fclaude-mem-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31307587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agents","ai-memory","ant","artificial-intelligence","chroma","claude","claude-agents","claude-code","claude-code-plugin","claude-hook","claude-plugin","long-term-memory","memory-engine","rag","supermemory"],"created_at":"2026-04-02T14:10:39.261Z","updated_at":"2026-04-02T14:10:39.956Z","avatar_url":"https://github.com/lopadova.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# claude-mem-sync\n\n\u003e Team memory sharing for [claude-mem](https://docs.claude-mem.ai) — sync AI memories across developers via git.\n\n![github-banner-team-memory.png](resources/github-banner-team-memory.png)\n\n![overview.png](resources/overview.png)\n---\n\n## Table of Contents\n\n- [Why This Exists](#why-this-exists)\n- [What It Does](#what-it-does)\n- [Step-by-Step Setup Guide](#step-by-step-setup-guide)\n  - [Step 1: Install Prerequisites](#step-1-install-prerequisites)\n  - [Step 2: Install the Claude Code Plugin](#step-2-install-the-claude-code-plugin)\n  - [Step 3: Run the Setup Wizard](#step-3-run-the-setup-wizard)\n  - [Step 4: Create the Shared Team Repository](#step-4-create-the-shared-team-repository)\n  - [Step 5: Set Up GitHub Actions (CI/CD)](#step-5-set-up-github-actions-cicd)\n  - [Step 6: Your First Export](#step-6-your-first-export)\n  - [Step 7: Import Team Memories](#step-7-import-team-memories)\n  - [Step 8: Enable Developer Profiles](#step-8-enable-developer-profiles)\n  - [Step 9: Enable Knowledge Distillation (optional)](#step-9-enable-knowledge-distillation-optional)\n  - [Step 10: Launch the Dashboard](#step-10-launch-the-dashboard)\n  - [Step 11: Set Up Automatic Scheduling (optional)](#step-11-set-up-automatic-scheduling-optional)\n- [Configuration Reference](#configuration-reference)\n- [CLI Reference](#cli-reference)\n- [Web Dashboard](#web-dashboard)\n- [Developer Knowledge Profiles](#developer-knowledge-profiles)\n- [Knowledge Distillation](#knowledge-distillation)\n- [Eviction \u0026 Scoring](#eviction--scoring)\n- [Destination Patterns](#destination-patterns)\n- [Maintenance](#maintenance)\n- [Security \u0026 Privacy](#security--privacy)\n- [Architecture](#architecture)\n- [Publishing a Release (maintainers)](#publishing-a-release-maintainers)\n- [Troubleshooting](#troubleshooting)\n- [License](#license)\n\n---\n\n## Why This Exists\n\n**claude-mem** gives Claude persistent memory across sessions, storing observations (decisions, bugfixes, discoveries) in a local SQLite database. But it's designed for **single-user, per-machine** usage.\n\nWhen a team works on the same project:\n\n- Each developer has their own isolated memory database\n- Developer A discovers a critical pattern — developers B through L never learn about it\n- The same bugs get rediscovered, the same decisions re-debated\n- There is no native team mode, no shared database, no automatic sync\n\n**claude-mem-sync** bridges this gap with filtered, scored, deduplicated team memory sharing using git as the transport layer.\n\n## What It Does\n\n```\nDeveloper A                    GitHub (shared repo)              Developer B\n┌──────────┐    export         ┌──────────────────┐    import   ┌──────────┐\n│ claude-   │ ──────────────►  │ contributions/   │  ◄───────── │ claude-  │\n│ mem.db    │    (filtered)    │   dev-A/         │  (merged)   │ mem.db   │\n│           │                  │   dev-B/         │             │          │\n│           │    import        │                  │   export    │          │\n│           │ ◄──────────────  │ merged/          │ ──────────► │          │\n│           │    (deduped)     │   latest.json    │  (filtered) │          │\n└──────────┘                   └──────────────────┘             └──────────┘\n                                    ▲\n                               GitHub Action\n                               (merge + dedup + cap)\n                                    │\n                          ┌─────────┴──────────┐\n                          ▼                    ▼\n                    ┌────────────┐      ┌────────────┐\n                    │  profiles/ │      │ distilled/ │\n                    │  per-dev   │      │ rules.md   │\n                    │  metrics   │      │ kb.md      │\n                    └────────────┘      └────────────┘\n                    (deterministic)     (LLM-powered)\n```\n\n**Features:**\n\n- **Filtered export** — only share what matters (by type, keyword, or tag)\n- **Intelligent eviction** — scoring system prevents unbounded DB growth\n- **Deduplication** — composite key dedup across developers\n- **Access tracking** — PostToolUse hook tracks which memories Claude actually uses\n- **Cross-platform scheduling** — automatic export/import via cron, launchd, or Task Scheduler\n- **PR review mode** — optional human review before memories enter the shared repo\n- **Multi-provider support** — GitHub, GitLab, and Bitbucket (including self-hosted)\n- **CI merge bot** — templates for GitHub Actions, GitLab CI, and Bitbucket Pipelines\n- **Web dashboard** — 9-tab dark-theme UI with charts, heatmaps, profiles, and analytics\n- **Rich analytics** — type distribution, access patterns, developer contributions, observation scoring\n- **Developer knowledge profiles** — per-dev metrics: knowledge spectrum, concept map, file coverage, temporal patterns, survival rate\n- **Knowledge distillation** — LLM-powered extraction of CLAUDE.md rules and knowledge docs from team observations\n- **Team insights** — knowledge gaps detection, concept coverage heatmaps, bus-factor risk analysis\n- **Configurable cleanup** — automatic retention policy for old contribution files\n\n---\n\n## Step-by-Step Setup Guide\n\nThis guide walks you through the **complete setup** of claude-mem-sync, from zero to a fully working team memory sharing pipeline. Follow each step in order.\n\n### Step 1: Install Prerequisites\n\nBefore you start, make sure you have these tools installed on your machine.\n\n#### 1.1 — Install Bun (recommended)\n\nYou need **one** of these runtimes. Bun is recommended because it's faster and has built-in SQLite.\n\n**Option A: Install Bun** (recommended)\n\n```bash\n# macOS / Linux\ncurl -fsSL https://bun.sh/install | bash\n\n# Windows (PowerShell)\npowershell -c \"irm bun.sh/install.ps1 | iex\"\n\n# Verify it works\nbun --version   # Should print 1.x.x or higher\n```\n\n#### 1.2 — Install Git\n\n```bash\n# macOS (Homebrew)\nbrew install git\n\n# Ubuntu/Debian\nsudo apt install git\n\n# Windows — download from https://git-scm.com/\n\n# Verify it works\ngit --version\n```\n\n#### 1.3 — Install GitHub CLI (required for PR mode and repo creation)\n\n```bash\n# macOS (Homebrew)\nbrew install gh\n\n# Ubuntu/Debian\nsudo apt install gh\n\n# Windows (winget)\nwinget install GitHub.cli\n\n# Log in to GitHub\ngh auth login\n\n# Verify it works\ngh --version\n```\n\n#### 1.4 — Install claude-mem\n\nclaude-mem-sync reads from claude-mem's database. You need claude-mem installed and already generating observations.\n\nFollow the [claude-mem installation guide](https://docs.claude-mem.ai) to set it up.\n\nAfter installation, verify you have a database file at:\n- **Default location**: `~/.claude-mem/claude-mem.db`\n\n```bash\n# Check the file exists\nls -la ~/.claude-mem/claude-mem.db\n```\n\n\u003e **Don't have observations yet?** Use Claude Code for a few sessions first. claude-mem automatically records decisions, bugfixes, and discoveries as you work.\n\n---\n\n### Step 2: Install the Claude Code Plugin\n\nThis single step installs both the **plugin** (PostToolUse hook for access tracking) and the **CLI tool** (`mem-sync` command) automatically.\n\n```bash\n# Add the claude-mem-sync marketplace\nclaude plugin marketplace add lopadova/claude-mem-sync\n\n# Install the plugin (this also installs the mem-sync CLI globally)\nclaude plugin install claude-mem-sync@claude-mem-sync\n```\n\nThe setup hook will automatically:\n1. Build the project (if needed)\n2. Install the `mem-sync` CLI globally via `npm link`\n3. Skip installation if `mem-sync` is already available\n\n\u003e **Note:** The setup hook runs via `node` (see `hooks.json`), so you must have **Node.js ≥ 18** installed and on your `PATH`, even if you primarily use Bun. Without Node ≥ 18, the automatic CLI installation will fail.\nVerify everything is working:\n\n```bash\n# Check the plugin is active\nclaude plugin list\n# You should see claude-mem-sync@claude-mem-sync with status: ✔ enabled\n\n# Check the CLI is available\nmem-sync --help\n```\n\n\u003e **Local development**: If you cloned the repo locally, you can add it as a local marketplace instead:\n\u003e ```bash\n\u003e claude plugin marketplace add /path/to/claude-mem-sync\n\u003e claude plugin install claude-mem-sync@claude-mem-sync\n\u003e ```\n\n\u003e **Already installed the CLI manually?** No problem — the setup hook detects existing installations and skips automatically.\n\n\u003e **What does the hook do?** Every time Claude reads a memory (via the `mcp__plugin_claude-mem_mcp-search__*` tools), the hook records which observations were accessed. This data is used to compute more accurate eviction scores — memories that are actually used by Claude get higher scores and survive longer.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eManual CLI installation (alternative)\u003c/strong\u003e\u003c/summary\u003e\n\nIf the automatic setup doesn't work, you can install the CLI manually:\n\n```bash\n# Option A: Install from GitHub (Bun)\nbun add -g @lopadova/claude-mem-sync\n\n# Option B: Install from GitHub (npm — requires GitHub Packages auth)\n# 1. Create a PAT at github.com/settings/tokens with read:packages scope\n# 2. Configure registry:\necho \"@lopadova:registry=https://npm.pkg.github.com\" \u003e\u003e ~/.npmrc\necho \"//npm.pkg.github.com/:_authToken=YOUR_TOKEN\" \u003e\u003e ~/.npmrc\n# 3. Install:\nnpm install -g @lopadova/claude-mem-sync\n```\n\n\u003c/details\u003e\n\n---\n\n### Step 3: Run the Setup Wizard\n\nThe interactive wizard creates your configuration file at `~/.claude-mem-sync/config.json`.\n\n```bash\nmem-sync init\n```\n\nThe wizard will ask you:\n\n1. **Your developer name** — a unique identifier (e.g., `alice`, `bob`). This appears in contribution file paths and exported JSON.\n\n2. **claude-mem database path** — press Enter to accept the default (`~/.claude-mem/claude-mem.db`), or provide a custom path if you installed claude-mem elsewhere.\n\n3. **Project configuration** — for each project you want to sync:\n   - **Project name** — a short identifier (e.g., `my-app`, `backend-api`)\n   - **Remote repo** — the GitHub repo in `owner/name` format (e.g., `my-org/dev-memories`)\n   - **Auto-merge** — `yes` to push directly, `no` to create Pull Requests for review\n   - **Export filters** — which observation types/keywords/tags to export\n\nHere's what a typical config looks like after the wizard:\n\n```json\n{\n  \"global\": {\n    \"devName\": \"alice\",\n    \"claudeMemDbPath\": \"~/.claude-mem/claude-mem.db\",\n    \"evictionStrategy\": \"passive\",\n    \"evictionKeepTagged\": [\"#keep\"],\n    \"mergeCapPerProject\": 500,\n    \"exportSchedule\": \"friday:16:00\",\n    \"logLevel\": \"info\",\n    \"profiles\": { \"enabled\": false, \"anonymizeOthers\": true },\n    \"distillation\": { \"enabled\": false, \"allowExternalApi\": false }\n  },\n  \"projects\": {\n    \"my-app\": {\n      \"enabled\": true,\n      \"remote\": {\n        \"type\": \"github\",\n        \"repo\": \"my-org/dev-memories\",\n        \"branch\": \"main\",\n        \"autoMerge\": true\n      },\n      \"export\": {\n        \"types\": [\"decision\", \"bugfix\", \"feature\", \"discovery\"],\n        \"keywords\": [\"architecture\", \"breaking\"],\n        \"tags\": [\"#shared\"]\n      }\n    }\n  }\n}\n```\n\n\u003e **Tip**: You can edit `~/.claude-mem-sync/config.json` manually at any time to change settings.\n\n---\n\n### Step 4: Create the Shared Team Repository\n\nYou need a **private repository** where all team members push their memory exports.\n\n#### Recommended: Use `setup-repo`\n\n```bash\nmem-sync setup-repo my-team-memories\n```\n\nThis interactive wizard will:\n- Create the directory structure (`contributions/`, `merged/`, `profiles/`, `distilled/`)\n- Copy CI workflow templates for your provider (GitHub Actions, GitLab CI, or Bitbucket Pipelines)\n- Configure the LLM provider for distillation (GitHub Copilot or Anthropic)\n- Optionally create the GitHub repo via `gh repo create`\n- Generate a README and `.gitignore`\n- Make the initial commit\n\n#### Manual alternative\n\nIf you prefer to set things up manually:\n\n```bash\n# Create a new private repo\ngh repo create my-org/dev-memories --private --description \"Shared AI memories\"\ngh repo clone my-org/dev-memories\ncd dev-memories\n\n# Create directories (works on all platforms — Windows, macOS, Linux)\nnode -e \"['contributions','merged','profiles','distilled'].forEach(d=\u003e{require('fs').mkdirSync(d,{recursive:true});require('fs').writeFileSync(d+'/.gitkeep','')})\"\n```\n\n\u003e **Important**: This repo should be **private**. Observations can contain code snippets, internal URLs, and technical decisions you don't want public.\n\n---\n\n### Step 5: Set Up GitHub Actions (CI/CD)\n\n\u003e **If you used `mem-sync setup-repo` in Step 4, workflows are already in place — skip to Step 6.**\n\nGitHub Actions will automatically merge contribution files when developers push exports.\n\n#### 5.1 — Add the Merge Workflow\n\nThis workflow triggers every time a developer pushes a contribution file. It merges all contributions, deduplicates, applies eviction caps, and generates developer profiles.\n\n```bash\n# Make sure you're in the shared repo directory\ncd dev-memories\n\n# Create the workflows directory\nnode -e \"require('fs').mkdirSync('.github/workflows',{recursive:true})\"\n\n# Download the merge workflow\ncurl -sL https://raw.githubusercontent.com/lopadova/claude-mem-sync/main/templates/github-action/merge-memories.yml -o .github/workflows/merge-memories.yml\n\n# Download the gitignore\ncurl -sL https://raw.githubusercontent.com/lopadova/claude-mem-sync/main/templates/.gitignore.example -o .gitignore\n```\n\nThe merge workflow will:\n1. Detect new files in `contributions/`\n2. Run `mem-sync ci-merge` to merge + dedup + cap at 500 observations\n3. Generate developer profiles in `profiles/`\n4. Commit and push the merged result\n\n#### 5.2 — Add the Distillation Workflow (optional)\n\nIf you want LLM-powered knowledge distillation (extracting rules and knowledge docs from merged observations), add the distillation workflow:\n\n```bash\ncurl -sL https://raw.githubusercontent.com/lopadova/claude-mem-sync/main/templates/github-action/distill-knowledge.yml -o .github/workflows/distill-knowledge.yml\n```\n\n**Choose your LLM provider:**\n\n| Provider | Secret needed | Setup |\n|----------|--------------|-------|\n| **GitHub Copilot** (recommended) | `GITHUB_TOKEN` (built-in) | Edit the workflow: replace `ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}` with `GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}` |\n| **Anthropic API** | `ANTHROPIC_API_KEY` | Add the secret to your repo: `gh secret set ANTHROPIC_API_KEY --repo my-org/dev-memories` |\n\n#### 5.3 — Commit and Push\n\n```bash\ngit add -A\ngit commit -m \"chore: initial setup for team memory sharing\"\ngit push\n```\n\n#### 5.4 — Invite Your Team\n\nAdd team members as collaborators:\n\n```bash\ngh repo edit my-org/dev-memories --add-collaborator teammate-username\n```\n\nEach team member needs to:\n1. Install the plugin: `claude /install-plugin lopadova/claude-mem-sync`\n2. Run `mem-sync init` — using the **same repo** but their **own devName**\n\n---\n\n### Step 6: Your First Export\n\nNow let's export your memories to the shared repo.\n\n#### 6.1 — Preview What Would Be Exported\n\nAlways preview first to make sure your filters are working correctly:\n\n```bash\nmem-sync preview --project my-app\n```\n\nThis shows you:\n- How many observations match your filters\n- The type, date, and title of each matched observation\n- The total export size\n\nIf nothing matches, check your filter config in `~/.claude-mem-sync/config.json`. Make sure `export.types` includes the types you want (e.g., `[\"decision\", \"bugfix\"]`).\n\n#### 6.2 — Export\n\n```bash\nmem-sync export --project my-app\n```\n\nThis will:\n1. Query your local claude-mem database\n2. Filter observations based on your config\n3. Clone the shared repo\n4. Write a JSON file to `contributions/my-app/alice/2026-03-19T18-30-00.json`\n5. Git commit and push\n\n#### 6.3 — Verify on GitHub\n\nGo to `https://github.com/my-org/dev-memories` and check:\n- Your contribution file should appear in `contributions/my-app/your-name/`\n- The GitHub Action should trigger automatically\n- After the Action runs, `merged/my-app/latest.json` should be updated\n\n---\n\n### Step 7: Import Team Memories\n\nOnce other team members have exported their memories and the merge bot has processed them, you can import the merged result into your local database.\n\n```bash\n# Import for a specific project\nmem-sync import --project my-app\n\n# Or import all enabled projects at once\nmem-sync import --all\n```\n\nThis will:\n1. Clone the shared repo\n2. Read `merged/my-app/latest.json`\n3. Deduplicate against your existing observations\n4. Insert new observations into your local claude-mem database\n\nAfter importing, Claude will have access to your teammates' discoveries, decisions, and bugfixes during your sessions.\n\n---\n\n### Step 8: Enable Developer Profiles\n\nDeveloper profiles analyze each team member's contributions and compute metrics like knowledge spectrum, concept coverage, and contribution quality. No LLM needed — fully deterministic, zero cost.\n\n#### 8.1 — Enable in Config\n\nOpen `~/.claude-mem-sync/config.json` and set:\n\n```json\n{\n  \"global\": {\n    \"profiles\": {\n      \"enabled\": true,\n      \"anonymizeOthers\": true\n    }\n  }\n}\n```\n\n#### 8.2 — Generate Profiles Locally\n\n```bash\n# Preview what profiles would be generated\nmem-sync profile --project my-app --dry-run\n\n# Generate all profiles\nmem-sync profile --project my-app\n\n# Generate just your profile\nmem-sync profile --project my-app --dev alice\n\n# Also generate markdown (human-readable)\nmem-sync profile --project my-app --format md\n```\n\nThis creates files in `profiles/my-app/`:\n\n```\nprofiles/\n  my-app/\n    alice/\n      profile.json       # Your full profile data\n      profile.md          # Human-readable version\n    bob/\n      profile.json\n    team-overview.json    # Team aggregate stats\n```\n\n#### 8.3 — What's in a Profile\n\nEach profile contains:\n\n- **Knowledge Spectrum** — what types of observations you create (e.g., 40% decisions, 30% bugfixes) vs team average\n- **Concept Map** — which concepts you cover and which ones you haven't touched that the team has (knowledge gaps)\n- **File Coverage** — which directories and files you've worked on, plus a specialization index\n- **Temporal Pattern** — how consistently you contribute (observations per week, consistency score)\n- **Survival Rate** — what percentage of your exported observations survived the merge process (quality proxy)\n\n\u003e **Note**: Profiles are automatically generated in CI after each merge if you followed Step 5. You can also run them locally anytime.\n\n---\n\n### Step 9: Enable Knowledge Distillation (optional)\n\nKnowledge distillation uses Claude (via the Anthropic API) to analyze your team's merged observations and extract:\n- **Rules** — actionable CLAUDE.md-compatible rules with confidence scores\n- **Knowledge Base** — grouped knowledge documentation by concept clusters\n\n\u003e **Cost**: approximately $0.33 per run for 500 observations. See the [cost estimation table](#cost-estimation).\n\n#### 9.1 — Get an Anthropic API Key\n\n1. Go to [console.anthropic.com](https://console.anthropic.com/)\n2. Create an account (or log in)\n3. Go to **API Keys** and create a new key\n4. Copy the key (it starts with `sk-ant-`)\n\n#### 9.2 — Enable in Config\n\nOpen `~/.claude-mem-sync/config.json` and set:\n\n```json\n{\n  \"global\": {\n    \"distillation\": {\n      \"enabled\": true,\n      \"allowExternalApi\": true,\n      \"model\": \"claude-sonnet-4-20250514\",\n      \"minObservations\": 20\n    }\n  }\n}\n```\n\n\u003e **Both `enabled` and `allowExternalApi` must be `true`**. This double opt-in is intentional — it ensures you consciously decide to send observation data to the Anthropic API.\n\n#### 9.3 — Run a Dry Run First\n\n```bash\n# Set your API key (or pass it with --api-key)\nexport ANTHROPIC_API_KEY=sk-ant-your-key-here\n\n# Preview without making an API call\nmem-sync distill --project my-app --dry-run\n```\n\nThis shows you:\n- How many observations would be sent\n- Estimated token count\n- Estimated cost\n\n#### 9.4 — Run Distillation\n\n```bash\nmem-sync distill --project my-app\n```\n\nThis creates files in `distilled/my-app/`:\n\n```\ndistilled/\n  my-app/\n    rules.md                    # CLAUDE.md-compatible rules\n    knowledge-base.md           # Grouped knowledge documentation\n    distillation-report.json    # Run metadata (tokens, cost, stats)\n    feedback.json               # Rule accept/reject tracking\n```\n\n#### 9.5 — Review the Output\n\nOpen `distilled/my-app/rules.md` to see the extracted rules. Each rule has:\n- The rule statement (imperative, actionable)\n- Rationale (why this rule exists)\n- Confidence score (50%–100%)\n- Evidence count and type breakdown\n\n**Rules are suggestions** — they are never auto-merged into your CLAUDE.md. Review them, and copy the ones you agree with into your project's CLAUDE.md manually.\n\n#### 9.6 — Automate in CI (optional)\n\nIf you added the distillation workflow in Step 5.2, it runs automatically after each merge and creates a Pull Request with the distilled output. This PR needs human review before merging.\n\n---\n\n### Step 10: Launch the Dashboard\n\nThe web dashboard gives you a visual overview of everything: observations, profiles, team insights, distilled knowledge, and more.\n\n```bash\nmem-sync dashboard\n```\n\nOpen your browser at **http://localhost:3737**.\n\nThe dashboard has 9 tabs:\n\n| Tab | What you'll see |\n|-----|-----------------|\n| **Overview** | Total observations, sessions, access events, DB size, project health cards |\n| **Observations** | Searchable table of all observations, click any row to see details |\n| **Search** | Full-text search (supports AND, OR, NOT, \"exact phrases\") |\n| **Analytics** | Charts: type distribution, activity timeline, top scored, dev contributions |\n| **Access Map** | GitHub-style heatmap showing when memories are accessed |\n| **Sync History** | Export/import history with charts and tables |\n| **Dev Profiles** | Select a developer to see their knowledge spectrum, concepts, file coverage, activity patterns |\n| **Team Insights** | Team averages, concept coverage chart, knowledge gap detection (bus-factor risks) |\n| **Distilled** | Distilled rules, knowledge base, report stats, API cost tracking |\n\nTo use a custom port:\n\n```bash\nmem-sync dashboard --port 8080\n```\n\n---\n\n### Step 11: Set Up Automatic Scheduling (optional)\n\nInstead of running `mem-sync export` and `mem-sync import` manually, you can schedule them to run automatically.\n\n#### Automatic (all platforms)\n\n```bash\n# Detect your OS and install scheduled tasks\nmem-sync schedule install\n\n# To remove them later\nmem-sync schedule remove\n```\n\n#### Manual: Linux (cron)\n\n```cron\n# Export every Friday at 16:00\n0 16 * * 5 mem-sync export --all \u003e\u003e ~/.claude-mem-sync/logs/export.log 2\u003e\u00261\n\n# Import every Saturday at 09:00\n0 9 * * 6 mem-sync import --all \u003e\u003e ~/.claude-mem-sync/logs/import.log 2\u003e\u00261\n\n# Monthly maintenance (1st of month at 03:00)\n0 3 1 * * mem-sync maintain \u003e\u003e ~/.claude-mem-sync/logs/maintain.log 2\u003e\u00261\n```\n\n#### Manual: macOS (launchd)\n\n`mem-sync schedule install` creates plist files in `~/Library/LaunchAgents/`.\n\n#### Manual: Windows (Task Scheduler)\n\n```powershell\nschtasks /create /tn \"claude-mem-sync-export\" /tr \"mem-sync export --all\" /sc weekly /d FRI /st 16:00 /rl LIMITED /f\nschtasks /create /tn \"claude-mem-sync-import\" /tr \"mem-sync import --all\" /sc weekly /d SAT /st 09:00 /rl LIMITED /f\nschtasks /create /tn \"claude-mem-sync-maintain\" /tr \"mem-sync maintain\" /sc monthly /d 1 /st 03:00 /rl LIMITED /f\n```\n\n---\n\n## Configuration Reference\n\nConfig file location: `~/.claude-mem-sync/config.json`\n\nCreated by `mem-sync init` or manually. See `templates/config.example.json` for a full example.\n\n### Global Settings\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `devName` | string | **required** | Your developer identifier |\n| `evictionStrategy` | `\"hook\"` \\| `\"passive\"` | `\"passive\"` | Default eviction strategy |\n| `evictionKeepTagged` | string[] | `[\"#keep\"]` | Tags that protect observations from eviction |\n| `maintenanceSchedule` | `\"weekly\"` \\| `\"biweekly\"` \\| `\"monthly\"` | `\"monthly\"` | Auto-maintenance frequency |\n| `maintenancePruneOlderThanDays` | number | `90` | Max age for low-value observations |\n| `maintenancePruneScoreThreshold` | number | `0.3` | Score threshold for pruning |\n| `mergeCapPerProject` | number | `500` | Max observations in merged output |\n| `exportSchedule` | string | `\"friday:16:00\"` | Default export schedule |\n| `logLevel` | string | `\"info\"` | Log verbosity |\n| `claudeMemDbPath` | string | `~/.claude-mem/claude-mem.db` | Path to claude-mem's database |\n| `contributionRetentionDays` | number | `30` | Days to keep processed contribution files before auto-cleanup |\n| `profiles.enabled` | boolean | `false` | Enable developer knowledge profile generation |\n| `profiles.anonymizeOthers` | boolean | `true` | Show \"your data vs team average\" — never name other devs |\n| `distillation.enabled` | boolean | `false` | Enable LLM-powered knowledge distillation |\n| `distillation.model` | string | `\"claude-sonnet-4-20250514\"` | Anthropic model for distillation |\n| `distillation.schedule` | `\"after-merge\"` \\| `\"weekly\"` \\| `\"manual\"` | `\"after-merge\"` | When to run distillation |\n| `distillation.excludeTypes` | string[] | `[]` | Observation types to exclude from distillation |\n| `distillation.minObservations` | number | `20` | Minimum observations required to run distillation |\n| `distillation.reviewers` | string[] | `[]` | GitHub usernames to request review on distillation PRs |\n| `distillation.maxTokenBudget` | number | `100000` | Max estimated tokens per API call |\n| `distillation.allowExternalApi` | boolean | `false` | Must be `true` to send data to Anthropic API |\n\n### Per-Project Settings\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `enabled` | boolean | `true` | Whether this project participates in sync |\n| `memProject` | string | key name | Project name in claude-mem's DB |\n| `remote.type` | `\"github\"` \\| `\"gitlab\"` \\| `\"bitbucket\"` | `\"github\"` | Git provider |\n| `remote.repo` | string | **required** | Repo in `owner/name` format |\n| `remote.branch` | string | `\"main\"` | Branch to push/pull |\n| `remote.autoMerge` | boolean | `true` | Push directly or create PR/MR |\n| `remote.host` | string | auto | Custom host for self-hosted instances (e.g., `git.company.com`) |\n| `export.types` | string[] | `[]` | Observation types to export |\n| `export.keywords` | string[] | `[]` | Keywords to match |\n| `export.tags` | string[] | `[]` | Tags to match (e.g., `#shared`) |\n| `export.schedule` | string | inherits global | Per-project schedule override |\n\n### Filter Logic\n\nFilters are combined with **OR**. An observation is exported if it matches **any** criterion:\n\n```\nexported = matchesType(obs, types) OR matchesKeyword(obs, keywords) OR matchesTag(obs, tags)\n```\n\nIf all filter arrays are empty, **nothing is exported** (safe default — you won't accidentally leak data).\n\n### Tag System\n\nclaude-mem has no native tag system. Tags like `#shared` and `#keep` work via free-text search across the `title`, `narrative`, and `text` fields of observations.\n\n- **`#shared`** — mark observations for team export\n- **`#keep`** — protect observations from eviction (score = Infinity)\n\n## CLI Reference\n\n| Command | Description |\n|---------|-------------|\n| `mem-sync init` | Interactive setup wizard |\n| `mem-sync config` | Show current configuration |\n| `mem-sync setup-repo [name]` | Scaffold a shared team memory repository |\n| `mem-sync add-project` | Add a new project to existing config |\n| `mem-sync update-project [--project X]` | Update an existing project's config |\n| `mem-sync export [--project X] [--all] [--dry-run]` | Export filtered memories to git |\n| `mem-sync import [--project X] [--all]` | Import merged memories from git |\n| `mem-sync preview [--project X] [--all]` | Dry-run: show what would be exported |\n| `mem-sync maintain` | Database maintenance (backup, prune, vacuum) |\n| `mem-sync status` | Health check (DB sizes, counts, hook status) |\n| `mem-sync schedule install` | Install OS scheduled tasks |\n| `mem-sync schedule remove` | Remove scheduled tasks |\n| `mem-sync ci-merge` | CI-only: merge contribution files |\n| `mem-sync dashboard [--port N]` | Web dashboard (default: http://localhost:3737) |\n| `mem-sync profile [--dev X] [--project X] [--format md\\|json]` | Generate developer knowledge profiles |\n| `mem-sync distill --project X [--api-key KEY] [--dry-run]` | LLM-powered knowledge distillation |\n\n## Web Dashboard\n\nLaunch a local web dashboard to visualize your team's shared memories, access patterns, profiles, and distilled knowledge.\n\n```bash\nmem-sync dashboard              # http://localhost:3737\nmem-sync dashboard --port 8080  # custom port\n```\n\n### Screenshots\n\n![overview.png](resources/overview.png)\n![analytics.png](resources/analytics.png)\n![observations.png](resources/observations.png)\n![memory-details.png](resources/memory-details.png)\n![search-memories.png](resources/search-memories.png)\n\n### Tabs\n\n| Tab | What it shows |\n|-----|---------------|\n| **Overview** | Stat cards (observations, sessions, access events, DB size), project cards with merge cap progress bars, health indicators |\n| **Observations** | Full-text search, type/project filters, paginated table with eviction scores, click-to-detail modal |\n| **Search** | FTS5 full-text search with `AND`, `OR`, `NOT`, `\"exact phrase\"` syntax, type/project filters, snippet highlighting |\n| **Analytics** | Type distribution (doughnut chart), activity timeline (line chart), top observations by score (horizontal bar), developer contributions (grouped bar) |\n| **Access Map** | GitHub-style heatmap of daily access patterns (6 months), top 20 most accessed observations with bar indicators |\n| **Sync History** | Monthly export/import stacked bar chart, recent exports table, recent imports table |\n| **Dev Profiles** | Developer selector dropdown, knowledge spectrum doughnut chart (your types vs team average), top concepts bar chart (you vs team), monthly activity line chart, file coverage bar chart, KPI cards (total obs, concept coverage %, survival rate %, avg/week) |\n| **Team Insights** | Team KPI cards (devs, avg obs/dev, avg survival rate, avg concept coverage), team type distribution doughnut, concept coverage bar chart (red = knowledge gaps), knowledge gaps table with bus-factor risk indicators |\n| **Distilled** | Distilled rules rendered as markdown, knowledge base content, report KPI cards (rules generated, avg confidence, knowledge sections, API cost + token usage) |\n\n### API Endpoints\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/api/overview` | GET | Overview stats, project list, DB sizes |\n| `/api/observations` | GET | Paginated observations with search/filter |\n| `/api/observations/:id` | GET | Single observation detail |\n| `/api/search` | GET | FTS5 search with pagination |\n| `/api/analytics/types` | GET | Type distribution counts |\n| `/api/analytics/timeline` | GET | Monthly sync timeline |\n| `/api/analytics/scores` | GET | Observation eviction scores |\n| `/api/analytics/devs` | GET | Developer contribution stats |\n| `/api/access/top` | GET | Most accessed observations |\n| `/api/access/heatmap` | GET | Daily access heatmap data |\n| `/api/sync/history` | GET | Export/import history |\n| `/api/profiles/devs` | GET | List of developer names |\n| `/api/profiles/:devName` | GET | Developer profile data |\n| `/api/team/overview` | GET | Team aggregate metrics |\n| `/api/team/concepts` | GET | Team concept coverage + knowledge gaps |\n| `/api/distilled/rules` | GET | Distilled rules markdown |\n| `/api/distilled/kb` | GET | Knowledge base markdown |\n| `/api/distilled/report` | GET | Distillation report + feedback |\n| `/api/distilled/feedback` | POST | Submit rule accept/reject feedback |\n\n### Design\n\n- Dark theme with glassmorphism cards and gradient accents\n- Chart.js 4 for interactive visualizations\n- Inter font, animated counters, hover effects\n- Responsive layout (sidebar collapses on mobile)\n- Zero frameworks — vanilla JS SPA, single HTML file\n- Reads directly from local SQLite databases + contribution/profile/distillation files\n\n## Developer Knowledge Profiles\n\nGenerate per-developer analytics from contribution and merged data — no LLM required, zero API cost, fully deterministic.\n\n### What It Computes\n\nEach developer profile contains 5 metrics:\n\n| Metric | What it measures |\n|--------|-----------------|\n| **Knowledge Spectrum** | Type distribution (decision/bugfix/feature/discovery/refactor/change) with counts, percentages, and comparison against team average |\n| **Concept Map** | Frequency table of concepts extracted from observations, highlighting concepts the dev hasn't covered vs the team (knowledge gaps) |\n| **File Coverage** | Directories and files touched, with a specialization index (1 = concentrated in few dirs, 0 = spread across many) |\n| **Temporal Pattern** | Observations per week/month with average and consistency score (1 = steady, 0 = sporadic) |\n| **Contribution Survival Rate** | Percentage of the dev's exported observations that survived into the merged set — a natural quality proxy |\n\n### Team Overview\n\nWhen profiles are generated for multiple developers, a `team-overview.json` is also produced with:\n\n- Total developers count\n- Average observations per developer\n- Average survival rate across the team\n- Average concept diversity (coverage percentage)\n- Aggregated type distribution\n\n### Team Concepts \u0026 Knowledge Gaps\n\nThe team concepts analysis identifies **knowledge bus-factor risks** — concepts known by only 1 developer. Visible in the dashboard's Team Insights tab and available via the `/api/team/concepts` endpoint.\n\n### Privacy Model\n\n- Profiles are opt-in (`enabled: false` default)\n- No developer rankings or cross-dev comparisons\n- When `anonymizeOthers` is enabled, all comparisons use anonymized team averages\n- A developer controls their own visibility by enabling/disabling export\n\n## Knowledge Distillation\n\nAnalyze merged team observations with an LLM to extract actionable rules and knowledge documentation. Produces CLAUDE.md-compatible rules and grouped knowledge patterns.\n\n### What It Produces\n\n| Artifact | Description |\n|----------|-------------|\n| **`rules.md`** | CLAUDE.md-compatible rules with rationale, confidence scores, source evidence counts, and dev diversity metrics. Grouped by category (architecture, testing, security, performance, conventions, workflow, data, dependencies). |\n| **`knowledge-base.md`** | Knowledge documentation grouped by concept clusters. Each section includes patterns, anti-patterns, and descriptions synthesized from observations. |\n| **`distillation-report.json`** | Machine-readable metadata: input stats, rules/sections generated, confidence distribution, token usage, estimated cost, model used, date range. |\n| **`feedback.json`** | Rule feedback tracking: proposed/accepted/rejected/modified status per rule. Used by the dashboard for interactive rule review. |\n\n### How It Works\n\n1. Loads merged observations from `merged/{project}/latest.json`\n2. Filters out excluded types (configurable via `distillation.excludeTypes`)\n3. Builds a structured prompt with system instructions and observation data\n4. Calls the Anthropic Messages API (Claude Sonnet 4 by default)\n5. Parses the JSON response using Zod schema validation\n6. Writes `rules.md`, `knowledge-base.md`, `distillation-report.json`, and `feedback.json`\n\n### Cost Estimation\n\n| Observations | Input Tokens (est.) | Output Tokens (est.) | Cost per run | Monthly (weekly) |\n|-------------|--------------------|--------------------|-------------|-----------------|\n| 100 | ~10K | ~5K | ~$0.11 | ~$0.44 |\n| 300 | ~30K | ~8K | ~$0.21 | ~$0.84 |\n| 500 | ~50K | ~10K | ~$0.33 | ~$1.32 |\n\nCosts based on Claude Sonnet 4 pricing ($3/MTok input, $15/MTok output).\n\n### Rules Quality\n\nEach distilled rule includes:\n\n- **Confidence score** (0.5–1.0) — based on evidence count and developer diversity\n- **Source count** — number of observations supporting the rule\n- **Source types** — which observation types contributed evidence\n- **Dev diversity** — how many different developers contributed supporting observations\n- **Category** — architecture, testing, security, performance, conventions, workflow, data, or dependencies\n\nRules below 0.5 confidence are not included. Rules are suggestions requiring human review — they are **never auto-merged** into CLAUDE.md.\n\n### Feedback Loop\n\nThe dashboard's Distilled tab provides accept/reject/modify buttons for each rule. Feedback is stored in `distilled/{project}/feedback.json` and can be incorporated into future distillation runs (the next run can exclude rejected rules).\n\n### Privacy Safeguards\n\n- `allowExternalApi: false` by default — must be explicitly enabled\n- Observations are pre-filtered before API calls (optional `excludeTypes`)\n- System prompt instructs the LLM: no specific code snippets, file paths, or developer names in output\n- Provenance cites counts and types only, not attribution\n- Output delivered as PR, never auto-merged\n\n## Eviction \u0026 Scoring\n\n### The Problem\n\nWithout eviction, databases grow unboundedly. A team of 12 developers sharing weekly would accumulate thousands of observations per project within months.\n\n### Hook Mode (recommended)\n\nUses real access data from the PostToolUse hook:\n\n```\nscore = (type_weight * 0.3) + (recency_weight * 0.2) + (access_weight * 0.5)\n```\n\n| Component | Formula | Range |\n|-----------|---------|-------|\n| `type_weight` | Fixed per type (decision=1.0, bugfix=0.9, feature=0.7, discovery=0.5, refactor=0.4, change=0.3) | 0–1 |\n| `recency_weight` | `1 / (1 + ln(1 + days_old / 150))` | 0–1 |\n| `access_weight` | `accesses / max_accesses` (normalized) | 0–1 |\n\n### Passive Mode (fallback)\n\nNo hook required. Uses diffusion across developers as a value proxy:\n\n```\nscore = (type_weight * 0.4) + (recency_weight * 0.3) + (diffusion_weight * 0.3)\n```\n\n`diffusion_weight = devs_who_have_it / total_devs`\n\n### #keep — Protecting Critical Memories\n\nObservations with `#keep` in their title, narrative, or text get `score = Infinity` and are never pruned.\n\n### Configuring Weights\n\n```json\n\"eviction\": {\n  \"strategy\": \"hook\",\n  \"scoring\": {\n    \"typeWeight\": 0.3,\n    \"recencyWeight\": 0.2,\n    \"thirdWeight\": 0.5\n  }\n}\n```\n\nWeights must sum to 1.0.\n\n## Destination Patterns\n\n### Pattern A: Dedicated repo (recommended)\n\nOne repo per team/org for all project memories. Clean separation, one Action to maintain.\n\n### Pattern B: In-project folder\n\nMemories stored in `.shared-memories/` inside each project repo. Simpler but adds JSON to code repos.\n\n### Pattern C: Hybrid\n\nDedicated repo with a pointer file (`.claude-mem-sync.json`) in each project repo.\n\n| | Dedicated repo | In-project | Hybrid |\n|---|---|---|---|\n| **Separation** | Clean | Mixed | Clean |\n| **Setup** | Extra repo | Zero | Extra repo + pointer |\n| **Scalability** | Excellent | Per-project Actions | Excellent |\n| **Best for** | Teams of 3+ | Solo / small teams | Large orgs |\n\n## Maintenance\n\n### What `mem-sync maintain` Does\n\n1. **Backup** — copies DB to `claude-mem.db.backup`\n2. **Pruning** — removes low-score observations older than threshold (respects `#keep`)\n3. **FTS rebuild** — rebuilds all FTS5 indexes\n4. **Optimize** — runs `ANALYZE` and `VACUUM`\n5. **Integrity check** — if it fails, restores from backup\n\n### Emergency: Restoring from Backup\n\n```bash\ncp ~/.claude-mem/claude-mem.db.backup ~/.claude-mem/claude-mem.db\n```\n\n## Security \u0026 Privacy\n\n### What Gets Exported\n\nOnly observations matching your configured filters (types, keywords, tags) are exported. Empty filters = nothing exported.\n\n### Best Practices\n\n- **Always preview first**: `mem-sync preview` before your first export\n- **Use PR review mode**: set `autoMerge: false` for human review\n- **Private repos only**: the shared memories repo should always be private\n- **Review your filters**: observations can contain code with secrets, tokens, or internal URLs\n\n### Developer Profiles Privacy\n\n- **Opt-in**: `profiles.enabled` is `false` by default\n- **No rankings**: profiles show individual metrics vs anonymized team average — never cross-developer comparisons\n- **`anonymizeOthers: true`** (default): comparisons use \"team average\", never naming other developers\n- **Self-controlled**: a developer controls their visibility by enabling/disabling export\n\n### Knowledge Distillation Privacy\n\n- **Double opt-in**: both `distillation.enabled` and `distillation.allowExternalApi` must be explicitly `true`\n- **Type exclusion**: `excludeTypes` keeps sensitive observation types out of API payloads\n- **No code/names in output**: system prompt instructs the LLM to never include code snippets, file paths, or developer names\n- **PR-based delivery**: distilled output is delivered as a pull request — never auto-merged\n- **Provenance by counts**: rules cite \"3 bugfix observations\" not \"from Alice's session\"\n\n## Architecture\n\n- **Runtime** — works on Bun (v1.0+)\n- **SQLite** — `bun:sqlite` on Bun\n- **Export + hook are read-only** on claude-mem's DB\n- **Import is the only write operation** — uses transactions with rollback safety\n- **access.db** is a separate tracking database — never touches claude-mem's schema\n- **`PRAGMA busy_timeout = 5000`** on all connections for WAL contention handling\n- **Multi-provider git** — GitHub, GitLab, Bitbucket with optional self-hosted host override\n- **Array-based process spawning** — all shell commands use `child_process.spawn` with array args (no shell injection)\n- **Profiler** — reads contribution/merged JSON files, computes metrics deterministically (no LLM, no API)\n- **Distiller** — direct `fetch` to Anthropic Messages API (no SDK dependency), Zod-validated structured output\n- **Dashboard** — pure Node.js HTTP server, 19 API endpoints, vanilla JS SPA with Chart.js 4\n\n## Publishing a Release (maintainers)\n\nThis package is published automatically to [GitHub Packages](https://github.com/lopadova/claude-mem-sync/packages) every time a GitHub Release is created. No custom tokens are needed — the workflow uses the built-in `GITHUB_TOKEN`.\n\n### How it works\n\n1. A maintainer bumps the version\n2. The release script commits, tags, pushes, and creates a GitHub Release\n3. The `release-package` workflow triggers automatically\n4. It installs dependencies, runs tests, type-checks, builds, and publishes to GitHub Packages\n5. The package becomes available at `@lopadova/claude-mem-sync`\n\n### Automated release (recommended)\n\nThe `release` script updates the version in all files (`package.json`, `plugin.json`, `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`), commits, tags, pushes, and creates a GitHub Release — all in one step.\n\n```bash\n# Interactive — prompts for major/minor/patch\nbun run release\n\n# Or pass the bump type directly\nbun run release patch   # bug fixes, small tweaks\nbun run release minor   # new features, backward compatible\nbun run release major   # breaking changes\n```\n\n### Manual release\n\nIf you prefer to do it step by step:\n\n```bash\n# 1. Note the current version\ncat package.json | grep '\"version\"'\n\n# 2. Update the version in ALL these files:\n#    - package.json\n#    - plugin.json\n#    - .claude-plugin/plugin.json\n#    - .claude-plugin/marketplace.json (under plugins[0].version)\n\n# 3. Commit\ngit add package.json plugin.json .claude-plugin/plugin.json .claude-plugin/marketplace.json\ngit commit -m \"Bump version from X.X.X to Y.Y.Y\"\n\n# 4. Tag\ngit tag vY.Y.Y\n\n# 5. Push commit and tag\ngit push \u0026\u0026 git push --tags\n\n# 6. Create the GitHub Release (triggers the publish workflow)\ngh release create vY.Y.Y --title \"vY.Y.Y\" --generate-notes\n```\n\nThe workflow runs at `.github/workflows/release-package.yml`.\n\n\n\n### \"Config not found\"\n\nRun `mem-sync init` to create the config file.\n\n### \"CLI is required for PR-based export\"\n\nInstall the CLI for your provider:\n- **GitHub**: [gh](https://cli.github.com/)\n- **GitLab**: [glab](https://gitlab.com/gitlab-org/cli)\n- **Bitbucket**: `curl` (uses REST API)\n\nOr set `autoMerge: true` to use direct push instead of PR/MR mode.\n\n### \"No observations match export filters\"\n\nCheck your filter config. Use `mem-sync preview` to see what matches. All empty filters = nothing exported (safe default).\n\n### Hook not tracking accesses\n\nVerify the plugin is installed: `claude /plugin list`. The hook matches tools prefixed with `mcp__plugin_claude-mem_mcp-search__`.\n\n### \"Distillation disabled\" or \"External API disabled\"\n\nBoth `distillation.enabled` and `distillation.allowExternalApi` must be `true` in your config. This double opt-in is intentional for privacy.\n\n### Profiles show \"No contributions found\"\n\nMake sure the `contributions/` directory exists and contains exported JSON files. Run `mem-sync export` first, or check that the shared repo has been cloned to the current directory.\n\n## License\n\nMIT\n\n---\n\n\u003cp align=\"center\"\u003eMade with \u0026#10084;\u0026#65039; in Florence\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flopadova%2Fclaude-mem-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flopadova%2Fclaude-mem-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flopadova%2Fclaude-mem-sync/lists"}