|
| 1 | +# llm_wiki Node.js Skill + MCP Server — 方案与进度 |
| 2 | + |
| 3 | +> 文档生成日期:2026-05-02 |
| 4 | +> 状态:**进行中** — ingest / deep-research 实现中,PR 待更新 |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 一、背景与目标 |
| 9 | + |
| 10 | +### 项目来源 |
| 11 | + |
| 12 | +[nashsu/llm_wiki](https://github.com/nashsu/llm_wiki) 是一个基于 Tauri v2(Rust + React/TypeScript)的桌面应用,核心功能是把本地源文件(Markdown/PDF/DOCX)通过 LLM 自动整理成结构化 Wiki。 |
| 13 | + |
| 14 | +### 需求 |
| 15 | + |
| 16 | +bid-sys 项目需要其后台核心逻辑,但 **不需要 GUI(Tauri 桌面应用)**,目标是: |
| 17 | + |
| 18 | +1. **Node.js Skill** — 纯命令行可调用的 wiki 管理工具 |
| 19 | +2. **MCP Server** — 将 wiki 操作暴露为 AI 可调用的工具(供 Claude Desktop / VS Code Copilot Chat 使用) |
| 20 | +3. **贡献 MCP** — 向 nashsu/llm_wiki 提交 PR,将 MCP 服务器作为官方插件 |
| 21 | + |
| 22 | +--- |
| 23 | + |
| 24 | +## 二、架构分析 |
| 25 | + |
| 26 | +### nashsu/llm_wiki 技术栈 |
| 27 | + |
| 28 | +``` |
| 29 | +llm_wiki/ |
| 30 | +├── src/ # React + TypeScript 前端(GUI 层) |
| 31 | +│ ├── lib/ # 核心业务逻辑(纯 TypeScript)⬅ 我们需要的 |
| 32 | +│ ├── stores/ # Zustand React 状态管理 |
| 33 | +│ └── commands/ # Tauri IPC 桥接层 |
| 34 | +├── src-tauri/ # Rust 后端(文件 I/O、PDF 提取、系统集成) |
| 35 | +``` |
| 36 | + |
| 37 | +### 两个注入点 |
| 38 | + |
| 39 | +所有 `src/lib/*.ts` 通过两个抽象层与 Tauri 交互: |
| 40 | + |
| 41 | +| 原始导入 | 功能 | Node.js 替代 | |
| 42 | +|---------|------|-------------| |
| 43 | +| `@/commands/fs` | 文件读写/列举 | `shims/fs-node.ts` | |
| 44 | +| `@/stores/*` | 应用状态(LLM 配置等)| `shims/stores-node.ts` | |
| 45 | + |
| 46 | +Tauri HTTP 代理(`tauri-fetch.ts`)已内置 `isNodeEnv` 检测,直接降级到 `globalThis.fetch`,无需额外适配。 |
| 47 | + |
| 48 | +--- |
| 49 | + |
| 50 | +## 三、实现方案 |
| 51 | + |
| 52 | +### 方案选择:自包含副本(Self-Contained Copy) |
| 53 | + |
| 54 | +将 `src/lib/*.ts` 复制并修补到 `skill/src/lib/`,修改所有 `@/` 路径别名为相对路径,完全独立于原始项目结构。 |
| 55 | + |
| 56 | +**优点:** 不依赖 tsconfig 路径别名,构建简单,易于移植 |
| 57 | +**缺点:** 需手工同步上游更新 |
| 58 | + |
| 59 | +### 目录结构 |
| 60 | + |
| 61 | +``` |
| 62 | +skill/ |
| 63 | +├── src/ |
| 64 | +│ ├── cli.ts # CLI 入口(8 个命令) |
| 65 | +│ ├── mcp-server.ts # MCP 服务器(7 个工具) |
| 66 | +│ ├── lib/ # 从 nashsu/llm_wiki 移植的核心库 |
| 67 | +│ │ ├── graph-relevance.ts |
| 68 | +│ │ ├── wiki-graph.ts |
| 69 | +│ │ ├── graph-insights.ts |
| 70 | +│ │ ├── search.ts |
| 71 | +│ │ ├── path-utils.ts |
| 72 | +│ │ ├── llm-client.ts # LLM SSE 流式调用 |
| 73 | +│ │ ├── detect-language.ts # Unicode 脚本语言检测 |
| 74 | +│ │ ├── output-language.ts # 输出语言指令构建 |
| 75 | +│ │ ├── frontmatter.ts # YAML frontmatter 解析器 |
| 76 | +│ │ ├── sources-merge.ts # Frontmatter 数组字段合并 |
| 77 | +│ │ ├── page-merge.ts # Wiki 页面内容合并(LLM) |
| 78 | +│ │ ├── ingest-sanitize.ts # LLM 输出清理 |
| 79 | +│ │ ├── ingest-cache.ts # SHA256 内容缓存 |
| 80 | +│ │ ├── project-mutex.ts # 按项目路径的异步互斥锁 |
| 81 | +│ │ ├── ingest.ts # 核心 ingest 流水线(待完成) |
| 82 | +│ │ └── web-search.ts # Tavily 搜索 API |
| 83 | +│ ├── shims/ # Tauri → Node.js 适配层 |
| 84 | +│ │ ├── fs-node.ts |
| 85 | +│ │ ├── stores-node.ts |
| 86 | +│ │ └── embedding-stub.ts |
| 87 | +│ └── types/ |
| 88 | +│ └── wiki.ts |
| 89 | +├── package.json |
| 90 | +└── tsconfig.json |
| 91 | +
|
| 92 | +mcp-server/ # 独立 MCP 包(用于 PR 提交) |
| 93 | +├── src/index.ts |
| 94 | +├── package.json |
| 95 | +└── README.md |
| 96 | +``` |
| 97 | + |
| 98 | +--- |
| 99 | + |
| 100 | +## 四、功能清单 |
| 101 | + |
| 102 | +### CLI 命令 |
| 103 | + |
| 104 | +| 命令 | 状态 | 说明 | |
| 105 | +|------|------|------| |
| 106 | +| `status` | ✅ | 统计 wiki 页面数量/类型 | |
| 107 | +| `search <query>` | ✅ | BM25+RRF 全文搜索 | |
| 108 | +| `graph` | ✅ | 构建并输出知识图谱(Louvain 社区检测)| |
| 109 | +| `insights` | ✅ | 发现意外关联 + 知识盲点 | |
| 110 | +| `lint` | ✅ | 检测孤立页面/断链/缺失字段 | |
| 111 | +| `init` | ✅ | 初始化 wiki 目录结构 | |
| 112 | +| `ingest <file>` | 🔄 | LLM 自动摄入源文件 → wiki 页面 | |
| 113 | +| `deep-research <topic>` | 🔄 | 网络搜索 → LLM 综合 → 自动摄入 | |
| 114 | + |
| 115 | +### MCP 工具 |
| 116 | + |
| 117 | +| 工具 | 状态 | 说明 | |
| 118 | +|------|------|------| |
| 119 | +| `wiki_status` | ✅ | 获取 wiki 统计 | |
| 120 | +| `wiki_search` | ✅ | 搜索 wiki 页面 | |
| 121 | +| `wiki_graph` | ✅ | 获取知识图谱 | |
| 122 | +| `wiki_insights` | ✅ | 获取 AI 见解 | |
| 123 | +| `wiki_lint` | ✅ | 检查 wiki 健康度 | |
| 124 | +| `wiki_ingest` | 🔄 | 摄入源文件 | |
| 125 | +| `wiki_deep_research` | 🔄 | 深度研究 | |
| 126 | + |
| 127 | +--- |
| 128 | + |
| 129 | +## 五、环境变量配置 |
| 130 | + |
| 131 | +```bash |
| 132 | +# LLM 配置(ingest / deep-research 必需) |
| 133 | +export LLM_PROVIDER=openai # openai | anthropic | ollama | deepseek |
| 134 | +export OPENAI_API_KEY=sk-... |
| 135 | +export LLM_MODEL=gpt-4o-mini |
| 136 | +export LLM_BASE_URL= # 自定义端点(可选) |
| 137 | + |
| 138 | +# 网络搜索(deep-research 必需) |
| 139 | +export TAVILY_API_KEY=tvly-... |
| 140 | + |
| 141 | +# 输出语言(可选,默认 auto 自动检测) |
| 142 | +export WIKI_OUTPUT_LANGUAGE=auto # auto | English | Chinese | Japanese | ... |
| 143 | + |
| 144 | +# 调试 |
| 145 | +export SKILL_VERBOSE=1 # 输出详细日志到 stderr |
| 146 | +``` |
| 147 | + |
| 148 | +--- |
| 149 | + |
| 150 | +## 六、依赖 |
| 151 | + |
| 152 | +```json |
| 153 | +{ |
| 154 | + "dependencies": { |
| 155 | + "graphology": "^0.25.4", |
| 156 | + "graphology-communities-louvain": "^2.0.0", |
| 157 | + "@modelcontextprotocol/sdk": "^1.1.0", |
| 158 | + "js-yaml": "^4.1.0" |
| 159 | + } |
| 160 | +} |
| 161 | +``` |
| 162 | + |
| 163 | +--- |
| 164 | + |
| 165 | +## 七、开发进度 |
| 166 | + |
| 167 | +### 已完成 |
| 168 | + |
| 169 | +- [x] 分析 nashsu/llm_wiki 架构,识别 Tauri 注入点 |
| 170 | +- [x] 创建 `shims/fs-node.ts` — Tauri IPC → Node.js fs 适配 |
| 171 | +- [x] 创建 `shims/stores-node.ts` — Zustand → 模块级状态,支持 env 配置 LLM |
| 172 | +- [x] 创建 `shims/embedding-stub.ts` — 向量搜索优雅降级 |
| 173 | +- [x] 移植并修补所有图谱库(graph-relevance, wiki-graph, graph-insights) |
| 174 | +- [x] 移植搜索库(BM25+RRF,向量可选) |
| 175 | +- [x] 移植 path-utils(纯工具函数) |
| 176 | +- [x] 实现 CLI 6 个命令:status/search/graph/insights/lint/init |
| 177 | +- [x] 实现 MCP 服务器 5 个工具 |
| 178 | +- [x] npm install + tsc 构建通过 |
| 179 | +- [x] 端到端测试:合成 wiki 数据验证所有命令 |
| 180 | +- [x] Fork nashsu/llm_wiki → toughhou/llm_wiki |
| 181 | +- [x] 移植 llm-client.ts(OpenAI 兼容 SSE 流式调用) |
| 182 | +- [x] 移植 detect-language.ts(Unicode 脚本检测) |
| 183 | +- [x] 移植 output-language.ts |
| 184 | +- [x] 移植 frontmatter.ts(js-yaml 解析) |
| 185 | +- [x] 移植 sources-merge.ts(数组字段合并) |
| 186 | +- [x] 移植 page-merge.ts(LLM 辅助页面合并) |
| 187 | +- [x] 移植 ingest-sanitize.ts(LLM 输出清洗) |
| 188 | +- [x] 移植 ingest-cache.ts(SHA256 增量缓存) |
| 189 | +- [x] 移植 project-mutex.ts(并发保护) |
| 190 | +- [x] 移植 web-search.ts(Tavily API) |
| 191 | +- [x] 提交 PR #117 到 nashsu/llm_wiki |
| 192 | + |
| 193 | +### 进行中 |
| 194 | + |
| 195 | +- [ ] 完成 ingest.ts — 两阶段 LLM 流水线(分析 → 生成 → 写文件) |
| 196 | +- [ ] 完成 deep-research.ts — 网络搜索 → LLM 综合 → auto-ingest |
| 197 | +- [ ] CLI 添加 ingest / deep-research 命令 |
| 198 | +- [ ] MCP 服务器添加 wiki_ingest / wiki_deep_research 工具 |
| 199 | +- [ ] 端到端测试(需真实 LLM API Key) |
| 200 | +- [ ] 更新 PR #117 |
| 201 | + |
| 202 | +### 待完成 |
| 203 | + |
| 204 | +- [ ] sweep-reviews(批量审核 wiki 页面) |
| 205 | +- [ ] 嵌入向量搜索(可选,需 embedding API) |
| 206 | + |
| 207 | +--- |
| 208 | + |
| 209 | +## 八、PR 提交记录 |
| 210 | + |
| 211 | +| PR | 仓库 | 分支 | 状态 | |
| 212 | +|----|------|------|------| |
| 213 | +| #117 | nashsu/llm_wiki | feat/mcp-server | 开放中,待更新 | |
| 214 | + |
| 215 | +--- |
| 216 | + |
| 217 | +## 九、本地测试方法 |
| 218 | + |
| 219 | +```bash |
| 220 | +cd skill && npm install && npm run build |
| 221 | + |
| 222 | +# 测试基础命令 |
| 223 | +node dist/cli.js status /path/to/wiki-project |
| 224 | +node dist/cli.js search "machine learning" /path/to/wiki-project |
| 225 | +node dist/cli.js graph /path/to/wiki-project |
| 226 | +node dist/cli.js insights /path/to/wiki-project |
| 227 | +node dist/cli.js lint /path/to/wiki-project |
| 228 | + |
| 229 | +# 测试 ingest(需 LLM API Key) |
| 230 | +export OPENAI_API_KEY=sk-xxx |
| 231 | +node dist/cli.js ingest /path/to/source.md /path/to/wiki-project |
| 232 | + |
| 233 | +# 测试 deep-research(需 LLM + Tavily) |
| 234 | +export TAVILY_API_KEY=tvly-xxx |
| 235 | +node dist/cli.js deep-research "transformer architecture" /path/to/wiki-project |
| 236 | + |
| 237 | +# 启动 MCP 服务器 |
| 238 | +node dist/mcp-server.js |
| 239 | +``` |
| 240 | + |
| 241 | +--- |
| 242 | + |
| 243 | +## 十、相关资源 |
| 244 | + |
| 245 | +- 上游仓库:https://github.com/nashsu/llm_wiki |
| 246 | +- 本仓库(fork):https://github.com/toughhou/llm_wiki |
| 247 | +- PR #117:https://github.com/nashsu/llm_wiki/pull/117 |
| 248 | +- bid-sys 项目:https://github.com/toughhou/bid-sys |
0 commit comments