Files
llm-wiki/workbench/PRODUCT.md
T
2026-07-12 21:26:08 +08:00

103 KiB
Raw Blame History

llm-wiki-agent 产品文档

本文档是项目的思路锚点。当你(作者)或任何 AI 协作者思路断裂时,先读这份文档恢复上下文,再继续动手。

维护原则:决策或功能定义变化时,先改文档,再改代码。文档与实现冲突时以文档为准。


0. 这份文档怎么用

  • 作者是 0 代码基础的产品设计者。开发由 AI 协作完成。
  • 文档不写代码细节,只写意图、约定、决策理由
  • 每个章节相对独立,可以单独读。
  • 章节末尾若有 标记,表示"动手前一定要看这里"。

1. 产品定位

1.1 一句话定位

本地运行的知识库工作台。以对话为中心,通过 @ 引用知识库内容、/ 调用工具能力,把对话沉淀为可读可分享的产物(笔记、HTML、PPT、Word 等)。

1.2 核心场景

用户打开 llm-wiki-agent,看到自己的若干知识库列表,选一个进入。在对话框里和 agent 对话:

  • agent 知道当前在哪个知识库里,可以基于该库内容回答问题
  • 输入 @ 弹出页面列表,引用具体 wiki 页面进 prompt
  • 输入 / 弹出命令列表,调用工具(搜索、消化新素材、生成 HTML/PPT/Doc
  • 对话结束后一键"结晶"为新的 wiki 页面,写回知识库
  • 产出物(HTML/PPT/Doc)在右抽屉直接预览,一键下载或分享

整个工具运行在本地,所有知识库数据是本地 markdown 文件,零云依赖。

1.3 与 llm-wiki-skill 的关系

维度 llm-wiki-skill(旧) llm-wiki-agent(新)
形态 Anthropic Skill 独立 agent + web UI(未来 Tauri 桌面应用)
宿主 Claude Code / Codex / OpenClaw / Hermes 自有 runtime(基于 pi-agent
数据 用户的 wiki 目录 完全沿用,结构不变
能力 Skill 内的脚本 + 模板 全部复用agent 通过 pi-agent 原生 Skill 加载机制调用

关键事实pi-agent 原生实现 Anthropic Skill 标准。llm-wiki-skill 一行不改就能被 agent 项目加载使用。

长期愿景(ADR-16,已由阶段四落地)agent 形态并入 llm-wiki 仓库,作为 Skill 的升级版同时存在(保留 Skill 给纯 CLI 用户)。这次合并已在阶段四完成(见下);本节保留 ADR-16 的原始意图脉络。

合并已完成(阶段四):原 agent 仓库已 git subtree 搬入主仓库子目录 workbench/(monorepo,不发版不宣布),图谱引擎 @llm-wiki/graph-engine 是第一块两端共享代码。终局形态为"一个产品、两扇门"——产品 = 知识库格式 + 素材管线 + 方法论;门一 = Skill(嵌入用户已有 harness),门二 = 工作台。详见 ADR-20。

1.4 这个项目"不是什么"

为防止范围漂移,明确以下边界:

  • 不是云端 SaaS(不部署线上、不替用户付 API 费用、不做多用户)
  • 不是 Obsidian/Logseq 替代品(不做手写笔记编辑器,wiki 由 AI 维护)
  • 不是通用 ChatGPT(必须基于知识库语境)
  • 不是 Skill 的"加壳版"(是独立 agent 产品,Skill 只是能力来源之一)

2. 核心理念

2.1 Code is cheap,未来人视角

不为了"省事"做妥协的选型。技术栈按 5 年后仍说得通的标准来选。

2.2 桌面应用而非托管

托管 = 替用户烧 API 额度 = 必须先想清楚商业模式。本项目不走这条路。最终形态是 Tauri 打包的桌面应用。

2.3 Skill 即插即用

不重造轮子。任何符合 Anthropic Skill 标准的能力,丢到 skills 目录就生效:

  • llm-wiki-skill(自家,知识库主线)
  • anthropics/skills17+ 个官方 Skilldocx / pdf / pptx / xlsx / doc-coauthoring / web-artifacts-builder / frontend-design / canvas-design / brand-guidelines / theme-factory / mcp-builder / claude-api / algorithmic-art / webapp-testing / skill-creator / internal-comms / slack-gif-creator
  • pi-skillsweb search、browser automation、transcription 等)
  • 未来任何社区 Skill

2.4 对话中心

主屏永远是对话框。其他功能(图谱、库管理、产出预览)作为辅助面板,从对话发起或呼出。心智参考 Codex / Claude Desktop。


3. 架构总览

3.1 系统层次

┌─────────────────────────────────────────────┐
│ 前端 (Vite + React)                          │
│  浏览器 / 未来 Tauri webview                  │
│   ├─ 对话主区                                 │
│   ├─ 侧栏(知识库列表 / 历史 / 图谱入口)       │
│   ├─ 顶栏(当前知识库 / 搜索 / 模型 / 外观 / 设置)│
│   ├─ 右抽屉(产出预览 / 引用查看)             │
│   └─ @ / 自动补全                             │
└────────────────────┬────────────────────────┘
                     │ SSE (事件流) + HTTP POST (命令)
┌────────────────────▼────────────────────────┐
│ 后端 (Node + Hono)                           │
│  └─ pi-coding-agent SDK                     │
│      ├─ AgentSession  (对话/事件/会话管理)    │
│      ├─ Extension     (注入当前知识库等状态)   │
│      └─ Skills 加载                           │
│         ├─ llm-wiki-skill                   │
│         ├─ anthropics/skills                │
│         └─ pi-skills                        │
└────────────────────┬────────────────────────┘
                     │
┌────────────────────▼────────────────────────┐
│ 本地文件系统                                  │
│   ├─ ~/llm-wiki/<name>/  (知识库默认根,沿用 Skill 结构)│
│   ├─ 外部知识库路径       (用户登记的任意路径) │
│   ├─ ~/.llm-wiki-agent/                     │
│   │   ├─ config.json     (UI 偏好/外部库登记) │
│   │   ├─ sessions/                          │
│   │   ├─ skills/                            │
│   │   └─ logs/                              │
│   └─ ~/.pi/agent/auth.json (模型凭证,pi 管理)│
└─────────────────────────────────────────────┘

3.2 技术栈

选型 简要理由
前端框架 React + Vite AI 协作样本量最大;新手坑最少;Tauri 零迁移
UI 组件库 暂定 shadcn/ui 不是黑盒、可读、复制粘贴风格、深色主题原生
后端框架 Hono 轻量、TS 友好、文档清晰
Agent runtime @earendil-works/pi-coding-agent SDK 原生 Skill 支持;事件流;多 provider
通信 SSE + HTTP POST agent→UI 单向流,SSE 足够;WebSocket 过度
数据 本地 markdown + JSON 无服务器;Obsidian 兼容
桌面打包(未来) Tauri 用系统 webview + Rust 后端;二进制和内存占用通常显著低于 Electron5-30 MB vs 100+ MB
包管理 npm(统一) 不混用 pnpm/bun,避免新手版本混乱
Node 版本管理 mise 或 nvm mise 是多语言版本管理(含 Node);锁版本至少 >=22.19.0pi-coding-agent 0.75.x 的最低要求)
Markdown 渲染(阶段二+ react-markdown ^9 + remark-gfm ^4 生态最稳、类型完备、GFM 表格/任务列表/自动链接;shadcn 生态常用
命令/补全菜单(阶段二+ cmdk ^1 shadcn <Command> 底层;键盘导航与 a11y 完备;同时承载 / 命令菜单和 @ 引用菜单

3.3 关键流程:一次对话发生了什么

下列路径(/api/refs 等)为建议命名,最终以实现为准。

1. 用户在对话框输入文本(可能含 @页面 或 /命令)
2. 前端检测到 @ → 调 /api/refs 拿当前库页面列表 → 弹出菜单 → 用户选中
3. 前端检测到 / → 调 /api/commands 拿已加载命令 → 弹出菜单 → 用户选中
4. 前端 POST /api/promptbody 是展开后的完整文本
5. 后端调用 session.prompt(text)
6. session 通过 subscribe 推 agent 事件
7. 后端把事件 SSE 推给前端 /api/events
8. 前端按事件类型渲染(文本流、工具调用、引用预览…)
9. 用户可选触发 /sediment 把本次对话沉淀为 wiki 页面

关键点:当前知识库的"上下文"不是通过 prompt 字符串拼接传递,而是通过 pi-agent 的 Extension 注入到 session state 里。这是干净做法。具体见 ADR-7。

3.4 pi-agent 的使用方式

结论:pi-agent 作为 npm 依赖引入,不 clone 源码,不做 fork

具体含义:

llm-wiki-agent/                       ← 你的仓库
├── package.json                      ← 这里声明 "@earendil-works/pi-coding-agent": "^x.y.z"
├── node_modules/
│   └── @earendil-works/
│       └── pi-coding-agent/          ← pi 源码自动安装在这里,只读,不改
├── server/                           ← 你写的后端
│   ├── index.ts                      ← Hono 起服务
│   ├── agent.ts                      ← import { createAgentSession } from '@earendil-works/pi-coding-agent'
│   └── extensions/                   ← 你写的 Extension
└── web/                              ← 你写的前端

你"写"的代码:

  1. 后端把 pi SDK 包装成 HTTP/SSE 接口
  2. 一个或多个 Extension(注入"当前知识库"等应用状态)
  3. 前端 UI

你"用"但不写的代码(全在 npm 包里):

  • agent runtime、Skill 加载、事件流、模型管理、会话持久化

升级 pi:改 package.json 里的版本号,npm install 重跑。

Extension 注入方式pi-coding-agent CLI 会自动发现 ~/.pi/agent/extensions/*.ts 下的全局 extension。我们是 SDK 用户,不依赖那个机制——而是把 extension 代码放在自己仓库的 server/extensions/ 下,通过 SDK 暴露的 bindExtensions() 或自定义 ResourceLoader 显式注入 session。这样 extension 跟着我们项目走,不污染用户的 ~/.pi/

永远不要直接修改 node_modules/ 里的 pi 源码。万一极端情况需要 patch(99% 用不到),用 patch-package 做局部补丁,保持升级路径干净。

pi-coding-agent 0.75.x 要求 Node >=22.19.0。用 mise/nvm 锁定到合适版本,避免系统 Node 太旧。


4. 功能阶段路线

每个阶段:目标 → 范围 → 不包含 → 验收。验收不过不进下一阶段。

阶段一:主干打通(最小可用) 已完成 2026-05-26

目标:验证"前端 ↔ 后端 ↔ pi-agent ↔ Skill ↔ 文件系统"全链路。

范围

  • 一行命令拉起本地服务(npm run dev 启动后端 + 前端)
  • 浏览器打开 localhost:xxxx,看到知识库列表
    • 自动扫描 ~/llm-wiki/ 下含 .wiki-schema.md 的子目录
    • 支持手动"添加现有库"指向任意路径(如 ~/Documents/AI学习知识库
    • 注册过的库存在 ~/.llm-wiki-agent/config.json
  • 点击一个知识库进入对话界面
  • 顶部状态条显示当前知识库名
  • 同库内支持多个并行对话,侧栏列出,"+ 新对话"按钮在顶部
  • 切库自动保存当前对话,打开目标库最近活跃的对话
  • 对话框可输入,流式接收 agent 回复
  • agent 通过 Extension 知道当前知识库路径
  • 对话历史持久化(pi-agent SDK 原生功能)

不包含@ 补全、/ 命令、图谱、产出能力、消化新素材、新建知识库 UI。

验收标准

  1. 在 "AI学习知识库" 里问"这个库里有哪些主题"agent 调用 read 工具读 index.md,给出准确回答
  2. 切到另一个库再问,对话上下文完全切换
  3. 同一库内开两个对话,互不污染
  4. 关闭浏览器再打开,自动选中最近对话,历史完整

完成情况 2026-05-26(最终 commit dd021bc

  • 8 个 step commit + 2 个 review 修补 commit,详见 §10 进度追踪
  • 范围全部交付;4 项验收标准实测全通(验收 1 实测中 agent 用 list_knowledge_base_pages Extension 工具回答,效果等价于读 index.md,更精准)
  • 接受的妥协(不阻塞阶段二)
    • §5.2 顶部 "⚙ 设置" 按钮仅占位(disabled + tooltip)—— 完整设置面板在阶段二
    • §5.1 侧栏底部"图谱入口"未实现 —— 作者要重新构思图谱设计,推迟到阶段四
    • 默认模型不强制 Sonnet,沿用 pi-agent 用户设置(见 TBD-2
  • 启动 & 运行速查(compact 后从这里恢复上下文):
维度
一行启动 npm run dev(从仓库根;用 concurrently 同时起前后端)
后端端口 8787server/src/index.tsHono
前端端口 5180web/vite.config.tsstrictPort: true,冲突直接报错而非漂移)
启动耗时 ~2-5spi ResourceLoader + bootstrapFromConfig 自动恢复)
默认模型 ~/.pi/agent/settings.json 决定(不由本项目强制;作者当前为 zai/glm-5.1
自动恢复 selectKb~/.llm-wiki-agent/config.jsonlastUsedKbPathserver 启动 await bootstrapFromConfig()
知识库 默认根 ~/llm-wiki/ + 外部登记(config.externalKnowledgeBases[]
会话目录 ~/.llm-wiki-agent/sessions/<sha256-of-kb-path>/*.jsonlpi SessionManager 管理)
Extension 工具 current_knowledge_base() / list_knowledge_base_pages()(仅这俩,阶段二补 @////sediment 等)
已知 endpoints 13 个,列表见 server/src/index.ts 顶部注释
Node 版本要求 >=22.19.0pi-coding-agent 0.75.x 硬要求,仓库根 .mise.toml / .nvmrc 锁定)

阶段二:核心循环(@、/、结晶、消化) 已完成 2026-05-27

目标:让"对话 → 沉淀"形成闭环。

范围

  • @ 补全菜单:弹出当前库的页面/实体/主题列表,选中后插入 wiki 链接
  • / 命令菜单:列出所有已加载 Skill 命令 + 内置命令
  • 内置命令 /sediment:把当前对话或选中片段沉淀为 wiki/synthesis/sessions/ 下的页面
  • 内置命令 /new-wiki:app 内新建知识库(输入名字 + 研究方向 → 调用 llm-wiki-skill 的 init 流程 → 在 ~/llm-wiki/ 下生成完整目录)
  • 引用预览:对话里出现的 wiki 链接可点击,右抽屉打开该页面
  • 消化新素材:把链接或文件路径丢给 agent → 触发 llm-wiki-skill 的消化流程
  • 设置面板 UI(三层认证 + 偏好):
    • 登录方式区:检测 pi CLI auth.json 状态 / 填 API key(写入 pi 的 auth.json/ 显示环境变量状态
    • 默认模型、UI 偏好、知识库根目录、外部库管理(添加/移除)

验收标准:完整跑通——

  1. 在 app 内点"+ 新建知识库",输入名字和方向 → 自动创建 → 出现在列表里
  2. 丢一篇文章链接 → agent 消化进库 → 在对话里基于这篇讨论 → 一键结晶为新页面 → 在 wiki/synthesis/sessions/ 目录里能看到新文件
  3. 在 UI 里填一个 Anthropic API key → 测试连接成功 → key 出现在 ~/.pi/agent/auth.json,未泄露到 ~/.llm-wiki-agent/

阶段三:产出能力(产品亮点) 已完成 2026-05-27

目标:把"内容产出"做成视觉冲击力强的功能,作为产品宣传点和小白吸引力来源。

范围

  • 挂载 anthropics/skills 中的产出类 Skilldocx / pdf / pptx / xlsx / web-artifacts-builder 等)
  • 挂载或自建 HTML 产出 Skill(生成单文件分享 HTML)
  • 对话中可要求 "把这次讨论做成 PPT" / "导出为 docx" / "生成分享 HTML"
  • 右抽屉支持预览:
    • HTML 直接 iframe 展示
    • PPT 用浏览器内 PPTX 渲染库(如 PPTXjs 或类似方案,具体库阶段三选型时再定
    • docx 显示元数据 + 下载按钮(不强求浏览器内渲染)
  • 一键导出到本地下载目录

验收标准:一次对话能产出 HTML、PPT、docx 三种格式,且 UI 内可直接预览或下载。

阶段 3.5:导航 UX 重构 + 多模型子代理批量消化 已完成 2026-05-27

背景:阶段 1-3 完成后作者实际使用 app 发现两类痛点——

  1. 导航 UX 反直觉:侧栏强行把 KB 分成默认/外部两类(与"KB = 项目"心智冲突)、对话挂在侧栏中间看不出从属、"添加现有库"靠手输绝对路径常常失败、拖入非 wiki 目录直接报错
  2. 批量消化效率低:阶段二的消化是"一次喂一篇"TBD-2"多模型路由"也一直挂着没有承载场景——批量消化正好是

目标

  1. 导航统一:侧栏一栏到底、KB 可展开对话子树、拖拽优先添加路径、非 wiki 目录提供"一键初始化 + 批量消化"路径
  2. 子代理批量消化:基于 pi SDK 的 createAgentSession + 多模型注册落地"消化角色 → cheap / 聊天角色 → main"双角色路由;用一个 30 行的并发控制函数调度 N 个子代理并行处理 N 个文件,通过 SSE 推送进度

范围7 step):

  • 侧栏重构:统一 KB 列表 + 折叠对话子树(去 default/external 分隔)
  • 拖拽 + 输入框双通道:HTML5 drag 先探测能否拿到真实路径,输入框兜底 + inspect 端点判定是不是 wiki
  • 非 wiki 目录初始化引导:弹窗提示 + 就地初始化 .wiki-schema.md + index.md
  • 多模型双角色:config.json 新增 modelRoles: { main, digest } + 设置面板选择
  • 后端子代理批量消化框架:30 行 mapWithConcurrencyLimit + SessionManager.inMemory() + 共享 authStorage/modelRegistry
  • 批量消化 UI + SSE 进度推送:浮窗实时显示每个子代理的"排队/进行中/完成/失败"
  • 总验收 + UX 体感打磨

不包含:图谱(阶段四)、Tauri 打包(阶段五)、媒体创作 / 浏览器扩展(阶段后规划)、子代理嵌套 / 工作树隔离(omp 那一套)

验收标准5 条):

  1. 侧栏统一KB 列表一栏到底无 default/external 分隔;点当前 KB 名可展开/收起对话子树,点未选中 KB 会切换并展开;外部 KB 用文字 badge 而非分区
  2. 拖拽添加:从 Finder 拖文件夹到 dialog 拖拽区;若浏览器暴露真实 file://,路径自动填入输入框;若不暴露,UI 明确提示用户粘贴路径(不立即提交,给用户最后修改机会)
  3. 非 wiki 兜底:拖入无 .wiki-schema.md 的目录,弹"是否初始化并批量消化"对话框;选"是"→ 后台跑 init + 子代理并行消化
  4. 多模型双角色:设置面板新增"模型分配"区,main / digest 两个角色各自的 provider+modeldigest 写入 config.json 后对新批量消化立即生效,main 写入后当前主对话立即重载并使用该模型
  5. 并发消化:批量消化 10 个 .md 文件能看到 ≥3 个子代理同时跑(默认并发=3),SSE 实时推送状态,全部完成后右抽屉刷新出新增的 wiki 页面

完成情况

  • 侧栏已统一为一栏 KB 列表,当前 KB 可点击展开/收起对话子树,外部库用 badge 标记
  • 添加现有库支持拖拽探测、路径输入、目录检查;非 wiki 目录可就地初始化并可接着批量消化
  • 设置面板新增 main / digest 角色选择;digest 角色用于批量消化,main 角色用于主对话并在切换后立即刷新生效
  • 批量消化使用 pi SDK 原生 in-memory 子会话,并发档位为 1 / 3 / 5,通过 SSE 推送进度
  • 新增依赖:无

阶段四:monorepo 合并 + 图谱活地图 已完成 2026-06-12

背景:两条线汇合——(1) 战略上"一个产品、两扇门"已定,ADR-16 的合并需要启动时机;(2) 图谱引擎是两端共享的第一块代码,共享代码出现即合并时机成熟的信号。原"图谱集成"目标升级为"图谱活地图":图谱后面站着 agent,这是所有竞品图谱(只能看不能问)给不了的。

目标

  1. monorepo 合并(工程部分):本仓库 git subtree 整体搬入主仓库 workbench/,引擎落 packages/graph-engine/。不发版、不改 README、不对外宣布(品牌动作留给后续阶段)
  2. 图谱活地图:共享引擎双宿主(工作台 React / Skill 离线 HTML),工作台获得活模拟 + 钉扎 + 选区提问 + 生长动画;Skill 离线 HTML 最后一步切换引擎产物,老用户白拿升级

实施结果:阶段四已在主仓库 stage-4 分支完成,8 个 Step 全部落地。总验收的自动化检查已通过;视觉一致性、深色观感和拖动手感按设计文档要求保留截图/参数证据,交由验收人做最终主观判断。

范围8 Step):

  • Step 0monorepo 搬家 + workspace 根 + 全链路冒烟
  • Step 1:引擎包骨架 + helpers 纯函数 TS 化 + 测试迁移("新骨架、旧器官"的 A 级资产)
  • Step 2:工作台图谱视图静态复现(安全网基线)+ 山水/墨夜主题 token
  • Step 3:活模拟 + 钉扎(松手即钉/双击解钉)+ 持久化(.wiki-graph-layout.json,只存钉的、路径为 key)。2026-06-19 修订:双击解钉不再作为新主路径,固定/取消固定改为明确按钮或菜单动作
  • Step 4:选区系统(结构化四式,砍自由套索)+ 对话联动(选区 = 批量 @
  • Step 5:文件监听 + 全量重算 + diff 生长动画(diff 队列,图谱可见时消费)
  • Step 6build-graph-html.sh 切换引擎产物,旧 graph-wash 模板退役
  • Step 7:总验收 + 墨夜主题打磨

不包含:仓库改名 / 对外发布、Tauri 打包(推迟到工作台有真实外部用户后)、跨库图谱、自由套索、增量图计算、主题商店(完整"明确不做清单"见设计文档 §8)。

验收标准7 条,细则见设计文档 §6):

  1. 主仓库根一行 npm run dev 起工作台,Skill 主线测试全绿,两边互不破坏
  2. 工作台图谱与旧版离线 HTML 视觉一致(静态基线截图存档)
  3. 钉扎:拖动让位流畅、松手即钉、重启还原、Obsidian 旁路修改不破坏
  4. 选区四式可用,动作随选区性质变化;"两簇为何没联系 → agent 建链 → 重算后颜色真变"全闭环
  5. 批量消化后打开图谱补播生长动画;Obsidian 手改 ~5s 内自动反映
  6. 离线 HTML 新产物双击可用、钉位生效、无提问按钮(capabilities 注入生效)
  7. 工作台浅/深切换图谱跟随山水/墨夜

阶段 4.5:图谱可用性收尾 已合入 2026-06-14

背景:阶段四交付后作者实测暴露五类问题(画布无缩放平移、点击语义被选区提问独占致阅读路径消失、Shift 多选不可发现、无搜索/图例、节点默认卡片过胖)+ 阶段四验收对离线 HTML 功能减配的裁决(补搜索与社区聚焦;学习系统三件套不做,待真实使用后按工作台语境重新设计)。与阶段 3.5 同型:真实使用驱动的收尾阶段。

范围(优先级序):

  • P0 画布导航:指针中心滚轮缩放 / 空白拖拽平移 / 双击回全图 / 小地图联动(引擎层,两端同享)
  • P0 点击语义重构:"点击即阅读,选区即升级"——单击 = 右抽屉阅读态,选区悬浮窗取消,抽屉一容器两状态;动作映射表补"单节点"行并修复 unlinked 误触发(修订 stage-4 D6)。2026-06-19 修订:全局单击改为轻量摘要优先,完整阅读必须通过明确动作进入社区阅读
  • P1 图谱搜索(Cmd+F,两端);社区聚焦列表兼图例(两端)
  • P1 Shift 多选失效排查 + 可发现性提示
  • P2 节点默认态瘦身 + hover 预览卡(一行标题 + 类型色条;类型/权重/摘要移入悬停——预览卡显示正文首段摘要,配套补偿瘦身)
  • 抽屉阅读态瘦身定稿:去学习队列/学习路径/札记笔记/置信度列表/邻居列表,摘要迁移至 hover 预览卡;保留收纳"查看原文";原则——屉负责内容,图谱负责关系,派生信息不重复

明确不做:学习系统三件套、抽屉历史栈、缩放惯性、hover 摘要 tooltip、移动端触控全套。

阶段 4.6:图谱演进第一批(看清关系 + 层层聚焦 + 控制工具条) 已完成 2026-06-14

背景:4.5 收尾后推进「图谱演进候选池」。spark 脑暴把候选池按"就绪度"(而非"高价值低成本")重排,锁定方向 = 日常可用性(让在用的人更顺手),美观 / 惊艳 demo 后移。详见 docs/graph-evolution-1-design.md

当前状态:已落地并通过总验收。工作台与离线 HTML 同享顶部工具条、社区聚焦、类型筛选、关系边图例;关系边按关系类型着色、按置信度虚实;离线 HTML 不提供提问入口。

范围

  • G1-1 关系类型上边(数据管线补齐关系类型 + 置信度;颜色 = 关系类型、矛盾避 ENTITY 红;虚实 = 置信度;全局低权重、聚焦才完整呈现)
  • G1-2 递进聚焦(点社区进聚焦视图 → 点节点高亮 + 阅读)+ 类型筛选
  • G1-3 顶部控制工具条取代左上角常驻浮层
  • G1-4 默认收起 + 半透明
  • G1-5 双宿主分工(离线 HTML 同享,无 onAsk 提问)

明确不做:路径查找 + 讲解、lint 上图、导出美图 / 工作台实时美观、时间筛选(缺 mtime)、图谱增强检索(移交 ADR-19)、远期池(嵌入布局 / LLM 推断边 / AI 摘要)。

实施L 级 phased plan 已完成(P0 基线+完整边契约+web test 入口 → P1 工具条 → P2 聚焦 → P3 关系边 → P4 验收),分支 feat/graph-evolution-1Codex /goal 执行(plan/progress 本地不入库,沿用 planning-docs local-only 惯例)。

与既有决策的关系:修订 ADR-21 / D4.5-6(社区交互:选中高亮 → 进入聚焦视图;左上浮层 → 顶部工具条);关系边可视化记录为 ADR-23。

阶段 4.7:图谱交互地基重构 已完成 2026-06-16

背景:4.6 后作者连续实测发现,图谱交互问题不是单个 bug:鼠标在社区或节点上滚轮缩放不一致、拖节点不跟手、节点被社区色块困住、悬停说明漂移。这些现象共同指向同一个产品问题:图谱必须像一张有相机的地图,而不是每个交互各算各的。

当前状态:已完成核心交互地基并通过工作台与离线 HTML 双宿主验证。现在滚轮缩放在空白、节点、社区色块和边上保持一致;拖动节点不会跳走,也不会误打开阅读抽屉;节点可以离开社区色块;悬停说明跟随节点;社区色块是视觉提示,不是拖动围栏。

范围

  • 统一图谱交互规则:缩放、平移、拖拽、点击、悬停、社区选择都按同一张地图心智工作。
  • 社区色块改为软区域:节点可以被拖出色块,色块可以有限响应,但不会无限放大,也不会改变真实社区归属。
  • 两个入口同享结果:工作台图谱和 Skill 离线 HTML 保持同一套行为。

明确不做:空间索引、Canvas/WebGL 重写、密度策略重做、小地图拖拽导航。这些只有在真实大库或产品使用证明需要时再启动;本阶段不把它们当作默认方向。

与既有决策的关系:强化 ADR-21 的“位置层/结构层分权”和 ADR-22 的“画布导航是地基能力”。本阶段不改变抽屉归属、不改变知识库结构、不改变社区和连线的真实来源。

阶段 4.8:图谱演进——全局社区高亮(spotlight) 已落地

背景:4.7 把全局图统一成“一张有相机的地图”后,点社区需要地图本身给出“我正在看这个社区”的反馈,而不是只依赖右抽屉解释选择。

当前状态:已落地。全局 Sigma 点社区会停留在全局路线并进入社区高亮态,右抽屉继续负责摘要与动作;相机轻量动画和动画期间 overlay 轻量跟随策略均已接入。

范围

  • 全局 Sigma 点社区进入临时“社区高亮态”:当前社区强调、其他社区弱化但仍可见;停在全局、不进入社区视图。
  • 回全图按层分行为:社区视图→切回全局;全局高亮态→退高亮 + 清选择关抽屉 + 回构图;普通全局→重置视角,保留筛选/Pin/搜索。
  • 点空白处退出高亮(与回全图在高亮态等价,有意冗余)。
  • 相机轻量构图动画(平移 + 受限缩放);动画期间社区云团、节点命中框和标签共用轻量 overlay transform,稳定后精确校准,避免每帧重算全部社区云团。
  • 叠加优先级:筛选 > 搜索命中 > 选中 > Pin > 高亮。

明确不做:社区阅读视图改造、把社区视图迁 Sigma、全局 hover 完整方案、节点详情卡片重做、社区内部布局重排、大图聚合、#70 标签长度兜底。

与既有决策的关系:增强 ADR-21 第 5 条 / ADR-22 的“点社区先摘要、再按钮进入”第一步(只补地图反馈,不改两步边界);在 ADR-22 第 4 条“画布导航是地基能力”之上给回全图叠加“高亮态分层”。高亮社区复用 Sigma 全局现有 selection(社区)→selected 视觉链路(已驱动云团/标签/边 dim),本阶段只补其他社区节点弱化与相机轻量动画;不复用 focusCommunity() / 顶层 state.focus、不新增平行状态、不写知识库——遵守 ADR-21 第 4 条位置/结构分权与“浏览状态留本机”。

阶段五:桌面应用打包(Tauri

目标:跨平台桌面应用安装包。

范围

  • Tauri 项目初始化
  • 后端嵌入 Tauri sidecar 进程
  • macOS / Windows / Linux 三平台构建
  • 安装包自动化产出(CI 可选)
  • 安装后开箱即用,无需用户配 Node 环境(API key 仍由用户填)

验收标准:双击 .dmg / .msi / .AppImage 安装即可使用。

阶段后规划(暂不锁定,记录想法)

  • 浏览器扩展:当前页面一键消化进库
  • 多模型路由:按任务类型自动切(消化用便宜模型、深度对话用强模型),与 pi-agent provider 体系打通
  • 全局快捷键 / 系统托盘
  • 主题与自定义样式
  • 多端同步(如果未来真有需求)

图谱演进候选池(2026-06-13 全景分析沉淀;首批已落地为「阶段 4.6」,见上文 §阶段 4.6)

来源:阶段 4.5 设计期间的行业全景讨论。统领判断——行业两条尸检教训:全局图是营销图、局部图才是工具Roam 弱化图谱、TheBrain 靠局部视图活了 20 年);只能看不能动的图谱是玩具(Obsidian 图谱日活极低的根因)。llm-wiki 已踩对第二条的解法(图谱可问,全行业独一份),第一条靠下面的"局部图"接住。

推荐切片(按就绪度推进;首批 4.6 已完成日常可用性主线)

一句话 为什么值得
局部图模式 首批已落地:点社区进入聚焦视图,只显示该社区节点;点节点高亮并阅读 接住教训一:大库日常视图应是局部图;与"+邻居"选区天然衔接
路径查找 + agent 讲解 选两节点高亮最短路,agent 沿路径讲故事 独有赛道杀手级演示:Neo4j 只能画路径,我们能讲
lint 健康上图 孤岛/断链/上帝节点图上标注 + 一键让 agent 修 stage-4 终局愿景一直没排期;lint 能力现成只差可视化
关系类型上边 首批已落地(颜色维待数据):按关系词汇表给边颜色 + 按置信度给边虚实,"矛盾"边避开 ENTITY 红。置信度虚实维已真实生效;关系类型颜色维当前几乎全默认"依赖"=单色,待消化管线产出 relation 注释(见远期池) 关系词汇表与置信度体系已有;4.6 补齐契约与上色管道
类型/时间过滤器 类型已落地;⏸ 时间筛选二期(缺 mtime) 轻量;Obsidian 式语法属于过度设计
导出美图 当前视角一键导出带主题样式的 PNG/SVG 数字山水是最强传播资产,用户发图 = 免费获客,成本极低
图谱增强检索(后端暗改) ↪ 已移交 ADR-19 检索线,不占图谱候选池决策位 GraphRAG 核心思路:图谱不只给人看,是 agent 的检索结构;半天级工作量

远期池(依赖消化管线升级,同一批做)

  • LLM 推断边:消化时让模型判断该页与库内哪些页相关,带置信度入图(EXTRACTED/INFERRED 体系现成承接;同名竞品与 GraphRAG 的两阶段建边)
  • AI 真摘要:消化时为每页生成一两句摘要写入页面元数据,hover 预览卡与社区摘要自动升级
  • 社区摘要 hover:悬停团块显示这一簇的一句话摘要(GraphRAG 分层社区摘要思路)
  • 嵌入布局(第二布局,不替代力导向):页面 embedding 降维投影,"位置即语义";与力导向的差异本身是洞察——语义很近却没连线 = 待建链盲区,将来可成独有功能
  • 消化时提取关系类型注释(relation_type):4.6 已铺好边数据契约与上色管道,但现有 wiki 页面只有 <!-- confidence --> 注释、无 <!-- relation: 矛盾 --> 注释,故 G1-1 颜色维当前几乎全默认"依赖"= 单色(置信度虚实维已真实生效)。消化时让模型判定关系类型并写入注释,即可点亮颜色维(与 LLM 推断边 / AI 真摘要同属管线升级,同一批做)

明确不做 / 已修订

  • 3D 图谱(行业著名伪需求,旋转酷炫三分钟,阅读效率负提升)
  • 白板化 / 手动布局全图(Heptabase 路线;钉扎已是其轻量正解)
  • ⚠️ 旧判断“ WebGL 渲染重写”已被 2026-06-19 大图谱性能方案修订:当前 DOM/SVG 不再承担万级全局图,后续全局大图主线走 Sigma/GraphologyDOM/SVG 继续服务小图、离线细节和社区阅读。

竞品技术参考存档:渲染梯子 DOM(<500)→Canvas(<5k)→WebGL(50k+Obsidian 用 Pixi);嵌入布局参考 Nomic Atlas;检索架构参考 Microsoft GraphRAG(社区检测 + 分层摘要,与 llm-wiki 的社区/digest 理念同构);局部视图参考 TheBrain plex;语义相似边参考 Connected Papers。


5. UI 设计原则

5.1 三栏布局

[ 侧栏 270px / 52px 窄栏 ] [ 主区域 自适应 ] [ 右抽屉 0 / 可拖动宽度 / 全屏 ]
  • 侧栏默认显示:
    • 知识库列表(顶部,含"+ 新建知识库"按钮)
    • 当前库的对话列表(中部,含"+ 新对话"按钮,按最近活跃排序)
    • 图谱入口、设置入口(底部)
  • 侧栏可折叠为窄图标栏:保留展开、当前知识库、刷新、新建、添加、设置入口;图标悬停显示文字提示。该状态保存在本机。
  • 主区域永远是对话(除非用户主动切换到图谱)
  • 右抽屉默认隐藏,呼出场景:产物预览、引用页面查看、设置面板。右抽屉宽度可拖动调整,双击拖动边缘恢复默认宽度;宽度保存在本机。小屏幕下不启用拖动,继续占满屏幕。

5.1.1 会话与切换行为

  • 会话绑定到知识库:每个库有独立对话列表,不允许跨库会话
  • 同库内多个并行对话:用户随时"+ 新对话"开新线程
  • 切换知识库:当前对话自动保存 → 切到目标库 → 自动选中目标库最近活跃的对话
  • App 启动:自动选中"最后一次使用的库 + 该库内最近活跃的对话"
  • 全程自动保存,无"是否保存"弹窗

5.2 顶栏

[📚 当前知识库]   [搜索 ⌘K] [🤖 模型 ▼] [新对话] [主题] [外观] [⚙ 设置]

永远可见,回答"我在哪里",并承载跨对话 / 图谱两个视图共享的全局操作。

  • 左侧知识库头只展示当前库名、来源和有效状态,不做下拉,不显示篇数
  • 模型选择只在右侧控件里出现,读写 config.modelRoles.main
  • 外观齿轮只管理 Paper 视觉偏好;侧栏"设置"仍打开现有配置面板
  • 图谱专属操作(重置布局、重建图谱)留在图谱视图内部,不进入全局顶栏

5.3 @/ 的设计契约

符号 语义 弹出内容 选中后
@ 引用 当前知识库的页面 / 实体 / 主题 在输入框插入 wiki 链接,agent 看到时会读这页
/ 执行 所有已加载 Skill 命令 + 内置命令 在输入框插入命令调用,agent 收到时执行

两者必须有清晰区分。@ 是"找内容"/ 是"做事情",永远不要混用。

5.4 视觉风格

  • 默认浅色暖纸主题,支持夜灯主题切换,用户选择只保存在本机
  • 正文字体:Plus Jakarta Sans 优先,CJK 回落系统字体;手写点缀用 Caveat;等宽字体用 JetBrains Mono / SF Mono
  • 视觉方向为 Paper 暖纸:克制、可读、温暖,但不改变三栏心智和对话中心定位
  • 外观偏好是正式用户偏好:纸张质感、强调色、用户气泡、手写点缀、密度、主题均保存在本机
  • 阶段 3.5 收尾吸收本地 UI 原型:统一侧栏、状态条、对话区、输入区、菜单、抽屉和设置面板的工作台视觉,不改变既有三栏心智和功能范围
  • 对话区工具执行采用 omp 风格状态呈现:当前 assistant 回复内只保留一个动态工具条,工具完成后折叠为分组摘要;用户停止时保留清楚的取消状态,避免工具流水账挤占正文

5.5 严禁项

  • 不做 onboarding 引导浮层
  • 不做 emoji 滥用
  • 不做"AI 正在思考..." 这种空白等待动画(用真实事件流:动态工具状态、流式文本)
  • 不强制注册 / 登录(本地工具不需要账号)

6. 数据与目录约定

6.1 知识库存储策略(混合模式)

用户需要管理多个领域的知识库(AI 学习、工作材料、设计灵感等),不该被强制塞到一个固定位置。采用默认根目录 + 外部目录登记的混合模式:

类型 位置 说明
默认知识库根 ~/llm-wiki/ App 首次启动自动创建;app 内"+ 新建知识库"在此建子文件夹
外部知识库 用户任意路径 用户手动"添加现有库"指向某路径,登记在 config.json
应用数据 ~/.llm-wiki-agent/ 配置、会话、日志、Skill,用户通常不直接碰

为什么默认是 ~/llm-wiki/ 而不是 ~/Documents/...

  • macOS 的 ~/Documents/ 会被 iCloud Drive 自动同步,会撕坏 .wiki-cache.json 的文件锁和"写入即更新"逻辑
  • 知识库是顶级资产,值得一个顶级目录,不该埋在 Documents 深处
  • 短路径友好:终端 cd ~/llm-wiki 一秒到达

发现机制

  • 启动时扫描 ~/llm-wiki/ 下所有含 .wiki-schema.md 的子目录 → 自动注册
  • 再读 config.json 里登记的外部库路径 → 加入列表
  • 失效路径(外部库被删/移走):UI 标记为灰色,提示用户移除登记

6.2 知识库目录结构(沿用 llm-wiki-skill

每个知识库内部结构与 Skill 完全一致:

<某知识库>/
├── raw/                # 原始素材(子目录如 articles/tweets/wechat/xiaohongshu/zhihu/pdfs/notes/assets
│                       # 由 Skill init 时创建,agent 不强求子目录约定,沿用现有结构)
├── wiki/               # AI 生成内容
│   ├── overview.md     # 知识库总览(init 时生成)
│   ├── entities/       # 实体页
│   ├── topics/         # 主题页
│   ├── sources/        # 素材摘要
│   ├── comparisons/    # 对比分析
│   ├── synthesis/      # 综合分析
│   │   └── sessions/   # 对话结晶(agent 新增的对话沉淀都进这里)
│   └── queries/        # 保存的查询结果
├── purpose.md          # 研究方向
├── index.md            # 索引
├── log.md              # 操作日志
├── .wiki-schema.md     # 配置(识别"这是个知识库"的标志文件)
├── .wiki-cache.json    # 素材去重缓存
├── .wiki-tmp/          # Skill 运行时临时目录(agent 不读不写,Skill 的 .gitignore 已排除)
└── .gitignore          # init 时生成,至少排除 .wiki-tmp/

agent 项目不重新设计这个结构。完全沿用 Skill 现有约定,确保两边互通。 结构以 scripts/init-wiki.sh 为权威,不要在 PRODUCT.md 里手动维护差异。

6.3 应用数据目录

~/.llm-wiki-agent/
├── config.json         # UI 偏好、默认模型、外部库登记 —— 不存任何 API key
├── sessions/           # pi-agent 会话持久化(对话历史)
├── skills/             # 软链接或拷贝到此目录的 Skill
│   ├── llm-wiki/       # → 链接到 llm-wiki-skill 安装位置
│   ├── docx/           # 来自 anthropics/skills
│   └── ...
└── logs/

模型认证不在这里。所有模型凭证由 pi-agent 统一管理,存在:

~/.pi/agent/auth.json    # pi-agent 的认证文件,权限 0600

应用数据 ≠ 知识库数据 ≠ 模型凭证,三类彻底分离:

类型 位置 谁管
知识库数据 ~/llm-wiki/<name>/ 或外部路径 用户 + agent
应用数据 ~/.llm-wiki-agent/ llm-wiki-agent
模型凭证 ~/.pi/agent/auth.json pi-agent SDK

.gitignore 排除 ~/.llm-wiki-agent/永远不要把 API key 写进任何源代码或仓库文件。详见 ADR-13。

6.4 Obsidian / 第三方工具共存规则

很多用户(包括作者本人)用 Obsidian 浏览同一份知识库。两者必须零冲突。

agent 读写的文件

  • raw/ 下任意文件
  • wiki/ 下任意 .md 文件
  • purpose.md / index.md / log.md
  • .wiki-schema.md / .wiki-cache.json
  • .wiki-graph-layout.json(阶段四起:图谱钉扎布局,工作台后端写、Skill 侧只读,见 ADR-21

agent 完全忽略的文件 / 目录

  • .obsidian/Obsidian 元数据)
  • .DS_StoremacOS
  • *.baseObsidian Bases
  • *.canvasObsidian Canvas
  • .wiki-tmp/Skill 自用的临时目录)
  • node_modules/.git/venv/ 等所有 dev 类目录
  • 任何非 markdown、非 Skill 约定内的文件

用户用 Obsidian 编辑 markdown、画 Canvas、做 Baseagent 都不会碰。

6.5 运行时应用状态(由 Extension 持有)

  • currentKnowledgeBase:当前打开的知识库绝对路径
  • currentConversationId:当前对话的 ID(pi-agent 会话)
  • pinnedReferences:当前对话固定引用的页面列表
  • activeSkills(可选):本次会话允许的 Skill 子集

6.6 中文路径与 UTF-8 铁律

用户的知识库名可能含中文(如 AI学习知识库)、空格、emoji。

铁律:所有路径处理代码必须用 UTF-8绝不使用"路径转拼音"、"中文字符转码"等歪招。Node.js / Tauri 原生支持 UTF-8,正确写法即可。

6.7 边界场景行为约定

场景 行为
多实例启动 只允许单实例。第二次启动直接 focus 已有窗口(macOS Cmd+N 也不开新窗口)。原因:本地后端服务监听固定端口,多实例冲突;也避免对同一文件并发写
无网络 / 未配置 API key 启动不报错。库列表、对话历史、wiki 页面浏览仍可用。试图发新消息时给一个明确提示"未配置 API key,去设置面板"或"网络断开"
崩溃 / 异常退出后恢复 重启后:自动恢复"最后一次使用的库 + 最近活跃对话";对话内容由 pi-agent session 持久化保证完整;侧栏折叠状态和右抽屉宽度保存在本机并恢复;右抽屉开关本身不恢复,避免恢复到"半坏"的 UI
后端服务未起 前端 UI 显示明显的"后端服务未连接"状态,不渲染对话区(避免误以为是 agent 卡死)
知识库目录被外部删除 列表里标灰,点击给出"目录已失效,是否从列表移除"提示,不崩溃

7. 关键决策记录(ADR

决策一旦写下,未来要推翻必须明确说明"什么变化了"。

ADR-1:选 pi-agent 而非 Vercel AI SDK / Mastra

  • Vercel AI SDK 强项是云部署,本项目不部署
  • Mastra 偏企业向 dashboard,对单人本地工具偏重
  • pi-agent 原生支持 Anthropic Skill 标准,可零适配复用 llm-wiki-skill 和社区 Skill 生态
  • pi-agent SDK 和 RPC 模式都明确支持嵌入到 web / 桌面 UI

ADR-2:对话中心而非图谱中心

  • 用户已有 Codex / Claude Desktop 的对话心智,零学习成本
  • @ / / 是 Skill 和工具集成的天然入口
  • 图谱适合"探索",不适合作为日常工作主屏;作辅助面板更合适

ADR-3SSE 而非 WebSocket

  • agent → UI 是单向事件流
  • SSE 是 HTTP 标准,浏览器和 webview 原生支持,断线自动重连
  • WebSocket 需管理双向状态机,本场景过度

ADR-4:先 web 再 Tauri 打包

  • web 是验证产品逻辑最快的形态
  • Tauri 本质是 webview 容器,前端可直接装现成
  • 一开始做桌面会让"前端开发"和"打包调试"两个复杂度叠加,0 代码起步必死

ADR-5:不用 MCP

  • MCP 是跨进程 RPC,每个能力一个独立 server,本地场景过重
  • Skill 是 markdown + scripts,进程内执行,简单一个量级
  • pi-agent 的 Skill 加载机制已足够
  • 未来如果某个能力必须用 MCP(比如调云端服务),再单独接入

ADR-6:完全进化为 agent,不维护双通道

  • 单人项目维护两个发行通道是开发者陷阱
  • pi-agent 能直接复用 Skill 内容,"完全进化"代价比想象的小
  • Skill 仓库进入维护模式,老用户照常使用

ADR-7:知识库上下文用 Extension 注入,不拼 prompt

  • 拼 prompt 难以维护、容易污染、对模型不友好
  • pi-agent Extension 可以注册自定义 tool 并持有应用状态
  • 让 agent 通过 tool 调用获取"当前在哪个库"、"库的元数据",行为更可控
  • 切库时 Extension 状态变化即可,不需要重建 session

ADR-8React + Vite 而非 Next.js

  • Next.js 的 SSR / Edge / 部署优化在 Tauri 里全废
  • Vite 纯 SPA 路线打包简单,Tauri 一行命令吃下
  • React 生态对新手最友好

ADR-9UI 用 shadcn/ui

  • 组件是复制到本仓库的源代码,不是黑盒 npm 包,0 代码用户也能改
  • 原生 Tailwind + 深色主题,符合工具感视觉风格
  • 社区主流,AI 协作样本量大

ADR-10pi-agent 作为 npm 依赖,不 fork、不 clone 源码

  • npm 依赖是现代 JS 项目用第三方库的标准方式,"不造轮子"正解
  • fork 会导致上游更新无法 merge,维护噩梦
  • submodule 对新手是地狱级体验,没有任何收益
  • 极端情况需要 patch 时用 patch-package,保持升级路径干净

ADR-11:知识库采用混合存储策略(默认根 + 外部登记)

  • 用户的知识天然分类,不该被强制塞到一个固定位置
  • 默认根 ~/llm-wiki/ 给新用户零配置上手
  • 外部库登记给已有库的用户(如 Obsidian vault 用户)零迁移成本
  • 不选 ~/Documents/ 因为 macOS 的 iCloud Drive 会撕坏文件锁

ADR-12:会话绑定知识库,同库支持多并行对话

  • 会话绑定库:防止跨库上下文污染(投资笔记不该混进 AI 研究)
  • 同库多对话:符合 Claude Desktop / ChatGPT 的心智,用户切换思路不用清空历史
  • 切库自动保存 + 自动选中目标库最近对话:零摩擦
  • 全程自动保存,无确认弹窗

ADR-13:模型认证完全复用 pi-agent 的 auth 体系(三层 fallback

在 llm-wiki-agent 自己维护 API key 存储。所有凭证最终落到 pi-agent 的 ~/.pi/agent/auth.json,由 pi-agent SDK 统一读取与刷新。

三层 fallback(按推荐顺序)

  1. 复用 pi CLI 登录态(推荐)
    • 用户在终端跑 pi login,选择 Claude Pro/Max / ChatGPT Plus / GitHub Copilot OAuth,或填 Anthropic / OpenAI 等 API key
    • 凭证由 pi CLI 写入 ~/.pi/agent/auth.json(权限 0600
    • 我们的 app 通过 AuthStorage.create() 自动读取
    • UX 等价于 open-design 的"复用本地 CLI":登录一次,到处可用
  2. UI 内填 API key
    • 设置面板里直接填 Anthropic / OpenAI 等 key
    • app 写入 同一个 ~/.pi/agent/auth.json,不是我们自己的 config 文件
    • 测试连接按钮验证有效
  3. 环境变量
    • 用户在 shell 里 export ANTHROPIC_API_KEY=...
    • pi-agent SDK 自动检测
    • 设置面板只读显示当前环境变量状态

关键约束

  • llm-wiki-agent 的 config.json 不存任何 key,只存 UI 偏好、外部库登记、默认模型等元数据
  • 想用 Claude Pro/Max 订阅的用户零成本接入(这是 BYOK API key 路线给不了的礼物)
  • macOS Keychain / 1Password 等高级用法通过 auth.json 的 !shell command 语法支持,不需要我们额外做

ADR-13b:不抄 open-design 的"多 CLI 子进程"模式

open-design 通过启动 CLI 子进程(Claude Code / Codex / Cursor 等 16 个)来实现"复用本地 CLI",因为它要兼容多家协议。

我们只用 pi-agent SDK,已经覆盖所有主流 providerAnthropic / OpenAI / Google / DeepSeek / Bedrock / Azure / xAI / OpenRouter ...)。不需要再做 CLI 检测和子进程管理。

未来如果某用户极度想用某 CLI 驱动 llm-wiki,可作为可选适配层加进来,但不进阶段一-五主线

ADR-14app 内一键新建知识库

  • 用户不应该被迫开终端才能创建新库
  • 内置 /new-wiki 命令调用 llm-wiki-skill 的 init 流程
  • agent 自己跑自己的 Skill,闭环

ADR-15Obsidian 共存(agent 忽略非 markdown 与第三方元数据)

  • 大量用户用 Obsidian 浏览同一份知识库
  • agent 不碰 .obsidian/*.canvas*.base.DS_Store
  • 用户用 Obsidian 编辑 / 画 Canvas / 做 Base 不受影响

ADR-16:长期与 llm-wiki 仓库合并(agent 是 Skill 的升级版)

背景:作者的 llm-wiki-skill 是 1.7k 星的成熟项目,纯提示词系统形态,没有 agent 循环 / 子 agent 分工 / 多步工具链。本项目(llm-wiki-agent)是把 Skill 升级为 agent 形态的实验。

决策:agent 形态成熟后,本仓库代码并入 llm-wiki 主仓库,作为 Skill 的 agent 升级版同时存在(保留 Skill 给纯 CLI 用户)。当前仓库是临时仓库

对架构的指导("C 混合"归属原则)

  1. 能力归属原则"Skill 已有的功能调 Skillagent 工作台新能力用 Extension"。这条原则今天和合并后都成立——今天的"spawn 外部脚本"合并后变成"同仓库内调用",调用关系不变
  2. 拒绝重复造轮子llm-wiki-skill 已实现的消化能力(X / 微信 / 小红书 / 知乎 / YouTube / PDF / 本地文件)一律调 Skill,不在 agent 端重写
  3. 拒绝塞 agent 特有命令进 Skill:对话结晶、UI 元能力(列页面 / 读单页)、auth 管理这些"agent 工作台才有"的概念,用 Extension 实现,不污染 Skill 的"纯提示词系统"特质
  4. 代码组织模块化:agent 端目录结构保持清晰,未来可 lift-and-shift 直接挪进 llm-wiki/agent/ 子目录
  5. 不为合并提前优化:今天该用 npm workspaces + 独立仓库就用,合并是未来的事,今天保持工程简单

阶段 3.5 的明确例外:批量本地文件消化为了验证"便宜模型 + 并行子代理"路线,允许子代理不调用完整 llm-wiki Skill,而是只读单个文件并输出 wiki markdown,主进程负责写盘。这个例外只覆盖阶段 3.5 的 .md/.txt/.pdf 批量入库场景,不推翻"Skill 已有能力优先调 Skill"的长期原则。

未来扩展位:媒体创作(阶段三)/ 子 agent 分工 / 多模型路由都依赖 agent 形态,是 Skill 给不了的。这些是 agent 形态存在的根本理由。

与既有 ADR 的关系

  • 强化 ADR-7(知识库上下文用 Extension 注入,不拼 prompt
  • 强化 ADR-13b(不抄 open-design 的多 CLI 子进程模式,因为我们最终是同仓库 agent)
  • 兼容 ADR-10pi-agent 作 npm 依赖)和 ADR-14app 内一键新建知识库)

ADR-17:阶段二新增前端依赖(react-markdown + cmdk

背景:阶段二引入 markdown 渲染(右抽屉显示 wiki 页面)+ 命令补全菜单(/@)。两个能力都需要新依赖。

决策(已在 web/package.json 落地):

依赖 版本 用途
react-markdown ^9 assistant 消息 + 右抽屉的 markdown 渲染
remark-gfm ^4 GFM 支持:表格、任务列表、自动链接
cmdk ^1 / 命令菜单 + @ 引用菜单底层(即 shadcn <Command> 基础)

拒绝项

  • marked / markdown-it:生态/类型/插件不如 react-markdown 稳
  • Radix Popover 自写:键盘导航与 a11y 都要重写,工作量大

与 ADR-9shadcn/ui)的关系cmdk 即 shadcn 官方 Command 底层;react-markdown 在 shadcn 生态里是社区主流选型。两者都与现有 UI 体系自然契合,无破坏性。

长期:阶段三引入产出类 Skilldocx / pdf / pptx+ open-design 设计 Skill 时,UI 端会需要更多依赖(PPT 渲染、文件预览等)。届时再补 ADR-18+。

ADR-18:阶段 3.5 多模型双角色 + 轻量子代理框架

背景:阶段 1-3 完成后两个痛点同时浮现——TBD-2(多模型路由)一直没有承载场景;阶段二的"一次喂一篇"消化模式拦住了批量进库的用户。两件事在阶段 3.5 合并解决:批量消化天然需要"便宜模型 + 并行",正好把多模型路由落地。

决策

  1. 双角色而非 N 角色:只引入 main(聊天)+ digest(消化)两个角色。拒绝项:"per-task 模型路由"(消化/沉淀/产出/对话各自一个)太复杂、用户配不动;"只有一个 default model"则无法承载阶段 3.5 的核心需求
  2. 角色配置存项目 config.json 不写 pi settings.json:跨工具污染坏处大于好处;~/.llm-wiki-agent/config.json 是我们自己的偏好文件
  3. main 角色接管主对话:设置里的 main 角色用于主对话创建和切换;保存 main 后重载当前活跃对话,让右上角模型显示与设置保持一致。digest 角色强制走子代理,保证"消化用便宜模型"的承诺
  4. 子代理用 pi SDK 原生 API 而非自建框架createAgentSession({ model, authStorage, modelRegistry, sessionManager: inMemory(), tools: ["read"] }) 已经够用。拒绝项:抄 omp 的 executor.ts / index.ts 那 3000 行(工作树隔离 / 嵌套子代理 / worker IPC 我们都不需要);自建独立子代理 runtime 重复造轮子
  5. 并发控制自写 30 行:拒绝引入 p-limit / async-pool 等并发库(一个 while 循环就能做);拒绝 Promise.all 一把开(N 个文件 = N 个并发模型请求会 429)
  6. 子代理不挂业务 extension:阶段 3.5 的批量本地文件消化是 ADR-16 的明确例外,消化是裸 prompt + 只读工具的简单任务,挂 KB / synthesis / artifacts extension 反而让 cheap 模型困惑
  7. 写盘归主进程:子代理只输出 wiki markdown 文本,主进程负责写到 wiki/synthesis/sessions/。让 cheap 模型决定文件路径风险大;主进程已知正确路径无需让 cheap 模型决策
  8. SSE 沿用 ADR-3 路线:批量消化接口直接返回 text/event-stream,不为此开 WebSocket,也不做轮询
  9. 拖拽优先于输入,但不假设浏览器一定暴露绝对路径:阶段 3.5 先实测 macOS Finder 拖拽时 DataTransfer 是否提供 file://;若提供则自动填路径,若不提供则用输入框作为明确兜底。输入框不是降级体验,而是 web 沙箱下必须保留的可靠通道

与既有 ADR 的关系

  • 解决 TBD-2(多模型路由):选项 B 落地——通过角色映射而非任务路由
  • 兼容 ADR-3SSE):批量消化进度沿用 SSE
  • 兼容 ADR-7(Extension 注入上下文):子代理不需要 KB 上下文,直接 prompt 传入;主对话保持现有 extension 注入路径
  • 兼容 ADR-16(Skill 优先):本阶段对子代理批量本地文件消化做一次受控例外,不扩展到 Skill 已覆盖的完整素材消化流程
  • 兼容 ADR-10pi-agent 作 npm 依赖):完全用 SDK 原生 API,不 fork 不 patch
  • 强化 ADR-12(会话绑定知识库):子代理是临时 inMemory session,不污染 KB 的对话历史
  • 强化 ADR-13(凭证落 ~/.pi/agent/auth.json):modelRoles 只存 {provider, modelId},不存任何 key

何时重新评估

  • main 角色切换后如果出现历史会话恢复异常 → 回退为仅对新会话生效
  • 用户反馈"批量消化输出格式漂移" → 引入 schema 校验 + 重试
  • 用户反馈"并发 3 还是太慢" → 提供更高档位 + 自适应降级(429 自动退避)

ADR-19:主对话引入“系统检索 + 上下文注入”

背景:阶段 3.5 批量消化后,用户进入当前知识库直接问“这些文章总结一下”,弱模型可能不会主动调用 list_knowledge_base_pages / read,而是反问用户提供文章内容。ADR-7 的“靠 Extension 工具让 agent 自觉获取上下文”在问答检索场景下不够稳定。

决策

  1. 主对话 /api/prompt 路径破例采用“后端检索 + 拼隐藏上下文”模式。
  2. ADR-7 的“应用状态用 Extension 注入”原则仍然成立;本破例只覆盖“问答类知识库检索”,不改变 current_knowledge_base 等状态工具。
  3. 同一份检索能力同时暴露为 query_knowledge_base 工具,保留 Extension 路径供强模型主动调用。
  4. 每个 user turn 独立判断并检索,不跨轮复用旧结果。
  5. 检索失败时降级为普通对话,同时通过 SSE 轻提示并写入 retrieval 日志,不中断用户输入。
  6. 阶段 4.6 补充:图谱增强检索不属于可见图谱交互,不占图谱候选池决策位;后续若做,归本 ADR 的检索质量演进线。

与既有 ADR 的关系

  • 破例 ADR-7:仅限主对话问答检索。
  • 兼容 ADR-3:新增轻量 SSE 事件。
  • 兼容 ADR-16:检索是 agent 工作台元能力,落在 server 端。
  • 兼容 ADR-18:不影响 digest 子代理批量消化路径。

何时重新评估

  • 主流模型工具调用稳定性显著提升 → 考虑改回纯工具路径
  • 用户大量反馈“参考页面被编造” → 强化 prompt 约束 + 引入后置校验
  • KB 规模超过 100 篇且本地文本检索变慢 → 引入向量检索

ADR-20:阶段四启动 monorepo 合并(丙方案)

背景ADR-16 定了"agent 成熟后并入主仓库",但没定时机。阶段四的图谱引擎是两端(工作台 / Skill 离线 HTML)共享的第一块代码——共享代码出现的那一刻,分居两仓库开始产生真实摩擦(跨仓库依赖、双份维护),即合并时机成熟的信号。另两个事实强化此决策:主仓库(1.8k+ star)自 2026-05-13 停更,单人双仓库 = 注意力分裂已被证实;llm-wiki-agent 名字与 SamurAIGPT 同名竞品(2.9k star、活跃)撞车,不可作为独立品牌发布。

决策

  1. 丙方案:本仓库 git subtree add --prefix=workbench(保留全历史)整体搬入主仓库;引擎落 packages/graph-engine/;主仓库根建 workspace package.json
  2. 只做工程合并,不做品牌动作:不发版、不改主仓库 README、不 archive 旧仓库——改名(llm-wiki-skillllm-wiki)、双形态叙事、对外发布留给后续品牌阶段
  3. 终局形态"一个产品、两扇门":产品 = 知识库文件格式 + 中文素材管线 + 方法论;Skill 与工作台是同一份知识库的两个访问端。Skill 永不砍(获客漏斗 + 格式中立性证明);工作台是长期重心(批量消化 / 多模型 / 产物 / 活图谱等 agent 形态独有能力的家)
  4. Tauri 打包(原阶段五)推迟:打包是分发优化,先用 git clone + npm run dev 验证工作台的真实外部需求
  5. 主仓库测试是 CommonJSmonorepo 根 package.json 不设 "type": "module"ESM 声明留在 workbench 子包内

拒绝项:双仓库长期并行(注意力分裂);agent 另立品牌(撞名 + star 池分裂 + 格式话语权分裂);引擎放 agent 仓库做完再搬(二次搬运纯损耗)。

与既有 ADR 的关系:落地 ADR-16(合并愿景 → 启动执行);ADR-16 的"能力归属原则"继续生效(Skill 已有能力调 Skillagent 元能力走 Extension);ADR-10pi-agent npm 依赖)不受影响。

ADR-21:图谱引擎与活地图(一个引擎、两个宿主)

背景:原阶段四"图谱集成"若做成 iframe 嵌 HTML,得到的是一个不能联动的孤岛。竞品图谱(Obsidian / Logseq)公认"好看不好用",根因是图谱后面没有人——只能看不能问。llm-wiki 工作台的图谱后面站着 agent,这是整个设计的支点。另:Skill 仓库 PR #44/#45 证明在静态布局上嫁接手动拖动必然失败(死布局无让位、指纹机制致重算后全部作废、localStorage 与知识库分离)。

决策

  1. 一个引擎、两个宿主@llm-wiki/graph-engineTS,双产物 ESM/IIFE);宿主差异用 capabilities 能力注入表达,引擎核心零分叉
  2. 新骨架、旧器官:现有 graph-wash ~2300 行按 A(纯函数直接搬)/ B(画法拆开搬)/ C(样式抽主题 token)/ D(新写)四级处理;A 级 1:1 翻译禁止顺手优化;M1"静态复现旧版"为重构安全网
  3. 活模拟 + 钉扎:d3-force(单模块);预计算起点 + 低温入睡的混合布局;拖动低温让位、松手即钉;钉扎存知识库根 .wiki-graph-layout.json(只存钉的、库内相对路径为 key、模型坐标)。原则:对知识的主观组织进库文件,浏览状态留本机。2026-06-19 修订:双击解钉不再作为主路径,固定/取消固定改为明确按钮或菜单动作。
  4. 位置层/结构层分权:拖动只改位置,颜色/社区/连线永远由真实 wikilink 决定;想改结构 → 通过选区提问让 agent 建链写回 wiki。图谱永不撒谎
  5. 选区 = 批量 @:结构化四式选择(点节点/点社区/+邻居/Shift 多选),砍自由套索(空间邻近无语义保证);选区面板结构事实先行、动作随性质变;动作本质是已有工作流(digest/comparisons/lint/crystallize)的空间入口;沿用 /api/prompt 文本通道不加新参数。2026-06-19 修订:点社区不再直接进入社区聚焦,先显示社区摘要,再由明确按钮进入社区。2026-06-26 增补:全局图点社区在“显示社区摘要”的同时,进入临时“全局社区高亮态”(复用 Sigma 全局现有 selection→社区 selected 视觉链路、补节点弱化与相机动画,不复用 focusCommunity/顶层 focus、不新增平行状态),当前社区强调、其他社区弱化但仍可见;真正进入社区仍由抽屉按钮负责。见阶段 4.8。
  6. 重算链监听文件系统而非"消化":变化源五个以上,只盯消化会让地图说谎;fs 监听 + 防抖 ~5s + 自家批量挂起;全量重算(子进程跑 build-graph-data.sh,不重写不做增量)+ 新旧 diff;diff 即动画剧本
  7. 生长动画 diff 队列:图谱可见时消费(不可见时徽标 + 打开补播);语义锚点发芽、错峰、≤3s、可跳过、尊重 prefers-reduced-motion
  8. 图谱绑当前知识库:与 ADR-12 会话绑库同构,切库 = 换地图;跨库图谱不做
  9. 主题一对:浅「数字山水」+ 深「墨夜」跟随工作台主题;不做主题商店——视觉签名的价值在"所有人记得住",不在"多数人喜欢"
  10. 顶部工具条替代左上浮层:阶段 4.6 后,社区列表、类型筛选、边图例、回全图等整图操作统一进入顶部工具条;工具条默认收起、半透明、浏览状态留本机。单节点操作仍留在右抽屉。

与既有 ADR 的关系:强化 ADR-2(对话中心:图谱是第二主屏,对话仍是第一);沿用 ADR-3(SSE 推 graph_updated);遵守 ADR-16 能力归属(数据管线调 Skill 脚本;选区/钉扎等工作台元能力走 server + 引擎);兼容 ADR-19(选区注入与检索注入同属"后端拼上下文"路线)。

何时重新评估

  • 力模拟或当前 DOM/SVG 在真实大库实测掉帧 → 全局大图不继续硬撑 DOM/SVG;按 2026-06-19 大图谱性能方案进入 Sigma/Graphology 主线,社区阅读继续保留 DOM/SVG
  • fs.watch recursive 在 macOS 实测不可靠 → 引入 chokidar
  • 选区注入大社区上下文超限 → 清单截断 + 提示 agent 分批读

ADR-22:图谱交互模型——点击即阅读,选区即升级

2026-06-19 修订:该 ADR 的“点击即阅读”已升级为“全局轻量摘要优先”。全局节点单击先打开轻量摘要;“打开详情 / 阅读”是明确动作,会进入所属社区并选中节点。社区色块/图例单击同样先显示社区摘要,再由按钮进入社区聚焦。

背景:阶段四把"点击节点"的默认响应做成了选区提问悬浮窗,作者实测确认这违背用户心智——点一个节点最常见的意图是"看它是什么"(阅读),不是"对它执行操作"(提问);且 stage-4 D6 动作映射表缺"单节点"行,单节点内部链接恒为 0 被误判进"无链接多选"剧本,产生废话统计与错位动作。

决策

  1. 单击 = 阅读:右抽屉阅读态(标题 + 元信息行 + 双动作 + 正文),无悬浮窗;选区是阅读的升级态(Shift 多选 / 点社区 / +邻居),同一抽屉切换状态
  2. 抽屉瘦身原则:抽屉负责内容,图谱负责关系,凡从正文派生的信息(摘要、置信度列表、邻居列表)不重复展示;学习系统三件套不做(待真实使用后按工作台语境重新设计)
  3. 动作映射表必须覆盖全部选区类型(含单节点与孤岛单节点),统计卡仅 ≥2 节点显示
  4. 画布导航是图谱的地基能力(缩放/平移/回全图/小地图联动),引擎层实现两端同享。2026-06-26 增补:回全图按当前层级分行为:社区视图→切回全局;全局高亮态→退高亮并清空选择/关抽屉/回构图;普通全局→重置视角且保留筛选/Pin/搜索(见阶段 4.8)。

与既有 ADR 的关系:修订 ADR-21 第 5 条的选区面板形态(悬浮窗 → 抽屉态);强化 ADR-2(对话中心,图谱阅读复用工作台抽屉基建);沿用 stage-4 D9 原则(视口/图例折叠等浏览状态留本机)。


ADR-23:关系边可视化采用“关系类型控制颜色、置信度控制虚实”

背景:阶段 4.6 要把关系词汇表真正画上图。执行前核验发现,旧边字段 type 实际承载的是 EXTRACTED / INFERRED / AMBIGUOUS 置信度,不是“实现 / 依赖 / 对比 / 矛盾 / 衍生”等关系类型。若直接拿旧 type 上色,会把两种语义混在一起。

决策

  1. 边数据契约分两维:保留旧 type=confidence 兼容入口,同时显式输出 confidencerelation_type。数据管线可读取同一行 <!-- relation: ... --> / <!-- relation_type: ... --> 注释;旧链接默认 relation_type=依赖confidence=EXTRACTED
  2. 颜色只表达关系类型:矛盾用避开 ENTITY 红的品红系,对比用琥珀,顺承关系(实现 / 依赖 / 衍生)用主题中性色。
  3. 虚实只表达置信度:原文关系为实线,推断关系为虚线,待确认为弱虚线 / 点划,不再借颜色表达置信度。
  4. 全局克制、局部完整:全局图边保持低权重,避免大库变噪;进入社区聚焦视图后,边色与虚实完整呈现。
  5. 两个宿主同享:工作台与离线 HTML 都使用同一引擎渲染边、边图例和 hover 关系提示;离线 HTML 仍不注入提问能力。

与既有 ADR 的关系:强化 ADR-21 的“一个引擎、两个宿主”;延续 ADR-22 的“抽屉负责内容,图谱负责关系”;不改变 ADR-19 的检索演进线。

ADR-24:Paper 暖纸视觉方向与外观偏好

背景:工作台已经从最初的深色工具壳进入长期使用阶段。用户在对话、消化、导出和图谱之间反复切换,界面需要更像一张可读的工作纸面,而不是临时调试台。Paper v2 原型已通过多轮设计确认,方向不再重新讨论。

决策

  1. 默认浅色暖纸:默认主题从深色改为浅色暖纸,夜灯主题保留为一键切换。
  2. 统一顶栏:跨视图共享的搜索、模型、新对话、主题和外观操作进入顶栏;对话区和图谱区不再各自维护重复状态条。
  3. 外观偏好本机持久化:纸张、强调色、气泡、手写点缀、密度和主题走 localStorage,不写后端,不进知识库目录。
  4. 单一 CSS 类系统:沿用并演进现有 .msg-* / .chat-* / .tool-* / .drawer-* 等类,不引入并行 .pw-* 类层。
  5. 强调色用预设属性:强调色通过 data-accent 预设驱动 CSS 变量,避免行内样式和外观状态双主漂移。
  6. 图谱画布内部后置:本次只统一图谱 Tab 外壳、工具条和图例;Sigma 画布内部配色另起任务。

与既有 ADR 的关系:修订 §5.2 / §5.4 的旧深色工具感方向;兼容 ADR-2(对话中心)、ADR-9shadcn/ui)、ADR-21(图谱引擎与宿主分权)。

ADR-25:前端交互测试与 Paper 视觉回归栈

背景:现有前端测试以 node:testrenderToStaticMarkup 为主,只能证明静态输出,无法证明按钮点击、键盘快捷键、localStorage 外观偏好、抽屉拖拽和顶栏模型切换真的可用。Paper UI 迁移是高交互改动,继续只靠静态测试会漏掉真实用户路径。

决策

  1. 引入 DOM 交互测试:前端 dev 依赖加入 jsdom@testing-library/react,并提供统一 test setup,覆盖点击、键盘、localStorage 和 document dataset。
  2. 引入 Playwright 视觉回归脚本:为 Paper 主题组合、长对话、抽屉和响应式视口提供可重复截图入口。Playwright 只作为前端开发 / 验收依赖,不引入新 UI 框架。
  3. 阶段验收真实运行:每个阶段继续保留 typecheck / build / test;最终阶段必须运行 lint、浏览器主流程和 Paper 视觉截图脚本。
  4. 性能样本进入验收:长对话、搜索大列表、纸张纹理和字体兜底必须有固定样本,避免视觉迁移只验证空页面。

与既有 ADR 的关系:延续 ADR-8React + Vite)、ADR-9shadcn/ui)和 §5.5 的真实事件流原则;不改变后端、Skill 或图谱引擎测试策略。

ADR-26:两套图谱的分工(全局 Sigma vs 社区视图)

背景:全局图从 DOM/SVG 迁到 Sigma 后,两套图谱并存:全局 Sigma(WebGL 大图)+ 社区视图(DOM/SVG 聚焦图)。两者的边界其实已在代码和 ADR-21/22/23 里实现并落地,但散落各处、没有显式定义,导致每加一个图谱功能都要重新争论边界、靠反复写「明确不做」来防守。本 ADR 把已实现的边界正面固化,作为后续图谱演进的裁判。

决策

  1. 全局 Sigma 是「总览图」:服务「整个库长什么样、我在哪、整体结构怎样」;关系边克制(低权重、不画虚实)——WebGL 大图逐条画 dash 不现实,且全局图目的是概览不是精读;强营销 + 导航属性。
  2. 社区视图是「关系工具」:服务「这一簇内部到底是什么关系」;完整呈现关系边(颜色=关系类型、虚实=置信度)、二跳关系聚焦、hover tooltip、键盘可聚焦——这些是 WebGL 大图给不了的;只对中小社区是完整工具,超大社区(>1000 节点)克制呈现为轮廓/轻量地图。
  3. 切分原则:凡是「对一组页面做事」(总结/找缺口/生成主题页/探索关系/对话)走抽屉(与渲染无关,本质是选区 = 批量 @);凡是「看清一组页面之间的关系」走社区视图。全局 Sigma 负责「发现和圈选」,社区视图负责「细看关系」,抽屉负责「理解 + 动作」。
  4. 进入心智——两步、不直跳:全局图点社区先打开抽屉(摘要 + 结构状态),由抽屉的「进入社区」按钮才切到社区视图;全局侧点社区会进 spotlight 高亮态(阶段 4.8)给地图反馈,但不等于进入社区视图;抽屉是「是否进社区」的决策点,其结构状态(清晰/松散)是分流信号,具体分流实现见统一社区抽屉 plan。
  5. 演进红线:社区视图迁 Sigma 现在明确不做,除非 Sigma 能在中小图上低成本做出「二跳聚焦 + 虚实边 + 可访问性」同等富交互且不牺牲大图性能;全局 Sigma 上移社区视图能力只在某项能力证明全局也有高频价值且 WebGL 能承担时考虑;新增第三套图谱(如嵌入布局投影图)需先证明它解决的是前两套都解决不了的问题。

与既有 ADR 的关系:提炼并正面固化 ADR-21(一个引擎两宿主、选区=批量@)、ADR-22(图谱负责关系、抽屉负责内容)、ADR-23(全局克制、局部完整)里已隐含的分工;不改变任何已实现的代码边界,本 ADR 是把代码事实文档化。

何时重新评估:见决策第 5 条演进红线;另外若用户实测发现「进入社区」频次异常低、或社区视图的差异化能力长期无人使用,需重新审视切分原则是否成立。

8. 给 0 代码作者的盲区与协作规则

8.1 环境陷阱

  • macOS 默认 Node 版本可能旧。统一用 mise 或 nvm 管理 Node 版本,锁到 >=22.19.0pi-coding-agent 0.75.x 的硬要求)。否则 npm install 就直接报错
  • 不要全局 npm install -g。每个项目用 package.json 锁版本
  • API key 完全不进我们的仓库,也不进 ~/.llm-wiki-agent/。统一由 pi-agent SDK 管理,落到 ~/.pi/agent/auth.json(权限 0600)。详见 ADR-13

8.2 进度陷阱

  • "差一点就跑通了"是最危险的状态。验收标准要严格,跑不通就不进下一阶段
  • AI 协作最大的隐性风险:你不懂代码 → AI 改 A 引起 B 坏,你不知道 → 雪球越滚越大
    • 对策:每阶段结束让 AI 主动列出"本次改了哪些文件、新增了什么依赖、为什么",你看明白再确认
  • Git 是你的安全网。每个验收节点 commit 一次。

8.3 协作规则(AI 必须遵守)

  • 不要自由发挥。每次动手前先说"打算改哪些文件、为什么这么改、对其他部分有什么影响",作者确认后再动
  • 任何要新增依赖npm package、Skill、配置项),先问"这是 PRODUCT.md 里规划过的吗"
  • 任何要修改 PRODUCT.md 之外的决策,先说明"这与 PRODUCT.md 第 X.Y 节冲突,建议修改文档为 Z",等作者拍板
  • 作者思路断了的时候,先读 PRODUCT.md,不要急着问"我们做到哪里了"——日志和 git 记录是事实,文档是意图,两个对照看
  • 绝不主动跳阶段。阶段二验收不过,不允许动阶段三的代码

8.4 心态陷阱

  • 0 代码做出本地工具是可行的,但**"做出来"和"做得好"差距很大**
  • 阶段一跑通会有巨大成就感,但 80% 时间在阶段二-四
  • 桌面打包(阶段五)是难度峰值,会卡很多坑
  • 接受"中途某个设计要推倒重来"——写进 ADR 比硬撑下去更省力

9. 待决事项

记录尚未拍板但要在未来某阶段决定的事。决定后移到 ADR。

编号 事项 现状 何时定
TBD-1 项目正式名 已定:llm-wiki-agent。桌面应用显示名留到阶段五前再定
TBD-2 默认模型 阶段 3.5 已落地:双角色 modelRoles.{main, digest} 写入 ~/.llm-wiki-agent/config.jsonmain 角色用于主对话,digest 角色用于批量消化。详见 ADR-18
TBD-3 多库会话隔离 已定:会话绑定知识库,同库支持多并行对话(见 ADR-12
TBD-4 危险操作确认 删除 / 覆盖类是否弹窗 阶段二
TBD-5 API key 配置 UI 已定:三层 fallbackpi CLI 登录 / UI 填 key / env var),统一存 ~/.pi/agent/auth.json(见 ADR-13
TBD-6 知识库导入导出 是否需要打包导出格式 阶段四后
TBD-7 知识库根目录 已定:默认 ~/llm-wiki/ + 外部目录登记(见 ADR-11
TBD-8 HTML 产出 Skill 用现成的还是自建 阶段三

10. 进度追踪

阶段一:主干打通 已完成 2026-05-26

# 任务 Commit
1 仓库骨架:package.json / .gitignore / README.md / LICENSE / tsconfig.json 81ddb29
2 后端骨架:Node + Hono,最小 /api/echo 5ffd2c0
3 前端骨架:Vite + React + shadcn/ui + SSE echo 排练 3662b60
4 接入 pi-coding-agent SDK,实现真 agent 对话 c4e0dad
5 第一个 Extension:注入 currentKnowledgeBase 上下文 ebe054b
6 知识库扫描接口:扫 ~/llm-wiki/ + 读 config.json 外部库 daebc62
7 前端知识库选择 UI + 三栏布局雏形 49dc00e
8 同库多对话 + 切换 + 持久化(阶段一完结) 75e176b
review 修补:一行 npm run dev / auto-restore / 默认深色 / 顶部状态条占位 f835433
TBD-2 删 Sonnet 表述 + 光标真闪烁 dd021bc

阶段一完成情况详见 §4 阶段一末尾的"完成情况"小节。

阶段二:核心循环(@、/、结晶、消化) 已完成 2026-05-27

最终 PR#1 feat: complete stage 2 core loopbase: main, head: stage-2

8 step commit + 5 fix commit + 1 doc 修订 commit

# 任务 Commit
1 /sediment Extension:结晶对话到 wiki/synthesis/sessions/ fe54d47
2 /new-wiki Extensionspawn init-wiki.sh 新建库 5ab13dc
3 /api/refs:候选页面列表(递归 fingerprint 缓存) b0802b8
4 /api/commands:内置 + Skill 命令合并(TBD-1 方案 B 202bf4d
5 设置面板:API key 三层认证 + 测试连接(TBD-2 方案 B) 3654791
6 / 命令补全 UIcmdk b6dffc0
7 @ 补全 + 右抽屉 + markdown 渲染(react-markdown 7801d2c
8 消化新素材 chip 7a46f4b
fix: 设置面板可关闭 c045b9e
fix: /api/commands 包含 Claude skill 791d73a
fix: agent resource loader 加载 Claude skill 目录 f990229
fix: 新建库 UI 端点 + refs cache fingerprint 升级 + Sidebar 加按钮 a088b97
fix: 右抽屉支持 Esc 关闭 2686b51
docs(stage-2): 闭合验收 issue #2/#3/#4 + 标 TBD-3 已解决 208ad4d

阶段二完成情况 2026-05-27(合并 PR #1 后)

  • 范围 7 项全部交付(@、/、/sediment、/new-wiki、链接预览、消化、设置面板)
  • 验收 3 条全过:建库 / 消化→讨论→结晶 闭环 / API key 落 ~/.pi/agent/auth.json
  • 关键架构决策:D9 能力归属原则(消化等知识库本职 → Skill;对话结晶等 agent 元能力 → Extension)落地,对应 ADR-16 长期合并愿景
  • 超出原设计的增强
    • POST /api/knowledge-bases/new + NewWikiDialog(UI 直接建库,不必先与 agent 对话)
    • pages.ts cache 升级 mtime → 递归 fingerprint(修了"嵌套新建后 refs 看不到"的潜在 bug
    • wiki-init.ts::findInitScript() 兼容 init-wiki.sh 在 skill 根目录或 scripts/ 两种位置
  • 接受的妥协(不阻塞阶段三):
    • 设置面板只做认证 Tab(默认模型 / 根目录 / 外部库管理推迟)
    • Anthropic 测试连接未跑(缺 key),但代码路径同 DeepSeek 一致
  • 新增依赖:见 §3.2 + ADR-17

阶段三:产出能力(产品亮点) 已完成 2026-05-27

最终分支stage-3base: main, head: 1f1f591

8 step commit + 1 fix commit

# 任务 Commit
1 vendor 4 个 anthropics Skills + 收紧命令源标签 6d2e218
2 产物 manifest 存储 + CRUD API f19687c
3 导出按钮 + prompt 模板(3 通道触发) bf6b878
4 产物右抽屉多 Tab 切换 bc70b2c
5 HtmlRendereriframe sandbox 预览 862265a
6 DownloadOnlyRenderer:元数据卡片 + 下载 38006a7
7 全局 Skill 可见性开关(settings toggle 1016601
8 产物工作流 UX 打磨 91a9761
fix: 修复导出工作流 review 问题 1f1f591

阶段三完成情况 2026-05-27(审查通过,合并到 main)

  • 范围全部交付:5 个导出按钮(PDF/Word/PPT/Excel/HTML+ 4 个 vendored Skills + 2 个 Extension 工具 + 6 个新 API + 1 个新 SSE event
  • 关键架构决策:E13D9 落地)——产出操作走 Skillprepare_artifact / finalize_artifact 作为 agent 元能力 ExtensionHTML 导出不依赖 Skill,由 agent 内置能力直接生成
  • 新增 4 个端点:GET /api/artifactsGET /api/artifacts/:idGET /api/artifacts/:id/files/:filenamePOST /api/config + GET /api/config 扩展 showUserGlobalSkills
  • 安全验证通过:path traversal 防护、iframe sandbox(无 allow-same-origin)、UIID 验证、文件名净化
  • 接受的妥协(不阻塞阶段四):
    • PPTX 在浏览器内无预览(DownloadOnlyRenderer),设计文档原定的 PPTXjs 方案未落地
    • HTML 导出不依赖外部 Skill,由 agent 内置 fs 能力直接生成(TBD-5 方案)
  • 新增依赖:无(0 个新 npm package

阶段 3.5:导航 UX 重构 + 多模型子代理批量消化 已完成 2026-05-27

当前状态:已合并到 main 并推送;阶段性分支已清理

7 step 概览

# 任务 状态
1 侧栏重构:统一 KB 列表 + 折叠对话子树
2 拖拽 + 输入框路径填充(含 inspect 端点)
3 非 wiki 目录初始化引导
4 多模型双角色(main / digest
5 后端子代理批量消化框架
6 批量消化 UI + SSE 进度推送
7 总验收 + UX 体感打磨

关键风险

  • TBD-3.5-1:子代理 session 共享 authStorage / modelRegistry 的资源生命周期未实测(codex 起手第一件事写 60 行验证)
  • TBD-3.5-2init-wiki.sh 就地初始化会写入固定文件,必须先做冲突检测与备份(Step 3 起手看源码确认文件列表)
  • TBD-3.5-3:main 角色已接管主对话;设置切换后重载当前活跃对话

验收实况

  • npm run --silent typecheck 通过
  • node --import tsx --test server/src/digest/concurrency.test.ts 通过
  • 本地接口实测通过:目录 inspect、初始化冲突 409、就地初始化成功、模型列表、模型角色保存、批量消化参数校验
  • 单文件批量消化真实跑通,SSE 返回 start / file_start / file_complete / done,并写入 wiki/synthesis/sessions/
  • 验收后补强:批量消化改为逐文件失败隔离,进度面板显示每个文件状态、生成字数和结果入口;外部目录批量消化改用 inspect 扫描凭据,不再信任前端传任意 sourceRoot;初始化后批量消化可临时选择 digest 模型
  • 收尾补强:当前知识库自动检索已落地;批量消化后直接提问会先检索当前知识库,普通寒暄和导出指令不会误触发检索
  • UI 视觉迁移补强:基于本地原型 index.html 统一工作台视觉,补齐浅色 / 深色主题切换;保持原有侧栏、对话、引用、命令、产物抽屉、设置、批量消化流程不变,不新增依赖
  • 预览布局补强:侧栏可折叠为 52px 窄图标栏,右抽屉支持拖动调宽和双击恢复默认宽度;折叠状态与抽屉宽度保存在本机;移动端继续使用全屏抽屉
  • 设置面板补强:设置弹窗限制最大高度,标题区保留在顶部,设置内容在弹窗内部滚动;底部 Skill 加载区在较矮屏幕下也可达

阶段四:monorepo 合并 + 图谱活地图 已完成 2026-06-12

当前状态:已在主仓库 stage-4 分支完成。8 个 Step 均有提交或人工验收证据,最终自动化检查全绿;视觉一致性、拖动手感、墨夜观感保留为验收人主观判断项。

8 Step 概览

# 任务 状态
0 monorepo 搬家(subtree + workspace 根 + 冒烟)
1 引擎包骨架 + helpers TS 化 + 测试迁移
2 工作台图谱视图静态复现(安全网基线)+ 主题 token
3 活模拟 + 钉扎 + 持久化
4 选区系统 + 对话联动
5 文件监听 + 重算链 + 生长动画
6 Skill 离线 HTML 切换引擎产物
7 总验收 + 墨夜打磨

关键风险处理结果(详见设计文档 §7):根 package.json 未设置 type:module;手绘路径采用帧缓存;macOS Node 22 原生 fs.watch recursive 实测可用,未引入 chokidar;subtree 与提交前隐私路径检查均通过。

设计来源2026-06-12 四轮设计对话(战略定位 → 选区 → 钉扎持久化 → 生长事件链 → 引擎抽取),关键结论沉淀为 ADR-20 / ADR-21。

阶段 4.5:图谱可用性收尾 已合入 2026-06-14

当前状态:已合入。决策记录见 ADR-22。

设计来源:作者实测五问题(缩放缺失 / 点击语义错位 / Shift 不可发现 / 无搜索图例 / 节点过胖)+ 阶段四验收的离线功能减配裁决。两处上游盲区已在设计中修正:stage-4 plan 漏列画布导航 WUstage-4 D6 映射表缺单节点行。

阶段 4.6:图谱演进第一批 已完成 2026-06-14

当前状态:已完成并通过总验收。关系类型和置信度已分字段,渲染用关系类型控制颜色、置信度控制虚实;社区聚焦、类型筛选、顶部工具条、边图例、双宿主分工均已落地。决策记录见 ADR-23,ADR-21 已同步 4.6 对社区交互和工具条的修订。

阶段 4.7:图谱交互地基重构 已完成 2026-06-16

当前状态:已完成核心交互地基。滚轮缩放、拖拽、点击、悬停、社区色块、小地图边界在工作台与离线 HTML 中保持同一套行为;社区色块是视觉提示,不是拖动围栏。

后续触发门:空间索引、Canvas/WebGL、密度策略重做、小地图拖拽导航都不属于本阶段;只有真实使用或性能证据证明需要时再启动。

阶段 4.8:图谱演进——全局社区高亮(spotlight) 已落地

当前状态:已落地。点社区在全局高亮、不进入社区视图;复用现有 selection(社区)视觉链路补节点弱化 + 相机动画,不复用 focus、不新增平行状态。#75 已补齐动画期间 overlay 轻量跟随和结束后精确校准。

阶段五:未开始(Tauri 打包已决策推迟,见 ADR-20)

协作约定(持续生效)

每一步动手前 AI 都要先说计划,作者确认后再动。每完成一步:

  • AI 列改动清单(文件、依赖、决策)
  • 作者确认理解
  • AI 创建 git commitcommit message 含本步范围 + 实测验收要点)
  • 进入下一步

附录 A:术语表

术语 解释
Skill Anthropic 提出的能力包格式:一个目录 + 一份 SKILL.md。详见 agentskills.io
pi-agent TypeScript agent runtime,原生支持 Skill 标准。@earendil-works/pi-coding-agent
SSE Server-Sent Events,服务器单向推送事件给浏览器的 HTTP 标准
Extension pi-agent 的扩展机制:TS 模块,能注册自定义 tool / 命令 / 拦截事件 / 持有状态
Tauri 用系统 webview + Rust 后端打包跨平台桌面应用的框架,二进制和内存占用通常显著低于 Electron
Hono 轻量 TypeScript web 框架,跑 Node / Bun / Deno / Cloudflare 都行
shadcn/ui 组件库,但代码是直接复制到你仓库的(不是 npm 黑盒),方便修改
结晶 / 沉淀 把对话内容固化为 wiki 页面的动作(继承自 llm-wiki-skill 术语)

附录 B:参考链接


本文档第一版完成于 2026-05-26。后续更新请在文末追加 changelog。

Changelog

  • 2026-06-27 v22(全局 Sigma 缩放手感修复 #73):修掉全局图谱触控板/滚轮缩放的"按档位卡顿"
    • 根因:wheel 路径在相机动画进行中时改走 animate({duration:1}),被 Sigma 的 rAF 重入切成离散跳变,违背设计 §5"滚轮直接更新相机、不排队动画"
    • 修复:wheel 无条件走 camera.setState(即时);handleSigmaWheelZoomdestroyed 守卫;同步更新测试断言与盲区注释
    • 验证:单元 460 pass;浏览器生产回归 33 records / 3 shapes PASS;实机确认手感改善
    • 已知局限:合成 wheel 事件测不准真实触控板"积压",手感以实机为准(测试已加注释)
    • 分支 codex/fix-global-graph-zoom-controls9 个 commit05be23d..9c897cf
    • 后续债务:sigma-global-renderer.ts 又涨到 1566 行,拆分已立项 #77(承接 #64)
  • 2026-06-20 v21Paper UI 立项与文档对齐):确认工作台默认外观迁移为 Paper 暖纸
    • §5.2 顶部状态条改为统一顶栏:知识库静态展示,搜索、模型、新对话、主题、外观和设置集中在全局操作区
    • §5.4 视觉风格改为默认浅色暖纸、夜灯可切、Plus Jakarta Sans / Caveat / JetBrains Mono 字体组合
    • §7 新增 ADR-24(Paper 暖纸视觉方向与外观偏好)与 ADR-25(前端交互测试与 Paper 视觉回归栈)
    • 明确图谱画布内部 Paper 化和真实跨库 / 全文搜索后端后置
  • 2026-06-16 v20(阶段 4.7 图谱交互地基完成):补记图谱交互地基重构
    • §4 新增阶段 4.7:记录缩放、拖拽、点击、悬停、社区色块、小地图边界统一为同一张地图心智
    • 明确社区色块是视觉提示,不是拖动围栏;节点可离开色块,社区归属仍由真实链接决定
    • 明确空间索引、Canvas/WebGL、密度策略重做、小地图拖拽导航均需真实使用或性能证据触发,不属于本阶段
    • §10 新增阶段 4.7 状态,方便后续恢复上下文
  • 2026-06-14 v19(阶段 4.6 实施完成):图谱演进第一批完成并同步文档
    • §4 / §10 阶段 4.6 状态改为已完成,记录工具条、社区聚焦、类型筛选、关系边图例、双宿主分工的验收结果
    • §4 图谱演进候选池标注首批已落地项;图谱增强检索明确移交 ADR-19 检索线
    • §7 ADR-19 增补检索线归属说明,ADR-21 增补社区聚焦与顶部工具条修订,新增 ADR-23(关系边可视化:关系类型控制颜色、置信度控制虚实)
  • 2026-06-14 v18(阶段 4.6 立项 + plan 审查加固):图谱演进第一批进入执行准备
    • §4 新增/修正"阶段 4.6:图谱演进第一批":G1-1 改为先补齐关系类型 + 置信度边契约,再用关系类型控制颜色、置信度控制虚实;G1-2/G1-3/G1-4/G1-5 保持日常可用性方向
    • §10 新增阶段 4.6 状态;阶段 4.5 状态同步为已合入,避免后续执行误判基线
    • 图谱演进候选池修正"关系类型上边"的现状描述:关系词汇表与置信度体系已有,但当前边 type 不是关系类型
  • 2026-06-15 v18(对话工具状态体验):补记 omp 风格动态工具状态已落地
    • §5.4 增加工作台对话区工具状态原则:当前 assistant 回复只保留一个动态工具条,完成后折叠为分组摘要,停止时保留取消状态
    • §5.5 更新等待状态表述:不做空白思考动画,改用动态工具状态和流式文本
  • 2026-06-13 v17(图谱演进候选池):行业全景分析沉淀进"阶段后规划"
    • §4 阶段后规划新增"图谱演进候选池":统领判断(两条行业尸检教训)+ 推荐切片 7 项(局部图/路径讲解/lint 上图/关系类型上边/过滤器/导出美图/图谱增强检索)+ 远期池 4 项(绑定消化管线升级批次)+ 明确不做 3 项(3D/白板化/WebGL 重写)+ 竞品技术参考存档
    • 定位:4.5 之后再排期,防止思考成果丢失;4.5 范围不受影响
  • 2026-06-13 v16(阶段 4.5 设计完成):图谱可用性收尾设计定稿
    • §4 新增"阶段 4.5:图谱可用性收尾"小节(P0 画布导航 + P0 点击语义重构 + P1 搜索/图例/Shift + P2 节点瘦身 + 抽屉瘦身定稿)
    • §7 新增 ADR-22(图谱交互模型:"点击即阅读,选区即升级";抽屉负责内容、图谱负责关系、派生信息不重复;动作映射表必须全覆盖;画布导航为地基能力)——修订 ADR-21 第 5 条选区面板形态
    • §10 新增阶段 4.5 小节
    • 上游盲区修正记录:stage-4 plan 漏列画布导航;stage-4 D6 映射表缺单节点行
  • 2026-06-12 v15(阶段四实施完成):阶段四 8 Step 完成并回填进度
    • §4 / §10 阶段四状态改为完成;记录总验收自动化检查通过,主观视觉/手感项交由验收人判断
    • §10 阶段四 8 Step 全部打勾;补记 fs.watch、根 package 类型、路径隐私检查等关键风险处理结果
  • 2026-06-12 v14(阶段四设计完成)monorepo 合并 + 图谱活地图设计定稿
    • §4 阶段四整节改写:"图谱集成" → "monorepo 合并 + 图谱活地图"8 Step + 7 条验收)
    • §7 新增 ADR-20(阶段四启动 monorepo 合并丙方案:subtree 进 workbench/、引擎落 packages/graph-engine/、只做工程合并不做品牌动作、Tauri 推迟)与 ADR-21(图谱引擎与活地图:一个引擎两个宿主、新骨架旧器官、活模拟+钉扎、位置/结构分权、选区=批量@、文件监听重算链、diff 生长动画、山水/墨夜双主题)
    • §1.3 补"阶段四起合并启动"段落(一个产品、两扇门)
    • §10 阶段四小节:设计完成状态 + 8 Step 占位 + 4 项关键风险;阶段五标注 Tauri 推迟
    • 阶段四设计细则已归档为本地资料
  • 2026-05-28 v13(设置面板滚动修复):补记设置弹窗高度与内部滚动修复
    • 设置面板限制最大高度,避免底部设置被屏幕遮住
    • 设置内容区改为内部滚动,标题和关闭按钮保留在顶部
    • 设置面板滚动修复的设计与验证记录已归档为本地资料
  • 2026-05-28 v12(阶段 3.5 预览布局收尾):补记可拖动预览区与侧栏折叠
    • 右抽屉支持拖动左边缘调整预览宽度,双击恢复默认宽度;宽度保存在本机
    • 左侧栏支持折叠为 52px 窄图标栏,保留核心入口并提供悬停提示;折叠状态保存在本机
    • 小屏幕下保持原有全屏抽屉方式,不启用拖动
    • 可调预览布局的设计与验证记录已归档为本地资料
  • 2026-05-28 v11(阶段 3.5 UI 收尾):补记原计划外的 UI 原型迁移
    • 基于本地原型 index.html 统一工作台视觉,覆盖侧栏、顶部状态条、对话区、输入区、@ / / 菜单、右抽屉、设置和批量消化面板
    • 增加浅色 / 深色主题切换,默认深色,用户选择保存在本机
    • 保持阶段 3.5 既有产品范围,不新增 npm 依赖;本次属于收尾视觉补强,不改变知识库和 agent 行为
  • 2026-05-28 v10(阶段 3.5 收尾):阶段 3.5 收尾补强完成,准备合并推送
    • 新增当前知识库自动检索:主对话提问时后端先检索当前 KB 并注入上下文,避免批量消化后模型反问用户提供文章
    • query_knowledge_base 工具与 /api/prompt 共用同一套检索逻辑,ADR-19 已写入 §7
    • 检索失败降级为普通对话并写 retrieval 日志;寒暄、/ 命令、导出产物指令不会误触发检索
    • 验证覆盖:检索单测、并发单测、类型检查、真实接口总结/寒暄/导出三条路径
  • 2026-05-27 v9(阶段 3.5 完成):阶段 3.5 实施完成并本地验证
    • 侧栏统一、拖拽/输入路径检查、非 wiki 目录初始化、多模型角色、批量消化子代理、SSE 进度浮窗均已落地
    • 保持零新增 npm 依赖;main 角色已接管主对话,digest 角色用于批量消化
  • 2026-05-27 v8(阶段 3.5 设计完成):阶段 3.5 设计完成,待 codex 实施
    • §4 新增"阶段 3.5:导航 UX 重构 + 多模型子代理批量消化"小节,列出背景、7 step 范围、5 条验收标准、设计文档指引
    • §7 新增 ADR-18:阶段 3.5 多模型双角色 + 轻量子代理框架(9 条核心决策 + 与既有 ADR 关系 + 重新评估触发条件)
    • §9 TBD-2 状态更新:"阶段三再做"→"阶段 3.5 落地中"
    • §10 新增"阶段 3.5"小节:当前分支 stage-3.5、设计文档链接、7 step 占位、3 个关键风险
    • 阶段 3.5 设计细则已归档为本地资料
  • 2026-05-26 v7(阶段一完成标记):阶段一全部 step + review 修补完成,作者确认 MVP 可用
    • §4 阶段一标题加 ✅ 已完成 2026-05-26
    • §4 阶段一末尾新增"完成情况"小节:含最终 commit、验收实况、接受的妥协、启动 & 运行速查表compact 后从这里恢复上下文)
    • §10 重命名 "下一步行动" → "进度追踪":阶段一 8 step + 2 review commit 全部 + commit hash 表;阶段二预占骨架(7 项待办);阶段三/四/五标 "未开始"
    • 协作约定移到 §10 末尾,作为持续生效条款
  • 2026-05-26 v6
    • TBD-2 表述改:删"阶段一固定 Claude Sonnet",改为"沿用 pi-agent 默认设置"。实际作者通过 pi-agent 的 provider 体系接入了其他 provider(如 zai/glm-5.1),llm-wiki-agent 本不该假设固定 Sonnet
    • §阶段后规划"多模型路由"措辞更通用,不锁死 Anthropic
    • 微调:ChatPanel 流式光标 animate-pulse → 自定义 animate-cursor-blink1s steps 真闪烁,原 pulse 在 ▍ 粗块上视觉太弱)
  • 2026-05-26 v5(阶段一完结 review 修补):实际 review 阶段一代码对照文档,发现并修复 3 项硬 gap、4 项偏差对齐
    • 修 Gap 1:根 package.jsonnpm run dev 一行起两个服务(用 concurrently,符合 §4 阶段一范围第 1 条)
    • 修 Gap 2AppConfiglastUsedKbPathselectKb/selectConversation/createNewConversation 写入;agent.bootstrapFromConfig() 启动时 await 恢复(符合 §5.1.1
    • 修 Gap 3web/index.html <html class="dark">(符合 §5.4 "默认深色"
    • §5.2 顶部状态条占位:ChatPanel header 加 🤖 模型 显示(disabled,从后端返回的 active.model 拿真实 provider/id+ ⚙ 设置 占位按钮,tooltip 标注"阶段二/三补"
    • §5.5 严禁项对齐:删除 "等待 agent 响应…" 文字提示;streaming 时最后一个 assistant 气泡显示 光标
    • §5.4 等宽字体:index.css--font-mono (JetBrains Mono / SF Mono stack) 给 code/pre/kbd/samp 元素
    • 后端 /api/knowledge-base GET/POST、/api/conversations POST、/api/conversations/new POST 全部在 active 上返回 model: { provider, id } | null
    • 明确推迟到阶段二/三:§5.1 侧栏底部"图谱入口"延迟(阶段四,作者要重新构思);"设置入口"占位放在 ChatPanel header(阶段二补完整面板)
  • 2026-05-26 v4 (review pass):基于源码/文档验证,修复 5 项事实错误 + 4 项精确化 + 3 项软化/标注
    • 修:§3.1 架构图知识库路径 ~/wikis/~/llm-wiki/,并补充 ~/.pi/agent/auth.json
    • 修:§6.2 知识库目录补 wiki/comparisons/wiki/overview.md.wiki-tmp/.gitignore(依据 scripts/init-wiki.sh 实际行为)
    • 修:§8.1 删除"API key 走 config.json"过期描述,改为引用 ADR-13
    • 修:§9 TBD-5 已定描述同步到 ADR-13 现状
    • 加:Node 版本要求 >=22.19.0pi-coding-agent 0.75.x 硬要求,写入 §3.2、§3.4、§8.1)
    • 加:§3.4 补充 Extension 注入方式(SDK 用 bindExtensions / ResourceLoader,不依赖 CLI 全局发现)
    • 加:§6.4 Obsidian 忽略列表补 .wiki-tmp/ 和 dev 类目录
    • 加:§2.3 anthropics/skills 列出 17+ 个实际 Skill,不止"四件套"
    • 软:§3.2 "Tauri 比 Electron 轻 10×" → "二进制和内存通常显著低于 Electron5-30 MB vs 100+ MB"
    • 软:§3.2 mise 描述更准确为"多语言版本管理(含 Node"
    • 标:§3.3 流程中的 /api/* 路径标注为"建议命名,最终以实现为准"
    • 标:§阶段三 PPTX 渲染库删除错误链接,明确"阶段三选型"
  • 2026-05-26 v1:第一版完成,确立产品定位、5 阶段路线、9 条 ADR、协作规则。
  • 2026-05-26 v2
    • 新增 3.4 节《pi-agent 的使用方式》,明确"npm 依赖,不 clone 不 fork"
    • 新增 5.1.1 节《会话与切换行为》,定义并行对话与切库自动保存
    • 重写 6.1 节《知识库存储策略》,从单一目录改为"默认 ~/llm-wiki/ + 外部登记"混合策略
    • 新增 6.4 节《Obsidian 共存规则》,明确 agent 不碰的文件类型
    • 新增 6.6 节《中文路径与 UTF-8 铁律》
    • 新增 ADR-10 ~ ADR-15 六条决策
    • TBD-1 / TBD-3 / TBD-5 / TBD-7 关闭并归档到 ADR
    • TBD-2 改为阶段三才决定(阶段一固定 Sonnet)
    • 阶段一范围补充:知识库扫描含外部库登记、多并行对话支持
    • 阶段二范围补充:内置 /new-wiki 命令、设置面板 UI
  • 2026-05-26 v3
    • 新增 6.7 节《边界场景行为约定》:单实例、无网络/无 key、崩溃恢复、后端未起、目录失效
    • 重写 ADR-13:模型认证完全复用 pi-agent 的 ~/.pi/agent/auth.json,三层 fallbackpi CLI 登录 / UI 填 key / env var);config.json 不再存任何凭证
    • 新增 ADR-13b:明确不抄 open-design 的多 CLI 子进程模式
    • 重写 6.3 应用数据目录,澄清"应用数据 / 知识库数据 / 模型凭证"三类彻底分离
    • 阶段二范围细化:设置面板 UI 改为"三层认证 + 偏好",验收标准更新
  • 2026-05-27 v9(阶段三完成标记):阶段三全部 8 step + 1 fix commit 完成,审查通过合并到 main
    • §4 阶段三标题加 ✅ 已完成 2026-05-27
    • §10 阶段三标记已完成,补充 9 commit 表 + 完成情况(范围、决策、妥协)
    • CLAUDE.md 更新"项目当前阶段":阶段二 → 阶段三