{
  "canonical_name": "Inferensys/contextful",
  "compilation_id": "pack_235cb6e69712474abca1541ca98c9956",
  "created_at": "2026-05-16T04:52:53.224695+00:00",
  "created_by": "project-pack-compiler",
  "feedback": {
    "carrier_selection_notes": [
      "viable_asset_types=skill, recipe, host_instruction, eval, preflight",
      "recommended_asset_types=skill, recipe, host_instruction, eval, preflight"
    ],
    "evidence_delta": {
      "confirmed_claims": [
        "identity_anchor_present",
        "capability_and_host_targets_present",
        "install_path_declared_or_better"
      ],
      "missing_required_fields": [],
      "must_verify_forwarded": [
        "Run or inspect `npx @inferensys/contextful` in an isolated environment.",
        "Confirm the project exposes the claimed capability to at least one target host."
      ],
      "quickstart_execution_scope": "allowlisted_sandbox_smoke",
      "sandbox_command": "npx @inferensys/contextful",
      "sandbox_container_image": "node:22-slim",
      "sandbox_execution_backend": "docker",
      "sandbox_planner_decision": "deterministic_isolated_install",
      "sandbox_validation_id": "sbx_81c822c974f54856a37fab77c6cb7ef9"
    },
    "feedback_event_type": "project_pack_compilation_feedback",
    "learning_candidate_reasons": [],
    "template_gaps": []
  },
  "identity": {
    "canonical_id": "project_6d1d87fdbc61f0de69507804647868c0",
    "canonical_name": "Inferensys/contextful",
    "homepage_url": null,
    "license": "unknown",
    "repo_url": "https://github.com/Inferensys/contextful",
    "slug": "contextful",
    "source_packet_id": "phit_c356bced3c75459ebd1856c19e32d434",
    "source_validation_id": "dval_a57d47da1eb34bfc9406efeb91587234"
  },
  "merchandising": {
    "best_for": "需要信息检索与知识管理能力，并使用 claude的用户",
    "github_forks": 0,
    "github_stars": 0,
    "one_liner_en": "Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory.",
    "one_liner_zh": "Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory.",
    "primary_category": {
      "category_id": "research-knowledge",
      "confidence": "high",
      "name_en": "Research & Knowledge",
      "name_zh": "信息检索与知识管理",
      "reason": "matched_keywords:knowledge, graph, search"
    },
    "target_user": "使用 claude, claude_code 等宿主 AI 的用户",
    "title_en": "contextful",
    "title_zh": "contextful 能力包",
    "visible_tags": [
      {
        "label_en": "MCP Tools",
        "label_zh": "MCP 工具",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "product_domain-mcp-tools",
        "type": "product_domain"
      },
      {
        "label_en": "Knowledge Base Q&A",
        "label_zh": "知识库问答",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "user_job-knowledge-base-q-a",
        "type": "user_job"
      },
      {
        "label_en": "Workflow Automation",
        "label_zh": "流程自动化",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "core_capability-workflow-automation",
        "type": "core_capability"
      },
      {
        "label_en": "Node-based Workflow",
        "label_zh": "节点式流程编排",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "workflow_pattern-node-based-workflow",
        "type": "workflow_pattern"
      },
      {
        "label_en": "Plugin Ecosystem",
        "label_zh": "插件生态",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "selection_signal-plugin-ecosystem",
        "type": "selection_signal"
      }
    ]
  },
  "packet_id": "phit_c356bced3c75459ebd1856c19e32d434",
  "page_model": {
    "artifacts": {
      "artifact_slug": "contextful",
      "files": [
        "PROJECT_PACK.json",
        "QUICK_START.md",
        "PROMPT_PREVIEW.md",
        "HUMAN_MANUAL.md",
        "AI_CONTEXT_PACK.md",
        "BOUNDARY_RISK_CARD.md",
        "PITFALL_LOG.md",
        "REPO_INSPECTION.json",
        "REPO_INSPECTION.md",
        "CAPABILITY_CONTRACT.json",
        "EVIDENCE_INDEX.json",
        "CLAIM_GRAPH.json"
      ],
      "required_files": [
        "PROJECT_PACK.json",
        "QUICK_START.md",
        "PROMPT_PREVIEW.md",
        "HUMAN_MANUAL.md",
        "AI_CONTEXT_PACK.md",
        "BOUNDARY_RISK_CARD.md",
        "PITFALL_LOG.md",
        "REPO_INSPECTION.json"
      ]
    },
    "detail": {
      "capability_source": "Project Hit Packet + DownstreamValidationResult",
      "commands": [
        {
          "command": "npx @inferensys/contextful",
          "label": "Node.js / npx · 官方安装入口",
          "source": "https://github.com/Inferensys/contextful#readme",
          "verified": true
        }
      ],
      "display_tags": [
        "MCP 工具",
        "知识库问答",
        "流程自动化",
        "节点式流程编排",
        "插件生态"
      ],
      "eyebrow": "信息检索与知识管理",
      "glance": [
        {
          "body": "判断自己是不是目标用户。",
          "label": "最适合谁",
          "value": "需要信息检索与知识管理能力，并使用 claude的用户"
        },
        {
          "body": "先理解能力边界，再决定是否继续。",
          "label": "核心价值",
          "value": "Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory."
        },
        {
          "body": "未完成验证前保持审慎。",
          "label": "继续前",
          "value": "publish to Doramagic.ai project surfaces"
        }
      ],
      "guardrail_source": "Boundary & Risk Card",
      "guardrails": [
        {
          "body": "Prompt Preview 只展示流程，不证明项目已安装或运行。",
          "label": "Check 1",
          "value": "不要把试用当真实运行"
        },
        {
          "body": "claude, claude_code",
          "label": "Check 2",
          "value": "确认宿主兼容"
        },
        {
          "body": "publish to Doramagic.ai project surfaces",
          "label": "Check 3",
          "value": "先隔离验证"
        }
      ],
      "mode": "skill, recipe, host_instruction, eval, preflight",
      "pitfall_log": {
        "items": [
          {
            "body": "项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。",
            "category": "配置坑",
            "evidence": [
              "capability.host_targets | github_repo:1240001007 | https://github.com/Inferensys/contextful | host_targets=claude, claude_code"
            ],
            "severity": "medium",
            "suggested_check": "列出会写入的配置文件、目录和卸载/回滚步骤。",
            "title": "可能修改宿主 AI 配置",
            "user_impact": "安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。"
          },
          {
            "body": "README/documentation is current enough for a first validation pass.",
            "category": "能力坑",
            "evidence": [
              "capability.assumptions | github_repo:1240001007 | https://github.com/Inferensys/contextful | README/documentation is current enough for a first validation pass."
            ],
            "severity": "medium",
            "suggested_check": "将假设转成下游验证清单。",
            "title": "能力判断依赖假设",
            "user_impact": "假设不成立时，用户拿不到承诺的能力。"
          },
          {
            "body": "未记录 last_activity_observed。",
            "category": "维护坑",
            "evidence": [
              "evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | last_activity_observed missing"
            ],
            "severity": "medium",
            "suggested_check": "补 GitHub 最近 commit、release、issue/PR 响应信号。",
            "title": "维护活跃度未知",
            "user_impact": "新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。"
          },
          {
            "body": "no_demo",
            "category": "安全/权限坑",
            "evidence": [
              "downstream_validation.risk_items | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium"
            ],
            "severity": "medium",
            "suggested_check": "进入安全/权限治理复核队列。",
            "title": "下游验证发现风险项",
            "user_impact": "下游已经要求复核，不能在页面中弱化。"
          },
          {
            "body": "no_demo",
            "category": "安全/权限坑",
            "evidence": [
              "risks.scoring_risks | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium"
            ],
            "severity": "medium",
            "suggested_check": "把风险写入边界卡，并确认是否需要人工复核。",
            "title": "存在评分风险",
            "user_impact": "风险会影响是否适合普通用户安装。"
          },
          {
            "body": "issue_or_pr_quality=unknown。",
            "category": "维护坑",
            "evidence": [
              "evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | issue_or_pr_quality=unknown"
            ],
            "severity": "low",
            "suggested_check": "抽样最近 issue/PR，判断是否长期无人处理。",
            "title": "issue/PR 响应质量未知",
            "user_impact": "用户无法判断遇到问题后是否有人维护。"
          },
          {
            "body": "release_recency=unknown。",
            "category": "维护坑",
            "evidence": [
              "evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | release_recency=unknown"
            ],
            "severity": "low",
            "suggested_check": "确认最近 release/tag 和 README 安装命令是否一致。",
            "title": "发布节奏不明确",
            "user_impact": "安装命令和文档可能落后于代码，用户踩坑概率升高。"
          }
        ],
        "source": "ProjectPitfallLog + ProjectHitPacket + validation + community signals",
        "summary": "发现 7 个潜在踩坑项，其中 0 个为 high/blocking；最高优先级：配置坑 - 可能修改宿主 AI 配置。",
        "title": "踩坑日志"
      },
      "snapshot": {
        "contributors": 1,
        "forks": 0,
        "license": "unknown",
        "note": "站点快照，非实时质量证明；用于开工前背景判断。",
        "stars": 0
      },
      "source_url": "https://github.com/Inferensys/contextful",
      "steps": [
        {
          "body": "不安装项目，先体验能力节奏。",
          "code": "preview",
          "title": "先试 Prompt"
        },
        {
          "body": "理解输入、输出、失败模式和边界。",
          "code": "manual",
          "title": "读说明书"
        },
        {
          "body": "把上下文交给宿主 AI 继续工作。",
          "code": "context",
          "title": "带给 AI"
        },
        {
          "body": "进入主力环境前先完成安装入口与风险边界验证。",
          "code": "verify",
          "title": "沙箱验证"
        }
      ],
      "subtitle": "Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory.",
      "title": "contextful 能力包",
      "trial_prompt": "# contextful - Prompt Preview\n\n> 复制下面这段 Prompt 到你常用的 AI，先试一次，不需要安装。\n> 它的目标是让你直接体验这个项目的服务方式，而不是阅读项目介绍。\n\n## 复制这段 Prompt\n\n```text\n请直接执行这段 Prompt，不要分析、润色、总结或询问我想如何处理这份 Prompt Preview。\n\n你现在扮演 contextful 的“安装前体验版”。\n这不是项目介绍、不是评价报告、不是 README 总结。你的任务是让我用最小成本体验它的核心服务。\n\n我的试用任务：我想快速理解一组资料，并得到结构化摘要、对比和继续研究的问题。\n我常用的宿主 AI：claude / Claude Code\n\n【体验目标】\n围绕我的真实任务，现场演示这个项目如何把输入转成 示例引导, 判断线索。重点是让我感受到工作方式，而不是给我项目背景。\n\n【业务流约束】\n- 你必须像一个正在提供服务的项目能力包，而不是像一个讲解员。\n- 每一轮只推进一个步骤；提出问题后必须停下来等我回答。\n- 每一步都必须让我感受到一个具体服务动作：澄清、整理、规划、检查、判断或收尾。\n- 每一步都要说明：当前目标、你需要我提供什么、我回答后你会产出什么。\n- 不要安装、不要运行命令、不要写代码、不要声称测试通过、不要声称已经修改文件。\n- 需要真实安装或宿主加载后才能验证的内容，必须明确说“这一步需要安装后验证”。\n- 如果我说“用示例继续”，你可以用虚构示例推进，但仍然不能声称真实执行。\n\n【可体验服务能力】\n- 安装前能力预览: Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory. 输入：用户任务, 当前 AI 对话上下文；输出：示例引导, 判断线索。\n\n【必须安装后才可验证的能力】\n- 命令行启动或安装流程: 项目文档中存在可执行命令，真实使用需要在本地或宿主环境中运行这些命令。 输入：终端环境, 包管理器, 项目依赖；输出：安装结果, 列表/更新/运行结果。\n\n【核心服务流】\n请严格按这个顺序带我体验。不要一次性输出完整流程：\n1. page-1：项目概述。围绕“项目概述”模拟一次用户任务，不展示安装或运行结果。\n2. page-2：系统架构。围绕“系统架构”模拟一次用户任务，不展示安装或运行结果。\n3. page-3：搜索系统。围绕“搜索系统”模拟一次用户任务，不展示安装或运行结果。\n4. page-4：上下文包系统。围绕“上下文包系统”模拟一次用户任务，不展示安装或运行结果。\n5. page-7：MCP 服务器集成。围绕“MCP 服务器集成”模拟一次用户任务，不展示安装或运行结果。\n\n【核心能力体验剧本】\n每一步都必须按“输入 -> 服务动作 -> 中间产物”执行。不要只说流程名：\n1. page-1\n输入：用户提供的“项目概述”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n2. page-2\n输入：用户提供的“系统架构”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n3. page-3\n输入：用户提供的“搜索系统”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n4. page-4\n输入：用户提供的“上下文包系统”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n5. page-7\n输入：用户提供的“MCP 服务器集成”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n【项目服务规则】\n这些规则决定你如何服务用户。不要解释规则本身，而要在每一步执行时遵守：\n- 先确认用户任务、输入材料和成功标准，再模拟项目能力。\n- 每一步都必须形成可检查的小产物，并等待用户确认后再继续。\n- 凡是需要安装、调用工具或访问外部服务的能力，都必须标记为安装后验证。\n\n【每一步的服务约束】\n- Step 1 / page-1：Step 1 必须围绕“项目概述”形成一个小中间产物，并等待用户确认。\n- Step 2 / page-2：Step 2 必须围绕“系统架构”形成一个小中间产物，并等待用户确认。\n- Step 3 / page-3：Step 3 必须围绕“搜索系统”形成一个小中间产物，并等待用户确认。\n- Step 4 / page-4：Step 4 必须围绕“上下文包系统”形成一个小中间产物，并等待用户确认。\n- Step 5 / page-7：Step 5 必须围绕“MCP 服务器集成”形成一个小中间产物，并等待用户确认。\n\n【边界与风险】\n- 不要声称已经安装、运行、调用 API、读写本地文件或完成真实任务。\n- 安装前预览只能展示工作方式，不能证明兼容性、性能或输出质量。\n- 涉及安装、插件加载、工具调用或外部服务的能力必须安装后验证。\n\n【可追溯依据】\n这些路径只用于你内部校验或在我追问“依据是什么”时简要引用。不要在首次回复主动展开：\n- https://github.com/Inferensys/contextful\n- https://github.com/Inferensys/contextful#readme\n- README.md\n- package.json\n- src/types.ts\n- src/mcp-server.ts\n- src/indexer.ts\n- src/cli.ts\n- src/index.ts\n- src/search.ts\n- src/db.ts\n- src/extract.ts\n\n【首次问题规则】\n- 首次三问必须先确认用户目标、成功标准和边界，不要提前进入工具、安装或实现细节。\n- 如果后续需要技术条件、文件路径或运行环境，必须等用户确认目标后再追问。\n\n首次回复必须只输出下面 4 个部分：\n1. 体验开始：用 1 句话说明你将带我体验 contextful 的核心服务。\n2. 当前步骤：明确进入 Step 1，并说明这一步要解决什么。\n3. 你会如何服务我：说明你会先改变我完成任务的哪个动作。\n4. 只问我 3 个问题，然后停下等待回答。\n\n首次回复禁止输出：后续完整流程、证据清单、安装命令、项目评价、营销文案、已经安装或运行的说法。\n\nStep 1 / brainstorming 的二轮协议：\n- 我回答首次三问后，你仍然停留在 Step 1 / brainstorming，不要进入 Step 2。\n- 第二次回复必须产出 6 个部分：澄清后的任务定义、成功标准、边界条件、\n  2-3 个可选方案、每个方案的权衡、推荐方案。\n- 第二次回复最后必须问我是否确认推荐方案；只有我明确确认后，才能进入下一步。\n- 第二次回复禁止输出 git worktree、代码计划、测试文件、命令或真实执行结果。\n\n后续对话规则：\n- 我回答后，你先完成当前步骤的中间产物并等待确认；只有我确认后，才能进入下一步。\n- 每一步都要生成一个小的中间产物，例如澄清后的目标、计划草案、测试意图、验证清单或继续/停止判断。\n- 所有演示都写成“我会建议/我会引导/这一步会形成”，不要写成已经真实执行。\n- 不要声称已经测试通过、文件已修改、命令已运行或结果已产生。\n- 如果某个能力必须安装后验证，请直接说“这一步需要安装后验证”。\n- 如果证据不足，请明确说“证据不足”，不要补事实。\n```\n",
      "voices": [
        {
          "body": "当前没有项目级社区来源；不会把未抓取讨论包装成社会证明。",
          "items": [],
          "status": "待发现 Agent 补证",
          "title": "社区讨论"
        }
      ]
    },
    "homepage_card": {
      "category": "信息检索与知识管理",
      "desc": "Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory.",
      "effort": "安装已验证",
      "forks": 0,
      "icon": "search",
      "name": "contextful 能力包",
      "risk": "需复核",
      "slug": "contextful",
      "stars": 0,
      "tags": [
        "MCP 工具",
        "知识库问答",
        "流程自动化",
        "节点式流程编排",
        "插件生态"
      ],
      "thumb": "blue",
      "type": "Skill Pack"
    },
    "manual": {
      "markdown": "# https://github.com/Inferensys/contextful 项目说明书\n\n生成时间：2026-05-16 04:01:04 UTC\n\n## 目录\n\n- [项目概述](#page-1)\n- [系统架构](#page-2)\n- [搜索系统](#page-3)\n- [上下文包系统](#page-4)\n- [内存分类账](#page-5)\n- [数据存储与索引](#page-6)\n- [MCP 服务器集成](#page-7)\n- [解析与代码提取](#page-8)\n- [CLI 命令行工具](#page-9)\n- [部署与配置](#page-10)\n\n<a id='page-1'></a>\n\n## 项目概述\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [数据存储与索引](#page-6)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 项目概述\n\n## 项目简介\n\n**Contextful**（也称 `cxf` 或 `contextful`）是一个本地代码索引与上下文检索系统，专为 AI 编程助手设计。该项目由 Inferensys 团队开发，旨在解决大型代码库中上下文信息过载的问题，帮助 AI Agent 在代码审查、重构、依赖分析等场景中高效获取精确的证据支撑[资料来源：README.md:1]()\n\nContextful 的核心价值在于将传统的\"暴力读取文件\"模式转变为\"证据驱动的紧凑上下文打包\"模式。传统方式下，AI Agent 可能需要读取数十个文件才能理解一个问题，而 Contextful 能够根据查询意图返回一个经过排序、标注来源、符合 token 预算的紧凑证据包[资料来源：README.md:1-5]()。\n\n### 核心设计理念\n\nContextful 遵循以下设计原则：\n\n1. **证据优先**：每个返回的上下文都附带文件引用和行号，AI 可以直接溯源\n2. **意图感知**：系统能够分类用户查询（如精确搜索、影响分析、架构追踪等）\n3. **预算可控**：返回结果严格遵守 token 预算限制，避免信息过载\n4. **记忆持久化**：支持将 AI 学习到的经验持久化存储，供后续会话复用\n\n## 技术架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    subgraph 输入层\n        Q[用户查询]\n        W[工作区文件]\n        M[记忆数据]\n    end\n    \n    subgraph 处理层\n        C[CLI命令解析]\n        S[搜索引擎]\n        G[图数据库]\n        I[索引引擎]\n    end\n    \n    subgraph MCP层\n        MCP[MCP Server]\n        TOOLS[7大工具集]\n    end\n    \n    subgraph 输出层\n        P[Evidence Pack]\n        R[Context Report]\n    end\n    \n    Q --> C\n    W --> I\n    I --> G\n    C --> S\n    S --> G\n    M --> S\n    C --> MCP\n    MCP --> TOOLS\n    TOOLS --> P\n    TOOLS --> R\n    S --> P\n    G --> P\n```\n\n### 核心模块\n\n| 模块名称 | 文件路径 | 职责说明 |\n|---------|---------|---------|\n| CLI 解析器 | `src/cli.ts` | 命令行参数解析与路由 |\n| 搜索引擎 | `src/search.ts` | 全文检索、意图分类、结果排序 |\n| 索引引擎 | `src/extract.ts` | 符号提取、依赖关系图构建 |\n| MCP 服务 | `src/mcp-server.ts` | MCP 协议实现与工具暴露 |\n| 报告生成 | `src/report.ts` | 上下文报告与证据包渲染 |\n\n## 功能特性\n\n### CLI 命令行工具\n\nContextful 提供完整的命令行界面，支持以下操作[资料来源：src/cli.ts:1-100]()：\n\n| 命令 | 功能描述 | 核心参数 |\n|------|---------|---------|\n| `cxf index` | 建立或更新工作区索引 | `--workspace`, `--watch` |\n| `cxf daemon` | 启动本地索引守护进程 | `--workspace` |\n| `cxf query` | 创建证据包 | `--workspace`, `--budget`, `--json` |\n| `cxf search` | 搜索上下文 | `--workspace`, `--limit`, `--kind` |\n| `cxf report` | 生成上下文报告 | `--workspace`, `--format` |\n| `cxf memory add` | 存储经验教训 | `--claim`, `--evidence`, `--scope` |\n| `cxf server` | 启动 MCP 服务 | 无 |\n\n### MCP 工具集\n\nContextful 作为 MCP（Model Context Protocol）服务器，暴露了 7 个核心工具[资料来源：src/mcp-server.ts:1-50]()：\n\n| 工具名称 | 功能说明 |\n|---------|---------|\n| `context_pack` | 返回排序、标注来源、符合预算的证据包 |\n| `search_code` | 强大的代码、文档、符号和记忆搜索 |\n| `trace_path` | 跨文件、符号、模块、配置的图遍历 |\n| `impact_analysis` | 逆向依赖分析与影响范围识别 |\n| `why_changed` | 结合 Git 历史的变更原因分析 |\n| `recall_memory` | 搜索持久化的经验教训 |\n| `write_lesson` | 写入带证据的经验教训 |\n\n### 搜索意图分类\n\n系统能够将用户查询自动分类为以下意图类型[资料来源：src/search.ts:1-30]()：\n\n| 意图类型 | 触发关键词 | 典型使用场景 |\n|---------|-----------|-------------|\n| `exact` | 文件路径、符号名、正则表达式 | 精确查找定义或文件 |\n| `code` | 函数、变量、参数、实现 | 代码实现分析 |\n| `memory` | 记忆、经验、教训、会话 | 经验检索 |\n| `impact` | 影响、依赖、影响范围 | 变更影响分析 |\n| `historical` | 为什么、变更、历史、提交 | 变更原因追溯 |\n| `architectural` | 架构、流程、路径、依赖 | 系统架构分析 |\n| `docs` | 文档、指南、README、配置 | 文档查找 |\n| `vague` | 通用查询 | 模糊匹配 |\n\n### 索引能力\n\n系统支持多种编程语言的代码索引[资料来源：src/extract.ts:1-80]()：\n\n| 语言 | 支持类型 | 提取内容 |\n|------|---------|---------|\n| TypeScript/JavaScript | 函数、类、接口、类型 | 函数声明、导出状态、签名 |\n| Python | 函数、类 | 函数定义、类定义 |\n| Go | 函数、结构体、接口 | 函数声明、包级导出 |\n| Rust | 函数、结构体、枚举、特征、impl | 函数、结构体、特征实现 |\n| Markdown | 标题 | 层级标题结构 |\n| JSON | 配置键 | 顶层键名 |\n| Go | import 路径 | 包引用 |\n| Rust | use/mod 语句 | 模块引用 |\n\n## 工作流程\n\n### 索引构建流程\n\n```mermaid\ngraph LR\n    A[文件扫描] --> B[语言检测]\n    B --> C[符号提取]\n    C --> D[依赖关系提取]\n    D --> E[全文分块]\n    E --> F[SQLite存储]\n    \n    F --> G[FTS全文索引]\n    G --> H[图数据库索引]\n```\n\n### 证据包生成流程\n\n```mermaid\ngraph TD\n    Q[query查询] --> C{意图分类}\n    C -->|code| F1[FTS全文搜索]\n    C -->|impact| F2[图遍历分析]\n    C -->|memory| F3[记忆库搜索]\n    C -->|historical| F4[Git历史查询]\n    \n    F1 --> R[结果合并]\n    F2 --> R\n    F3 --> R\n    F4 --> R\n    \n    R --> D[相关性评分]\n    D --> S[Token预算分配]\n    S --> P[Evidence Pack]\n    \n    P --> CITE[引用标注]\n    P --> GRAPH[图路径连接]\n    P --> CONF[置信度计算]\n    \n    CITE --> OUTPUT[最终输出]\n    GRAPH --> OUTPUT\n    CONF --> OUTPUT\n```\n\n## 依赖关系\n\n### 核心依赖\n\n| 依赖包 | 版本 | 用途 |\n|--------|------|------|\n| `@modelcontextprotocol/sdk` | ^1.29.0 | MCP 协议实现 |\n| `better-sqlite3` | ^12.10.0 | SQLite 数据库引擎 |\n| `commander` | ^14.0.3 | CLI 命令解析 |\n| `fast-glob` | ^3.3.3 | 文件模式匹配 |\n| `web-tree-sitter` | ^0.20.8 | 语法树解析 |\n| `zod` | ^4.4.3 | 数据验证 |\n\n### 开发依赖\n\n| 依赖包 | 版本 | 用途 |\n|--------|------|------|\n| `typescript` | ^6.0.3 | 类型检查与编译 |\n| `vitest` | ^4.1.6 | 单元测试框架 |\n\n### 环境要求\n\n- **Node.js 版本**: >= 20[资料来源：package.json:45]()\n\n### 支持的 IDE\n\n项目已针对以下 IDE 和编辑器进行测试[资料来源：package.json:10-18]()：\n\n- Windsurf\n- GitHub Copilot\n- VS Code\n- Cline\n- Roo Code\n- Continue\n- Zed\n\n## 项目元数据\n\n| 属性 | 值 |\n|------|-----|\n| 项目名称 | contextful |\n| CLI 别名 | `cxf` |\n| MCP 名称 | `io.github.Inferensys/contextful` |\n| 许可证 | MIT |\n| 仓库地址 | `git+https://github.com/Inferensys/contextful.git` |\n| 官网 | https://inferensys.github.io/contextful/ |\n| 问题追踪 | https://github.com/Inferensys/contextful/issues |\n\n## 使用示例\n\n### 安装与索引\n\n```bash\n# 全局安装\nnpx @inferensys/contextful index --workspace .\n\n# 持续监听文件变化\nnpx @inferensys/contextful index --workspace . --watch\n```\n\n### 查询上下文\n\n```bash\n# 基本查询\ncxf query \"where is user auth handled\" --workspace . --budget 2000\n\n# 输出 JSON 格式\ncxf query \"memory ledger implementation\" --workspace . --json\n```\n\n### MCP 服务模式\n\n```bash\n# 启动 MCP 服务器\nnpx @inferensys/contextful server\n```\n\n## 数据模型\n\n### 证据包结构\n\n```mermaid\nclassDiagram\n    class EvidencePack {\n        +string id\n        +string query\n        +string scope\n        +SearchIntent intent\n        +string summary\n        +SearchHit[] citations\n        +FileContext[] files\n        +SymbolRecord[] symbols\n        +GraphPath[] graphPaths\n        +SearchHit[] memoryHits\n        +number confidence\n        +number tokenEstimate\n        +number budget\n        +string createdAt\n    }\n    \n    class SearchHit {\n        +string ref\n        +string path\n        +string title\n        +string kind\n        +string excerpt\n        +number rank\n    }\n    \n    class GraphPath {\n        +string from\n        +string to\n        +string edgeType\n        +string filePath\n        +number line\n    }\n    \n    EvidencePack --> SearchHit\n    EvidencePack --> GraphPath\n```\n\n### 记忆条目结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符 |\n| `claim` | string | 经验主张 |\n| `evidenceRefs` | string[] | 证据引用列表 |\n| `scope` | string | 作用范围（repo/global） |\n| `confidence` | number | 置信度（0-1） |\n| `createdAt` | string | 创建时间 |\n\n## 报告功能\n\n系统支持生成多格式的上下文报告[资料来源：src/report.ts:1-60]()：\n\n| 格式 | 说明 |\n|------|------|\n| `markdown` | 默认格式，Markdown 渲染 |\n| `json` | 结构化 JSON 输出 |\n| `html` | 独立 HTML 页面，可直接在浏览器打开 |\n\n### 报告包含内容\n\n- **索引状态**：已索引文件数、符号数、块数\n- **统计摘要**：Token 使用情况、节省比例估算\n- **警告信息**：潜在问题提示（如未索引文件、依赖缺失）\n- **Token 节省估算**：相对于未使用系统的平均节省比例\n\n---\n\n**相关链接**：\n\n- 官方文档：https://inferensys.github.io/contextful/\n- 问题反馈：https://github.com/Inferensys/contextful/issues\n- 源码仓库：https://github.com/Inferensys/contextful\n\n---\n\n<a id='page-2'></a>\n\n## 系统架构\n\n### 相关页面\n\n相关主题：[项目概述](#page-1), [数据存储与索引](#page-6), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/indexer.ts](https://github.com/Inferensys/contextful/blob/main/src/indexer.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 系统架构\n\n## 1. 概述\n\nContextful 是一个基于语义索引的上下文检索系统，旨在为 AI 代理提供精准、紧凑且有据可查的证据包。系统通过解析、索引代码仓库中的符号、导入关系和文档片段，使代理能够在执行任务时快速获取相关上下文，避免随机文件读取带来的效率低下问题。资料来源：[README.md]()\n\n## 2. 整体架构\n\nContextful 采用分层架构设计，主要包含以下层次：\n\n| 层次 | 职责 | 核心模块 |\n|------|------|----------|\n| CLI 层 | 用户交互接口 | `src/cli.ts` |\n| MCP 服务层 | 与 AI 代理的标准通信协议 | `src/mcp-server.ts` |\n| 搜索/查询层 | 语义检索和证据包生成 | `src/search.ts` |\n| 索引层 | 代码解析和数据库写入 | `src/indexer.ts` |\n| 提取层 | 符号和依赖关系解析 | `src/extract.ts` |\n| 工具层 | 通用工具函数 | `src/util.ts` |\n\n```mermaid\ngraph TD\n    A[CLI 客户端] --> B[MCP Server]\n    C[AI 代理] --> B\n    B --> D[Search Module]\n    D --> E[Index Layer]\n    E --> F[SQLite Kernel DB]\n    G[File System] --> E\n    D --> G\n```\n\n资料来源：[src/cli.ts:40-65]()，[src/search.ts:1-50]()\n\n## 3. 核心组件详解\n\n### 3.1 索引子系统 (Indexer)\n\n索引子系统负责扫描工作区文件并将其内容转换为可检索的数据库记录。索引过程包括文件发现、语言检测、符号提取和依赖关系分析四个阶段。\n\n```mermaid\ngraph LR\n    A[文件扫描] --> B[语言检测]\n    B --> C[符号提取]\n    C --> D[依赖分析]\n    D --> E[分块存储]\n```\n\n#### 索引流程\n\n| 阶段 | 功能 | 关键函数 |\n|------|------|----------|\n| 文件发现 | 递归扫描目录，忽略隐藏文件和测试文件 | `scanWorkspace()` |\n| 语言检测 | 根据扩展名识别 TypeScript/JavaScript、Python、Go、Rust 等语言 | `detectLanguage()` |\n| 符号提取 | 解析函数、类、接口、类型定义 | `extractSymbols()` |\n| 依赖分析 | 提取 import/require/use 语句 | `extractEdges()` |\n| 内容分块 | 将文件内容切分为可管理的片段 | `textChunks()` |\n\n资料来源：[src/extract.ts:1-50]()，[src/indexer.ts]()\n\n#### 支持的编程语言\n\n系统支持多种编程语言的符号提取和依赖分析：\n\n| 语言 | 符号类型 | 依赖检测 |\n|------|----------|----------|\n| TypeScript/JavaScript | function, class, interface, type, const | `import from`、`require()` |\n| Python | function, class | `from ... import`、`import` |\n| Go | function, struct, interface | 字符串字面量导入 |\n| Rust | function, struct, enum, trait, impl | `use`、`mod` |\n| Markdown | heading | 无依赖 |\n| JSON | config-key | 键值对配置 |\n\n资料来源：[src/extract.ts:10-45]()\n\n### 3.2 搜索与查询子系统 (Search)\n\n搜索子系统是系统的核心大脑，负责理解用户查询意图并返回最相关的上下文片段。\n\n```mermaid\ngraph TD\n    A[用户查询] --> B{意图分类}\n    B -->|code| C[代码搜索]\n    B -->|symbol| D[符号搜索]\n    B -->|impact| E[影响分析]\n    B -->|historical| F[历史追溯]\n    B -->|architectural| G[架构路径]\n    B -->|docs| H[文档检索]\n    C --> I[全文索引查询]\n    D --> J[符号表查询]\n    E --> K[依赖图遍历]\n    F --> L[Git 历史读取]\n    I --> M[BM25 排序]\n    J --> M\n    K --> M\n    M --> N[证据包组装]\n```\n\n#### 意图分类器\n\n查询意图自动分类为以下类型：\n\n| 意图 | 检测关键词 | 搜索模式 |\n|------|------------|----------|\n| `code` | how, implement, code, function | 全文搜索 |\n| `symbol` | class, interface, function name | 精确符号匹配 |\n| `impact` | impact, affected, depends, blast radius | 逆向依赖分析 |\n| `historical` | why, changed, commit, history | Git 历史 + 当前代码 |\n| `architectural` | architecture, flow, path, trace | 图遍历 |\n| `docs` | resource, docs, documentation, guide | 文档优先 |\n| `vague` | 通用模糊查询 | 扩展术语 + 全文搜索 |\n\n资料来源：[src/search.ts:1-20]()\n\n### 3.3 证据包系统 (Evidence Pack)\n\n证据包是系统返回给 AI 代理的核心数据结构，包含查询答案的所有支持证据。\n\n```mermaid\ngraph TD\n    A[createContextPack] --> B[searchContext]\n    B --> C{选择命中}\n    C -->|hits| D[topKByScore]\n    C -->|graphPaths| E[loadGraphPaths]\n    C -->|memoryHits| F[内存记忆]\n    D --> G[组装证据包]\n    E --> G\n    F --> G\n    G --> H[EvidencePack]\n    H --> I[summary 摘要]\n    H --> J[citations 引用]\n    H --> K[symbols 符号]\n    H --> L[graphPaths 路径]\n```\n\n#### 证据包数据结构\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符\n  query: string;                 // 原始查询\n  scope: string;                 // 作用域 (repo|file|session)\n  intent: SearchIntent;          // 识别的查询意图\n  summary: string;               // 自然语言摘要\n  citations: SearchHit[];         // 命中的上下文片段\n  files: FileReference[];         // 相关文件列表\n  symbols: SymbolRecord[];         // 匹配的符号\n  graphPaths: GraphPath[];        // 图路径连接\n  memoryHits: SearchHit[];        // 记忆系统命中\n  confidence: number;            // 置信度 (0.1-0.92)\n  tokenEstimate: number;         // 估算的 token 数量\n  budget: number;                // token 预算上限\n  createdAt: string;             // 创建时间戳\n}\n```\n\n资料来源：[src/search.ts:150-200]()，[src/types.ts]()\n\n### 3.4 MCP 服务层\n\nMCP (Model Context Protocol) 服务层提供了与 AI 代理通信的标准接口，使 Contextful 可作为工具被集成到任何兼容 MCP 的代理中。\n\n```mermaid\ngraph LR\n    A[AI Agent] -->|stdio| B[MCP Server]\n    B -->|context_pack| C[createContextPack]\n    B -->|search_code| D[searchContext]\n    B -->|trace_path| E[traceGraph]\n    B -->|impact_analysis| F[impactAnalysis]\n    B -->|why_changed| G[whyChanged]\n    B -->|recall_memory| H[recallMemory]\n    B -->|write_lesson| I[writeLesson]\n```\n\n#### MCP 工具列表\n\n| 工具名 | 功能 | 参数 |\n|--------|------|------|\n| `context_pack` | 生成带证据的上下文包 | query, budget, scope |\n| `search_code` | 搜索代码、文档、符号、记忆 | query, mode, filters |\n| `trace_path` | 图遍历追踪符号/模块依赖 | from, to, edge_types |\n| `impact_analysis` | 分析符号/文件的逆向依赖 | symbol_or_file |\n| `why_changed` | 追溯变更历史 | symbol_or_file |\n| `recall_memory` | 搜索记忆系统 | query, scope |\n| `write_lesson` | 写入学习记忆 | claim, evidence_refs |\n\n资料来源：[src/mcp-server.ts]()，[README.md]()\n\n### 3.5 CLI 命令行接口\n\nCLI 模块提供了独立的命令行工具 `cxf` (contextful) 供开发者直接使用。\n\n#### 命令概览\n\n| 命令 | 描述 | 核心选项 |\n|------|------|----------|\n| `index` | 索引工作区文件 | `--workspace`, `--watch` |\n| `daemon` | 启动本地索引守护进程 | `--workspace` |\n| `query` | 创建证据包 | `--workspace`, `--budget`, `--json` |\n| `search` | 搜索索引内容 | `--workspace`, `--limit`, `--kind` |\n| `report` | 生成上下文报告 | `--workspace`, `--format` |\n| `memory add` | 添加学习记忆 | `--claim`, `--evidence`, `--confidence` |\n| `server` | 启动 MCP 服务 | 无 |\n\n资料来源：[src/cli.ts:1-80]()\n\n#### 使用示例\n\n```bash\n# 索引当前目录\ncxf index --workspace .\n\n# 启动守护进程监听变更\ncxf daemon --workspace .\n\n# 查询上下文\ncxf query \"用户认证在哪里处理\" --workspace . --budget 2000\n\n# 生成报告\ncxf report --workspace . --format markdown\n```\n\n## 4. 数据模型\n\n### 4.1 内核数据库 (SQLite)\n\n系统使用 SQLite 作为内核数据库，存储以下核心表结构：\n\n| 表名 | 用途 | 核心字段 |\n|------|------|----------|\n| `files` | 已索引文件元数据 | path, language, hash, indexed_at |\n| `chunks` | 文件分块内容 | file_id, path, title, text, kind |\n| `chunks_fts` | 全文搜索索引 | BM25 排序的 FTS5 表 |\n| `symbols` | 代码符号表 | name, kind, file_path, line, signature |\n| `edges` | 依赖关系图 | source_path, target_name, edge_type |\n| `memory` | 学习记忆存储 | id, claim, evidence, confidence, scope |\n| `queries` | 查询历史 | query, intent, timestamp |\n\n资料来源：[src/indexer.ts]()，[src/search.ts:50-100]()\n\n### 4.2 符号提取数据模型\n\n```typescript\ninterface SymbolRecord {\n  ref: string;          // 文件引用，如 \"file:src/auth.ts:1-20\"\n  name: string;         // 符号名称\n  kind: string;         // 类型：function, class, interface, struct, enum\n  filePath: string;     // 文件路径\n  line: number;         // 定义行号\n  signature?: string;   // 函数签名摘要\n  exported?: boolean;   // 是否导出\n}\n\ninterface RawEdge {\n  targetName: string;   // 目标名称\n  targetType: string;   // 目标类型：module, config\n  edgeType: string;     // 边类型：IMPORTS, CONFIGURES\n  filePath: string;     // 源文件路径\n  line: number;         // 行号\n}\n```\n\n资料来源：[src/extract.ts:1-30]()\n\n## 5. 工作流程\n\n### 5.1 索引完整流程\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant CLI as CLI/Server\n    participant Indexer\n    participant Extractor\n    participant DB as Kernel DB\n    \n    User->>CLI: cxf index --workspace .\n    CLI->>Indexer: scanWorkspace(workspace)\n    Indexer->>Indexer: 遍历所有文件\n    loop 每个文件\n        Indexer->>Extractor: extractSymbols(content, language)\n        Extractor-->>Indexer: symbols[]\n        Indexer->>Extractor: extractEdges(content, language)\n        Extractor-->>Indexer: edges[]\n        Indexer->>Extractor: textChunks(content)\n        Extractor-->>Indexer: chunks[]\n        Indexer->>DB: insert records\n    end\n    DB-->>CLI: indexing complete\n    CLI-->>User: status report\n```\n\n### 5.2 查询证据包生成流程\n\n```mermaid\nsequenceDiagram\n    participant Agent\n    participant MCP as MCP Server\n    participant Search\n    participant DB as Kernel DB\n    \n    Agent->>MCP: context_pack(\"用户认证\", budget=2000)\n    MCP->>Search: createContextPack({query, budget})\n    Search->>Search: classifyQuery(query) -> intent\n    Search->>Search: searchContext({query, intent})\n    Search->>DB: FTS query + BM25\n    DB-->>Search: ranked hits\n    Search->>Search: selectTopK(hits, budget)\n    Search->>DB: loadSymbolsForPaths()\n    Search->>DB: loadGraphPaths()\n    Search-->>MCP: EvidencePack\n    MCP-->>Agent: EvidencePack (JSON/Markdown)\n```\n\n## 6. 记忆系统\n\nContextful 内置了一个证据支持的学习记忆系统，允许 AI 代理保存从查询中获得的经验教训。\n\n### 6.1 记忆数据结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符 |\n| `claim` | string | 经验断言/教训 |\n| `evidence` | SearchHit[] | 支持证据引用 |\n| `confidence` | number | 置信度 (0-1) |\n| `scope` | string | 作用域 (repo/file/session) |\n| `createdAt` | string | 创建时间 |\n\n### 6.2 记忆查询\n\n记忆系统支持通过自然语言查询检索相关经验，与常规代码搜索并行执行，结果合并到证据包中。\n\n资料来源：[src/search.ts:200-250]()\n\n## 7. 报告系统\n\n报告模块提供工作区的整体上下文分析视图。\n\n```mermaid\ngraph TD\n    A[generateReport] --> B[getIndexStatus]\n    A --> C[getQueryStats]\n    A --> D[getStaleMemories]\n    B --> E[renderReport]\n    C --> E\n    D --> E\n    E -->|markdown| F[Markdown 格式]\n    E -->|json| G[JSON 格式]\n    E -->|html| H[HTML 格式]\n```\n\n### 7.1 报告内容\n\n| 部分 | 内容 |\n|------|------|\n| 状态概览 | 文件数、符号数、索引状态 |\n| 语言覆盖 | 各编程语言的文件数量统计 |\n| 热门查询 | 最常使用的查询及意图分布 |\n| 陈旧记忆 | 需要更新的学习记忆 |\n| 代理指导 | 最佳实践建议 |\n| 警告 | 索引过程中的潜在问题 |\n\n资料来源：[src/report.ts:1-100]()\n\n## 8. 扩展机制\n\n### 8.1 自定义文件类型支持\n\n系统通过 `extract.ts` 中的语言检测器支持扩展新的编程语言。需要实现：\n\n1. **符号提取**：匹配函数/类/类型定义的正则表达式\n2. **依赖分析**：匹配导入语句的模式\n3. **分块策略**：适用于该语言内容的分块算法\n\n### 8.2 MCP 工具扩展\n\nMCP 服务层支持注册新的工具函数，遵循以下签名：\n\n```typescript\ninterface MCPTool {\n  name: string;\n  description: string;\n  inputSchema: object;\n  handler: (params: object) => Promise<object>;\n}\n```\n\n## 9. 总结\n\nContextful 的系统架构围绕\"精准上下文检索\"这一核心目标设计，通过分层解耦实现了以下能力：\n\n- **多语言支持**：支持 TypeScript/JavaScript、Python、Go、Rust 等主流语言的符号提取\n- **智能意图分类**：自动识别查询意图并选择最优搜索策略\n- **图遍历能力**：通过依赖图支持影响分析和架构追踪\n- **记忆持久化**：证据支持的学习记忆系统\n- **MCP 集成**：标准化的 AI 代理通信协议\n\n整个系统以 SQLite 为核心存储，通过 FTS5 全文索引和 BM25 排序算法实现高效检索，最终输出紧凑且有据可查的证据包。\n\n---\n\n<a id='page-3'></a>\n\n## 搜索系统\n\n### 相关页面\n\n相关主题：[上下文包系统](#page-4), [内存分类账](#page-5), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n</details>\n\n# 搜索系统\n\n## 概述\n\n搜索系统是 Contextful 的核心功能模块，负责在已索引的工作区中执行多维度上下文检索。该系统通过整合全文搜索（FTS）、符号搜索、图关系遍历和记忆搜索等多种检索策略，为 AI 代理提供精确、相关且有据可查的代码上下文。\n\n搜索系统的主要设计目标是解决传统 RAG（检索增强生成）方法中常见的\"随机文件读取\"问题，通过意图分类、相关性排序和证据打包等机制，返回紧凑且经过验证的证据集，而非大量无关文件。资料来源：[README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n## 架构概览\n\n```mermaid\ngraph TD\n    A[用户查询] --> B[意图分类 classifyQuery]\n    B --> C{查询类型}\n    C -->|exact| D[精确搜索]\n    C -->|symbol| E[符号搜索]\n    C -->|memory| F[记忆搜索]\n    C -->|impact| G[影响分析]\n    C -->|historical| H[历史分析]\n    C -->|architectural| I[架构分析]\n    C -->|docs| J[文档搜索]\n    C -->|vague| K[模糊搜索]\n    \n    D --> L[全文搜索引擎]\n    E --> L\n    F --> M[记忆数据库]\n    G --> N[依赖图遍历]\n    H --> O[Git历史]\n    I --> N\n    J --> L\n    \n    L --> P[结果合并去重]\n    M --> P\n    N --> P\n    O --> P\n    P --> Q[证据打包 createContextPack]\n    Q --> R[EvidencePack]\n```\n\n## 核心组件\n\n### 搜索上下文管理器\n\n`searchContext` 是搜索系统的入口函数，负责协调整个搜索流程：\n\n```typescript\nexport async function searchContext(options: SearchOptions): Promise<{ intent: SearchIntent; hits: SearchHit[] }>\n```\n\n**主要职责：**\n\n1. 解析并验证工作区路径\n2. 确保索引已完成（调用 `ensureIndexed`）\n3. 对查询进行意图分类\n4. 执行对应的搜索策略\n5. 合并和去重搜索结果\n\n资料来源：[src/search.ts:核心函数](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 意图分类器\n\n意图分类器 `classifyQuery` 是搜索系统的智能路由层，根据查询内容将其映射到最适合的搜索策略。\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent\n```\n\n**支持的意图类型：**\n\n| 意图类型 | 触发关键词 | 搜索策略 |\n|---------|-----------|---------|\n| `exact` | 符号名（驼峰命名）、路径分隔符、井号 | 精确匹配文件路径或符号 |\n| `symbol` | function、method、class、interface、变量名 | 符号定义检索 |\n| `memory` | memory、lesson、remember、learned、session | 记忆库检索 |\n| `impact` | impact、affected、depends、blast radius、uses | 影响分析和依赖追踪 |\n| `historical` | why、changed、commit、history、regression | Git 历史分析 |\n| `architectural` | architecture、flow、trace、connects、imports | 架构图遍历 |\n| `docs` | docs、documentation、guide、readme、how to | 文档检索 |\n| `vague` | 其他情况 | 模糊全文搜索 |\n\n资料来源：[src/search.ts:意图分类逻辑](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n**意图分类的实现细节：**\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent {\n  const lower = q.toLowerCase();\n  if (/[`\"'#.:/]/.test(q) || /\\b[A-Z][A-Za-z0-9_]{2,}\\b/.test(query)) return \"exact\";\n  if (/\\b(function|method|class|interface|enum|struct|impl)\\b/.test(q)) return \"symbol\";\n  if (/\\b(memory|memories|remember|remembers|lesson|lessons|learned|session|sessions)\\b/.test(q)) return \"memory\";\n  if (/\\b(impact|affected|depends on|dependents|blast radius|what uses|who calls)\\b/.test(q)) return \"impact\";\n  // ... 更多分类规则\n}\n```\n\n## 搜索策略\n\n### 全文搜索（FTS）\n\n全文搜索引擎基于 SQLite 的 FTS5 扩展实现，支持 BM25 排序算法：\n\n```typescript\nconst rows = kernel.db\n  .prepare(\"SELECT ref, path, title, text, bm25(chunks_fts) AS rank FROM chunks_fts WHERE chunks_fts MATCH ? LIMIT ?\")\n  .all(fts, limit * 10)\n```\n\n**查询构建器 `ftsQuery`：**\n\n负责将用户查询转换为 FTS5 兼容的查询语法：\n\n1. 移除停用词（stopwords）\n2. 展开相关术语（同义词扩展）\n3. 处理特殊字符和符号\n\n**停用词列表：**\n\n```typescript\nconst STOPWORDS = new Set([\"where\", \"what\", \"which\", \"when\", \"how\", \"are\", \"the\", \"for\", \"with\", \"and\", \"or\", \"to\"]);\n```\n\n**术语扩展 `expandedTerms`：**\n\n根据查询语义自动添加相关术语：\n\n| 语义主题 | 扩展术语 |\n|---------|---------|\n| tool/tools 相关 | server, tool, tools, callTool |\n| MCP 相关 | mcp, server, stdio |\n| memory 相关 | memory, memories, lesson, lessons, claim, ledger, evidence |\n| impact 相关 | imports, tests, edges |\n\n资料来源：[src/search.ts:FTS实现](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 符号搜索\n\n符号搜索专门用于定位代码中的定义和声明，支持多种编程语言：\n\n**支持的符号类型：**\n\n| 语言 | 符号类型 |\n|-----|---------|\n| TypeScript/JavaScript | function, class, interface, type, const |\n| Python | function, class |\n| Go | function (大写导出), struct, interface |\n| Rust | function, struct, enum, trait, impl |\n| Markdown | heading |\n\n**符号提取器 `extractSymbols`：**\n\n```typescript\nfunction extractSymbols(relativePath: string, content: string, language: string): SymbolRecord[]\n```\n\n**示例 - TypeScript 函数提取：**\n\n```typescript\nmatchPush(line, /^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/, push, \"function\");\n```\n\n资料来源：[src/extract.ts:符号提取](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n\n### 图关系搜索\n\n图搜索基于提取的导入和依赖关系构建有向图，支持：\n\n- **依赖追踪**：查找某个模块的导入关系\n- **影响分析**：反向查找依赖当前目标的所有模块\n- **路径追踪**：在两个符号/文件之间寻找连接路径\n\n**图数据结构：**\n\n```typescript\ninterface RawEdge {\n  targetName: string;\n  targetType: \"module\" | \"symbol\" | \"config\";\n  edgeType: \"IMPORTS\" | \"TESTS\" | \"CONFIGURES\";\n  line: number;\n}\n```\n\n**导入关系提取：**\n\n| 语言 | 导入语法 |\n|-----|---------|\n| TypeScript/JavaScript | `from \"...\"` / `require(\"...\")` |\n| Python | `from ... import ...` / `import ...` |\n| Go | `\"...\"` |\n| Rust | `use ...;` / `mod ...;` |\n| JSON | `\"key\": value` |\n\n资料来源：[src/extract.ts:边提取](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n\n### 记忆搜索\n\n记忆系统允许 AI 代理存储和检索基于证据的经验教训：\n\n```typescript\nmemory\n  .command(\"add\")\n  .requiredOption(\"--claim <text>\", \"Lesson claim.\")\n  .requiredOption(\"--evidence <ref...>\", \"Evidence ref(s)\")\n  .option(\"--scope <scope>\", \"Memory scope.\", \"repo\")\n  .option(\"--confidence <number>\", \"Confidence from 0 to 1.\", parseFloat, 0.7)\n```\n\n**记忆搜索触发条件：**\n\n当查询包含以下关键词时，系统自动启用记忆搜索：\n\n- memory, memories\n- remember, remembers\n- lesson, lessons\n- learned\n- session, sessions\n- ledger, evidence\n\n资料来源：[src/search.ts:记忆搜索触发](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 证据打包系统\n\n`createContextPack` 函数将搜索结果整合为结构化的证据包：\n\n```typescript\nexport async function createContextPack(options: CreatePackOptions): Promise<EvidencePack>\n```\n\n### 证据包结构\n\n```typescript\ninterface EvidencePack {\n  id: string;              // 唯一标识符\n  query: string;           // 原始查询\n  scope: string;           // 搜索范围\n  intent: SearchIntent;    // 识别的意图类型\n  summary: string;         // 结果摘要\n  citations: SearchHit[];  // 引用列表\n  files: FileContext[];    // 文件级上下文\n  symbols: SymbolRecord[]; // 相关符号\n  graphPaths: GraphPath[];// 图路径连接\n  memoryHits: SearchHit[]; // 记忆命中\n  confidence: number;      // 置信度 0.1-0.92\n  tokenEstimate: number;   // 估算 token 数\n  budget: number;          // 预算上限\n  createdAt: string;      // 创建时间 (ISO)\n}\n```\n\n### 置信度计算\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n**置信度计算公式：**\n\n| 贡献来源 | 权重 |\n|---------|------|\n| 基础分 | 0.25 |\n| 每条命中 | +0.05 |\n| 每条图路径 | +0.02 |\n| 每条记忆命中 | +0.05 |\n| 最小值 | 0.1 |\n| 最大值 | 0.92 |\n\n资料来源：[src/search.ts:置信度计算](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## CLI 集成\n\n搜索系统通过命令行提供完整的交互接口：\n\n### 可用命令\n\n```bash\n# 搜索上下文\ncxf search \"<query>\" --workspace <path> --limit 10 --kind all|code|docs|symbols|memory\n\n# 创建证据包\ncxf query \"<query>\" --workspace <path> --budget 2000 --json\n\n# 追踪图路径\ncxf trace --from <symbol> --to <target> --edge-types imports|tests\n\n# 影响分析\ncxf impact <symbol_or_file>\n\n# 历史分析\ncxf why --target <symbol_or_file>\n```\n\n### 查询选项\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--limit` | number | 10 | 最大命中数 |\n| `--kind` | enum | all | 搜索类型 |\n| `--budget` | number | 2000 | token 预算 |\n| `--json` | boolean | false | JSON 输出格式 |\n\n资料来源：[src/cli.ts:CLI命令定义](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n\n## MCP 工具集成\n\nContextful 作为 MCP（Model Context Protocol）服务器运行，提供标准化的工具接口：\n\n### 核心工具\n\n| 工具名 | 功能 | 参数 |\n|-------|------|------|\n| `context_pack` | 创建证据包 | query, budget, scope |\n| `search_code` | 多模式搜索 | query, mode, filters |\n| `trace_path` | 图路径追踪 | from, to, edge_types |\n| `impact_analysis` | 影响分析 | symbol_or_file |\n| `why_changed` | 变更历史 | symbol_or_file |\n| `recall_memory` | 记忆检索 | query, scope |\n| `write_lesson` | 写入记忆 | claim, evidence_refs |\n\n### MCP 服务器启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n资料来源：[README.md:MCP工具](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n## 搜索流程图\n\n```mermaid\nsequenceDiagram\n    participant User as 用户\n    participant CLI as CLI/MCP\n    participant Search as 搜索系统\n    participant FTS as FTS引擎\n    participant Graph as 图数据库\n    participant Memory as 记忆库\n    participant Pack as 证据打包\n\n    User->>CLI: query \"where is auth handled\"\n    CLI->>Search: searchContext({query})\n    Search->>Search: classifyQuery()\n    Note over Search: intent = \"architectural\"\n    \n    Search->>FTS: executeQuery()\n    Search->>Graph: loadGraphPaths()\n    Search->>Memory: memoryHits()\n    \n    FTS-->>Search: hits[]\n    Graph-->>Search: graphPaths[]\n    Memory-->>Search: memoryHits[]\n    \n    Search->>Pack: createContextPack()\n    Pack->>Pack: calculateConfidence()\n    Pack->>Pack: estimateTokens()\n    Pack-->>CLI: EvidencePack\n    \n    CLI-->>User: 格式化输出\n```\n\n## 数据模型\n\n### SearchHit\n\n```typescript\ninterface SearchHit {\n  ref: string;       // 引用标识 (file:path:start-end)\n  path: string;       // 文件路径\n  title: string;      // 标题\n  text: string;       // 匹配文本\n  kind: \"code\" | \"doc\" | \"symbol\" | \"memory\";\n  score: number;      // 相关性得分\n  rank: number;       // BM25 排名\n  line?: number;      // 行号\n}\n```\n\n### SymbolRecord\n\n```typescript\ninterface SymbolRecord {\n  ref: string;\n  name: string;\n  kind: string;       // function, class, etc.\n  filePath: string;\n  line: number;\n  signature: string;  // 函数签名/类型签名\n  exported?: boolean;\n}\n```\n\n### GraphPath\n\n```typescript\ninterface GraphPath {\n  from: string;\n  to: string;\n  edgeType: string;\n  filePath: string;\n  line: number;\n}\n```\n\n资料来源：[src/search.ts:数据结构定义](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 高级功能\n\n### 影响分析\n\n`impactAnalysis` 函数执行反向依赖分析：\n\n```typescript\nexport async function impactAnalysis(options: {\n  workspace?: string;\n  target: string;\n  limit?: number;\n}): Promise<{\n  target: string;\n  dependencies: GraphPath[];\n  dependents: GraphPath[];\n  likelyTests: GraphPath[];\n}>\n```\n\n**返回数据说明：**\n\n| 字段 | 说明 |\n|-----|------|\n| `dependencies` | 目标直接依赖的模块 |\n| `dependents` | 依赖该目标的模块 |\n| `likelyTests` | 相关的测试文件 |\n\n### 变更历史分析\n\n`whyChanged` 函数结合搜索结果和 Git 历史：\n\n```typescript\nexport async function whyChanged(options: {\n  workspace?: string;\n  target: string;\n  limit?: number\n}): Promise<{\n  target: string;\n  currentEvidence: SearchHit[];\n  commits: Array<{\n    hash: string;\n    subject: string;\n    date?: string;\n    files: string[];\n  }>;\n}>\n```\n\n资料来源：[src/search.ts:高级搜索功能](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 索引状态查询\n\n```typescript\nexport async function getIndexStatus(options: { workspace?: string }): Promise<IndexStatus>\n```\n\n**返回的索引状态信息：**\n\n| 字段 | 类型 | 说明 |\n|-----|------|------|\n| `workspace` | string | 工作区路径 |\n| `status` | string | 索引状态 |\n| `fileCount` | number | 文件总数 |\n| `languageCounts` | Record<string, number> | 各语言文件统计 |\n| `warnings` | string[] | 索引警告列表 |\n\n## 搜索结果后处理\n\n### 去重机制\n\n```typescript\nfunction dedupeHits(hits: SearchHit[]): SearchHit[] {\n  const seen = new Set<string>();\n  return hits.filter((hit) => {\n    if (seen.has(hit.ref)) return false;\n    seen.add(hit.ref);\n    return true;\n  });\n}\n```\n\n### 得分计算\n\n搜索结果通过多层评分机制排序：\n\n1. **BM25 基础分**：FTS5 内置的 BM25 算法\n2. **意图匹配奖励**：根据意图类型调整权重\n3. **语义扩展奖励**：术语扩展匹配额外加分\n\n```typescript\nfunction scoreFromRank(rank: number, intent: SearchIntent, query: string): number {\n  const lower = query.toLowerCase();\n  let bonus = 0;\n  \n  // 意图特定奖励\n  if (intent === \"symbol\" && lower.includes(\"function\")) bonus += 10;\n  if (intent === \"memory\" && lower.includes(\"memory ledger\")) bonus += 7;\n  \n  return 10 / (1 + Math.abs(rank)) + bonus;\n}\n```\n\n资料来源：[src/search.ts:得分计算](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 总结\n\n搜索系统是 Contextful 实现智能上下文检索的核心引擎，通过以下机制为 AI 代理提供精确的代码上下文：\n\n1. **意图驱动的路由**：自动识别查询意图并选择最优搜索策略\n2. **多模态检索**：整合全文搜索、符号搜索、图搜索和记忆搜索\n3. **证据打包**：将零散的搜索结果整合为结构化的证据包\n4. **智能排序**：基于 BM25 和语义理解的结果排序\n5. **置信度评估**：量化的结果可信度指标\n\n该系统特别适用于大型代码库的场景，能够帮助 AI 代理快速定位相关代码片段，避免盲目探索，同时保留完整的引用溯源能力。\n\n---\n\n<a id='page-4'></a>\n\n## 上下文包系统\n\n### 相关页面\n\n相关主题：[搜索系统](#page-3), [内存分类账](#page-5), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n</details>\n\n# 上下文包系统\n\n上下文包（Context Pack）是 Contextful 的核心功能模块，它将索引后的代码上下文、符号信息、图关系和记忆数据打包成紧凑的、带引用的、符合 token 预算的证据束，供 AI Agent 在执行任务时使用。\n\n## 系统概述\n\n### 设计目标\n\n上下文包系统旨在解决 AI Agent 在大型代码库中检索上下文时的核心痛点：\n\n| 问题 | 上下文包解决方案 |\n|------|-----------------|\n| 随机文件读取导致 token 浪费 | 基于查询意图的精确检索 |\n| 缺乏可信引用 | 每个证据块都附带文件路径和行号 |\n| 无法追踪代码关系 | 集成图路径遍历结果 |\n| 遗忘跨会话经验 | 整合证据-backed 记忆数据 |\n\n### 核心数据类型\n\n上下文包的数据结构定义在 `src/types.ts` 中，主要包含以下组件：\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符，格式: ctx_<hash>\n  query: string;                 // 原始查询文本\n  scope: string;                 // 作用域（如 \"repo\"）\n  intent: SearchIntent;           // 查询意图分类\n  summary: string;               // 包内容的自然语言摘要\n  citations: SearchHit[];        // 命中的证据列表\n  files: FileContext[];          // 按文件分组的引用\n  symbols: SymbolRecord[];       // 相关符号记录\n  graphPaths: GraphPath[];       // 图关系路径\n  memoryHits: SearchHit[];       // 记忆命中结果\n  confidence: number;            // 置信度（0.1-0.92）\n  tokenEstimate: number;         // 实际 token 估算值\n  budget: number;                // 分配的 token 预算\n  createdAt: string;             // 创建时间（ISO 格式）\n}\n```\n\n资料来源：[src/search.ts:180-195]()\n\n## 工作流程\n\n### 上下文包创建流程\n\n```mermaid\ngraph TD\n    A[接收查询请求] --> B[分类查询意图]\n    B --> C{意图类型}\n    C -->|code| D[执行代码搜索]\n    C -->|docs| E[执行文档搜索]\n    C -->|symbol| F[执行符号搜索]\n    C -->|memory| G[搜索记忆数据]\n    C -->|impact| H[执行影响分析]\n    D --> I[检索图路径]\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    I --> J[根据 token 预算排序选择证据]\n    J --> K[生成置信度评分]\n    K --> L[构建上下文包]\n    L --> M[保存到数据库]\n    M --> N[返回 EvidencePack]\n```\n\n### 证据选择与排序\n\n上下文包使用分层策略选择证据：\n\n1. **意图匹配**：根据查询意图优先返回相关类型的命中结果\n2. **相关性评分**：使用 BM25 算法结合自定义调整因子\n3. **Token 预算约束**：按优先级遍历，直到达到预算上限\n\n```typescript\n// token 预算选择逻辑\nlet tokenEstimate = 0;\nconst selected: SearchHit[] = [];\n\nfor (const hit of scored) {\n  if (selected.some(s => s.ref === hit.ref)) continue;\n  if (tokenEstimate + hit.tokenEstimate >= budget) break;\n  selected.push(hit);\n  tokenEstimate += hit.tokenEstimate;\n}\n```\n\n资料来源：[src/search.ts:160-175]()\n\n## 意图分类系统\n\n### 意图类型定义\n\n| 意图类型 | 触发关键词 | 说明 |\n|----------|-----------|------|\n| `symbol` | 函数名、类名、常量 | 符号定义和引用查找 |\n| `code` | 实现、逻辑、算法 | 代码片段搜索 |\n| `docs` | 文档、README、如何 | 文档内容检索 |\n| `memory` | 记忆、经验、教训 | 证据-backed 记忆查询 |\n| `impact` | 影响、依赖、影响范围 | 影响分析 |\n| `historical` | 为什么、变更、历史 | Git 历史追溯 |\n| `architectural` | 架构、流程、调用链 | 架构分析 |\n| `exact` | 文件路径、行号、符号 | 精确匹配 |\n| `vague` | 无明确意图 | 模糊查询 |\n\n### 意图分类实现\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent {\n  if (/\\b(function|class|method|const|interface|type|struct)\\s+[A-Z]/.test(q)) return \"symbol\";\n  if (/\\b(where|find|search|locate|get|retrieve)\\b/.test(q)) return \"code\";\n  if (/\\b(memory|remember|learned|lessons?|sessions?)\\b/.test(q)) return \"memory\";\n  if (/\\b(impact|affected|depends on|dependents|blast radius|what uses|who calls)\\b/.test(q)) return \"impact\";\n  if (/\\b(why|changed|commit|history|regression|introduced)\\b/.test(q)) return \"historical\";\n  if (/\\b(architecture|flow|path|trace|connects|calls|imports|dependency)\\b/.test(q)) return \"architectural\";\n  if (/\\b(resource|docs|documentation|guide|readme|how to|setup)\\b/.test(q)) return \"docs\";\n  if (/[`\"'#.:/]/.test(q) || /\\b[A-Z][A-Za-z0-9_]{2,}\\b/.test(query)) return \"exact\";\n  return \"vague\";\n}\n```\n\n资料来源：[src/search.ts:1-14]()\n\n## 置信度评估\n\n### 置信度计算公式\n\n上下文包的置信度通过以下公式计算：\n\n```\nconfidence = clamp(0.25 + hits.length × 0.05 + graphPaths.length × 0.02 + memoryHits.length × 0.05, 0.1, 0.92)\n```\n\n| 组成部分 | 权重 | 说明 |\n|----------|------|------|\n| 基础分 | 0.25 | 最低置信度保证 |\n| 命中数 | +0.05/个 | 每个搜索命中增加置信度 |\n| 图路径数 | +0.02/个 | 每条图关系路径增加置信度 |\n| 记忆命中数 | +0.05/个 | 每个记忆命中增加置信度 |\n\n### 置信度边界\n\n置信度始终被限制在 `[0.1, 0.92]` 范围内，确保：\n\n- 最低 10% 置信度（无任何证据时）\n- 最高 92% 置信度（避免过度自信）\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n资料来源：[src/search.ts:89-91]()\n\n## 图关系集成\n\n### 图路径类型\n\n上下文包包含代码库中实体之间的图关系：\n\n```typescript\ninterface GraphPath {\n  from: string;        // 源实体名称\n  to: string;          // 目标实体名称\n  edgeType: string;    // 边类型（IMPORTS、DEFINES、CONFIGURES 等）\n  filePath: string;    // 关系所在文件\n  line: number;        // 关系所在行号\n}\n```\n\n### 边类型定义\n\n| 边类型 | 说明 | 提取来源 |\n|--------|------|----------|\n| `IMPORTS` | 模块导入关系 | TypeScript/Python/Go import 语句 |\n| `DEFINES` | 符号定义关系 | 函数、类、接口声明 |\n| `CONFIGURES` | 配置关系 | package.json 依赖、配置文件键 |\n| `TESTS` | 测试关系 | 测试文件与被测文件关联 |\n\n### 图路径加载\n\n```typescript\nfunction loadGraphPaths(db: Database, paths: string[], limit: number): GraphPath[] {\n  const rows = db.prepare(`\n    SELECT from_name, target_name, edge_type, file_path, line\n    FROM edges\n    WHERE file_path IN (${paths.map(() => \"?\").join(\",\")})\n    LIMIT ?\n  `).all(...paths, limit) as EdgeRow[];\n  \n  return rows.map(row => ({\n    from: row.from_name,\n    to: row.target_name,\n    edgeType: row.edge_type,\n    filePath: row.file_path,\n    line: row.line\n  }));\n}\n```\n\n资料来源：[src/search.ts:125-140]()\n\n## CLI 接口\n\n### 查询命令\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> --json\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `query` | 字符串 | 必需 | 要回答的查询文本 |\n| `--workspace` | 路径 | 当前目录 | 工作区路径 |\n| `--budget` | 整数 | 2000 | 近似的 token 预算 |\n| `--json` | 标志 | false | 输出 JSON 格式而非 Markdown |\n\n### 实现逻辑\n\n```typescript\nprogram\n  .command(\"query\")\n  .description(\"Create an evidence pack for a query.\")\n  .argument(\"<query>\", \"Query to answer from indexed context.\")\n  .option(\"--workspace <path>\", \"Workspace path.\", process.cwd())\n  .option(\"--budget <tokens>\", \"Approximate token budget.\", parseInteger, 2000)\n  .option(\"--json\", \"Print JSON instead of Markdown.\")\n  .action(async (query: string, options) => {\n    const pack = await createContextPack({ \n      workspace: options.workspace, \n      query, \n      budget: options.budget \n    });\n    process.stdout.write(\n      options.json \n        ? `${JSON.stringify(pack, null, 2)}\\n` \n        : renderEvidencePackMarkdown(pack)\n    );\n  });\n```\n\n资料来源：[src/cli.ts:20-36]()\n\n## Markdown 渲染\n\n### 渲染格式\n\nEvidence Pack 的 Markdown 渲染输出格式：\n\n```markdown\n# Context Pack ctx_xxx\n\nQuery: <原始查询>\nIntent: <意图类型>\nConfidence: <置信度百分比>\nToken estimate: <实际token数>/<预算token数>\n\n<摘要文本>\n\n## Citations\n- file:src/auth.ts:10-25 (User authentication handler)\n  <证据摘要>\n\n## Graph Paths\n- auth.ts --IMPORTS--> utils.ts (src/auth.ts:3)\n\n## Memory Hits\n- <记忆引用>: <记忆内容>\n```\n\n### 渲染实现\n\n```typescript\nexport function renderEvidencePackMarkdown(pack: EvidencePack): string {\n  const lines = [\n    `# Context Pack ${pack.id}`,\n    \"\",\n    `Query: ${pack.query}`,\n    `Intent: ${pack.intent}`,\n    `Confidence: ${Math.round(pack.confidence * 100)}%`,\n    `Token estimate: ${pack.tokenEstimate}/${pack.budget}`,\n    \"\",\n    pack.summary,\n    \"\",\n    \"## Citations\"\n  ];\n  \n  for (const hit of pack.citations) {\n    lines.push(`- ${hit.ref} (${hit.title})`);\n    lines.push(`  ${hit.excerpt}`);\n  }\n  // ... 图路径和记忆命中渲染\n  return lines.join(\"\\n\");\n}\n```\n\n资料来源：[src/report.ts:90-115]()\n\n## 数据持久化\n\n### 保存上下文包\n\n创建后的上下文包会被保存到内核数据库：\n\n```typescript\nfunction saveEvidencePack(\n  db: Database, \n  pack: { id: string; query: string; tokenEstimate: number; json: string }\n): void {\n  db.prepare(`\n    INSERT INTO evidence_packs (id, query, token_estimate, created_at, json)\n    VALUES (?, ?, ?, ?, ?)\n  `).run(pack.id, pack.query, pack.tokenEstimate, nowIso(), pack.json);\n}\n```\n\n### 数据库表结构\n\n| 表名 | 用途 |\n|------|------|\n| `chunks_fts` | 全文搜索索引 |\n| `symbols` | 符号索引 |\n| `edges` | 图关系边 |\n| `memory` | 证据-backed 记忆 |\n| `evidence_packs` | 已创建的上下文包历史 |\n\n## 与 MCP 工具集成\n\n### 核心 MCP 工具\n\n上下文包系统通过以下 MCP 工具暴露给 AI Agent：\n\n| 工具名称 | 功能 |\n|----------|------|\n| `context_pack` | 创建上下文包（核心功能） |\n| `search_code` | 代码、文档、符号、记忆搜索 |\n| `trace_path` | 图路径追踪 |\n| `impact_analysis` | 影响分析 |\n| `why_changed` | 变更历史追溯 |\n| `recall_memory` | 记忆召回 |\n\n资料来源：[README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n### 工具调用示例\n\n```json\n{\n  \"tool\": \"context_pack\",\n  \"arguments\": {\n    \"query\": \"用户认证逻辑在哪里\",\n    \"budget\": 2000,\n    \"scope\": \"repo\"\n  }\n}\n```\n\n## 扩展词项机制\n\n为提高搜索召回率，系统包含智能词项扩展：\n\n```typescript\nfunction expandedTerms(query: string): string[] {\n  const additions: string[] = [];\n  const lower = query.toLowerCase();\n  \n  if (/\\b(tool|tools|registered|register)\\b/.test(lower)) \n    additions.push(\"server\", \"tool\", \"tools\", \"callTool\");\n  \n  if (/\\bmcp\\b/.test(lower)) \n    additions.push(\"mcp\", \"server\", \"stdio\");\n  \n  if (/\\bmemory|memories|remember|remembers|lesson|lessons|learned\\b/.test(lower)) \n    additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n  \n  if (/\\bimpact|depends|dependents|uses\\b/.test(lower)) \n    additions.push(\"imports\", \"tests\", \"edges\");\n  \n  return [...terms, ...additions];\n}\n```\n\n资料来源：[src/search.ts:50-68]()\n\n## 总结\n\n上下文包系统是 Contextful 的核心模块，它通过以下机制为 AI Agent 提供精准、可信的代码上下文：\n\n1. **智能意图分类** — 自动识别查询类型并选择最佳搜索策略\n2. **Token 预算管理** — 确保返回内容在预算范围内\n3. **多源证据整合** — 合并代码片段、符号信息、图关系和记忆数据\n4. **置信度评估** — 提供可量化的结果可信度指标\n5. **持久化存储** — 记录查询历史以供分析和回溯\n\n通过 MCP 工具接口，AI Agent 可以方便地调用 `context_pack` 获取高质量的代码上下文，显著提升代码理解和任务完成效率。\n\n---\n\n<a id='page-5'></a>\n\n## 内存分类账\n\n### 相关页面\n\n相关主题：[搜索系统](#page-3), [上下文包系统](#page-4), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/memory.ts](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [src/db.ts](https://github.com/Inferensys/contextful/blob/main/src/db.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n</details>\n\n# 内存分类账\n\n内存分类账（Memory Ledger）是 Contextful 项目中的核心模块，用于存储和管理基于证据的经验教训。它允许 AI 代理在执行任务过程中积累可复用的知识，并通过引用具体的代码片段作为证据，确保记忆的可靠性和可追溯性。\n\n## 设计目标\n\n内存分类账解决了 AI 代码代理在长时间任务执行中面临的两个核心问题：\n\n1. **知识遗忘** - 代理无法记住跨会话的重要决策和经验\n2. **无据可查** - 记忆缺乏具体的代码引用，导致引用不准确\n\n通过建立证据分类账，代理能够：\n\n- 持久化存储项目特定的学习成果\n- 通过引用索引快速检索相关记忆\n- 在执行任务前调用已有记忆，避免重复踩坑\n- 为每条记忆维护置信度，支持动态更新\n\n资料来源：[src/memory.ts:1-30](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n\n## 核心数据模型\n\n### Lesson（经验教训）\n\n内存分类账中的基本存储单元是 Lesson 对象，其结构如下：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符，格式为 `les_{shortHash}` |\n| `claim` | string | 核心主张/结论，描述学到的经验 |\n| `evidence_refs` | string[] | 证据引用数组，每项格式为 `file:{path}:{startLine}-{endLine}` |\n| `scope` | string | 作用范围，如 \"repo\" |\n| `confidence` | number | 置信度，范围 0.0-1.0 |\n| `created_at` | string | ISO 时间戳 |\n| `supersedes` | string[] | 被替代的记忆 ID 列表 |\n\n资料来源：[src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n\n### 证据引用格式\n\n证据引用采用标准化格式，确保与代码索引系统无缝集成：\n\n```\nfile:src/auth.ts:1-20\n```\n\n| 组成部分 | 说明 |\n|----------|------|\n| `file` | 固定前缀，表示文件引用 |\n| `src/auth.ts` | 相对于工作区的文件路径 |\n| `1-20` | 代码行号范围 |\n\n资料来源：[src/memory.ts](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n\n## 架构设计\n\n### 系统组件\n\n```mermaid\ngraph TD\n    subgraph \"内存分类账核心\"\n        A[writeLesson] --> B[Lesson Store]\n        C[recallMemory] --> B\n        D[readEvidenceRefs] --> E[Chunk Loader]\n        E --> F[代码片段内容]\n    end\n    \n    subgraph \"持久化层\"\n        B --> G[SQLite Database]\n    end\n    \n    subgraph \"接入层\"\n        H[CLI memory 命令]\n        I[MCP Server Tools]\n        J[Query Search]\n    end\n    \n    H --> A\n    I --> A\n    I --> C\n    J -.-> C\n```\n\n### 工作流程\n\n```mermaid\nsequenceDiagram\n    participant Agent as AI 代理\n    participant MCP as MCP Server\n    participant Memory as 内存分类账\n    participant DB as SQLite\n    \n    Agent->>MCP: write_lesson(claim, evidence_refs)\n    MCP->>Memory: writeLesson(claim, evidenceRefs)\n    Memory->>DB: 存储 Lesson 记录\n    Memory-->>Agent: 返回 Lesson ID\n    \n    Agent->>MCP: recall_memory(query, scope)\n    MCP->>Memory: recallMemory(query, scope)\n    Memory->>DB: 全文检索匹配\n    Memory->>DB: 加载证据引用\n    Memory-->>Agent: 返回匹配的 Lesson 列表\n```\n\n## MCP 工具接口\n\n内存分类账通过 MCP（Model Context Protocol）提供服务端工具：\n\n### write_lesson\n\n写入一条基于证据的经验教训。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `claim` | string | 是 | 经验主张文本 |\n| `evidence_refs` | string[] | 是 | 证据引用数组 |\n| `scope` | string | 否 | 作用域，默认 \"repo\" |\n| `confidence` | number | 否 | 置信度，默认 0.7 |\n| `supersedes` | string | 否 | 被替代的记忆 ID |\n\n资料来源：[src/mcp-server.ts:60-78](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n\n```typescript\nserver.tool(\n  \"write_lesson\",\n  \"Write an evidence-backed lesson to the memory ledger. Loose remember-this notes are rejected.\",\n  {\n    claim: z.string(),\n    evidence_refs: z.array(z.string()),\n    scope: z.string().optional(),\n    confidence: z.number().optional(),\n    supersedes: z.string().optional()\n  },\n  async (params) =>\n    jsonContent(\n      await writeLesson({\n        workspace: params.workspace,\n        claim: params.claim,\n        evidenceRefs: params.evidence_refs,\n        scope: params.scope,\n        confidence: params.confidence,\n        supersedes: params.supersedes\n      })\n    )\n);\n```\n\n### recall_memory\n\n检索匹配的经验教训。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `query` | string | 是 | 检索查询字符串 |\n| `scope` | string | 否 | 作用域过滤 |\n| `limit` | number | 否 | 返回结果上限 |\n\n资料来源：[src/mcp-server.ts:50-59](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n\n```typescript\nserver.tool(\n  \"recall_memory\",\n  \"Search the evidence-backed memory ledger for lessons that survived previous agent sessions.\",\n  {\n    query: z.string(),\n    scope: z.string().optional(),\n    limit: z.number().optional()\n  },\n  async (params) => jsonContent(await recallMemory(params))\n);\n```\n\n## CLI 命令\n\n通过命令行界面管理内存分类账：\n\n```bash\ncxf memory add --claim <text> --evidence <ref...> [--workspace <path>] [--scope <scope>] [--confidence <number>]\n```\n\n### 命令参数\n\n| 参数 | 说明 |\n|------|------|\n| `--claim <text>` | **必填** 经验主张内容 |\n| `--evidence <ref...>` | **必填** 证据引用，至少一个 |\n| `--workspace <path>` | 工作区路径，默认为当前目录 |\n| `--scope <scope>` | 作用域，默认 \"repo\" |\n| `--confidence <number>` | 置信度 0-1，默认 0.7 |\n\n资料来源：[src/cli.ts:70-90](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n\n### 使用示例\n\n```bash\n# 基础用法\ncxf memory add --claim \"用户认证在 src/auth.ts 中处理\" --evidence \"file:src/auth.ts:1-50\"\n\n# 指定作用域和置信度\ncxf memory add \\\n  --claim \"数据库连接池大小应设为 CPU 核心数的 2 倍\" \\\n  --evidence \"file:src/db.ts:10-30\" \\\n  --evidence \"file:config/default.json:5-10\" \\\n  --scope \"repo\" \\\n  --confidence 0.85\n\n# 替代旧记忆\ncxf memory add \\\n  --claim \"新的配置管理方式已迁移到 config/v2\" \\\n  --evidence \"file:config/v2/index.ts:1-100\" \\\n  --supersedes \"les_abc123\"\n```\n\n## 存储实现\n\n### 数据库架构\n\n内存分类账使用 SQLite 存储，通过 `better-sqlite3` 实现同步操作：\n\n```mermaid\nerDiagram\n    LESSONS {\n        string id PK\n        string claim\n        string evidence_refs\n        string scope\n        float confidence\n        string created_at\n        string supersedes\n    }\n    \n    LESSONS_FTS {\n        string id PK\n        string claim\n    }\n```\n\n### 证据引用处理\n\n证据引用通过专门的解析器处理，将字符串引用转换为具体的代码内容：\n\n```typescript\n// 引用格式解析\nconst ref = \"file:src/auth.ts:1-20\";\nconst parsed = parseFileRef(ref);\n// 返回 { path: \"src/auth.ts\", startLine: 1, endLine: 20 }\n```\n\n资料来源：[src/search.ts:80-85](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 与搜索系统的集成\n\n### 查询分类增强\n\n内存分类账与搜索系统深度集成，当用户查询命中内存相关关键词时，系统会给予搜索加权：\n\n```typescript\nif (/\\bmemory|memories|remember|remembers|lesson|lessons|learned|session|sessions\\b/.test(lower)) {\n  additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n}\n```\n\n资料来源：[src/search.ts:45-50](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 记忆匹配优先级\n\n| 匹配条件 | 优先级调整 |\n|----------|------------|\n| 命中 \"memory ledger\" 或 \"evidence-backed memory\" | +7 |\n| 包含 `src/memory.ts` 引用 | +5 |\n| 包含 `readme.md` 引用 | +4 |\n| 包含搜索模块内部函数 | -8 至 -16 |\n\n## 置信度机制\n\n### 置信度计算\n\n每条记忆关联一个置信度分数，影响其在搜索结果中的排名：\n\n| 置信度范围 | 语义含义 |\n|------------|----------|\n| 0.8 - 1.0 | 高可信，经过充分验证 |\n| 0.5 - 0.8 | 中可信，基于合理推断 |\n| 0.2 - 0.5 | 低可信，需要进一步验证 |\n| 0.0 - 0.2 | 实验性，仅供参考 |\n\n### 置信度衰减\n\n长时间未使用的记忆会逐渐降低置信度，系统通过 `staleMemories` 机制跟踪这类记忆：\n\n```typescript\n// 在报告生成中检测陈旧记忆\nlines.push(\"\", \"## Stale Memories\");\nif (report.staleMemories.length === 0) lines.push(\"- No stale memories.\");\nfor (const memory of report.staleMemories) {\n  lines.push(`- ${memory.id}: ${memory.claim}`);\n}\n```\n\n资料来源：[src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n\n## 使用场景\n\n### 场景一：跨会话知识传递\n\n```mermaid\ngraph LR\n    A[Session 1: 发现问题] --> B[write_lesson]\n    B --> C[存储到 Ledger]\n    C --> D[Session 2: 遇到类似问题]\n    D --> E[recall_memory]\n    E --> F[获取历史经验]\n```\n\n### 场景二：代码变更影响评估\n\n代理在修改共享模块前，通过内存分类账查找相关历史决策：\n\n```bash\n# 查询某模块的历史记忆\ncxf query \"为什么这里使用缓存\" --workspace .\n# 或通过 MCP\nrecall_memory(query=\"缓存策略决策\", scope=\"repo\")\n```\n\n### 场景三：证据驱动的决策\n\n每条记忆必须包含证据引用，避免无依据的主观判断：\n\n| 有效记忆 | 无效记忆 |\n|----------|----------|\n| \"配置迁移到 config/v2，因为原有配置结构存在循环依赖问题\" | \"配置管理很重要\" |\n| 证据：`file:config/v1/base.ts:20-30` | 无证据引用 |\n\n## 最佳实践\n\n### 撰写有效的经验主张\n\n1. **明确具体** - 包含具体的文件路径、函数名或配置项\n2. **包含证据** - 每条主张至少引用一个代码片段\n3. **合理置信度** - 根据验证程度设置合适的置信度\n4. **及时更新** - 发现新信息时替代旧记忆\n\n### 证据引用规范\n\n- 使用精确的行号范围，避免整文件引用\n- 优先引用关键决策点而非辅助代码\n- 定期验证证据引用仍然有效\n\n### 作用域策略\n\n| 作用域 | 适用场景 |\n|--------|----------|\n| `repo` | 项目级通用经验 |\n| `module:auth` | 模块特定知识 |\n| `feature:checkout` | 功能特定决策 |\n\n## 相关文档\n\n- [CLI 使用指南](../cli.md)\n- [MCP 服务器配置](../mcp-server.md)\n- [搜索与检索系统](./搜索系统.md)\n- [索引系统](./索引系统.md)\n\n---\n\n<a id='page-6'></a>\n\n## 数据存储与索引\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [搜索系统](#page-3), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n</details>\n\n# 数据存储与索引\n\n## 概述\n\nContextful 的数据存储与索引系统是整个工具的核心基础设施，负责将代码仓库转换为可高效查询的索引数据库。该系统基于 SQLite 构建，使用全文搜索（FTS）技术实现快速准确的语义检索，并为代码图谱、符号索引和证据包提供持久化存储。\n\n索引系统的主要职责包括：\n\n- 解析多种编程语言的代码结构，提取符号（函数、类、接口等）\n- 分析代码依赖关系，构建模块间的导入/导出图谱\n- 将文件内容分块并建立全文索引\n- 管理证据包（Evidence Pack）和记忆（Memory）数据\n- 提供 CLI 命令和 MCP 接口供外部调用\n\n资料来源：[README.md:1-10]()\n\n## 核心架构\n\n### 技术选型\n\n| 技术组件 | 用途 | 资料来源 |\n|---------|------|---------|\n| SQLite + better-sqlite3 | 关系型数据存储 | package.json |\n| FTS5 全文索引 | 文本搜索 | src/search.ts |\n| Tree-sitter | 代码解析与 AST 提取 | package.json |\n| Fast-glob | 文件模式匹配 | package.json |\n\nContextful 选择 SQLite 作为存储引擎，主要考虑其轻量级、无需独立服务器进程的特性，非常适合本地开发环境和 CLI 工具场景。全文章索引使用 SQLite 的 FTS5 扩展实现，支持 BM25 排序算法和复杂的 MATCH 查询语法。\n\n资料来源：[package.json:20-35]()\n\n### 数据库结构概览\n\n```mermaid\ngraph TD\n    A[文件系统] --> B[文件解析]\n    B --> C[符号提取 extractSymbols]\n    B --> D[边提取 extractEdges]\n    B --> E[内容分块]\n    C --> F[symbols 表]\n    D --> G[edges 表]\n    E --> H[chunks 表]\n    H --> I[chunks_fts 全文索引]\n    F --> J[MCP 查询接口]\n    G --> J\n    H --> J\n```\n\n## 数据提取模块\n\n### 符号提取（extractSymbols）\n\n`extractSymbols` 函数负责从源代码中提取各种编程结构，返回包含名称、种类、所在行号和签名的符号记录数组。该函数支持的语言及对应的提取模式如下：\n\n资料来源：[src/extract.ts:1-50]()\n\n#### TypeScript / JavaScript 提取规则\n\n| 语言元素 | 正则模式 | 符号种类 |\n|---------|---------|---------|\n| 函数 | `export async function` 或 `function` | function |\n| 类 | `export class` | class |\n| 接口 | `export interface` | interface |\n| 类型别名 | `export type` | type |\n| 常量箭头函数 | `export const ... =>` | function |\n\n```typescript\n// 提取逻辑示例\nmatchPush(line, /^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/, push, \"function\");\nmatchPush(line, /^\\s*(export\\s+)?class\\s+([A-Za-z_$][\\w$]*)/, push, \"class\");\n```\n\n资料来源：[src/extract.ts:10-18]()\n\n#### Python 提取规则\n\nPython 支持函数和类的提取，使用缩进敏感的解析方式：\n\n```python\nconst def = line.match(/^\\s*(?:async\\s+)?def\\s+([A-Za-z_][\\w]*)/);\nif (def) push(def[1], \"function\");\nconst cls = line.match(/^\\s*class\\s+([A-Za-z_][\\w]*)/);\nif (cls) push(cls[1], \"class\");\n```\n\n#### Rust 提取规则\n\nRust 支持函数、结构体、枚举、Trait 和 impl 块的提取：\n\n```typescript\nmatchPush(line, /^\\s*(pub\\s+)?fn\\s+([A-Za-z_][\\w]*)/, push, \"function\");\nmatchPush(line, /^\\s*(pub\\s+)?struct\\s+([A-Za-z_][\\w]*)/, push, \"struct\");\nmatchPush(line, /^\\s*(pub\\s+)?enum\\s+([A-Za-z_][\\w]*)/, push, \"enum\");\n```\n\n资料来源：[src/extract.ts:45-55]()\n\n#### Markdown 标题提取\n\nMarkdown 文件会被提取为标题层级结构：\n\n```typescript\nconst heading = line.match(/^(#{1,6})\\s+(.+)$/);\nif (heading) push(heading[2].trim(), \"heading\");\n```\n\n### 边提取（extractEdges）\n\n`extractEdges` 函数分析代码中的导入语句，构建模块间的依赖图谱。返回的边记录包含源文件名、行号和目标模块信息。\n\n资料来源：[src/extract.ts:60-90]()\n\n#### 各语言导入解析规则\n\n| 语言 | 导入语法 | 正则匹配 |\n|-----|---------|---------|\n| TypeScript/JS (ES Module) | `import ... from \"...\"` | `from\\s+[\"']([^\"']+)[\"']` |\n| TypeScript/JS (CommonJS) | `require(\"...\")` | `require\\([\"']([^\"']+)[\"']` |\n| Python | `from ... import` 或 `import ...` | `^\\s*from\\s+([\\w.]+)\\s+import` |\n| Go | `import \"...\"` | `\"([^\"]+)\"` |\n| Rust | `use ...;` 或 `mod ...;` | `^\\s*use\\s+([^;]+);` |\n\n#### package.json 依赖提取\n\n当处理 `package.json` 文件时，系统会额外解析依赖配置：\n\n```typescript\nfor (const section of [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"scripts\"]) {\n  const values = parsed[section];\n  if (!values || typeof values !== \"object\") continue;\n  for (const key of Object.keys(values)) {\n    edges.push({ targetName: `${section}:${key}`, targetType: \"config\", edgeType: \"CONFIGURES\", line: 1 });\n  }\n}\n```\n\n资料来源：[src/extract.ts:100-115]()\n\n## 内容分块策略\n\n### 分块模式\n\nContextful 使用多层次的分块策略将文件内容转换为可管理的检索单元：\n\n资料来源：[src/extract.ts:140-180]()\n\n| 分块类型 | 生成方式 | 适用场景 |\n|---------|---------|---------|\n| 符号块 (symbol) | 以符号定义为边界，最多延伸60行 | 精确查找函数/类定义 |\n| 文件块 (file) | 80行窗口滑动分块 | 文档和较大代码段 |\n| 文档块 (doc) | 以 Markdown 标题分割 | 文档检索 |\n\n### 分块记录结构\n\n```typescript\ninterface ChunkRecord {\n  ref: string;           // 引用标识符，格式: file:path:start-end\n  filePath: string;      // 文件路径\n  startLine: number;     // 起始行号\n  endLine: number;       // 结束行号\n  kind: \"symbol\" | \"file\" | \"doc\";  // 分块类型\n  title: string;         // 显示标题\n  text: string;          // 原始文本内容\n  tokenEstimate: number; // token 数量估算\n}\n```\n\n### Markdown 特殊处理\n\nMarkdown 文件的分块逻辑与代码文件不同，会首先提取所有标题层级：\n\n```typescript\nconst headings: Array<{ title: string; line: number }> = [];\nlines.forEach((line, index) => {\n  const match = line.match(/^(#{1,6})\\s+(.+)$/);\n  if (match) headings.push({ title: match[2].trim(), line: index + 1 });\n});\n```\n\n每个标题到下一个标题之间的内容构成一个独立的文档块，便于精确定位文档内容。\n\n## 全文搜索实现\n\n### FTS 查询构建\n\nContextful 使用增强的 FTS 查询语法提升搜索效果：\n\n资料来源：[src/search.ts:20-60]()\n\n```typescript\nfunction ftsQuery(query: string): string {\n  // 1. 展开查询术语，添加同义词和关联词\n  const expanded = expandedTerms(query);\n  // 2. 组合为 FTS5 MATCH 表达式\n  return expanded.map(t => `\"${t}\"*`).join(\" OR \");\n}\n```\n\n### 搜索意图分类\n\n系统通过正则表达式匹配查询特征，自动识别用户意图：\n\n| 意图类型 | 检测关键词 | 搜索策略 |\n|---------|-----------|---------|\n| memory | memory, remember, lesson | 记忆库检索 |\n| impact | impact, affected, depends | 影响分析 |\n| historical | why, changed, commit | 历史追溯 |\n| architectural | architecture, flow, trace | 架构追踪 |\n| docs | docs, documentation, how to | 文档检索 |\n| exact | 代码符号、路径引用 | 精确匹配 |\n| vague | 其他模糊查询 | 宽松匹配 |\n\n资料来源：[src/search.ts:1-20]()\n\n### 搜索结果排序\n\n搜索结果使用 BM25 算法结合自定义权重进行排序：\n\n```typescript\nfunction scoreFromRank(rank: number, query: string, path?: string): number {\n  const lower = query.toLowerCase();\n  const pathLower = path?.toLowerCase() || \"\";\n  let bonus = 0;\n  \n  // 路径匹配奖励\n  if (terms.some(t => pathLower.includes(t))) bonus += 5;\n  \n  // 特定文件奖励/惩罚\n  if (pathLower.includes(\"memory\")) bonus += 5;\n  if (pathLower.includes(\"readme\")) bonus += 4;\n  \n  return 10 / (1 + Math.abs(rank)) + bonus;\n}\n```\n\n## 证据包（Evidence Pack）\n\n### 创建流程\n\n证据包是 Contextful 查询的最终输出，聚合了搜索结果、图谱路径和记忆数据：\n\n```mermaid\ngraph TD\n    A[用户查询] --> B[searchContext]\n    B --> C{意图分类}\n    C --> D[FTS 搜索]\n    C --> E[记忆检索]\n    D --> F[结果去重]\n    E --> F\n    F --> G[Token 预算分配]\n    G --> H[图谱路径扩展]\n    H --> I[生成 Evidence Pack]\n```\n\n### 证据包数据结构\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符\n  query: string;                 // 原始查询\n  scope: string;                // 查询范围\n  intent: SearchIntent;         // 识别的意图类型\n  summary: string;              // 结果摘要\n  citations: SearchHit[];       // 搜索命中结果\n  files: Array<{                // 相关文件\n    path: string;\n    reason: string;\n    refs: string[];\n  }>;\n  symbols: SymbolRecord[];       // 符号信息\n  graphPaths: GraphPath[];      // 图谱路径\n  memoryHits: SearchHit[];       // 记忆命中\n  confidence: number;           // 置信度 (0.1-0.92)\n  tokenEstimate: number;        // Token 估算\n  budget: number;               // 预算上限\n  createdAt: string;            // 创建时间\n}\n```\n\n### 置信度计算\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n置信度基于命中数量、图谱连接数和记忆命中数计算，最低 0.1，最高 0.92。\n\n## CLI 命令接口\n\n### 索引命令\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n索引命令扫描工作区文件，调用符号提取和边提取模块，将结果存储到 SQLite 数据库。\n\n### 查询命令\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget 2000 --json\n```\n\n执行查询并返回格式化的证据包，支持 JSON 输出模式。\n\n### 搜索命令\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit 10 --kind all\n```\n\n支持按类型过滤：`all|code|docs|symbols|memory`。\n\n### 报告命令\n\n```bash\ncxf report --workspace <path> --format markdown|json|html\n```\n\n生成工作区的上下文报告，包含文件统计、符号分布和警告信息。\n\n资料来源：[src/cli.ts:1-50]()\n\n## 工具函数库\n\n### 文本处理\n\n`src/util.ts` 提供了索引过程中常用的文本处理函数：\n\n```typescript\nexport function lineRange(text: string, startLine: number, endLine: number): string {\n  const lines = text.split(/\\r?\\n/);\n  return lines.slice(Math.max(0, startLine - 1), Math.min(lines.length, endLine)).join(\"\\n\");\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.max(min, Math.min(max, value));\n}\n```\n\n`lineRange` 函数用于按行号范围提取文本片段，是分块策略的基础工具。`clamp` 函数确保数值在指定范围内，用于置信度计算。\n\n### 二进制文件检测\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n索引过程会跳过二进制文件以节省存储空间和提升检索效率。\n\n资料来源：[src/util.ts:1-30]()\n\n## MCP 服务器集成\n\nContextful 支持以 MCP（Model Context Protocol）服务器模式运行，提供标准化工具接口：\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### 核心工具列表\n\n| 工具名称 | 功能描述 |\n|---------|---------|\n| context_pack | 生成带证据包的上下文响应 |\n| search_code | 代码、文档、符号和记忆搜索 |\n| trace_path | 图谱遍历追踪依赖路径 |\n| impact_analysis | 影响分析和反向依赖查找 |\n| why_changed | 变更历史追溯 |\n| recall_memory | 检索持久化的项目记忆 |\n\n资料来源：[README.md:25-40]()\n\n## 性能优化策略\n\n### Token 估算与预算控制\n\n系统使用简单的 token 估算方法控制输出大小：\n\n```typescript\nfunction estimateTokens(text: string): number {\n  return Math.ceil(text.length / 4);  // 粗略估算：每4字符约1个token\n}\n```\n\n证据包生成时会根据用户指定的 `budget` 参数筛选内容，确保返回的上下文在 token 预算范围内。\n\n### 结果去重\n\n搜索结果通过引用标识符进行去重：\n\n```typescript\nfunction dedupeHits(hits: SearchHit[]): SearchHit[] {\n  const seen = new Set<string>();\n  return hits.filter((hit) => {\n    if (seen.has(hit.ref)) return false;\n    seen.add(hit.ref);\n    return true;\n  });\n}\n```\n\n### 图谱剪枝\n\n图谱查询支持深度限制，防止返回过大的依赖路径：\n\n```typescript\nconst graphPaths = loadGraphPaths(kernel.db, paths, 20);  // 限制最多20条路径\n```\n\n## 总结\n\nContextful 的数据存储与索引系统通过模块化的设计实现了高效的代码检索能力。符号提取与边分析模块支持多种主流编程语言，SQLite+FTS5 的组合提供了可靠且快速的全文搜索能力。证据包机制将搜索结果包装为结构化的上下文响应，便于 AI 代理直接使用。整个系统的设计强调实用性和可扩展性，是构建代码智能助手的重要基础设施。\n\n---\n\n<a id='page-7'></a>\n\n## MCP 服务器集成\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [CLI 命令行工具](#page-9), [部署与配置](#page-10)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n</details>\n\n# MCP 服务器集成\n\n## 概述\n\nContextful 项目通过 MCP（Model Context Protocol）协议提供服务器集成能力，使其能够作为标准的 MCP 服务器运行，为 AI 代理提供代码上下文理解服务。\n\nMCP 服务器集成的核心设计理念是：**代理请求上下文，Contextful 返回紧凑的证据包**。这种设计避免了强制 AI 代理读取大量随机文件，通过结构化的证据打包机制提供精准、相关的上下文信息。\n\n## 核心功能\n\nContextful MCP 服务器暴露以下核心工具：\n\n| 工具名称 | 功能描述 |\n|---------|---------|\n| `context_pack` | 返回排名、引用、令牌预算内的证据包 |\n| `search_code` | 强大的代码、文档、符号和内存搜索 |\n| `trace_path` | 在文件、符号、模块和配置之间进行图遍历 |\n| `impact_analysis` | 逆向依赖和可能的测试 |\n| `why_changed` | 当前证据加 Git 历史 |\n| `recall_memory` | 搜索会话学习记录和持久化的项目经验 |\n| `write_lesson` | 写入带证据支撑的经验教训 |\n\n## 架构设计\n\n```mermaid\ngraph TD\n    A[AI 代理] -->|MCP 协议| B[Contextful MCP 服务器]\n    B --> C{功能路由}\n    C -->|上下文打包| D[createContextPack]\n    C -->|代码搜索| E[searchContext]\n    C -->|图路径追踪| F[traceGraph]\n    C -->|影响分析| G[impactAnalysis]\n    C -->|历史分析| H[whyChanged]\n    C -->|记忆检索| I[recallMemory]\n    D --> J[SQLite Kernel DB]\n    E --> J\n    F --> J\n    G --> J\n    H --> J\n    I --> J\n```\n\n## 工具参数规范\n\n### context_pack\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| query | string | 是 | 要回答的查询 |\n| budget | number | 否 | 令牌预算，默认 2000 |\n| scope | string | 否 | 搜索范围，默认 \"repo\" |\n\n### search_code\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| query | string | 是 | 搜索查询 |\n| mode | string | 否 | 搜索模式 |\n| filters | object | 否 | 过滤条件 |\n\n### trace_path\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| from | string | 是 | 起始节点 |\n| to | string | 否 | 目标节点 |\n| edge_types | string[] | 否 | 边类型过滤 |\n\n## 搜索意图分类\n\n系统会根据查询内容自动分类搜索意图：\n\n| 意图类型 | 触发关键词 | 说明 |\n|---------|-----------|------|\n| code | function, class, variable | 代码实体搜索 |\n| memory | memory, lesson, learned | 记忆和经验检索 |\n| impact | impact, depends, affected | 影响范围分析 |\n| historical | why, history, commit | 历史变更追溯 |\n| architectural | architecture, flow, dependency | 架构依赖分析 |\n| docs | documentation, readme, how to | 文档搜索 |\n\n资料来源：[src/search.ts:1-15]()\n\n## 查询扩展机制\n\n系统包含智能查询扩展功能，根据用户查询自动添加相关术语：\n\n```typescript\n// 相关术语扩展示例\nif (/\\b(tool|tools|registered|register)\\b/.test(lower)) {\n  additions.push(\"server\", \"tool\", \"tools\", \"callTool\");\n}\nif (/\\bmcp\\b/.test(lower)) {\n  additions.push(\"mcp\", \"server\", \"stdio\");\n}\nif (/\\bmemory|memories|remember\\b/.test(lower)) {\n  additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n}\n```\n\n资料来源：[src/search.ts:45-60]()\n\n## 证据包结构\n\n`context_pack` 返回的结构化证据包包含以下字段：\n\n| 字段 | 类型 | 说明 |\n|-----|------|------|\n| id | string | 唯一标识符 |\n| query | string | 原始查询 |\n| intent | SearchIntent | 检测到的搜索意图 |\n| summary | string | 证据摘要 |\n| citations | SearchHit[] | 引用列表 |\n| files | FileInfo[] | 相关文件信息 |\n| symbols | SymbolRecord[] | 相关符号 |\n| graphPaths | GraphPath[] | 图路径连接 |\n| memoryHits | SearchHit[] | 记忆命中 |\n| confidence | number | 置信度 0-1 |\n| tokenEstimate | number | 令牌估算 |\n| budget | number | 令牌预算 |\n| createdAt | string | 创建时间 |\n\n## 启动方式\n\n### CLI 命令行启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### MCP 服务器配置\n\n服务器注册名称为 `io.github.Inferensys/contextful`，可通过 `server.json` 进行配置：\n\n```json\n{\n  \"mcpServers\": {\n    \"contextful\": {\n      \"command\": \"npx\",\n      \"args\": [\"@inferensys/contextful\", \"server\"]\n    }\n  }\n}\n```\n\n资料来源：[package.json:40]()\n\n## 依赖关系\n\nMCP 服务器集成依赖以下核心包：\n\n| 依赖包 | 版本 | 用途 |\n|-------|------|------|\n| @modelcontextprotocol/sdk | ^1.29.0 | MCP 协议实现 |\n| better-sqlite3 | ^12.10.0 | 本地索引数据库 |\n| zod | ^4.4.3 | 类型验证 |\n\n资料来源：[package.json:19-32]()\n\n## 内存管理功能\n\nMCP 服务器提供持久化的记忆功能，支持通过 CLI 添加经验教训：\n\n```bash\ncxf memory add \\\n  --claim \"使用 JWT 时必须验证签名\" \\\n  --evidence \"file:src/auth.ts:1-50\" \\\n  --scope \"repo\" \\\n  --confidence 0.9\n```\n\n记忆数据与搜索系统集成，在相关查询时可以自动召回。\n\n## 与 AI IDE 的集成\n\nContextful 支持多种 AI 编程辅助工具的 MCP 集成：\n\n- Windsurf\n- GitHub Copilot\n- VS Code\n- Cline\n- Roo Code\n- Continue\n- Zed\n\n资料来源：[package.json:8-15]()\n\n## 工作流程示例\n\n```mermaid\nsequenceDiagram\n    participant Agent as AI 代理\n    participant MCP as Contextful MCP\n    participant Kernel as Kernel DB\n    participant FS as 文件系统\n\n    Agent->>MCP: context_pack(\"用户认证逻辑在哪\")\n    MCP->>Kernel: 搜索相关索引\n    Kernel-->>MCP: 命中结果 + 图路径\n    MCP->>MCP: 构建证据包\n    MCP->>Agent: 返回紧凑证据包\n    Agent->>Agent: 基于证据回答\n```\n\n## 总结\n\nMCP 服务器集成是 Contextful 的核心交互接口，它将复杂的代码索引和搜索能力通过标准化的 MCP 协议暴露给 AI 代理。通过结构化的证据包、图路径追踪和记忆系统，代理能够获得精准、可靠且可追溯的代码上下文，显著提升代码理解任务的准确性。\n\n---\n\n<a id='page-8'></a>\n\n## 解析与代码提取\n\n### 相关页面\n\n相关主题：[数据存储与索引](#page-6), [搜索系统](#page-3)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 解析与代码提取\n\n## 概述\n\n解析与代码提取是 Contextful 项目中负责将源代码文件转换为可索引、可搜索的结构化数据的关键模块。该模块位于 `src/extract.ts`，是整个上下文检索系统的核心基础设施。其主要职责包括：\n\n- **符号提取**：从源代码中识别函数、类、接口、类型等定义\n- **边关系提取**：解析文件间的导入依赖关系\n- **代码分块**：将大型文件语义化拆分为可管理的片段\n- **Markdown 处理**：提取标题结构并按章节分块\n\n资料来源：[src/extract.ts:1-50]()\n\n## 核心功能架构\n\n```graph TD\n    A[源代码文件] --> B{文件类型判断}\n    B -->|TypeScript/JavaScript| C[TypeScript/JS 解析器]\n    B -->|Python| D[Python 解析器]\n    B -->|Go| E[Go 解析器]\n    B -->|Rust| F[Rust 解析器]\n    B -->|Markdown| G[Markdown 处理器]\n    B -->|JSON| H[JSON 处理器]\n    \n    C --> I[extractSymbols]\n    D --> I\n    E --> I\n    F --> I\n    \n    I --> J[符号列表]\n    C --> K[extractEdges]\n    D --> K\n    E --> K\n    F --> K\n    H --> K\n    \n    K --> L[边关系列表]\n    J --> M[codeChunks]\n    L --> M\n    \n    G --> N[markdownChunks]\n    N --> O[文档分块]\n    M --> P[索引数据库]\n    O --> P\n```\n\n## 符号提取详解\n\n### extractSymbols 函数\n\n`extractSymbols` 是符号提取的主入口函数，通过正则表达式匹配源代码中的各种声明语句。\n\n资料来源：[src/extract.ts:50-100]()\n\n#### 支持的语言与符号类型\n\n| 语言 | 符号类型 | 正则模式 |\n|------|----------|----------|\n| TypeScript/JavaScript | 函数 | `/^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 类 | `/^\\s*(export\\s+)?class\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 接口 | `/^\\s*(export\\s+)?interface\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 类型 | `/^\\s*(export\\s+)?type\\s+([A-Za-z_$][\\w$]*)/` |\n| Python | 函数 | `/^\\s*(?:async\\s+)?def\\s+([A-Za-z_][\\w]*)/` |\n| Python | 类 | `/^\\s*class\\s+([A-Za-z_][\\w]*)/` |\n| Go | 函数 | `/^\\s*func\\s+(?:\\([^)]*\\)\\s*)?([A-Za-z_][\\w]*)/` |\n| Go | 结构体/接口 | `/^\\s*type\\s+([A-Za-z_][\\w]*)\\s+(struct\\|interface)/` |\n| Rust | 函数 | `/^\\s*(pub\\s+)?fn\\s+([A-Za-z_][\\w]*)/` |\n| Rust | 结构体 | `/^\\s*(pub\\s+)?struct\\s+([A-Za-z_][\\w]*)/` |\n| Rust | 枚举 | `/^\\s*(pub\\s+)?enum\\s+([A-Za-z_][\\w]*)/` |\n| Rust | Trait | `/^\\s*(pub\\s+)?trait\\s+([A-Za-z_][\\w]*)/` |\n\n#### matchPush 辅助函数\n\n`matchPush` 是一个通用的高阶函数，用于将正则匹配结果转换为符号记录：\n\n```typescript\nfunction matchPush(\n  line: string,\n  pattern: RegExp,\n  push: (name: string, kind: string, exported?: boolean) => void,\n  kind: string\n): void {\n  const match = line.match(pattern);\n  if (!match) return;\n  push(match[2], kind, Boolean(match[1]));\n}\n```\n\n该函数的设计允许：\n- 捕获符号名称（match[2]）\n- 标记导出状态（match[1] 匹配 `export` 关键字）\n- 统一处理不同类型的符号\n\n资料来源：[src/extract.ts:120-130]()\n\n## 边关系提取详解\n\n### extractEdges 函数\n\n`extractEdges` 函数负责解析代码中的导入语句，构建模块间的依赖图。\n\n资料来源：[src/extract.ts:135-180]()\n\n#### 各语言的导入语句识别\n\n| 语言 | 导入类型 | 正则/匹配模式 |\n|------|----------|---------------|\n| TypeScript/JavaScript | ES Module | `/(?:from\\s+\\|import\\s*)[\"']([^\"']+)[\"']/g` |\n| TypeScript/JavaScript | CommonJS | `/require\\([\"']([^\"']+)[\"']\\)/g` |\n| Python | from import | `/^\\s*from\\s+([\\w.]+)\\s+import\\s+/` |\n| Python | import | `/^\\s*import\\s+([\\w.]+)/` |\n| Go | 导入路径 | `/\"([^\"]+)\"/g` |\n| Rust | use 语句 | `/^\\s*use\\s+([^;]+);/` |\n| Rust | mod 声明 | `/^\\s*mod\\s+([A-Za-z_][\\w]*);/` |\n\n#### 特殊的 package.json 处理\n\n当文件路径以 `package.json` 结尾时，函数会解析 JSON 内容并生成配置依赖边：\n\n```typescript\nif (relativePath.endsWith(\"package.json\")) {\n  try {\n    const parsed = JSON.parse(content) as Record<string, unknown>;\n    for (const section of [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"scripts\"]) {\n      const values = parsed[section];\n      if (!values || typeof values !== \"object\") continue;\n      for (const key of Object.keys(values)) {\n        edges.push({ targetName: `${section}:${key}`, targetType: \"config\", edgeType: \"CONFIGURES\", line: 1 });\n      }\n    }\n  } catch {\n    // Broken JSON 处理\n  }\n}\n```\n\n资料来源：[src/extract.ts:175-195]()\n\n## 代码分块机制\n\n### 分块策略概览\n\nContextful 实现了多种分块策略以适应不同的文件类型和搜索需求：\n\n```graph TD\n    A[输入文件] --> B{文件类型}\n    B -->|代码文件| C[codeChunks]\n    B -->|Markdown| D[markdownChunks]\n    B -->|纯文本| E[textChunks]\n    \n    C --> F[符号边界分块]\n    C --> G[空行分块]\n    G --> H[合并小片段]\n    F --> H\n    H --> I[生成 ChunkRecord]\n    \n    D --> J[提取标题]\n    J --> K[按标题切分]\n    K --> I\n    \n    E --> L[固定行数分块]\n    L --> I\n```\n\n### codeChunks 函数\n\n`codeChunks` 是代码文件的主要分块实现，采用以下策略：\n\n1. **空行分割**：在空行处将文件分割为候选块\n2. **符号保护**：确保函数/类定义的完整性不被分割\n3. **小片段合并**：将行数过少的片段合并到前一个块\n4. **测试文件优先**：测试文件中的相关代码会被优先选中\n\n```typescript\nfunction codeChunks(relativePath: string, content: string, language: string): ChunkRecord[] {\n  const symbols = extractSymbols(relativePath, content, language);\n  const symbolLines = new Set(symbols.map((s) => s.line));\n  \n  // 空行分割逻辑...\n  // 符号边界保护...\n  // 小片段合并...\n  \n  return chunks;\n}\n```\n\n资料来源：[src/extract.ts:200-250]()\n\n### 测试文件识别\n\n`isTestFile` 函数使用以下模式识别测试文件：\n\n```typescript\nfunction isTestFile(relativePath: string): boolean {\n  return /(^|\\/)(tests?|__tests__)\\/|(\\.|-)(test|spec)\\.[A-Za-z]+$/.test(relativePath);\n}\n```\n\n符合以下任一条件的文件将被识别为测试文件：\n- 目录名包含 `test`、`tests`、`__tests__`\n- 文件名以 `.test`、`-test`、`.spec`、`-spec` 结尾\n\n资料来源：[src/extract.ts:260-265]()\n\n## Markdown 处理\n\n### markdownChunks 函数\n\nMarkdown 文件的分块基于标题结构：\n\n```typescript\nfunction markdownChunks(relativePath: string, content: string): ChunkRecord[] {\n  const lines = content.split(/\\r?\\n/);\n  const headings: Array<{ title: string; line: number }> = [];\n  \n  // 提取所有标题 (# 到 ######)\n  lines.forEach((line, index) => {\n    const match = line.match(/^(#{1,6})\\s+(.+)$/);\n    if (match) headings.push({ title: match[2].trim(), line: index + 1 });\n  });\n  \n  // 无标题时返回整个文件\n  // 有标题时按标题切分\n}\n```\n\n资料来源：[src/extract.ts:280-310]()\n\n## CLI 命令集成\n\n解析与代码提取功能通过 CLI 模块对外提供服务：\n\n```graph TD\n    A[CLI 入口] --> B[index 命令]\n    A --> C[daemon 命令]\n    A --> D[query 命令]\n    A --> E[search 命令]\n    A --> F[report 命令]\n    \n    B --> G[ensureIndexed]\n    G --> H[索引工作区]\n    H --> I[调用 extract.ts]\n    \n    D --> J[createContextPack]\n    J --> K[搜索索引]\n    K --> I\n```\n\n### 主要 CLI 命令\n\n| 命令 | 功能 | 相关源码 |\n|------|------|----------|\n| `index` | 索引工作区中的所有代码文件 | [src/cli.ts:30-50]() |\n| `daemon` | 启动本地索引守护进程 | [src/cli.ts:55-65]() |\n| `query` | 根据查询创建证据包 | [src/cli.ts:70-85]() |\n| `search` | 在索引中搜索上下文 | [src/cli.ts:90-105]() |\n| `report` | 生成上下文报告 | [src/cli.ts:110-120]() |\n\n资料来源：[src/cli.ts:1-100]()\n\n## 搜索与索引集成\n\n### 搜索上下文流程\n\n解析提取的数据最终服务于搜索功能：\n\n```graph TD\n    A[searchContext] --> B[classifyQuery]\n    B --> C{意图类型}\n    C -->|exact| D[精确匹配]\n    C -->|code| E[FTS 代码搜索]\n    C -->|docs| F[FTS 文档搜索]\n    C -->|symbol| G[符号搜索]\n    C -->|memory| H[记忆搜索]\n    \n    D --> I[rankResults]\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    \n    I --> J[dedupeHits]\n    J --> K[返回搜索结果]\n```\n\n### 查询意图分类\n\n`classifyQuery` 函数根据查询特征判断用户意图：\n\n| 意图 | 触发关键词 | 资料来源 |\n|------|------------|----------|\n| symbol | `function`, `class`, `interface` | [src/search.ts:20-30]() |\n| memory | `memory`, `lesson`, `remember` | [src/search.ts:35-40]() |\n| impact | `impact`, `affected`, `depends` | [src/search.ts:42-44]() |\n| historical | `why`, `changed`, `history` | [src/search.ts:46-48]() |\n| architectural | `architecture`, `flow`, `imports` | [src/search.ts:50-52]() |\n| docs | `docs`, `documentation`, `readme` | [src/search.ts:54-56]() |\n\n资料来源：[src/search.ts:15-60]()\n\n## 证据包生成\n\n### createContextPack 函数\n\n`createContextPack` 将搜索结果整合为结构化的证据包：\n\n```typescript\nexport async function createContextPack(options: CreatePackOptions): Promise<EvidencePack> {\n  const search = await searchContext({ workspace, query, limit: budget });\n  \n  // 选择性合并...\n  const selected = search.hits.slice(0, maxChunks);\n  \n  const tokenEstimate = estimateTokens(selected.map((h) => h.text).join(\"\\n\"));\n  \n  const kernel = openKernelDb(workspace);\n  const graphPaths = loadGraphPaths(kernel.db, paths, 20);\n  \n  const pack: EvidencePack = {\n    id: `ctx_${shortHash(`${query}:${nowIso()}`)}`,\n    query,\n    scope,\n    intent: search.intent,\n    summary: summarizePack(query, search.intent, selected, graphPaths, memoryHits),\n    citations: selected,\n    confidence: confidenceFor(selected, graphPaths, memoryHits),\n    // ...\n  };\n  \n  return pack;\n}\n```\n\n资料来源：[src/search.ts:150-200]()\n\n## 工具函数\n\n### 行范围提取\n\n`lineRange` 函数从文本中提取指定行范围：\n\n```typescript\nexport function lineRange(text: string, startLine: number, endLine: number): string {\n  const lines = text.split(/\\r?\\n/);\n  return lines.slice(Math.max(0, startLine - 1), Math.min(lines.length, endLine)).join(\"\\n\");\n}\n```\n\n资料来源：[src/util.ts:30-35]()\n\n### 二进制文件检测\n\n`isLikelyBinary` 函数通过检测空字节判断文件类型：\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n资料来源：[src/util.ts:20-25]()\n\n## 数据模型\n\n### ChunkRecord 结构\n\n```typescript\ninterface ChunkRecord {\n  ref: string;           // 文件引用，如 \"file:src/auth.ts:1-20\"\n  filePath: string;      // 相对文件路径\n  startLine: number;     // 起始行号\n  endLine: number;       // 结束行号\n  kind: \"code\" | \"doc\" | \"file\";  // 块类型\n  title: string;         // 标题/符号名\n  text: string;          // 块内容\n  tokenEstimate: number; // token 估算值\n}\n```\n\n### RawEdge 结构\n\n```typescript\ninterface RawEdge {\n  targetName: string;    // 目标名称\n  targetType: \"module\" | \"config\" | \"symbol\";  // 目标类型\n  edgeType: \"IMPORTS\" | \"CONFIGURES\";  // 边类型\n  line: number;          // 所在行号\n  filePath?: string;     // 文件路径\n}\n```\n\n资料来源：[src/extract.ts:40-48]()\n\n## 报告生成\n\n### generateReport 函数\n\n`generateReport` 汇总索引状态并生成统计报告：\n\n```typescript\nexport async function generateReport(options: { workspace?: string }): Promise<ContextReport> {\n  const workspace = resolveWorkspace(options.workspace);\n  await ensureIndexed(workspace);\n  const kernel = openKernelDb(workspace);\n  \n  const languageRows = kernel.db\n    .prepare(\"SELECT language, COUNT(*) AS count FROM files GROUP BY language ORDER BY count DESC\")\n    .all();\n  \n  // 收集统计信息...\n  // 生成报告...\n}\n```\n\n资料来源：[src/report.ts:50-80]()\n\n## 总结\n\n解析与代码提取模块是 Contextful 的核心基础设施，通过模块化的设计实现了对多种编程语言的支持。其关键设计特点包括：\n\n1. **正则驱动**：使用正则表达式实现轻量级代码解析\n2. **语义分块**：保持函数/类边界的完整性\n3. **多语言支持**：覆盖 TypeScript、JavaScript、Python、Go、Rust 等主流语言\n4. **测试优先**：自动识别并优先处理测试文件\n5. **可扩展架构**：通过 `matchPush` 等高阶函数便于添加新语言支持\n\n该模块与搜索模块紧密集成，共同构成了上下文检索的能力基础。\n\n---\n\n<a id='page-9'></a>\n\n## CLI 命令行工具\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [MCP 服务器集成](#page-7), [部署与配置](#page-10)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n</details>\n\n# CLI 命令行工具\n\n## 概述\n\nContextful 的 CLI（命令行界面）是用户与上下文索引系统交互的主要入口点。该工具提供了索引工作区、查询证据包、搜索上下文、生成报告以及管理 MCP 服务器等功能。\n\nCLI 采用 [Commander.js](https://github.com/tj/commander.js) 框架构建，支持多种子命令，覆盖了从代码索引到证据管理的完整工作流程。`cxf` 是主二进制文件名称，同时提供 `contextful` 作为可读别名。\n\n资料来源：[src/cli.ts:1-20]()\n\n## 核心命令架构\n\n### 命令层次结构\n\n```mermaid\ngraph TD\n    A[cxf / contextful] --> B[index]\n    A --> C[daemon]\n    A --> D[query]\n    A --> E[search]\n    A --> F[report]\n    A --> G[memory]\n    A --> H[server]\n    \n    G --> G1[memory add]\n```\n\n### 命令总览\n\n| 命令 | 功能描述 | 输出格式 |\n|------|----------|----------|\n| `index` | 索引工作区文件 | JSON |\n| `daemon` | 启动本地索引守护进程 | JSON（流式） |\n| `query` | 创建证据包 | Markdown / JSON |\n| `search` | 搜索索引上下文 | JSON |\n| `report` | 生成上下文报告 | Markdown / JSON / HTML |\n| `memory add` | 存储证据-backed 经验 | JSON |\n| `server` | 运行 MCP stdio 服务器 | - |\n\n资料来源：[src/cli.ts:20-80]()\n\n## 索引命令\n\n### index\n\n索引命令用于扫描工作区中的代码文件，建立搜索索引。\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--watch` | flag | 否 | false | 监听文件变化 |\n\n#### 功能说明\n\n- 扫描指定工作区路径下的所有代码文件\n- 支持 TypeScript、JavaScript、Python、Go、Rust 等多种语言\n- 提取文件中的符号（symbols）、边（edges）和代码块（chunks）\n- 将索引数据存储到 SQLite 数据库中\n\n资料来源：[src/cli.ts:20-35]()\n\n### daemon\n\n守护进程命令启动一个持续运行的索引服务，监听文件系统变化并实时更新索引。\n\n```bash\ncxf daemon --workspace <path>\n```\n\n#### 特性\n\n- 实时监听工作区文件变化\n- 增量更新索引，而非完全重建\n- 通过 stdout 流式输出 JSON 格式的索引结果\n\n资料来源：[src/cli.ts:36-45]()\n\n## 查询命令\n\n### query\n\nquery 命令是 Contextful 的核心功能，用于创建紧凑的证据包回答用户查询。\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> [--json]\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `<query>` | string | 是 | - | 要回答的查询语句 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--budget <tokens>` | integer | 否 | 2000 | 近似 token 预算 |\n| `--json` | flag | 否 | false | 输出 JSON 而非 Markdown |\n\n#### 工作流程\n\n```mermaid\ngraph LR\n    A[用户查询] --> B[搜索索引]\n    B --> C[意图分类]\n    C --> D[BM25 排序]\n    D --> E[图路径分析]\n    E --> F[选择证据]\n    F --> G[生成证据包]\n    G --> H[返回结果]\n```\n\n#### 输出内容\n\n证据包包含以下结构化信息：\n\n- `id`: 证据包唯一标识符\n- `query`: 原始查询\n- `intent`: 搜索意图分类\n- `summary`: 结果摘要\n- `citations`: 选中的证据引用列表\n- `files`: 相关文件及原因\n- `symbols`: 匹配的符号记录\n- `graphPaths`: 图连接路径\n- `memoryHits`: 记忆命中\n- `confidence`: 置信度分数\n- `tokenEstimate`: 估算的 token 数量\n- `budget`: 分配的 token 预算\n- `createdAt`: 创建时间戳\n\n资料来源：[src/cli.ts:46-60](), [src/search.ts:80-150]()\n\n## 搜索命令\n\n### search\n\nsearch 命令提供轻量级的上下文搜索功能，不生成完整证据包。\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit <count> --kind <kind>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `<query>` | string | 是 | - | 搜索查询 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--limit <count>` | integer | 否 | 10 | 最大命中数 |\n| `--kind <kind>` | enum | 否 | all | 搜索类型 |\n\n#### kind 参数选项\n\n| 值 | 说明 |\n|----|------|\n| `all` | 所有类型 |\n| `code` | 仅代码 |\n| `docs` | 仅文档 |\n| `symbols` | 仅符号 |\n| `memory` | 仅记忆 |\n\n资料来源：[src/cli.ts:70-80]()\n\n## 报告命令\n\n### report\n\n生成工作区的上下文索引报告。\n\n```bash\ncxf report --workspace <path> --format <format>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--format <format>` | enum | 否 | markdown | 输出格式 |\n\n#### format 参数选项\n\n| 值 | 说明 |\n|----|------|\n| `markdown` | Markdown 格式（默认） |\n| `json` | JSON 格式 |\n| `html` | HTML 格式 |\n\n#### 报告内容\n\n报告包含以下部分：\n\n- 索引状态概览\n- 语言覆盖率统计\n- 热门查询记录\n- 陈旧记忆列表\n- Agent 使用建议\n- 警告信息（如有）\n\n资料来源：[src/cli.ts:81-90](), [src/report.ts:1-100]()\n\n## 记忆管理命令\n\n### memory add\n\n存储证据-backed 的经验教训到记忆账本中。\n\n```bash\ncxf memory add \\\n  --claim <text> \\\n  --evidence <ref...> \\\n  --workspace <path> \\\n  --scope <scope> \\\n  --confidence <number>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--claim <text>` | string | 是 | - | 经验声明 |\n| `--evidence <ref...>` | string[] | 是 | - | 证据引用列表 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--scope <scope>` | string | 否 | repo | 记忆作用域 |\n| `--confidence <number>` | float | 否 | 0.7 | 置信度（0-1） |\n\n#### 证据引用格式\n\n证据引用格式为：`file:src/auth.ts:1-20`，表示从 `src/auth.ts` 文件的第 1-20 行提取证据。\n\n#### 功能说明\n\n- 验证证据引用的有效性\n- 将经验存储到 SQLite 数据库\n- 支持覆盖（supersedes）旧记忆\n\n资料来源：[src/cli.ts:92-125]()\n\n## MCP 服务器命令\n\n### server\n\n启动 MCP（Model Context Protocol）stdio 服务器。\n\n```bash\ncxf server\n```\n\n#### 功能说明\n\n- 提供 MCP 标准工具接口\n- 支持 `context_pack`、`search_code`、`trace_path` 等工具\n- 通过 stdio 与 AI 代理通信\n\n资料来源：[src/cli.ts:126-135]()\n\n## 工具函数\n\n### 参数解析辅助函数\n\n```typescript\nfunction parseInteger(value: string): number\nfunction parseReportFormat(value: string): ReportFormat\n```\n\n| 函数 | 输入 | 输出 | 错误处理 |\n|------|------|------|----------|\n| `parseInteger` | 字符串 | 整数 | 无效整数抛出错误 |\n| `parseReportFormat` | 字符串 | markdown/json/html | 无效格式抛出错误 |\n\n资料来源：[src/cli.ts:148-165]()\n\n## 错误处理\n\nCLI 采用统一的错误处理机制：\n\n```typescript\nprogram.parseAsync(process.argv).catch((error) => {\n  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n  process.exitCode = 1;\n});\n```\n\n错误处理特点：\n\n- 错误信息输出到 stderr\n- 非零退出码表示失败\n- 区分 Error 实例与普通字符串\n\n资料来源：[src/cli.ts:136-145]()\n\n## 安装与使用\n\n### 安装方式\n\n```bash\nnpx @inferensys/contextful index --workspace .\nnpx @inferensys/contextful query \"where is user auth handled\" --workspace . --budget 2000\n```\n\n### MCP 服务器启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### 环境要求\n\n- Node.js >= 20\n- 支持 Unix-like 系统及 Windows\n\n资料来源：[package.json:1-30](), [README.md:1-30]()\n\n## 快速参考\n\n| 命令 | 用途 |\n|------|------|\n| `cxf index --workspace . --watch` | 索引并监听变化 |\n| `cxf query \"认证逻辑在哪里\"` | 查询证据包 |\n| `cxf search \"auth\" --kind code` | 搜索代码 |\n| `cxf report --format html` | 生成 HTML 报告 |\n| `cxf memory add --claim \"...\" --evidence file:src/x.ts:1-10` | 添加记忆 |\n| `cxf server` | 启动 MCP 服务器 |\n\n---\n\n<a id='page-10'></a>\n\n## 部署与配置\n\n### 相关页面\n\n相关主题：[项目概述](#page-1), [MCP 服务器集成](#page-7), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 部署与配置\n\n## 概述\n\n`部署与配置` 是 Contextful 项目的安装、环境设置及运行时参数管理模块。该模块涵盖了从 NPM 包安装到 MCP 服务器运行的完整部署链路，为开发者提供命令行界面（CLI）和 MCP（Model Context Protocol）服务器两种使用方式。Contextful 是一个上下文管理工具，帮助智能体（Agent）在处理复杂任务时获取精确的代码证据和上下文信息。\n\n## 核心部署模式\n\nContextful 支持两种主要的部署模式，适用于不同的使用场景。\n\n### 本地 CLI 部署\n\n本地 CLI 部署适合开发者直接在终端环境中使用，适用于代码浏览、上下文搜索和报告生成等场景。CLI 模式通过 `cxf` 或 `contextful` 命令行工具提供完整功能集。\n\n```bash\n# 基本索引操作\nnpx @inferensys/contextful index --workspace .\n\n# 创建证据包\nnpx @inferensys/contextful query \"where is user auth handled\" --workspace . --budget 2000\n```\n\n资料来源：[README.md]()\n\n### MCP 服务器部署\n\nMCP 服务器部署适用于将 Contextful 作为智能体工具集成的场景。服务器通过标准输入/输出（stdio）接口与 MCP 客户端通信，提供标准化的工具调用接口。\n\n```bash\nnpx @inferensys/contextful server\n```\n\nMCP 服务器模式下，Contextful 提供以下核心工具接口供智能体调用：\n\n| 工具名称 | 功能描述 | 主要参数 |\n|---------|---------|---------|\n| `context_pack` | 返回排序的、带引用的、符合token预算的证据包 | query, budget, scope |\n| `search_code` | 强大的代码、文档、符号和内存搜索 | query, mode, filters |\n| `trace_path` | 跨文件、符号、模块和配置的图遍历 | from, to, edge_types |\n| `impact_analysis` | 反向依赖分析和可能的测试识别 | symbol_or_file |\n| `why_changed` | 结合当前证据和Git历史解释变更原因 | symbol_or_file, limit |\n| `recall_memory` | 搜索跨会话持久化的项目经验 | query, scope, limit |\n| `write_lesson` | 将带证据的经验写入内存账本 | claim, evidence_refs, scope, confidence |\n\n资料来源：[README.md](), [src/mcp-server.ts]()\n\n## CLI 命令详解\n\nCLI 是 Contextful 的主要交互接口，命令结构遵循 `cxf <command> [options]` 的格式。\n\n### 索引命令 (index)\n\n索引命令用于扫描和索引工作区内的代码文件，建立搜索和图遍历的基础数据。\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--watch` | flag | false | 监视模式，持续监听文件变化 |\n\n资料来源：[src/cli.ts]()\n\n### 守护进程命令 (daemon)\n\n守护进程命令启动本地索引服务，持续监视工作区文件变化并更新索引。\n\n```bash\ncxf daemon --workspace <path>\n```\n\n当工作区文件发生变更时，守护进程会主动推送更新结果到标准输出：\n\n```typescript\nawait watchWorkspace(options.workspace, (result) => {\n  process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n});\n```\n\n资料来源：[src/cli.ts]()\n\n### 查询命令 (query)\n\n查询命令是 Contextful 的核心功能，根据自然语言查询创建包含证据的上下文包。\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> [--json]\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--budget` | number | 2000 | 近似token预算 |\n| `--json` | flag | false | 输出JSON格式而非Markdown |\n\n查询命令内部调用 `createContextPack` 函数，生成包含以下信息的证据包：\n\n- 查询意图分类（intent）\n- 置信度评分（confidence）\n- 相关代码引用（citations）\n- 依赖图路径（graphPaths）\n- 内存命中（memoryHits）\n\n资料来源：[src/cli.ts](), [src/search.ts]()\n\n### 搜索命令 (search)\n\n搜索命令在不编译完整证据包的情况下搜索索引上下文，适用于快速定位信息。\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit <count> --kind <kind>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--limit` | number | 10 | 最大命中数 |\n| `--kind` | enum | \"all\" | 搜索类型：all/code/docs/symbols/memory |\n\n搜索类型参数决定搜索结果的过滤范围：\n\n- `all`：搜索所有类型的索引块\n- `code`：仅搜索代码文件块\n- `docs`：仅搜索文档块\n- `symbols`：仅搜索符号定义块\n- `memory`：仅搜索内存记录块\n\n资料来源：[src/cli.ts](), [src/search.ts]()\n\n### 报告命令 (report)\n\n报告命令生成工作区的上下文索引报告。\n\n```bash\ncxf report --workspace <path> --format <format>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--format` | enum | \"markdown\" | 输出格式：markdown/json/html |\n\n报告生成器调用 `generateReport` 函数，收集工作区的索引统计信息并渲染为指定格式。\n\n资料来源：[src/cli.ts](), [src/report.ts]()\n\n### 内存管理命令 (memory)\n\n内存命令用于管理证据支持的智能体内存，允许存储和检索跨会话的项目经验。\n\n#### 添加经验 (add)\n\n```bash\ncxf memory add --claim <text> --evidence <ref...> --workspace <path> --scope <scope> --confidence <number>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--claim` | text | 必需 | 经验声明/教训 |\n| `--evidence` | ref[] | 必需 | 证据引用，如 `file:src/auth.ts:1-20` |\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--scope` | string | \"repo\" | 内存范围 |\n| `--confidence` | number | 0.7 | 置信度（0-1） |\n\n经验引用格式：`file:<relativePath>:<startLine>-<endLine>`\n\n```bash\ncxf memory add \\\n  --claim \"用户认证模块位于 src/auth.ts\" \\\n  --evidence \"file:src/auth.ts:1-50\" \\\n  --workspace . \\\n  --confidence 0.9\n```\n\n资料来源：[src/cli.ts]()\n\n### MCP 服务器命令 (server)\n\n服务器命令启动 MCP stdio 服务器，供 MCP 客户端连接使用。\n\n```bash\ncxf server\n```\n\n服务器接收来自客户端的工具调用请求，执行相应操作并返回 JSON 格式的结果。工具参数使用 Zod 模式进行验证。\n\n资料来源：[src/cli.ts](), [src/mcp-server.ts]()\n\n## 工作区配置\n\n### 工作区路径解析\n\n工作区路径的解析遵循以下优先级：\n\n1. CLI 选项 `--workspace` 显式指定\n2. 环境变量 `WORKSPACE`（如果实现）\n3. 当前工作目录 `process.cwd()` 作为默认值\n\n```typescript\n.option(\"--workspace <path>\", \"Workspace path.\", process.cwd())\n```\n\n资料来源：[src/cli.ts]()\n\n### 索引结构\n\n工作区索引数据库（`kernel.db`）包含以下核心表结构：\n\n| 表名 | 用途 | 关键字段 |\n|-----|------|---------|\n| `files` | 已索引文件元数据 | path, language, indexed_at |\n| `chunks_fts` | 全文搜索索引 | ref, path, title, text, bm25 |\n| `symbols` | 代码符号索引 | name, kind, file_path, line |\n| `edges` | 导入/依赖关系图 | from, to, edge_type, file_path, line |\n| `lessons` | 经验记忆存储 | id, claim, scope, confidence, evidence |\n| `query_log` | 查询历史记录 | query, intent, timestamp |\n\n### 文件类型支持\n\n索引器支持多种编程语言的符号提取和边关系提取：\n\n| 语言 | 符号类型 | 边关系类型 |\n|-----|---------|-----------|\n| TypeScript/JavaScript | function, class, interface, type, const | ES imports, require() |\n| Python | def, class | from...import, import |\n| Go | func, struct, interface | import |\n| Rust | fn, struct, enum, trait, impl | use, mod |\n| Markdown | heading | - |\n| JSON | config-key | - |\n\n资料来源：[src/extract.ts]()\n\n## 报告生成配置\n\n### 报告格式选项\n\n报告支持三种输出格式，通过 `--format` 选项指定：\n\n#### Markdown 格式\n\n默认格式，生成人类可读的 Markdown 文档，包含以下章节：\n\n- 工作区概览\n- 文件语言分布\n- 索引警告\n- Token 使用统计\n\n#### JSON 格式\n\n机器可读的 JSON 输出，适合程序化处理：\n\n```json\n{\n  \"status\": { \"workspace\": \"...\", \"indexedAt\": \"...\", \"languageDistribution\": [...] },\n  \"summary\": { \"totalChunks\": 123, \"totalSymbols\": 456, \"totalEdges\": 789 },\n  \"tokenSavingsEstimate\": { \"indexedTokens\": ..., \"averagePackTokens\": ... }\n}\n```\n\n#### HTML 格式\n\n自包含的 HTML 文档，内嵌样式，适合浏览器查看：\n\n```html\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>Contextful Report</title>\n  <style>\n    body { font: 15px/1.55 system-ui, sans-serif; margin: 0; ... }\n  </style>\n</head>\n<body><main><pre>[Markdown content]</pre></main></body>\n</html>\n```\n\n资料来源：[src/report.ts]()\n\n## 运行时参数配置\n\n### 查询预算配置\n\n`--budget` 参数控制返回证据包的 token 上限，影响搜索结果的精选程度：\n\n| 预算值 | 适用场景 | 示例 |\n|-------|---------|------|\n| 1000-2000 | 简短查询、精确查找 | `cxf query \"auth middleware\" --budget 1500` |\n| 2000-5000 | 标准查询、代码理解 | `cxf query \"how does cache work\" --budget 3000` |\n| 5000+ | 复杂查询、架构分析 | `cxf query \"dependency injection flow\" --budget 8000` |\n\n### 搜索类型过滤\n\n`--kind` 参数过滤搜索结果的类型范围：\n\n```bash\n# 仅搜索代码符号\ncxf search \"UserService\" --kind symbols\n\n# 仅搜索文档\ncxf search \"installation guide\" --kind docs\n\n# 仅搜索记忆\ncxf search \"previous lessons\" --kind memory\n```\n\n### 置信度阈值\n\n经验记忆的置信度参数（`--confidence`）影响信息优先级排序：\n\n- **0.9-1.0**：高置信度，直接可用于决策\n- **0.7-0.9**：中高置信度，建议交叉验证\n- **0.5-0.7**：中等置信度，需要更多证据支持\n- **0.0-0.5**：低置信度，仅作参考\n\n## 部署架构图\n\n```mermaid\ngraph TD\n    A[开发者终端] --> B[CLI 界面]\n    A --> C[MCP 客户端]\n    \n    B --> D[index 命令]\n    B --> E[query 命令]\n    B --> F[search 命令]\n    B --> G[report 命令]\n    B --> H[memory 命令]\n    \n    C --> I[MCP Server]\n    I --> J[context_pack 工具]\n    I --> K[search_code 工具]\n    I --> L[trace_path 工具]\n    I --> M[impact_analysis 工具]\n    I --> N[why_changed 工具]\n    I --> O[recall_memory 工具]\n    I --> P[write_lesson 工具]\n    \n    D --> Q[文件系统扫描]\n    Q --> R[SQLite 数据库]\n    \n    E --> S[证据包生成]\n    S --> R\n    S --> T[Token 预算控制]\n    \n    F --> U[全文搜索]\n    U --> R\n    \n    G --> V[报告渲染]\n    V --> W[Markdown/JSON/HTML]\n    \n    H --> X[记忆存储]\n    X --> R\n```\n\n## 环境变量参考\n\n| 变量名 | 类型 | 说明 | 默认值 |\n|-------|------|-----|-------|\n| `WORKSPACE` | string | 工作区根目录路径 | 当前工作目录 |\n| `CONTEXTFUL_BUDGET` | number | 默认 token 预算 | 2000 |\n\n## 常见部署场景\n\n### 场景一：本地开发环境\n\n适用于开发者在本地机器上浏览和分析代码库：\n\n```bash\n# 首次索引\ncxf index --workspace /path/to/project\n\n# 启动守护进程监视变化\ncxf daemon --workspace /path/to/project &\n\n# 执行查询\ncxf query \"用户认证流程\" --workspace /path/to/project --budget 3000\n```\n\n### 场景二：智能体集成\n\n将 Contextful 作为智能体工具集成的标准模式：\n\n1. 启动 MCP 服务器\n2. 配置 MCP 客户端连接\n3. 通过 `context_pack` 工具获取上下文\n\n```bash\n# 服务器端\ncxf server\n\n# 客户端调用示例（伪代码）\nresult = mcp_client.call_tool(\"context_pack\", {\n  query: \"where is user auth handled\",\n  budget: 2000,\n  scope: \"repo\"\n})\n```\n\n### 场景三：CI/CD 集成\n\n在持续集成流程中生成索引报告：\n\n```yaml\n# .github/workflows/context-report.yml\n- name: Generate Context Report\n  run: |\n    npx @inferensys/contextful index --workspace .\n    npx @inferensys/contextful report --workspace . --format html > report.html\n```\n\n## 安全考虑\n\n### 敏感信息处理\n\nContextful 在日志输出和报告生成中自动过滤敏感信息：\n\n```typescript\n// 邮箱地址脱敏\nif (match.includes(\"@\") && !match.toLowerCase().includes(\"token\")) return \"<email>\";\n\n// 密钥脱敏\nconst key = match.split(/[:=]/)[0]?.trim();\nreturn key && key.length < match.length ? `${key}=<redacted>` : \"<secret>\";\n```\n\n资料来源：[src/util.ts]()\n\n### 二进制文件检测\n\n索引器自动跳过二进制文件以避免处理错误：\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n## 故障排除\n\n| 问题 | 可能原因 | 解决方案 |\n|-----|---------|---------|\n| 索引失败 | 工作区路径不存在或无权限 | 检查 `--workspace` 参数，确保路径可访问 |\n| 查询无结果 | 文件未被索引 | 确认已运行 `cxf index`，检查文件类型是否支持 |\n| 服务器连接失败 | 端口占用或权限问题 | 使用 stdio 模式，确认客户端配置正确 |\n| 报告生成错误 | 数据库损坏 | 删除 `.contextful` 目录后重新索引 |\n\n## 扩展阅读\n\n- [核心搜索机制](README.md)\n- [MCP 工具规范](src/mcp-server.ts)\n- [索引提取算法](src/extract.ts)\n\n---\n\n---\n\n## Doramagic 踩坑日志\n\n项目：Inferensys/contextful\n\n摘要：发现 7 个潜在踩坑项，其中 0 个为 high/blocking；最高优先级：配置坑 - 可能修改宿主 AI 配置。\n\n## 1. 配置坑 · 可能修改宿主 AI 配置\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。\n- 对用户的影响：安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。\n- 建议检查：列出会写入的配置文件、目录和卸载/回滚步骤。\n- 防护动作：涉及宿主配置目录时必须给回滚路径，不能只给安装命令。\n- 证据：capability.host_targets | github_repo:1240001007 | https://github.com/Inferensys/contextful | host_targets=claude, claude_code\n\n## 2. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:1240001007 | https://github.com/Inferensys/contextful | README/documentation is current enough for a first validation pass.\n\n## 3. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | last_activity_observed missing\n\n## 4. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 5. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 6. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | issue_or_pr_quality=unknown\n\n## 7. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | release_recency=unknown\n\n<!-- canonical_name: Inferensys/contextful; human_manual_source: deepwiki_human_wiki -->\n",
      "markdown_key": "contextful",
      "pages": "draft",
      "source_refs": [
        {
          "evidence_id": "github_repo:1240001007",
          "kind": "repo",
          "supports_claim_ids": [
            "claim_identity",
            "claim_distribution",
            "claim_capability"
          ],
          "url": "https://github.com/Inferensys/contextful"
        },
        {
          "evidence_id": "art_9602e7fcea104ce288e652334966e49d",
          "kind": "docs",
          "supports_claim_ids": [
            "claim_identity",
            "claim_distribution",
            "claim_capability"
          ],
          "url": "https://github.com/Inferensys/contextful#readme"
        }
      ],
      "summary": "DeepWiki/Human Wiki 完整输出，末尾追加 Discovery Agent 踩坑日志。",
      "title": "contextful 说明书",
      "toc": [
        "https://github.com/Inferensys/contextful 项目说明书",
        "目录",
        "项目概述",
        "项目简介",
        "技术架构",
        "功能特性",
        "工作流程",
        "依赖关系",
        "Doramagic 踩坑日志"
      ]
    }
  },
  "quality_gate": {
    "blocking_gaps": [],
    "category_confidence": "medium",
    "compile_status": "ready_for_review",
    "five_assets_present": true,
    "install_sandbox_verified": true,
    "missing_evidence": [],
    "next_action": "publish to Doramagic.ai project surfaces",
    "prompt_preview_boundary_ok": true,
    "publish_status": "publishable",
    "quick_start_verified": true,
    "repo_clone_verified": true,
    "repo_commit": "94dcc85541ecfefd7258c76c6d58db34bcbfbbbc",
    "repo_inspection_error": null,
    "repo_inspection_files": [
      "package.json",
      "README.md",
      "docs/IMPROVEMENTS.md",
      "src/parser-backend.ts",
      "src/report.ts",
      "src/search.ts",
      "src/util.ts",
      "src/db.ts",
      "src/files.ts",
      "src/index.ts",
      "src/language.ts",
      "src/types.ts",
      "src/mcp-server.ts",
      "src/extract.ts",
      "src/memory.ts",
      "src/cli.ts",
      "src/indexer.ts"
    ],
    "repo_inspection_verified": true,
    "review_reasons": [
      "community_discussion_evidence_below_public_threshold"
    ],
    "tag_count_ok": true,
    "unsupported_claims": []
  },
  "schema_version": "0.1",
  "user_assets": {
    "ai_context_pack": {
      "asset_id": "ai_context_pack",
      "filename": "AI_CONTEXT_PACK.md",
      "markdown": "# @inferensys/contextful - Doramagic AI Context Pack\n\n> 定位：安装前体验与判断资产。它帮助宿主 AI 有一个好的开始，但不代表已经安装、执行或验证目标项目。\n\n## 充分原则\n\n- **充分原则，不是压缩原则**：AI Context Pack 应该充分到让宿主 AI 在开工前理解项目价值、能力边界、使用入口、风险和证据来源；它可以分层组织，但不以最短摘要为目标。\n- **压缩策略**：只压缩噪声和重复内容，不压缩会影响判断和开工质量的上下文。\n\n## 给宿主 AI 的使用方式\n\n你正在读取 Doramagic 为 @inferensys/contextful 编译的 AI Context Pack。请把它当作开工前上下文：帮助用户理解适合谁、能做什么、如何开始、哪些必须安装后验证、风险在哪里。不要声称你已经安装、运行或执行了目标项目。\n\n## Claim 消费规则\n\n- **事实来源**：Repo Evidence + Claim/Evidence Graph；Human Wiki 只提供显著性、术语和叙事结构。\n- **事实最低状态**：`supported`\n- `supported`：可以作为项目事实使用，但回答中必须引用 claim_id 和证据路径。\n- `weak`：只能作为低置信度线索，必须要求用户继续核实。\n- `inferred`：只能用于风险提示或待确认问题，不能包装成项目事实。\n- `unverified`：不得作为事实使用，应明确说证据不足。\n- `contradicted`：必须展示冲突来源，不得替用户强行选择一个版本。\n\n## 它最适合谁\n\n- **正在使用 Claude/Codex/Cursor/Gemini 等宿主 AI 的开发者**：README 或插件配置提到多个宿主 AI。 证据：`README.md` Claim：`clm_0002` supported 0.86\n\n## 它能做什么\n\n- **命令行启动或安装流程**（需要安装后验证）：项目文档中存在可执行命令，真实使用需要在本地或宿主环境中运行这些命令。 证据：`README.md` Claim：`clm_0001` supported 0.86\n\n## 怎么开始\n\n- `npx @inferensys/contextful index --workspace .` 证据：`README.md` Claim：`clm_0003` supported 0.86\n- `npx @inferensys/contextful query \"where is user auth handled\" --workspace . --budget 2000` 证据：`README.md` Claim：`clm_0004` supported 0.86\n- `npx @inferensys/contextful server` 证据：`README.md` Claim：`clm_0005` supported 0.86\n\n## 继续前判断卡\n\n- **当前建议**：先做权限沙盒试用\n- **为什么**：项目存在安装命令、宿主配置或本地写入线索，不建议直接进入主力环境，应先在隔离环境试装。\n\n### 30 秒判断\n\n- **现在怎么做**：先做权限沙盒试用\n- **最小安全下一步**：先跑 Prompt Preview；若仍要安装，只在隔离环境试装\n- **先别相信**：工具权限边界不能在安装前相信。\n- **继续会触碰**：命令执行、本地环境或项目文件、宿主 AI 上下文\n\n### 现在可以相信\n\n- **适合人群线索：正在使用 Claude/Codex/Cursor/Gemini 等宿主 AI 的开发者**（supported）：有 supported claim 或项目证据支撑，但仍不等于真实安装效果。 证据：`README.md` Claim：`clm_0002` supported 0.86\n- **能力存在：命令行启动或安装流程**（supported）：可以相信项目包含这类能力线索；是否适合你的具体任务仍要试用或安装后验证。 证据：`README.md` Claim：`clm_0001` supported 0.86\n- **存在 Quick Start / 安装命令线索**（supported）：可以相信项目文档出现过启动或安装入口；不要因此直接在主力环境运行。 证据：`README.md` Claim：`clm_0003` supported 0.86\n\n### 现在还不能相信\n\n- **工具权限边界不能在安装前相信。**（unverified）：MCP/tool 类项目通常会触碰文件、网络、浏览器或外部 API，必须真实检查权限和日志。\n- **真实输出质量不能在安装前相信。**（unverified）：Prompt Preview 只能展示引导方式，不能证明真实项目中的结果质量。\n- **宿主 AI 版本兼容性不能在安装前相信。**（unverified）：Claude、Cursor、Codex、Gemini 等宿主加载规则和版本差异必须在真实环境验证。\n- **不会污染现有宿主 AI 行为，不能直接相信。**（inferred）：Skill、plugin、AGENTS/CLAUDE/GEMINI 指令可能改变宿主 AI 的默认行为。\n- **可安全回滚不能默认相信。**（unverified）：除非项目明确提供卸载和恢复说明，否则必须先在隔离环境验证。\n- **真实安装后是否与用户当前宿主 AI 版本兼容？**（unverified）：兼容性只能通过实际宿主环境验证。\n- **项目输出质量是否满足用户具体任务？**（unverified）：安装前预览只能展示流程和边界，不能替代真实评测。\n- **安装命令是否需要网络、权限或全局写入？**（unverified）：这影响企业环境和个人环境的安装风险。 证据：`README.md`\n\n### 继续会触碰什么\n\n- **命令执行**：包管理器、网络下载、本地插件目录、项目配置或用户主目录。 原因：运行第一条命令就可能产生环境改动；必须先判断是否值得跑。 证据：`README.md`\n- **本地环境或项目文件**：安装结果、插件缓存、项目配置或本地依赖目录。 原因：安装前无法证明写入范围和回滚方式，需要隔离验证。 证据：`README.md`\n- **宿主 AI 上下文**：AI Context Pack、Prompt Preview、Skill 路由、风险规则和项目事实。 原因：导入上下文会影响宿主 AI 后续判断，必须避免把未验证项包装成事实。\n\n### 最小安全下一步\n\n- **先跑 Prompt Preview**：用安装前交互式试用判断工作方式是否匹配，不需要授权或改环境。（适用：任何项目都适用，尤其是输出质量未知时。）\n- **只在隔离目录或测试账号试装**：避免安装命令污染主力宿主 AI、真实项目或用户主目录。（适用：存在命令执行、插件配置或本地写入线索时。）\n- **安装后只验证一个最小任务**：先验证加载、兼容、输出质量和回滚，再决定是否深用。（适用：准备从试用进入真实工作流时。）\n\n### 退出方式\n\n- **保留安装前状态**：记录原始宿主配置和项目状态，后续才能判断是否可恢复。\n- **记录安装命令和写入路径**：没有明确卸载说明时，至少要知道哪些目录或配置需要手动清理。\n- **如果没有回滚路径，不进入主力环境**：不可回滚是继续前阻断项，不应靠信任或运气继续。\n\n## 哪些只能预览\n\n- 解释项目适合谁和能做什么\n- 基于项目文档演示典型对话流程\n- 帮助用户判断是否值得安装或继续研究\n\n## 哪些必须安装后验证\n\n- 真实安装 Skill、插件或 CLI\n- 执行脚本、修改本地文件或访问外部服务\n- 验证真实输出质量、性能和兼容性\n\n## 边界与风险判断卡\n\n- **把安装前预览误认为真实运行**：用户可能高估项目已经完成的配置、权限和兼容性验证。 处理方式：明确区分 prompt_preview_can_do 与 runtime_required。 Claim：`clm_0006` inferred 0.45\n- **命令执行会修改本地环境**：安装命令可能写入用户主目录、宿主插件目录或项目配置。 处理方式：先在隔离环境或测试账号中运行。 证据：`README.md` Claim：`clm_0007` supported 0.86\n- **待确认**：真实安装后是否与用户当前宿主 AI 版本兼容？。原因：兼容性只能通过实际宿主环境验证。\n- **待确认**：项目输出质量是否满足用户具体任务？。原因：安装前预览只能展示流程和边界，不能替代真实评测。\n- **待确认**：安装命令是否需要网络、权限或全局写入？。原因：这影响企业环境和个人环境的安装风险。\n\n## 开工前工作上下文\n\n### 加载顺序\n\n- 先读取 how_to_use.host_ai_instruction，建立安装前判断资产的边界。\n- 读取 claim_graph_summary，确认事实来自 Claim/Evidence Graph，而不是 Human Wiki 叙事。\n- 再读取 intended_users、capabilities 和 quick_start_candidates，判断用户是否匹配。\n- 需要执行具体任务时，优先查 role_skill_index，再查 evidence_index。\n- 遇到真实安装、文件修改、网络访问、性能或兼容性问题时，转入 risk_card 和 boundaries.runtime_required。\n\n### 任务路由\n\n- **命令行启动或安装流程**：先说明这是安装后验证能力，再给出安装前检查清单。 边界：必须真实安装或运行后验证。 证据：`README.md` Claim：`clm_0001` supported 0.86\n\n### 上下文规模\n\n- 文件总数：36\n- 重要文件覆盖：27/36\n- 证据索引条目：27\n- 角色 / Skill 条目：3\n\n### 证据不足时的处理\n\n- **missing_evidence**：说明证据不足，要求用户提供目标文件、README 段落或安装后验证记录；不要补全事实。\n- **out_of_scope_request**：说明该任务超出当前 AI Context Pack 证据范围，并建议用户先查看 Human Manual 或真实安装后验证。\n- **runtime_request**：给出安装前检查清单和命令来源，但不要替用户执行命令或声称已执行。\n- **source_conflict**：同时展示冲突来源，标记为待核实，不要强行选择一个版本。\n\n## Prompt Recipes\n\n### 适配判断\n\n- 目标：判断这个项目是否适合用户当前任务。\n- 预期输出：适配结论、关键理由、证据引用、安装前可预览内容、必须安装后验证内容、下一步建议。\n\n```text\n请基于 @inferensys/contextful 的 AI Context Pack，先问我 3 个必要问题，然后判断它是否适合我的任务。回答必须包含：适合谁、能做什么、不能做什么、是否值得安装、证据来自哪里。所有项目事实必须引用 evidence_refs、source_paths 或 claim_id。\n```\n\n### 安装前体验\n\n- 目标：让用户在安装前感受核心工作流，同时避免把预览包装成真实能力或营销承诺。\n- 预期输出：一段带边界标签的体验剧本、安装后验证清单和谨慎建议；不含真实运行承诺或强营销表述。\n\n```text\n请把 @inferensys/contextful 当作安装前体验资产，而不是已安装工具或真实运行环境。\n\n请严格输出四段：\n1. 先问我 3 个必要问题。\n2. 给出一段“体验剧本”：用 [安装前可预览]、[必须安装后验证]、[证据不足] 三种标签展示它可能如何引导工作流。\n3. 给出安装后验证清单：列出哪些能力只有真实安装、真实宿主加载、真实项目运行后才能确认。\n4. 给出谨慎建议：只能说“值得继续研究/试装”“先补充信息后再判断”或“不建议继续”，不得替项目背书。\n\n硬性边界：\n- 不要声称已经安装、运行、执行测试、修改文件或产生真实结果。\n- 不要写“自动适配”“确保通过”“完美适配”“强烈建议安装”等承诺性表达。\n- 如果描述安装后的工作方式，必须使用“如果安装成功且宿主正确加载 Skill，它可能会……”这种条件句。\n- 体验剧本只能写成“示例台词/假设流程”：使用“可能会询问/可能会建议/可能会展示”，不要写“已写入、已生成、已通过、正在运行、正在生成”。\n- Prompt Preview 不负责给安装命令；如用户准备试装，只能提示先阅读 Quick Start 和 Risk Card，并在隔离环境验证。\n- 所有项目事实必须来自 supported claim、evidence_refs 或 source_paths；inferred/unverified 只能作风险或待确认项。\n\n```\n\n### 角色 / Skill 选择\n\n- 目标：从项目里的角色或 Skill 中挑选最匹配的资产。\n- 预期输出：候选角色或 Skill 列表，每项包含适用场景、证据路径、风险边界和是否需要安装后验证。\n\n```text\n请读取 role_skill_index，根据我的目标任务推荐 3-5 个最相关的角色或 Skill。每个推荐都要说明适用场景、可能输出、风险边界和 evidence_refs。\n```\n\n### 风险预检\n\n- 目标：安装或引入前识别环境、权限、规则冲突和质量风险。\n- 预期输出：环境、权限、依赖、许可、宿主冲突、质量风险和未知项的检查清单。\n\n```text\n请基于 risk_card、boundaries 和 quick_start_candidates，给我一份安装前风险预检清单。不要替我执行命令，只说明我应该检查什么、为什么检查、失败会有什么影响。\n```\n\n### 宿主 AI 开工指令\n\n- 目标：把项目上下文转成一次对话开始前的宿主 AI 指令。\n- 预期输出：一段边界明确、证据引用明确、适合复制给宿主 AI 的开工前指令。\n\n```text\n请基于 @inferensys/contextful 的 AI Context Pack，生成一段我可以粘贴给宿主 AI 的开工前指令。这段指令必须遵守 not_runtime=true，不能声称项目已经安装、运行或产生真实结果。\n```\n\n\n## 角色 / Skill 索引\n\n- 共索引 3 个角色 / Skill / 项目文档条目。\n\n- **contextful**（project_doc）：! contextful cover image docs/cover.svg 激活提示：当用户需要理解项目结构、安装方式或边界时参考。 证据：`README.md`\n- **Contextful Dogfood Findings**（project_doc）：These came from running Contextful against its own repo and a temp copy of mcp-doctor . 激活提示：当用户需要理解项目结构、安装方式或边界时参考。 证据：`docs/IMPROVEMENTS.md`\n- **Resource Access**（project_doc）：The resource access flow starts in AuthService.login , loads the user profile, then returns dashboard and billing resources. 激活提示：当用户需要理解项目结构、安装方式或边界时参考。 证据：`tests/fixtures/sample-repo/docs/resources.md`\n\n## 证据索引\n\n- 共索引 27 条证据。\n\n- **contextful**（documentation）：! contextful cover image docs/cover.svg 证据：`README.md`\n- **Package**（package_manifest）：{ \"name\": \"@inferensys/contextful\", \"version\": \"0.1.0\", \"description\": \"Highly efficient context management for agentic AI: search, evidence packs, and memory for Claude Code, Codex, Cursor, Windsurf, and Copilot.\", \"type\": \"module\", \"main\": \"dist/index.js\", \"bin\": { \"cxf\": \"dist/cli.js\", \"contextful\": \"dist/cli.js\" }, \"files\": \"dist\", \"docs\", \"README.md\", \"LICENSE\", \"server.json\", \"tests/fixtures\" , \"scripts\": { \"build\": \"tsc\", \"test\": \"vitest run\", \"check\": \"npm run build && npm run test\", \"prepare\": \"npm run build\", \"prepack\": \"npm run check\" }, \"keywords\": \"mcp\", \"model-context-protocol\", \"context\", \"context-management\", \"token-efficiency\", \"agentic-ai\", \"code-search\", \"evidence-packs\",… 证据：`package.json`\n- **Package**（package_manifest）：{ \"name\": \"sample-context-repo\", \"version\": \"0.1.0\", \"scripts\": { \"test\": \"vitest run\", \"build\": \"tsc\" }, \"dependencies\": { \"zod\": \"^4.0.0\" }, \"devDependencies\": { \"vitest\": \"^4.0.0\" } } 证据：`tests/fixtures/sample-repo/package.json`\n- **License**（source_file）：Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files the \"Software\" , to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 证据：`LICENSE`\n- **Contextful Dogfood Findings**（documentation）：These came from running Contextful against its own repo and a temp copy of mcp-doctor . 证据：`docs/IMPROVEMENTS.md`\n- **Resource Access**（documentation）：The resource access flow starts in AuthService.login , loads the user profile, then returns dashboard and billing resources. 证据：`tests/fixtures/sample-repo/docs/resources.md`\n- **Server**（structured_config）：{ \"$schema\": \"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\", \"name\": \"io.github.Inferensys/contextful\", \"title\": \"Contextful\", \"description\": \"Efficient context management: code search, evidence packs, and memory for coding agents.\", \"version\": \"0.1.0\", \"websiteUrl\": \"https://inferensys.github.io/contextful/\", \"repository\": { \"url\": \"https://github.com/Inferensys/contextful\", \"source\": \"github\" }, \"packages\": { \"registryType\": \"npm\", \"identifier\": \"@inferensys/contextful\", \"version\": \"0.1.0\", \"transport\": { \"type\": \"stdio\" } } } 证据：`server.json`\n- **Tsconfig**（structured_config）：{ \"compilerOptions\": { \"target\": \"ES2022\", \"module\": \"Node16\", \"moduleResolution\": \"Node16\", \"outDir\": \"./dist\", \"rootDir\": \"./src\", \"strict\": true, \"esModuleInterop\": true, \"skipLibCheck\": true, \"forceConsistentCasingInFileNames\": true, \"declaration\": true, \"sourceMap\": true }, \"include\": \"src/ / \" , \"exclude\": \"node modules\", \"dist\", \"tests\" } 证据：`tsconfig.json`\n- **.gitignore**（source_file）：node modules/ dist/ .contextful/ coverage/ .DS Store .tgz 证据：`.gitignore`\n- **Cover**（source_file）： 证据：`docs/cover.svg`\n- **Index**（source_file）：Contextful - Efficient Context Management for Agentic AI :root { color-scheme: light; --ink: 141414; --muted: 5c6470; --line: d9dde3; --paper: ffffff; --soft: f6f7f9; --accent: 0f766e; --accent-2: 92400e; --code: 101418; } 证据：`docs/index.html`\n- **!/usr/bin/env node**（source_file）：import process from \"node:process\"; import { Command } from \"commander\"; import { indexWorkspace, watchWorkspace } from \"./indexer.js\"; import { writeLesson } from \"./memory.js\"; import { generateReport, renderEvidencePackMarkdown, renderReport } from \"./report.js\"; import { createContextPack, searchContext } from \"./search.js\"; import { runMcpServer } from \"./mcp-server.js\"; import { type ReportFormat } from \"./types.js\"; 证据：`src/cli.ts`\n- **Db**（source_file）：import Database from \"better-sqlite3\"; import { dbPathFor, ensureDir, hashText, nowIso, stateDirFor } from \"./util.js\"; import { type ChunkRecord, type GraphEdge, type IndexedFile, type MemoryRecord, type SearchIntent, SCHEMA VERSION } from \"./types.js\"; 证据：`src/db.ts`\n- **Extract**（source_file）：import path from \"node:path\"; import { detectLanguage } from \"./language.js\"; import { type ChunkRecord, type ExtractedFacts, type GraphEdge, type SymbolRecord } from \"./types.js\"; import { estimateTokens, excerpt, lineRange } from \"./util.js\"; 证据：`src/extract.ts`\n- **Files**（source_file）：import fs from \"node:fs\"; import path from \"node:path\"; import fg from \"fast-glob\"; import ignore from \"ignore\"; import { type DiscoveredFile } from \"./types.js\"; import { isLikelyBinary } from \"./util.js\"; 证据：`src/files.ts`\n- **Index**（source_file）：export { indexWorkspace, watchWorkspace } from \"./indexer.js\"; export { createContextPack, searchContext, searchCode, traceGraph, tracePath, impactAnalysis, whyChanged, getIndexStatus, classifyQuery } from \"./search.js\"; export { writeLesson, recallMemory } from \"./memory.js\"; export { generateReport, renderReport } from \"./report.js\"; export { runMcpServer } from \"./mcp-server.js\"; export type { ContextReport, EvidencePack, GraphPath, IndexResult, IndexStatus, MemoryRecord, SearchHit, SearchIntent } from \"./types.js\"; 证据：`src/index.ts`\n- **Indexer**（source_file）：import { execFileSync } from \"node:child process\"; import fs from \"node:fs\"; import path from \"node:path\"; import { closeKernelDb, count, getFileHashes, insertChunk, insertEdge, insertFile, insertSymbol, listMemories, openKernelDb, rebuildAdjacencyCache, resetIndex, setMemoryStatus, setMeta } from \"./db.js\"; import { discoverWorkspaceFiles } from \"./files.js\"; import { detectLanguage, isSupportedPrimaryLanguage } from \"./language.js\"; import { extractFileFacts } from \"./extract.js\"; import { probeTreeSitterBackend } from \"./parser-backend.js\"; import { type IndexResult, SCHEMA VERSION } from \"./types.js\"; import { hashText, nowIso, resolveWorkspace, stateDirFor } from \"./util.js\"; 证据：`src/indexer.ts`\n- **Language**（source_file）：const EXTENSIONS: Record = { \".ts\": \"typescript\", \".tsx\": \"typescript\", \".mts\": \"typescript\", \".cts\": \"typescript\", \".js\": \"javascript\", \".jsx\": \"javascript\", \".mjs\": \"javascript\", \".cjs\": \"javascript\", \".py\": \"python\", \".go\": \"go\", \".rs\": \"rust\", \".json\": \"json\", \".jsonc\": \"json\", \".md\": \"markdown\", \".mdx\": \"markdown\", \".yml\": \"yaml\", \".yaml\": \"yaml\", \".toml\": \"toml\" }; 证据：`src/language.ts`\n- **Mcp Server**（source_file）：import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"; import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"; import { z } from \"zod\"; import { recallMemory, writeLesson } from \"./memory.js\"; import { createContextPack, impactAnalysis, searchCode, tracePath, whyChanged } from \"./search.js\"; 证据：`src/mcp-server.ts`\n- **Memory**（source_file）：import { closeKernelDb, insertMemory, openKernelDb } from \"./db.js\"; import { ensureIndexed, searchContext } from \"./search.js\"; import { type MemoryRecord, type SearchHit } from \"./types.js\"; import { nowIso, resolveWorkspace, shortHash } from \"./util.js\"; 证据：`src/memory.ts`\n- **Parser Backend**（source_file）：import { createRequire } from \"node:module\"; import Parser from \"web-tree-sitter\"; 证据：`src/parser-backend.ts`\n- **Report**（source_file）：import { closeKernelDb, openKernelDb, listMemories } from \"./db.js\"; import { getIndexStatus } from \"./search.js\"; import { type ContextReport, type ReportFormat } from \"./types.js\"; import { estimateTokens, redactText, resolveWorkspace } from \"./util.js\"; 证据：`src/report.ts`\n- **Search**（source_file）：import fs from \"node:fs\"; import { execFileSync } from \"node:child process\"; import { addQuery, closeKernelDb, count, getMeta, memoryFromRow, openKernelDb, saveEvidencePack } from \"./db.js\"; import { indexWorkspace } from \"./indexer.js\"; import { type EvidencePack, type GraphPath, type IndexStatus, type SearchHit, type SearchIntent, type SymbolRecord, SCHEMA VERSION } from \"./types.js\"; import { clamp, dbPathFor, estimateTokens, excerpt, nowIso, redactText, resolveWorkspace, shortHash } from \"./util.js\"; 证据：`src/search.ts`\n- **Types**（source_file）：export const SCHEMA VERSION = 1; export const STATE DIR = \".contextful\"; 证据：`src/types.ts`\n- **Util**（source_file）：import crypto from \"node:crypto\"; import fs from \"node:fs\"; import path from \"node:path\"; import { STATE DIR } from \"./types.js\"; 证据：`src/util.ts`\n- **Context Kernel.Test**（source_file）：import { execFileSync } from \"node:child process\"; import fs from \"node:fs\"; import os from \"node:os\"; import path from \"node:path\"; import { fileURLToPath } from \"node:url\"; import { Client } from \"@modelcontextprotocol/sdk/client/index.js\"; import { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"; import { afterEach, describe, expect, it } from \"vitest\"; import { createContextPack, generateReport, getIndexStatus, indexWorkspace, recallMemory, searchContext, whyChanged, writeLesson } from \"../src/index.js\"; 证据：`tests/context-kernel.test.ts`\n- **Vitest.Config**（source_file）：import { defineConfig } from \"vitest/config\"; 证据：`vitest.config.ts`\n\n## 宿主 AI 必须遵守的规则\n\n- **把本资产当作开工前上下文，而不是运行环境。**：AI Context Pack 只包含证据化项目理解，不包含目标项目的可执行状态。 证据：`README.md`, `package.json`, `tests/fixtures/sample-repo/package.json`\n- **回答用户时区分可预览内容与必须安装后才能验证的内容。**：安装前体验的消费者价值来自降低误装和误判，而不是伪装成真实运行。 证据：`README.md`, `package.json`, `tests/fixtures/sample-repo/package.json`\n\n## 用户开工前应该回答的问题\n\n- 你准备在哪个宿主 AI 或本地环境中使用它？\n- 你只是想先体验工作流，还是准备真实安装？\n- 你最在意的是安装成本、输出质量、还是和现有规则的冲突？\n\n## 验收标准\n\n- 所有能力声明都能回指到 evidence_refs 中的文件路径。\n- AI_CONTEXT_PACK.md 没有把预览包装成真实运行。\n- 用户能在 3 分钟内看懂适合谁、能做什么、如何开始和风险边界。\n\n---\n\n## Doramagic Context Augmentation\n\n下面内容用于强化 Repomix/AI Context Pack 主体。Human Manual 只提供阅读骨架；踩坑日志会被转成宿主 AI 必须遵守的工作约束。\n\n## Human Manual 骨架\n\n使用规则：这里只是项目阅读路线和显著性信号，不是事实权威。具体事实仍必须回到 repo evidence / Claim Graph。\n\n宿主 AI 硬性规则：\n- 不得把页标题、章节顺序、摘要或 importance 当作项目事实证据。\n- 解释 Human Manual 骨架时，必须明确说它只是阅读路线/显著性信号。\n- 能力、安装、兼容性、运行状态和风险判断必须引用 repo evidence、source path 或 Claim Graph。\n\n- **项目概述**：importance `high`\n  - source_paths: README.md, package.json, src/types.ts\n- **系统架构**：importance `high`\n  - source_paths: src/mcp-server.ts, src/indexer.ts, src/cli.ts, src/index.ts\n- **搜索系统**：importance `high`\n  - source_paths: src/search.ts, src/db.ts, src/extract.ts\n- **上下文包系统**：importance `high`\n  - source_paths: src/search.ts, src/report.ts, src/types.ts\n- **内存分类账**：importance `medium`\n  - source_paths: src/memory.ts, src/types.ts, src/db.ts\n- **数据存储与索引**：importance `medium`\n  - source_paths: src/db.ts, src/files.ts, src/indexer.ts, src/util.ts\n- **MCP 服务器集成**：importance `high`\n  - source_paths: src/mcp-server.ts, server.json, src/types.ts\n- **解析与代码提取**：importance `medium`\n  - source_paths: src/extract.ts, src/parser-backend.ts, src/language.ts\n\n## Repo Inspection Evidence / 源码检查证据\n\n- repo_clone_verified: true\n- repo_inspection_verified: true\n- repo_commit: `94dcc85541ecfefd7258c76c6d58db34bcbfbbbc`\n- inspected_files: `package.json`, `README.md`, `docs/IMPROVEMENTS.md`, `src/parser-backend.ts`, `src/report.ts`, `src/search.ts`, `src/util.ts`, `src/db.ts`, `src/files.ts`, `src/index.ts`, `src/language.ts`, `src/types.ts`, `src/mcp-server.ts`, `src/extract.ts`, `src/memory.ts`, `src/cli.ts`, `src/indexer.ts`\n\n宿主 AI 硬性规则：\n- 没有 repo_clone_verified=true 时，不得声称已经读过源码。\n- 没有 repo_inspection_verified=true 时，不得把 README/docs/package 文件判断写成事实。\n- 没有 quick_start_verified=true 时，不得声称 Quick Start 已跑通。\n\n## Doramagic Pitfall Constraints / 踩坑约束\n\n这些规则来自 Doramagic 发现、验证或编译过程中的项目专属坑点。宿主 AI 必须把它们当作工作约束，而不是普通说明文字。\n\n### Constraint 1: 可能修改宿主 AI 配置\n\n- Trigger: 项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。\n- Host AI rule: 列出会写入的配置文件、目录和卸载/回滚步骤。\n- Why it matters: 安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。\n- Evidence: capability.host_targets | github_repo:1240001007 | https://github.com/Inferensys/contextful | host_targets=claude, claude_code\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 2: 能力判断依赖假设\n\n- Trigger: README/documentation is current enough for a first validation pass.\n- Host AI rule: 将假设转成下游验证清单。\n- Why it matters: 假设不成立时，用户拿不到承诺的能力。\n- Evidence: capability.assumptions | github_repo:1240001007 | https://github.com/Inferensys/contextful | README/documentation is current enough for a first validation pass.\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 3: 维护活跃度未知\n\n- Trigger: 未记录 last_activity_observed。\n- Host AI rule: 补 GitHub 最近 commit、release、issue/PR 响应信号。\n- Why it matters: 新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- Evidence: evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | last_activity_observed missing\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 4: 下游验证发现风险项\n\n- Trigger: no_demo\n- Host AI rule: 进入安全/权限治理复核队列。\n- Why it matters: 下游已经要求复核，不能在页面中弱化。\n- Evidence: downstream_validation.risk_items | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 5: 存在评分风险\n\n- Trigger: no_demo\n- Host AI rule: 把风险写入边界卡，并确认是否需要人工复核。\n- Why it matters: 风险会影响是否适合普通用户安装。\n- Evidence: risks.scoring_risks | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 6: issue/PR 响应质量未知\n\n- Trigger: issue_or_pr_quality=unknown。\n- Host AI rule: 抽样最近 issue/PR，判断是否长期无人处理。\n- Why it matters: 用户无法判断遇到问题后是否有人维护。\n- Evidence: evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | issue_or_pr_quality=unknown\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 7: 发布节奏不明确\n\n- Trigger: release_recency=unknown。\n- Host AI rule: 确认最近 release/tag 和 README 安装命令是否一致。\n- Why it matters: 安装命令和文档可能落后于代码，用户踩坑概率升高。\n- Evidence: evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | release_recency=unknown\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n",
      "summary": "给宿主 AI 的上下文和工作边界。",
      "title": "AI Context Pack / 带给我的 AI"
    },
    "boundary_risk_card": {
      "asset_id": "boundary_risk_card",
      "filename": "BOUNDARY_RISK_CARD.md",
      "markdown": "# Boundary & Risk Card / 安装前决策卡\n\n项目：Inferensys/contextful\n\n## Doramagic 试用结论\n\n当前结论：可以进入发布前推荐检查；首次使用仍应从最小权限、临时目录和可回滚配置开始。\n\n## 用户现在可以做\n\n- 可以先阅读 Human Manual，理解项目目的和主要工作流。\n- 可以复制 Prompt Preview 做安装前体验；这只验证交互感，不代表真实运行。\n- 可以把官方 Quick Start 命令放到隔离环境中验证，不要直接进主力环境。\n\n## 现在不要做\n\n- 不要把 Prompt Preview 当成项目实际运行结果。\n- 不要把 metadata-only validation 当成沙箱安装验证。\n- 不要把未验证能力写成“已支持、已跑通、可放心安装”。\n- 不要在首次试用时交出生产数据、私人文件、真实密钥或主力配置目录。\n\n## 安装前检查\n\n- 宿主 AI 是否匹配：claude, claude_code\n- 官方安装入口状态：已发现官方入口\n- 是否在临时目录、临时宿主或容器中验证：必须是\n- 是否能回滚配置改动：必须能\n- 是否需要 API Key、网络访问、读写文件或修改宿主配置：未确认前按高风险处理\n- 是否记录了安装命令、实际输出和失败日志：必须记录\n\n## 当前阻塞项\n\n- review_required: community_discussion_evidence_below_public_threshold\n\n## 项目专属踩坑\n\n- 可能修改宿主 AI 配置（medium）：安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。 建议检查：列出会写入的配置文件、目录和卸载/回滚步骤。\n- 能力判断依赖假设（medium）：假设不成立时，用户拿不到承诺的能力。 建议检查：将假设转成下游验证清单。\n- 维护活跃度未知（medium）：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 下游验证发现风险项（medium）：下游已经要求复核，不能在页面中弱化。 建议检查：进入安全/权限治理复核队列。\n- 存在评分风险（medium）：风险会影响是否适合普通用户安装。 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n\n## 风险与权限提示\n\n- no_demo: medium\n\n## 证据缺口\n\n- 暂未发现结构化证据缺口。\n",
      "summary": "安装、权限、验证和推荐前风险。",
      "title": "Boundary & Risk Card / 边界与风险卡"
    },
    "human_manual": {
      "asset_id": "human_manual",
      "filename": "HUMAN_MANUAL.md",
      "markdown": "# https://github.com/Inferensys/contextful 项目说明书\n\n生成时间：2026-05-16 04:01:04 UTC\n\n## 目录\n\n- [项目概述](#page-1)\n- [系统架构](#page-2)\n- [搜索系统](#page-3)\n- [上下文包系统](#page-4)\n- [内存分类账](#page-5)\n- [数据存储与索引](#page-6)\n- [MCP 服务器集成](#page-7)\n- [解析与代码提取](#page-8)\n- [CLI 命令行工具](#page-9)\n- [部署与配置](#page-10)\n\n<a id='page-1'></a>\n\n## 项目概述\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [数据存储与索引](#page-6)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 项目概述\n\n## 项目简介\n\n**Contextful**（也称 `cxf` 或 `contextful`）是一个本地代码索引与上下文检索系统，专为 AI 编程助手设计。该项目由 Inferensys 团队开发，旨在解决大型代码库中上下文信息过载的问题，帮助 AI Agent 在代码审查、重构、依赖分析等场景中高效获取精确的证据支撑[资料来源：README.md:1]()\n\nContextful 的核心价值在于将传统的\"暴力读取文件\"模式转变为\"证据驱动的紧凑上下文打包\"模式。传统方式下，AI Agent 可能需要读取数十个文件才能理解一个问题，而 Contextful 能够根据查询意图返回一个经过排序、标注来源、符合 token 预算的紧凑证据包[资料来源：README.md:1-5]()。\n\n### 核心设计理念\n\nContextful 遵循以下设计原则：\n\n1. **证据优先**：每个返回的上下文都附带文件引用和行号，AI 可以直接溯源\n2. **意图感知**：系统能够分类用户查询（如精确搜索、影响分析、架构追踪等）\n3. **预算可控**：返回结果严格遵守 token 预算限制，避免信息过载\n4. **记忆持久化**：支持将 AI 学习到的经验持久化存储，供后续会话复用\n\n## 技术架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    subgraph 输入层\n        Q[用户查询]\n        W[工作区文件]\n        M[记忆数据]\n    end\n    \n    subgraph 处理层\n        C[CLI命令解析]\n        S[搜索引擎]\n        G[图数据库]\n        I[索引引擎]\n    end\n    \n    subgraph MCP层\n        MCP[MCP Server]\n        TOOLS[7大工具集]\n    end\n    \n    subgraph 输出层\n        P[Evidence Pack]\n        R[Context Report]\n    end\n    \n    Q --> C\n    W --> I\n    I --> G\n    C --> S\n    S --> G\n    M --> S\n    C --> MCP\n    MCP --> TOOLS\n    TOOLS --> P\n    TOOLS --> R\n    S --> P\n    G --> P\n```\n\n### 核心模块\n\n| 模块名称 | 文件路径 | 职责说明 |\n|---------|---------|---------|\n| CLI 解析器 | `src/cli.ts` | 命令行参数解析与路由 |\n| 搜索引擎 | `src/search.ts` | 全文检索、意图分类、结果排序 |\n| 索引引擎 | `src/extract.ts` | 符号提取、依赖关系图构建 |\n| MCP 服务 | `src/mcp-server.ts` | MCP 协议实现与工具暴露 |\n| 报告生成 | `src/report.ts` | 上下文报告与证据包渲染 |\n\n## 功能特性\n\n### CLI 命令行工具\n\nContextful 提供完整的命令行界面，支持以下操作[资料来源：src/cli.ts:1-100]()：\n\n| 命令 | 功能描述 | 核心参数 |\n|------|---------|---------|\n| `cxf index` | 建立或更新工作区索引 | `--workspace`, `--watch` |\n| `cxf daemon` | 启动本地索引守护进程 | `--workspace` |\n| `cxf query` | 创建证据包 | `--workspace`, `--budget`, `--json` |\n| `cxf search` | 搜索上下文 | `--workspace`, `--limit`, `--kind` |\n| `cxf report` | 生成上下文报告 | `--workspace`, `--format` |\n| `cxf memory add` | 存储经验教训 | `--claim`, `--evidence`, `--scope` |\n| `cxf server` | 启动 MCP 服务 | 无 |\n\n### MCP 工具集\n\nContextful 作为 MCP（Model Context Protocol）服务器，暴露了 7 个核心工具[资料来源：src/mcp-server.ts:1-50]()：\n\n| 工具名称 | 功能说明 |\n|---------|---------|\n| `context_pack` | 返回排序、标注来源、符合预算的证据包 |\n| `search_code` | 强大的代码、文档、符号和记忆搜索 |\n| `trace_path` | 跨文件、符号、模块、配置的图遍历 |\n| `impact_analysis` | 逆向依赖分析与影响范围识别 |\n| `why_changed` | 结合 Git 历史的变更原因分析 |\n| `recall_memory` | 搜索持久化的经验教训 |\n| `write_lesson` | 写入带证据的经验教训 |\n\n### 搜索意图分类\n\n系统能够将用户查询自动分类为以下意图类型[资料来源：src/search.ts:1-30]()：\n\n| 意图类型 | 触发关键词 | 典型使用场景 |\n|---------|-----------|-------------|\n| `exact` | 文件路径、符号名、正则表达式 | 精确查找定义或文件 |\n| `code` | 函数、变量、参数、实现 | 代码实现分析 |\n| `memory` | 记忆、经验、教训、会话 | 经验检索 |\n| `impact` | 影响、依赖、影响范围 | 变更影响分析 |\n| `historical` | 为什么、变更、历史、提交 | 变更原因追溯 |\n| `architectural` | 架构、流程、路径、依赖 | 系统架构分析 |\n| `docs` | 文档、指南、README、配置 | 文档查找 |\n| `vague` | 通用查询 | 模糊匹配 |\n\n### 索引能力\n\n系统支持多种编程语言的代码索引[资料来源：src/extract.ts:1-80]()：\n\n| 语言 | 支持类型 | 提取内容 |\n|------|---------|---------|\n| TypeScript/JavaScript | 函数、类、接口、类型 | 函数声明、导出状态、签名 |\n| Python | 函数、类 | 函数定义、类定义 |\n| Go | 函数、结构体、接口 | 函数声明、包级导出 |\n| Rust | 函数、结构体、枚举、特征、impl | 函数、结构体、特征实现 |\n| Markdown | 标题 | 层级标题结构 |\n| JSON | 配置键 | 顶层键名 |\n| Go | import 路径 | 包引用 |\n| Rust | use/mod 语句 | 模块引用 |\n\n## 工作流程\n\n### 索引构建流程\n\n```mermaid\ngraph LR\n    A[文件扫描] --> B[语言检测]\n    B --> C[符号提取]\n    C --> D[依赖关系提取]\n    D --> E[全文分块]\n    E --> F[SQLite存储]\n    \n    F --> G[FTS全文索引]\n    G --> H[图数据库索引]\n```\n\n### 证据包生成流程\n\n```mermaid\ngraph TD\n    Q[query查询] --> C{意图分类}\n    C -->|code| F1[FTS全文搜索]\n    C -->|impact| F2[图遍历分析]\n    C -->|memory| F3[记忆库搜索]\n    C -->|historical| F4[Git历史查询]\n    \n    F1 --> R[结果合并]\n    F2 --> R\n    F3 --> R\n    F4 --> R\n    \n    R --> D[相关性评分]\n    D --> S[Token预算分配]\n    S --> P[Evidence Pack]\n    \n    P --> CITE[引用标注]\n    P --> GRAPH[图路径连接]\n    P --> CONF[置信度计算]\n    \n    CITE --> OUTPUT[最终输出]\n    GRAPH --> OUTPUT\n    CONF --> OUTPUT\n```\n\n## 依赖关系\n\n### 核心依赖\n\n| 依赖包 | 版本 | 用途 |\n|--------|------|------|\n| `@modelcontextprotocol/sdk` | ^1.29.0 | MCP 协议实现 |\n| `better-sqlite3` | ^12.10.0 | SQLite 数据库引擎 |\n| `commander` | ^14.0.3 | CLI 命令解析 |\n| `fast-glob` | ^3.3.3 | 文件模式匹配 |\n| `web-tree-sitter` | ^0.20.8 | 语法树解析 |\n| `zod` | ^4.4.3 | 数据验证 |\n\n### 开发依赖\n\n| 依赖包 | 版本 | 用途 |\n|--------|------|------|\n| `typescript` | ^6.0.3 | 类型检查与编译 |\n| `vitest` | ^4.1.6 | 单元测试框架 |\n\n### 环境要求\n\n- **Node.js 版本**: >= 20[资料来源：package.json:45]()\n\n### 支持的 IDE\n\n项目已针对以下 IDE 和编辑器进行测试[资料来源：package.json:10-18]()：\n\n- Windsurf\n- GitHub Copilot\n- VS Code\n- Cline\n- Roo Code\n- Continue\n- Zed\n\n## 项目元数据\n\n| 属性 | 值 |\n|------|-----|\n| 项目名称 | contextful |\n| CLI 别名 | `cxf` |\n| MCP 名称 | `io.github.Inferensys/contextful` |\n| 许可证 | MIT |\n| 仓库地址 | `git+https://github.com/Inferensys/contextful.git` |\n| 官网 | https://inferensys.github.io/contextful/ |\n| 问题追踪 | https://github.com/Inferensys/contextful/issues |\n\n## 使用示例\n\n### 安装与索引\n\n```bash\n# 全局安装\nnpx @inferensys/contextful index --workspace .\n\n# 持续监听文件变化\nnpx @inferensys/contextful index --workspace . --watch\n```\n\n### 查询上下文\n\n```bash\n# 基本查询\ncxf query \"where is user auth handled\" --workspace . --budget 2000\n\n# 输出 JSON 格式\ncxf query \"memory ledger implementation\" --workspace . --json\n```\n\n### MCP 服务模式\n\n```bash\n# 启动 MCP 服务器\nnpx @inferensys/contextful server\n```\n\n## 数据模型\n\n### 证据包结构\n\n```mermaid\nclassDiagram\n    class EvidencePack {\n        +string id\n        +string query\n        +string scope\n        +SearchIntent intent\n        +string summary\n        +SearchHit[] citations\n        +FileContext[] files\n        +SymbolRecord[] symbols\n        +GraphPath[] graphPaths\n        +SearchHit[] memoryHits\n        +number confidence\n        +number tokenEstimate\n        +number budget\n        +string createdAt\n    }\n    \n    class SearchHit {\n        +string ref\n        +string path\n        +string title\n        +string kind\n        +string excerpt\n        +number rank\n    }\n    \n    class GraphPath {\n        +string from\n        +string to\n        +string edgeType\n        +string filePath\n        +number line\n    }\n    \n    EvidencePack --> SearchHit\n    EvidencePack --> GraphPath\n```\n\n### 记忆条目结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符 |\n| `claim` | string | 经验主张 |\n| `evidenceRefs` | string[] | 证据引用列表 |\n| `scope` | string | 作用范围（repo/global） |\n| `confidence` | number | 置信度（0-1） |\n| `createdAt` | string | 创建时间 |\n\n## 报告功能\n\n系统支持生成多格式的上下文报告[资料来源：src/report.ts:1-60]()：\n\n| 格式 | 说明 |\n|------|------|\n| `markdown` | 默认格式，Markdown 渲染 |\n| `json` | 结构化 JSON 输出 |\n| `html` | 独立 HTML 页面，可直接在浏览器打开 |\n\n### 报告包含内容\n\n- **索引状态**：已索引文件数、符号数、块数\n- **统计摘要**：Token 使用情况、节省比例估算\n- **警告信息**：潜在问题提示（如未索引文件、依赖缺失）\n- **Token 节省估算**：相对于未使用系统的平均节省比例\n\n---\n\n**相关链接**：\n\n- 官方文档：https://inferensys.github.io/contextful/\n- 问题反馈：https://github.com/Inferensys/contextful/issues\n- 源码仓库：https://github.com/Inferensys/contextful\n\n---\n\n<a id='page-2'></a>\n\n## 系统架构\n\n### 相关页面\n\n相关主题：[项目概述](#page-1), [数据存储与索引](#page-6), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/indexer.ts](https://github.com/Inferensys/contextful/blob/main/src/indexer.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 系统架构\n\n## 1. 概述\n\nContextful 是一个基于语义索引的上下文检索系统，旨在为 AI 代理提供精准、紧凑且有据可查的证据包。系统通过解析、索引代码仓库中的符号、导入关系和文档片段，使代理能够在执行任务时快速获取相关上下文，避免随机文件读取带来的效率低下问题。资料来源：[README.md]()\n\n## 2. 整体架构\n\nContextful 采用分层架构设计，主要包含以下层次：\n\n| 层次 | 职责 | 核心模块 |\n|------|------|----------|\n| CLI 层 | 用户交互接口 | `src/cli.ts` |\n| MCP 服务层 | 与 AI 代理的标准通信协议 | `src/mcp-server.ts` |\n| 搜索/查询层 | 语义检索和证据包生成 | `src/search.ts` |\n| 索引层 | 代码解析和数据库写入 | `src/indexer.ts` |\n| 提取层 | 符号和依赖关系解析 | `src/extract.ts` |\n| 工具层 | 通用工具函数 | `src/util.ts` |\n\n```mermaid\ngraph TD\n    A[CLI 客户端] --> B[MCP Server]\n    C[AI 代理] --> B\n    B --> D[Search Module]\n    D --> E[Index Layer]\n    E --> F[SQLite Kernel DB]\n    G[File System] --> E\n    D --> G\n```\n\n资料来源：[src/cli.ts:40-65]()，[src/search.ts:1-50]()\n\n## 3. 核心组件详解\n\n### 3.1 索引子系统 (Indexer)\n\n索引子系统负责扫描工作区文件并将其内容转换为可检索的数据库记录。索引过程包括文件发现、语言检测、符号提取和依赖关系分析四个阶段。\n\n```mermaid\ngraph LR\n    A[文件扫描] --> B[语言检测]\n    B --> C[符号提取]\n    C --> D[依赖分析]\n    D --> E[分块存储]\n```\n\n#### 索引流程\n\n| 阶段 | 功能 | 关键函数 |\n|------|------|----------|\n| 文件发现 | 递归扫描目录，忽略隐藏文件和测试文件 | `scanWorkspace()` |\n| 语言检测 | 根据扩展名识别 TypeScript/JavaScript、Python、Go、Rust 等语言 | `detectLanguage()` |\n| 符号提取 | 解析函数、类、接口、类型定义 | `extractSymbols()` |\n| 依赖分析 | 提取 import/require/use 语句 | `extractEdges()` |\n| 内容分块 | 将文件内容切分为可管理的片段 | `textChunks()` |\n\n资料来源：[src/extract.ts:1-50]()，[src/indexer.ts]()\n\n#### 支持的编程语言\n\n系统支持多种编程语言的符号提取和依赖分析：\n\n| 语言 | 符号类型 | 依赖检测 |\n|------|----------|----------|\n| TypeScript/JavaScript | function, class, interface, type, const | `import from`、`require()` |\n| Python | function, class | `from ... import`、`import` |\n| Go | function, struct, interface | 字符串字面量导入 |\n| Rust | function, struct, enum, trait, impl | `use`、`mod` |\n| Markdown | heading | 无依赖 |\n| JSON | config-key | 键值对配置 |\n\n资料来源：[src/extract.ts:10-45]()\n\n### 3.2 搜索与查询子系统 (Search)\n\n搜索子系统是系统的核心大脑，负责理解用户查询意图并返回最相关的上下文片段。\n\n```mermaid\ngraph TD\n    A[用户查询] --> B{意图分类}\n    B -->|code| C[代码搜索]\n    B -->|symbol| D[符号搜索]\n    B -->|impact| E[影响分析]\n    B -->|historical| F[历史追溯]\n    B -->|architectural| G[架构路径]\n    B -->|docs| H[文档检索]\n    C --> I[全文索引查询]\n    D --> J[符号表查询]\n    E --> K[依赖图遍历]\n    F --> L[Git 历史读取]\n    I --> M[BM25 排序]\n    J --> M\n    K --> M\n    M --> N[证据包组装]\n```\n\n#### 意图分类器\n\n查询意图自动分类为以下类型：\n\n| 意图 | 检测关键词 | 搜索模式 |\n|------|------------|----------|\n| `code` | how, implement, code, function | 全文搜索 |\n| `symbol` | class, interface, function name | 精确符号匹配 |\n| `impact` | impact, affected, depends, blast radius | 逆向依赖分析 |\n| `historical` | why, changed, commit, history | Git 历史 + 当前代码 |\n| `architectural` | architecture, flow, path, trace | 图遍历 |\n| `docs` | resource, docs, documentation, guide | 文档优先 |\n| `vague` | 通用模糊查询 | 扩展术语 + 全文搜索 |\n\n资料来源：[src/search.ts:1-20]()\n\n### 3.3 证据包系统 (Evidence Pack)\n\n证据包是系统返回给 AI 代理的核心数据结构，包含查询答案的所有支持证据。\n\n```mermaid\ngraph TD\n    A[createContextPack] --> B[searchContext]\n    B --> C{选择命中}\n    C -->|hits| D[topKByScore]\n    C -->|graphPaths| E[loadGraphPaths]\n    C -->|memoryHits| F[内存记忆]\n    D --> G[组装证据包]\n    E --> G\n    F --> G\n    G --> H[EvidencePack]\n    H --> I[summary 摘要]\n    H --> J[citations 引用]\n    H --> K[symbols 符号]\n    H --> L[graphPaths 路径]\n```\n\n#### 证据包数据结构\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符\n  query: string;                 // 原始查询\n  scope: string;                 // 作用域 (repo|file|session)\n  intent: SearchIntent;          // 识别的查询意图\n  summary: string;               // 自然语言摘要\n  citations: SearchHit[];         // 命中的上下文片段\n  files: FileReference[];         // 相关文件列表\n  symbols: SymbolRecord[];         // 匹配的符号\n  graphPaths: GraphPath[];        // 图路径连接\n  memoryHits: SearchHit[];        // 记忆系统命中\n  confidence: number;            // 置信度 (0.1-0.92)\n  tokenEstimate: number;         // 估算的 token 数量\n  budget: number;                // token 预算上限\n  createdAt: string;             // 创建时间戳\n}\n```\n\n资料来源：[src/search.ts:150-200]()，[src/types.ts]()\n\n### 3.4 MCP 服务层\n\nMCP (Model Context Protocol) 服务层提供了与 AI 代理通信的标准接口，使 Contextful 可作为工具被集成到任何兼容 MCP 的代理中。\n\n```mermaid\ngraph LR\n    A[AI Agent] -->|stdio| B[MCP Server]\n    B -->|context_pack| C[createContextPack]\n    B -->|search_code| D[searchContext]\n    B -->|trace_path| E[traceGraph]\n    B -->|impact_analysis| F[impactAnalysis]\n    B -->|why_changed| G[whyChanged]\n    B -->|recall_memory| H[recallMemory]\n    B -->|write_lesson| I[writeLesson]\n```\n\n#### MCP 工具列表\n\n| 工具名 | 功能 | 参数 |\n|--------|------|------|\n| `context_pack` | 生成带证据的上下文包 | query, budget, scope |\n| `search_code` | 搜索代码、文档、符号、记忆 | query, mode, filters |\n| `trace_path` | 图遍历追踪符号/模块依赖 | from, to, edge_types |\n| `impact_analysis` | 分析符号/文件的逆向依赖 | symbol_or_file |\n| `why_changed` | 追溯变更历史 | symbol_or_file |\n| `recall_memory` | 搜索记忆系统 | query, scope |\n| `write_lesson` | 写入学习记忆 | claim, evidence_refs |\n\n资料来源：[src/mcp-server.ts]()，[README.md]()\n\n### 3.5 CLI 命令行接口\n\nCLI 模块提供了独立的命令行工具 `cxf` (contextful) 供开发者直接使用。\n\n#### 命令概览\n\n| 命令 | 描述 | 核心选项 |\n|------|------|----------|\n| `index` | 索引工作区文件 | `--workspace`, `--watch` |\n| `daemon` | 启动本地索引守护进程 | `--workspace` |\n| `query` | 创建证据包 | `--workspace`, `--budget`, `--json` |\n| `search` | 搜索索引内容 | `--workspace`, `--limit`, `--kind` |\n| `report` | 生成上下文报告 | `--workspace`, `--format` |\n| `memory add` | 添加学习记忆 | `--claim`, `--evidence`, `--confidence` |\n| `server` | 启动 MCP 服务 | 无 |\n\n资料来源：[src/cli.ts:1-80]()\n\n#### 使用示例\n\n```bash\n# 索引当前目录\ncxf index --workspace .\n\n# 启动守护进程监听变更\ncxf daemon --workspace .\n\n# 查询上下文\ncxf query \"用户认证在哪里处理\" --workspace . --budget 2000\n\n# 生成报告\ncxf report --workspace . --format markdown\n```\n\n## 4. 数据模型\n\n### 4.1 内核数据库 (SQLite)\n\n系统使用 SQLite 作为内核数据库，存储以下核心表结构：\n\n| 表名 | 用途 | 核心字段 |\n|------|------|----------|\n| `files` | 已索引文件元数据 | path, language, hash, indexed_at |\n| `chunks` | 文件分块内容 | file_id, path, title, text, kind |\n| `chunks_fts` | 全文搜索索引 | BM25 排序的 FTS5 表 |\n| `symbols` | 代码符号表 | name, kind, file_path, line, signature |\n| `edges` | 依赖关系图 | source_path, target_name, edge_type |\n| `memory` | 学习记忆存储 | id, claim, evidence, confidence, scope |\n| `queries` | 查询历史 | query, intent, timestamp |\n\n资料来源：[src/indexer.ts]()，[src/search.ts:50-100]()\n\n### 4.2 符号提取数据模型\n\n```typescript\ninterface SymbolRecord {\n  ref: string;          // 文件引用，如 \"file:src/auth.ts:1-20\"\n  name: string;         // 符号名称\n  kind: string;         // 类型：function, class, interface, struct, enum\n  filePath: string;     // 文件路径\n  line: number;         // 定义行号\n  signature?: string;   // 函数签名摘要\n  exported?: boolean;   // 是否导出\n}\n\ninterface RawEdge {\n  targetName: string;   // 目标名称\n  targetType: string;   // 目标类型：module, config\n  edgeType: string;     // 边类型：IMPORTS, CONFIGURES\n  filePath: string;     // 源文件路径\n  line: number;         // 行号\n}\n```\n\n资料来源：[src/extract.ts:1-30]()\n\n## 5. 工作流程\n\n### 5.1 索引完整流程\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant CLI as CLI/Server\n    participant Indexer\n    participant Extractor\n    participant DB as Kernel DB\n    \n    User->>CLI: cxf index --workspace .\n    CLI->>Indexer: scanWorkspace(workspace)\n    Indexer->>Indexer: 遍历所有文件\n    loop 每个文件\n        Indexer->>Extractor: extractSymbols(content, language)\n        Extractor-->>Indexer: symbols[]\n        Indexer->>Extractor: extractEdges(content, language)\n        Extractor-->>Indexer: edges[]\n        Indexer->>Extractor: textChunks(content)\n        Extractor-->>Indexer: chunks[]\n        Indexer->>DB: insert records\n    end\n    DB-->>CLI: indexing complete\n    CLI-->>User: status report\n```\n\n### 5.2 查询证据包生成流程\n\n```mermaid\nsequenceDiagram\n    participant Agent\n    participant MCP as MCP Server\n    participant Search\n    participant DB as Kernel DB\n    \n    Agent->>MCP: context_pack(\"用户认证\", budget=2000)\n    MCP->>Search: createContextPack({query, budget})\n    Search->>Search: classifyQuery(query) -> intent\n    Search->>Search: searchContext({query, intent})\n    Search->>DB: FTS query + BM25\n    DB-->>Search: ranked hits\n    Search->>Search: selectTopK(hits, budget)\n    Search->>DB: loadSymbolsForPaths()\n    Search->>DB: loadGraphPaths()\n    Search-->>MCP: EvidencePack\n    MCP-->>Agent: EvidencePack (JSON/Markdown)\n```\n\n## 6. 记忆系统\n\nContextful 内置了一个证据支持的学习记忆系统，允许 AI 代理保存从查询中获得的经验教训。\n\n### 6.1 记忆数据结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符 |\n| `claim` | string | 经验断言/教训 |\n| `evidence` | SearchHit[] | 支持证据引用 |\n| `confidence` | number | 置信度 (0-1) |\n| `scope` | string | 作用域 (repo/file/session) |\n| `createdAt` | string | 创建时间 |\n\n### 6.2 记忆查询\n\n记忆系统支持通过自然语言查询检索相关经验，与常规代码搜索并行执行，结果合并到证据包中。\n\n资料来源：[src/search.ts:200-250]()\n\n## 7. 报告系统\n\n报告模块提供工作区的整体上下文分析视图。\n\n```mermaid\ngraph TD\n    A[generateReport] --> B[getIndexStatus]\n    A --> C[getQueryStats]\n    A --> D[getStaleMemories]\n    B --> E[renderReport]\n    C --> E\n    D --> E\n    E -->|markdown| F[Markdown 格式]\n    E -->|json| G[JSON 格式]\n    E -->|html| H[HTML 格式]\n```\n\n### 7.1 报告内容\n\n| 部分 | 内容 |\n|------|------|\n| 状态概览 | 文件数、符号数、索引状态 |\n| 语言覆盖 | 各编程语言的文件数量统计 |\n| 热门查询 | 最常使用的查询及意图分布 |\n| 陈旧记忆 | 需要更新的学习记忆 |\n| 代理指导 | 最佳实践建议 |\n| 警告 | 索引过程中的潜在问题 |\n\n资料来源：[src/report.ts:1-100]()\n\n## 8. 扩展机制\n\n### 8.1 自定义文件类型支持\n\n系统通过 `extract.ts` 中的语言检测器支持扩展新的编程语言。需要实现：\n\n1. **符号提取**：匹配函数/类/类型定义的正则表达式\n2. **依赖分析**：匹配导入语句的模式\n3. **分块策略**：适用于该语言内容的分块算法\n\n### 8.2 MCP 工具扩展\n\nMCP 服务层支持注册新的工具函数，遵循以下签名：\n\n```typescript\ninterface MCPTool {\n  name: string;\n  description: string;\n  inputSchema: object;\n  handler: (params: object) => Promise<object>;\n}\n```\n\n## 9. 总结\n\nContextful 的系统架构围绕\"精准上下文检索\"这一核心目标设计，通过分层解耦实现了以下能力：\n\n- **多语言支持**：支持 TypeScript/JavaScript、Python、Go、Rust 等主流语言的符号提取\n- **智能意图分类**：自动识别查询意图并选择最优搜索策略\n- **图遍历能力**：通过依赖图支持影响分析和架构追踪\n- **记忆持久化**：证据支持的学习记忆系统\n- **MCP 集成**：标准化的 AI 代理通信协议\n\n整个系统以 SQLite 为核心存储，通过 FTS5 全文索引和 BM25 排序算法实现高效检索，最终输出紧凑且有据可查的证据包。\n\n---\n\n<a id='page-3'></a>\n\n## 搜索系统\n\n### 相关页面\n\n相关主题：[上下文包系统](#page-4), [内存分类账](#page-5), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n</details>\n\n# 搜索系统\n\n## 概述\n\n搜索系统是 Contextful 的核心功能模块，负责在已索引的工作区中执行多维度上下文检索。该系统通过整合全文搜索（FTS）、符号搜索、图关系遍历和记忆搜索等多种检索策略，为 AI 代理提供精确、相关且有据可查的代码上下文。\n\n搜索系统的主要设计目标是解决传统 RAG（检索增强生成）方法中常见的\"随机文件读取\"问题，通过意图分类、相关性排序和证据打包等机制，返回紧凑且经过验证的证据集，而非大量无关文件。资料来源：[README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n## 架构概览\n\n```mermaid\ngraph TD\n    A[用户查询] --> B[意图分类 classifyQuery]\n    B --> C{查询类型}\n    C -->|exact| D[精确搜索]\n    C -->|symbol| E[符号搜索]\n    C -->|memory| F[记忆搜索]\n    C -->|impact| G[影响分析]\n    C -->|historical| H[历史分析]\n    C -->|architectural| I[架构分析]\n    C -->|docs| J[文档搜索]\n    C -->|vague| K[模糊搜索]\n    \n    D --> L[全文搜索引擎]\n    E --> L\n    F --> M[记忆数据库]\n    G --> N[依赖图遍历]\n    H --> O[Git历史]\n    I --> N\n    J --> L\n    \n    L --> P[结果合并去重]\n    M --> P\n    N --> P\n    O --> P\n    P --> Q[证据打包 createContextPack]\n    Q --> R[EvidencePack]\n```\n\n## 核心组件\n\n### 搜索上下文管理器\n\n`searchContext` 是搜索系统的入口函数，负责协调整个搜索流程：\n\n```typescript\nexport async function searchContext(options: SearchOptions): Promise<{ intent: SearchIntent; hits: SearchHit[] }>\n```\n\n**主要职责：**\n\n1. 解析并验证工作区路径\n2. 确保索引已完成（调用 `ensureIndexed`）\n3. 对查询进行意图分类\n4. 执行对应的搜索策略\n5. 合并和去重搜索结果\n\n资料来源：[src/search.ts:核心函数](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 意图分类器\n\n意图分类器 `classifyQuery` 是搜索系统的智能路由层，根据查询内容将其映射到最适合的搜索策略。\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent\n```\n\n**支持的意图类型：**\n\n| 意图类型 | 触发关键词 | 搜索策略 |\n|---------|-----------|---------|\n| `exact` | 符号名（驼峰命名）、路径分隔符、井号 | 精确匹配文件路径或符号 |\n| `symbol` | function、method、class、interface、变量名 | 符号定义检索 |\n| `memory` | memory、lesson、remember、learned、session | 记忆库检索 |\n| `impact` | impact、affected、depends、blast radius、uses | 影响分析和依赖追踪 |\n| `historical` | why、changed、commit、history、regression | Git 历史分析 |\n| `architectural` | architecture、flow、trace、connects、imports | 架构图遍历 |\n| `docs` | docs、documentation、guide、readme、how to | 文档检索 |\n| `vague` | 其他情况 | 模糊全文搜索 |\n\n资料来源：[src/search.ts:意图分类逻辑](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n**意图分类的实现细节：**\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent {\n  const lower = q.toLowerCase();\n  if (/[`\"'#.:/]/.test(q) || /\\b[A-Z][A-Za-z0-9_]{2,}\\b/.test(query)) return \"exact\";\n  if (/\\b(function|method|class|interface|enum|struct|impl)\\b/.test(q)) return \"symbol\";\n  if (/\\b(memory|memories|remember|remembers|lesson|lessons|learned|session|sessions)\\b/.test(q)) return \"memory\";\n  if (/\\b(impact|affected|depends on|dependents|blast radius|what uses|who calls)\\b/.test(q)) return \"impact\";\n  // ... 更多分类规则\n}\n```\n\n## 搜索策略\n\n### 全文搜索（FTS）\n\n全文搜索引擎基于 SQLite 的 FTS5 扩展实现，支持 BM25 排序算法：\n\n```typescript\nconst rows = kernel.db\n  .prepare(\"SELECT ref, path, title, text, bm25(chunks_fts) AS rank FROM chunks_fts WHERE chunks_fts MATCH ? LIMIT ?\")\n  .all(fts, limit * 10)\n```\n\n**查询构建器 `ftsQuery`：**\n\n负责将用户查询转换为 FTS5 兼容的查询语法：\n\n1. 移除停用词（stopwords）\n2. 展开相关术语（同义词扩展）\n3. 处理特殊字符和符号\n\n**停用词列表：**\n\n```typescript\nconst STOPWORDS = new Set([\"where\", \"what\", \"which\", \"when\", \"how\", \"are\", \"the\", \"for\", \"with\", \"and\", \"or\", \"to\"]);\n```\n\n**术语扩展 `expandedTerms`：**\n\n根据查询语义自动添加相关术语：\n\n| 语义主题 | 扩展术语 |\n|---------|---------|\n| tool/tools 相关 | server, tool, tools, callTool |\n| MCP 相关 | mcp, server, stdio |\n| memory 相关 | memory, memories, lesson, lessons, claim, ledger, evidence |\n| impact 相关 | imports, tests, edges |\n\n资料来源：[src/search.ts:FTS实现](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 符号搜索\n\n符号搜索专门用于定位代码中的定义和声明，支持多种编程语言：\n\n**支持的符号类型：**\n\n| 语言 | 符号类型 |\n|-----|---------|\n| TypeScript/JavaScript | function, class, interface, type, const |\n| Python | function, class |\n| Go | function (大写导出), struct, interface |\n| Rust | function, struct, enum, trait, impl |\n| Markdown | heading |\n\n**符号提取器 `extractSymbols`：**\n\n```typescript\nfunction extractSymbols(relativePath: string, content: string, language: string): SymbolRecord[]\n```\n\n**示例 - TypeScript 函数提取：**\n\n```typescript\nmatchPush(line, /^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/, push, \"function\");\n```\n\n资料来源：[src/extract.ts:符号提取](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n\n### 图关系搜索\n\n图搜索基于提取的导入和依赖关系构建有向图，支持：\n\n- **依赖追踪**：查找某个模块的导入关系\n- **影响分析**：反向查找依赖当前目标的所有模块\n- **路径追踪**：在两个符号/文件之间寻找连接路径\n\n**图数据结构：**\n\n```typescript\ninterface RawEdge {\n  targetName: string;\n  targetType: \"module\" | \"symbol\" | \"config\";\n  edgeType: \"IMPORTS\" | \"TESTS\" | \"CONFIGURES\";\n  line: number;\n}\n```\n\n**导入关系提取：**\n\n| 语言 | 导入语法 |\n|-----|---------|\n| TypeScript/JavaScript | `from \"...\"` / `require(\"...\")` |\n| Python | `from ... import ...` / `import ...` |\n| Go | `\"...\"` |\n| Rust | `use ...;` / `mod ...;` |\n| JSON | `\"key\": value` |\n\n资料来源：[src/extract.ts:边提取](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n\n### 记忆搜索\n\n记忆系统允许 AI 代理存储和检索基于证据的经验教训：\n\n```typescript\nmemory\n  .command(\"add\")\n  .requiredOption(\"--claim <text>\", \"Lesson claim.\")\n  .requiredOption(\"--evidence <ref...>\", \"Evidence ref(s)\")\n  .option(\"--scope <scope>\", \"Memory scope.\", \"repo\")\n  .option(\"--confidence <number>\", \"Confidence from 0 to 1.\", parseFloat, 0.7)\n```\n\n**记忆搜索触发条件：**\n\n当查询包含以下关键词时，系统自动启用记忆搜索：\n\n- memory, memories\n- remember, remembers\n- lesson, lessons\n- learned\n- session, sessions\n- ledger, evidence\n\n资料来源：[src/search.ts:记忆搜索触发](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 证据打包系统\n\n`createContextPack` 函数将搜索结果整合为结构化的证据包：\n\n```typescript\nexport async function createContextPack(options: CreatePackOptions): Promise<EvidencePack>\n```\n\n### 证据包结构\n\n```typescript\ninterface EvidencePack {\n  id: string;              // 唯一标识符\n  query: string;           // 原始查询\n  scope: string;           // 搜索范围\n  intent: SearchIntent;    // 识别的意图类型\n  summary: string;         // 结果摘要\n  citations: SearchHit[];  // 引用列表\n  files: FileContext[];    // 文件级上下文\n  symbols: SymbolRecord[]; // 相关符号\n  graphPaths: GraphPath[];// 图路径连接\n  memoryHits: SearchHit[]; // 记忆命中\n  confidence: number;      // 置信度 0.1-0.92\n  tokenEstimate: number;   // 估算 token 数\n  budget: number;          // 预算上限\n  createdAt: string;      // 创建时间 (ISO)\n}\n```\n\n### 置信度计算\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n**置信度计算公式：**\n\n| 贡献来源 | 权重 |\n|---------|------|\n| 基础分 | 0.25 |\n| 每条命中 | +0.05 |\n| 每条图路径 | +0.02 |\n| 每条记忆命中 | +0.05 |\n| 最小值 | 0.1 |\n| 最大值 | 0.92 |\n\n资料来源：[src/search.ts:置信度计算](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## CLI 集成\n\n搜索系统通过命令行提供完整的交互接口：\n\n### 可用命令\n\n```bash\n# 搜索上下文\ncxf search \"<query>\" --workspace <path> --limit 10 --kind all|code|docs|symbols|memory\n\n# 创建证据包\ncxf query \"<query>\" --workspace <path> --budget 2000 --json\n\n# 追踪图路径\ncxf trace --from <symbol> --to <target> --edge-types imports|tests\n\n# 影响分析\ncxf impact <symbol_or_file>\n\n# 历史分析\ncxf why --target <symbol_or_file>\n```\n\n### 查询选项\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--limit` | number | 10 | 最大命中数 |\n| `--kind` | enum | all | 搜索类型 |\n| `--budget` | number | 2000 | token 预算 |\n| `--json` | boolean | false | JSON 输出格式 |\n\n资料来源：[src/cli.ts:CLI命令定义](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n\n## MCP 工具集成\n\nContextful 作为 MCP（Model Context Protocol）服务器运行，提供标准化的工具接口：\n\n### 核心工具\n\n| 工具名 | 功能 | 参数 |\n|-------|------|------|\n| `context_pack` | 创建证据包 | query, budget, scope |\n| `search_code` | 多模式搜索 | query, mode, filters |\n| `trace_path` | 图路径追踪 | from, to, edge_types |\n| `impact_analysis` | 影响分析 | symbol_or_file |\n| `why_changed` | 变更历史 | symbol_or_file |\n| `recall_memory` | 记忆检索 | query, scope |\n| `write_lesson` | 写入记忆 | claim, evidence_refs |\n\n### MCP 服务器启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n资料来源：[README.md:MCP工具](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n## 搜索流程图\n\n```mermaid\nsequenceDiagram\n    participant User as 用户\n    participant CLI as CLI/MCP\n    participant Search as 搜索系统\n    participant FTS as FTS引擎\n    participant Graph as 图数据库\n    participant Memory as 记忆库\n    participant Pack as 证据打包\n\n    User->>CLI: query \"where is auth handled\"\n    CLI->>Search: searchContext({query})\n    Search->>Search: classifyQuery()\n    Note over Search: intent = \"architectural\"\n    \n    Search->>FTS: executeQuery()\n    Search->>Graph: loadGraphPaths()\n    Search->>Memory: memoryHits()\n    \n    FTS-->>Search: hits[]\n    Graph-->>Search: graphPaths[]\n    Memory-->>Search: memoryHits[]\n    \n    Search->>Pack: createContextPack()\n    Pack->>Pack: calculateConfidence()\n    Pack->>Pack: estimateTokens()\n    Pack-->>CLI: EvidencePack\n    \n    CLI-->>User: 格式化输出\n```\n\n## 数据模型\n\n### SearchHit\n\n```typescript\ninterface SearchHit {\n  ref: string;       // 引用标识 (file:path:start-end)\n  path: string;       // 文件路径\n  title: string;      // 标题\n  text: string;       // 匹配文本\n  kind: \"code\" | \"doc\" | \"symbol\" | \"memory\";\n  score: number;      // 相关性得分\n  rank: number;       // BM25 排名\n  line?: number;      // 行号\n}\n```\n\n### SymbolRecord\n\n```typescript\ninterface SymbolRecord {\n  ref: string;\n  name: string;\n  kind: string;       // function, class, etc.\n  filePath: string;\n  line: number;\n  signature: string;  // 函数签名/类型签名\n  exported?: boolean;\n}\n```\n\n### GraphPath\n\n```typescript\ninterface GraphPath {\n  from: string;\n  to: string;\n  edgeType: string;\n  filePath: string;\n  line: number;\n}\n```\n\n资料来源：[src/search.ts:数据结构定义](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 高级功能\n\n### 影响分析\n\n`impactAnalysis` 函数执行反向依赖分析：\n\n```typescript\nexport async function impactAnalysis(options: {\n  workspace?: string;\n  target: string;\n  limit?: number;\n}): Promise<{\n  target: string;\n  dependencies: GraphPath[];\n  dependents: GraphPath[];\n  likelyTests: GraphPath[];\n}>\n```\n\n**返回数据说明：**\n\n| 字段 | 说明 |\n|-----|------|\n| `dependencies` | 目标直接依赖的模块 |\n| `dependents` | 依赖该目标的模块 |\n| `likelyTests` | 相关的测试文件 |\n\n### 变更历史分析\n\n`whyChanged` 函数结合搜索结果和 Git 历史：\n\n```typescript\nexport async function whyChanged(options: {\n  workspace?: string;\n  target: string;\n  limit?: number\n}): Promise<{\n  target: string;\n  currentEvidence: SearchHit[];\n  commits: Array<{\n    hash: string;\n    subject: string;\n    date?: string;\n    files: string[];\n  }>;\n}>\n```\n\n资料来源：[src/search.ts:高级搜索功能](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 索引状态查询\n\n```typescript\nexport async function getIndexStatus(options: { workspace?: string }): Promise<IndexStatus>\n```\n\n**返回的索引状态信息：**\n\n| 字段 | 类型 | 说明 |\n|-----|------|------|\n| `workspace` | string | 工作区路径 |\n| `status` | string | 索引状态 |\n| `fileCount` | number | 文件总数 |\n| `languageCounts` | Record<string, number> | 各语言文件统计 |\n| `warnings` | string[] | 索引警告列表 |\n\n## 搜索结果后处理\n\n### 去重机制\n\n```typescript\nfunction dedupeHits(hits: SearchHit[]): SearchHit[] {\n  const seen = new Set<string>();\n  return hits.filter((hit) => {\n    if (seen.has(hit.ref)) return false;\n    seen.add(hit.ref);\n    return true;\n  });\n}\n```\n\n### 得分计算\n\n搜索结果通过多层评分机制排序：\n\n1. **BM25 基础分**：FTS5 内置的 BM25 算法\n2. **意图匹配奖励**：根据意图类型调整权重\n3. **语义扩展奖励**：术语扩展匹配额外加分\n\n```typescript\nfunction scoreFromRank(rank: number, intent: SearchIntent, query: string): number {\n  const lower = query.toLowerCase();\n  let bonus = 0;\n  \n  // 意图特定奖励\n  if (intent === \"symbol\" && lower.includes(\"function\")) bonus += 10;\n  if (intent === \"memory\" && lower.includes(\"memory ledger\")) bonus += 7;\n  \n  return 10 / (1 + Math.abs(rank)) + bonus;\n}\n```\n\n资料来源：[src/search.ts:得分计算](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 总结\n\n搜索系统是 Contextful 实现智能上下文检索的核心引擎，通过以下机制为 AI 代理提供精确的代码上下文：\n\n1. **意图驱动的路由**：自动识别查询意图并选择最优搜索策略\n2. **多模态检索**：整合全文搜索、符号搜索、图搜索和记忆搜索\n3. **证据打包**：将零散的搜索结果整合为结构化的证据包\n4. **智能排序**：基于 BM25 和语义理解的结果排序\n5. **置信度评估**：量化的结果可信度指标\n\n该系统特别适用于大型代码库的场景，能够帮助 AI 代理快速定位相关代码片段，避免盲目探索，同时保留完整的引用溯源能力。\n\n---\n\n<a id='page-4'></a>\n\n## 上下文包系统\n\n### 相关页面\n\n相关主题：[搜索系统](#page-3), [内存分类账](#page-5), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n</details>\n\n# 上下文包系统\n\n上下文包（Context Pack）是 Contextful 的核心功能模块，它将索引后的代码上下文、符号信息、图关系和记忆数据打包成紧凑的、带引用的、符合 token 预算的证据束，供 AI Agent 在执行任务时使用。\n\n## 系统概述\n\n### 设计目标\n\n上下文包系统旨在解决 AI Agent 在大型代码库中检索上下文时的核心痛点：\n\n| 问题 | 上下文包解决方案 |\n|------|-----------------|\n| 随机文件读取导致 token 浪费 | 基于查询意图的精确检索 |\n| 缺乏可信引用 | 每个证据块都附带文件路径和行号 |\n| 无法追踪代码关系 | 集成图路径遍历结果 |\n| 遗忘跨会话经验 | 整合证据-backed 记忆数据 |\n\n### 核心数据类型\n\n上下文包的数据结构定义在 `src/types.ts` 中，主要包含以下组件：\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符，格式: ctx_<hash>\n  query: string;                 // 原始查询文本\n  scope: string;                 // 作用域（如 \"repo\"）\n  intent: SearchIntent;           // 查询意图分类\n  summary: string;               // 包内容的自然语言摘要\n  citations: SearchHit[];        // 命中的证据列表\n  files: FileContext[];          // 按文件分组的引用\n  symbols: SymbolRecord[];       // 相关符号记录\n  graphPaths: GraphPath[];       // 图关系路径\n  memoryHits: SearchHit[];       // 记忆命中结果\n  confidence: number;            // 置信度（0.1-0.92）\n  tokenEstimate: number;         // 实际 token 估算值\n  budget: number;                // 分配的 token 预算\n  createdAt: string;             // 创建时间（ISO 格式）\n}\n```\n\n资料来源：[src/search.ts:180-195]()\n\n## 工作流程\n\n### 上下文包创建流程\n\n```mermaid\ngraph TD\n    A[接收查询请求] --> B[分类查询意图]\n    B --> C{意图类型}\n    C -->|code| D[执行代码搜索]\n    C -->|docs| E[执行文档搜索]\n    C -->|symbol| F[执行符号搜索]\n    C -->|memory| G[搜索记忆数据]\n    C -->|impact| H[执行影响分析]\n    D --> I[检索图路径]\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    I --> J[根据 token 预算排序选择证据]\n    J --> K[生成置信度评分]\n    K --> L[构建上下文包]\n    L --> M[保存到数据库]\n    M --> N[返回 EvidencePack]\n```\n\n### 证据选择与排序\n\n上下文包使用分层策略选择证据：\n\n1. **意图匹配**：根据查询意图优先返回相关类型的命中结果\n2. **相关性评分**：使用 BM25 算法结合自定义调整因子\n3. **Token 预算约束**：按优先级遍历，直到达到预算上限\n\n```typescript\n// token 预算选择逻辑\nlet tokenEstimate = 0;\nconst selected: SearchHit[] = [];\n\nfor (const hit of scored) {\n  if (selected.some(s => s.ref === hit.ref)) continue;\n  if (tokenEstimate + hit.tokenEstimate >= budget) break;\n  selected.push(hit);\n  tokenEstimate += hit.tokenEstimate;\n}\n```\n\n资料来源：[src/search.ts:160-175]()\n\n## 意图分类系统\n\n### 意图类型定义\n\n| 意图类型 | 触发关键词 | 说明 |\n|----------|-----------|------|\n| `symbol` | 函数名、类名、常量 | 符号定义和引用查找 |\n| `code` | 实现、逻辑、算法 | 代码片段搜索 |\n| `docs` | 文档、README、如何 | 文档内容检索 |\n| `memory` | 记忆、经验、教训 | 证据-backed 记忆查询 |\n| `impact` | 影响、依赖、影响范围 | 影响分析 |\n| `historical` | 为什么、变更、历史 | Git 历史追溯 |\n| `architectural` | 架构、流程、调用链 | 架构分析 |\n| `exact` | 文件路径、行号、符号 | 精确匹配 |\n| `vague` | 无明确意图 | 模糊查询 |\n\n### 意图分类实现\n\n```typescript\nfunction classifyQuery(q: string): SearchIntent {\n  if (/\\b(function|class|method|const|interface|type|struct)\\s+[A-Z]/.test(q)) return \"symbol\";\n  if (/\\b(where|find|search|locate|get|retrieve)\\b/.test(q)) return \"code\";\n  if (/\\b(memory|remember|learned|lessons?|sessions?)\\b/.test(q)) return \"memory\";\n  if (/\\b(impact|affected|depends on|dependents|blast radius|what uses|who calls)\\b/.test(q)) return \"impact\";\n  if (/\\b(why|changed|commit|history|regression|introduced)\\b/.test(q)) return \"historical\";\n  if (/\\b(architecture|flow|path|trace|connects|calls|imports|dependency)\\b/.test(q)) return \"architectural\";\n  if (/\\b(resource|docs|documentation|guide|readme|how to|setup)\\b/.test(q)) return \"docs\";\n  if (/[`\"'#.:/]/.test(q) || /\\b[A-Z][A-Za-z0-9_]{2,}\\b/.test(query)) return \"exact\";\n  return \"vague\";\n}\n```\n\n资料来源：[src/search.ts:1-14]()\n\n## 置信度评估\n\n### 置信度计算公式\n\n上下文包的置信度通过以下公式计算：\n\n```\nconfidence = clamp(0.25 + hits.length × 0.05 + graphPaths.length × 0.02 + memoryHits.length × 0.05, 0.1, 0.92)\n```\n\n| 组成部分 | 权重 | 说明 |\n|----------|------|------|\n| 基础分 | 0.25 | 最低置信度保证 |\n| 命中数 | +0.05/个 | 每个搜索命中增加置信度 |\n| 图路径数 | +0.02/个 | 每条图关系路径增加置信度 |\n| 记忆命中数 | +0.05/个 | 每个记忆命中增加置信度 |\n\n### 置信度边界\n\n置信度始终被限制在 `[0.1, 0.92]` 范围内，确保：\n\n- 最低 10% 置信度（无任何证据时）\n- 最高 92% 置信度（避免过度自信）\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n资料来源：[src/search.ts:89-91]()\n\n## 图关系集成\n\n### 图路径类型\n\n上下文包包含代码库中实体之间的图关系：\n\n```typescript\ninterface GraphPath {\n  from: string;        // 源实体名称\n  to: string;          // 目标实体名称\n  edgeType: string;    // 边类型（IMPORTS、DEFINES、CONFIGURES 等）\n  filePath: string;    // 关系所在文件\n  line: number;        // 关系所在行号\n}\n```\n\n### 边类型定义\n\n| 边类型 | 说明 | 提取来源 |\n|--------|------|----------|\n| `IMPORTS` | 模块导入关系 | TypeScript/Python/Go import 语句 |\n| `DEFINES` | 符号定义关系 | 函数、类、接口声明 |\n| `CONFIGURES` | 配置关系 | package.json 依赖、配置文件键 |\n| `TESTS` | 测试关系 | 测试文件与被测文件关联 |\n\n### 图路径加载\n\n```typescript\nfunction loadGraphPaths(db: Database, paths: string[], limit: number): GraphPath[] {\n  const rows = db.prepare(`\n    SELECT from_name, target_name, edge_type, file_path, line\n    FROM edges\n    WHERE file_path IN (${paths.map(() => \"?\").join(\",\")})\n    LIMIT ?\n  `).all(...paths, limit) as EdgeRow[];\n  \n  return rows.map(row => ({\n    from: row.from_name,\n    to: row.target_name,\n    edgeType: row.edge_type,\n    filePath: row.file_path,\n    line: row.line\n  }));\n}\n```\n\n资料来源：[src/search.ts:125-140]()\n\n## CLI 接口\n\n### 查询命令\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> --json\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `query` | 字符串 | 必需 | 要回答的查询文本 |\n| `--workspace` | 路径 | 当前目录 | 工作区路径 |\n| `--budget` | 整数 | 2000 | 近似的 token 预算 |\n| `--json` | 标志 | false | 输出 JSON 格式而非 Markdown |\n\n### 实现逻辑\n\n```typescript\nprogram\n  .command(\"query\")\n  .description(\"Create an evidence pack for a query.\")\n  .argument(\"<query>\", \"Query to answer from indexed context.\")\n  .option(\"--workspace <path>\", \"Workspace path.\", process.cwd())\n  .option(\"--budget <tokens>\", \"Approximate token budget.\", parseInteger, 2000)\n  .option(\"--json\", \"Print JSON instead of Markdown.\")\n  .action(async (query: string, options) => {\n    const pack = await createContextPack({ \n      workspace: options.workspace, \n      query, \n      budget: options.budget \n    });\n    process.stdout.write(\n      options.json \n        ? `${JSON.stringify(pack, null, 2)}\\n` \n        : renderEvidencePackMarkdown(pack)\n    );\n  });\n```\n\n资料来源：[src/cli.ts:20-36]()\n\n## Markdown 渲染\n\n### 渲染格式\n\nEvidence Pack 的 Markdown 渲染输出格式：\n\n```markdown\n# Context Pack ctx_xxx\n\nQuery: <原始查询>\nIntent: <意图类型>\nConfidence: <置信度百分比>\nToken estimate: <实际token数>/<预算token数>\n\n<摘要文本>\n\n## Citations\n- file:src/auth.ts:10-25 (User authentication handler)\n  <证据摘要>\n\n## Graph Paths\n- auth.ts --IMPORTS--> utils.ts (src/auth.ts:3)\n\n## Memory Hits\n- <记忆引用>: <记忆内容>\n```\n\n### 渲染实现\n\n```typescript\nexport function renderEvidencePackMarkdown(pack: EvidencePack): string {\n  const lines = [\n    `# Context Pack ${pack.id}`,\n    \"\",\n    `Query: ${pack.query}`,\n    `Intent: ${pack.intent}`,\n    `Confidence: ${Math.round(pack.confidence * 100)}%`,\n    `Token estimate: ${pack.tokenEstimate}/${pack.budget}`,\n    \"\",\n    pack.summary,\n    \"\",\n    \"## Citations\"\n  ];\n  \n  for (const hit of pack.citations) {\n    lines.push(`- ${hit.ref} (${hit.title})`);\n    lines.push(`  ${hit.excerpt}`);\n  }\n  // ... 图路径和记忆命中渲染\n  return lines.join(\"\\n\");\n}\n```\n\n资料来源：[src/report.ts:90-115]()\n\n## 数据持久化\n\n### 保存上下文包\n\n创建后的上下文包会被保存到内核数据库：\n\n```typescript\nfunction saveEvidencePack(\n  db: Database, \n  pack: { id: string; query: string; tokenEstimate: number; json: string }\n): void {\n  db.prepare(`\n    INSERT INTO evidence_packs (id, query, token_estimate, created_at, json)\n    VALUES (?, ?, ?, ?, ?)\n  `).run(pack.id, pack.query, pack.tokenEstimate, nowIso(), pack.json);\n}\n```\n\n### 数据库表结构\n\n| 表名 | 用途 |\n|------|------|\n| `chunks_fts` | 全文搜索索引 |\n| `symbols` | 符号索引 |\n| `edges` | 图关系边 |\n| `memory` | 证据-backed 记忆 |\n| `evidence_packs` | 已创建的上下文包历史 |\n\n## 与 MCP 工具集成\n\n### 核心 MCP 工具\n\n上下文包系统通过以下 MCP 工具暴露给 AI Agent：\n\n| 工具名称 | 功能 |\n|----------|------|\n| `context_pack` | 创建上下文包（核心功能） |\n| `search_code` | 代码、文档、符号、记忆搜索 |\n| `trace_path` | 图路径追踪 |\n| `impact_analysis` | 影响分析 |\n| `why_changed` | 变更历史追溯 |\n| `recall_memory` | 记忆召回 |\n\n资料来源：[README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n\n### 工具调用示例\n\n```json\n{\n  \"tool\": \"context_pack\",\n  \"arguments\": {\n    \"query\": \"用户认证逻辑在哪里\",\n    \"budget\": 2000,\n    \"scope\": \"repo\"\n  }\n}\n```\n\n## 扩展词项机制\n\n为提高搜索召回率，系统包含智能词项扩展：\n\n```typescript\nfunction expandedTerms(query: string): string[] {\n  const additions: string[] = [];\n  const lower = query.toLowerCase();\n  \n  if (/\\b(tool|tools|registered|register)\\b/.test(lower)) \n    additions.push(\"server\", \"tool\", \"tools\", \"callTool\");\n  \n  if (/\\bmcp\\b/.test(lower)) \n    additions.push(\"mcp\", \"server\", \"stdio\");\n  \n  if (/\\bmemory|memories|remember|remembers|lesson|lessons|learned\\b/.test(lower)) \n    additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n  \n  if (/\\bimpact|depends|dependents|uses\\b/.test(lower)) \n    additions.push(\"imports\", \"tests\", \"edges\");\n  \n  return [...terms, ...additions];\n}\n```\n\n资料来源：[src/search.ts:50-68]()\n\n## 总结\n\n上下文包系统是 Contextful 的核心模块，它通过以下机制为 AI Agent 提供精准、可信的代码上下文：\n\n1. **智能意图分类** — 自动识别查询类型并选择最佳搜索策略\n2. **Token 预算管理** — 确保返回内容在预算范围内\n3. **多源证据整合** — 合并代码片段、符号信息、图关系和记忆数据\n4. **置信度评估** — 提供可量化的结果可信度指标\n5. **持久化存储** — 记录查询历史以供分析和回溯\n\n通过 MCP 工具接口，AI Agent 可以方便地调用 `context_pack` 获取高质量的代码上下文，显著提升代码理解和任务完成效率。\n\n---\n\n<a id='page-5'></a>\n\n## 内存分类账\n\n### 相关页面\n\n相关主题：[搜索系统](#page-3), [上下文包系统](#page-4), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/memory.ts](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [src/db.ts](https://github.com/Inferensys/contextful/blob/main/src/db.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n</details>\n\n# 内存分类账\n\n内存分类账（Memory Ledger）是 Contextful 项目中的核心模块，用于存储和管理基于证据的经验教训。它允许 AI 代理在执行任务过程中积累可复用的知识，并通过引用具体的代码片段作为证据，确保记忆的可靠性和可追溯性。\n\n## 设计目标\n\n内存分类账解决了 AI 代码代理在长时间任务执行中面临的两个核心问题：\n\n1. **知识遗忘** - 代理无法记住跨会话的重要决策和经验\n2. **无据可查** - 记忆缺乏具体的代码引用，导致引用不准确\n\n通过建立证据分类账，代理能够：\n\n- 持久化存储项目特定的学习成果\n- 通过引用索引快速检索相关记忆\n- 在执行任务前调用已有记忆，避免重复踩坑\n- 为每条记忆维护置信度，支持动态更新\n\n资料来源：[src/memory.ts:1-30](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n\n## 核心数据模型\n\n### Lesson（经验教训）\n\n内存分类账中的基本存储单元是 Lesson 对象，其结构如下：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | string | 唯一标识符，格式为 `les_{shortHash}` |\n| `claim` | string | 核心主张/结论，描述学到的经验 |\n| `evidence_refs` | string[] | 证据引用数组，每项格式为 `file:{path}:{startLine}-{endLine}` |\n| `scope` | string | 作用范围，如 \"repo\" |\n| `confidence` | number | 置信度，范围 0.0-1.0 |\n| `created_at` | string | ISO 时间戳 |\n| `supersedes` | string[] | 被替代的记忆 ID 列表 |\n\n资料来源：[src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n\n### 证据引用格式\n\n证据引用采用标准化格式，确保与代码索引系统无缝集成：\n\n```\nfile:src/auth.ts:1-20\n```\n\n| 组成部分 | 说明 |\n|----------|------|\n| `file` | 固定前缀，表示文件引用 |\n| `src/auth.ts` | 相对于工作区的文件路径 |\n| `1-20` | 代码行号范围 |\n\n资料来源：[src/memory.ts](https://github.com/Inferensys/contextful/blob/main/src/memory.ts)\n\n## 架构设计\n\n### 系统组件\n\n```mermaid\ngraph TD\n    subgraph \"内存分类账核心\"\n        A[writeLesson] --> B[Lesson Store]\n        C[recallMemory] --> B\n        D[readEvidenceRefs] --> E[Chunk Loader]\n        E --> F[代码片段内容]\n    end\n    \n    subgraph \"持久化层\"\n        B --> G[SQLite Database]\n    end\n    \n    subgraph \"接入层\"\n        H[CLI memory 命令]\n        I[MCP Server Tools]\n        J[Query Search]\n    end\n    \n    H --> A\n    I --> A\n    I --> C\n    J -.-> C\n```\n\n### 工作流程\n\n```mermaid\nsequenceDiagram\n    participant Agent as AI 代理\n    participant MCP as MCP Server\n    participant Memory as 内存分类账\n    participant DB as SQLite\n    \n    Agent->>MCP: write_lesson(claim, evidence_refs)\n    MCP->>Memory: writeLesson(claim, evidenceRefs)\n    Memory->>DB: 存储 Lesson 记录\n    Memory-->>Agent: 返回 Lesson ID\n    \n    Agent->>MCP: recall_memory(query, scope)\n    MCP->>Memory: recallMemory(query, scope)\n    Memory->>DB: 全文检索匹配\n    Memory->>DB: 加载证据引用\n    Memory-->>Agent: 返回匹配的 Lesson 列表\n```\n\n## MCP 工具接口\n\n内存分类账通过 MCP（Model Context Protocol）提供服务端工具：\n\n### write_lesson\n\n写入一条基于证据的经验教训。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `claim` | string | 是 | 经验主张文本 |\n| `evidence_refs` | string[] | 是 | 证据引用数组 |\n| `scope` | string | 否 | 作用域，默认 \"repo\" |\n| `confidence` | number | 否 | 置信度，默认 0.7 |\n| `supersedes` | string | 否 | 被替代的记忆 ID |\n\n资料来源：[src/mcp-server.ts:60-78](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n\n```typescript\nserver.tool(\n  \"write_lesson\",\n  \"Write an evidence-backed lesson to the memory ledger. Loose remember-this notes are rejected.\",\n  {\n    claim: z.string(),\n    evidence_refs: z.array(z.string()),\n    scope: z.string().optional(),\n    confidence: z.number().optional(),\n    supersedes: z.string().optional()\n  },\n  async (params) =>\n    jsonContent(\n      await writeLesson({\n        workspace: params.workspace,\n        claim: params.claim,\n        evidenceRefs: params.evidence_refs,\n        scope: params.scope,\n        confidence: params.confidence,\n        supersedes: params.supersedes\n      })\n    )\n);\n```\n\n### recall_memory\n\n检索匹配的经验教训。\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `query` | string | 是 | 检索查询字符串 |\n| `scope` | string | 否 | 作用域过滤 |\n| `limit` | number | 否 | 返回结果上限 |\n\n资料来源：[src/mcp-server.ts:50-59](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n\n```typescript\nserver.tool(\n  \"recall_memory\",\n  \"Search the evidence-backed memory ledger for lessons that survived previous agent sessions.\",\n  {\n    query: z.string(),\n    scope: z.string().optional(),\n    limit: z.number().optional()\n  },\n  async (params) => jsonContent(await recallMemory(params))\n);\n```\n\n## CLI 命令\n\n通过命令行界面管理内存分类账：\n\n```bash\ncxf memory add --claim <text> --evidence <ref...> [--workspace <path>] [--scope <scope>] [--confidence <number>]\n```\n\n### 命令参数\n\n| 参数 | 说明 |\n|------|------|\n| `--claim <text>` | **必填** 经验主张内容 |\n| `--evidence <ref...>` | **必填** 证据引用，至少一个 |\n| `--workspace <path>` | 工作区路径，默认为当前目录 |\n| `--scope <scope>` | 作用域，默认 \"repo\" |\n| `--confidence <number>` | 置信度 0-1，默认 0.7 |\n\n资料来源：[src/cli.ts:70-90](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n\n### 使用示例\n\n```bash\n# 基础用法\ncxf memory add --claim \"用户认证在 src/auth.ts 中处理\" --evidence \"file:src/auth.ts:1-50\"\n\n# 指定作用域和置信度\ncxf memory add \\\n  --claim \"数据库连接池大小应设为 CPU 核心数的 2 倍\" \\\n  --evidence \"file:src/db.ts:10-30\" \\\n  --evidence \"file:config/default.json:5-10\" \\\n  --scope \"repo\" \\\n  --confidence 0.85\n\n# 替代旧记忆\ncxf memory add \\\n  --claim \"新的配置管理方式已迁移到 config/v2\" \\\n  --evidence \"file:config/v2/index.ts:1-100\" \\\n  --supersedes \"les_abc123\"\n```\n\n## 存储实现\n\n### 数据库架构\n\n内存分类账使用 SQLite 存储，通过 `better-sqlite3` 实现同步操作：\n\n```mermaid\nerDiagram\n    LESSONS {\n        string id PK\n        string claim\n        string evidence_refs\n        string scope\n        float confidence\n        string created_at\n        string supersedes\n    }\n    \n    LESSONS_FTS {\n        string id PK\n        string claim\n    }\n```\n\n### 证据引用处理\n\n证据引用通过专门的解析器处理，将字符串引用转换为具体的代码内容：\n\n```typescript\n// 引用格式解析\nconst ref = \"file:src/auth.ts:1-20\";\nconst parsed = parseFileRef(ref);\n// 返回 { path: \"src/auth.ts\", startLine: 1, endLine: 20 }\n```\n\n资料来源：[src/search.ts:80-85](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n## 与搜索系统的集成\n\n### 查询分类增强\n\n内存分类账与搜索系统深度集成，当用户查询命中内存相关关键词时，系统会给予搜索加权：\n\n```typescript\nif (/\\bmemory|memories|remember|remembers|lesson|lessons|learned|session|sessions\\b/.test(lower)) {\n  additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n}\n```\n\n资料来源：[src/search.ts:45-50](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n\n### 记忆匹配优先级\n\n| 匹配条件 | 优先级调整 |\n|----------|------------|\n| 命中 \"memory ledger\" 或 \"evidence-backed memory\" | +7 |\n| 包含 `src/memory.ts` 引用 | +5 |\n| 包含 `readme.md` 引用 | +4 |\n| 包含搜索模块内部函数 | -8 至 -16 |\n\n## 置信度机制\n\n### 置信度计算\n\n每条记忆关联一个置信度分数，影响其在搜索结果中的排名：\n\n| 置信度范围 | 语义含义 |\n|------------|----------|\n| 0.8 - 1.0 | 高可信，经过充分验证 |\n| 0.5 - 0.8 | 中可信，基于合理推断 |\n| 0.2 - 0.5 | 低可信，需要进一步验证 |\n| 0.0 - 0.2 | 实验性，仅供参考 |\n\n### 置信度衰减\n\n长时间未使用的记忆会逐渐降低置信度，系统通过 `staleMemories` 机制跟踪这类记忆：\n\n```typescript\n// 在报告生成中检测陈旧记忆\nlines.push(\"\", \"## Stale Memories\");\nif (report.staleMemories.length === 0) lines.push(\"- No stale memories.\");\nfor (const memory of report.staleMemories) {\n  lines.push(`- ${memory.id}: ${memory.claim}`);\n}\n```\n\n资料来源：[src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n\n## 使用场景\n\n### 场景一：跨会话知识传递\n\n```mermaid\ngraph LR\n    A[Session 1: 发现问题] --> B[write_lesson]\n    B --> C[存储到 Ledger]\n    C --> D[Session 2: 遇到类似问题]\n    D --> E[recall_memory]\n    E --> F[获取历史经验]\n```\n\n### 场景二：代码变更影响评估\n\n代理在修改共享模块前，通过内存分类账查找相关历史决策：\n\n```bash\n# 查询某模块的历史记忆\ncxf query \"为什么这里使用缓存\" --workspace .\n# 或通过 MCP\nrecall_memory(query=\"缓存策略决策\", scope=\"repo\")\n```\n\n### 场景三：证据驱动的决策\n\n每条记忆必须包含证据引用，避免无依据的主观判断：\n\n| 有效记忆 | 无效记忆 |\n|----------|----------|\n| \"配置迁移到 config/v2，因为原有配置结构存在循环依赖问题\" | \"配置管理很重要\" |\n| 证据：`file:config/v1/base.ts:20-30` | 无证据引用 |\n\n## 最佳实践\n\n### 撰写有效的经验主张\n\n1. **明确具体** - 包含具体的文件路径、函数名或配置项\n2. **包含证据** - 每条主张至少引用一个代码片段\n3. **合理置信度** - 根据验证程度设置合适的置信度\n4. **及时更新** - 发现新信息时替代旧记忆\n\n### 证据引用规范\n\n- 使用精确的行号范围，避免整文件引用\n- 优先引用关键决策点而非辅助代码\n- 定期验证证据引用仍然有效\n\n### 作用域策略\n\n| 作用域 | 适用场景 |\n|--------|----------|\n| `repo` | 项目级通用经验 |\n| `module:auth` | 模块特定知识 |\n| `feature:checkout` | 功能特定决策 |\n\n## 相关文档\n\n- [CLI 使用指南](../cli.md)\n- [MCP 服务器配置](../mcp-server.md)\n- [搜索与检索系统](./搜索系统.md)\n- [索引系统](./索引系统.md)\n\n---\n\n<a id='page-6'></a>\n\n## 数据存储与索引\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [搜索系统](#page-3), [MCP 服务器集成](#page-7)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n</details>\n\n# 数据存储与索引\n\n## 概述\n\nContextful 的数据存储与索引系统是整个工具的核心基础设施，负责将代码仓库转换为可高效查询的索引数据库。该系统基于 SQLite 构建，使用全文搜索（FTS）技术实现快速准确的语义检索，并为代码图谱、符号索引和证据包提供持久化存储。\n\n索引系统的主要职责包括：\n\n- 解析多种编程语言的代码结构，提取符号（函数、类、接口等）\n- 分析代码依赖关系，构建模块间的导入/导出图谱\n- 将文件内容分块并建立全文索引\n- 管理证据包（Evidence Pack）和记忆（Memory）数据\n- 提供 CLI 命令和 MCP 接口供外部调用\n\n资料来源：[README.md:1-10]()\n\n## 核心架构\n\n### 技术选型\n\n| 技术组件 | 用途 | 资料来源 |\n|---------|------|---------|\n| SQLite + better-sqlite3 | 关系型数据存储 | package.json |\n| FTS5 全文索引 | 文本搜索 | src/search.ts |\n| Tree-sitter | 代码解析与 AST 提取 | package.json |\n| Fast-glob | 文件模式匹配 | package.json |\n\nContextful 选择 SQLite 作为存储引擎，主要考虑其轻量级、无需独立服务器进程的特性，非常适合本地开发环境和 CLI 工具场景。全文章索引使用 SQLite 的 FTS5 扩展实现，支持 BM25 排序算法和复杂的 MATCH 查询语法。\n\n资料来源：[package.json:20-35]()\n\n### 数据库结构概览\n\n```mermaid\ngraph TD\n    A[文件系统] --> B[文件解析]\n    B --> C[符号提取 extractSymbols]\n    B --> D[边提取 extractEdges]\n    B --> E[内容分块]\n    C --> F[symbols 表]\n    D --> G[edges 表]\n    E --> H[chunks 表]\n    H --> I[chunks_fts 全文索引]\n    F --> J[MCP 查询接口]\n    G --> J\n    H --> J\n```\n\n## 数据提取模块\n\n### 符号提取（extractSymbols）\n\n`extractSymbols` 函数负责从源代码中提取各种编程结构，返回包含名称、种类、所在行号和签名的符号记录数组。该函数支持的语言及对应的提取模式如下：\n\n资料来源：[src/extract.ts:1-50]()\n\n#### TypeScript / JavaScript 提取规则\n\n| 语言元素 | 正则模式 | 符号种类 |\n|---------|---------|---------|\n| 函数 | `export async function` 或 `function` | function |\n| 类 | `export class` | class |\n| 接口 | `export interface` | interface |\n| 类型别名 | `export type` | type |\n| 常量箭头函数 | `export const ... =>` | function |\n\n```typescript\n// 提取逻辑示例\nmatchPush(line, /^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/, push, \"function\");\nmatchPush(line, /^\\s*(export\\s+)?class\\s+([A-Za-z_$][\\w$]*)/, push, \"class\");\n```\n\n资料来源：[src/extract.ts:10-18]()\n\n#### Python 提取规则\n\nPython 支持函数和类的提取，使用缩进敏感的解析方式：\n\n```python\nconst def = line.match(/^\\s*(?:async\\s+)?def\\s+([A-Za-z_][\\w]*)/);\nif (def) push(def[1], \"function\");\nconst cls = line.match(/^\\s*class\\s+([A-Za-z_][\\w]*)/);\nif (cls) push(cls[1], \"class\");\n```\n\n#### Rust 提取规则\n\nRust 支持函数、结构体、枚举、Trait 和 impl 块的提取：\n\n```typescript\nmatchPush(line, /^\\s*(pub\\s+)?fn\\s+([A-Za-z_][\\w]*)/, push, \"function\");\nmatchPush(line, /^\\s*(pub\\s+)?struct\\s+([A-Za-z_][\\w]*)/, push, \"struct\");\nmatchPush(line, /^\\s*(pub\\s+)?enum\\s+([A-Za-z_][\\w]*)/, push, \"enum\");\n```\n\n资料来源：[src/extract.ts:45-55]()\n\n#### Markdown 标题提取\n\nMarkdown 文件会被提取为标题层级结构：\n\n```typescript\nconst heading = line.match(/^(#{1,6})\\s+(.+)$/);\nif (heading) push(heading[2].trim(), \"heading\");\n```\n\n### 边提取（extractEdges）\n\n`extractEdges` 函数分析代码中的导入语句，构建模块间的依赖图谱。返回的边记录包含源文件名、行号和目标模块信息。\n\n资料来源：[src/extract.ts:60-90]()\n\n#### 各语言导入解析规则\n\n| 语言 | 导入语法 | 正则匹配 |\n|-----|---------|---------|\n| TypeScript/JS (ES Module) | `import ... from \"...\"` | `from\\s+[\"']([^\"']+)[\"']` |\n| TypeScript/JS (CommonJS) | `require(\"...\")` | `require\\([\"']([^\"']+)[\"']` |\n| Python | `from ... import` 或 `import ...` | `^\\s*from\\s+([\\w.]+)\\s+import` |\n| Go | `import \"...\"` | `\"([^\"]+)\"` |\n| Rust | `use ...;` 或 `mod ...;` | `^\\s*use\\s+([^;]+);` |\n\n#### package.json 依赖提取\n\n当处理 `package.json` 文件时，系统会额外解析依赖配置：\n\n```typescript\nfor (const section of [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"scripts\"]) {\n  const values = parsed[section];\n  if (!values || typeof values !== \"object\") continue;\n  for (const key of Object.keys(values)) {\n    edges.push({ targetName: `${section}:${key}`, targetType: \"config\", edgeType: \"CONFIGURES\", line: 1 });\n  }\n}\n```\n\n资料来源：[src/extract.ts:100-115]()\n\n## 内容分块策略\n\n### 分块模式\n\nContextful 使用多层次的分块策略将文件内容转换为可管理的检索单元：\n\n资料来源：[src/extract.ts:140-180]()\n\n| 分块类型 | 生成方式 | 适用场景 |\n|---------|---------|---------|\n| 符号块 (symbol) | 以符号定义为边界，最多延伸60行 | 精确查找函数/类定义 |\n| 文件块 (file) | 80行窗口滑动分块 | 文档和较大代码段 |\n| 文档块 (doc) | 以 Markdown 标题分割 | 文档检索 |\n\n### 分块记录结构\n\n```typescript\ninterface ChunkRecord {\n  ref: string;           // 引用标识符，格式: file:path:start-end\n  filePath: string;      // 文件路径\n  startLine: number;     // 起始行号\n  endLine: number;       // 结束行号\n  kind: \"symbol\" | \"file\" | \"doc\";  // 分块类型\n  title: string;         // 显示标题\n  text: string;          // 原始文本内容\n  tokenEstimate: number; // token 数量估算\n}\n```\n\n### Markdown 特殊处理\n\nMarkdown 文件的分块逻辑与代码文件不同，会首先提取所有标题层级：\n\n```typescript\nconst headings: Array<{ title: string; line: number }> = [];\nlines.forEach((line, index) => {\n  const match = line.match(/^(#{1,6})\\s+(.+)$/);\n  if (match) headings.push({ title: match[2].trim(), line: index + 1 });\n});\n```\n\n每个标题到下一个标题之间的内容构成一个独立的文档块，便于精确定位文档内容。\n\n## 全文搜索实现\n\n### FTS 查询构建\n\nContextful 使用增强的 FTS 查询语法提升搜索效果：\n\n资料来源：[src/search.ts:20-60]()\n\n```typescript\nfunction ftsQuery(query: string): string {\n  // 1. 展开查询术语，添加同义词和关联词\n  const expanded = expandedTerms(query);\n  // 2. 组合为 FTS5 MATCH 表达式\n  return expanded.map(t => `\"${t}\"*`).join(\" OR \");\n}\n```\n\n### 搜索意图分类\n\n系统通过正则表达式匹配查询特征，自动识别用户意图：\n\n| 意图类型 | 检测关键词 | 搜索策略 |\n|---------|-----------|---------|\n| memory | memory, remember, lesson | 记忆库检索 |\n| impact | impact, affected, depends | 影响分析 |\n| historical | why, changed, commit | 历史追溯 |\n| architectural | architecture, flow, trace | 架构追踪 |\n| docs | docs, documentation, how to | 文档检索 |\n| exact | 代码符号、路径引用 | 精确匹配 |\n| vague | 其他模糊查询 | 宽松匹配 |\n\n资料来源：[src/search.ts:1-20]()\n\n### 搜索结果排序\n\n搜索结果使用 BM25 算法结合自定义权重进行排序：\n\n```typescript\nfunction scoreFromRank(rank: number, query: string, path?: string): number {\n  const lower = query.toLowerCase();\n  const pathLower = path?.toLowerCase() || \"\";\n  let bonus = 0;\n  \n  // 路径匹配奖励\n  if (terms.some(t => pathLower.includes(t))) bonus += 5;\n  \n  // 特定文件奖励/惩罚\n  if (pathLower.includes(\"memory\")) bonus += 5;\n  if (pathLower.includes(\"readme\")) bonus += 4;\n  \n  return 10 / (1 + Math.abs(rank)) + bonus;\n}\n```\n\n## 证据包（Evidence Pack）\n\n### 创建流程\n\n证据包是 Contextful 查询的最终输出，聚合了搜索结果、图谱路径和记忆数据：\n\n```mermaid\ngraph TD\n    A[用户查询] --> B[searchContext]\n    B --> C{意图分类}\n    C --> D[FTS 搜索]\n    C --> E[记忆检索]\n    D --> F[结果去重]\n    E --> F\n    F --> G[Token 预算分配]\n    G --> H[图谱路径扩展]\n    H --> I[生成 Evidence Pack]\n```\n\n### 证据包数据结构\n\n```typescript\ninterface EvidencePack {\n  id: string;                    // 唯一标识符\n  query: string;                 // 原始查询\n  scope: string;                // 查询范围\n  intent: SearchIntent;         // 识别的意图类型\n  summary: string;              // 结果摘要\n  citations: SearchHit[];       // 搜索命中结果\n  files: Array<{                // 相关文件\n    path: string;\n    reason: string;\n    refs: string[];\n  }>;\n  symbols: SymbolRecord[];       // 符号信息\n  graphPaths: GraphPath[];      // 图谱路径\n  memoryHits: SearchHit[];       // 记忆命中\n  confidence: number;           // 置信度 (0.1-0.92)\n  tokenEstimate: number;        // Token 估算\n  budget: number;               // 预算上限\n  createdAt: string;            // 创建时间\n}\n```\n\n### 置信度计算\n\n```typescript\nfunction confidenceFor(hits: SearchHit[], graphPaths: GraphPath[], memoryHits: SearchHit[]): number {\n  return clamp(0.25 + hits.length * 0.05 + graphPaths.length * 0.02 + memoryHits.length * 0.05, 0.1, 0.92);\n}\n```\n\n置信度基于命中数量、图谱连接数和记忆命中数计算，最低 0.1，最高 0.92。\n\n## CLI 命令接口\n\n### 索引命令\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n索引命令扫描工作区文件，调用符号提取和边提取模块，将结果存储到 SQLite 数据库。\n\n### 查询命令\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget 2000 --json\n```\n\n执行查询并返回格式化的证据包，支持 JSON 输出模式。\n\n### 搜索命令\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit 10 --kind all\n```\n\n支持按类型过滤：`all|code|docs|symbols|memory`。\n\n### 报告命令\n\n```bash\ncxf report --workspace <path> --format markdown|json|html\n```\n\n生成工作区的上下文报告，包含文件统计、符号分布和警告信息。\n\n资料来源：[src/cli.ts:1-50]()\n\n## 工具函数库\n\n### 文本处理\n\n`src/util.ts` 提供了索引过程中常用的文本处理函数：\n\n```typescript\nexport function lineRange(text: string, startLine: number, endLine: number): string {\n  const lines = text.split(/\\r?\\n/);\n  return lines.slice(Math.max(0, startLine - 1), Math.min(lines.length, endLine)).join(\"\\n\");\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.max(min, Math.min(max, value));\n}\n```\n\n`lineRange` 函数用于按行号范围提取文本片段，是分块策略的基础工具。`clamp` 函数确保数值在指定范围内，用于置信度计算。\n\n### 二进制文件检测\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n索引过程会跳过二进制文件以节省存储空间和提升检索效率。\n\n资料来源：[src/util.ts:1-30]()\n\n## MCP 服务器集成\n\nContextful 支持以 MCP（Model Context Protocol）服务器模式运行，提供标准化工具接口：\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### 核心工具列表\n\n| 工具名称 | 功能描述 |\n|---------|---------|\n| context_pack | 生成带证据包的上下文响应 |\n| search_code | 代码、文档、符号和记忆搜索 |\n| trace_path | 图谱遍历追踪依赖路径 |\n| impact_analysis | 影响分析和反向依赖查找 |\n| why_changed | 变更历史追溯 |\n| recall_memory | 检索持久化的项目记忆 |\n\n资料来源：[README.md:25-40]()\n\n## 性能优化策略\n\n### Token 估算与预算控制\n\n系统使用简单的 token 估算方法控制输出大小：\n\n```typescript\nfunction estimateTokens(text: string): number {\n  return Math.ceil(text.length / 4);  // 粗略估算：每4字符约1个token\n}\n```\n\n证据包生成时会根据用户指定的 `budget` 参数筛选内容，确保返回的上下文在 token 预算范围内。\n\n### 结果去重\n\n搜索结果通过引用标识符进行去重：\n\n```typescript\nfunction dedupeHits(hits: SearchHit[]): SearchHit[] {\n  const seen = new Set<string>();\n  return hits.filter((hit) => {\n    if (seen.has(hit.ref)) return false;\n    seen.add(hit.ref);\n    return true;\n  });\n}\n```\n\n### 图谱剪枝\n\n图谱查询支持深度限制，防止返回过大的依赖路径：\n\n```typescript\nconst graphPaths = loadGraphPaths(kernel.db, paths, 20);  // 限制最多20条路径\n```\n\n## 总结\n\nContextful 的数据存储与索引系统通过模块化的设计实现了高效的代码检索能力。符号提取与边分析模块支持多种主流编程语言，SQLite+FTS5 的组合提供了可靠且快速的全文搜索能力。证据包机制将搜索结果包装为结构化的上下文响应，便于 AI 代理直接使用。整个系统的设计强调实用性和可扩展性，是构建代码智能助手的重要基础设施。\n\n---\n\n<a id='page-7'></a>\n\n## MCP 服务器集成\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [CLI 命令行工具](#page-9), [部署与配置](#page-10)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/types.ts](https://github.com/Inferensys/contextful/blob/main/src/types.ts)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n</details>\n\n# MCP 服务器集成\n\n## 概述\n\nContextful 项目通过 MCP（Model Context Protocol）协议提供服务器集成能力，使其能够作为标准的 MCP 服务器运行，为 AI 代理提供代码上下文理解服务。\n\nMCP 服务器集成的核心设计理念是：**代理请求上下文，Contextful 返回紧凑的证据包**。这种设计避免了强制 AI 代理读取大量随机文件，通过结构化的证据打包机制提供精准、相关的上下文信息。\n\n## 核心功能\n\nContextful MCP 服务器暴露以下核心工具：\n\n| 工具名称 | 功能描述 |\n|---------|---------|\n| `context_pack` | 返回排名、引用、令牌预算内的证据包 |\n| `search_code` | 强大的代码、文档、符号和内存搜索 |\n| `trace_path` | 在文件、符号、模块和配置之间进行图遍历 |\n| `impact_analysis` | 逆向依赖和可能的测试 |\n| `why_changed` | 当前证据加 Git 历史 |\n| `recall_memory` | 搜索会话学习记录和持久化的项目经验 |\n| `write_lesson` | 写入带证据支撑的经验教训 |\n\n## 架构设计\n\n```mermaid\ngraph TD\n    A[AI 代理] -->|MCP 协议| B[Contextful MCP 服务器]\n    B --> C{功能路由}\n    C -->|上下文打包| D[createContextPack]\n    C -->|代码搜索| E[searchContext]\n    C -->|图路径追踪| F[traceGraph]\n    C -->|影响分析| G[impactAnalysis]\n    C -->|历史分析| H[whyChanged]\n    C -->|记忆检索| I[recallMemory]\n    D --> J[SQLite Kernel DB]\n    E --> J\n    F --> J\n    G --> J\n    H --> J\n    I --> J\n```\n\n## 工具参数规范\n\n### context_pack\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| query | string | 是 | 要回答的查询 |\n| budget | number | 否 | 令牌预算，默认 2000 |\n| scope | string | 否 | 搜索范围，默认 \"repo\" |\n\n### search_code\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| query | string | 是 | 搜索查询 |\n| mode | string | 否 | 搜索模式 |\n| filters | object | 否 | 过滤条件 |\n\n### trace_path\n\n| 参数 | 类型 | 必填 | 说明 |\n|-----|------|-----|------|\n| from | string | 是 | 起始节点 |\n| to | string | 否 | 目标节点 |\n| edge_types | string[] | 否 | 边类型过滤 |\n\n## 搜索意图分类\n\n系统会根据查询内容自动分类搜索意图：\n\n| 意图类型 | 触发关键词 | 说明 |\n|---------|-----------|------|\n| code | function, class, variable | 代码实体搜索 |\n| memory | memory, lesson, learned | 记忆和经验检索 |\n| impact | impact, depends, affected | 影响范围分析 |\n| historical | why, history, commit | 历史变更追溯 |\n| architectural | architecture, flow, dependency | 架构依赖分析 |\n| docs | documentation, readme, how to | 文档搜索 |\n\n资料来源：[src/search.ts:1-15]()\n\n## 查询扩展机制\n\n系统包含智能查询扩展功能，根据用户查询自动添加相关术语：\n\n```typescript\n// 相关术语扩展示例\nif (/\\b(tool|tools|registered|register)\\b/.test(lower)) {\n  additions.push(\"server\", \"tool\", \"tools\", \"callTool\");\n}\nif (/\\bmcp\\b/.test(lower)) {\n  additions.push(\"mcp\", \"server\", \"stdio\");\n}\nif (/\\bmemory|memories|remember\\b/.test(lower)) {\n  additions.push(\"memory\", \"memories\", \"lesson\", \"lessons\", \"claim\", \"ledger\", \"evidence\");\n}\n```\n\n资料来源：[src/search.ts:45-60]()\n\n## 证据包结构\n\n`context_pack` 返回的结构化证据包包含以下字段：\n\n| 字段 | 类型 | 说明 |\n|-----|------|------|\n| id | string | 唯一标识符 |\n| query | string | 原始查询 |\n| intent | SearchIntent | 检测到的搜索意图 |\n| summary | string | 证据摘要 |\n| citations | SearchHit[] | 引用列表 |\n| files | FileInfo[] | 相关文件信息 |\n| symbols | SymbolRecord[] | 相关符号 |\n| graphPaths | GraphPath[] | 图路径连接 |\n| memoryHits | SearchHit[] | 记忆命中 |\n| confidence | number | 置信度 0-1 |\n| tokenEstimate | number | 令牌估算 |\n| budget | number | 令牌预算 |\n| createdAt | string | 创建时间 |\n\n## 启动方式\n\n### CLI 命令行启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### MCP 服务器配置\n\n服务器注册名称为 `io.github.Inferensys/contextful`，可通过 `server.json` 进行配置：\n\n```json\n{\n  \"mcpServers\": {\n    \"contextful\": {\n      \"command\": \"npx\",\n      \"args\": [\"@inferensys/contextful\", \"server\"]\n    }\n  }\n}\n```\n\n资料来源：[package.json:40]()\n\n## 依赖关系\n\nMCP 服务器集成依赖以下核心包：\n\n| 依赖包 | 版本 | 用途 |\n|-------|------|------|\n| @modelcontextprotocol/sdk | ^1.29.0 | MCP 协议实现 |\n| better-sqlite3 | ^12.10.0 | 本地索引数据库 |\n| zod | ^4.4.3 | 类型验证 |\n\n资料来源：[package.json:19-32]()\n\n## 内存管理功能\n\nMCP 服务器提供持久化的记忆功能，支持通过 CLI 添加经验教训：\n\n```bash\ncxf memory add \\\n  --claim \"使用 JWT 时必须验证签名\" \\\n  --evidence \"file:src/auth.ts:1-50\" \\\n  --scope \"repo\" \\\n  --confidence 0.9\n```\n\n记忆数据与搜索系统集成，在相关查询时可以自动召回。\n\n## 与 AI IDE 的集成\n\nContextful 支持多种 AI 编程辅助工具的 MCP 集成：\n\n- Windsurf\n- GitHub Copilot\n- VS Code\n- Cline\n- Roo Code\n- Continue\n- Zed\n\n资料来源：[package.json:8-15]()\n\n## 工作流程示例\n\n```mermaid\nsequenceDiagram\n    participant Agent as AI 代理\n    participant MCP as Contextful MCP\n    participant Kernel as Kernel DB\n    participant FS as 文件系统\n\n    Agent->>MCP: context_pack(\"用户认证逻辑在哪\")\n    MCP->>Kernel: 搜索相关索引\n    Kernel-->>MCP: 命中结果 + 图路径\n    MCP->>MCP: 构建证据包\n    MCP->>Agent: 返回紧凑证据包\n    Agent->>Agent: 基于证据回答\n```\n\n## 总结\n\nMCP 服务器集成是 Contextful 的核心交互接口，它将复杂的代码索引和搜索能力通过标准化的 MCP 协议暴露给 AI 代理。通过结构化的证据包、图路径追踪和记忆系统，代理能够获得精准、可靠且可追溯的代码上下文，显著提升代码理解任务的准确性。\n\n---\n\n<a id='page-8'></a>\n\n## 解析与代码提取\n\n### 相关页面\n\n相关主题：[数据存储与索引](#page-6), [搜索系统](#page-3)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/extract.ts](https://github.com/Inferensys/contextful/blob/main/src/extract.ts)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 解析与代码提取\n\n## 概述\n\n解析与代码提取是 Contextful 项目中负责将源代码文件转换为可索引、可搜索的结构化数据的关键模块。该模块位于 `src/extract.ts`，是整个上下文检索系统的核心基础设施。其主要职责包括：\n\n- **符号提取**：从源代码中识别函数、类、接口、类型等定义\n- **边关系提取**：解析文件间的导入依赖关系\n- **代码分块**：将大型文件语义化拆分为可管理的片段\n- **Markdown 处理**：提取标题结构并按章节分块\n\n资料来源：[src/extract.ts:1-50]()\n\n## 核心功能架构\n\n```graph TD\n    A[源代码文件] --> B{文件类型判断}\n    B -->|TypeScript/JavaScript| C[TypeScript/JS 解析器]\n    B -->|Python| D[Python 解析器]\n    B -->|Go| E[Go 解析器]\n    B -->|Rust| F[Rust 解析器]\n    B -->|Markdown| G[Markdown 处理器]\n    B -->|JSON| H[JSON 处理器]\n    \n    C --> I[extractSymbols]\n    D --> I\n    E --> I\n    F --> I\n    \n    I --> J[符号列表]\n    C --> K[extractEdges]\n    D --> K\n    E --> K\n    F --> K\n    H --> K\n    \n    K --> L[边关系列表]\n    J --> M[codeChunks]\n    L --> M\n    \n    G --> N[markdownChunks]\n    N --> O[文档分块]\n    M --> P[索引数据库]\n    O --> P\n```\n\n## 符号提取详解\n\n### extractSymbols 函数\n\n`extractSymbols` 是符号提取的主入口函数，通过正则表达式匹配源代码中的各种声明语句。\n\n资料来源：[src/extract.ts:50-100]()\n\n#### 支持的语言与符号类型\n\n| 语言 | 符号类型 | 正则模式 |\n|------|----------|----------|\n| TypeScript/JavaScript | 函数 | `/^\\s*(export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 类 | `/^\\s*(export\\s+)?class\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 接口 | `/^\\s*(export\\s+)?interface\\s+([A-Za-z_$][\\w$]*)/` |\n| TypeScript/JavaScript | 类型 | `/^\\s*(export\\s+)?type\\s+([A-Za-z_$][\\w$]*)/` |\n| Python | 函数 | `/^\\s*(?:async\\s+)?def\\s+([A-Za-z_][\\w]*)/` |\n| Python | 类 | `/^\\s*class\\s+([A-Za-z_][\\w]*)/` |\n| Go | 函数 | `/^\\s*func\\s+(?:\\([^)]*\\)\\s*)?([A-Za-z_][\\w]*)/` |\n| Go | 结构体/接口 | `/^\\s*type\\s+([A-Za-z_][\\w]*)\\s+(struct\\|interface)/` |\n| Rust | 函数 | `/^\\s*(pub\\s+)?fn\\s+([A-Za-z_][\\w]*)/` |\n| Rust | 结构体 | `/^\\s*(pub\\s+)?struct\\s+([A-Za-z_][\\w]*)/` |\n| Rust | 枚举 | `/^\\s*(pub\\s+)?enum\\s+([A-Za-z_][\\w]*)/` |\n| Rust | Trait | `/^\\s*(pub\\s+)?trait\\s+([A-Za-z_][\\w]*)/` |\n\n#### matchPush 辅助函数\n\n`matchPush` 是一个通用的高阶函数，用于将正则匹配结果转换为符号记录：\n\n```typescript\nfunction matchPush(\n  line: string,\n  pattern: RegExp,\n  push: (name: string, kind: string, exported?: boolean) => void,\n  kind: string\n): void {\n  const match = line.match(pattern);\n  if (!match) return;\n  push(match[2], kind, Boolean(match[1]));\n}\n```\n\n该函数的设计允许：\n- 捕获符号名称（match[2]）\n- 标记导出状态（match[1] 匹配 `export` 关键字）\n- 统一处理不同类型的符号\n\n资料来源：[src/extract.ts:120-130]()\n\n## 边关系提取详解\n\n### extractEdges 函数\n\n`extractEdges` 函数负责解析代码中的导入语句，构建模块间的依赖图。\n\n资料来源：[src/extract.ts:135-180]()\n\n#### 各语言的导入语句识别\n\n| 语言 | 导入类型 | 正则/匹配模式 |\n|------|----------|---------------|\n| TypeScript/JavaScript | ES Module | `/(?:from\\s+\\|import\\s*)[\"']([^\"']+)[\"']/g` |\n| TypeScript/JavaScript | CommonJS | `/require\\([\"']([^\"']+)[\"']\\)/g` |\n| Python | from import | `/^\\s*from\\s+([\\w.]+)\\s+import\\s+/` |\n| Python | import | `/^\\s*import\\s+([\\w.]+)/` |\n| Go | 导入路径 | `/\"([^\"]+)\"/g` |\n| Rust | use 语句 | `/^\\s*use\\s+([^;]+);/` |\n| Rust | mod 声明 | `/^\\s*mod\\s+([A-Za-z_][\\w]*);/` |\n\n#### 特殊的 package.json 处理\n\n当文件路径以 `package.json` 结尾时，函数会解析 JSON 内容并生成配置依赖边：\n\n```typescript\nif (relativePath.endsWith(\"package.json\")) {\n  try {\n    const parsed = JSON.parse(content) as Record<string, unknown>;\n    for (const section of [\"dependencies\", \"devDependencies\", \"peerDependencies\", \"scripts\"]) {\n      const values = parsed[section];\n      if (!values || typeof values !== \"object\") continue;\n      for (const key of Object.keys(values)) {\n        edges.push({ targetName: `${section}:${key}`, targetType: \"config\", edgeType: \"CONFIGURES\", line: 1 });\n      }\n    }\n  } catch {\n    // Broken JSON 处理\n  }\n}\n```\n\n资料来源：[src/extract.ts:175-195]()\n\n## 代码分块机制\n\n### 分块策略概览\n\nContextful 实现了多种分块策略以适应不同的文件类型和搜索需求：\n\n```graph TD\n    A[输入文件] --> B{文件类型}\n    B -->|代码文件| C[codeChunks]\n    B -->|Markdown| D[markdownChunks]\n    B -->|纯文本| E[textChunks]\n    \n    C --> F[符号边界分块]\n    C --> G[空行分块]\n    G --> H[合并小片段]\n    F --> H\n    H --> I[生成 ChunkRecord]\n    \n    D --> J[提取标题]\n    J --> K[按标题切分]\n    K --> I\n    \n    E --> L[固定行数分块]\n    L --> I\n```\n\n### codeChunks 函数\n\n`codeChunks` 是代码文件的主要分块实现，采用以下策略：\n\n1. **空行分割**：在空行处将文件分割为候选块\n2. **符号保护**：确保函数/类定义的完整性不被分割\n3. **小片段合并**：将行数过少的片段合并到前一个块\n4. **测试文件优先**：测试文件中的相关代码会被优先选中\n\n```typescript\nfunction codeChunks(relativePath: string, content: string, language: string): ChunkRecord[] {\n  const symbols = extractSymbols(relativePath, content, language);\n  const symbolLines = new Set(symbols.map((s) => s.line));\n  \n  // 空行分割逻辑...\n  // 符号边界保护...\n  // 小片段合并...\n  \n  return chunks;\n}\n```\n\n资料来源：[src/extract.ts:200-250]()\n\n### 测试文件识别\n\n`isTestFile` 函数使用以下模式识别测试文件：\n\n```typescript\nfunction isTestFile(relativePath: string): boolean {\n  return /(^|\\/)(tests?|__tests__)\\/|(\\.|-)(test|spec)\\.[A-Za-z]+$/.test(relativePath);\n}\n```\n\n符合以下任一条件的文件将被识别为测试文件：\n- 目录名包含 `test`、`tests`、`__tests__`\n- 文件名以 `.test`、`-test`、`.spec`、`-spec` 结尾\n\n资料来源：[src/extract.ts:260-265]()\n\n## Markdown 处理\n\n### markdownChunks 函数\n\nMarkdown 文件的分块基于标题结构：\n\n```typescript\nfunction markdownChunks(relativePath: string, content: string): ChunkRecord[] {\n  const lines = content.split(/\\r?\\n/);\n  const headings: Array<{ title: string; line: number }> = [];\n  \n  // 提取所有标题 (# 到 ######)\n  lines.forEach((line, index) => {\n    const match = line.match(/^(#{1,6})\\s+(.+)$/);\n    if (match) headings.push({ title: match[2].trim(), line: index + 1 });\n  });\n  \n  // 无标题时返回整个文件\n  // 有标题时按标题切分\n}\n```\n\n资料来源：[src/extract.ts:280-310]()\n\n## CLI 命令集成\n\n解析与代码提取功能通过 CLI 模块对外提供服务：\n\n```graph TD\n    A[CLI 入口] --> B[index 命令]\n    A --> C[daemon 命令]\n    A --> D[query 命令]\n    A --> E[search 命令]\n    A --> F[report 命令]\n    \n    B --> G[ensureIndexed]\n    G --> H[索引工作区]\n    H --> I[调用 extract.ts]\n    \n    D --> J[createContextPack]\n    J --> K[搜索索引]\n    K --> I\n```\n\n### 主要 CLI 命令\n\n| 命令 | 功能 | 相关源码 |\n|------|------|----------|\n| `index` | 索引工作区中的所有代码文件 | [src/cli.ts:30-50]() |\n| `daemon` | 启动本地索引守护进程 | [src/cli.ts:55-65]() |\n| `query` | 根据查询创建证据包 | [src/cli.ts:70-85]() |\n| `search` | 在索引中搜索上下文 | [src/cli.ts:90-105]() |\n| `report` | 生成上下文报告 | [src/cli.ts:110-120]() |\n\n资料来源：[src/cli.ts:1-100]()\n\n## 搜索与索引集成\n\n### 搜索上下文流程\n\n解析提取的数据最终服务于搜索功能：\n\n```graph TD\n    A[searchContext] --> B[classifyQuery]\n    B --> C{意图类型}\n    C -->|exact| D[精确匹配]\n    C -->|code| E[FTS 代码搜索]\n    C -->|docs| F[FTS 文档搜索]\n    C -->|symbol| G[符号搜索]\n    C -->|memory| H[记忆搜索]\n    \n    D --> I[rankResults]\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    \n    I --> J[dedupeHits]\n    J --> K[返回搜索结果]\n```\n\n### 查询意图分类\n\n`classifyQuery` 函数根据查询特征判断用户意图：\n\n| 意图 | 触发关键词 | 资料来源 |\n|------|------------|----------|\n| symbol | `function`, `class`, `interface` | [src/search.ts:20-30]() |\n| memory | `memory`, `lesson`, `remember` | [src/search.ts:35-40]() |\n| impact | `impact`, `affected`, `depends` | [src/search.ts:42-44]() |\n| historical | `why`, `changed`, `history` | [src/search.ts:46-48]() |\n| architectural | `architecture`, `flow`, `imports` | [src/search.ts:50-52]() |\n| docs | `docs`, `documentation`, `readme` | [src/search.ts:54-56]() |\n\n资料来源：[src/search.ts:15-60]()\n\n## 证据包生成\n\n### createContextPack 函数\n\n`createContextPack` 将搜索结果整合为结构化的证据包：\n\n```typescript\nexport async function createContextPack(options: CreatePackOptions): Promise<EvidencePack> {\n  const search = await searchContext({ workspace, query, limit: budget });\n  \n  // 选择性合并...\n  const selected = search.hits.slice(0, maxChunks);\n  \n  const tokenEstimate = estimateTokens(selected.map((h) => h.text).join(\"\\n\"));\n  \n  const kernel = openKernelDb(workspace);\n  const graphPaths = loadGraphPaths(kernel.db, paths, 20);\n  \n  const pack: EvidencePack = {\n    id: `ctx_${shortHash(`${query}:${nowIso()}`)}`,\n    query,\n    scope,\n    intent: search.intent,\n    summary: summarizePack(query, search.intent, selected, graphPaths, memoryHits),\n    citations: selected,\n    confidence: confidenceFor(selected, graphPaths, memoryHits),\n    // ...\n  };\n  \n  return pack;\n}\n```\n\n资料来源：[src/search.ts:150-200]()\n\n## 工具函数\n\n### 行范围提取\n\n`lineRange` 函数从文本中提取指定行范围：\n\n```typescript\nexport function lineRange(text: string, startLine: number, endLine: number): string {\n  const lines = text.split(/\\r?\\n/);\n  return lines.slice(Math.max(0, startLine - 1), Math.min(lines.length, endLine)).join(\"\\n\");\n}\n```\n\n资料来源：[src/util.ts:30-35]()\n\n### 二进制文件检测\n\n`isLikelyBinary` 函数通过检测空字节判断文件类型：\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n资料来源：[src/util.ts:20-25]()\n\n## 数据模型\n\n### ChunkRecord 结构\n\n```typescript\ninterface ChunkRecord {\n  ref: string;           // 文件引用，如 \"file:src/auth.ts:1-20\"\n  filePath: string;      // 相对文件路径\n  startLine: number;     // 起始行号\n  endLine: number;       // 结束行号\n  kind: \"code\" | \"doc\" | \"file\";  // 块类型\n  title: string;         // 标题/符号名\n  text: string;          // 块内容\n  tokenEstimate: number; // token 估算值\n}\n```\n\n### RawEdge 结构\n\n```typescript\ninterface RawEdge {\n  targetName: string;    // 目标名称\n  targetType: \"module\" | \"config\" | \"symbol\";  // 目标类型\n  edgeType: \"IMPORTS\" | \"CONFIGURES\";  // 边类型\n  line: number;          // 所在行号\n  filePath?: string;     // 文件路径\n}\n```\n\n资料来源：[src/extract.ts:40-48]()\n\n## 报告生成\n\n### generateReport 函数\n\n`generateReport` 汇总索引状态并生成统计报告：\n\n```typescript\nexport async function generateReport(options: { workspace?: string }): Promise<ContextReport> {\n  const workspace = resolveWorkspace(options.workspace);\n  await ensureIndexed(workspace);\n  const kernel = openKernelDb(workspace);\n  \n  const languageRows = kernel.db\n    .prepare(\"SELECT language, COUNT(*) AS count FROM files GROUP BY language ORDER BY count DESC\")\n    .all();\n  \n  // 收集统计信息...\n  // 生成报告...\n}\n```\n\n资料来源：[src/report.ts:50-80]()\n\n## 总结\n\n解析与代码提取模块是 Contextful 的核心基础设施，通过模块化的设计实现了对多种编程语言的支持。其关键设计特点包括：\n\n1. **正则驱动**：使用正则表达式实现轻量级代码解析\n2. **语义分块**：保持函数/类边界的完整性\n3. **多语言支持**：覆盖 TypeScript、JavaScript、Python、Go、Rust 等主流语言\n4. **测试优先**：自动识别并优先处理测试文件\n5. **可扩展架构**：通过 `matchPush` 等高阶函数便于添加新语言支持\n\n该模块与搜索模块紧密集成，共同构成了上下文检索的能力基础。\n\n---\n\n<a id='page-9'></a>\n\n## CLI 命令行工具\n\n### 相关页面\n\n相关主题：[系统架构](#page-2), [MCP 服务器集成](#page-7), [部署与配置](#page-10)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n- [src/util.ts](https://github.com/Inferensys/contextful/blob/main/src/util.ts)\n- [package.json](https://github.com/Inferensys/contextful/blob/main/package.json)\n</details>\n\n# CLI 命令行工具\n\n## 概述\n\nContextful 的 CLI（命令行界面）是用户与上下文索引系统交互的主要入口点。该工具提供了索引工作区、查询证据包、搜索上下文、生成报告以及管理 MCP 服务器等功能。\n\nCLI 采用 [Commander.js](https://github.com/tj/commander.js) 框架构建，支持多种子命令，覆盖了从代码索引到证据管理的完整工作流程。`cxf` 是主二进制文件名称，同时提供 `contextful` 作为可读别名。\n\n资料来源：[src/cli.ts:1-20]()\n\n## 核心命令架构\n\n### 命令层次结构\n\n```mermaid\ngraph TD\n    A[cxf / contextful] --> B[index]\n    A --> C[daemon]\n    A --> D[query]\n    A --> E[search]\n    A --> F[report]\n    A --> G[memory]\n    A --> H[server]\n    \n    G --> G1[memory add]\n```\n\n### 命令总览\n\n| 命令 | 功能描述 | 输出格式 |\n|------|----------|----------|\n| `index` | 索引工作区文件 | JSON |\n| `daemon` | 启动本地索引守护进程 | JSON（流式） |\n| `query` | 创建证据包 | Markdown / JSON |\n| `search` | 搜索索引上下文 | JSON |\n| `report` | 生成上下文报告 | Markdown / JSON / HTML |\n| `memory add` | 存储证据-backed 经验 | JSON |\n| `server` | 运行 MCP stdio 服务器 | - |\n\n资料来源：[src/cli.ts:20-80]()\n\n## 索引命令\n\n### index\n\n索引命令用于扫描工作区中的代码文件，建立搜索索引。\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--watch` | flag | 否 | false | 监听文件变化 |\n\n#### 功能说明\n\n- 扫描指定工作区路径下的所有代码文件\n- 支持 TypeScript、JavaScript、Python、Go、Rust 等多种语言\n- 提取文件中的符号（symbols）、边（edges）和代码块（chunks）\n- 将索引数据存储到 SQLite 数据库中\n\n资料来源：[src/cli.ts:20-35]()\n\n### daemon\n\n守护进程命令启动一个持续运行的索引服务，监听文件系统变化并实时更新索引。\n\n```bash\ncxf daemon --workspace <path>\n```\n\n#### 特性\n\n- 实时监听工作区文件变化\n- 增量更新索引，而非完全重建\n- 通过 stdout 流式输出 JSON 格式的索引结果\n\n资料来源：[src/cli.ts:36-45]()\n\n## 查询命令\n\n### query\n\nquery 命令是 Contextful 的核心功能，用于创建紧凑的证据包回答用户查询。\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> [--json]\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `<query>` | string | 是 | - | 要回答的查询语句 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--budget <tokens>` | integer | 否 | 2000 | 近似 token 预算 |\n| `--json` | flag | 否 | false | 输出 JSON 而非 Markdown |\n\n#### 工作流程\n\n```mermaid\ngraph LR\n    A[用户查询] --> B[搜索索引]\n    B --> C[意图分类]\n    C --> D[BM25 排序]\n    D --> E[图路径分析]\n    E --> F[选择证据]\n    F --> G[生成证据包]\n    G --> H[返回结果]\n```\n\n#### 输出内容\n\n证据包包含以下结构化信息：\n\n- `id`: 证据包唯一标识符\n- `query`: 原始查询\n- `intent`: 搜索意图分类\n- `summary`: 结果摘要\n- `citations`: 选中的证据引用列表\n- `files`: 相关文件及原因\n- `symbols`: 匹配的符号记录\n- `graphPaths`: 图连接路径\n- `memoryHits`: 记忆命中\n- `confidence`: 置信度分数\n- `tokenEstimate`: 估算的 token 数量\n- `budget`: 分配的 token 预算\n- `createdAt`: 创建时间戳\n\n资料来源：[src/cli.ts:46-60](), [src/search.ts:80-150]()\n\n## 搜索命令\n\n### search\n\nsearch 命令提供轻量级的上下文搜索功能，不生成完整证据包。\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit <count> --kind <kind>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `<query>` | string | 是 | - | 搜索查询 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--limit <count>` | integer | 否 | 10 | 最大命中数 |\n| `--kind <kind>` | enum | 否 | all | 搜索类型 |\n\n#### kind 参数选项\n\n| 值 | 说明 |\n|----|------|\n| `all` | 所有类型 |\n| `code` | 仅代码 |\n| `docs` | 仅文档 |\n| `symbols` | 仅符号 |\n| `memory` | 仅记忆 |\n\n资料来源：[src/cli.ts:70-80]()\n\n## 报告命令\n\n### report\n\n生成工作区的上下文索引报告。\n\n```bash\ncxf report --workspace <path> --format <format>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--format <format>` | enum | 否 | markdown | 输出格式 |\n\n#### format 参数选项\n\n| 值 | 说明 |\n|----|------|\n| `markdown` | Markdown 格式（默认） |\n| `json` | JSON 格式 |\n| `html` | HTML 格式 |\n\n#### 报告内容\n\n报告包含以下部分：\n\n- 索引状态概览\n- 语言覆盖率统计\n- 热门查询记录\n- 陈旧记忆列表\n- Agent 使用建议\n- 警告信息（如有）\n\n资料来源：[src/cli.ts:81-90](), [src/report.ts:1-100]()\n\n## 记忆管理命令\n\n### memory add\n\n存储证据-backed 的经验教训到记忆账本中。\n\n```bash\ncxf memory add \\\n  --claim <text> \\\n  --evidence <ref...> \\\n  --workspace <path> \\\n  --scope <scope> \\\n  --confidence <number>\n```\n\n#### 参数与选项\n\n| 参数 | 类型 | 必需 | 默认值 | 说明 |\n|------|------|------|--------|------|\n| `--claim <text>` | string | 是 | - | 经验声明 |\n| `--evidence <ref...>` | string[] | 是 | - | 证据引用列表 |\n| `--workspace <path>` | string | 否 | `process.cwd()` | 工作区路径 |\n| `--scope <scope>` | string | 否 | repo | 记忆作用域 |\n| `--confidence <number>` | float | 否 | 0.7 | 置信度（0-1） |\n\n#### 证据引用格式\n\n证据引用格式为：`file:src/auth.ts:1-20`，表示从 `src/auth.ts` 文件的第 1-20 行提取证据。\n\n#### 功能说明\n\n- 验证证据引用的有效性\n- 将经验存储到 SQLite 数据库\n- 支持覆盖（supersedes）旧记忆\n\n资料来源：[src/cli.ts:92-125]()\n\n## MCP 服务器命令\n\n### server\n\n启动 MCP（Model Context Protocol）stdio 服务器。\n\n```bash\ncxf server\n```\n\n#### 功能说明\n\n- 提供 MCP 标准工具接口\n- 支持 `context_pack`、`search_code`、`trace_path` 等工具\n- 通过 stdio 与 AI 代理通信\n\n资料来源：[src/cli.ts:126-135]()\n\n## 工具函数\n\n### 参数解析辅助函数\n\n```typescript\nfunction parseInteger(value: string): number\nfunction parseReportFormat(value: string): ReportFormat\n```\n\n| 函数 | 输入 | 输出 | 错误处理 |\n|------|------|------|----------|\n| `parseInteger` | 字符串 | 整数 | 无效整数抛出错误 |\n| `parseReportFormat` | 字符串 | markdown/json/html | 无效格式抛出错误 |\n\n资料来源：[src/cli.ts:148-165]()\n\n## 错误处理\n\nCLI 采用统一的错误处理机制：\n\n```typescript\nprogram.parseAsync(process.argv).catch((error) => {\n  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n  process.exitCode = 1;\n});\n```\n\n错误处理特点：\n\n- 错误信息输出到 stderr\n- 非零退出码表示失败\n- 区分 Error 实例与普通字符串\n\n资料来源：[src/cli.ts:136-145]()\n\n## 安装与使用\n\n### 安装方式\n\n```bash\nnpx @inferensys/contextful index --workspace .\nnpx @inferensys/contextful query \"where is user auth handled\" --workspace . --budget 2000\n```\n\n### MCP 服务器启动\n\n```bash\nnpx @inferensys/contextful server\n```\n\n### 环境要求\n\n- Node.js >= 20\n- 支持 Unix-like 系统及 Windows\n\n资料来源：[package.json:1-30](), [README.md:1-30]()\n\n## 快速参考\n\n| 命令 | 用途 |\n|------|------|\n| `cxf index --workspace . --watch` | 索引并监听变化 |\n| `cxf query \"认证逻辑在哪里\"` | 查询证据包 |\n| `cxf search \"auth\" --kind code` | 搜索代码 |\n| `cxf report --format html` | 生成 HTML 报告 |\n| `cxf memory add --claim \"...\" --evidence file:src/x.ts:1-10` | 添加记忆 |\n| `cxf server` | 启动 MCP 服务器 |\n\n---\n\n<a id='page-10'></a>\n\n## 部署与配置\n\n### 相关页面\n\n相关主题：[项目概述](#page-1), [MCP 服务器集成](#page-7), [CLI 命令行工具](#page-9)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/Inferensys/contextful/blob/main/README.md)\n- [src/cli.ts](https://github.com/Inferensys/contextful/blob/main/src/cli.ts)\n- [src/mcp-server.ts](https://github.com/Inferensys/contextful/blob/main/src/mcp-server.ts)\n- [src/search.ts](https://github.com/Inferensys/contextful/blob/main/src/search.ts)\n- [src/report.ts](https://github.com/Inferensys/contextful/blob/main/src/report.ts)\n</details>\n\n# 部署与配置\n\n## 概述\n\n`部署与配置` 是 Contextful 项目的安装、环境设置及运行时参数管理模块。该模块涵盖了从 NPM 包安装到 MCP 服务器运行的完整部署链路，为开发者提供命令行界面（CLI）和 MCP（Model Context Protocol）服务器两种使用方式。Contextful 是一个上下文管理工具，帮助智能体（Agent）在处理复杂任务时获取精确的代码证据和上下文信息。\n\n## 核心部署模式\n\nContextful 支持两种主要的部署模式，适用于不同的使用场景。\n\n### 本地 CLI 部署\n\n本地 CLI 部署适合开发者直接在终端环境中使用，适用于代码浏览、上下文搜索和报告生成等场景。CLI 模式通过 `cxf` 或 `contextful` 命令行工具提供完整功能集。\n\n```bash\n# 基本索引操作\nnpx @inferensys/contextful index --workspace .\n\n# 创建证据包\nnpx @inferensys/contextful query \"where is user auth handled\" --workspace . --budget 2000\n```\n\n资料来源：[README.md]()\n\n### MCP 服务器部署\n\nMCP 服务器部署适用于将 Contextful 作为智能体工具集成的场景。服务器通过标准输入/输出（stdio）接口与 MCP 客户端通信，提供标准化的工具调用接口。\n\n```bash\nnpx @inferensys/contextful server\n```\n\nMCP 服务器模式下，Contextful 提供以下核心工具接口供智能体调用：\n\n| 工具名称 | 功能描述 | 主要参数 |\n|---------|---------|---------|\n| `context_pack` | 返回排序的、带引用的、符合token预算的证据包 | query, budget, scope |\n| `search_code` | 强大的代码、文档、符号和内存搜索 | query, mode, filters |\n| `trace_path` | 跨文件、符号、模块和配置的图遍历 | from, to, edge_types |\n| `impact_analysis` | 反向依赖分析和可能的测试识别 | symbol_or_file |\n| `why_changed` | 结合当前证据和Git历史解释变更原因 | symbol_or_file, limit |\n| `recall_memory` | 搜索跨会话持久化的项目经验 | query, scope, limit |\n| `write_lesson` | 将带证据的经验写入内存账本 | claim, evidence_refs, scope, confidence |\n\n资料来源：[README.md](), [src/mcp-server.ts]()\n\n## CLI 命令详解\n\nCLI 是 Contextful 的主要交互接口，命令结构遵循 `cxf <command> [options]` 的格式。\n\n### 索引命令 (index)\n\n索引命令用于扫描和索引工作区内的代码文件，建立搜索和图遍历的基础数据。\n\n```bash\ncxf index --workspace <path> [--watch]\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--watch` | flag | false | 监视模式，持续监听文件变化 |\n\n资料来源：[src/cli.ts]()\n\n### 守护进程命令 (daemon)\n\n守护进程命令启动本地索引服务，持续监视工作区文件变化并更新索引。\n\n```bash\ncxf daemon --workspace <path>\n```\n\n当工作区文件发生变更时，守护进程会主动推送更新结果到标准输出：\n\n```typescript\nawait watchWorkspace(options.workspace, (result) => {\n  process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n});\n```\n\n资料来源：[src/cli.ts]()\n\n### 查询命令 (query)\n\n查询命令是 Contextful 的核心功能，根据自然语言查询创建包含证据的上下文包。\n\n```bash\ncxf query \"<query>\" --workspace <path> --budget <tokens> [--json]\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--budget` | number | 2000 | 近似token预算 |\n| `--json` | flag | false | 输出JSON格式而非Markdown |\n\n查询命令内部调用 `createContextPack` 函数，生成包含以下信息的证据包：\n\n- 查询意图分类（intent）\n- 置信度评分（confidence）\n- 相关代码引用（citations）\n- 依赖图路径（graphPaths）\n- 内存命中（memoryHits）\n\n资料来源：[src/cli.ts](), [src/search.ts]()\n\n### 搜索命令 (search)\n\n搜索命令在不编译完整证据包的情况下搜索索引上下文，适用于快速定位信息。\n\n```bash\ncxf search \"<query>\" --workspace <path> --limit <count> --kind <kind>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--limit` | number | 10 | 最大命中数 |\n| `--kind` | enum | \"all\" | 搜索类型：all/code/docs/symbols/memory |\n\n搜索类型参数决定搜索结果的过滤范围：\n\n- `all`：搜索所有类型的索引块\n- `code`：仅搜索代码文件块\n- `docs`：仅搜索文档块\n- `symbols`：仅搜索符号定义块\n- `memory`：仅搜索内存记录块\n\n资料来源：[src/cli.ts](), [src/search.ts]()\n\n### 报告命令 (report)\n\n报告命令生成工作区的上下文索引报告。\n\n```bash\ncxf report --workspace <path> --format <format>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--format` | enum | \"markdown\" | 输出格式：markdown/json/html |\n\n报告生成器调用 `generateReport` 函数，收集工作区的索引统计信息并渲染为指定格式。\n\n资料来源：[src/cli.ts](), [src/report.ts]()\n\n### 内存管理命令 (memory)\n\n内存命令用于管理证据支持的智能体内存，允许存储和检索跨会话的项目经验。\n\n#### 添加经验 (add)\n\n```bash\ncxf memory add --claim <text> --evidence <ref...> --workspace <path> --scope <scope> --confidence <number>\n```\n\n| 选项 | 类型 | 默认值 | 说明 |\n|-----|------|-------|------|\n| `--claim` | text | 必需 | 经验声明/教训 |\n| `--evidence` | ref[] | 必需 | 证据引用，如 `file:src/auth.ts:1-20` |\n| `--workspace` | path | process.cwd() | 工作区路径 |\n| `--scope` | string | \"repo\" | 内存范围 |\n| `--confidence` | number | 0.7 | 置信度（0-1） |\n\n经验引用格式：`file:<relativePath>:<startLine>-<endLine>`\n\n```bash\ncxf memory add \\\n  --claim \"用户认证模块位于 src/auth.ts\" \\\n  --evidence \"file:src/auth.ts:1-50\" \\\n  --workspace . \\\n  --confidence 0.9\n```\n\n资料来源：[src/cli.ts]()\n\n### MCP 服务器命令 (server)\n\n服务器命令启动 MCP stdio 服务器，供 MCP 客户端连接使用。\n\n```bash\ncxf server\n```\n\n服务器接收来自客户端的工具调用请求，执行相应操作并返回 JSON 格式的结果。工具参数使用 Zod 模式进行验证。\n\n资料来源：[src/cli.ts](), [src/mcp-server.ts]()\n\n## 工作区配置\n\n### 工作区路径解析\n\n工作区路径的解析遵循以下优先级：\n\n1. CLI 选项 `--workspace` 显式指定\n2. 环境变量 `WORKSPACE`（如果实现）\n3. 当前工作目录 `process.cwd()` 作为默认值\n\n```typescript\n.option(\"--workspace <path>\", \"Workspace path.\", process.cwd())\n```\n\n资料来源：[src/cli.ts]()\n\n### 索引结构\n\n工作区索引数据库（`kernel.db`）包含以下核心表结构：\n\n| 表名 | 用途 | 关键字段 |\n|-----|------|---------|\n| `files` | 已索引文件元数据 | path, language, indexed_at |\n| `chunks_fts` | 全文搜索索引 | ref, path, title, text, bm25 |\n| `symbols` | 代码符号索引 | name, kind, file_path, line |\n| `edges` | 导入/依赖关系图 | from, to, edge_type, file_path, line |\n| `lessons` | 经验记忆存储 | id, claim, scope, confidence, evidence |\n| `query_log` | 查询历史记录 | query, intent, timestamp |\n\n### 文件类型支持\n\n索引器支持多种编程语言的符号提取和边关系提取：\n\n| 语言 | 符号类型 | 边关系类型 |\n|-----|---------|-----------|\n| TypeScript/JavaScript | function, class, interface, type, const | ES imports, require() |\n| Python | def, class | from...import, import |\n| Go | func, struct, interface | import |\n| Rust | fn, struct, enum, trait, impl | use, mod |\n| Markdown | heading | - |\n| JSON | config-key | - |\n\n资料来源：[src/extract.ts]()\n\n## 报告生成配置\n\n### 报告格式选项\n\n报告支持三种输出格式，通过 `--format` 选项指定：\n\n#### Markdown 格式\n\n默认格式，生成人类可读的 Markdown 文档，包含以下章节：\n\n- 工作区概览\n- 文件语言分布\n- 索引警告\n- Token 使用统计\n\n#### JSON 格式\n\n机器可读的 JSON 输出，适合程序化处理：\n\n```json\n{\n  \"status\": { \"workspace\": \"...\", \"indexedAt\": \"...\", \"languageDistribution\": [...] },\n  \"summary\": { \"totalChunks\": 123, \"totalSymbols\": 456, \"totalEdges\": 789 },\n  \"tokenSavingsEstimate\": { \"indexedTokens\": ..., \"averagePackTokens\": ... }\n}\n```\n\n#### HTML 格式\n\n自包含的 HTML 文档，内嵌样式，适合浏览器查看：\n\n```html\n<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>Contextful Report</title>\n  <style>\n    body { font: 15px/1.55 system-ui, sans-serif; margin: 0; ... }\n  </style>\n</head>\n<body><main><pre>[Markdown content]</pre></main></body>\n</html>\n```\n\n资料来源：[src/report.ts]()\n\n## 运行时参数配置\n\n### 查询预算配置\n\n`--budget` 参数控制返回证据包的 token 上限，影响搜索结果的精选程度：\n\n| 预算值 | 适用场景 | 示例 |\n|-------|---------|------|\n| 1000-2000 | 简短查询、精确查找 | `cxf query \"auth middleware\" --budget 1500` |\n| 2000-5000 | 标准查询、代码理解 | `cxf query \"how does cache work\" --budget 3000` |\n| 5000+ | 复杂查询、架构分析 | `cxf query \"dependency injection flow\" --budget 8000` |\n\n### 搜索类型过滤\n\n`--kind` 参数过滤搜索结果的类型范围：\n\n```bash\n# 仅搜索代码符号\ncxf search \"UserService\" --kind symbols\n\n# 仅搜索文档\ncxf search \"installation guide\" --kind docs\n\n# 仅搜索记忆\ncxf search \"previous lessons\" --kind memory\n```\n\n### 置信度阈值\n\n经验记忆的置信度参数（`--confidence`）影响信息优先级排序：\n\n- **0.9-1.0**：高置信度，直接可用于决策\n- **0.7-0.9**：中高置信度，建议交叉验证\n- **0.5-0.7**：中等置信度，需要更多证据支持\n- **0.0-0.5**：低置信度，仅作参考\n\n## 部署架构图\n\n```mermaid\ngraph TD\n    A[开发者终端] --> B[CLI 界面]\n    A --> C[MCP 客户端]\n    \n    B --> D[index 命令]\n    B --> E[query 命令]\n    B --> F[search 命令]\n    B --> G[report 命令]\n    B --> H[memory 命令]\n    \n    C --> I[MCP Server]\n    I --> J[context_pack 工具]\n    I --> K[search_code 工具]\n    I --> L[trace_path 工具]\n    I --> M[impact_analysis 工具]\n    I --> N[why_changed 工具]\n    I --> O[recall_memory 工具]\n    I --> P[write_lesson 工具]\n    \n    D --> Q[文件系统扫描]\n    Q --> R[SQLite 数据库]\n    \n    E --> S[证据包生成]\n    S --> R\n    S --> T[Token 预算控制]\n    \n    F --> U[全文搜索]\n    U --> R\n    \n    G --> V[报告渲染]\n    V --> W[Markdown/JSON/HTML]\n    \n    H --> X[记忆存储]\n    X --> R\n```\n\n## 环境变量参考\n\n| 变量名 | 类型 | 说明 | 默认值 |\n|-------|------|-----|-------|\n| `WORKSPACE` | string | 工作区根目录路径 | 当前工作目录 |\n| `CONTEXTFUL_BUDGET` | number | 默认 token 预算 | 2000 |\n\n## 常见部署场景\n\n### 场景一：本地开发环境\n\n适用于开发者在本地机器上浏览和分析代码库：\n\n```bash\n# 首次索引\ncxf index --workspace /path/to/project\n\n# 启动守护进程监视变化\ncxf daemon --workspace /path/to/project &\n\n# 执行查询\ncxf query \"用户认证流程\" --workspace /path/to/project --budget 3000\n```\n\n### 场景二：智能体集成\n\n将 Contextful 作为智能体工具集成的标准模式：\n\n1. 启动 MCP 服务器\n2. 配置 MCP 客户端连接\n3. 通过 `context_pack` 工具获取上下文\n\n```bash\n# 服务器端\ncxf server\n\n# 客户端调用示例（伪代码）\nresult = mcp_client.call_tool(\"context_pack\", {\n  query: \"where is user auth handled\",\n  budget: 2000,\n  scope: \"repo\"\n})\n```\n\n### 场景三：CI/CD 集成\n\n在持续集成流程中生成索引报告：\n\n```yaml\n# .github/workflows/context-report.yml\n- name: Generate Context Report\n  run: |\n    npx @inferensys/contextful index --workspace .\n    npx @inferensys/contextful report --workspace . --format html > report.html\n```\n\n## 安全考虑\n\n### 敏感信息处理\n\nContextful 在日志输出和报告生成中自动过滤敏感信息：\n\n```typescript\n// 邮箱地址脱敏\nif (match.includes(\"@\") && !match.toLowerCase().includes(\"token\")) return \"<email>\";\n\n// 密钥脱敏\nconst key = match.split(/[:=]/)[0]?.trim();\nreturn key && key.length < match.length ? `${key}=<redacted>` : \"<secret>\";\n```\n\n资料来源：[src/util.ts]()\n\n### 二进制文件检测\n\n索引器自动跳过二进制文件以避免处理错误：\n\n```typescript\nexport function isLikelyBinary(buffer: Buffer): boolean {\n  const sample = buffer.subarray(0, Math.min(buffer.length, 4096));\n  return sample.includes(0);\n}\n```\n\n## 故障排除\n\n| 问题 | 可能原因 | 解决方案 |\n|-----|---------|---------|\n| 索引失败 | 工作区路径不存在或无权限 | 检查 `--workspace` 参数，确保路径可访问 |\n| 查询无结果 | 文件未被索引 | 确认已运行 `cxf index`，检查文件类型是否支持 |\n| 服务器连接失败 | 端口占用或权限问题 | 使用 stdio 模式，确认客户端配置正确 |\n| 报告生成错误 | 数据库损坏 | 删除 `.contextful` 目录后重新索引 |\n\n## 扩展阅读\n\n- [核心搜索机制](README.md)\n- [MCP 工具规范](src/mcp-server.ts)\n- [索引提取算法](src/extract.ts)\n\n---\n\n---\n\n## Doramagic 踩坑日志\n\n项目：Inferensys/contextful\n\n摘要：发现 7 个潜在踩坑项，其中 0 个为 high/blocking；最高优先级：配置坑 - 可能修改宿主 AI 配置。\n\n## 1. 配置坑 · 可能修改宿主 AI 配置\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。\n- 对用户的影响：安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。\n- 建议检查：列出会写入的配置文件、目录和卸载/回滚步骤。\n- 防护动作：涉及宿主配置目录时必须给回滚路径，不能只给安装命令。\n- 证据：capability.host_targets | github_repo:1240001007 | https://github.com/Inferensys/contextful | host_targets=claude, claude_code\n\n## 2. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:1240001007 | https://github.com/Inferensys/contextful | README/documentation is current enough for a first validation pass.\n\n## 3. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | last_activity_observed missing\n\n## 4. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 5. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 6. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | issue_or_pr_quality=unknown\n\n## 7. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | release_recency=unknown\n\n<!-- canonical_name: Inferensys/contextful; human_manual_source: deepwiki_human_wiki -->\n",
      "summary": "DeepWiki/Human Wiki 完整输出，末尾追加 Discovery Agent 踩坑日志。",
      "title": "Human Manual / 人类版说明书"
    },
    "pitfall_log": {
      "asset_id": "pitfall_log",
      "filename": "PITFALL_LOG.md",
      "markdown": "# Pitfall Log / 踩坑日志\n\n项目：Inferensys/contextful\n\n摘要：发现 7 个潜在踩坑项，其中 0 个为 high/blocking；最高优先级：配置坑 - 可能修改宿主 AI 配置。\n\n## 1. 配置坑 · 可能修改宿主 AI 配置\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。\n- 对用户的影响：安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。\n- 建议检查：列出会写入的配置文件、目录和卸载/回滚步骤。\n- 防护动作：涉及宿主配置目录时必须给回滚路径，不能只给安装命令。\n- 证据：capability.host_targets | github_repo:1240001007 | https://github.com/Inferensys/contextful | host_targets=claude, claude_code\n\n## 2. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:1240001007 | https://github.com/Inferensys/contextful | README/documentation is current enough for a first validation pass.\n\n## 3. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | last_activity_observed missing\n\n## 4. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 5. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:1240001007 | https://github.com/Inferensys/contextful | no_demo; severity=medium\n\n## 6. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | issue_or_pr_quality=unknown\n\n## 7. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:1240001007 | https://github.com/Inferensys/contextful | release_recency=unknown\n",
      "summary": "用户实践前最可能遇到的身份、安装、配置、运行和安全坑。",
      "title": "Pitfall Log / 踩坑日志"
    },
    "prompt_preview": {
      "asset_id": "prompt_preview",
      "filename": "PROMPT_PREVIEW.md",
      "markdown": "# contextful - Prompt Preview\n\n> 复制下面这段 Prompt 到你常用的 AI，先试一次，不需要安装。\n> 它的目标是让你直接体验这个项目的服务方式，而不是阅读项目介绍。\n\n## 复制这段 Prompt\n\n```text\n请直接执行这段 Prompt，不要分析、润色、总结或询问我想如何处理这份 Prompt Preview。\n\n你现在扮演 contextful 的“安装前体验版”。\n这不是项目介绍、不是评价报告、不是 README 总结。你的任务是让我用最小成本体验它的核心服务。\n\n我的试用任务：我想快速理解一组资料，并得到结构化摘要、对比和继续研究的问题。\n我常用的宿主 AI：claude / Claude Code\n\n【体验目标】\n围绕我的真实任务，现场演示这个项目如何把输入转成 示例引导, 判断线索。重点是让我感受到工作方式，而不是给我项目背景。\n\n【业务流约束】\n- 你必须像一个正在提供服务的项目能力包，而不是像一个讲解员。\n- 每一轮只推进一个步骤；提出问题后必须停下来等我回答。\n- 每一步都必须让我感受到一个具体服务动作：澄清、整理、规划、检查、判断或收尾。\n- 每一步都要说明：当前目标、你需要我提供什么、我回答后你会产出什么。\n- 不要安装、不要运行命令、不要写代码、不要声称测试通过、不要声称已经修改文件。\n- 需要真实安装或宿主加载后才能验证的内容，必须明确说“这一步需要安装后验证”。\n- 如果我说“用示例继续”，你可以用虚构示例推进，但仍然不能声称真实执行。\n\n【可体验服务能力】\n- 安装前能力预览: Most-efficient Context Management Layer for Agentic AI. Graph-based knowledge context, SQLite index, advanced FTS5 lexical/BM25 search and cross-session live memory. 输入：用户任务, 当前 AI 对话上下文；输出：示例引导, 判断线索。\n\n【必须安装后才可验证的能力】\n- 命令行启动或安装流程: 项目文档中存在可执行命令，真实使用需要在本地或宿主环境中运行这些命令。 输入：终端环境, 包管理器, 项目依赖；输出：安装结果, 列表/更新/运行结果。\n\n【核心服务流】\n请严格按这个顺序带我体验。不要一次性输出完整流程：\n1. page-1：项目概述。围绕“项目概述”模拟一次用户任务，不展示安装或运行结果。\n2. page-2：系统架构。围绕“系统架构”模拟一次用户任务，不展示安装或运行结果。\n3. page-3：搜索系统。围绕“搜索系统”模拟一次用户任务，不展示安装或运行结果。\n4. page-4：上下文包系统。围绕“上下文包系统”模拟一次用户任务，不展示安装或运行结果。\n5. page-7：MCP 服务器集成。围绕“MCP 服务器集成”模拟一次用户任务，不展示安装或运行结果。\n\n【核心能力体验剧本】\n每一步都必须按“输入 -> 服务动作 -> 中间产物”执行。不要只说流程名：\n1. page-1\n输入：用户提供的“项目概述”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n2. page-2\n输入：用户提供的“系统架构”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n3. page-3\n输入：用户提供的“搜索系统”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n4. page-4\n输入：用户提供的“上下文包系统”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n5. page-7\n输入：用户提供的“MCP 服务器集成”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n【项目服务规则】\n这些规则决定你如何服务用户。不要解释规则本身，而要在每一步执行时遵守：\n- 先确认用户任务、输入材料和成功标准，再模拟项目能力。\n- 每一步都必须形成可检查的小产物，并等待用户确认后再继续。\n- 凡是需要安装、调用工具或访问外部服务的能力，都必须标记为安装后验证。\n\n【每一步的服务约束】\n- Step 1 / page-1：Step 1 必须围绕“项目概述”形成一个小中间产物，并等待用户确认。\n- Step 2 / page-2：Step 2 必须围绕“系统架构”形成一个小中间产物，并等待用户确认。\n- Step 3 / page-3：Step 3 必须围绕“搜索系统”形成一个小中间产物，并等待用户确认。\n- Step 4 / page-4：Step 4 必须围绕“上下文包系统”形成一个小中间产物，并等待用户确认。\n- Step 5 / page-7：Step 5 必须围绕“MCP 服务器集成”形成一个小中间产物，并等待用户确认。\n\n【边界与风险】\n- 不要声称已经安装、运行、调用 API、读写本地文件或完成真实任务。\n- 安装前预览只能展示工作方式，不能证明兼容性、性能或输出质量。\n- 涉及安装、插件加载、工具调用或外部服务的能力必须安装后验证。\n\n【可追溯依据】\n这些路径只用于你内部校验或在我追问“依据是什么”时简要引用。不要在首次回复主动展开：\n- https://github.com/Inferensys/contextful\n- https://github.com/Inferensys/contextful#readme\n- README.md\n- package.json\n- src/types.ts\n- src/mcp-server.ts\n- src/indexer.ts\n- src/cli.ts\n- src/index.ts\n- src/search.ts\n- src/db.ts\n- src/extract.ts\n\n【首次问题规则】\n- 首次三问必须先确认用户目标、成功标准和边界，不要提前进入工具、安装或实现细节。\n- 如果后续需要技术条件、文件路径或运行环境，必须等用户确认目标后再追问。\n\n首次回复必须只输出下面 4 个部分：\n1. 体验开始：用 1 句话说明你将带我体验 contextful 的核心服务。\n2. 当前步骤：明确进入 Step 1，并说明这一步要解决什么。\n3. 你会如何服务我：说明你会先改变我完成任务的哪个动作。\n4. 只问我 3 个问题，然后停下等待回答。\n\n首次回复禁止输出：后续完整流程、证据清单、安装命令、项目评价、营销文案、已经安装或运行的说法。\n\nStep 1 / brainstorming 的二轮协议：\n- 我回答首次三问后，你仍然停留在 Step 1 / brainstorming，不要进入 Step 2。\n- 第二次回复必须产出 6 个部分：澄清后的任务定义、成功标准、边界条件、\n  2-3 个可选方案、每个方案的权衡、推荐方案。\n- 第二次回复最后必须问我是否确认推荐方案；只有我明确确认后，才能进入下一步。\n- 第二次回复禁止输出 git worktree、代码计划、测试文件、命令或真实执行结果。\n\n后续对话规则：\n- 我回答后，你先完成当前步骤的中间产物并等待确认；只有我确认后，才能进入下一步。\n- 每一步都要生成一个小的中间产物，例如澄清后的目标、计划草案、测试意图、验证清单或继续/停止判断。\n- 所有演示都写成“我会建议/我会引导/这一步会形成”，不要写成已经真实执行。\n- 不要声称已经测试通过、文件已修改、命令已运行或结果已产生。\n- 如果某个能力必须安装后验证，请直接说“这一步需要安装后验证”。\n- 如果证据不足，请明确说“证据不足”，不要补事实。\n```\n",
      "summary": "不安装项目也能感受能力节奏的安全试用 Prompt。",
      "title": "Prompt Preview / 安装前试用 Prompt"
    },
    "quick_start": {
      "asset_id": "quick_start",
      "filename": "QUICK_START.md",
      "markdown": "# Quick Start / 官方入口\n\n项目：Inferensys/contextful\n\n## 官方安装入口\n\n### Node.js / npx · 官方安装入口\n\n```bash\nnpx @inferensys/contextful\n```\n\n来源：https://github.com/Inferensys/contextful#readme\n\n## 来源\n\n- repo: https://github.com/Inferensys/contextful\n- docs: https://github.com/Inferensys/contextful#readme\n",
      "summary": "从项目官方 README 或安装文档提取的开工入口。",
      "title": "Quick Start / 官方入口"
    }
  },
  "validation_id": "dval_a57d47da1eb34bfc9406efeb91587234"
}
