{"_id":"@aylina_ankali/code-rag-mcp","_rev":"2-bbfda00f989c05215af98965dae24c62","name":"@aylina_ankali/code-rag-mcp","dist-tags":{"latest":"0.3.1"},"versions":{"0.3.0":{"name":"@aylina_ankali/code-rag-mcp","version":"0.3.0","keywords":["code-rag","rag","semantic-search","code-search","mcp","model-context-protocol","qdrant","ollama","bge-m3","embedding","vector-search","deepseek","dsh"],"license":"MIT","_id":"@aylina_ankali/code-rag-mcp@0.3.0","maintainers":[{"name":"aylina_ankali","email":"ankali_aylina@qq.com"}],"homepage":"https://github.com/Ankali-Aylina/code-rag#readme","bugs":{"url":"https://github.com/Ankali-Aylina/code-rag/issues"},"bin":{"code-rag":"dist/main.js"},"dist":{"shasum":"a39e70981687cd432a244a59ac3b386e41364b8c","tarball":"https://registry.npmjs.org/@aylina_ankali/code-rag-mcp/-/code-rag-mcp-0.3.0.tgz","fileCount":35,"integrity":"sha512-c4sFY3sJjb0NxSOrAk3WQV2W7KvwGWY8Y4kFWXbiGW+fFQDNMKKEZupVgU00jMrmdldu98IYAEFAJawCX8pmCA==","signatures":[{"sig":"MEUCIBjUoXhQUOLgZcBdq8WRf/xLnJuw4C867X2C8kzaJ7gfAiEAya8waOe/TbQju/GgPXGFniLBTsrvGjQJ1dtT1sDQooI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":362416},"type":"module","engines":{"node":">=20"},"gitHead":"f011df49b1b2764053c54a6d6df847cbac4e2c62","private":false,"scripts":{"test":"npm run build && node --test test/chunker.test.mjs","build":"tsc -p tsconfig.json","index":"node dist/main.js index","serve":"node dist/main.js serve","setup":"node scripts/setup.mjs","smoke":"node scripts/smoke.mjs","search":"node dist/main.js search","status":"node dist/main.js status","prepack":"npm run build","prepare":"npm run build","index:full":"node dist/main.js index --full","selftest:panel":"node scripts/selftest-panel.mjs","selftest:client":"node scripts/selftest-client.mjs"},"_npmUser":{"name":"aylina_ankali","email":"ankali_aylina@qq.com"},"repository":{"url":"git+https://github.com/Ankali-Aylina/code-rag.git","type":"git"},"_npmVersion":"11.17.0","description":"Code RAG MCP server: semantic indexing and retrieval of a local codebase (declaration-aware chunking + bge-m3 embeddings + Qdrant hybrid search). Exposes search_code / index_codebase / index_status / index_cancel / set_root MCP tools and a CLI, plus a loc","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/code-rag-mcp_0.3.0_1787975055897_0.5518340776513073","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aylina_ankali/code-rag-mcp","version":"0.3.1","private":false,"type":"module","description":"Code RAG MCP server: semantic indexing and retrieval of a local codebase (declaration-aware chunking + bge-m3 embeddings + Qdrant hybrid search). Exposes search_code / index_codebase / index_status / index_cancel / set_root MCP tools and a CLI, plus a loc","keywords":["code-rag","rag","semantic-search","code-search","mcp","model-context-protocol","qdrant","ollama","bge-m3","embedding","vector-search","deepseek","dsh"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Ankali-Aylina/code-rag.git"},"bin":{"code-rag":"dist/main.js"},"scripts":{"build":"tsc -p tsconfig.json","prepare":"npm run build","prepack":"npm run build","setup":"node scripts/setup.mjs","serve":"node dist/main.js serve","index":"node dist/main.js index","index:full":"node dist/main.js index --full","search":"node dist/main.js search","status":"node dist/main.js status","smoke":"node scripts/smoke.mjs","selftest:panel":"node scripts/selftest-panel.mjs","selftest:client":"node scripts/selftest-client.mjs","test":"npm run build && node --test test/chunker.test.mjs"},"engines":{"node":">=20"},"dependencies":{"@modelcontextprotocol/sdk":"^1.12.0","zod":"^4.4.3"},"devDependencies":{"@types/node":"^24.0.0","typescript":"^5.6.0"},"gitHead":"b0b39c6f25bbcaad316acf724d4a9c74c5318d5c","_id":"@aylina_ankali/code-rag-mcp@0.3.1","bugs":{"url":"https://github.com/Ankali-Aylina/code-rag/issues"},"homepage":"https://github.com/Ankali-Aylina/code-rag#readme","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-S9ld1R2g+e9RjbpMzICbtCoUzGNZQLoaZXYc8WKWA445HLI8kRIh6Q1+jAlKjPY+rjLMcVM86Bnw8LvAzTunpQ==","shasum":"310868e1933b5bf7020eaa889df2d4b79439ee0e","tarball":"https://registry.npmjs.org/@aylina_ankali/code-rag-mcp/-/code-rag-mcp-0.3.1.tgz","fileCount":36,"unpackedSize":390629,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGRYryvTtwjqyDDaxfmaTp5hQlTTSzt6Z9OnsiVOUzm1AiEA0vl0GiK8YtJBorKtVV6TzPlhEU0q2sw8UV6HZqgJwr4="}]},"_npmUser":{"name":"aylina_ankali","email":"ankali_aylina@qq.com"},"directories":{},"maintainers":[{"name":"aylina_ankali","email":"ankali_aylina@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/code-rag-mcp_0.3.1_1787980535407_0.5310507397833177"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T03:44:15.724Z","modified":"2026-08-29T05:15:35.720Z","0.3.0":"2026-08-29T03:44:16.046Z","0.3.1":"2026-08-29T05:15:35.571Z"},"bugs":{"url":"https://github.com/Ankali-Aylina/code-rag/issues"},"license":"MIT","homepage":"https://github.com/Ankali-Aylina/code-rag#readme","keywords":["code-rag","rag","semantic-search","code-search","mcp","model-context-protocol","qdrant","ollama","bge-m3","embedding","vector-search","deepseek","dsh"],"repository":{"type":"git","url":"git+https://github.com/Ankali-Aylina/code-rag.git"},"description":"Code RAG MCP server: semantic indexing and retrieval of a local codebase (declaration-aware chunking + bge-m3 embeddings + Qdrant hybrid search). Exposes search_code / index_codebase / index_status / index_cancel / set_root MCP tools and a CLI, plus a loc","maintainers":[{"name":"aylina_ankali","email":"ankali_aylina@qq.com"}],"readme":"# code-rag — 本地代码库语义索引与检索（DSH 模式）\n\n对本地代码库（C++ / Java 为主，支持中英文注释混合）做**声明感知分块 → Ollama 向量化 → Qdrant 存储**，\n为 DSH 会话提供五个 MCP 工具 + 一个可视化索引面板：\n\n| 工具（模型视角） | 作用 |\n|---|---|\n| `mcp__code_rag__search_code` | 自然语言检索代码，返回文件路径 / 函数名 / 行号 / 相似度 / 片段（按 root 隔离） |\n| `mcp__code_rag__index_codebase` | **异步**索引：立即返回 taskId，后台执行，**不受调用超时限制**；`full: true` 只重建当前根 |\n| `mcp__code_rag__index_status` | 索引状态 + **运行中任务的实时进度**（百分比/文件/分块/错误明细） |\n| `mcp__code_rag__index_cancel` | 取消当前根的运行中任务 |\n| `mcp__code_rag__set_root` | 切换当前代码库根（换工作区/项目后的第一步） |\n\n> 工具名前缀 `mcp__code_rag__` 由 DSH 的 MCP 桥接插件（`@deepseek-ai/dsh-mcp-client`）按\n> `mcp__<serverName>__<rawName>` 规则生成，`search_code` 等是 MCP 服务器侧的原始名。\n\n## 索引面板（Roo Code 风格）\n\nMCP 服务器内置本地 HTTP 端点（`127.0.0.1:8756`，占用自动上探），会话输入框上方的\n**Code RAG 索引状态条**（动态 Cordis 插件）直接读取它：\n\n- 显示：当前根、索引状态、**进行中任务的进度条**（% / 文件 / 分块）、错误明细；\n- 按钮：**开始索引**（增量）/ **全量重建** / **取消**；\n- 数据与按钮操作与 MCP 工具完全同源（同一任务管理器）；\n- **目标根 = 当前会话工作区**（面板默认对工作区操作；服务器根不同会提示）；\n- 端口发现：探测 8756-8786 全部端口并**选择 startedAt 最新**（避免连到残留旧服务器）；\n- 所有请求带 8s 超时，服务器无响应显示离线而非永久挂起。\n\n**设置与诊断页**（插件 v1.1.0+）：DSH 设置 →「Web 插件」区新增 **Code RAG** 卡片，\n一键检测索引服务器 / Qdrant / Ollama / 模式预设 / 配置文件并列出问题清单；可在线修改\n`<root>/.code-rag/config.json`（Qdrant/Ollama 地址、嵌入模型、维度、集合、端口、\n分块行数）、启动/取消索引、一键重新生成预设（`npm run setup`）。数据经插件 host\n半部的 `/api/code-rag/*` 环回端点（仅本机来源可访问，详见插件 README）。\n\n插件源码（动态版）：`plugins/index-panel.client.js`，可交给 `cordis_define` 临时启用。\n**已固化**：`plugins/dsh-code-rag-index-panel/` 是常驻版 npm 插件（ModuleLoader 格式），\n由 `npm run setup` 以 `file:` 依赖装入 web profile 的 bundles 列表（`~/.dsh/profiles/web/package.json`），\n重启 DSH 后所有会话生效；此后修改 `lib/client.js` 由 client-hmr 轮询自动热更新（无需刷新页面）。\n\n> **没有写死的路径**：仓库内所有机器相关路径都是占位符（`{{CODE_RAG_DIR}}` 等），\n> 由 `npm run setup` 在安装时替换为实际绝对路径。换机器/挪目录后重新运行一次即可。\n\n## 目录结构\n\n```\ncode-rag/\n├── package.json              # npm 脚本：setup / build / serve / index / search / status / smoke\n├── tsconfig.json\n├── src/\n│   ├── main.ts               # CLI 入口（serve | index | search | status）\n│   ├── server.ts             # MCP 服务器：五工具（异步任务 + HTTP 面板端点）+ stdio\n│   ├── config.ts             # 配置解析：默认值 < 配置文件 < 环境变量 < CLI\n│   ├── taskfile.ts           # 任务状态共享文件（index-task.json / panel.json）\n│   ├── walk.ts               # 文件扫描：ignore 规则、白名单、二进制/超大文件过滤\n│   ├── chunker.ts            # 声明感知分块（花括号深度 + 签名识别，150/20 兜底）\n│   ├── embedder.ts           # Ollama /api/embed 批量嵌入客户端（支持取消）\n│   ├── qdrant.ts             # Qdrant REST 客户端（集合/upsert/检索/删除，UUIDv5 确定性 ID）\n│   ├── indexer.ts            # 增量索引编排（进度回调 + 可取消 + 原子状态文件）\n│   ├── searcher.ts           # 语义检索 + 结果格式化\n│   └── state.ts              # 状态文件（<root>/.code-rag/state.json）读写\n├── preset/                   # Code RAG 模式预设模板（占位符，由 setup 生成到 ~/.dsh）\n│   ├── agent.cordis.yml\n│   ├── preset.yml\n│   └── skills/code-rag/SKILL.md\n├── plugins/index-panel.client.js  # 索引面板动态版（cordis_define 用，Client 半部）\n│   └── dsh-code-rag-index-panel/    # 索引面板常驻版（npm 插件：package.json + lib/；plugins/ 为市场 CI 认可的子包目录）\n├── scripts/setup.mjs         # ★ 一键接入：生成预设 + 同步 web profile（幂等，零依赖）\n├── scripts/smoke.mjs         # 端到端冒烟测试（真实 Qdrant/Ollama）\n├── scripts/verify-async.mjs  # 异步索引/进度/取消/HTTP 端点验证\n├── testdata/sample-repo/     # 演示代码库（Java + C++，中英注释）\n├── testdata/big-repo/        # 压力测试代码库（1200 个生成文件）\n├── code-rag.config.example.json\n└── cordis.patch.example.yml  # 全局接入 DSH 的补丁片段（方案 B，占位符示例）\n```\n\n## 一、安装与构建\n\n```bash\n# 前置（用户已手动完成）：Qdrant 容器(6333) + Ollama(11434)\n# 默认嵌入模型 bge-m3（多语言 + 代码，1024 维，中文/英文查询均可靠）：\nollama pull bge-m3\ncd code-rag\nnpm install\nnpm run build          # tsc → dist/\n```\n\n> 若想用回 nomic-embed-text（英文/标识符查询可用，中文语义查询效果差），\n> 改配置 `embedModel: nomic-embed-text` + `dimensions: 768`，然后全量重建索引。\n\n## 二、接入 DSH（两种方案）\n\n### 方案 A：code-rag 模式（推荐，一键完成）\n\n```bash\ncd code-rag\nnpm install && npm run build\nnpm run setup            # 生成预设 + 同步面板插件（幂等，可重复执行）\n```\n\n`npm run setup`（scripts/setup.mjs，零依赖）会根据**自身实际位置**自动完成：\n\n- 生成模式预设 `~/.dsh/.agent-presets/code-rag/`（模板见 `preset/`，其中的\n  `{{CODE_RAG_DIR}}` / `{{CODE_ROOT}}` 占位符被替换为绝对路径）；\n- 把索引面板插件 `dsh-code-rag-index-panel` 以 `file:` 依赖同步进\n  `~/.dsh/profiles/web/package.json`（含 bundle 条目），并同步已安装副本；\n- 可选参数：`--root <代码库根目录>`（服务器默认根，仅兜底）、`--no-panel`。\n\n> **换机器 / 挪目录后只需重新运行 `npm run setup`**，无需手工改任何路径。\n\n然后：\n\n1. 重启 DSH，在模式选择器里选 **Code RAG 模式**，新建会话（保持其运行——索引服务器随之启动）；\n2. **换工作区时先让模型调用 `mcp__code_rag__set_root`（root 传当前工作目录绝对路径）**，\n   再执行 `mcp__code_rag__index_codebase` 建立索引（persona/技能会引导模型自动完成）；\n3. 之后提问“哪里实现了 X / 找一下处理超时的代码”，模型自动调用 `mcp__code_rag__search_code`。\n\n> 多根隔离：每个仓库的向量按 root 命名空间隔离（检索/删除/全量重建都只作用于\n> 当前根），多个项目可共存于一个 Qdrant 集合；`full: true` 不会误删其他仓库。\n> 集合未建立索引时工具返回友好提示（“请先调用 index_codebase”），不会 404 报错。\n\n生成的 `agent.cordis.yml` 里的 `mcp-code-rag` 行（等价模板，占位符由 setup 替换）：\n\n```yaml\n- id: mcp-code-rag\n  name: '@deepseek-ai/dsh-mcp-client'\n  config:\n    serverName: code_rag          # 工具名前缀\n    transport: stdio\n    command: node\n    args: ['<CODE_RAG_DIR>/dist/main.js', 'serve', '--root', '<CODE_ROOT>']\n    cwd: '<CODE_ROOT>'            # = 默认代码库根目录\n    toolCallTimeoutMs: 300000     # 索引已异步化，此超时只影响 index_status/search_code 等轻量调用\n    failOnStartupError: false\n```\n\n### 方案 B：全局接入（所有会话可见）\n\n把 `cordis.patch.example.yml` 里的 `insert` 片段合并进\n`<DSH_HOME>/profiles/web/cordis.patch.yml`（其中的 `<CODE_RAG_DIR>` / `<CODE_ROOT>`\n占位符换成你的实际绝对路径），重启 DSH。\n\n## 三、索引命令\n\n```bash\n# 增量索引（默认代码库根目录 = 进程 cwd，可 --root 指定；多个仓库互不干扰）\nnode dist/main.js index --root <代码库根目录>\n\n# 全量重建（只清空该 root 的向量后重新索引，不影响其他仓库）\nnode dist/main.js index --full --root <代码库根目录>\n\n# 只统计不写入（演练）\nnode dist/main.js index --dry-run\n\n# 查看状态\nnode dist/main.js status --root <代码库根目录>\n```\n\n增量原理：`<root>/.code-rag/state.json` 记录每个文件的 (mtime, size) 指纹。\n未变化跳过；变化/新增 → 删除旧点 → 重嵌（确定性的 UUIDv5(root:file:startLine) 保证幂等覆盖）；\n磁盘上消失 → 按 `payload.file + payload.root` 精确清理。进程中断不损坏状态（临时文件 + 原子 rename）。\nCLI 索引进度实时打印到 stderr 并写入 `<root>/.code-rag/index-task.json`（索引面板同源读取）。\n\n## 三·五、异步索引（会话内）\n\n`index_codebase` 默认异步：立即返回 taskId，后台执行——大项目不再超时。\n进度经 `index_status` 轮询（模型会每 30-60 秒汇报一次），`index_cancel` 可取消；\n会话输入框上方的索引面板显示同样的进度并提供按钮。\n\n## 四、检索（混合检索）\n\n`search_code` 采用**混合检索**：查询文本同时生成稠密语义向量（bge-m3）+ BM25\n稀疏向量（标识符拆分/CJK bigram tokenizer），Qdrant Query API 以 **RRF 融合**两条\n通道——自然语言语义（\"蓝牙重连逻辑\"）与精确标识符/错误串/数字（`reconnectDevice`、\n`6333`、`C3861`）一次调用同时覆盖，精确命中分数通常为 1.000。\n\n```bash\nnode dist/main.js search \"命令行参数解析\" --limit 5\nnode dist/main.js search \"reconnectDevice\" --dir src --limit 5\n```\n\n## 五、分块策略（chunker.ts）\n\n“穷人的 AST”——不依赖 tree-sitter：\n\n1. 轻量词法扫描逐行统计花括号深度（忽略字符串/注释内的括号）；\n2. 逐行维护作用域栈，识别声明签名（支持 `public/private` 修饰符、`template<>`、\n   类/接口/struct/namespace、多行签名回溯 ≤4 行——回溯不越过已打开作用域，\n   排除 `if/for/while` 等控制流与 lambda）；\n3. **每个命名声明（函数/类）是一个独立块**，其前导文档注释（Javadoc/Doxygen）自动\n   并入块内，保证“文件 + 函数名”级别的检索精度；\n4. 超大声明（> 150 行）与无结构区域（文件头、命名空间外代码）内部用滑动窗口\n   **150 行 / 重叠 20 行**——即需求里的兜底策略；\n5. 纯结构碎块（孤立的右括号等）自动丢弃，避免污染检索；\n6. 每个块携带 `file / function / class / start_line / end_line`，嵌入文本带定位头\n   （`// src/foo.cpp :: bar (lines 12-34)`），提升检索精度。\n\n分块回归测试：`npm test`（node:test，12 个用例固化历史边界——行尾注释回溯、\n`} else {` 撕裂、多行签名、窗口切分、稀疏 tokenizer 等）。\n\n## 六、配置\n\n优先级：内置默认 < `<root>/.code-rag/config.json` < 环境变量 `CODE_RAG_*` < CLI。\n把 `code-rag.config.example.json` 复制到 `<root>/.code-rag/config.json` 后修改。\n常用项：`qdrantUrl`、`ollamaUrl`、`embedModel`、`dimensions`、\n`chunkSize/chunkOverlap`、`ignore`（目录忽略）、`extensions`（语言白名单）、\n`httpPort`（索引面板 HTTP 端点端口，默认 8756，占用自动上探；也可用环境变量\n`CODE_RAG_HTTP_PORT` 覆盖。注意索引面板探测 8756-8786，改到区间外时需同步修改\n面板插件 `lib/client.js` 里的 `PORT_BASE`）、\n`embedConcurrency`/`embedRetries`（嵌入并发与失败重试，默认 4/3）。\n（`root` 不在此配置：由启动参数 `--root` / 当前工作目录决定，多仓库用 `set_root` 切换。）\n\n**安全**：面板 HTTP 端点只接受本机来源（`127.0.0.1`/`localhost` 的 Origin），\n其他网页来源一律 403。\n\n**换嵌入模型**：改 `embedModel` 与 `dimensions` 后 `index`（增量即可）会自动\n检测到状态指纹与模型不匹配并全量重建。默认 bge-m3 = 1024 维；\nnomic-embed-text = 768 维。bge-m3 对中英混合注释的检索质量显著更好。\n\n## 七、冒烟测试\n\n```bash\nnpm run build && npm run smoke\n```\n\n依次验证：CLI 全量索引 → 中文查询「命令行参数解析」命中 `App.parseArgs` →\n中文查询「指数退避重试算法」命中 `engine.retryWithBackoff` →\nMCP 握手（initialize / tools/list 四工具 / search_code / set_root / 空根 index_status 友好输出）。\n\n## 八、工作原理速览\n\n```\n会话提问 ──> DSH 模型 ──> mcp__code_rag__search_code（MCP stdio）\n                              │\n                    code-rag 服务器（node dist/main.js serve）\n                    ├─ 查询嵌入：Ollama /api/embed（bge-m3, 1024 维）\n                    └─ 相似检索：Qdrant REST /points/search（Cosine）\n                              │\n                         返回 file + function + 行号 + 片段\n```\n\n索引路径：`walk 扫描 → chunker 分块 → embedder 批量嵌入 → qdrant upsert（UUIDv5 幂等）→\nstate.json 指纹回写`。删除路径：`状态里有、磁盘上没有 → deleteByFile(payload.file 过滤)`。\n\n## 九、常见问题\n\n| 现象 | 处理 |\n|---|---|\n| `search_code` 提示“尚未建立索引” | 调用 `index_codebase`（可加 root 指定仓库）后重试 |\n| 点“开始索引”没反应/卡住 | 旧版服务器残留会占端口：重启 DSH 让新服务器（stdin 关闭即退出）接管；面板已选最新实例 + 8s 超时兜底 |\n| 索引显示“0 个文件” | 服务器已加 0 文件防护：root 配错或 ignore 把源码目录排除了会明确报错；点击面板根名可切换 |\n| 大项目索引超时 | 已解决：`index_codebase` 默认异步立即返回，后台执行；用 `index_status` 看进度 |\n| 看不到索引进度 | `index_status`（模型会汇报）；或启用索引面板（输入框上方状态条 + 按钮） |\n| 换工作区后检索的还是旧项目 | 先 `set_root` 切到当前工作目录，再 `index_codebase` |\n| 检索结果混入别的项目 | 多根已按 root 隔离；确认 `index_status` 的当前根是否正确 |\n| 索引任务卡住想停 | `index_cancel` 或面板的“取消”按钮 |\n| Ollama 找不到模型 | `ollama pull bge-m3`（默认）或 `ollama pull nomic-embed-text` |\n| 向量维度不匹配报错 | 模型换过 → 同步改 `dimensions` + `index --full` |\n| 中文检索不准 | 确认默认模型为 bge-m3（1024 维）；nomic-embed-text 中文语义弱 |\n| 端口不通 | `docker ps` 看 Qdrant；`curl localhost:11434/api/tags` 看 Ollama |\n| MCP 工具没出现 | 检查 DSH 日志中 `mcp-client(code_rag)` 行；确认 `dist/main.js` 路径存在 |\n| 大仓库索引慢 | 先看是不是把生成/构建目录扫进去了：`node dist/main.js index --dry-run --root <仓库>` 看 scanned 数。VS C++ 项目默认已忽略 `Temperat.*`（MSBuild 中间目录）、`x64`、`installer`；其他项目的生成目录加到配置 `ignore`。真慢时调大 `embedBatchSize` / `embedConcurrency`（默认 32/4） |\n| 生成文件进了索引 | 在 `<root>/.code-rag/config.json` 的 `ignore` 里加目录模式（支持 `*`），然后 `index --full` |\n","readmeFilename":"README.md"}