[
  {
    "owner": "topoteretes",
    "name": "cognee",
    "full_name": "topoteretes/cognee",
    "url": "https://github.com/topoteretes/cognee",
    "description": "Cognee is the open-source AI memory platform for agents. Give your AI agents persistent long-term memory across sessions with a self-hosted knowledge graph engine.",
    "language": "Python",
    "total_stars": 23945,
    "forks": 2252,
    "stars_this_period": 808,
    "source_slice": "all",
    "source_slices": [
      "all",
      "python"
    ],
    "metadata": {
      "topics": [
        "agent-memory",
        "agent-skills",
        "ai",
        "ai-agents",
        "ai-memory",
        "cognitive-architecture",
        "cognitive-memory",
        "context-engineering",
        "contributions-welcome",
        "good-first-issue",
        "good-first-pr",
        "graph-database",
        "graph-rag",
        "help-wanted",
        "knowledge",
        "knowledge-graph",
        "memory-management",
        "open-source",
        "vector-database"
      ],
      "license": "Apache-2.0",
      "open_issues": 320,
      "created_at": "2023-08-16T16:16:33Z",
      "pushed_at": "2026-06-27T14:39:34Z",
      "homepage": "https://www.cognee.ai",
      "default_branch": "main",
      "forks": 2252,
      "watchers": 72,
      "archived": false,
      "size_kb": 198847
    },
    "readme_content": "<div align=\"center\">\n  <a href=\"https://github.com/topoteretes/cognee\">\n    <img src=\"https://raw.githubusercontent.com/topoteretes/cognee/refs/heads/dev/assets/cognee-logo-transparent.png\" alt=\"Cognee Logo\" height=\"60\">\n  </a>\n\n  <br />\n\n  Cognee - The Open-Source AI Memory Platform for Agents\n\n  <p align=\"center\">\n  <a href=\"https://www.youtube.com/watch?v=8hmqS2Y5RVQ&t=13s\">Demo</a>\n  .\n  <a href=\"https://docs.cognee.ai/\">Docs</a>\n  .\n  <a href=\"https://cognee.ai\">Learn More</a>\n  ·\n  <a href=\"https://discord.gg/NQPKmU5CCg\">Join Discord</a>\n  ·\n  <a href=\"https://www.reddit.com/r/AIMemory/\">Join r/AIMemory</a>\n  .\n  <a href=\"https://github.com/topoteretes/cognee-community\">Community Plugins & Add-ons</a>\n  </p>\n\n\n  [![GitHub forks](https://img.shields.io/github/forks/topoteretes/cognee.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/topoteretes/cognee/network/)\n  [![GitHub stars](https://img.shields.io/github/stars/topoteretes/cognee.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/topoteretes/cognee/stargazers/)\n  [![GitHub commits](https://badgen.net/github/commits/topoteretes/cognee)](https://GitHub.com/topoteretes/cognee/commit/)\n  [![GitHub tag](https://badgen.net/github/tag/topoteretes/cognee)](https://github.com/topoteretes/cognee/tags/)\n  [![Downloads](https://static.pepy.tech/badge/cognee)](https://pepy.tech/project/cognee)\n  [![License](https://img.shields.io/github/license/topoteretes/cognee?colorA=00C586&colorB=000000)](https://github.com/topoteretes/cognee/blob/main/LICENSE)\n  [![Contributors](https://img.shields.io/github/contributors/topoteretes/cognee?colorA=00C586&colorB=000000)](https://github.com/topoteretes/cognee/graphs/contributors)\n  <a href=\"https://github.com/sponsors/topoteretes\"><img src=\"https://img.shields.io/badge/Sponsor-❤️-ff69b4.svg\" alt=\"Sponsor\"></a>\n\n<p>\n  <a href=\"https://trendshift.io/repositories/13955\" target=\"_blank\" style=\"display:inline-block;\">\n    <img src=\"https://trendshift.io/api/badge/repositories/13955\" alt=\"topoteretes%2Fcognee | Trendshift\" width=\"250\" height=\"55\" />\n  </a>\n</p>\n\nCognee is the open-source AI memory platform that gives AI agents persistent long-term memory across sessions. Ingest data in any format, build a self-hosted knowledge graph, and let every agent recall, connect, and act with full context\n\n  <p align=\"center\">\n  🌐 This README is also available in:\n  :\n  <!-- Keep these links. Translations will automatically update with the README. -->\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=de\">Deutsch</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=es\">Español</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=fr\">Français</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=ja\">日本語</a> |\n  <a href=\"README_ko.md\">한국어</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=pt\">Português</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=ru\">Русский</a> |\n  <a href=\"https://www.readme-i18n.com/topoteretes/cognee?lang=zh\">中文</a>\n  </p>\n\n<p align=\"center\">\n  <img src=\"assets/cognee-demo.gif\" alt=\"Cognee Demo\" width=\"80%\" />\n</p>\n</div>\n\n📄 Read the research paper: [Optimizing the Interface Between Knowledge Graphs and LLMs for Complex Reasoning](https://arxiv.org/abs/2505.24478) — Markovic et al., 2025\n\n\n## About Cognee\n\nCognee is an open-source AI memory platform for AI Agents. Ingest data in any format, and Cognee continuously builds a self-hosted knowledge graph that gives your agents persistent long-term memory across sessions. Cognee combines vector embeddings, graph reasoning, and cognitive-science-grounded ontology generation to make documents both searchable by meaning and connected by relationships that evolve as your knowledge does.\n\n:star: _Help us reach more developers and grow the cognee community. Star this repo!_\n\n:books: _Check our detailed [documentation](https://docs.cognee.ai/getting-started/installation#environment-configuration) for setup and configuration._\n\n:crab: _Available as a plugin for your OpenClaw — [cognee-openclaw](https://www.npmjs.com/package/@cognee/cognee-openclaw)_\n\n✴️ _Available as a plugin for your Claude Code — [claude-code-plugin](https://github.com/topoteretes/cognee-integrations/tree/main/integrations/claude-code)_\n\n🦀 _Available as a Rust client — [cognee-rs](https://github.com/topoteretes/cognee-rs)_\n\n🟦 _Available as a TypeScript client — [@cognee/cognee-ts](https://www.npmjs.com/package/@cognee/cognee-ts)_\n\n\n\n### Why use Cognee:\n\n- Easily Build Company Brain - unify data from various sources in one place and enable Agents with your domain knowledge\n- Knowledge infrastructure — unified ingestion, graph/vector search, runs locally, ontology grounding, multimodal\n- Persistent and Learning Agents - learn from feedback, context management, cross-agent knowledge sharing\n- Reliable and Trustworthy Agents - agentic user/tenant isolation, traceability, OTEL collector, audit traits\n\n### How it Works\n\n<p align=\"center\">\n  <img src=\"assets/remember.svg\" alt=\"Cognee Products\" width=\"80%\" />\n</p>\n\n<p align=\"center\">\n  <img src=\"assets/recall.svg\" alt=\"Cognee Recall\" width=\"80%\" />\n</p>\n\n## Basic Usage & Feature Guide\n\nTo learn more, [check out this short, end-to-end Colab walkthrough](https://colab.research.google.com/drive/12Vi9zID-M3fpKpKiaqDBvkk98ElkRPWy?usp=sharing) of Cognee's core features.\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/12Vi9zID-M3fpKpKiaqDBvkk98ElkRPWy?usp=sharing)\n\n## Quickstart\n\nLet’s try Cognee in just a few lines of code.\n\n### Prerequisites\n\n- Python 3.10 to 3.14\n\n### Step 1: Install Cognee\n\nYou can install Cognee with **pip**, **poetry**, **uv**, or your preferred Python package manager.\n\n```bash\nuv pip install cognee\n```\n\n### Step 2: Configure the LLM\n```python\nimport os\nos.environ[\"LLM_API_KEY\"] = \"YOUR OPENAI_API_KEY\"\n```\nAlternatively, create a `.env` file using our [template](https://github.com/topoteretes/cognee/blob/main/.env.template).\n\nTo integrate other LLM providers, see our [LLM Provider Documentation](https://docs.cognee.ai/setup-configuration/llm-providers).\n\n### Step 3: Run the Pipeline\n\nCognee's API gives you four operations — `remember`, `recall`, `forget`, and `improve`:\n\n```python\nimport cognee\nimport asyncio\n\n\nasync def main():\n    # Store permanently in the knowledge graph (runs add + cognify + improve)\n    await cognee.remember(\"Cognee turns documents into AI memory.\")\n\n    # Store in session memory (fast cache, syncs to graph in background)\n    await cognee.remember(\"User prefers detailed explanations.\", session_id=\"chat_1\")\n\n    # Query with auto-routing (picks best search strategy automatically)\n    results = await cognee.recall(\"What does Cognee do?\")\n    for result in results:\n        print(result)\n\n    # Query session memory first, fall through to graph if needed\n    results = await cognee.recall(\"What does the user prefer?\", session_id=\"chat_1\")\n    for result in results:\n        print(result)\n\n    # Delete when done\n    await cognee.forget(dataset=\"main_dataset\")\n\n\nif __name__ == '__main__':\n    asyncio.run(main())\n\n```\n\n### Use the Cognee CLI\n\n```bash\ncognee-cli remember \"Cognee turns documents into AI memory.\"\n\ncognee-cli recall \"What does Cognee do?\"\n\ncognee-cli forget --all\n```\n\nTo open the local UI, run:\n```bash\ncognee-cli -ui\n```\n\n> **Note:** The MCP server launched by `cognee-cli -ui` runs inside a Docker container.\n> Docker Desktop, Colima, or any OCI-compatible runtime with a working `docker` CLI is\n> required. See [Docker & Colima Setup](docs/docker-colima-setup.md) for details.\n\n## Run with Docker\n\nPrefer containers? Cognee publishes prebuilt images to Docker Hub on every push to `main`:\n[`cognee/cognee`](https://hub.docker.com/r/cognee/cognee) (the API server) and\n[`cognee/cognee-mcp`](https://hub.docker.com/r/cognee/cognee-mcp) (the MCP server).\n\n### Option A — Docker Compose (build from source)\n\nClone the repo, create a `.env` with at least `LLM_API_KEY`, then:\n\n```bash\ncp .env.template .env   # then edit .env and set LLM_API_KEY\n\n# Start the API server (http://localhost:8000)\ndocker compose up\n\n# Optional profiles (combine as needed):\ndocker compose --profile ui up        # + frontend on http://localhost:3000\ndocker compose --profile mcp up       # + MCP server on http://localhost:8001\ndocker compose --profile postgres up  # + Postgres/PGVector\ndocker compose --profile neo4j up     # + Neo4j\n```\n\n> The `cognee` and `cognee-mcp` services publish different host ports (`8000` vs `8001`),\n> so you can run both at once.\n\n### Option B — Pull the prebuilt image (no clone required)\n\n```bash\n# Create a minimal .env in the current directory\necho 'LLM_API_KEY=\"YOUR_OPENAI_API_KEY\"' > .env\n\n# API server\ndocker run --env-file ./.env -p 8000:8000 --rm -it cognee/cognee:main\n\n# MCP server (HTTP transport)\ndocker pull cognee/cognee-mcp:main\ndocker run -e TRANSPORT_MODE=http --env-file ./.env -p 8000:8000 --rm -it cognee/cognee-mcp:main\n```\n\nSee the [MCP server README](cognee-mcp/README.md) for SSE/stdio transports, optional\nextras, and MCP client configuration.\n\n## Use with AI Agents\n\n### Claude Code\n\nInstall the [Cognee memory plugin](https://github.com/topoteretes/cognee-integrations/tree/main/integrations/claude-code) to give Claude Code persistent memory across sessions. The plugin captures prompts, tool traces, and assistant responses into session memory, injects relevant context on every prompt, and syncs session memory into the permanent knowledge graph at session end.\n\n**Install** from the Claude Code marketplace. The recommended way is from your shell, *before* launching Claude Code, so the first `claude` launch is a clean session that bootstraps memory automatically:\n\n```bash\n# Add the marketplace and install the plugin (one-time, user-scoped)\nclaude plugin marketplace add topoteretes/cognee-integrations\nclaude plugin install cognee-memory@cognee\n\n# Set env vars for your mode (see below), then launch\nexport LLM_API_KEY=\"sk-...\"   # local mode; or COGNEE_BASE_URL + COGNEE_API_KEY for cloud\nclaude\n```\n\n**Local mode** (default) — the plugin bootstraps a local Cognee API at `http://localhost:8011`. Only `LLM_API_KEY` is required; the Cognee API key is auto-minted if absent:\n\n```bash\nexport LLM_API_KEY=\"sk-...\"\n```\n\n**Cognee Cloud or a remote server** — set both:\n\n```bash\nexport COGNEE_BASE_URL=\"https://your-instance.cognee.ai\"\nexport COGNEE_API_KEY=\"ck_...\"\n```\n\nOn startup you should see a \"Cognee Memory Connected\" system message.\n\nThe plugin hooks into Claude Code's lifecycle — `SessionStart` selects mode and sets up identity, `UserPromptSubmit` injects dataset-scoped context, `PostToolUse` captures tool traces, `Stop` writes the assistant's answer, `PreCompact` preserves memory across context resets, and `SessionEnd` triggers the final sync into the permanent graph.\n\nSee the [plugin README](https://github.com/topoteretes/cognee-integrations/tree/main/integrations/claude-code) for sessions, datasets, and full configuration.\n\n### Connect to Cognee Cloud\n\nPoint any Python agent at a managed Cognee instance — all SDK calls route to the cloud:\n\n```python\nimport cognee\n\nawait cognee.serve(url=\"https://your-instance.cognee.ai\", api_key=\"ck_...\")\n\nawait cognee.remember(\"important context\")\nresults = await cognee.recall(\"what happened?\")\n\nawait cognee.disconnect()\n```\n\n## Examples\n\nBrowse more examples in the [`examples/`](examples/) folder — demos, guides, custom pipelines, and database configurations.\n\n**Use Case 1 — Customer Support Agent**\n\n```python\nGoal: Resolve customer issues using their personal data across finance, support, and product history.\n\nUser: \"My invoice looks wrong and the issue is still not resolved.\"\n\nCognee tracks: past interactions, failed actions, resolved cases, product history\n\n# Agent response:\nAgent: \"I found 2 similar billing cases resolved last month.\n        The issue was caused by a syn",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[project]\nname = \"cognee\"\n\nversion = \"1.2.2\"\ndescription = \"Cognee - is a library for enriching LLM context with a semantic layer for better understanding and reasoning.\"\nauthors = [\n    { name = \"Vasilije Markovic\" },\n    { name = \"Boris Arzentar\" },\n]\nrequires-python = \">=3.10,<3.15\"\nreadme = \"README.md\"\nlicense = \"Apache-2.0\"\nclassifiers = [\n    \"Development Status :: 4 - Beta\",\n    \"Intended Audience :: Developers\",\n    \"License :: OSI Approved :: Apache Software License\",\n    \"Topic :: Software Development :: Libraries\",\n    \"Operating System :: MacOS :: MacOS X\",\n    \"Operating System :: POSIX :: Linux\",\n    \"Operating System :: Microsoft :: Windows\",\n]\ndependencies = [\n    \"openai>=1.80.1\",\n    \"python-dotenv>=1.0.1,<2.0.0\",\n    \"pydantic>=2.10.5\",\n    # GHSA-4xgf-cpjx-pc3j: 2.12.0–2.14.1 vulnerable, fixed in 2.14.2. Exclude the\n    # vulnerable range rather than capping, so the patched 2.14.2+ is adopted once\n    # it clears the `exclude-newer` window (it was <2 days old at time of writing).\n    \"pydantic-settings>=2.2.1,!=2.12.*,!=2.13.*,!=2.14.0,!=2.14.1,<3\",\n    \"typing_extensions>=4.12.2,<5.0.0\",\n    \"numpy>=1.26.4, <=4.0.0\",\n    \"sqlalchemy>=2.0.39,<3.0.0\",\n    \"aiosqlite>=0.20.0,<1.0.0\",\n    \"filelock>=3.12.0,<4.0.0\",  # cross-process migration lock for SQLite (Linux/macOS/Windows)\n    \"tiktoken>=0.8.0,<1.0.0\",\n    \"litellm>=1.83.7\",\n    \"instructor>=1.9.1,<1.15.3\",\n    \"filetype>=1.2.0,<2.0.0\",\n    \"aiohttp>=3.13.5,<4.0.0\",\n    \"aiofiles>=23.2.1\",\n    \"rdflib>=7.1.4,<7.2.0\",\n    \"pypdf>=6.6.2,<7.0.0\",\n    \"jinja2>=3.1.3,<4\",\n    \"lancedb>=0.24.3,<1.0.0\",  # 0.24.2 bundles lance 0.32.0 whose list-column decoder panics on tables with deletion vectors\n    \"nbformat>=5.7.0,<6.0.0\",\n    \"alembic>=1.13.3,<2\",\n    \"limits>=4.4.1,<5\",\n    \"fastapi>=0.116.2,<1.0.0\",\n    \"starlette>=0.48\",\n    \"python-multipart>=0.0.22,<1.0.0\",\n    \"fastapi-users[sqlalchemy]>=15.0.2\",\n    \"structlog>=25.2.0,<26\",\n    \"pympler>=1.1,<2.0.0\",\n    \"pylance>=0.22.0,<=0.36.0\",\n    \"ladybug>=0.16.0,<0.18\",\n    \"python-magic-bin<0.5 ; platform_system == 'Windows'\", # Only needed for Windows\n    \"networkx>=3.4.2,<4\",\n    \"uvicorn>=0.34.0,<1.0.0\",\n    \"gunicorn>=20.1.0,<24\",\n    \"websockets>=15.0.1,<16.0.0\",\n    \"tenacity>=9.0.0\",\n    \"fakeredis[lua]>=2.32.0\",\n    \"diskcache>=5.6.3\",\n    \"aiolimiter>=1.2.1\",\n    \"urllib3>=2.6.0\",\n    \"cbor2>=5.8.0\",\n    \"langdetect>=1.0.9\",\n    \"datamodel-code-generator>=0.54.0\",\n]\n\n[project.optional-dependencies]\napi=[]\n\ndistributed = [\n    \"modal>=1.0.5,<2.0.0\",\n]\n\nscraping = [\n    \"tavily-python>=0.7.12\",\n    \"beautifulsoup4>=4.13.1\",\n    \"playwright>=1.9.0\",\n    \"lxml>=4.9.3,<5 ; python_version < '3.13'\",\n    \"lxml>=5,<6 ; python_version >= '3.13' and python_version < '3.14'\",\n    # cp314 wheels start at lxml 6.0.1; without this 3.14 falls back to a\n    # source build that requires libxml2/libxslt headers (CI doesn't have them).\n    \"lxml>=6.0.1,<7 ; python_version >= '3.14'\",\n    \"protego>=0.1\",\n    \"APScheduler>=3.10.0,<=3.11.0\"\n]\n\nfastembed = [\n    \"fastembed<=0.8.0\",\n    # onnxruntime 1.23.2 only ships wheels through cp313; cp314 wheels start\n    # at onnxruntime 1.24.1. Split by python_version so existing 3.10–3.13\n    # users keep the pinned version and 3.14 picks up the first cp314-capable\n    # release.\n    \"onnxruntime<=1.23.2 ; python_version < '3.14'\",\n    \"onnxruntime>=1.24.1 ; python_version >= '3.14'\",\n]\n\nneo4j = [\"neo4j>=5.28.0,<6\"]\nneptune = [\"langchain_aws>=0.2.22\"]\npostgres = [\n    \"psycopg2>=2.9.10,<3\",\n    \"pgvector>=0.3.5,<0.4\",\n    \"asyncpg>=0.30.0,<1.0.0\",\n]\npostgres-binary = [\n    \"psycopg2-binary>=2.9.10,<3.0.0\",\n    \"pgvector>=0.3.5,<0.4\",\n    \"asyncpg>=0.30.0,<1.0.0\",\n]\nnotebook = [\"notebook>=7.1.0,<8\"]\nlangchain = [\n    \"langsmith>=0.2.3,<1.0.0\",\n    \"langchain_text_splitters>=0.3.2,<1.0.0\",\n    \"langchain-core>=1.2.5\"\n]\nllama-index = [\"llama-index-core>=0.14.20,<0.15\"]\nhuggingface = [\"transformers>=4.46.3,<5\"]\nollama = [\"transformers>=4.46.3,<5\"]\nmistral = [\"mistral-common>=1.5.2,<2\", \"mistralai>=1.9.10,<2\"]\nanthropic = [\"anthropic>=0.27\"]\nazure = [\"azure-identity>=1.15.0,<2\"]\ndeepeval = [\"deepeval>=3.0.1,<4\"]\nposthog = [\"posthog>=3.5.0,<4\"]\ngroq = [\"groq>=0.8.0,<1.0.0\"]\nllama-cpp = [\"llama-cpp-python[server]>=0.3.0,<1.0.0\"]\ndocs = [\n    \"lxml>=4.9.3,<5 ; python_version < '3.13'\",\n    \"lxml>=5,<6 ; python_version >= '3.13' and python_version < '3.14'\",\n    # cp314 wheels start at lxml 6.0.1.\n    \"lxml>=6.0.1,<7 ; python_version >= '3.14'\",\n    \"unstructured[csv, doc, docx, epub, md, odt, org, ppt, pptx, rst, rtf, tsv, xlsx, pdf]>=0.18.1,<19\",\n    \"nltk>=3.9.3,<4\", # TODO: Remove when unstructured is above v0.21.0 as it won't use nltk anymore\n]\ncodegraph = [\n    \"fastembed<=0.8.0 ; python_version < '3.14'\",\n    \"transformers>=4.46.3,<5\",\n    \"tree-sitter>=0.24.0,<0.25\",\n    \"tree-sitter-python>=0.23.6,<0.24\",\n]\nevals = [\n    \"plotly>=6.0.0,<7\",\n    \"gdown>=5.2.0,<6\",\n    \"pandas>=2.2.2,<3.0.0\",\n    \"matplotlib>=3.8.3,<4\",\n    \"scikit-learn>=1.6.1,<2\",\n    \"locust>",
    "strategic_keywords": [
      "agent",
      "agents",
      "memory",
      "rag",
      "skill",
      "llm",
      "vector",
      "embedding"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 20,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 97
    },
    "strategic_score": 97
  },
  {
    "owner": "colbymchenry",
    "name": "codegraph",
    "full_name": "colbymchenry/codegraph",
    "url": "https://github.com/colbymchenry/codegraph",
    "description": "Pre-indexed code knowledge graph, auto syncs on code changes, for Claude Code, Codex, Gemini, Cursor, OpenCode, AntiGravity, Kiro, and Hermes Agent — fewer tokens, fewer tool calls, 100% local",
    "language": "TypeScript",
    "total_stars": 55367,
    "forks": 3408,
    "stars_this_period": 388,
    "source_slice": "typescript",
    "source_slices": [
      "typescript"
    ],
    "metadata": {
      "topics": [],
      "license": "MIT",
      "open_issues": 244,
      "created_at": "2026-01-18T21:45:37Z",
      "pushed_at": "2026-06-27T20:49:13Z",
      "homepage": "https://colbymchenry.github.io/codegraph/",
      "default_branch": "main",
      "forks": 3408,
      "watchers": 124,
      "archived": false,
      "size_kb": 5915
    },
    "readme_content": "<div align=\"center\">\n\n# CodeGraph\n\n## 🎉 1.0 Released!\n\nAlready installed? Run `codegraph upgrade` to update in place.\n\nFollow [@getcodegraph](https://x.com/getcodegraph) on X for updates.\n\n### Supercharge Claude Code, Cursor, Codex, OpenCode, Hermes Agent, Gemini, Antigravity, and Kiro with Semantic Code Intelligence\n\n**Surgical context · fewer tool calls · faster answers · 100% local**\n\n### [Documentation & Website →](https://colbymchenry.github.io/codegraph/)\n\n[![npm version](https://img.shields.io/npm/v/@colbymchenry/codegraph.svg)](https://www.npmjs.com/package/@colbymchenry/codegraph)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Self-contained](https://img.shields.io/badge/Node.js-bundled%20%C2%B7%20none%20required-brightgreen.svg)](https://nodejs.org/)\n\n[![Windows](https://img.shields.io/badge/Windows-supported-blue.svg)](#supported-platforms)\n[![macOS](https://img.shields.io/badge/macOS-supported-blue.svg)](#supported-platforms)\n[![Linux](https://img.shields.io/badge/Linux-supported-blue.svg)](#supported-platforms)\n\n[![Claude Code](https://img.shields.io/badge/Claude_Code-supported-blueviolet.svg)](#supported-agents)\n[![Cursor](https://img.shields.io/badge/Cursor-supported-blueviolet.svg)](#supported-agents)\n[![Codex](https://img.shields.io/badge/Codex-supported-blueviolet.svg)](#supported-agents)\n[![opencode](https://img.shields.io/badge/opencode-supported-blueviolet.svg)](#supported-agents)\n[![Hermes Agent](https://img.shields.io/badge/Hermes_Agent-supported-blueviolet.svg)](#supported-agents)\n[![Gemini](https://img.shields.io/badge/Gemini-supported-blueviolet.svg)](#supported-agents)\n[![Antigravity](https://img.shields.io/badge/Antigravity-supported-blueviolet.svg)](#supported-agents)\n[![Kiro](https://img.shields.io/badge/Kiro-supported-blueviolet.svg)](#supported-agents)\n\n<br>\n\n**The CodeGraph platform is coming** — for every PR, know exactly what to test, what could break, which flows are affected, and whether business logic is compromised.\n\n<a href=\"https://getcodegraph.com\"><img alt=\"Join the waitlist for early beta access\" src=\"https://raw.githubusercontent.com/colbymchenry/codegraph/main/assets/waitlist.svg?v=2\" height=\"52\"></a>\n\n<sub>Get <b>early beta access</b> to the hosted product · <a href=\"https://getcodegraph.com\">getcodegraph.com</a></sub>\n\n</div>\n\n## Get Started\n\n### 1. Install the CLI\n\n**No Node.js required** — one command grabs the right build for your OS:\n\n```bash\n# macOS / Linux\ncurl -fsSL https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh | sh\n\n# Windows (PowerShell)\nirm https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.ps1 | iex\n```\n\n<details>\n<summary><b>Already have Node? Use npm instead (works on any version)</b></summary>\n\n```bash\nnpm i -g @colbymchenry/codegraph\n```\n\n<sub>CodeGraph bundles its own runtime — nothing to compile, no native build, works the same everywhere. The installer puts `codegraph` on your PATH but **doesn't change your current shell** — open a new terminal before the next step so the command resolves.</sub>\n\n<sub>**Upgrade any time** with `codegraph upgrade` — it detects how you installed (bundle, npm, or npx) and updates in place. Add `--check` to see if an update is available, or `codegraph upgrade <version>` to pin one.</sub>\n\n</details>\n\n### 2. Wire up your agent(s)\n\nIn a **new terminal**, run the installer to connect CodeGraph to the agents you use:\n\n```bash\ncodegraph install\n```\n\n<sub>Detects and auto-configures Claude Code, Cursor, Codex CLI, opencode, Hermes Agent, Gemini CLI, Antigravity IDE, and Kiro — wiring the CodeGraph MCP server into each. **This is the step that connects CodeGraph to your agent;** installing the CLI in step 1 does not do it on its own. It only wires up your agent — it does **not** index any code; building each project's graph is the separate `codegraph init` in step 3. (Shortcut: `npx @colbymchenry/codegraph` downloads and runs this in one go.)</sub>\n\n### 3. Initialize each project\n\n```bash\ncd your-project\ncodegraph init\n```\n\n<sub>`codegraph init` creates the local `.codegraph/` directory and builds the full graph in the same step — one command, done.</sub>\n\n<div align=\"center\">\n\n![1_C_VYnhpys0UHrOuOgpgoyw](https://github.com/user-attachments/assets/f168182f-4d9a-44e0-94d7-08d018cc8a3a)\n\n</div>\n\n### 4. No more syncing!\n\nAuto-sync is enabled by default. CodeGraph watches the project and updates the graph on every file change — while your agent edits code, or you add, modify, or delete files. **The index is never stale, and there is nothing to re-run.**\n\n### Uninstall\n\nChanged your mind? One command removes CodeGraph from every agent it configured:\n\n```bash\ncodegraph uninstall\n```\n\n<sub>Reverses the installer — strips CodeGraph's MCP server config, instructions, and permissions from each configured agent. Your project indexes (`.codegraph/`) are left untouched; remove those per-project with `codegraph uninit`. Use `--target` to remove from specific agents, or `--yes` to run non-interactively.</sub>\n\n---\n\n## Why CodeGraph?\n\nWhen an AI agent needs to understand code — to answer a question or make a change — it discovers structure the slow way: grep, glob, and Read, one file at a time, rebuilding call paths and dependencies by hand. That's a pile of tool calls and round-trips before it even starts the real work.\n\n**CodeGraph hands the agent the exact code it needs in one call.** It's a pre-built knowledge graph of every symbol, call edge, and dependency in your codebase — so instead of crawling files, the agent asks one question and gets back the relevant source, the call paths between those symbols (including dynamic-dispatch hops grep can't follow), and the blast radius of a change. **Surgical context, not a file-by-file search** — which means fewer tool calls and faster answers on every codebase, large or small.\n\n<img width=\"1536\" height=\"1024\" alt=\"token-cost-savings-scale\" src=\"https://github.com/user-attachments/assets/eb74a11a-a3ab-4b01-80a6-19f78352ae8e\" />\n\n> **A note on cost:** CodeGraph's win on *every* codebase is precision and speed — fewer tool calls, faster answers. It cuts token and dollar cost too, but those savings are **scale-dependent**: small and noisy on a modest codebase, and material only once a repo is large and tangled — at the scale of a Google or Microsoft monorepo, multiplied by a whole team's daily agent usage — for them to compound into a real line item. On a 500-file project, adopt CodeGraph for the speed; the cost savings show up when the codebase (and the team) gets big.\n\n### Benchmark Results\n\nTested across **7 real-world open-source codebases** spanning 7 languages, comparing an agent (Claude Code, headless) answering one architecture question **with** and **without** CodeGraph, at the **median of 4 runs per arm**. _Re-validated on Opus 4.8 (2026-06-02), on the current build (`codegraph_explore` as the primary tool)._\n\n> **The universal win — every repo, every size: 58% fewer tool calls · 22% faster · file reads cut to ~zero.**\n\nThe reliable, universal payoff is **surgical context and speed**: CodeGraph collapses the agent's grep/find/Read crawl into a few direct queries — returning the exact methods you asked about even when they're buried in a multi-thousand-line file — so it answers with **near-zero file reads** while the no-CodeGraph agent spends its budget on discovery. The **Tokens** and **Cost** columns are real too, but — as noted above — they're **scale-dependent**: small and noisy per query, compounding into real money only at large-codebase, high-volume scale.\n\n| Codebase | Language | Tool calls | Time | File reads | Tokens | Cost |\n|----------|----------|------------|------|------------|--------|------|\n| **VS Code** | TypeScript · ~10k files | 81% fewer | 11% faster | 0 vs 9 | 64% fewer | 18% cheaper |\n| **Excalidraw** | TypeScript · ~640 | 40% fewer | 27% faster | 0 vs 7 | 25% fewer | even |\n| **Django** | Python · ~3k | 77% fewer | 13% faster | 0 vs 9 | 60% fewer | 8% cheaper |\n| **Tokio** | Rust · ~790 | 57% fewer | 18% faster | 0 vs 8 | 38% fewer | even |\n| **OkHttp** | Java · ~645 | 50% fewer | 31% faster | 0 vs 4 | 54% fewer | 25% cheaper |\n| **Gin** | Go · ~110 | 44% fewer | 24% faster | 1 vs 6 | 23% fewer | 19% cheaper |\n| **Alamofire** | Swift · ~110 | 58% fewer | 33% faster | 0 vs 9 | 64% fewer | 40% cheaper |\n\n<sub>**File reads** = median files the agent opened **with** vs **without** CodeGraph — the surgical-context win in one column. **Tokens** and **Cost** are the same with-vs-without deltas; they're directional (they move run-to-run) and, per query, small in absolute terms — which is why they only become a line item at scale. `codegraph_explore` also collapses redundant interchangeable implementations to signatures, so a response is sized to the *answer* rather than the file count.</sub>\n\n<details>\n<summary><strong>Per-repo breakdown — WITH vs WITHOUT (median of 4)</strong></summary>\n\n**VS Code** · ~10k files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 59s | 2m 13s | 11% faster |\n| File Reads | 0 | 9 | −9 |\n| Grep/Bash | 0 | 11 | −11 |\n| Tool calls | 4 | 21 | 81% fewer |\n| Total tokens | 640k | 1.79M | 64% fewer |\n| Cost | $0.68 | $0.83 | 18% cheaper |\n\n**Excalidraw** · ~640 files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 32s | 2m 6s | 27% faster |\n| File Reads | 0 | 7 | −7 |\n| Grep/Bash | 1 | 8 | −7 |\n| Tool calls | 9 | 15 | 40% fewer |\n| Total tokens | 1.27M | 1.69M | 25% fewer |\n| Cost | $0.78 | $0.78 | even |\n\n**Django** · ~3k files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 43s | 1m 58s | 13% faster |\n| File Reads | 0 | 9 | −9 |\n| Grep/Bash | 0 | 5 | −5 |\n| Tool calls | 3 | 13 | 77% fewer |\n| Total tokens | 559k | 1.41M | 60% fewer |\n| Cost | $0.57 | $0.62 | 8% cheaper |\n\n**Tokio** · ~790 files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 55s | 2m 20s | 18% faster |\n| File Reads | 0 | 8 | −8 |\n| Grep/Bash | 0 | 6 | −6 |\n| Tool calls | 6 | 14 | 57% fewer |\n| Total tokens | 1.08M | 1.73M | 38% fewer |\n| Cost | $0.82 | $0.82 | even |\n\n**OkHttp** · ~645 files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 1s | 1m 29s | 31% faster |\n| File Reads | 0 | 4 | −4 |\n| Grep/Bash | 2 | 6 | −4 |\n| Tool calls | 5 | 10 | 50% fewer |\n| Total tokens | 502k | 1.10M | 54% fewer |\n| Cost | $0.41 | $0.55 | 25% cheaper |\n\n**Gin** · ~110 files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 14s | 1m 37s | 24% faster |\n| File Reads | 1 | 6 | −5 |\n| Grep/Bash | 1 | 2 | −1 |\n| Tool calls | 5 | 9 | 44% fewer |\n| Total tokens | 651k | 847k | 23% fewer |\n| Cost | $0.46 | $0.57 | 19% cheaper |\n\n**Alamofire** · ~110 files\n| Metric | WITH cg | WITHOUT cg | Δ |\n|---|---|---|---|\n| Time | 1m 35s | 2m 21s | 33% faster |\n| File Reads | 0 | 9 | −9 |\n| Grep/Bash | 0 | 4 | −4 |\n| Tool calls | 5 | 12 | 58% fewer |\n| Total tokens | 766k | 2.10M | 64% fewer |\n| Cost | $0.57 | $0.95 | 40% cheaper |\n\n</details>\n\n<details>\n<summary><strong>Full benchmark details</strong></summary>\n\n**Methodology.** Each arm is `claude -p` (Claude Opus 4.8) run headlessly against the repo with `--strict-mcp-config`: **WITH** = CodeGraph's MCP server enabled, **WITHOUT** = an empty MCP config. Built-in Read/Grep/Bash stay available to both. Same question per repo, **4 runs per arm, median reported**. Cost = the run's `total_cost_usd`; Tokens = total tokens processed (input incl. cached + output); Time = wall-clock; Tool calls = every tool invocation, including those inside any sub-agents the model spawns. Repos cloned at `--depth 1` and indexed by the same CodeGraph build that served them. Re-validated 2026-06-02 on the current build. These numbers are lower than the prior Opus 4.7 validation — not a CodeGraph regression but a stronger native baseline: Opus 4.8 greps/reads efficiently on the main thread instead of fanning out into large Expl",
    "manifest_file": "package.json",
    "manifest_content": "{\n  \"name\": \"@colbymchenry/codegraph\",\n  \"version\": \"1.1.2\",\n  \"description\": \"Supercharge AI coding agents with semantic code intelligence — surgical context, fewer tool calls, faster answers. 100% local.\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"bin\": {\n    \"codegraph\": \"./dist/bin/codegraph.js\"\n  },\n  \"files\": [\n    \"dist\",\n    \"scripts\",\n    \"README.md\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsc && npm run copy-assets && node -e \\\"require('fs').chmodSync('dist/bin/codegraph.js', 0o755)\\\"\",\n    \"preuninstall\": \"node dist/bin/uninstall.js\",\n    \"copy-assets\": \"node -e \\\"const fs=require('fs');fs.mkdirSync('dist/db',{recursive:true});fs.copyFileSync('src/db/schema.sql','dist/db/schema.sql');fs.mkdirSync('dist/extraction/wasm',{recursive:true});fs.readdirSync('src/extraction/wasm').filter(f=>f.endsWith('.wasm')).forEach(f=>fs.copyFileSync('src/extraction/wasm/'+f,'dist/extraction/wasm/'+f))\\\"\",\n    \"dev\": \"tsc --watch\",\n    \"cli\": \"npm run build && node dist/bin/codegraph.js\",\n    \"test\": \"vitest run\",\n    \"test:watch\": \"vitest\",\n    \"test:eval\": \"vitest run __tests__/evaluation/\",\n    \"eval\": \"npm run build && npx tsx __tests__/evaluation/runner.ts\",\n    \"clean\": \"node -e \\\"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\\\"\"\n  },\n  \"keywords\": [\n    \"code-intelligence\",\n    \"knowledge-graph\",\n    \"static-analysis\"\n  ],\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@clack/prompts\": \"^1.3.0\",\n    \"commander\": \"^14.0.2\",\n    \"fast-string-width\": \"^3.0.2\",\n    \"fast-wrap-ansi\": \"^0.2.0\",\n    \"ignore\": \"^7.0.5\",\n    \"jsonc-parser\": \"^3.3.1\",\n    \"picomatch\": \"^4.0.3\",\n    \"sisteransi\": \"^1.0.5\",\n    \"tree-sitter-wasms\": \"^0.1.11\",\n    \"web-tree-sitter\": \"^0.25.3\"\n  },\n  \"devDependencies\": {\n    \"@types/better-sqlite3\": \"^7.6.0\",\n    \"@types/node\": \"^20.19.30\",\n    \"@types/picomatch\": \"^4.0.2\",\n    \"typescript\": \"^5.0.0\",\n    \"vitest\": \"^2.1.9\"\n  },\n  \"engines\": {\n    \"node\": \">=20.0.0 <25.0.0\"\n  }\n}\n",
    "strategic_keywords": [
      "agent",
      "agents",
      "mcp",
      "runtime"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "package.json"
    ],
    "score_breakdown": {
      "heat": 18,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 95
    },
    "strategic_score": 95
  },
  {
    "owner": "thedotmack",
    "name": "claude-mem",
    "full_name": "thedotmack/claude-mem",
    "url": "https://github.com/thedotmack/claude-mem",
    "description": "Persistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More",
    "language": "JavaScript",
    "total_stars": 84737,
    "forks": 7315,
    "stars_this_period": 253,
    "source_slice": "javascript",
    "source_slices": [
      "javascript"
    ],
    "metadata": {
      "topics": [
        "ai",
        "ai-agents",
        "ai-memory",
        "anthropic",
        "artificial-intelligence",
        "chromadb",
        "claude",
        "claude-agent-sdk",
        "claude-agents",
        "claude-code",
        "claude-code-plugin",
        "claude-skills",
        "embeddings",
        "long-term-memory",
        "mem0",
        "memory-engine",
        "openmemory",
        "rag",
        "sqlite",
        "supermemory"
      ],
      "license": "Apache-2.0",
      "open_issues": 230,
      "created_at": "2025-08-31T20:50:03Z",
      "pushed_at": "2026-06-25T22:02:47Z",
      "homepage": "https://claude-mem.ai",
      "default_branch": "main",
      "forks": 7315,
      "watchers": 283,
      "archived": false,
      "size_kb": 213442
    },
    "readme_content": "<h1 align=\"center\">\n  <br>\n  <a href=\"https://github.com/thedotmack/claude-mem\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-dark-mode.webp\">\n      <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp\">\n      <img src=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp\" alt=\"Claude-Mem\" width=\"400\">\n    </picture>\n  </a>\n  <br>\n  <a href=\"https://vercel.com/open-source-program\">\n    <img alt=\"Vercel OSS Program\" src=\"https://vercel.com/oss/program-badge-2026.svg\" />\n  </a>\n</h1>\n\n<p align=\"center\">\n  <a href=\"docs/i18n/README.zh.md\">🇨🇳 中文</a> •\n  <a href=\"docs/i18n/README.zh-tw.md\">🇹🇼 繁體中文</a> •\n  <a href=\"docs/i18n/README.ja.md\">🇯🇵 日本語</a> •\n  <a href=\"docs/i18n/README.pt.md\">🇵🇹 Português</a> •\n  <a href=\"docs/i18n/README.pt-br.md\">🇧🇷 Português</a> •\n  <a href=\"docs/i18n/README.ko.md\">🇰🇷 한국어</a> •\n  <a href=\"docs/i18n/README.es.md\">🇪🇸 Español</a> •\n  <a href=\"docs/i18n/README.de.md\">🇩🇪 Deutsch</a> •\n  <a href=\"docs/i18n/README.fr.md\">🇫🇷 Français</a> •\n  <a href=\"docs/i18n/README.he.md\">🇮🇱 עברית</a> •\n  <a href=\"docs/i18n/README.ar.md\">🇸🇦 العربية</a> •\n  <a href=\"docs/i18n/README.ru.md\">🇷🇺 Русский</a> •\n  <a href=\"docs/i18n/README.pl.md\">🇵🇱 Polski</a> •\n  <a href=\"docs/i18n/README.cs.md\">🇨🇿 Čeština</a> •\n  <a href=\"docs/i18n/README.nl.md\">🇳🇱 Nederlands</a> •\n  <a href=\"docs/i18n/README.tr.md\">🇹🇷 Türkçe</a> •\n  <a href=\"docs/i18n/README.uk.md\">🇺🇦 Українська</a> •\n  <a href=\"docs/i18n/README.vi.md\">🇻🇳 Tiếng Việt</a> •\n  <a href=\"docs/i18n/README.tl.md\">🇵🇭 Tagalog</a> •\n  <a href=\"docs/i18n/README.id.md\">🇮🇩 Indonesia</a> •\n  <a href=\"docs/i18n/README.th.md\">🇹🇭 ไทย</a> •\n  <a href=\"docs/i18n/README.hi.md\">🇮🇳 हिन्दी</a> •\n  <a href=\"docs/i18n/README.bn.md\">🇧🇩 বাংলা</a> •\n  <a href=\"docs/i18n/README.ur.md\">🇵🇰 اردو</a> •\n  <a href=\"docs/i18n/README.ro.md\">🇷🇴 Română</a> •\n  <a href=\"docs/i18n/README.sv.md\">🇸🇪 Svenska</a> •\n  <a href=\"docs/i18n/README.it.md\">🇮🇹 Italiano</a> •\n  <a href=\"docs/i18n/README.el.md\">🇬🇷 Ελληνικά</a> •\n  <a href=\"docs/i18n/README.hu.md\">🇭🇺 Magyar</a> •\n  <a href=\"docs/i18n/README.fi.md\">🇫🇮 Suomi</a> •\n  <a href=\"docs/i18n/README.da.md\">🇩🇰 Dansk</a> •\n  <a href=\"docs/i18n/README.no.md\">🇳🇴 Norsk</a>\n</p>\n\n<h4 align=\"center\">Persistent memory compression system built for <a href=\"https://claude.com/claude-code\" target=\"_blank\">Claude Code</a>.</h4>\n\n<p align=\"center\">\n  <a href=\"LICENSE\">\n    <img src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg\" alt=\"License\">\n  </a>\n  <a href=\"package.json\">\n    <img src=\"https://img.shields.io/badge/version-13.4.0-green.svg\" alt=\"Version\">\n  </a>\n  <a href=\"package.json\">\n    <img src=\"https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg\" alt=\"Node\">\n  </a>\n  <a href=\"https://github.com/thedotmack/awesome-claude-code\">\n    <img src=\"https://awesome.re/mentioned-badge.svg\" alt=\"Mentioned in Awesome Claude Code\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://trendshift.io/repositories/15496\" target=\"_blank\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge-dark.svg\">\n      <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg\">\n      <img src=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg\" alt=\"thedotmack/claude-mem | Trendshift\" width=\"250\" height=\"55\"/>\n    </picture>\n  </a>\n</p>\n\n<br>\n\n<table align=\"center\">\n  <tr>\n    <td align=\"center\">\n      <a href=\"https://github.com/thedotmack/claude-mem\">\n        <picture>\n          <img\n            src=\"https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/cm-preview.gif\"\n            alt=\"Claude-Mem Preview\"\n            width=\"500\"\n          >\n        </picture>\n      </a>\n    </td>\n    <td align=\"center\">\n      <a href=\"https://www.star-history.com/#thedotmack/claude-mem&Date\">\n        <picture>\n          <source\n            media=\"(prefers-color-scheme: dark)\"\n            srcset=\"https://api.star-history.com/image?repos=thedotmack/claude-mem&type=date&theme=dark&legend=top-left\"\n          />\n          <source\n            media=\"(prefers-color-scheme: light)\"\n            srcset=\"https://api.star-history.com/image?repos=thedotmack/claude-mem&type=date&legend=top-left\"\n          />\n          <img\n            alt=\"Star History Chart\"\n            src=\"https://api.star-history.com/image?repos=thedotmack/claude-mem&type=date&legend=top-left\"\n            width=\"500\"\n          />\n        </picture>\n      </a>\n    </td>\n  </tr>\n</table>\n\n<p align=\"center\">\n  <a href=\"#quick-start\">Quick Start</a> •\n  <a href=\"#how-it-works\">How It Works</a> •\n  <a href=\"#mcp-search-tools\">Search Tools</a> •\n  <a href=\"#documentation\">Documentation</a> •\n  <a href=\"#configuration\">Configuration</a> •\n  <a href=\"#troubleshooting\">Troubleshooting</a> •\n  <a href=\"#license\">License</a>\n</p>\n\n<p align=\"center\">\n  Claude-Mem seamlessly preserves context across sessions by automatically capturing tool usage observations, generating semantic summaries, and making them available to future sessions. This enables Claude to maintain continuity of knowledge about projects even after sessions end or reconnect.\n</p>\n\n---\n\n## Quick Start\n\nInstall with a single command:\n\n```bash\nnpx claude-mem install\n```\n\nOr install for Gemini CLI (auto-detects `~/.gemini`):\n\n```bash\nnpx claude-mem install --ide gemini-cli\n```\nOr install for OpenCode:\n\n```bash\nnpx claude-mem install --ide opencode\n```\n\nOr install from the plugin marketplace inside Claude Code:\n\n```bash\n/plugin marketplace add thedotmack/claude-mem\n\n/plugin install claude-mem\n```\n\nRestart Claude Code or Gemini CLI. Context from previous sessions will automatically appear in new sessions.\n\n> **Note:** Claude-Mem is also published on npm, but `npm install -g claude-mem` installs the **SDK/library only** — it does not register the plugin hooks or set up the worker service. Always install via `npx claude-mem install` or the `/plugin` commands above.\n\n### 🦞 OpenClaw Gateway\n\nInstall claude-mem as a persistent memory plugin on [OpenClaw](https://openclaw.ai) gateways with a single command:\n\n```bash\ncurl -fsSL https://install.cmem.ai/openclaw.sh | bash\n```\n\nThe installer handles dependencies, plugin setup, AI provider configuration, worker startup, and optional real-time observation feeds to Telegram, Discord, Slack, and more. See the [OpenClaw Integration Guide](https://docs.claude-mem.ai/openclaw-integration) for details.\n\n**Key Features:**\n\n- 🧠 **Persistent Memory** - Context survives across sessions\n- 📊 **Progressive Disclosure** - Layered memory retrieval with token cost visibility\n- 🔍 **Skill-Based Search** - Query your project history with mem-search skill\n- 🖥️ **Web Viewer UI** - Real-time memory stream at http://localhost:37777\n- 💻 **Claude Desktop Skill** - Search memory from Claude Desktop conversations\n- 🔒 **Privacy Control** - Use `<private>` tags to exclude sensitive content from storage\n- ⚙️ **Context Configuration** - Fine-grained control over what context gets injected\n- 🤖 **Automatic Operation** - No manual intervention required\n- 🔗 **Citations** - Reference past observations with IDs (access via http://localhost:37777/api/observation/{id} or view all in the web viewer at http://localhost:37777)\n- 🧪 **Beta Channel** - Try experimental features like Endless Mode via version switching\n\n---\n\n## Documentation\n\n📚 **[View Full Documentation](https://docs.claude-mem.ai/)** - Browse on official website\n\n### Getting Started\n\n- **[Installation Guide](https://docs.claude-mem.ai/installation)** - Quick start & advanced installation\n- **[Gemini CLI Setup](https://docs.claude-mem.ai/gemini-cli/setup)** - Dedicated guide for Google's Gemini CLI integration\n- **[Usage Guide](https://docs.claude-mem.ai/usage/getting-started)** - How Claude-Mem works automatically\n- **[Search Tools](https://docs.claude-mem.ai/usage/search-tools)** - Query your project history with natural language\n- **[Beta Features](https://docs.claude-mem.ai/beta-features)** - Try experimental features like Endless Mode\n\n### Best Practices\n\n- **[Context Engineering](https://docs.claude-mem.ai/context-engineering)** - AI agent context optimization principles\n- **[Progressive Disclosure](https://docs.claude-mem.ai/progressive-disclosure)** - Philosophy behind Claude-Mem's context priming strategy\n\n### Architecture\n\n- **[Overview](https://docs.claude-mem.ai/architecture/overview)** - System components & data flow\n- **[Architecture Evolution](https://docs.claude-mem.ai/architecture-evolution)** - The journey from v3 to v5\n- **[Hooks Architecture](https://docs.claude-mem.ai/hooks-architecture)** - How Claude-Mem uses lifecycle hooks\n- **[Hooks Reference](https://docs.claude-mem.ai/architecture/hooks)** - 7 hook scripts explained\n- **[Worker Service](https://docs.claude-mem.ai/architecture/worker-service)** - HTTP API & Bun management\n- **[Database](https://docs.claude-mem.ai/architecture/database)** - SQLite schema & FTS5 search\n- **[Search Architecture](https://docs.claude-mem.ai/architecture/search-architecture)** - Hybrid search with Chroma vector database\n\n### Configuration & Development\n\n- **[Configuration](https://docs.claude-mem.ai/configuration)** - Environment variables & settings\n- **[Development](https://docs.claude-mem.ai/development)** - Building, testing, contributing\n- **[Troubleshooting](https://docs.claude-mem.ai/troubleshooting)** - Common issues & solutions\n\n---\n\n## How It Works\n\n**Core Components:**\n\n1. **5 Lifecycle Hooks** - SessionStart, UserPromptSubmit, PostToolUse, Stop, SessionEnd (6 hook scripts)\n2. **Smart Install** - Cached dependency checker (pre-hook script, not a lifecycle hook)\n3. **Worker Service** - HTTP API on port 37777 with web viewer UI and 10 search endpoints, managed by Bun\n4. **SQLite Database** - Stores sessions, observations, summaries\n5. **mem-search Skill** - Natural language queries with progressive disclosure\n6. **Chroma Vector Database** - Hybrid semantic + keyword search for intelligent context retrieval\n\nSee [Architecture Overview](https://docs.claude-mem.ai/architecture/overview) for details.\n\n---\n\n## MCP Search Tools\n\nClaude-Mem provides intelligent memory search through **4 MCP tools** following a token-efficient **3-layer workflow pattern**:\n\n**The 3-Layer Workflow:**\n\n1. **`search`** - Get compact index with IDs (~50-100 tokens/result)\n2. **`timeline`** - Get chronological context around interesting results\n3. **`get_observations`** - Fetch full details ONLY for filtered IDs (~500-1,000 tokens/result)\n\n**How It Works:**\n- Claude uses MCP tools to search your memory\n- Start with `search` to get an index of results\n- Use `timeline` to see what was happening around specific observations\n- Use `get_observations` to fetch full details for relevant IDs\n- **~10x token savings** by filtering before fetching details\n\n**Available MCP Tools:**\n\n1. **`search`** - Search memory index with full-text queries, filters by type/date/project\n2. **`timeline`** - Get chronological context around a specific observation or query\n3. **`get_observations`** - Fetch full observation details by IDs (always batch multiple IDs)\n\n**Example Usage:**\n\n```typescript\n// Step 1: Search for index\nsearch(query=\"authentication bug\", type=\"bugfix\", limit=10)\n\n// Step 2: Review index, identify relevant IDs (e.g., #123, #456)\n\n// Step 3: Fetch full details\nget_observations(ids=[123, 456])\n```\n\nSee [Search Tools Guide](https://docs.claude-mem.ai/usage/search-tools) for detailed examples.\n\n---\n\n## Beta Features\n\nClaude-Mem offers a **beta channel** with experimental features like **Endless Mode** (biomimetic memory ",
    "manifest_file": "package.json",
    "manifest_content": "{\n  \"name\": \"claude-mem\",\n  \"version\": \"13.8.1\",\n  \"description\": \"Memory compression system for Claude Code - persist context across sessions\",\n  \"keywords\": [\n    \"claude\",\n    \"claude-code\",\n    \"claude-agent-sdk\",\n    \"mcp\",\n    \"plugin\",\n    \"memory\",\n    \"compression\",\n    \"knowledge-graph\",\n    \"transcript\",\n    \"typescript\",\n    \"nodejs\"\n  ],\n  \"author\": \"Alex Newman\",\n  \"license\": \"Apache-2.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/thedotmack/claude-mem.git\"\n  },\n  \"homepage\": \"https://github.com/thedotmack/claude-mem#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/thedotmack/claude-mem/issues\"\n  },\n  \"type\": \"module\",\n  \"bin\": {\n    \"claude-mem\": \"./dist/npx-cli/index.js\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\"\n    },\n    \"./sdk\": {\n      \"types\": \"./dist/sdk/index.d.ts\",\n      \"import\": \"./dist/sdk/index.js\"\n    },\n    \"./modes/*\": \"./plugin/modes/*\"\n  },\n  \"files\": [\n    \"dist\",\n    \".agents/plugins/marketplace.json\",\n    \".codex-plugin\",\n    \"plugin/.claude-plugin\",\n    \"plugin/.codex-plugin\",\n    \"plugin/.mcp.json\",\n    \"plugin/package.json\",\n    \"plugin/bun.lock\",\n    \"plugin/hooks\",\n    \"plugin/modes\",\n    \"plugin/scripts/*.js\",\n    \"plugin/scripts/*.cjs\",\n    \"plugin/skills\",\n    \"plugin/ui\",\n    \"openclaw\"\n  ],\n  \"engines\": {\n    \"node\": \">=20.12.0\",\n    \"bun\": \">=1.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"npm run build-and-sync\",\n    \"build\": \"node scripts/sync-plugin-manifests.js && node scripts/build-hooks.js && node scripts/gen-plugin-lockfile.cjs\",\n    \"build-and-sync\": \"npm run build && npm run sync-marketplace && (cd ~/.claude/plugins/marketplaces/thedotmack && npm run worker:restart)\",\n    \"sync-marketplace\": \"node scripts/sync-marketplace.cjs\",\n    \"sync-marketplace:force\": \"node scripts/sync-marketplace.cjs --force\",\n    \"build:binaries\": \"node scripts/build-worker-binary.js\",\n    \"build:cli-binary\": \"bun build --compile --minify ./src/services/worker-service.ts --outfile plugin/scripts/claude-mem\",\n    \"worker:logs\": \"tail -n 50 ~/.claude-mem/logs/worker-$(date +%Y-%m-%d).log\",\n    \"worker:tail\": \"tail -f 50 ~/.claude-mem/logs/worker-$(date +%Y-%m-%d).log\",\n    \"changelog:generate\": \"node scripts/generate-changelog.js\",\n    \"discord:notify\": \"node scripts/discord-release-notify.js\",\n    \"worker:start\": \"bun plugin/scripts/worker-service.cjs start\",\n    \"worker:stop\": \"bun plugin/scripts/worker-service.cjs stop\",\n    \"worker:restart\": \"bun plugin/scripts/worker-service.cjs restart\",\n    \"worker:status\": \"bun plugin/scripts/worker-service.cjs status\",\n    \"queue\": \"bun scripts/check-pending-queue.ts\",\n    \"queue:process\": \"bun scripts/check-pending-queue.ts --process\",\n    \"queue:clear:pending\": \"bun scripts/clear-pending-queue.ts --all --force\",\n    \"pr:status\": \"bun scripts/pr-babysit-status.ts\",\n    \"claude-md:regenerate\": \"bun scripts/regenerate-claude-md.ts\",\n    \"claude-md:dry-run\": \"bun scripts/regenerate-claude-md.ts --dry-run\",\n    \"strip-comments\": \"bun scripts/strip-comments.ts\",\n    \"strip-comments:check\": \"bun scripts/strip-comments.ts --check\",\n    \"strip-comments:dry-run\": \"bun scripts/strip-comments.ts --dry-run\",\n    \"translate-readme\": \"bun scripts/translate-readme/cli.ts -v -o docs/i18n README.md\",\n    \"translate:tier1\": \"npm run translate-readme -- zh zh-tw ja pt-br ko es de fr\",\n    \"translate:tier2\": \"npm run translate-readme -- he ar ru pl cs nl tr uk\",\n    \"translate:tier3\": \"npm run translate-readme -- vi id th hi bn ro sv\",\n    \"translate:tier4\": \"npm run translate-readme -- it el hu fi da no\",\n    \"translate:all\": \"npm run translate:tier1 & npm run translate:tier2 & npm run translate:tier3 & npm run translate:tier4 & wait\",\n    \"bug-report\": \"npx tsx scripts/bug-report/cli.ts\",\n    \"cursor:install\": \"bun plugin/scripts/worker-service.cjs cursor install\",\n    \"cursor:uninstall\": \"bun plugin/scripts/worker-service.cjs cursor uninstall\",\n    \"cursor:status\": \"bun plugin/scripts/worker-service.cjs cursor status\",\n    \"cursor:setup\": \"bun plugin/scripts/worker-service.cjs cursor setup\",\n    \"lint:hook-io\": \"node scripts/check-hook-io-discipline.cjs\",\n    \"lint:spawn-env\": \"node scripts/check-spawn-env-discipline.cjs\",\n    \"typecheck\": \"tsc --noEmit && tsc --noEmit -p src/ui/viewer/tsconfig.json\",\n    \"typecheck:root\": \"tsc --noEmit\",\n    \"typecheck:viewer\": \"tsc --noEmit -p src/ui/viewer/tsconfig.json\",\n    \"test\": \"bun test\",\n    \"test:sqlite\": \"bun test tests/sqlite/\",\n    \"test:agents\": \"bun test tests/worker/agents/\",\n    \"test:search\": \"bun test tests/worker/search/\",\n    \"test:context\": \"bun test tests/context/\",\n    \"test:infra\": \"bun test tests/infrastructure/\",\n    \"test:server\": \"bun test tests/server/\",\n    \"e2e:server-beta:docker\": \"bash scripts/e2e-server-beta-docker.sh\",\n    \"check:postinstall-allowlist\": \"node scripts/check-postinstall-allowlist.js\",\n    \"smoke:clean-room\": \"node scripts/smoke-clean-room.cjs\",\n    \"prepublishOnly\": \"npm run build && node ",
    "strategic_keywords": [
      "agent",
      "agents",
      "memory",
      "mcp",
      "rag",
      "skill",
      "embedding"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "package.json"
    ],
    "score_breakdown": {
      "heat": 17,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 94
    },
    "strategic_score": 94
  },
  {
    "owner": "ogulcancelik",
    "name": "herdr",
    "full_name": "ogulcancelik/herdr",
    "url": "https://github.com/ogulcancelik/herdr",
    "description": "agent multiplexer that lives in your terminal.",
    "language": "Rust",
    "total_stars": 7726,
    "forks": 475,
    "stars_this_period": 231,
    "source_slice": "rust",
    "source_slices": [
      "rust"
    ],
    "metadata": {
      "topics": [
        "agent",
        "agent-orchestration",
        "ai",
        "ai-agents",
        "claude-code",
        "cli",
        "codex",
        "coding-agents",
        "developer-tools",
        "devtools",
        "multiplexer",
        "rust",
        "terminal",
        "terminal-multiplexer",
        "terminal-ui",
        "tmux",
        "tui",
        "workspace-manager"
      ],
      "license": "NOASSERTION",
      "open_issues": 25,
      "created_at": "2026-03-27T17:54:33Z",
      "pushed_at": "2026-06-27T12:06:20Z",
      "homepage": "https://herdr.dev",
      "default_branch": "master",
      "forks": 475,
      "watchers": 19,
      "archived": false,
      "size_kb": 28289
    },
    "readme_content": "# herdr\n\n\n<p align=\"center\">\n  <img src=\"assets/logo.png\" alt=\"herdr\" width=\"100\" />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://herdr.dev\">herdr.dev</a> · <a href=\"#install\">install</a> · <a href=\"#quick-start\">quick start</a> · <a href=\"#supported-agents\">supported agents</a> · <a href=\"https://herdr.dev/docs/integrations/\">integrations</a> · <a href=\"https://herdr.dev/docs/configuration/\">configuration</a> · <a href=\"https://herdr.dev/docs/socket-api/\">socket api</a> · <a href=\"#sponsors\">sponsor</a>\n</p>\n\n---\n\nhttps://github.com/user-attachments/assets/043ec09f-4bdd-41d5-aee0-8fda6b83e267\n\n**agent multiplexer that lives in your terminal.**\n\nworkspaces, tabs, panes. mouse-native: click, drag, split. every agent at a glance: blocked, working, done. detach and reattach, agents keep running. no gui app, no electron, no mac-only native wrapper. you see the agent's own terminal, not someone's interpretation of it.\n\n---\n\n## install\n\n```bash\ncurl -fsSL https://herdr.dev/install.sh | sh\n```\n\non windows preview beta:\n\n```powershell\npowershell -ExecutionPolicy Bypass -c \"irm https://herdr.dev/install.ps1 | iex\"\n```\n\nor install with homebrew:\n\n```bash\nbrew install herdr\n```\n\nor install with mise:\n\n```bash\nmise use -g herdr\n```\n\nif mise reports `herdr not found in mise tool registry`, update mise and retry. older mise versions predate the herdr registry entry; `mise use -g github:ogulcancelik/herdr` works as a temporary fallback.\n\nor download the stable Linux/macOS binary from [releases](https://github.com/ogulcancelik/herdr/releases). Native Windows binaries are preview-only beta builds.\n\n## quick start\n\nStart Herdr in the directory where the work lives:\n\n```bash\nherdr\n```\n\nHerdr starts or attaches to one background session server. When a session has no workspaces, Herdr opens one automatically. Run an agent in the root pane. Press `ctrl+b`, then `shift+n` to create another workspace, `ctrl+b`, then `v` or `minus` to split panes, `ctrl+b`, then `c` to create a tab, and `ctrl+b`, then `w` to switch workspaces.\n\nPress `ctrl+b q` to detach the client. The server and pane processes keep running. Open another terminal and run `herdr` again to reattach.\n\n## core concepts\n\n**Server and client.** By default, `herdr` attaches to a background server. Detaching closes only the client. `herdr server stop` stops the default server and kills its panes. Named sessions are separate server namespaces: use `herdr session attach work`, `herdr session stop work`, and `herdr session list` when you want fully separate runtime state.\n\n**Workspaces, tabs, panes.** A workspace is the project-level container. Tabs group panes inside a workspace. Panes are real terminal processes, not rewritten agent views.\n\n**Copy.** Herdr copies pane text, not the sidebar. Drag-select inside a pane, double-click a word or token, or press `prefix+[` for keyboard copy mode. In copy mode, move with `h/j/k/l`, `w/b/e`, and `{`/`}`, start selection with `v` or Space, copy with `y` or Enter, and leave with `q` or Esc. In PuTTY and some SSH terminals, hold `Shift` while dragging to use the terminal's own selection, and `Shift` + right click to paste.\n\n**Update and restore.** `herdr update` installs a new binary, but a running server keeps using the old process until it is stopped or handed off. Stop the old server to use the new version. Stopping exits pane processes. Run `herdr server stop`, then run `herdr` again for the default session. For a named session, run `herdr session stop <name>`, then run `herdr session attach <name>` again. `herdr update --handoff` is experimental and tries to move live panes, including foreground processes such as dev servers, from the old server to the new one. With current official integrations installed, supported agent panes can restart from their native agent sessions after a server restart or update.\n\n**Keybindings.** Herdr uses explicit keybinding strings. `prefix+n` means press the configured prefix, then `n`. `ctrl+alt+n`, `cmd+k`, `alt+1`, and function-key chords are direct terminal-mode shortcuts and do not need the prefix. Plain direct printable keys such as `n` steal normal typing, so use `prefix+n` unless you intentionally want a modifier-gated direct binding.\n\n**Agent awareness.** The sidebar shows blocked, working, done, and idle states. Detection works with process names and terminal output by default. Official integrations can add native session identity for restore, semantic state reports, or both.\n\n## update\n\nHerdr notifies you when a new version is available. Run manually:\n\n```bash\nherdr update\n```\n\n`herdr update` is for installs managed by Herdr's own installer. Homebrew, mise, and Nix installs update through `brew upgrade herdr`, `mise upgrade herdr`, or your Nix workflow, then use the same stop-and-run-again flow if a session is still running the old server. Linux and macOS direct installs can opt into development preview builds with `herdr channel set preview` and return to stable with `herdr channel set stable`. Windows beta installs are preview-only for now. See [install docs](https://herdr.dev/docs/install/) and [session state docs](https://herdr.dev/docs/session-state/) for the full update, restart, restore, and handoff matrix.\n\nLinux and macOS direct installs use the stable update channel by default. Windows beta installs default to preview. To test preview builds from `master` before the next stable release:\n\n```bash\nherdr channel set preview\n```\n\nTo return Linux and macOS direct installs to stable:\n\n```bash\nherdr channel set stable\n```\n\nFor direct installs, changing channels also checks that channel and installs its latest binary. If that update fails, run `herdr update` to retry from the configured channel.\n\nPreview is only for direct installs managed by Herdr's updater. Homebrew, mise, and Nix stay on stable and update through their package managers.\n\n## how it compares\n\n|                          | tmux | gui managers | herdr |\n|--------------------------|------|--------------|-------|\n| persistent sessions       | ✓    | —            | ✓     |\n| detach / reattach        | ✓    | —            | ✓     |\n| panes, tabs, workspaces  | ✓    | ✓            | ✓     |\n| agent awareness          | —    | ✓            | ✓     |\n| lives in your terminal   | ✓    | —            | ✓     |\n| real terminal views      | ✓    | —            | ✓     |\n| mouse-native            | —    | ✓            | ✓     |\n| lightweight binary       | ✓    | —            | ✓     |\n| agents can orchestrate   | ?    | ?            | ✓     |\n\ntmux gives you persistence and panes, but it was built before agents existed. gui managers show agent state, but they make you leave your terminal and use their wrapped view. herdr is persistence and awareness in one tool that stays out of your way.\n\n## remote and attach\n\nHerdr works over normal SSH. Run it on the remote host, detach, and reattach later:\n\n```\nssh you@yourserver\nherdr\n```\n\nYou can also attach from your local terminal without opening a shell first:\n\n```bash\nherdr --remote workbox\nherdr --remote ssh://you@yourserver:2222\n```\n\nRemote attach adds fallback SSH keepalives by default while preserving your own SSH config. Set `[remote].manage_ssh_config = false` to use plain `ssh`.\n\nDirect attach connects your current terminal to one server-owned terminal:\n\n```bash\nherdr agent attach <target>\nherdr terminal attach <terminal_id>\n```\n\nSee [persistence and remote docs](https://herdr.dev/docs/persistence-remote/) for remote keybinding, named-session, and handoff details.\n\n## agent awareness\n\nthe sidebar shows which agents are blocked, working, or done. workspaces roll up to their most urgent state so you can scan the full list at a glance.\n\nstates:\n\n- 🔴 **blocked** — agent needs input or approval\n- 🟡 **working** — agent is actively running\n- 🔵 **done** — work finished, you have not looked at it yet\n- 🟢 **idle** — done and seen\n\ndetection works by reading foreground process and terminal output. zero config, no hooks required. official claude code, codex, github copilot cli, devin, droid, kimi code cli, qodercli, and cursor agent cli integrations provide session restore identity; pi, omp, kimi code cli, opencode, kilo code cli, hermes, and custom socket integrations can report their own state.\n\n## lives in your terminal\n\nnot a gui window, not a web dashboard, not electron. herdr runs inside whatever terminal you already use. single rust binary, no dependencies. works inside tmux as the outer terminal environment.\n\n## what you get\n\n- **workspaces** — organized around git repos or folder names, each with its own tabs and panes\n- **tabs** — first-class in the socket api and cli\n- **copy-friendly** — drag-select pane text, double-click tokens, or use keyboard copy mode with `prefix+[`, `h/j/k/l`, `{`/`}`, `v`, and `y`\n- **notifications** — sounds and toasts for background events; tab-aware suppression\n- **18 built-in themes** — catppuccin, terminal, tokyo night, gruvbox, one, solarized, kanagawa, rosé pine, vesper, and light variants for the main palettes\n- **session persistence** — pane processes survive client detach; sessions restore panes after full restart, with opt-in recent screen history\n\n## agents can use herdr too\n\nThe local Unix socket lets agents create workspaces, split or zoom panes, spawn helpers, read output, and wait for state changes. Start with the [socket API docs](https://herdr.dev/docs/socket-api/) and [`SKILL.md`](./SKILL.md).\n\n## supported agents\n\nautomatic detection works out of the box. process name matching plus terminal output heuristics.\n\n| agent | idle / done | working | blocked |\n|-------|-------------|---------|---------|\n| [pi](https://pi.dev) | ✓ | ✓ | partial |\n| [claude code](https://docs.anthropic.com/en/docs/claude-code) | ✓ | ✓ | ✓ |\n| [codex](https://github.com/openai/codex) | ✓ | ✓ | ✓ |\n| [droid](https://factory.ai) | ✓ | ✓ | ✓ |\n| [amp](https://ampcode.com) | ✓ | ✓ | ✓ |\n| [opencode](https://github.com/anomalyco/opencode) | ✓ | ✓ | ✓ |\n| [grok cli](https://x.ai/grok) | ✓ | ✓ | ✓ |\n| [hermes agent](https://github.com/NousResearch/hermes-agent) | ✓ | ✓ | ✓ |\n| [kilo code cli](https://kilo.ai/) | ✓ | ✓ | ✓ |\n| [devin cli](https://docs.devin.ai/cli) | ✓ | ✓ | ✓ |\n| cursor agent | ✓ | ✓ | ✓ |\n| antigravity cli | ✓ | ✓ | ✓ |\n| kimi code cli | ✓ | ✓ | ✓ |\n| [github copilot cli](https://github.com/features/copilot) | ✓ | ✓ | ✓ |\n| [qodercli](https://qoder.com/cli) | ✓ | ✓ | ✓ |\n| [kiro cli](https://kiro.dev/docs/cli/) | ✓ | ✓ | — |\n\ndetected but not fully tested: gemini cli, cline.\n\nfor agents outside the built-in list, herdr still works as a terminal multiplexer with workspaces, panes, and tiling. custom integrations can report agent labels over the socket api. see the [socket api docs](https://herdr.dev/docs/socket-api/).\n\n### direct integrations\n\nofficial integrations have two roles. claude code, codex, github copilot cli, devin, droid, qodercli, and cursor agent cli report session identity for native restore, while their state still comes from screen detection. pi, omp, kimi code cli, opencode, kilo code cli, and hermes report both semantic state and session identity. install with:\n\n```bash\nherdr integration install pi\nherdr integration install omp\nherdr integration install claude\nherdr integration install codex\nherdr integration install copilot\nherdr integration install devin\nherdr integration install droid\nherdr integration install kimi\nherdr integration install opencode\nherdr integration install kilo\nherdr integration install hermes\nherdr integration install qodercli\nherdr integration install cursor\n```\n\nsee the [integrations docs](https://herdr.dev/docs/integrations/) for setup details.\n\n## keybindings\n\nPress `ctrl+b` to enter prefix mode. Default actions are prefix-first and tmux-like:\n\n| key | action |\n|-----|--------|\n| `prefix+c` | new tab |\n| `prefix+n` / `prefix+p` | next / previous tab |\n| `prefix+1..9` | switch tab |\n| `prefix+w` | workspace navigation |\n| `prefix+g` | session navigator |\n| `prefix+shift+n` |",
    "manifest_file": "Cargo.toml",
    "manifest_content": "[package]\nname = \"herdr\"\nversion = \"0.7.1\"\nedition = \"2021\"\nbuild = \"build.rs\"\ndescription = \"terminal workspace manager for AI coding agents\"\nlicense = \"AGPL-3.0-or-later\"\nrepository = \"https://github.com/ogulcancelik/herdr\"\nhomepage = \"https://herdr.dev\"\nkeywords = [\"terminal\", \"tui\", \"ai\", \"agents\", \"multiplexer\"]\ncategories = [\"command-line-utilities\"]\ninclude = [\"src/**/*\", \"assets/sounds/*\", \"README.md\", \"LICENSE\", \"Cargo.toml\"]\n\n[dependencies]\nbase64 = \"0.22.1\"\nbincode = { version = \"2\", features = [\"serde\"] }\nbytes = \"1\"\ncrossterm = \"0.29\"\nctrlc = \"3\"\ninterprocess = \"2.4.2\"\nlibc = \"0.2\"\nportable-pty = \"=0.9.0\"\npng = \"0.17\"\nratatui = { version = \"0.30\", features = [\"unstable-rendered-line-info\"] }\nregex = \"1\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nsha2 = \"0.10\"\ntokio = { version = \"1\", features = [\"rt-multi-thread\", \"macros\", \"sync\", \"time\"] }\ntoml = \"0.8\"\ntracing = \"0.1.44\"\ntracing-subscriber = { version = \"0.3.23\", features = [\"env-filter\"] }\nunicode-width = \"0.2\"\n\n[patch.crates-io]\nportable-pty = { path = \"vendor/portable-pty\" }\n\n[target.'cfg(windows)'.dependencies]\nwindows-sys = { version = \"0.61.2\", features = [\n    \"Wdk_System_Threading\",\n    \"Win32_Foundation\",\n    \"Win32_System_Diagnostics_Debug\",\n    \"Win32_System_Diagnostics_ToolHelp\",\n    \"Win32_System_Console\",\n    \"Win32_System_Kernel\",\n    \"Win32_System_Threading\",\n    \"Win32_UI_Shell\",\n    \"Win32_UI_WindowsAndMessaging\",\n] }\n",
    "strategic_keywords": [
      "agent",
      "agents",
      "rag",
      "runtime",
      "workspace"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "Cargo.toml"
    ],
    "score_breakdown": {
      "heat": 17,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 6,
      "total": 92
    },
    "strategic_score": 92
  },
  {
    "owner": "opendatalab",
    "name": "MinerU",
    "full_name": "opendatalab/MinerU",
    "url": "https://github.com/opendatalab/MinerU",
    "description": "Transforms complex documents like PDFs and Office docs into LLM-ready markdown/JSON for your Agentic workflows.",
    "language": "Python",
    "total_stars": 71013,
    "forks": 5974,
    "stars_this_period": 805,
    "source_slice": "python",
    "source_slices": [
      "python"
    ],
    "metadata": {
      "topics": [
        "ai4science",
        "document-analysis",
        "docx",
        "extract-data",
        "layout-analysis",
        "ocr",
        "parser",
        "pdf",
        "pdf-converter",
        "pdf-extractor-llm",
        "pdf-extractor-pretrain",
        "pdf-extractor-rag",
        "pdf-parser",
        "pptx",
        "python",
        "xlsx"
      ],
      "license": "NOASSERTION",
      "open_issues": 28,
      "created_at": "2024-02-29T08:52:34Z",
      "pushed_at": "2026-06-27T07:38:39Z",
      "homepage": "https://opendatalab.github.io/MinerU/",
      "default_branch": "master",
      "forks": 5974,
      "watchers": 260,
      "archived": false,
      "size_kb": 156331
    },
    "readme_content": "<div align=\"center\" xmlns=\"http://www.w3.org/1999/html\">\n<!-- logo -->\n<p align=\"center\">\n  <img src=\"https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docs/images/MinerU-logo.png\" width=\"300px\" style=\"vertical-align:middle;\">\n</p>\n\n<!-- icon -->\n\n[![stars](https://img.shields.io/github/stars/opendatalab/MinerU.svg)](https://github.com/opendatalab/MinerU)\n[![forks](https://img.shields.io/github/forks/opendatalab/MinerU.svg)](https://github.com/opendatalab/MinerU)\n[![open issues](https://img.shields.io/github/issues-raw/opendatalab/MinerU)](https://github.com/opendatalab/MinerU/issues)\n[![issue resolution](https://img.shields.io/github/issues-closed-raw/opendatalab/MinerU)](https://github.com/opendatalab/MinerU/issues)\n[![PyPI version](https://img.shields.io/pypi/v/mineru)](https://pypi.org/project/mineru/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mineru)](https://pypi.org/project/mineru/)\n[![Downloads](https://static.pepy.tech/badge/mineru)](https://pepy.tech/project/mineru)\n[![Downloads](https://static.pepy.tech/badge/mineru/month)](https://pepy.tech/project/mineru)\n[![OpenDataLab](https://img.shields.io/badge/webapp_on_mineru.net-blue?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM0IiBoZWlnaHQ9IjEzNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtMTIyLDljMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Im0xMjIsOWMwLDUtNCw5LTksOXMtOS00LTktOSw0LTksOS05LDksNCw5LDl6IiBmaWxsPSIjMDEwMTAxIi8+PHBhdGggZD0ibTkxLDE4YzAsNS00LDktOSw5cy05LTQtOS05LDQtOSw5LTksOSw0LDksOXoiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJtOTEsMThjMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0iIzAxMDEwMSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0iIzAxMDEwMSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4=&labelColor=white)](https://mineru.net/OpenSourceTools/Extractor?source=github)\n[![HuggingFace](https://img.shields.io/badge/Demo_on_HuggingFace-yellow.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAABYCAMAAACkl9t/AAAAk1BMVEVHcEz/nQv/nQv/nQr/nQv/nQr/nQv/nQv/nQr/wRf/txT/pg7/yRr/rBD/zRz/ngv/oAz/zhz/nwv/txT/ngv/0B3+zBz/nQv/0h7/wxn/vRb/thXkuiT/rxH/pxD/ogzcqyf/nQvTlSz/czCxky7/SjifdjT/Mj3+Mj3wMj15aTnDNz+DSD9RTUBsP0FRO0Q6O0WyIxEIAAAAGHRSTlMADB8zSWF3krDDw8TJ1NbX5efv8ff9/fxKDJ9uAAAGKklEQVR42u2Z63qjOAyGC4RwCOfB2JAGqrSb2WnTw/1f3UaWcSGYNKTdf/P+mOkTrE+yJBulvfvLT2A5ruenaVHyIks33npl/6C4s/ZLAM45SOi/1FtZPyFur1OYofBX3w7d54Bxm+E8db+nDr12ttmESZ4zludJEG5S7TO72YPlKZFyE+YCYUJTBZsMiNS5Sd7NlDmKM2Eg2JQg8awbglfqgbhArjxkS7dgp2RH6hc9AMLdZYUtZN5DJr4molC8BfKrEkPKEnEVjLbgW1fLy77ZVOJagoIcLIl+IxaQZGjiX597HopF5CkaXVMDO9Pyix3AFV3kw4lQLCbHuMovz8FallbcQIJ5Ta0vks9RnolbCK84BtjKRS5uA43hYoZcOBGIG2Epbv6CvFVQ8m8loh66WNySsnN7htL58LNp+NXT8/PhXiBXPMjLSxtwp8W9f/1AngRierBkA+kk/IpUSOeKByzn8y3kAAAfh//0oXgV4roHm/kz4E2z//zRc3/lgwBzbM2mJxQEa5pqgX7d1L0htrhx7LKxOZlKbwcAWyEOWqYSI8YPtgDQVjpB5nvaHaSnBaQSD6hweDi8PosxD6/PT09YY3xQA7LTCTKfYX+QHpA0GCcqmEHvr/cyfKQTEuwgbs2kPxJEB0iNjfJcCTPyocx+A0griHSmADiC91oNGVwJ69RudYe65vJmoqfpul0lrqXadW0jFKH5BKwAeCq+Den7s+3zfRJzA61/Uj/9H/VzLKTx9jFPPdXeeP+L7WEvDLAKAIoF8bPTKT0+TM7W8ePj3Rz/Yn3kOAp2f1Kf0Weony7pn/cPydvhQYV+eFOfmOu7VB/ViPe34/EN3RFHY/yRuT8ddCtMPH/McBAT5s+vRde/gf2c/sPsjLK+m5IBQF5tO+h2tTlBGnP6693JdsvofjOPnnEHkh2TnV/X1fBl9S5zrwuwF8NFrAVJVwCAPTe8gaJlomqlp0pv4Pjn98tJ/t/fL++6unpR1YGC2n/KCoa0tTLoKiEeUPDl94nj+5/Tv3/eT5vBQ60X1S0oZr+IWRR8Ldhu7AlLjPISlJcO9vrFotky9SpzDequlwEir5beYAc0R7D9KS1DXva0jhYRDXoExPdc6yw5GShkZXe9QdO/uOvHofxjrV/TNS6iMJS+4TcSTgk9n5agJdBQbB//IfF/HpvPt3Tbi7b6I6K0R72p6ajryEJrENW2bbeVUGjfgoals4L443c7BEE4mJO2SpbRngxQrAKRudRzGQ8jVOL2qDVjjI8K1gc3TIJ5KiFZ1q+gdsARPB4NQS4AjwVSt72DSoXNyOWUrU5mQ9nRYyjp89Xo7oRI6Bga9QNT1mQ/ptaJq5T/7WcgAZywR/XlPGAUDdet3LE+qS0TI+g+aJU8MIqjo0Kx8Ly+maxLjJmjQ18rA0YCkxLQbUZP1WqdmyQGJLUm7VnQFqodmXSqmRrdVpqdzk5LvmvgtEcW8PMGdaS23EOWyDVbACZzUJPaqMbjDxpA3Qrgl0AikimGDbqmyT8P8NOYiqrldF8rX+YN7TopX4UoHuSCYY7cgX4gHwclQKl1zhx0THf+tCAUValzjI7Wg9EhptrkIcfIJjA94evOn8B2eHaVzvBrnl2ig0So6hvPaz0IGcOvTHvUIlE2+prqAxLSQxZlU2stql1NqCCLdIiIN/i1DBEHUoElM9dBravbiAnKqgpi4IBkw+utSPIoBijDXJipSVV7MpOEJUAc5Qmm3BnUN+w3hteEieYKfRZSIUcXKMVf0u5wD4EwsUNVvZOtUT7A2GkffHjByWpHqvRBYrTV72a6j8zZ6W0DTE86Hn04bmyWX3Ri9WH7ZU6Q7h+ZHo0nHUAcsQvVhXRDZHChwiyi/hnPuOsSEF6Exk3o6Y9DT1eZ+6cASXk2Y9k+6EOQMDGm6WBK10wOQJCBwren86cPPWUcRAnTVjGcU1LBgs9FURiX/e6479yZcLwCBmTxiawEwrOcleuu12t3tbLv/N4RLYIBhYexm7Fcn4OJcn0+zc+s8/VfPeddZHAGN6TT8eGczHdR/Gts1/MzDkThr23zqrVfAMFT33Nx1RJsx1k5zuWILLnG/vsH+Fv5D4NTVcp1Gzo8AAAAAElFTkSuQmCC&labelColor=white)](https://huggingface.co/spaces/opendatalab/MinerU)\n[![ModelScope](https://img.shields.io/badge/Demo_on_ModelScope-purple?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIzIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCiA8Zz4KICA8dGl0bGU+TGF5ZXIgMTwvdGl0bGU+CiAgPHBhdGggaWQ9InN2Z18xNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTAsODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTUiIGZpbGw9IiM2MjRhZmYiIGQ9Im05OS4xNCwxMTUuNDlsMjUuNjUsMGwwLDI1LjY1bC0yNS42NSwwbDAsLTI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTYiIGZpbGw9IiM2MjRhZmYiIGQ9Im0xNzYuMDksMTQxLjE0bC0yNS42NDk5OSwwbDAsMjIuMTlsNDcuODQsMGwwLC00Ny44NGwtMjIuMTksMGwwLDI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTciIGZpbGw9IiMzNmNmZDEiIGQ9Im0xMjQuNzksODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTgiIGZpbGw9IiMzNmNmZDEiIGQ9Im0wLDY0LjE5bDI1LjY1LDBsMCwyNS42NWwtMjUuNjUsMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzE5IiBmaWxsPSIjNjI0YWZmIiBkPSJtMTk4LjI4LDg5Ljg0bDI1LjY0OTk5LDBsMCwyNS42NDk5OWwtMjUuNjQ5OTksMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIwIiBmaWxsPSIjMzZjZmQxIiBkPSJtMTk4LjI4LDY0LjE5bDI1LjY0OTk5LDBsMCwyNS42NWwtMjUuNjQ5OTksMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjNjI0YWZmIiBkPSJtMTUwLjQ0LDQybDAsMjIuMTlsMjUuNjQ5OTksMGwwLDI1LjY1bDIyLjE5LDBsMCwtNDcuODRsLTQ3Ljg0LDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18yMiIgZmlsbD0iIzM2Y2ZkMSIgZD0ibTczLjQ5LDg5Ljg0bDI1LjY1LDBsMCwyNS42NDk5OWwtMjUuNjUsMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIzIiBmaWxsPSIjNjI0YWZmIiBkPSJtNDcuODQsNjQuMTlsMjUuNjUsMGwwLC0yMi4xOWwtNDcuODQsMGwwLDQ3Ljg0bDIyLjE5LDBsMCwtMjUuNjV6Ii8+CiAgPHBhdGggaWQ9InN2Z18yNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTQ3Ljg0LDExNS40OWwtMjIuMTksMGwwLDQ3Ljg0bDQ3Ljg0LDBsMCwtMjIuMTlsLTI1LjY1LDBsMCwtMjUuNjV6Ii8+CiA8L2c+Cjwvc3ZnPg==&labelColor=white)](https://www.modelscope.cn/studios/OpenDataLab/MinerU)\n[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/gist/myhloli/a3cb16570ab3cfeadf9d8f0ac91b4fca/mineru_demo.ipynb)\n[![arXiv](https://img.shields.io/badge/MinerU-Technical%20Report-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2409.18839)\n[![arXiv](https://img.shields.io/badge/MinerU2.5-Technical%20Report-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2509.22186)\n[![arXiv](https://img.shields.io/badge/MinerU2.5%20Pro-Technical%20Report-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2604.04771)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/opendatalab/MinerU)\n\n\n<a href=\"https://trendshift.io/repositories/11174\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/11174\" alt=\"opendatalab%2FMinerU | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n\n<!-- language -->\n\n[English](README.md) | [简体中文](README_zh-CN.md)\n\n<!-- hot link -->\n\n<p align=\"center\">\n🚀<a href=\"https://mineru.net/?source=github\">Access MinerU Now→✅ Zero-Install Web Version ✅ Full-Featured Desktop Client ✅ Instant API Access; Skip deployment headaches – get all product formats in one click. Developers, dive in!</a>\n</p>\n\n<!-- join us -->\n\n<p align=\"center\">\n    👋 join us on <a href=\"https://discord.gg/Tdedn9GTXq\" target=\"_blank\">Discord</a> and <a href=\"https://mineru.net/community-portal/?aliasId=3c430f94\" target=\"_blank\">WeChat</a>\n</p>\n\n</div>\n\n\n<details>\n<summary>MinerU — High-accuracy document parsing engine for LLM · RAG · Agent workflows</summary>\nConverts PDF · DOCX · PPTX · XLSX · Images · Web pages into structured Markdown / JSON · VLM+OCR dual engine · 109 languages <br>\nMCP Server · LangChain / Dify / FastGPT native integration · 10+ domestic AI chip support\n\n**🔍 Core Parsing Capabilities**\n\n- Native support for `DOCX`, `PPTX`, and `XLSX` parsing\n- Formulas → LaTeX · Tables → HTML, accurate layout reconstruction\n- Supports scanned docs, handwriting, multi-column layouts, cross-page table merging\n- Output follows human reading order with automatic header/footer removal\n- VLM + OCR dual engine, 109-language OCR recognition\n\n**🔌 Integration**\n\n| Use Case | Solution |\n|----------|----------|\n| AI Coding Tools | MCP Server — Cursor · Claude Desktop · Windsurf |\n| RAG Frameworks | LangChain · LlamaIndex · RAGFlow · RAG-Anything · Flowise · Dify · FastGPT |\n| Development | Python / Go / TypeScript SDK · CLI · REST API · Docker |\n| No-Code | mineru.net online · Gradio WebUI · Desktop client |\n\n**🖥️ Deployment (Private · Fully Offline)**\n\n| Inference Backend | Best For |\n|------------------|---------|\n| pipeline         | Fast & stable, no hallucination, runs on CPU or GPU |\n| vlm-engine       | High accuracy, supports vLLM / LMDeploy / mlx ecosystem |\n| hybrid-engine    | High accuracy, native text extraction, low hallucination |\n\nDomestic AI chips: Ascend · Cambricon · Enflame · MetaX · Moore Threads · Kunlunxin · Iluvatar · Hygon · Biren · T-Head\n</details>\n\n# Changelog\n\n- 2026/06/18 3.4 Released\n\n  This release focuses on **OCR capability upgrades for the pipeline backend**, **OCR processing pipeline optimization**, and **model download experience improvements**. The main updates include:\n\n  - OCR model upgrade and processing acceleration\n    - The OCR model for the `pipeline` backend has been upgraded to `PP-OCRv6`, improving OCR accuracy by about `11%` on OmniDocBench v1.6.\n    - Removed Japanese, Traditional Chinese, English, and Latin options from OCR language selection. These scenarios are now routed to the `ch` OCR model, simplifying model configuration and language selection.\n    - Optimized the OCR inference and processing pipeline, increasing OCR processing speed by about `100%` and significantly improving parsing efficiency for batch documents and OCR-intensive documents.\n\n  - Model download logic optimization\n    - Added automatic model source selection, allowing first-time installations to choose a better model source based on the current network environment.\n    - Before downloading models, MinerU now prioritizes checking locally downloaded model cache files. Cache hits can be reused directly, reducing repeated downloads and unnecessary remote requests.\n    - For more details about model source configuration, automatic source selection, and local model usage, see the [Model Source Document",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[build-system]\nrequires = [\"setuptools>=77.0.3\", \"wheel\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"mineru\"\ndynamic = [\"version\"]\nlicense = \"LicenseRef-MinerU-Open-Source-License\"\nlicense-files = [\"LICENSE.md\"]\ndescription = \"A practical document parsing tool for converting PDF, images, DOCX, PPTX, and XLSX into Markdown and JSON\"\nreadme = \"README.md\"\nrequires-python = \">=3.10,<3.14\"\nkeywords = [\n    \"mineru\",\n    \"magic-pdf\",\n    \"document-parsing\",\n    \"document-understanding\",\n    \"pdf\",\n    \"markdown\",\n    \"ocr\",\n    \"vlm\",\n    \"docx\",\n    \"pptx\",\n    \"xlsx\",\n    \"multimodal\",\n]\nclassifiers = [\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n]\ndependencies = [\n    \"click>=8.1.7\",\n    \"loguru>=0.7.2\",\n    \"numpy>=1.21.6\",\n    \"tqdm>=4.67.1\",\n    \"requests\",\n    \"httpx\",\n    \"pillow>=11.0.0\",\n    \"pypdfium2>=4.30.0\",\n    \"pypdf>=5.6.0\",\n    \"reportlab\",\n    \"pdftext>=0.6.3\",\n    \"modelscope>=1.26.0\",\n    \"huggingface-hub>=0.32.4\",\n    \"json-repair>=0.46.2\",\n    \"opencv-python>=4.11.0.86\",\n    \"fast-langdetect>=0.2.3,<0.3.0\",\n    \"openai>=1.70.0,<3\",\n    \"beautifulsoup4>=4.13.5,<5\",\n    \"magika>=0.6.2,<1.1.0\",\n    \"mineru-vl-utils>=1.0.5,<2\",\n    \"python-docx>=1.2.0,<2\",\n    'pypptx-with-oxml>=1.0.3,<2',\n    \"mammoth>=1.11.0,<2\",\n    \"pylatexenc>=2.10,<3\",\n    \"lxml>=4.0.0,<7.0.0\",\n    \"openpyxl>=3.1.5,<4\",\n    \"fastapi\",\n    \"python-multipart\",\n    \"uvicorn\",\n]\n\n[project.optional-dependencies]\ntest = [\n    \"mineru[core]\",\n    \"pytest\",\n    \"pytest-cov\",\n    \"coverage\",\n    \"fuzzywuzzy\",\n    \"tomli; python_version < '3.11'\",\n]\nvlm = [\n    \"torch>=2.6.0,<3\",\n    \"transformers>=4.57.3,<5.0.0\",\n    \"accelerate>=1.5.1\",\n]\nvllm = [\n    \"vllm>=0.10.1.1,<0.22.0\",\n]\nlmdeploy = [\n    \"lmdeploy>=0.10.2,<0.12\",\n    \"qwen-vl-utils>=0.0.14,<1\",\n]\nmlx = [\n    \"mlx-vlm>=0.3.3,<0.4\",\n    \"mlx<=0.31.1\",\n]\ns3 = [\n    \"boto3>=1.28.43\",\n]\npipeline = [\n    \"PyYAML>=6.0.1,<7\",\n    \"ftfy>=6.3.1,<7\",\n    \"shapely>=2.0.7,<3\",\n    \"pyclipper>=1.3.0,<2\",\n    \"torch>=2.6.0,<3\",\n    \"torchvision\",\n    \"transformers>=4.57.3,<5.0.0\",\n    \"safetensors>=0.4.0,<1\",\n    \"onnxruntime>1.17.0\",\n]\ngradio = [\n    \"gradio>=5.49.1,!=6.0.0,!=6.0.1,!=6.0.2,!=6.1.0,!=6.2.0,!=6.3.0,!=6.4.0,!=6.5.0,!=6.5.1,!=6.6.0,!=6.7.0,<6.9.0\",\n    \"gradio-pdf>=0.0.22\",\n]\ncore = [\n    \"mineru[vlm]\",\n    \"mineru[pipeline]\",\n    \"mineru[gradio]\",\n]\nall = [\n    \"mineru[core]\",\n    \"mineru[s3]\",\n    \"mineru[mlx] ; sys_platform == 'darwin'\",\n    \"mineru[vllm] ; sys_platform == 'linux'\",\n    \"mineru[lmdeploy] ; sys_platform == 'win32'\",\n]\n\n[project.urls]\nhomepage = \"https://mineru.net/\"\ndocumentation = \"https://opendatalab.github.io/MinerU/\"\nrepository = \"https://github.com/opendatalab/MinerU\"\nissues = \"https://github.com/opendatalab/MinerU/issues\"\nLicense = \"https://github.com/opendatalab/MinerU/blob/master/LICENSE.md\"\n\n[project.scripts]\nmineru = \"mineru.cli.client:main\"\nmineru-vllm-server = \"mineru.cli.vlm_server:vllm_server\"\nmineru-lmdeploy-server = \"mineru.cli.vlm_server:lmdeploy_server\"\nmineru-openai-server = \"mineru.cli.vlm_server:openai_server\"\nmineru-models-download = \"mineru.cli.models_download:download_models\"\nmineru-api = \"mineru.cli.fast_api:main\"\nmineru-router = \"mineru.cli.router:main\"\nmineru-gradio = \"mineru.cli.gradio_app:main\"\n\n[tool.setuptools.dynamic]\nversion = { attr = \"mineru.version.__version__\" }\n\n[tool.setuptools.packages.find]\ninclude = [\"mineru*\"]\nnamespaces = false\n\n[tool.setuptools.package-data]\n\"mineru\" = [\"resources/**\"]\n\"mineru.model.utils.pytorchocr.utils\" = [\"resources/**\"]\n\n[tool.setuptools]\ninclude-package-data = true\nzip-safe = false\n\n[tool.pytest.ini_options]\naddopts = \"-s --cov=mineru --cov-report html\"\n\n[tool.coverage.run]\ncommand_line = \"-m pytest tests/unittest/test_e2e.py\"\nsource = [\"mineru/\"]\nomit = [\n    \"*/gradio_app.py\",\n    \"*/models_download.py\",\n    \"*/fast_api.py\",\n    \"*/cli/client.py\",\n    \"*/vlm_vllm_server.py\",\n    \"*/cli_parser.py\",\n]\n\n[tool.coverage.html]\ndirectory = \"htmlcov\"\n\n[tool.coverage.report]\nexclude_also = [\n    'def __repr__',\n    'if self.debug:',\n    'if settings.DEBUG',\n    'raise AssertionError',\n    'raise NotImplementedError',\n    'if 0:',\n    'if __name__ == .__main__.:',\n    'if TYPE_CHECKING:',\n    'class .*\\bProtocol\\):',\n    '@(abc\\.)?abstractmethod',\n]\n\n[tool.ruff]\nline-length = 128\n\n[tool.ruff.lint]\nselect = [\"C\", \"E\", \"F\", \"W\", \"ANN\"]\nignore = [\"C901\", \"ANN204\", \"ANN401\"]\n",
    "strategic_keywords": [
      "agent",
      "rag",
      "llm",
      "workflow"
    ],
    "relationship_label": "开发者工具",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 20,
      "relevance": 20,
      "novelty": 11,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 6,
      "total": 91
    },
    "strategic_score": 91
  },
  {
    "owner": "safishamsi",
    "name": "graphify",
    "full_name": "safishamsi/graphify",
    "url": "https://github.com/safishamsi/graphify",
    "description": "AI coding assistant skill (Claude Code, Codex, OpenCode, Cursor, Gemini CLI, and more). Turn any folder of code, SQL schemas, R scripts, shell scripts, docs, papers, images, or videos into a queryable knowledge graph. App code + database schema + infrastructure in one graph.",
    "language": "Python",
    "total_stars": 72945,
    "forks": 7310,
    "stars_this_period": 435,
    "source_slice": "python",
    "source_slices": [
      "python"
    ],
    "metadata": {
      "topics": [
        "antigravity",
        "claude-code",
        "codex",
        "gemini",
        "graphrag",
        "knowledge-graph",
        "leiden",
        "openclaw",
        "rag",
        "skills",
        "tree-sitter"
      ],
      "license": "MIT",
      "open_issues": 396,
      "created_at": "2026-04-03T15:49:07Z",
      "pushed_at": "2026-06-27T09:29:50Z",
      "homepage": "https://graphifylabs.ai/",
      "default_branch": "v8",
      "forks": 7310,
      "watchers": 250,
      "archived": false,
      "size_kb": 4811
    },
    "readme_content": "<p align=\"center\">\n  <a href=\"https://graphifylabs.ai\"><img src=\"https://raw.githubusercontent.com/safishamsi/graphify/v4/docs/logo-text.svg\" width=\"260\" height=\"64\" alt=\"Graphify\"/></a>\n</p>\n\n<p align=\"center\">\n  🇺🇸 <a href=\"README.md\">English</a> | 🇨🇳 <a href=\"docs/translations/README.zh-CN.md\">简体中文</a> | 🇯🇵 <a href=\"docs/translations/README.ja-JP.md\">日本語</a> | 🇰🇷 <a href=\"docs/translations/README.ko-KR.md\">한국어</a> | 🇩🇪 <a href=\"docs/translations/README.de-DE.md\">Deutsch</a> | 🇫🇷 <a href=\"docs/translations/README.fr-FR.md\">Français</a> | 🇪🇸 <a href=\"docs/translations/README.es-ES.md\">Español</a> | 🇮🇳 <a href=\"docs/translations/README.hi-IN.md\">हिन्दी</a> | 🇧🇷 <a href=\"docs/translations/README.pt-BR.md\">Português</a> | 🇷🇺 <a href=\"docs/translations/README.ru-RU.md\">Русский</a> | 🇸🇦 <a href=\"docs/translations/README.ar-SA.md\">العربية</a> | 🇮🇷 <a href=\"docs/translations/README.fa-IR.md\">فارسی</a> | 🇮🇹 <a href=\"docs/translations/README.it-IT.md\">Italiano</a> | 🇵🇱 <a href=\"docs/translations/README.pl-PL.md\">Polski</a> | 🇳🇱 <a href=\"docs/translations/README.nl-NL.md\">Nederlands</a> | 🇹🇷 <a href=\"docs/translations/README.tr-TR.md\">Türkçe</a> | 🇺🇦 <a href=\"docs/translations/README.uk-UA.md\">Українська</a> | 🇻🇳 <a href=\"docs/translations/README.vi-VN.md\">Tiếng Việt</a> | 🇮🇩 <a href=\"docs/translations/README.id-ID.md\">Bahasa Indonesia</a> | 🇸🇪 <a href=\"docs/translations/README.sv-SE.md\">Svenska</a> | 🇬🇷 <a href=\"docs/translations/README.el-GR.md\">Ελληνικά</a> | 🇷🇴 <a href=\"docs/translations/README.ro-RO.md\">Română</a> | 🇨🇿 <a href=\"docs/translations/README.cs-CZ.md\">Čeština</a> | 🇫🇮 <a href=\"docs/translations/README.fi-FI.md\">Suomi</a> | 🇩🇰 <a href=\"docs/translations/README.da-DK.md\">Dansk</a> | 🇳🇴 <a href=\"docs/translations/README.no-NO.md\">Norsk</a> | 🇭🇺 <a href=\"docs/translations/README.hu-HU.md\">Magyar</a> | 🇹🇭 <a href=\"docs/translations/README.th-TH.md\">ภาษาไทย</a> | 🇺🇿 <a href=\"docs/translations/README.uz-UZ.md\">Oʻzbekcha</a> | 🇹🇼 <a href=\"docs/translations/README.zh-TW.md\">繁體中文</a> | 🇵🇭 <a href=\"docs/translations/README.fil-PH.md\">Filipino</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.ycombinator.com/companies/graphify\"><img src=\"https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&logo=ycombinator&logoColor=white\" alt=\"YC S26\"/></a>\n  <a href=\"https://safishamsi.gumroad.com/l/qetvlo\"><img src=\"https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&logo=gitbook&logoColor=white\" alt=\"The Memory Layer\"/></a>\n  <a href=\"https://github.com/safishamsi/graphify/actions/workflows/ci.yml\"><img src=\"https://github.com/safishamsi/graphify/actions/workflows/ci.yml/badge.svg?branch=v8\" alt=\"CI\"/></a>\n  <a href=\"https://pypi.org/project/graphifyy/\"><img src=\"https://img.shields.io/pypi/v/graphifyy\" alt=\"PyPI\"/></a>\n  <a href=\"https://pepy.tech/project/graphifyy\"><img src=\"https://img.shields.io/pepy/dt/graphifyy?color=blue&label=downloads\" alt=\"Downloads\"/></a>\n  <a href=\"https://github.com/sponsors/safishamsi\"><img src=\"https://img.shields.io/badge/sponsor-safishamsi-ea4aaa?logo=github-sponsors\" alt=\"Sponsor\"/></a>\n  <a href=\"https://www.linkedin.com/in/safi-shamsi\"><img src=\"https://img.shields.io/badge/LinkedIn-Safi%20Shamsi-0077B5?logo=linkedin\" alt=\"LinkedIn\"/></a>\n  <a href=\"https://x.com/graphifyy\"><img src=\"https://img.shields.io/badge/X-graphifyy-000000?logo=x&logoColor=white\" alt=\"X\"/></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://star-history.com/#safishamsi/graphify&Date\">\n    <img src=\"https://api.star-history.com/svg?repos=safishamsi/graphify&type=Date\" alt=\"Star History Chart\" width=\"370\"/>\n  </a>\n</p>\n\nType `/graphify` in your AI coding assistant and it maps your entire project — code, docs, PDFs, images, videos — into a knowledge graph you can query instead of grepping through files.\n\nWorks in Claude Code, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Amp, OpenClaw, Factory Droid, Trae, Hermes, Kimi Code, Kiro, Pi, Devin CLI, and Google Antigravity.\n\n```\n/graphify .\n```\n\nThat's it. You get three files:\n\n```\ngraphify-out/\n├── graph.html       open in any browser — click nodes, filter, search\n├── GRAPH_REPORT.md  the highlights: key concepts, surprising connections, suggested questions\n└── graph.json       the full graph — query it anytime without re-reading your files\n```\n\nFor a readable architecture page with Mermaid call-flow diagrams, run:\n\n```bash\ngraphify export callflow-html\n```\n\n---\n\n## Prerequisites\n\n| Requirement | Minimum | Check | Install |\n|---|---|---|---|\n| Python | 3.10+ | `python --version` | [python.org](https://www.python.org/downloads/) |\n| uv *(recommended)* | any | `uv --version` | `curl -LsSf https://astral.sh/uv/install.sh \\| sh` |\n| pipx *(alternative)* | any | `pipx --version` | `pip install pipx` |\n\n**macOS quick install (Homebrew):**\n```bash\nbrew install python@3.12 uv\n```\n\n**Windows quick install:**\n```powershell\nwinget install astral-sh.uv\n```\n\n**Ubuntu/Debian:**\n```bash\nsudo apt install python3.12 python3-pip pipx\n# or install uv:\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n```\n\n---\n\n## Install\n\n> **Official package:** The PyPI package is `graphifyy` (double-y). Other `graphify*` packages on PyPI are not affiliated. The CLI command is still `graphify`.\n\n**Step 1 — install the package:**\n\n```bash\n# Recommended (uv puts graphify on PATH automatically):\nuv tool install graphifyy\n\n# Alternatives:\npipx install graphifyy\npip install graphifyy  # may need PATH setup — see note below\n```\n\n**Step 2 — register the skill with your AI assistant:**\n\n```bash\ngraphify install\n```\n\nThat's it. Open your AI assistant and type `/graphify .`\n\nTo install the assistant skill into the current repository instead of your user\nprofile, add `--project`:\n\n```bash\ngraphify install --project\ngraphify install --project --platform codex\n```\n\nProject-scoped installs write under the current directory, for example\n`.claude/skills/graphify/SKILL.md` or `.agents/skills/graphify/SKILL.md` (plus a\n`references/` sidecar the skill loads on demand), and\nprint a `git add` hint for files that can be committed.\nPer-platform commands that support project-scoped installs accept the same flag,\nfor example `graphify claude install --project` or `graphify codex install --project`.\n\n> **PowerShell note:** Use `graphify .` not `/graphify .` — the leading slash is a path separator in PowerShell.\n\n> **`graphify: command not found`?** Use `uv tool install graphifyy` or `pipx install graphifyy` — both put the CLI on PATH automatically. With plain `pip`, add `~/.local/bin` (Linux) or `~/Library/Python/3.x/bin` (Mac) to your PATH, or run `python -m graphify`.\n\n> **Avoid `pip install` on Mac/Windows** if possible. The skill resolves Python at runtime from `graphify-out/.graphify_python`; if that points to a different environment than where `pip` installed the package, you'll get `ModuleNotFoundError: No module named 'graphify'`. `uv tool install` and `pipx install` isolate the package in their own env and avoid this entirely.\n\n> **Git hooks and uv tool / pipx:** `graphify hook install` embeds the current interpreter path directly into the hook scripts at install time, so the post-commit hook fires correctly even in GUI git clients and CI runners where `~/.local/bin` is not on PATH. If you reinstall or upgrade graphify, re-run `graphify hook install` to refresh the embedded path.\n\n### Pick your platform\n\n| Platform | Install command |\n|----------|----------------|\n| Claude Code (Linux/Mac) | `graphify install` |\n| Claude Code (Windows) | `graphify install` (auto-detected) or `graphify install --platform windows` |\n| CodeBuddy | `graphify install --platform codebuddy` |\n| Codex | `graphify install --platform codex` |\n| OpenCode | `graphify install --platform opencode` |\n| Kilo Code | `graphify install --platform kilo` |\n| GitHub Copilot CLI | `graphify install --platform copilot` |\n| VS Code Copilot Chat | `graphify vscode install` |\n| Aider | `graphify install --platform aider` |\n| OpenClaw | `graphify install --platform claw` |\n| Factory Droid | `graphify install --platform droid` |\n| Trae | `graphify install --platform trae` |\n| Trae CN | `graphify install --platform trae-cn` |\n| Gemini CLI | `graphify install --platform gemini` |\n| Hermes | `graphify install --platform hermes` |\n| Kimi Code | `graphify install --platform kimi` |\n| Amp | `graphify amp install` |\n| Agent Skills (cross-framework) | `graphify install --platform agents` (alias `--platform skills`) |\n| Kiro IDE/CLI | `graphify kiro install` |\n| Pi coding agent | `graphify install --platform pi` |\n| Cursor | `graphify cursor install` |\n| Devin CLI | `graphify devin install` |\n| Google Antigravity | `graphify antigravity install` |\n\nCodex users also need `multi_agent = true` under `[features]` in `~/.codex/config.toml` for parallel extraction. CodeBuddy uses the same Agent tool and PreToolUse hook mechanism as Claude Code. Factory Droid uses the `Task` tool for parallel subagent dispatch. OpenClaw and Aider use sequential extraction (parallel agent support is still early on those platforms). Trae uses the Agent tool for parallel subagent dispatch and does **not** support PreToolUse hooks — AGENTS.md is the always-on mechanism.\n\n`--platform agents` (alias `--platform skills`) targets the generic cross-framework [Agent-Skills](https://github.com/anthropics/skills) locations: the spec's user-global `~/.agents/skills/` (read by `npx skills` and spec-compliant frameworks) for a global install, and `./.agents/skills/` for a project (`--project`) install. The bare `graphify install` stays single-platform (Claude Code) by design — use the named `agents` platform when you want the skill discoverable by any framework that reads `.agents/skills`.\n\n> Codex uses `$graphify` instead of `/graphify`.\n\n### Optional extras\n\nInstall only what you need:\n\n| Extra | What it adds | Install |\n|---|---|---|\n| `pdf` | PDF extraction | `uv tool install \"graphifyy[pdf]\"` |\n| `office` | `.docx` and `.xlsx` support | `uv tool install \"graphifyy[office]\"` |\n| `google` | Google Sheets rendering | `uv tool install \"graphifyy[google]\"` |\n| `video` | Video/audio transcription (faster-whisper + yt-dlp) | `uv tool install \"graphifyy[video]\"` |\n| `mcp` | MCP stdio server | `uv tool install \"graphifyy[mcp]\"` |\n| `neo4j` | Neo4j push support | `uv tool install \"graphifyy[neo4j]\"` |\n| `falkordb` | FalkorDB push support | `uv tool install \"graphifyy[falkordb]\"` |\n| `svg` | SVG graph export | `uv tool install \"graphifyy[svg]\"` |\n| `leiden` | Leiden community detection (Python < 3.13 only) | `uv tool install \"graphifyy[leiden]\"` |\n| `ollama` | Ollama local inference | `uv tool install \"graphifyy[ollama]\"` |\n| `openai` | OpenAI / OpenAI-compatible APIs | `uv tool install \"graphifyy[openai]\"` |\n| `gemini` | Google Gemini API | `uv tool install \"graphifyy[gemini]\"` |\n| `anthropic` | Anthropic Claude API (`--backend claude`, uses `ANTHROPIC_API_KEY`) | `uv tool install \"graphifyy[anthropic]\"` |\n| `bedrock` | AWS Bedrock (uses IAM, no API key) | `uv tool install \"graphifyy[bedrock]\"` |\n| `azure` | Azure OpenAI Service (`--backend azure`, uses `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_ENDPOINT`) | `uv tool install \"graphifyy[openai]\"` |\n| `sql` | SQL schema extraction | `uv tool install \"graphifyy[sql]\"` |\n| `postgres` | Live PostgreSQL introspection (`--postgres DSN`) | `uv tool install \"graphifyy[postgres]\"` |\n| `dm` | BYOND DreamMaker `.dm`/`.dme` AST extraction (may need a C compiler + `python3-dev` if no wheel matches your platform) | `uv tool install \"graphifyy[dm]\"` |\n| `terraform` | Terraform / HCL `.tf`/`.tfvars`/`.hcl` AST extraction | `uv tool install \"graphifyy[terraform]\"` |\n| `chinese` | Chinese query segmentation (jieba) | `uv tool install \"graphifyy[chinese]\"` |\n| `all` | Everything above | `uv tool install \"graphifyy[all]\"` |\n\n---\n\n## Make your assistant always use the graph\n\nRun this once in your project after building a graph:\n\n| Platform | Command |\n|----------|---------|\n| C",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[build-system]\nrequires = [\"setuptools>=68\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"graphifyy\"\nversion = \"0.8.50\"\ndescription = \"AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph\"\nreadme = \"README.md\"\nlicense = { file = \"LICENSE\" }\nkeywords = [\"claude\", \"claude-code\", \"codex\", \"opencode\", \"kilo\", \"cursor\", \"gemini\", \"aider\", \"kiro\", \"pi\", \"devin\", \"knowledge-graph\", \"rag\", \"graphrag\", \"obsidian\", \"community-detection\", \"tree-sitter\", \"leiden\", \"llm\"]\nrequires-python = \">=3.10\"\ndependencies = [\n    \"networkx>=3.4\",\n    \"numpy>=1.21\",\n    \"rapidfuzz>=3.0\",\n    \"tree-sitter>=0.23.0,<0.26\",\n    \"tree-sitter-python>=0.23,<0.26\",\n    \"tree-sitter-javascript>=0.23,<0.26\",\n    \"tree-sitter-typescript>=0.23,<0.25\",\n    \"tree-sitter-go>=0.23,<0.26\",\n    \"tree-sitter-rust>=0.23,<0.25\",\n    \"tree-sitter-java>=0.23,<0.25\",\n    \"tree-sitter-groovy>=0.1,<0.3\",\n    \"tree-sitter-c>=0.23,<0.25\",\n    \"tree-sitter-cpp>=0.23,<0.25\",\n    \"tree-sitter-ruby>=0.23,<0.25\",\n    \"tree-sitter-c-sharp>=0.23,<0.25\",\n    \"tree-sitter-kotlin>=1.0,<2.0\",\n    \"tree-sitter-scala>=0.23,<0.27\",\n    \"tree-sitter-php>=0.23,<0.25\",\n    \"tree-sitter-swift>=0.7,<0.9\",\n    \"tree-sitter-lua>=0.2,<0.6\",\n    \"tree-sitter-zig>=1.0,<2.0\",\n    \"tree-sitter-powershell>=0.26,<0.28\",\n    \"tree-sitter-elixir>=0.3,<0.5\",\n    \"tree-sitter-objc>=3.0,<4.0\",\n    \"tree-sitter-julia>=0.23,<0.25\",\n    \"tree-sitter-verilog>=1.0,<2.0\",\n    \"tree-sitter-fortran>=0.6,<0.8\",\n    \"tree-sitter-bash>=0.23,<0.27\",\n    \"tree-sitter-json>=0.23,<0.26\",\n]\n\n[project.urls]\nHomepage = \"https://github.com/safishamsi/graphify\"\nRepository = \"https://github.com/safishamsi/graphify\"\nIssues = \"https://github.com/safishamsi/graphify/issues\"\n\n[project.optional-dependencies]\n# starlette is pulled in transitively by mcp, but graphify/serve.py imports it\n# directly for the HTTP transport, so declare it here and floor it above the\n# CVE-2026-48818 / CVE-2026-54283 fixes (both resolved by 1.3.1) (#1391, #1396).\nmcp = [\"mcp\", \"starlette>=1.3.1\"]\nneo4j = [\"neo4j\"]\nfalkordb = [\"falkordb\"]\npdf = [\"pypdf>=6.12.0\", \"markdownify\"]\nwatch = [\"watchdog\"]\nsvg = [\"matplotlib\", \"numpy>=2.0; python_version >= '3.13'\"]\nleiden = [\"graspologic; python_version < '3.13'\"]\noffice = [\"python-docx\", \"openpyxl\"]\ngoogle = [\"openpyxl\"]\npostgres = [\"psycopg[binary]\"]\nvideo = [\"faster-whisper; python_version >= '3.11'\", \"yt-dlp>=2026.6.9\"]\nkimi = [\"openai\", \"tiktoken\"]\nollama = [\"openai\"]\nbedrock = [\"boto3\"]\nanthropic = [\"anthropic\"]\ngemini = [\"openai\", \"tiktoken\"]\nopenai = [\"openai\", \"tiktoken\"]\nchinese = [\"jieba\"]\nsql = [\"tree-sitter-sql\"]\n# tree-sitter-dm (BYOND DreamMaker) ships only a Windows wheel, so on Linux/Mac it\n# must compile from source (needs a C toolchain + python3-dev). Keeping it optional\n# avoids breaking the default `uv tool install graphifyy` for everyone (#1104).\ndm = [\"tree-sitter-dm\"]\nterraform = [\"tree-sitter-hcl\"]\nall = [\"mcp\", \"starlette>=1.3.1\", \"neo4j\", \"falkordb\", \"pypdf>=6.12.0\", \"markdownify\", \"watchdog\", \"graspologic; python_version < '3.13'\", \"python-docx\", \"openpyxl\", \"faster-whisper; python_version >= '3.11'\", \"yt-dlp>=2026.6.9\", \"matplotlib\", \"numpy>=2.0; python_version >= '3.13'\", \"openai\", \"tiktoken\", \"boto3\", \"anthropic\", \"tree-sitter-sql\", \"jieba\", \"tree-sitter-dm\", \"tree-sitter-hcl\"]\n\n[project.scripts]\ngraphify = \"graphify.__main__:main\"\ngraphify-mcp = \"graphify.serve:_main\"\n\n[dependency-groups]\ndev = [\n    \"bandit>=1.9.4\",\n    \"build>=1.5.0\",\n    \"hypothesis>=6.152.7\",\n    \"nuitka>=4.1\",\n    \"patchelf>=0.17.2.4 ; sys_platform != 'win32'\",\n    \"pip-audit>=2.10.0\",\n    \"pre-commit>=4.6.0\",\n    \"pyright>=1.1.409\",\n    \"pytest>=9.0.3\",\n    \"pytest-cov>=7.1.0\",\n    \"ruff>=0.15.13\",\n    \"safety>=3.7.0\",\n    \"setuptools>=82.0.1\",\n    \"wheel>=0.47.0\",\n    \"tomli>=2.0 ; python_version < '3.11'\",\n    \"tree-sitter-hcl>=1.2.0\",\n]\n\n[tool.uv]\n# Install via: uv tool install graphifyy\n# Run without installing: uvx graphifyy install\npackage = true\n\n[tool.setuptools]\npackages = [\"graphify\", \"graphify.extractors\"]\ninclude-package-data = false\n\n[tool.setuptools.package-data]\n# The skill bodies ship as graphify/skill*.md (the SKILL.md a host installs is\n# copied from one of these). The progressive-disclosure references sidecar ships\n# under graphify/skills/<host>/references/, and the always-on injection blocks\n# under graphify/always_on/. There is no graphify/skills/<host>/SKILL.md in the\n# repo, so no SKILL.md glob is needed here.\ngraphify = [\"skill.md\", \"skill-codex.md\", \"skill-opencode.md\", \"skill-kilo.md\", \"command-kilo.md\", \"skill-aider.md\", \"skill-amp.md\", \"skill-agents.md\", \"skill-copilot.md\", \"skill-claw.md\", \"skill-windows.md\", \"skill-droid.md\", \"skill-trae.md\", \"skill-kiro.md\", \"skill-vscode.md\", \"skill-pi.md\", \"skill-devin.md\", \"skills/*/references",
    "strategic_keywords": [
      "memory",
      "rag",
      "skill",
      "llm",
      "workflow"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 18,
      "relevance": 20,
      "novelty": 11,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 91
    },
    "strategic_score": 91
  },
  {
    "owner": "MemPalace",
    "name": "mempalace",
    "full_name": "MemPalace/mempalace",
    "url": "https://github.com/MemPalace/mempalace",
    "description": "The best-benchmarked open-source AI memory system. And it's free.",
    "language": "Python",
    "total_stars": 56644,
    "forks": 7322,
    "stars_this_period": 200,
    "source_slice": "python",
    "source_slices": [
      "python"
    ],
    "metadata": {
      "topics": [
        "ai",
        "chromadb",
        "llm",
        "mcp",
        "memory",
        "python"
      ],
      "license": "MIT",
      "open_issues": 572,
      "created_at": "2026-04-05T01:12:07Z",
      "pushed_at": "2026-06-26T07:53:47Z",
      "homepage": "http://mempalaceofficial.com/",
      "default_branch": "develop",
      "forks": 7322,
      "watchers": 324,
      "archived": false,
      "size_kb": 21844
    },
    "readme_content": "<div align=\"center\">\n\n<img src=\"assets/mempalace_logo.png\" alt=\"MemPalace\" width=\"240\">\n\n# MemPalace\n\nLocal-first AI memory. Verbatim storage, pluggable backend, 96.6% R@5 raw on LongMemEval — zero API calls.\n\n[![][version-shield]][release-link]\n[![][python-shield]][python-link]\n[![][license-shield]][license-link]\n[![][discord-shield]][discord-link]\n\n</div>\n\n> [!CAUTION]\n> **Beware of impostor sites.** MemPalace has no other official websites. The **only** official sources are this **[GitHub repository](https://github.com/MemPalace/mempalace)**, the **[PyPI package](https://pypi.org/project/mempalace/)**, and the docs at **[mempalaceofficial.com](https://mempalaceofficial.com)**. Any other domain (including `.tech`, `.net`, or other `.com` variants) is an impostor and may distribute malware. Details and timeline: [docs/HISTORY.md](docs/HISTORY.md).\n\n> [!IMPORTANT]\n> **Claude Code sessions expire in 30 days without auto-save hooks wired.** [Read this →](https://github.com/MemPalace/mempalace/discussions/1388)\n>\n> Need the shortest recovery/setup path? Use the [Claude Code retention setup checklist](https://mempalaceofficial.com/guide/claude-code-retention.html).\n\n---\n\n## What it is\n\nMemPalace stores your conversation history as verbatim text and retrieves\nit with semantic search. It does not summarize, extract, or paraphrase.\nThe index is structured — people and projects become *wings*, topics\nbecome *rooms*, and original content lives in *drawers* — so searches\ncan be scoped rather than run against a flat corpus.\n\nThe retrieval layer is pluggable. The current default is ChromaDB; the\ninterface is defined in [`mempalace/backends/base.py`](mempalace/backends/base.py)\nand alternative backends can be dropped in without touching the rest of\nthe system.\n\nNothing leaves your machine unless you opt in.\n\nArchitecture, concepts, and mining flows:\n[mempalaceofficial.com/concepts/the-palace](https://mempalaceofficial.com/concepts/the-palace.html).\n\n---\n\n## Install\n\nMemPalace ships a CLI, so install it in an isolated environment to avoid\nPEP 668 errors on Debian/Ubuntu/Homebrew Pythons and to keep mempalace's\ndeps (`chromadb`, `numpy`, `grpcio`, …) from conflicting with anything\nelse in your global site-packages.\n\nWe recommend [`uv`](https://docs.astral.sh/uv/) — `uv tool install` puts\nthe `mempalace` CLI in an isolated environment on your PATH:\n\n```bash\nuv tool install mempalace\nmempalace init ~/projects/myapp\n```\n\n[`pipx`](https://pipx.pypa.io/) works the same way if you prefer it:\n`pipx install mempalace`.\n\nPrefer plain `pip` only inside an activated virtualenv where you\nexplicitly want `import mempalace` available:\n\n```bash\npython -m venv .venv && source .venv/bin/activate\npip install mempalace\n```\n\n### Docker\n\nA container image is also available for running the MCP server or the CLI\nwithout a local Python toolchain. Everything persists under `/data` (palace,\nconfig, and the cached embedding model), so mount a volume there.\n\n```bash\n# Build the image (CPU; bundles the `extract` + `spellcheck` extras)\ndocker build -t mempalace .\n\n# MCP server over stdio — note the `-i` flag (JSON-RPC needs stdin)\ndocker run -i --rm -v mempalace-data:/data mempalace\n\n# Run any CLI command instead (mount the host directory you want to mine)\ndocker run --rm -v mempalace-data:/data -v /path/to/project:/work mempalace mine /work\ndocker run --rm -v mempalace-data:/data mempalace search \"why GraphQL\"\n```\n\nWire it into an MCP client (e.g. Claude Code) as a stdio server:\n\n```json\n{\n  \"mcpServers\": {\n    \"mempalace\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"-v\", \"mempalace-data:/data\", \"mempalace\"]\n    }\n  }\n}\n```\n\n`docker compose run --rm mcp` works too (see `docker-compose.yml`). For\nCUDA-accelerated embeddings, build the GPU variant with\n`docker build -f Dockerfile.gpu -t mempalace:gpu .` and run it with\n`--gpus all`. Customise the bundled extras at build time, e.g.\n`docker build --build-arg EXTRAS=\"extract,spellcheck\" -t mempalace .`.\n\n## Storage backends\n\nChromaDB is the default. For the pluggable-backend preview, MemPalace also\nships `sqlite_exact` for local exact-vector correctness checks, and two opt-in\nexternal service backends — `qdrant` (REST) and `pgvector` (Postgres). The two\nexternal backends exercise the storage contract on different substrates (a\nREST/dict store and a SQL/JSONB store), so it is not accidentally shaped around\none vendor.\n\n```bash\n# local no-service backend\nmempalace mine ~/projects/myapp --backend sqlite_exact\n\n# Qdrant backend, defaulting to http://localhost:6333\nMEMPALACE_QDRANT_URL=http://localhost:6333 \\\n  mempalace mine ~/projects/myapp --backend qdrant\n\n# Postgres + pgvector backend, defaulting to postgresql://localhost:5432/mempalace\n#   needs the optional driver: pip install mempalace[pgvector]\n#   and the `vector` extension available on the server\nMEMPALACE_PGVECTOR_DSN=postgresql://localhost:5432/mempalace \\\n  mempalace mine ~/projects/myapp --backend pgvector\n```\n\nQdrant can also be configured with `MEMPALACE_QDRANT_API_KEY`,\n`MEMPALACE_QDRANT_NAMESPACE`, and `MEMPALACE_QDRANT_TIMEOUT`; pgvector with\n`MEMPALACE_PGVECTOR_NAMESPACE`. Both external backends isolate tenants by\nnamespace (advertised via the `supports_namespace_isolation` capability) and\nwrite a local marker (`qdrant_backend.json` / `pgvector_backend.json`) to guard\nagainst silently opening a palace against the wrong server.\n\nWhen `MEMPALACE_QDRANT_URL` or `MEMPALACE_PGVECTOR_DSN` points anywhere other\nthan your own local or trusted self-hosted service, MemPalace will send and\nstore verbatim drawer text and metadata there. That is an explicit opt-in\nbackend choice, never the default.\n\n## Quickstart\n\n```bash\n# Mine content into the palace\nmempalace mine ~/projects/myapp                    # project files\nmempalace mine ~/.claude/projects/ --mode convos   # Claude Code sessions (scope with --wing per project)\n\n# Search\nmempalace search \"why did we switch to GraphQL\"\n\n# Load context for a new session\nmempalace wake-up\n```\n\nFor Claude Code, Gemini CLI, [Antigravity](https://mempalaceofficial.com/guide/antigravity.html),\nMCP-compatible tools, and local models, see\n[mempalaceofficial.com/guide/getting-started](https://mempalaceofficial.com/guide/getting-started.html).\n\n---\n\n## Benchmarks\n\nAll numbers below are reproducible from this repository with the commands\nin [`benchmarks/BENCHMARKS.md`](benchmarks/BENCHMARKS.md). Full\nper-question result files are committed under `benchmarks/results_*`.\n\n**LongMemEval — retrieval recall (R@5, 500 questions):**\n\n| Mode | R@5 | LLM required |\n|---|---|---|\n| Raw (semantic search, no heuristics, no LLM) | **96.6%** | None |\n| Hybrid v4, held-out 450q (tuned on 50 dev, not seen during training) | **98.4%** | None |\n| Hybrid v4 + LLM rerank (full 500) | ≥99% | Any capable model |\n\nThe raw 96.6% requires no API key, no cloud, and no LLM at any stage. The\nhybrid pipeline adds keyword boosting, temporal-proximity boosting, and\npreference-pattern extraction; the held-out 98.4% is the honest\ngeneralisable figure.\n\nThe rerank pipeline promotes the best candidate out of the top-20\nretrieved sessions using an LLM reader. It works with any reasonably\ncapable model — we have reproduced it with Claude Haiku, Claude Sonnet,\nand minimax-m2.7 via Ollama Cloud (no Anthropic dependency). The gap\nbetween raw and reranked is model-agnostic; we do not headline a \"100%\"\nnumber because the last 0.6% was reached by inspecting specific wrong\nanswers, which `benchmarks/BENCHMARKS.md` flags as teaching to the test.\n\n**Other benchmarks (full results in [`benchmarks/BENCHMARKS.md`](benchmarks/BENCHMARKS.md)):**\n\n| Benchmark | Metric | Score | Notes |\n|---|---|---|---|\n| LoCoMo (session, top-10, no rerank) | R@10 | 60.3% | 1,986 questions |\n| LoCoMo (hybrid v5, top-10, no rerank) | R@10 | 88.9% | Same set |\n| ConvoMem (all categories, 250 items) | Avg recall | 92.9% | 50 per category |\n| MemBench (ACL 2025, 8,500 items) | R@5 | 80.3% | All categories |\n\nWe deliberately do not include a side-by-side comparison against Mem0,\nMastra, Hindsight, Supermemory, or Zep. Those projects publish different\nmetrics on different splits, and placing retrieval recall next to\nend-to-end QA accuracy is not an honest comparison. See each project's\nown research page for their published numbers.\n\n**Reproducing every result:**\n\n```bash\ngit clone https://github.com/MemPalace/mempalace.git\ncd mempalace\nuv sync --extra dev   # or: pip install -e \".[dev]\"\n# see benchmarks/README.md for dataset download commands\nuv run python benchmarks/longmemeval_bench.py /path/to/longmemeval_s_cleaned.json\n```\n\n---\n\n## Knowledge graph\n\nMemPalace includes a temporal entity-relationship graph with validity\nwindows — add, query, invalidate, timeline — backed by local SQLite.\nUsage and tool reference:\n[mempalaceofficial.com/concepts/knowledge-graph](https://mempalaceofficial.com/concepts/knowledge-graph.html).\n\n## MCP server\n\n35 MCP tools cover palace reads/writes, knowledge-graph operations,\ncross-wing navigation, drawer management, and agent diaries. Installation\nand the full tool list:\n[mempalaceofficial.com/reference/mcp-tools](https://mempalaceofficial.com/reference/mcp-tools.html).\n\n## Agents\n\nEach specialist agent gets its own wing and diary in the palace.\nDiscoverable at runtime via `mempalace_list_agents` — no bloat in your\nsystem prompt:\n[mempalaceofficial.com/concepts/agents](https://mempalaceofficial.com/concepts/agents.html).\n\n## Auto-save hooks\n\nAuto-save hooks for **Claude Code, Codex CLI, and Cursor IDE** save\nperiodically and before context compression:\n\n- Claude Code + Codex →\n  [mempalaceofficial.com/guide/hooks](https://mempalaceofficial.com/guide/hooks.html)\n- Cursor IDE (adds session-start recall and a transcript snapshot before\n  compaction) →\n  [mempalaceofficial.com/guide/cursor-hooks](https://mempalaceofficial.com/guide/cursor-hooks.html)\n\nIf you are installing under time pressure, start with the\n[Claude Code retention setup checklist](https://mempalaceofficial.com/guide/claude-code-retention.html):\nwire the hooks, back up existing JSONL transcripts, and backfill them with\n`mempalace mine ~/.claude/projects/ --mode convos`.\n\nFor per-message recall on top of the file-level chunks the hooks produce,\nrun `mempalace sweep <transcript-dir>` periodically — it stores one\nverbatim drawer per user/assistant message, idempotent and resume-safe.\n\n---\n\n## Requirements\n\n- Python 3.9+\n- A vector-store backend (ChromaDB by default)\n- ~300 MB disk for the embedding model. Onboarding (`python -m mempalace.onboarding`) offers `embeddinggemma-300m` (multilingual, 100+ languages, recommended) or `all-MiniLM-L6-v2` (English-only, ~30 MB). See the docstring at [`mempalace/embedding.py`](mempalace/embedding.py) for details and migration notes.\n\nNo API key is required for the core benchmark path.\n\n## Docs\n\n- Getting started → [mempalaceofficial.com/guide/getting-started](https://mempalaceofficial.com/guide/getting-started.html)\n- CLI reference → [mempalaceofficial.com/reference/cli](https://mempalaceofficial.com/reference/cli.html)\n- Python API → [mempalaceofficial.com/reference/python-api](https://mempalaceofficial.com/reference/python-api.html)\n- Full benchmark methodology → [benchmarks/BENCHMARKS.md](benchmarks/BENCHMARKS.md)\n- Release notes → [CHANGELOG.md](CHANGELOG.md)\n- Corrections and public notices → [docs/HISTORY.md](docs/HISTORY.md)\n\n## Contributing\n\nPRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n<!-- Link Definitions -->\n[version-shield]: https://img.shields.io/badge/version-3.5.0-4dc9f6?style=flat-square&labelColor=0a0e14\n[release-link]: https://github.com/MemPalace/mempalace/releases\n[python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8\n[python-link]: https://www.python.org/\n[license-shield]: https://img.shields.io/badge/license-MIT-b0e8ff?style=flat-square&labelColor=0a0e14\n[licens",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[project]\nname = \"mempalace\"\nversion = \"3.5.0\"\ndescription = \"Give your AI a memory — mine projects and conversations into a searchable palace. No API key required.\"\nreadme = \"README.md\"\nrequires-python = \">=3.9\"\nlicense = \"MIT\"\nauthors = [\n    {name = \"milla-jovovich\"},\n]\nkeywords = [\n    \"ai\", \"memory\", \"llm\", \"rag\", \"chromadb\", \"mcp\",\n    \"vector-database\", \"claude\", \"chatgpt\", \"embeddings\",\n]\nclassifiers = [\n    \"Development Status :: 4 - Beta\",\n    \"Environment :: Console\",\n    \"Intended Audience :: Developers\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n    \"Topic :: Scientific/Engineering :: Artificial Intelligence\",\n    \"Topic :: Utilities\",\n]\ndependencies = [\n    \"chromadb>=1.5.4,<2\",\n    \"pyyaml>=6.0,<7\",\n    \"tomli>=2.0.0; python_version < '3.11'\",\n    # Multilingual embedding model deps. Onboarding now offers the\n    # embeddinggemma-300m ONNX model as the default for new installs, so\n    # these are required core deps (not optional extras). The 300 MB ONNX\n    # model itself is lazy-downloaded on first use, not at install time.\n    # Users who pick minilm during onboarding still get these installed\n    # but unused — small wheel-size cost in exchange for one fewer pip\n    # command in the multilingual setup path.\n    \"huggingface_hub>=0.20\",\n    \"tokenizers>=0.15\",\n    \"numpy>=1.24\",\n    # Tier 6a content-date extraction uses dateutil for natural-language\n    # date parsing (filename + content body branches). It happens to install\n    # transitively today via chromadb→kubernetes→python-dateutil, but that\n    # chain is not a contract — declared explicitly here to ensure\n    # _extract_content_date keeps working if upstream kubernetes drops the\n    # dependency. Per PR #1584 review (Igor, 2026-05-22).\n    \"python-dateutil>=2.8\",\n]\n\n[project.urls]\nHomepage = \"https://github.com/MemPalace/mempalace\"\nRepository = \"https://github.com/MemPalace/mempalace\"\n\"Bug Tracker\" = \"https://github.com/MemPalace/mempalace/issues\"\n\n[project.scripts]\nmempalace = \"mempalace.cli:main\"\nmempalace-mcp = \"mempalace.mcp_server:main\"\n\n[project.entry-points.\"mempalace.backends\"]\nchroma = \"mempalace.backends.chroma:ChromaBackend\"\npgvector = \"mempalace.backends.pgvector:PgVectorBackend\"\nqdrant = \"mempalace.backends.qdrant:QdrantBackend\"\nsqlite_exact = \"mempalace.backends.sqlite_exact:SQLiteExactBackend\"\n\n# RFC 002 source-adapter entry-point group. Core publishes no first-party\n# adapters under this group yet; ``miner.py`` and ``convo_miner.py`` migrate\n# onto ``BaseSourceAdapter`` in a follow-up PR. Third-party adapter packages\n# (``mempalace-source-cursor``, ``mempalace-source-git``, …) register here.\n[project.entry-points.\"mempalace.sources\"]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=7.0\",\n    \"pytest-cov>=4.0\",\n    # Retries known-transient ChromaDB-on-Windows HNSW compaction failures in CI\n    # (wired only into the test-windows job in ci.yml, scoped to the specific\n    # error). Local/Linux/macOS runs never rerun, so real failures stay loud.\n    \"pytest-rerunfailures>=12.0\",\n    \"ruff==0.15.18\",\n    \"psutil>=5.9\",\n    # Property-based testing — generates hundreds of random inputs per\n    # test to find counterexamples the hand-written positive tests miss.\n    # Used opt-in (sprinkle ``@given(...)`` on a test); zero runtime\n    # cost on tests that don't use it.\n    \"hypothesis>=6.0\",\n    # Pre-commit framework — gates every local ``git commit`` on the\n    # same ruff checks CI runs. Required activation step in\n    # CONTRIBUTING.md: ``pre-commit install`` once per clone. Without\n    # this, contributors silently bypass the lint gate locally and only\n    # discover failures at CI time.\n    \"pre-commit>=3.0\",\n    # mypy — static type checker. Catches lazy ``list`` / ``dict``\n    # annotations that should be ``list[str]`` / ``dict[str, int]``,\n    # missing return types, mismatched signatures across call sites.\n    # Run ad-hoc with ``mypy mempalace/``; CI doesn't gate on it yet but\n    # contributors should fix mypy errors they see before pushing.\n    \"mypy>=1.0\",\n]\nspellcheck = [\"autocorrect>=2.0\"]\n# Opt-in Postgres + pgvector backend. Only the psycopg driver is needed on the\n# client; the server must have the `vector` extension available. Selected via\n# MEMPALACE_BACKEND=pgvector / --backend pgvector; never required for the\n# default (Chroma) install.\npgvector = [\"psycopg[binary]>=3.1\"]\n# Hardware acceleration for the ONNX embedding model. Install exactly one:\n#   pip install mempalace[gpu]       — NVIDIA CUDA\n#   pip install mempalace[dml]       — DirectML (Windows AMD/Intel/NVIDIA)\n#   pip install mempalace[coreml]    — macOS Neural Engine\n# After install, set MEMPALACE_EMBEDDING_DEVICE=cuda|dml|coreml (or \"auto\").\ngpu = [\"onnxruntime-g",
    "strategic_keywords": [
      "memory",
      "mcp",
      "rag",
      "llm",
      "eval",
      "vector",
      "embedding"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 16,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 6,
      "total": 91
    },
    "strategic_score": 91
  },
  {
    "owner": "HKUDS",
    "name": "Vibe-Trading",
    "full_name": "HKUDS/Vibe-Trading",
    "url": "https://github.com/HKUDS/Vibe-Trading",
    "description": "\"Vibe-Trading: Your Personal Trading Agent\"",
    "language": "Python",
    "total_stars": 13670,
    "forks": 2582,
    "stars_this_period": 83,
    "source_slice": "all",
    "source_slices": [
      "all",
      "python"
    ],
    "metadata": {
      "topics": [
        "ai-agent",
        "algorithmic-trading",
        "backtesting",
        "fintech",
        "llm",
        "mcp",
        "multi-agent",
        "python",
        "quantitative-finance",
        "trading"
      ],
      "license": "MIT",
      "open_issues": 14,
      "created_at": "2026-04-01T09:52:20Z",
      "pushed_at": "2026-06-27T19:36:09Z",
      "homepage": "https://vibetrading.wiki/",
      "default_branch": "main",
      "forks": 2582,
      "watchers": 89,
      "archived": false,
      "size_kb": 52421
    },
    "readme_content": "<p align=\"center\">\n  <b>English</b> | <a href=\"README_zh.md\">中文</a> | <a href=\"README_ja.md\">日本語</a> | <a href=\"README_ko.md\">한국어</a> | <a href=\"README_ar.md\">العربية</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"assets/icon.png\" width=\"120\" alt=\"Vibe-Trading Logo\"/>\n</p>\n\n<h1 align=\"center\">Vibe-Trading: Your Personal Trading Agent</h1>\n\n<p align=\"center\">\n  <b>One Command to Empower Your Agent with Comprehensive Trading Capabilities</b>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://trendshift.io/repositories/25527\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/25527\" alt=\"HKUDS%2FVibe-Trading | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/Python-3.11%2B-3776AB?style=flat&logo=python&logoColor=white\" alt=\"Python\">\n  <img src=\"https://img.shields.io/badge/Backend-FastAPI-009688?style=flat\" alt=\"FastAPI\">\n  <img src=\"https://img.shields.io/badge/Frontend-React%2019-61DAFB?style=flat&logo=react&logoColor=white\" alt=\"React\">\n  <a href=\"https://pypi.org/project/vibe-trading-ai/\"><img src=\"https://img.shields.io/pypi/v/vibe-trading-ai?style=flat&logo=pypi&logoColor=white\" alt=\"PyPI\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-yellow?style=flat\" alt=\"License\"></a>\n  <br>\n  <a href=\"https://github.com/HKUDS/.github/blob/main/profile/README.md\"><img src=\"https://img.shields.io/badge/Feishu-Group-E9DBFC?style=flat-square&logo=feishu&logoColor=white\" alt=\"Feishu\"></a>\n  <a href=\"https://github.com/HKUDS/.github/blob/main/profile/README.md\"><img src=\"https://img.shields.io/badge/WeChat-Group-C5EAB4?style=flat-square&logo=wechat&logoColor=white\" alt=\"WeChat\"></a>\n  <a href=\"https://discord.gg/6TdQnT5xcF\"><img src=\"https://img.shields.io/badge/Discord-Join-7289DA?style=flat-square&logo=discord&logoColor=white\" alt=\"Discord\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://vibetrading.wiki/\">Website</a> &nbsp;&middot;&nbsp;\n  <a href=\"https://vibetrading.wiki/docs/\">Docs</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-news\">News</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-key-features\">Features</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-shadow-account\">Shadow Account</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-demo\">Demo</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-quick-start\">Quick Start</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-examples\">Examples</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-api-server\">API / MCP</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-roadmap\">Roadmap</a> &nbsp;&middot;&nbsp;\n  <a href=\"#-contributing\">Contributing</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#-quick-start\"><img src=\"assets/pip-install.svg\" height=\"45\" alt=\"pip install vibe-trading-ai\"></a>\n</p>\n\n---\n\n## 📰 News\n\n- **2026-06-27** 🧯 **Content-filter resilience + Shadow Account feature contract cleanup**: event-driven and swarm runs now skip individual LLM content-moderation hits, warn in run cards when filter rates are high, and recognize Gemini safety finish reasons instead of aborting an entire analysis ([#308](https://github.com/HKUDS/Vibe-Trading/pull/308), closes [#307](https://github.com/HKUDS/Vibe-Trading/issues/307), thanks @shadowinlife). Shadow Account extraction/codegen now share one `PRICE_FEATURES` contract and keep four-decimal return bounds, preventing rule/codegen drift and precision loss on `prior_5d_return` ([#316](https://github.com/HKUDS/Vibe-Trading/pull/316), thanks @Robin1987China).\n- **2026-06-26** 🎯 **Shadow Account conditional entry + tushare ETF/index/HK routing**: extracted Shadow Account rules now carry RSI / prior-return bounds, so the generated SignalEngine enters on real conditions (RSI in range, prior-return in range) instead of blindly replaying the holding cadence ([#314](https://github.com/HKUDS/Vibe-Trading/pull/314), follows [#302](https://github.com/HKUDS/Vibe-Trading/pull/302), thanks @Robin1987China). The tushare loader also routes ETF/LOF → `fund_daily()`, indices → `index_daily()`, and HK equities → `hk_daily()` instead of always calling `daily()` (which silently returns empty for non-stocks), with per-symbol empty-result + partial-fetch warnings ([#315](https://github.com/HKUDS/Vibe-Trading/pull/315), closes [#310](https://github.com/HKUDS/Vibe-Trading/issues/310), thanks @shadowinlife).\n- **2026-06-25** 🧪 **Strict validation JSON + calmer agent context**: standalone backtest validation now normalizes nested `NaN` / `Infinity` values before writing `artifacts/validation.json` or CLI stdout, so strict JSON parsers no longer choke on validation payloads ([#306](https://github.com/HKUDS/Vibe-Trading/pull/306), thanks @gyx09212214-prog). The agent prompt also derives the current data-source count from the loader registry, and `_microcompact()` now waits for real token pressure instead of clearing older tool results during short runs ([#296](https://github.com/HKUDS/Vibe-Trading/pull/296), closes [#282](https://github.com/HKUDS/Vibe-Trading/issues/282), thanks @MarkfuGod).\n<details>\n<summary>Earlier news</summary>\n\n- **2026-06-24** 🎯 **Shadow Account price context + reactive Chinese UI + LAN auth fix**: Shadow Account rule extraction now sees PIT-safe entry context — `entry_rsi14` and `prior_5d_return` fetched through the loader registry as of `buy_dt`, with graceful offline/no-data degradation ([#302](https://github.com/HKUDS/Vibe-Trading/pull/302), follows [#295](https://github.com/HKUDS/Vibe-Trading/issues/295), thanks @Robin1987China). The main Web UI panels now use reactive English / zh-CN translations across charts, chat, Alpha Library, Correlation, and Run Detail ([#301](https://github.com/HKUDS/Vibe-Trading/pull/301), thanks @skloxo). Remote same-origin Web UI deployments with `API_AUTH_KEY` can post and upload again after the CSRF hardening, while mismatched cross-site origins remain blocked ([#304](https://github.com/HKUDS/Vibe-Trading/pull/304), thanks @Hinotoi-agent).\n- **2026-06-23** 🛡️ **Local API CSRF hardening**: a malicious web page can no longer drive unsafe cross-site requests (POST/PUT/DELETE) against the loopback API — CORS blocks reading the response but not the side effect, so loopback dev-mode trust now applies the existing cross-site guard to unsafe methods *before* honoring it. Safe methods and local CLI / non-browser uploads are unaffected ([#293](https://github.com/HKUDS/Vibe-Trading/pull/293), thanks @Hinotoi-agent).\n- **2026-06-22** 🔧 **Live-authorize OAuth fix + Alpha Zoo headline fix**: `connector authorize` now holds the OAuth handshake open through a multi-minute broker sign-in (tunable via `VIBE_LIVE_AUTHORIZE_TIMEOUT_SECONDS`) and no longer spawns a competing callback server on retry, so the token actually persists ([#281](https://github.com/HKUDS/Vibe-Trading/pull/281), closes [#259](https://github.com/HKUDS/Vibe-Trading/issues/259), thanks @Robin1987China). The Alpha Zoo page no longer prints its alpha count twice ([#287](https://github.com/HKUDS/Vibe-Trading/pull/287), closes [#286](https://github.com/HKUDS/Vibe-Trading/issues/286), thanks @digger-yu). Scheduled research also picked up end-to-end usage docs ([#288](https://github.com/HKUDS/Vibe-Trading/pull/288)).\n- **2026-06-21** ⏰ **Scheduled-research executor + Reports library + post-backtest attribution**: scheduled research now runs **end to end** — a default-off background executor (`VIBE_TRADING_ENABLE_SCHEDULER`) fires due interval/cron jobs through the session runtime ([#278](https://github.com/HKUDS/Vibe-Trading/pull/278), thanks @mvanhorn, closing [#254](https://github.com/HKUDS/Vibe-Trading/issues/254)). A new **`/reports` Run Library** page lists, searches, and filters report-worthy runs with links into Run Detail + Compare ([#224](https://github.com/HKUDS/Vibe-Trading/pull/224), thanks @LemonCANDY42). And after every backtest the agent now runs **layered attribution** — trade-level winners/losers, beta regression, market-regime analysis, and a Monte Carlo permutation test, gated by data availability and routing ([#280](https://github.com/HKUDS/Vibe-Trading/pull/280), thanks @shadowinlife).\n- **2026-06-20** 🔬 **Research Autopilot loop closes (Phase 3) + loader OHLC integrity guard + 4 academic alphas**: **Research Autopilot** now runs **hypothesis → signal-engine → backtest** end to end — `scaffold_signal_engine` writes a contract-correct engine and `link_autopilot_backtest` feeds run metrics back to the hypothesis (**68 tools**) ([#267](https://github.com/HKUDS/Vibe-Trading/pull/267)). A structural **OHLC sanity check** drops dirty bars (`high < low`, non-positive prices, bad bracketing) centrally at the loader boundary, guarding every data source ([#274](https://github.com/HKUDS/Vibe-Trading/pull/274), thanks @Shizoqua). And the **academic alpha family grows 6 → 10** — Jegadeesh reversal, George-Hwang 52-week-high, Amihud illiquidity, Harvey-Siddique skew (**456 factors**) ([#277](https://github.com/HKUDS/Vibe-Trading/pull/277), thanks @Robin1987China).\n- **2026-06-19** 🚀 **v0.1.10 — Global data layer**: market-data sources grow 10 → 18 (free **Eastmoney / Sina / Stooq / Yahoo** + key-gated **Finnhub / Alpha Vantage / Tiingo / FMP**, ban-risk fallback) plus **18 read-only data tools** (fund flow, dragon-tiger, northbound, margin, block trades, SEC EDGAR + XBRL, financials, options chains, full-market screening…) across A-share / US / HK, all over MCP. Also bundles everything since 0.1.9 — 10 broker connectors, `alpha compare`, the provider-reliability overhaul, and the opt-in data cache. `pip install -U vibe-trading-ai`\n- **2026-06-18** 🔬 **Research Autopilot Phase 1 + a local Data Bridge loader, + a Discord security notice**: new `run_research_autopilot` + `generate_backtest_config` wire **Hypothesis → Research Goal → backtest** end to end (now **50 tools**), and a **`local`** loader reads OHLCV straight from your own **CSV / Parquet / DuckDB** files ([#260](https://github.com/HKUDS/Vibe-Trading/pull/260), [#252](https://github.com/HKUDS/Vibe-Trading/pull/252), thanks @Robin1987China), alongside DeepSeek `DSML` tool-call parsing and an identifier-containment hardening wave. ⚠️ **Security:** the old community Discord invite now points to a server we don't control running a fake Collab.Land wallet-\"verification\" phishing scam — removed everywhere; the **only** official Discord is the HKUDS server ([discord.gg/6TdQnT5xcF](https://discord.gg/6TdQnT5xcF)), and we'll never ask you to connect a wallet.\n- **2026-06-17** 🧩 **Install compatibility + Opus/Kimi provider fixes**: Baseline `pip install vibe-trading-ai` no longer pulls the optional `pyharmonics` / `ta` dependency chain; harmonic detection now lives behind `vibe-trading-ai[harmonic]` while the bundled detector remains available ([#250](https://github.com/HKUDS/Vibe-Trading/pull/250), closes [#249](https://github.com/HKUDS/Vibe-Trading/issues/249)). The agent loop also avoids assistant-prefill handoff messages rejected by Opus 4.8+, and Kimi/Moonshot can override the client `User-Agent` with `MOONSHOT_USER_AGENT` ([#248](https://github.com/HKUDS/Vibe-Trading/pull/248), closes [#246](https://github.com/HKUDS/Vibe-Trading/issues/246) and [#204](https://github.com/HKUDS/Vibe-Trading/issues/204)); follow-up tests now directly cover background-result and auto-compact handoff paths ([#251](https://github.com/HKUDS/Vibe-Trading/pull/251)).\n- **2026-06-16** 🛡️ **Security/API hardening + GLM/Zhipu alias**: Settings writes require auth when configured ([#245](https://github.com/HKUDS/Vibe-Trading/pull/245)); API shell-capable tools require explicit `VIBE_TRADING_ENABLE_SHELL_TOOLS=1` opt-in ([#243](https://github.com/HKUDS/Vibe-Trading/pull/243)); local shutdown requires auth when an API key is configured ([#241](https://github.com/HKUDS/Vibe-Trading/pull/241)); and untrusted loopback-looking hosts are rejected instead of treated as local ([#242](https://github.com/HKUDS/Vibe-Trading/pull/242)). Runtime edges also got cleaned up: Web chat syncs completed attempts ([#236](https://github.com/HKUDS/Vibe-Trading/pull/236)), r",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[project]\nname = \"vibe-trading-ai\"\nversion = \"0.1.10\"\ndescription = \"Natural-language finance research AI agent with backtesting\"\nrequires-python = \">=3.11\"\nlicense = \"MIT\"\nreadme = \"README.md\"\nauthors = [\n    {name = \"HKUDS\", email = \"hkuds@connect.hku.hk\"},\n]\nkeywords = [\"finance\", \"trading\", \"backtesting\", \"agent\", \"swarm\", \"quantitative\"]\nclassifiers = [\n    \"Development Status :: 4 - Beta\",\n    \"Intended Audience :: Financial and Insurance Industry\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Topic :: Office/Business :: Financial :: Investment\",\n]\ndependencies = [\n    \"rich>=13.0.0\",\n    \"pyyaml>=6.0.0\",\n    \"langchain>=1.0.0,<2\",\n    \"langchain-core>=1.0.0,<2\",\n    \"langchain-openai>=1.0.0,<2\",\n    \"langgraph>=1.0.10,<1.1\",\n    \"langgraph-checkpoint>=2.1.0,<5\",\n    \"python-dotenv>=1.0.0\",\n    \"httpx>=0.28.0\",\n    \"defusedxml>=0.7.1\",\n    \"oauth-cli-kit>=0.1.3\",\n    \"pandas>=2.0.0\",\n    \"openpyxl>=3.1.0\",\n    \"python-docx>=1.1.0\",\n    \"python-pptx>=0.6.23\",\n    \"pypdfium2>=4.0.0\",\n    \"Pillow>=10.0.0\",\n    \"numpy>=1.24.0\",\n    \"scipy>=1.10.0\",\n    \"duckdb>=1.2.0\",\n    \"scikit-learn>=1.3.0\",\n    \"joblib>=1.3.0\",\n    \"smartmoneyconcepts>=0.0.1\",\n    \"tushare>=1.2.89\",\n    \"requests>=2.31.0\",\n    \"yfinance>=0.2.30\",\n    \"akshare>=1.12.0\",\n    \"ccxt>=4.0.0\",\n    \"fastapi>=0.104.0\",\n    \"uvicorn[standard]>=0.24.0\",\n    \"pydantic>=2.0.0\",\n    \"python-multipart>=0.0.18\",\n    \"sse-starlette>=1.6.0\",\n    \"fastmcp>=2.14.0\",\n    \"ddgs>=6.0.0\",\n    \"jinja2>=3.1.0\",\n    \"matplotlib>=3.7.0\",\n    \"weasyprint>=60.0\",\n    \"prompt_toolkit>=3.0.0\",\n]\n\n[project.urls]\nHomepage = \"https://vibetrading.wiki/\"\nDocumentation = \"https://vibetrading.wiki/docs/\"\nRepository = \"https://github.com/HKUDS/Vibe-Trading\"\nIssues = \"https://github.com/HKUDS/Vibe-Trading/issues\"\n\n[project.scripts]\nvibe-trading = \"cli:main\"\nvibe-trading-mcp = \"mcp_server:main\"\n\n[tool.setuptools]\npackage-dir = {\"\" = \"agent\"}\npy-modules = [\"api_server\", \"mcp_server\"]\n\n[tool.setuptools.packages.find]\nwhere = [\"agent\"]\ninclude = [\"src*\", \"backtest*\", \"cli*\"]\n\n[tool.setuptools.package-data]\n\"src\" = [\n    \"skills/**/*.md\",\n    \"skills/**/*.yaml\",\n    \"skills/**/*.json\",\n    \"skills/**/*.py\",\n    \"providers/*.json\",\n    \"swarm/presets/*.yaml\",\n    \"shadow_account/templates/*.j2\",\n    \"shadow_account/templates/*.html\",\n    \"shadow_account/templates/*.css\",\n]\n\"backtest\" = [\"*.py\"]\n\"src.factors\" = [\"zoo/**/*.yaml\", \"zoo/**/*.md\", \"zoo/**/NOTICE\"]\n\n[project.optional-dependencies]\nibkr = [\n    \"ib_async>=2.0\",\n]\ndeepseek = [\n    \"langchain-deepseek>=1.0.0,<2\",\n]\nashare = [\n    # Free, no-auth A-share source over BaoStock's TCP protocol; bypasses the\n    # HTTP CDN IP blocks that affect eastmoney-backed sources. The Tencent\n    # A-share loader needs no extra dependency (stdlib HTTP only).\n    \"baostock>=0.8.8\",\n]\nharmonic = [\n    \"pyharmonics>=1.5.0\",\n]\ndev = [\n    \"pytest>=7.0\",\n    \"pytest-cov>=4.0\",\n    \"pytest-socket>=0.7.0\",\n]\n\n[tool.pytest.ini_options]\ntestpaths = [\"agent/tests\"]\npythonpath = [\"agent\"]\nmarkers = [\n    \"unit: Unit tests (fast, no network)\",\n    \"integration: Integration tests (may need network)\",\n]\n\n[tool.ruff]\ntarget-version = \"py311\"\nline-length = 120\nsrc = [\"agent\"]\n\n[tool.coverage.run]\nsource = [\"agent\"]\nomit = [\n    \"agent/tests/*\",\n    \"agent/tests/**/*\",\n    \"agent/**/__init__.py\",\n]\n\n[tool.coverage.report]\nshow_missing = true\nskip_empty = true\nfail_under = 0\nexclude_also = [\n    \"if __name__ == .__main__.\",\n    \"raise NotImplementedError\",\n    \"\\\\.\\\\.\\\\.\",\n]\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"W\"]\nignore = [\"E501\"]\n\n[tool.ruff.lint.per-file-ignores]\n# Alpha zoo files import the full src.factors.base surface verbatim\n# to match research-paper formulas. F401 (unused-import) is noise here;\n# F841 (unused-local-variable) stays active to catch real formula bugs.\n\"agent/src/factors/zoo/**/*.py\" = [\"F401\"]\n",
    "strategic_keywords": [
      "agent",
      "mcp",
      "llm",
      "codegen"
    ],
    "relationship_label": "开发者工具",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 16,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 6,
      "total": 91
    },
    "strategic_score": 91
  },
  {
    "owner": "jackwener",
    "name": "OpenCLI",
    "full_name": "jackwener/OpenCLI",
    "url": "https://github.com/jackwener/OpenCLI",
    "description": "Make Any Website into CLI & Use your logged-in browser by AI agent.",
    "language": "JavaScript",
    "total_stars": 25463,
    "forks": 2527,
    "stars_this_period": 76,
    "source_slice": "javascript",
    "source_slices": [
      "javascript"
    ],
    "metadata": {
      "topics": [
        "ai-agent",
        "ai-agents",
        "ai-tools",
        "browser-automation",
        "browser-use",
        "cli",
        "playwright"
      ],
      "license": "Apache-2.0",
      "open_issues": 189,
      "created_at": "2026-03-14T22:10:23Z",
      "pushed_at": "2026-06-27T18:14:09Z",
      "homepage": "https://opencli.info/",
      "default_branch": "main",
      "forks": 2527,
      "watchers": 55,
      "archived": false,
      "size_kb": 13947
    },
    "readme_content": "# OpenCLI\n\n> **Convert any website into a CLI & run Browser Use on your logged-in Chrome.**\n> Turn websites, browser sessions, Electron apps, and local tools into deterministic interfaces for humans and AI agents.\n> Or run Browser Use against any page — navigate, fill forms, click, extract, automate.\n\n[![中文文档](https://img.shields.io/badge/docs-%E4%B8%AD%E6%96%87-0F766E?style=flat-square)](./README.zh-CN.md)\n[![npm](https://img.shields.io/npm/v/@jackwener/opencli?style=flat-square)](https://www.npmjs.com/package/@jackwener/opencli)\n[![Node.js Version](https://img.shields.io/node/v/@jackwener/opencli?style=flat-square)](https://nodejs.org)\n[![License](https://img.shields.io/npm/l/@jackwener/opencli?style=flat-square)](./LICENSE)\n\nOpenCLI gives you one surface for three different kinds of automation:\n\n- **Use built-in adapters** for sites like Bilibili, Zhihu, Xiaohongshu, Reddit, HackerNews, Twitter/X, and [many more](#built-in-commands).\n- **Let AI Agents operate any website** — install the `opencli-browser` skill in your AI agent (Claude Code, Cursor, etc.), and it can navigate, click, type/fill, extract, and inspect any page through your logged-in browser via `opencli browser` primitives.\n- **Write new adapters** end-to-end with `opencli browser` + the `opencli-adapter-author` skill, which guides from first recon through field decoding, code, and `opencli browser verify`.\n\nIt also works as a **CLI hub** for local tools such as `gh`, `docker`, `longbridge`, `tg`, `discord`, `wx`, `ntn` (Notion), and other binaries you register yourself, plus **desktop app adapters** for Electron apps like Cursor, Trae CN, Codex, Antigravity, ChatGPT, and Trae SOLO.\n\n## Quick Start\n\n### 1. Install OpenCLI\n\nFor desktop use, start with **OpenCLIApp**. It bundles the OpenCLI runtime,\nkeeps the managed `opencli` command installed, and gives you a system tray UI\nfor setup, diagnostics, updates, browser-login keepalive, and Web → Markdown.\n\n**Option A — OpenCLIApp (recommended for macOS / Windows):**\nDownload the latest app from <https://opencli.info/download>, install it, then\nopen the app once and use the System page to install or repair the `opencli`\ncommand.\n\n**Option B — npm global install (CLI-only / CI / servers):**\nOpenCLI requires **Node.js >= 20** when installed through npm.\n\n```bash\nnode --version\nnpm install -g @jackwener/opencli\n```\n\n### 2. Install the Browser Bridge Extension\n\nOpenCLI connects to Chrome/Chromium through a lightweight Browser Bridge extension plus a small local daemon. The daemon auto-starts when needed.\n\n**Option A — Chrome Web Store (recommended):**\nInstall **OpenCLI** from the [Chrome Web Store](https://chromewebstore.google.com/detail/opencli/ildkmabpimmkaediidaifkhjpohdnifk).\n\n**Option B — Manual install:**\n1. Download the latest `opencli-extension-v{version}.zip` from the GitHub [Releases page](https://github.com/jackwener/opencli/releases).\n2. Unzip it, open `chrome://extensions`, and enable **Developer mode**.\n3. Click **Load unpacked** and select the unzipped folder.\n\n### 3. Verify the setup\n\n```bash\nopencli doctor\n```\n\n### 4. Optional: name your Chrome profile\n\nEach Chrome profile runs its own OpenCLI extension instance. If you use multiple Chrome profiles, list the connected profiles and assign local aliases:\n\n```bash\nopencli profile list\nopencli profile rename <contextId> work\nopencli profile use work\nopencli --profile work browser state\n```\n\nWith only one connected profile, OpenCLI uses it automatically. With multiple connected profiles and no default, OpenCLI asks you to choose instead of guessing.\n\n### 5. Run your first commands\n\n```bash\nopencli list\nopencli hackernews top --limit 5\nopencli bilibili hot --limit 5\n```\n\n## For Humans\n\nUse OpenCLI directly when you want a reliable command instead of a live browser session:\n\n- `opencli list` shows every registered command.\n- `opencli <site> <command>` runs a built-in or generated adapter.\n- `opencli external register mycli` exposes a local CLI through the same discovery surface.\n- `opencli doctor` helps diagnose browser connectivity.\n\n## Extending OpenCLI\n\nIf you want to add your own commands, start with the [Extending OpenCLI guide](./docs/guide/extending-opencli.md). README keeps this short; the guide covers the directory layout, source-control model, and install commands.\n\n| Need | Recommended path |\n|------|------------------|\n| Keep personal website commands in your own Git repo | `opencli plugin create` + `opencli plugin install file://...` |\n| Quickly draft a private local adapter | `opencli browser init <site>/<command>` in `~/.opencli/clis/` |\n| Modify an official adapter locally | `opencli adapter eject <site>` + `opencli adapter reset <site>` |\n| Publish or install third-party commands | `opencli plugin install github:user/repo` |\n| Wrap an existing local binary | `opencli external register <name>` |\n\n## For AI Agents\n\nOpenCLI's browser commands are designed to be used by AI Agents — not run manually. Install skills into your AI agent (Claude Code, Cursor, etc.), and the agent operates websites on your behalf using your logged-in Chrome session.\n\n### Install skills (also refreshes existing installs)\n\n```bash\nnpx skills add jackwener/opencli\n```\n\nOr install only what you need:\n\n```bash\nnpx skills add jackwener/opencli --skill opencli-adapter-author\nnpx skills add jackwener/opencli --skill opencli-autofix\nnpx skills add jackwener/opencli --skill opencli-browser\nnpx skills add jackwener/opencli --skill opencli-browser-sitemap\nnpx skills add jackwener/opencli --skill opencli-sitemap-author\nnpx skills add jackwener/opencli --skill opencli-usage\n```\n\n### Which skill to use\n\n| Skill | When to use | Example prompt to your AI agent |\n|-------|------------|-------------------------------|\n| **opencli-adapter-author** | Write a reusable adapter for a new site or add a command to an existing site | \"Write an adapter for douyin trending\" / \"Make a command that grabs the top posts from this page\" |\n| **opencli-autofix** | Repair a broken adapter when a built-in command fails | \"`opencli zhihu hot` is returning empty — fix it\" |\n| **opencli-browser** | Drive a real Chrome page ad-hoc — navigate, fill forms, click, extract | \"Help me check my Xiaohongshu notifications\" / \"Help me fill out this form\" / \"Use browser commands to scrape this page\" |\n| **opencli-browser-sitemap** | Consume site sitemap context while driving a browser task | \"Use the sitemap to navigate this website without blind clicking\" |\n| **opencli-sitemap-author** | Create or update site sitemap knowledge for browser agents | \"Record the stable workflow you just discovered for this site\" |\n| **opencli-usage** | Quick reference for all OpenCLI commands and sites | \"What commands does OpenCLI have for Twitter?\" |\n\n### How it works\n\nOnce `opencli-browser` is installed, your AI agent can:\n\n1. **Navigate** to any URL using your logged-in browser\n2. **Read** page content via structured DOM snapshots (not screenshots)\n3. **Interact** — click buttons, fill forms, select options, press keys\n4. **Extract** data from the page or intercept network API responses\n5. **Wait** for elements, text, or page transitions\n\nThe agent handles all the `opencli browser` commands internally — you just describe what you want done in natural language.\n\n**Skill references:**\n- [`skills/opencli-browser/SKILL.md`](./skills/opencli-browser/SKILL.md) — drive Chrome ad-hoc (navigate, fill forms, click, extract)\n- [`skills/opencli-browser-sitemap/SKILL.md`](./skills/opencli-browser-sitemap/SKILL.md) — use sitemap context while driving a browser task\n- [`skills/opencli-sitemap-author/SKILL.md`](./skills/opencli-sitemap-author/SKILL.md) — create or update site sitemap knowledge\n- [`skills/opencli-adapter-author/SKILL.md`](./skills/opencli-adapter-author/SKILL.md) — write a new adapter end-to-end\n- [`skills/opencli-autofix/SKILL.md`](./skills/opencli-autofix/SKILL.md) — repair broken adapters\n- [`skills/opencli-usage/SKILL.md`](./skills/opencli-usage/SKILL.md) — command and site reference\n\nAvailable browser commands include `open`, `state`, `click`, `type`, `fill`, `select`, `keys`, `wait`, `get`, `find`, `extract`, `frames`, `screenshot`, `scroll`, `back`, `eval`, `network`, `tab list`, `tab new`, `tab select`, `tab close`, `init`, `verify`, and `close`.\n\n`opencli browser` commands require a `<session>` positional immediately after `browser`. `opencli browser work open <url>` and `opencli browser work tab new [url]` both return a target ID. Use `opencli browser work tab list` to inspect target IDs, then pass `--tab <targetId>` to route a command to a specific tab. `tab new` creates a new tab without changing the default browser target; only `tab select <targetId>` promotes that tab to the default target for later untargeted commands in the same session.\n\n## Writing a new adapter\n\nWhen the site you need is not yet covered, use the `opencli-adapter-author` skill end-to-end:\n\n1. **Recon** the site and pick a pattern (SPA / SSR / JSONP / Token / Streaming).\n2. **Discover** the right endpoint — network inspection, initial state, bundle search, token trace, or interceptor fallback.\n3. **Pick auth** — `PUBLIC` / `COOKIE` / `INTERCEPT` / `UI` / `LOCAL`.\n4. **Decode** response fields and design output columns.\n5. `opencli browser recon analyze <url>` → `opencli browser recon init <site>/<name>` → write adapter → `opencli browser recon verify <site>/<name>`.\n6. Site knowledge persists to `~/.opencli/sites/<site>/` so the next adapter for the same site starts from context.\n\n## Configuration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `OPENCLI_PROFILE` | — | Browser Bridge profile alias/contextId to use when multiple Chrome profiles are connected |\n| `OPENCLI_WINDOW` | command default | Set to `foreground` or `background` to override Browser Bridge window placement. Browser-backed commands also accept `--window <foreground\\|background>`. |\n| `OPENCLI_BROWSER_CONNECT_TIMEOUT` | `45` | Seconds to wait for browser connection |\n| `OPENCLI_BROWSER_COMMAND_TIMEOUT` | `60` | Seconds to wait for a single browser command |\n| `OPENCLI_CDP_ENDPOINT` | — | Chrome DevTools Protocol endpoint for remote browser or Electron apps |\n| `OPENCLI_CDP_TARGET` | — | Filter CDP targets by URL substring (e.g. `detail.1688.com`) |\n| `OPENCLI_VERBOSE` | `false` | Enable verbose logging (`-v` flag also works) |\n| `DEBUG_SNAPSHOT` | — | Set to `1` for DOM snapshot debug output |\n\n`opencli browser *` requires an explicit `<session>` positional, uses a foreground browser window by default, and keeps that session's tab lease until `opencli browser <session> close` or idle cleanup. Browser-backed adapters use a background adapter window and release one-shot tab leases by default. Interactive adapters can declare `siteSession: 'persistent'` to keep a stable site tab for continuity; pass `--site-session ephemeral` for a one-shot tab.\n\n## Built-in Commands\n\n| Site | Commands |\n|------|----------|\n| **xiaohongshu** | `search` `ask` `note` `comments` `feed` `user` `download` `publish` `follow` `unfollow` `notifications` `creator-notes` `creator-notes-summary` `creator-note-detail` `creator-profile` `creator-stats` |\n| **bilibili** | `hot` `search` `history` `feed` `ranking` `download` `comments` `dynamic` `favorite` `following` `follow` `unfollow` `me` `subtitle` `summary` `video` `user-videos` |\n| **zhihu** | `hot` `search` `question` `download` `follow` `like` `favorite` `comment` `answer` |\n| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` |\n| **geogebra** | `eval` `add-point` `add-line` `add-circle` `add-polygon` `triangle` `hexagon` `list` `info` |\n| **linkedin** | `connect` `inbox` `job-detail` `jobs-preferences` `post-analytics` `posts` `profile-experience` `profile-projects` `profile-read` `profile-analytics` `safe-send` `search` `services-read` `sent-invitations` `thread-snapshot` `timeline` `salesnav-search` `salesnav-inbox` `salesnav-message` `salesnav-thread` ",
    "manifest_file": "package.json",
    "manifest_content": "{\n  \"name\": \"@jackwener/opencli\",\n  \"version\": \"1.8.5\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"description\": \"Make any website or Electron App your CLI. AI-powered.\",\n  \"engines\": {\n    \"node\": \">=20.0.0\"\n  },\n  \"type\": \"module\",\n  \"main\": \"dist/src/main.js\",\n  \"bin\": {\n    \"opencli\": \"dist/src/main.js\"\n  },\n  \"exports\": {\n    \".\": \"./dist/src/main.js\",\n    \"./registry\": \"./dist/src/registry-api.js\",\n    \"./errors\": \"./dist/src/errors.js\",\n    \"./types\": \"./dist/src/types.js\",\n    \"./utils\": \"./dist/src/utils.js\",\n    \"./logger\": \"./dist/src/logger.js\",\n    \"./launcher\": \"./dist/src/launcher.js\",\n    \"./browser/cdp\": \"./dist/src/browser/cdp.js\",\n    \"./browser/page\": \"./dist/src/browser/page.js\",\n    \"./browser/utils\": \"./dist/src/browser/utils.js\",\n    \"./download\": \"./dist/src/download/index.js\",\n    \"./download/article-download\": \"./dist/src/download/article-download.js\",\n    \"./download/media-download\": \"./dist/src/download/media-download.js\",\n    \"./download/progress\": \"./dist/src/download/progress.js\",\n    \"./pipeline\": \"./dist/src/pipeline/index.js\"\n  },\n  \"files\": [\n    \"dist/src/\",\n    \"clis/\",\n    \"skills/opencli-*/**\",\n    \"cli-manifest.json\",\n    \"scripts/\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"dev\": \"tsx src/main.ts\",\n    \"dev:bun\": \"bun src/main.ts\",\n    \"build\": \"npm run clean-dist && npm run copy-yaml && npm run build-manifest\",\n    \"prebuild-manifest\": \"tsc --build && node -e \\\"require('fs').chmodSync('dist/src/main.js', 0o755)\\\"\",\n    \"build-manifest\": \"tsx src/build-manifest.ts\",\n    \"clean-dist\": \"node scripts/clean-dist.cjs\",\n    \"copy-yaml\": \"node scripts/copy-yaml.cjs\",\n    \"start\": \"node dist/src/main.js\",\n    \"start:bun\": \"bun dist/src/main.js\",\n    \"preuninstall\": \"node -e \\\"fetch('http://127.0.0.1:19825/shutdown',{method:'POST',headers:{'X-OpenCLI':'1'},signal:AbortSignal.timeout(3000)}).catch(()=>{})\\\" || true\",\n    \"postinstall\": \"node scripts/postinstall.js || true; node scripts/fetch-adapters.js || true\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"prepare\": \"[ -d src ] && npm run build || true\",\n    \"prepublishOnly\": \"npm run build\",\n    \"test\": \"vitest run --project unit --project extension --project adapter\",\n    \"test:bun\": \"bun vitest run --project unit --project extension --project adapter\",\n    \"test:adapter\": \"vitest run --project adapter\",\n    \"test:all\": \"vitest run\",\n    \"test:e2e\": \"vitest run --project e2e-fixed-port --project e2e\",\n    \"advise:listing-id-pairing\": \"node scripts/check-listing-id-pairing.mjs\",\n    \"check:silent-column-drop\": \"node scripts/check-silent-column-drop.mjs\",\n    \"check:typed-error-lint\": \"node scripts/check-typed-error-lint.mjs\",\n    \"docs:dev\": \"vitepress dev docs\",\n    \"docs:build\": \"vitepress build docs\",\n    \"docs:preview\": \"vitepress preview docs\"\n  },\n  \"keywords\": [\n    \"cli\",\n    \"browser\",\n    \"web\",\n    \"ai\"\n  ],\n  \"author\": \"jackwener\",\n  \"license\": \"Apache-2.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jackwener/opencli.git\"\n  },\n  \"dependencies\": {\n    \"@mozilla/readability\": \"^0.6.0\",\n    \"cli-table3\": \"^0.6.5\",\n    \"commander\": \"^14.0.3\",\n    \"js-yaml\": \"^4.1.0\",\n    \"turndown\": \"^7.2.2\",\n    \"turndown-plugin-gfm\": \"^1.0.2\",\n    \"undici\": \"^6.27.0\",\n    \"ws\": \"^8.18.0\"\n  },\n  \"devDependencies\": {\n    \"@types/jsdom\": \"^27.0.0\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/node\": \"^25.5.2\",\n    \"@types/turndown\": \"^5.0.6\",\n    \"@types/ws\": \"^8.5.13\",\n    \"jsdom\": \"^29.0.2\",\n    \"tsx\": \"^4.19.3\",\n    \"typescript\": \"^6.0.2\",\n    \"vitepress\": \"^1.6.4\",\n    \"vitest\": \"^4.1.0\"\n  },\n  \"overrides\": {\n    \"postcss\": \"^8.5.10\",\n    \"vitepress\": {\n      \"vite\": \"6.4.2\"\n    }\n  }\n}\n",
    "strategic_keywords": [
      "agent",
      "agents",
      "runtime",
      "skill",
      "automation"
    ],
    "relationship_label": "Memory 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "package.json"
    ],
    "score_breakdown": {
      "heat": 14,
      "relevance": 20,
      "novelty": 15,
      "productize": 14,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 91
    },
    "strategic_score": 91
  },
  {
    "owner": "Panniantong",
    "name": "Agent-Reach",
    "full_name": "Panniantong/Agent-Reach",
    "url": "https://github.com/Panniantong/Agent-Reach",
    "description": "Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.",
    "language": "Python",
    "total_stars": 43412,
    "forks": 3452,
    "stars_this_period": 1159,
    "source_slice": "python",
    "source_slices": [
      "python"
    ],
    "metadata": {
      "topics": [
        "agent-infrastructure",
        "ai-agent",
        "ai-search",
        "automation",
        "bilibili",
        "claude-code",
        "cli",
        "cursor",
        "free-api",
        "llm-tools",
        "mcp",
        "python",
        "reddit-scraper",
        "twitter-scraper",
        "web-scraper",
        "xiaohongshu",
        "youtube-transcript"
      ],
      "license": "MIT",
      "open_issues": 114,
      "created_at": "2026-02-24T02:10:24Z",
      "pushed_at": "2026-06-23T13:04:55Z",
      "homepage": "",
      "default_branch": "main",
      "forks": 3452,
      "watchers": 124,
      "archived": false,
      "size_kb": 1571
    },
    "readme_content": "<h1 align=\"center\">👁️ Agent Reach</h1>\n\n<p align=\"center\">\n  <strong>给你的 AI Agent 一键装上互联网能力</strong>\n</p>\n\n<p align=\"center\">\n  当下最稳的接入方式，替你选好、装好、体检好——接入方式会换代，你不用操心\n</p>\n\n<p align=\"center\">\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge\" alt=\"MIT License\"></a>\n  <a href=\"https://www.python.org/\"><img src=\"https://img.shields.io/badge/Python-3.10+-green.svg?style=for-the-badge&logo=python&logoColor=white\" alt=\"Python 3.10+\"></a>\n  <a href=\"https://github.com/Panniantong/agent-reach/stargazers\"><img src=\"https://img.shields.io/github/stars/Panniantong/agent-reach?style=for-the-badge\" alt=\"GitHub Stars\"></a>\n  <a href=\"https://trendshift.io/repositories/24387\"><img src=\"https://trendshift.io/api/badge/repositories/24387\" alt=\"Trendshift GitHub Trending #1 Repository of the Day\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#快速上手\">快速开始</a> · <a href=\"docs/README_en.md\">English</a> · <a href=\"docs/README_ja.md\">日本語</a> · <a href=\"docs/README_ko.md\">한국어</a> · <a href=\"#支持的平台\">支持平台</a> · <a href=\"#设计理念\">设计理念</a>\n</p>\n\n---\n\n## 为什么需要 Agent Reach？\n\nAI Agent 已经能帮你写代码、改文档、管项目——但你让它去网上找点东西，它就抓瞎了：\n\n- 📺 \"帮我看看这个 YouTube 教程讲了什么\" → **看不了**，拿不到字幕\n- 🐦 \"帮我搜一下推特上大家怎么评价这个产品\" → **搜不了**，Twitter API 要付费\n- 📖 \"去 Reddit 上看看有没有人遇到过同样的 bug\" → **403 被封**，服务器 IP 被拒\n- 📕 \"帮我看看小红书上这个品的口碑\" → **打不开**，必须登录才能看\n- 📺 \"B站上有个技术视频，帮我总结一下\" → **拿不到**，通用下载工具被 B站风控全面拦截\n- 🔍 \"帮我在网上搜一下最新的 LLM 框架对比\" → **没有好用的搜索**，要么付费要么质量差\n- 🌐 \"帮我看看这个网页写了啥\" → **抓回来一堆 HTML 标签**，根本没法读\n- 📦 \"这个 GitHub 仓库是干嘛的？Issue 里说了什么？\" → 能用，但认证配置很麻烦\n- 📡 \"帮我订阅这几个 RSS 源，有更新告诉我\" → 要自己装库写代码\n\n**这些不难实现，但是需要自己折腾配置**\n\n每个平台都有自己的门槛——要付费的 API、要绕过的封锁、要登录的账号、要清洗的数据。你要一个一个去踩坑、装工具、调配置，光是让 Agent 能读个推特就得折腾半天。\n\n**Agent Reach 把这件事变成一句话：**\n\n```\n帮我安装 Agent Reach：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md\n```\n\n复制给你的 Agent，几分钟后它就能读推特、搜 Reddit、看 YouTube、刷小红书了。\n\n**已经装过了？更新也是一句话：**\n\n```\n帮我更新 Agent Reach：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/update.md\n```\n\n> ⭐ **Star 这个项目**，我们会持续追踪各平台的变化、接入新的渠道。你不用自己盯——平台封了我们修，有新渠道我们加。\n\n### ✅ 在你用之前，你可能想知道\n\n| | |\n|---|---|\n| 💰 **完全免费** | 所有工具开源、所有 API 免费。唯一可能花钱的是服务器代理（$1/月），本地电脑不需要 |\n| 🔒 **隐私安全** | Cookie 只存在你本地，不上传不外传。代码完全开源，随时可审查 |\n| 🔄 **持续换代** | 每个平台都是「首选 + 备选」多后端路由。某个接入方式失效了，我们换下一个，你无感（2026-06 实例：yt-dlp 被 B站风控封死 → 已切换 bili-cli，用户零操作） |\n| 🤖 **兼容所有 Agent** | Claude Code、OpenClaw、Cursor、Windsurf……任何能跑命令行的 Agent 都能用 |\n| 🩺 **自带诊断** | `agent-reach doctor` 一条命令告诉你哪个通、哪个不通、怎么修 |\n\n---\n\n## 支持的平台\n\n| 平台 | 装好即用 | 配置后解锁 | 怎么配 |\n|------|---------|-----------|-------|\n| 🌐 **网页** | 阅读任意网页 | — | 无需配置 |\n| 📺 **YouTube** | 字幕提取 + 视频搜索 | — | 无需配置 |\n| 📡 **RSS** | 阅读任意 RSS/Atom 源 | — | 无需配置 |\n| 🔍 **全网搜索** | — | 全网语义搜索 | 自动配置（MCP 接入，免费无需 Key） |\n| 📦 **GitHub** | 读公开仓库 + 搜索 | 私有仓库、提 Issue/PR、Fork | 告诉 Agent「帮我登录 GitHub」 |\n| 🐦 **Twitter/X** | 读单条推文 | 搜索推文、浏览时间线、读长文 | 告诉 Agent「帮我配 Twitter」 |\n| 📺 **B站** | 搜索 + 视频详情（bili-cli，无需登录） | 字幕（OpenCLI） | 告诉 Agent「帮我配 B站」 |\n| 📖 **Reddit** | —（没有零配置路径：匿名接口已被封） | 搜索 + 读帖子和评论 | 桌面装 OpenCLI 用浏览器登录态；或 rdt-cli + Cookie |\n| 📕 **小红书** | — | 搜索、阅读、评论 | 桌面装 OpenCLI（刷过小红书即可用）；服务器用 xiaohongshu-mcp 扫码 |\n| 💼 **LinkedIn** | Jina Reader 读公开页面 | Profile 详情、公司页面、职位搜索 | 告诉 Agent「帮我配 LinkedIn」 |\n| 💻 **V2EX** | 热门帖子、节点帖子、帖子详情+回复、用户信息 | — | 无需配置 |\n| 📈 **雪球** | 股票行情、搜索股票、热门帖子、热门股票排行 | — | 告诉 Agent「帮我配雪球」 |\n| 🎙️ **小宇宙播客** | — | 播客音频转文字（Whisper 转录，免费 Key） | 告诉 Agent「帮我配小宇宙播客」 |\n\n> **不知道怎么配？不用查文档。** 直接告诉 Agent「帮我配 XXX」，它知道需要什么、会一步一步引导你。\n>\n> 🍪 需要 Cookie 的平台（Twitter、小红书等），**优先使用** Chrome 插件 [Cookie-Editor](https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm) 导出 Cookie，发给 Agent 即可配置。流程统一：浏览器登录 → Cookie-Editor 导出 → 发给 Agent。比扫码更简单可靠。\n>\n> 🔒 Cookie 只存在你本地，不上传不外传。代码完全开源，随时可审查。\n> 💻 本地电脑不需要代理。代理只有部署在服务器上才需要（~$1/月）。\n\n---\n\n## 快速上手\n\n> ⚠️ **OpenClaw 用户请先确认 exec 权限已开启**\n>\n> Agent Reach 依赖 Agent 执行 shell 命令（`pip install`、`mcporter`、`twitter` 等）。如果你的 OpenClaw 使用了默认的 `messaging` 工具配置，Agent 将无法执行命令。**安装前请先开启 exec 权限**：\n>\n> ```bash\n> openclaw config set tools.profile \"coding\"\n> ```\n> 或在 `~/.openclaw/openclaw.json` 中设置 `\"tools\": { \"profile\": \"coding\" }`。\n> 设置后重启 Gateway（`openclaw gateway restart`）并开启新对话即可。其他平台（Claude Code、Cursor、Windsurf 等）不受此限制。\n\n复制这句话给你的 AI Agent（Claude Code、OpenClaw、Cursor 等）：\n\n```\n帮我安装 Agent Reach：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md\n```\n\n就这一步。Agent 会自己完成剩下的所有事情。\n\n> 🔄 **已安装过？** 更新也是一句话：\n> ```\n> 帮我更新 Agent Reach：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/update.md\n> ```\n\n> 🛡️ **担心安全？** 可以用安全模式——不会自动装系统包，只告诉你需要什么：\n> ```\n> 帮我安装 Agent Reach（安全模式）：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md\n> 安装时使用 --safe 参数\n> ```\n\n<details>\n<summary>它会做什么？（点击展开）</summary>\n\n1. **安装 CLI 工具** — `pip install` 装好 `agent-reach` 命令行（自带 yt-dlp、feedparser）\n2. **安装系统基建** — 自动检测并安装 Node.js、gh CLI、mcporter\n3. **配置搜索引擎** — 通过 MCP 接入 Exa（免费，无需 API Key）\n4. **检测环境** — 判断是本地电脑还是服务器，给出对应的配置建议\n5. **注册 SKILL.md** — 在 Agent 的 skills 目录安装使用指南，以后 Agent 遇到\"全网调研\"、\"搜推特\"、\"看视频\"这类需求，会自动知道该调哪个上游工具\n6. **问你要不要更多** — 默认只激活 6 个零配置渠道；小红书、Twitter、Reddit 这些需要登录的，Agent 会列菜单问你要哪些，点名才装\n\n安装完之后，`agent-reach doctor` 一条命令告诉你每个渠道的状态、当前走哪条路。\n</details>\n\n---\n\n## 装好就能用\n\n不需要任何配置，告诉 Agent 就行：\n\n- \"帮我看看这个链接\" → `curl https://r.jina.ai/URL` 读任意网页\n- \"这个 GitHub 仓库是做什么的\" → `gh repo view owner/repo`\n- \"这个 YouTube 视频讲了什么\" → `yt-dlp` 提取字幕\n- \"B站搜一下 AI 教程\" → `bili search`（无需登录）\n- \"全网搜一下 LLM 框架对比\" → Exa 语义搜索\n- \"订阅这个 RSS\" → `feedparser` 解析\n\n**不需要记命令。** Agent 读了 SKILL.md 之后自己知道该调什么。需要登录的平台（小红书、Twitter、Reddit），告诉 Agent「帮我配 XXX」即可解锁。\n\n---\n\n## 能力边界：读内容 vs 操作网页\n\n有些任务超出\"读\"的范围：登录后的网页操作、表单提交、多账号隔离、并行浏览器会话、自动化流程中的登录、验证、风控提示等高摩擦环节的人工接手。这类\"动手\"场景，可以配合 [BrowserAct](https://www.browseract.ai/Agent) 这类浏览器自动化工具——30+ 预制平台技能，支持 Claude Code / OpenClaw / Cursor 等主流 Agent。\n\n---\n\n## 设计理念\n\n**Agent Reach 是一个能力层（capability layer），不是又一个工具。**\n\n它比任何具体实现高一层——负责**选型、安装、体检、路由**，不负责底层读取本身。读取由 Agent 直接调用上游工具完成，没有包装层。\n\n你给一个新 Agent 装环境的时候，总要花时间去找工具、装依赖、调配置——Twitter 用什么读？Reddit 怎么登录？小红书的 CLI 停更了换什么？每次都要重新踩一遍。Agent Reach 做的事情很简单：**当下最稳的接入方式，我们替你选好、装好、体检好。接入方式会换代（2026 年 3 月一批单平台 CLI 集体停更，我们换了路由），你不用操心。**\n\n### 🔌 每个平台 = 首选 + 备选的有序后端列表\n\n换接入方式 = 调整列表顺序，不是重写代码。`agent-reach doctor` 会告诉你每个平台**当前在用哪个后端**。\n\n```\nchannels/\n├── web.py          → Jina Reader\n├── twitter.py      → twitter-cli ▸ OpenCLI ▸ bird\n├── youtube.py      → yt-dlp\n├── github.py       → gh CLI\n├── bilibili.py     → bili-cli ▸ OpenCLI ▸ 搜索 API（yt-dlp 已被 B站风控封死，退役）\n├── reddit.py       → OpenCLI ▸ rdt-cli（无零配置路径，必须登录态）\n├── xiaohongshu.py  → OpenCLI ▸ xiaohongshu-mcp ▸ xhs-cli\n├── linkedin.py     → linkedin-mcp ▸ Jina Reader\n├── rss.py          → feedparser\n├── exa_search.py   → Exa via mcporter\n└── __init__.py     → 渠道注册（doctor 检测用）\n```\n\n每个渠道文件按序**真实探测**各候选后端（不只是看命令存不存在），第一个完整可用的当选；坏掉的会给出修复处方。实际的读取和搜索由 Agent 直接调用上游工具完成。\n\n### 当前选型\n\n| 场景 | 首选 | 备选 | 为什么这么选 |\n|------|------|------|-----------|\n| 读网页 | [Jina Reader](https://github.com/jina-ai/reader) | — | 免费，不需要 API Key |\n| 读推特 | [twitter-cli](https://github.com/public-clis/twitter-cli) | [OpenCLI](https://github.com/jackwener/opencli) | 实测搜索稳定；OpenCLI 走浏览器登录态兜底 |\n| Reddit | [OpenCLI](https://github.com/jackwener/opencli)（桌面） | [rdt-cli](https://github.com/public-clis/rdt-cli) | 匿名接口已被封、官方 API 审批制——只剩登录态路线 |\n| YouTube 字幕 + 搜索 | [yt-dlp](https://github.com/yt-dlp/yt-dlp) | — | 154K Star，YouTube 仍是最佳（注意：不再用于 B站） |\n| B站 | [bili-cli](https://github.com/public-clis/bilibili-cli) | OpenCLI ▸ 搜索 API | yt-dlp 被 B站风控 412 封死（2026-06 实测），bili-cli 无登录可搜可读 |\n| 搜全网 | [Exa](https://exa.ai) via [mcporter](https://github.com/nicobailon/mcporter) | — | AI 语义搜索，MCP 接入免 Key |\n| GitHub | [gh CLI](https://cli.github.com) | — | 官方工具，认证后完整 API 能力 |\n| 读 RSS | [feedparser](https://github.com/kurtmckee/feedparser) | — | Python 生态标准选择 |\n| 小红书 | [OpenCLI](https://github.com/jackwener/opencli)（桌面） | [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp)（服务器）▸ xhs-cli | xhs-cli 作者已转投 OpenCLI（24K Star）；浏览器登录态零摩擦 |\n| LinkedIn | [linkedin-scraper-mcp](https://github.com/stickerdaniel/linkedin-mcp-server) | Jina Reader | MCP 服务，浏览器自动化 |\n\n> 📌 这些都是「当前选型」，基于真机实测定期复核。某条路失效了我们换下一条——`agent-reach doctor` 永远告诉你现在走的是哪条。\n\n---\n\n## 安全性\n\nAgent Reach 在设计上重视安全：\n\n| 措施 | 说明 |\n|------|------|\n| 🔒 **凭据本地存储** | Cookie、Token 只存在你本机 `~/.agent-reach/config.yaml`，文件权限 600（仅所有者可读写），不上传不外传 |\n| 🛡️ **安全模式** | `agent-reach install --safe` 不会自动修改系统，只列出需要什么，由你决定装不装 |\n| 👀 **完全开源** | 代码透明，随时可审查。所有依赖工具也是开源项目 |\n| 🔍 **Dry Run** | `agent-reach install --dry-run` 预览所有操作，不做任何改动 |\n| 🧩 **可插拔架构** | 不信任某个组件？换掉对应的 channel 文件即可，不影响其他 |\n\n### 🍪 Cookie 安全建议\n\n> ⚠️ **封号风险提醒：** 使用 Cookie 登录的平台（Twitter、小红书等），通过脚本/API 调用**存在被平台检测并封号的风险**。请务必使用**专用小号**，不要用你的主账号。\n\n需要 Cookie 的平台（Twitter、小红书）建议使用**专用小号**，不要用主账号。原因有二：\n1. **封号风险** — 平台可能检测到非正常浏览器的 API 调用行为，导致账号被限制或封禁\n2. **安全风险** — Cookie 等同于完整登录权限，用小号可以在凭据泄露时限制影响范围\n\n### 📦 安装方式\n\n| 方式 | 命令 | 适合场景 |\n|------|------|---------|\n| 一键全自动（默认） | `agent-reach install --env=auto` | 个人电脑、开发环境 |\n| 安全模式 | `agent-reach install --env=auto --safe` | 生产服务器、多人共用机器 |\n| 仅预览 | `agent-reach install --env=auto --dry-run` | 先看看会做什么 |\n\n### 🗑️ 卸载\n\n```bash\nagent-reach uninstall\n```\n\n会清除：`~/.agent-reach/`（含所有 token/cookie）、各 Agent 的 skill 文件、mcporter 中的 MCP 配置。\n\n```bash\n# 只预览，不实际删除\nagent-reach uninstall --dry-run\n\n# 只删 skill 文件，保留 token 配置（重装时用）\nagent-reach uninstall --keep-config\n```\n\n卸载 Python 包本身：`pip uninstall agent-reach`\n\n---\n\n## 贡献\n\n这个项目是纯 vibe coding 出来的 🎸 可能会有一些不完美的地方，如果遇到问题请多多包涵。有 bug 尽管提 [Issue](https://github.com/Panniantong/agent-reach/issues)，我都会尽快修复。\n\n**想要新渠道？** 直接提 Issue 告诉我们，或者自己提 PR。\n\n**想在本地加？** 让你的 Agent clone 下来改就行，每个渠道就是一个独立文件，加起来很简单。\n\n[PR](https://github.com/Panniantong/agent-reach/pulls) 也随时欢迎！\n\n---\n\n## ⭐ 为什么值得 Star\n\n这个项目我自己每天在用，所以我会一直维护它。\n\n- 有新需求或者大家提了想要的渠道，我会陆续加上\n- 每个渠道我会尽量保证**能用、好用、免费**\n- 平台改了反爬或者 API 变了，我会想办法解决\n\n为 Web 4.0 基建贡献一份自己的力量。\n\nStar 一下，下次需要的时候能找到。⭐\n\n---\n\n## 常见问题 / FAQ\n\n<details>\n<summary><strong>AI Agent 怎么搜索 Twitter / X？不想付 API 费用</strong></summary>\n\nAgent Reach 使用 [twitter-cli](https://github.com/public-clis/twitter-cli) 通过 Cookie 认证访问 Twitter，完全免费。安装：`pipx install twitter-cli`，确保浏览器已登录 x.com，Agent 就可以用 `twitter search \"关键词\"` 搜索、`twitter tweet URL` 读推文了。\n</details>\n\n<details>\n<summary><strong>How to search Twitter/X with AI agent for free (no API)?</strong></summary>\n\nAgent Reach uses twitter-cli with cookie auth — zero API fees. Install with `pipx install twitter-cli`, make sure you're logged into x.com in your browser, then your agent can search with `twitter search \"query\"` and read tweets with `twitter tweet URL`.\n</details>\n\n<details>\n<summary><strong>Reddit 返回 403 怎么办？</strong></summary>\n\nReddit 所有访问都需要登录态（匿名接口已被全面封锁，官方 API 需人工审批）。桌面首选 **OpenCLI**：浏览器里登录过 reddit.com 即可直接 `opencli reddit search \"关键词\"`。备选 [rdt-cli](https://github.com/public-clis/rdt-cli)：`pipx install 'git+https://github.com/public-clis/rdt-cli.git@5e4fb3720d5c174e976cd425ccc3b879d52cac66'`（与代码同一钉定版本，PyPI 落后），然后 `rdt login`。中国大陆网络访问 Reddit 需要代理。\n</details>\n\n<details>\n<summary><strong>How to get YouTube video transcripts for AI?</strong></summary>\n\n`yt-dlp --dump-json \"https://youtube.com/watch?v=xxx\"` extracts video metadata; `yt-dlp --write-sub --skip-download \"URL\"` extracts subtitles. Uses yt-dlp under the hood, supports multiple languages. No API key needed.\n</details>\n\n<details>\n<summary><strong>怎么让 AI Agent 读小红书？</strong></summary>\n\n桌面电脑首选 **OpenCLI**（`agent-reach install --channels opencli`）——它复用你浏览器里的登录态，平时刷过小红书就直接能用，零配置；装完在 Chrome 商店点一次「添加扩展」即可。之后 Agent 用 `opencli xiaohongshu search \"关键词\"` 搜索、`opencli xiaohongshu note URL` 读笔记。服务器上用 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp)（自带无头浏览器，扫码登录）。已装过 xhs-cli 的老用户不受影响，它仍是备选后端（上游 2026-03 起停更，不推荐新装）。\n</details>\n\n<details>\n<summary><strong>Compatible with Claude Code / Cursor / OpenClaw / Windsurf?</strong></summary>\n\nYes! Agent Reach is an installer + configuration tool — any AI coding agent that can run shell commands can use it. Works with Claude Code, Cursor, OpenClaw, Windsurf, Codex, and more. Just `pip install agent-reach`, run `agent-reach install`, and the agent can start using the upstream tools immediately.\n\n",
    "manifest_file": "pyproject.toml",
    "manifest_content": "[project]\nname = \"agent-reach\"\nversion = \"1.5.0\"\ndescription = \"Give your AI Agent eyes to see the entire internet. Search + Read 10+ platforms.\"\nreadme = \"README.md\"\nlicense = {text = \"MIT\"}\nrequires-python = \">=3.10\"\nauthors = [{name = \"Neo Reid\"}]\nkeywords = [\n    \"ai-agent\", \"llm-tools\", \"agent-infrastructure\", \"mcp\",\n    \"web-reader\", \"web-scraper\", \"search\",\n    \"twitter-scraper\", \"reddit-scraper\", \"youtube-transcript\",\n    \"bilibili\", \"xiaohongshu\",\n    \"ai-search\", \"cli\", \"automation\",\n    \"claude-code\", \"cursor\", \"openai\",\n    \"free-api\", \"no-api-key\",\n]\nclassifiers = [\n    \"Development Status :: 4 - Beta\",\n    \"Intended Audience :: Developers\",\n    \"License :: OSI Approved :: MIT License\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Topic :: Internet :: WWW/HTTP\",\n    \"Topic :: Scientific/Engineering :: Artificial Intelligence\",\n]\n\ndependencies = [\n    \"requests>=2.28\",\n    \"feedparser>=6.0\",\n    \"python-dotenv>=1.0\",\n    \"loguru>=0.7\",\n    \"pyyaml>=6.0\",\n    \"rich>=13.0\",\n    \"yt-dlp>=2024.0\",\n]\n\n[project.optional-dependencies]\nbrowser = [\"playwright>=1.40\"]\ncookies = [\"browser-cookie3>=0.19\"]\nall = [\"playwright>=1.40\", \"mcp[cli]>=1.0\", \"browser-cookie3>=0.19\"]\ndev = [\n    \"pytest>=8.0\",\n    \"ruff>=0.8\",\n    \"mypy>=1.12\",\n    \"types-requests>=2.32\",\n    \"types-PyYAML>=6.0\",\n]\n\n[project.scripts]\nagent-reach = \"agent_reach.cli:main\"\n\n[project.urls]\nHomepage = \"https://github.com/Panniantong/agent-reach\"\nRepository = \"https://github.com/Panniantong/agent-reach\"\nIssues = \"https://github.com/Panniantong/agent-reach/issues\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"agent_reach\"]\n\n[tool.ruff]\ntarget-version = \"py310\"\nline-length = 100\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\"]\nignore = [\"E501\"]\n\n[tool.mypy]\npython_version = \"3.10\"\nwarn_unused_configs = true\nwarn_redundant_casts = true\nwarn_unused_ignores = true\ncheck_untyped_defs = true\nignore_missing_imports = true\nexclude = [\"^tests/\"]\n",
    "strategic_keywords": [
      "agent",
      "mcp",
      "llm",
      "automation"
    ],
    "relationship_label": "Workspace 组件",
    "data_confidence": "high",
    "evidence_sources": [
      "github_trending",
      "github_repo_api",
      "readme",
      "pyproject.toml"
    ],
    "score_breakdown": {
      "heat": 20,
      "relevance": 20,
      "novelty": 11,
      "productize": 11,
      "adoption": 10,
      "relation": 10,
      "risk_signal": 8,
      "total": 90
    },
    "strategic_score": 90
  }
]