CodeWiki MCP Server 架构深化扫描

扫描聚焦 codewiki/mcp/ 包 · 目标:找出可深化的摩擦点,供挑选后逐一深挖

扫描范围 codewiki/mcp 工具数 33 报告日期 2026-08-15 关联任务 CodeWiki 架构深化分析
2108
registry.py 行数(schema 占 ~85%)
7
同款 output_dir 解析散落文件数
10+
frontmatter 解析重复位置
2
个 >1000 行 tools 文件
1
个绕过 dispatch 的独立 CLI(_ide_hook)

概览 · 发现的深化机会

HIGH
#1 output_dir / session 解析逻辑复制粘贴 7 处
knowledge_loop.py capture_conversation.py distill_conversation.py doc_writer.py

同一段「解析 output_dir → 解析/恢复 session → 派生 repo_path → 失败抛错」的逻辑在多个 handler 里各写一份。调用方想改一处行为(比如 session 恢复策略)要同步改 7 个文件。

# capture_conversation.py 与 distill_conversation.py 各有一份几乎相同的 _resolve_output_dir() # knowledge_loop.py 中 handle_ingest_note / handle_query_wiki / handle_confirm_note … 6+ 处同构解析

注意workspace_result.py 里已存在 resolve_session() 公共辅助,但多数 handler 没有复用,仍各自手写。

深化方向:收敛到一个 resolve_workspace(arguments) → WorkspaceContext 辅助(封装 output_dir / session / repo_path 三元组解析),7 处改为单点调用。纯删减、无行为变化,风险最低。
HIGH
#2 frontmatter 解析逻辑分散在 10+ 个文件
cache.py doc_writer.py knowledge_loop.py source_ingest.py wiki_lint.py

「读 YAML frontmatter → 取某 key」的辅助函数分别存在于 cache.py_parse_frontmatter_dict_extract_frontmatter)、doc_writer.py(74 处引用 frontmatter)、knowledge_loop.py(42 处)、source_ingest.py(32 处)、wiki_lint.py(20 处)等。

# cache.py:112 def _parse_frontmatter_dict(text) … # cache.py:1515 def _extract_frontmatter(content, key) … # 但 doc_writer / knowledge_loop / source_ingest 各自又实现了一版

同样字段(type / title / related_modules…)在不同文件的解析容错行为可能不一致——这是潜在的隐性 bug 来源。

深化方向:抽一个 codewiki/mcp/wiki_fm.py(或并入现有公共模块)统一 frontmatter 读写,所有文件改为 import 单点。收效面最广。
MED
#3 registry.py 巨型 schema 文件 —— 工具定义与实现分离
registry.py(2108 行) vs tools/*.py

2108 行里约 85% 是 纯 schema 数据(超长 description 字符串 + inputSchema dict),真正的 dispatch 逻辑只有 ~60 行。每个工具的知识被拆在两处:schema 在 registry.py,handler 在 tools/xxx.py。改一个工具要跳两个文件、对齐两处。

# registry.py: ~1800 行 Tool(name=…, description=「数百字」, inputSchema={…}) # 而 handler 实现: tools/knowledge_loop.py 等
深化方向:把 schema 收编到各 handler 文件内(如 TOOL_DEF = Tool(...) + REGISTER(tool) 声明式注册),registry 只留 dispatch 与汇总。让「一个工具的完整知识就近可见」。
MED
#4 _ide_hook.py 是绕过 dispatch 的独立 CLI 入口
_ide_hook.py(可 python -m 直接跑)

名义上是 mcp 包的内部模块,实际是 独立 CLI 入口:直接 import handle_capture_conversation,手工组装 arguments dict,绕过 registry 的 schema 校验与 dispatch 管线。

# _ide_hook.py: from codewiki.mcp.tools.capture_conversation import handle_capture_conversation # … 手工构造 arguments(绕过 inputSchema 校验)

后果:hook 路径与 MCP 路径的 参数行为可能漂移(校验、默认值、错误格式),同一个 capture_conversation 语义在两处不同。

深化方向:让 hook 走同一 dispatch(构造合法 arguments 交给 registry),或至少共享同一参数规范化函数。
MED
#5 workspace.py docstring 与实际实现不符 + 死参数
workspace.py

模块 docstring 声明目录布局是 .codewiki/sessions/{session_id}/,但实际实现已改为 固定的 .codewiki/workspace/(见 __init__ 注释「Use a fixed directory per repo instead of per-session」)。同时构造器接收 session_id 参数但完全未使用——死参数。

# workspace.py:10 .codewiki/sessions/{session_id}/ ← docstring 过时 # workspace.py:59 def __init__(self, repo_path, session_id="") # session_id 从未被使用 # workspace.py:63 self.root = repo_path / _WORKSPACE_REL # 实际固定目录
深化方向:docstring 对齐实现、删除 session_id 死参数(改调用方),消除「文档 vs 行为」漂移。
LOW
#6 session.find_or_restore 隐式副作用
session.py knowledge_loop.py

查询类工具只传 repo_path 时,find_or_restore()静默从 SQLite 恢复 session。knowledge_loop.py 里甚至有一段注释承认:该恢复可能返回 stale/incorrect path,然后手动用 repo_path 覆盖。

# knowledge_loop.py: # find_or_restore() 可能返回 stale/incorrect path,优先用显式 repo_path # session = _sf.find_or_restore(...) # 隐式副作用

「调用查询工具 → 静默重建分析 session」对外部是不可见的魔法行为。

深化方向:将恢复逻辑显式化为「优先显式参数,缺省才尝试恢复」,并在调用点注释/文档化该副作用。
LOW
#7 dispatch 内嵌 CBM enrichment 后置钩子
registry.py cbm_integration.py

dispatch 中对 analyze_repo / analyze_impact / query_cross_service 的结果做 CBM 增强改写(解析 JSON 后注入)。这是对 handler 返回值的 隐式契约:非 JSON 字符串的返回会静默跳过增强。

深化方向:把 enrichment 收编为 handler 的显式装饰器/包装器,或至少在文档中明确返回值契约。

文件体量热力图(mcp/tools)

knowledge_loop 1784 wiki_lint 1517 doc_writer 1478 prompt_server 1246 distill_conversation 1027 analysis 908 source_ingest 643 capture_conversation 619 task_manager 510 wiki_index 481 …其余 20 个 < 500

🎯 挑选一个方向开始深挖

每个方向都会先做「删除测试 / 概念收敛」,确认复杂度真的消失而不是搬走,然后给出一份实施方案供你 grill。

#1 收敛 output_dir 解析(低风险纯删减)
7 处同款解析 → 单点 resolve_workspace()
#2 统一 frontmatter 模块(收效面最广)
10+ 文件重复解析 → 单一 wiki_fm 模块
#3 registry 声明式注册(结构改善)
schema 与 handler 就近,消除巨型文件
#4 hook 走统一 dispatch(防漂移)
_ide_hook 复用参数规范化管线