spool-memory 0.2.3

Local-first developer memory system — persistent, structured knowledge for AI coding tools
Documentation
# 桌面端运行与调试手册

## 文档目的

这份手册用于说明如何运行、测试、调试当前 `spool` 的桌面端 host。

当前覆盖范围:

- Rust 桌面后端 facade:`src/desktop.rs`
- Tauri 适配层:`src/desktop/tauri.rs`
- 可运行的 Tauri host:`src-tauri/`
- 最小静态前端工作台:`frontend/`
- 本机 Claude / Codex 会话浏览原型

## 关键目录

相关路径如下:

- 桌面后端 facade:[src/desktop.rs]/Users/long/Work/spool/src/desktop.rs
- Tauri 命令适配层:[src/desktop/tauri.rs]/Users/long/Work/spool/src/desktop/tauri.rs
- Host 启动入口:[src-tauri/src/main.rs]/Users/long/Work/spool/src-tauri/src/main.rs
- Host 命令注册:[src-tauri/src/commands.rs]/Users/long/Work/spool/src-tauri/src/commands.rs
- Tauri 配置:[src-tauri/tauri.conf.json]/Users/long/Work/spool/src-tauri/tauri.conf.json
- Capability 配置:[src-tauri/capabilities/default.json]/Users/long/Work/spool/src-tauri/capabilities/default.json
- 前端页面:[frontend/index.html]/Users/long/Work/spool/frontend/index.html
- 前端逻辑:[frontend/desktop.js]/Users/long/Work/spool/frontend/desktop.js
- 前端样式:[frontend/desktop.css]/Users/long/Work/spool/frontend/desktop.css

## 运行前提

你需要具备:

- 可用的 Rust 工具链,能直接执行 `cargo`
- macOS 桌面会话,能够启动 Tauri 窗口
- 如果本机还没缓存过 Tauri 依赖,第一次编译需要联网下载 crates

可选但推荐准备:

- 一个真实可用的 `spool` 配置文件
- 一个真实 Obsidian vault,且仓库路径能命中 `project.repo_paths`
- 如果要验证 daemon 读路径,准备好 `spool-daemon` 二进制

## 一次性依赖检查

先做桌面 host 的编译检查:

```bash
cargo check --manifest-path src-tauri/Cargo.toml
```

如果这是本机第一次编译 Tauri,Cargo 可能会下载一批依赖。

## 快速验证命令

运行桌面端 smoke 测试:

```bash
cargo test --test tauri_smoke
```

检查前端脚本语法:

```bash
node --check frontend/desktop.js
```

如果想跑更完整的回归:

```bash
cargo test
```

## 启动桌面 Host

启动桌面应用:

```bash
cargo run --manifest-path src-tauri/Cargo.toml
```

预期结果:

- 打开一个标题为 `spool Desktop` 的 Tauri 窗口
- 顶部显示品牌区、语言切换、状态徽标
- 主界面按标签页拆分为:
  - `注入上下文`
  - `会话浏览`
  - `高级工作台`
  - `基础配置`
- 默认不再把所有信息堆在一屏里

## 最小手工测试流程

建议按下面顺序手工 smoke:

1. 先切到 `基础配置`
2.`Config Path` 填入真实配置文件路径
3.`Repo CWD` 填入能命中某个 `project.repo_paths` 的仓库目录
4. 回到 `注入上下文`
5. 填写任务描述与相关文件
6. 点击 `生成注入内容`
7. 确认同时生成:
   - 组合注入文本
   - Context 结果
   - Wakeup 结果
8. 点击 `复制注入内容`
9. 切到 `会话浏览`
10. 点击 `刷新会话`
11. 选择一个 session,确认右侧显示 session 摘要和关联记录
12. 切到 `高级工作台`
13. 点击 `载入工作台`
14. 如果队列里有数据,确认自动选中一条 record
15. 检查 `Selected Record``History`、事件列表与 action 按钮
16.`Mode = propose` 创建一条测试 memory
17. 确认队列刷新,并自动选中新建 record
18. 点击 `Accept``Archive`
19. 确认队列刷新,history 事件数增加

额外观察点:

- 界面右上角语言切换应能在 `中文 / EN` 间切换主要 UI 文案
- `基础配置` 完成后,顶部 `Setup` 徽标应从未完成变为已完成
- `Context Result` 上方应显示一排摘要卡片
- `Wakeup Result` 上方也应显示一排摘要卡片
- `会话浏览` 中应优先出现本机 Claude / Codex 会话列表
- 如果某些会话没有完整 transcript 解析,仍应至少能看到 provider、标题、更新时间等摘要
- `Selected Record` 上方应显示结构化 metadata 摘要卡片
- `History` 面板应显示事件摘要卡片和倒序事件列表
- action 按钮应只在当前 record 允许该状态迁移时可点击
- `Last Error` 面板应在失败时显示结构化错误

## 如何使用 Daemon 读路径

桌面工作台支持可选的 daemon-backed lifecycle reads。

使用方式:

1. 切到 `基础配置`
2. 勾选 `启用 daemon-backed lifecycle reads`
3. 如果需要,填写 `Daemon Bin`

本仓库内的 daemon 二进制默认路径示例:

```bash
target/debug/spool-daemon
```

如果不勾选 daemon 模式,桌面端会走 direct read 路径。

## 构建 Daemon 二进制

如果要先准备本地 daemon:

```bash
cargo build --bin spool-daemon
```

## 调试排查清单

### 应用能启动,但命令执行失败

优先检查:

- `Config Path` 是否真实存在,且指向合法 TOML
- `Repo CWD` 是否命中某个 `project.repo_paths`
- 配置中的 vault 路径是否真实存在
- 桌面端 `Last Error` 面板里是否返回结构化 `DesktopErrorEnvelope`

### 应用能编译,但看不到窗口

优先检查:

- 是否在真实 macOS 桌面会话中运行
- 是否被系统窗口权限、沙箱或会话环境拦住
- `cargo run --manifest-path src-tauri/Cargo.toml` 是否真的进入了运行态

### 直接用浏览器打开页面后,命令全部失败

如果你直接打开 `frontend/index.html`,那么 `window.__TAURI__` 不存在。

此时预期表现是:

- `Bridge` 状态显示为 `browser`
- 所有命令调用都会失败,因为没有 Tauri invoke bridge

这是正常现象。该页面必须由 Tauri host 托管运行。

### Tauri host 编译时报 icon/config 问题

检查:

- [src-tauri/icons/icon.png]/Users/long/Work/spool/src-tauri/icons/icon.png 是否存在
- [src-tauri/tauri.conf.json]/Users/long/Work/spool/src-tauri/tauri.conf.json 是否是合法 JSON
- [src-tauri/capabilities/default.json]/Users/long/Work/spool/src-tauri/capabilities/default.json 是否存在

### Tauri IPC 权限问题

重点检查 capability 文件:

- [src-tauri/capabilities/default.json]/Users/long/Work/spool/src-tauri/capabilities/default.json

当前 host 使用的是一个较窄的默认 capability,仅给 `main` 窗口开放 core app/window/webview/event 权限。

## 关于会话浏览的当前语义

当前的 `会话浏览` 已经开始读取本机会话源:

- `~/.claude/projects/**/sessions-index.json`
- `~/.claude/projects/**/*.jsonl`
- `~/.codex/session_index.jsonl`
- `~/.codex/sessions/**/*.jsonl`

但目前仍然是原型阶段:

- Claude 会话详情优先来自本地 `.jsonl`
- Codex 会话列表与基础详情已接入
- 仍然没有覆盖所有 AI 工具,也还不是完整统一的 transcript 平台
- `spool memory` 中的 `session:*` 引用仍会作为补充来源保留

## 常用开发命令

桌面 host 编译检查:

```bash
cargo check --manifest-path src-tauri/Cargo.toml
```

桌面 host 启动:

```bash
cargo run --manifest-path src-tauri/Cargo.toml
```

桌面 smoke 测试:

```bash
cargo test --test tauri_smoke
```

全量测试:

```bash
cargo test
```

构建 daemon:

```bash
cargo build --bin spool-daemon
```

检查前端脚本语法:

```bash
node --check frontend/desktop.js
```

## 当前限制

- 前端工作台还比较早期,主要偏开发/调试用途
- 还没有 batch lifecycle actions
- 还没有 edit-in-place memory 编辑
- 还没有完整的桌面打包流程
- 还没有更成熟的前端状态管理层

## 下一步建议重点

如果继续扩展桌面工作台,优先看这些点:

1. 继续把 detail/history 从文本块推进到更强的结构化视图
2. 增加更明确的 lifecycle queue 过滤与排序能力
3. 在界面上展示更明确的 daemon 诊断状态
4. 如果前端继续变复杂,再决定是否引入更正式的前端构建与开发流程