Spur Product Spec

基于当前可交互 Preview(2026-08)冻结的产品说明:各区职责、用户旅程、功能、 Pi 集成方式与技术栈。用于桌面端开工,而不是再讨论「要不要做第二个 Pi」。

product Spur version 0.2 preview frozen UX site spur.kevin.top pi chat not reimplemented

1. 愿景与边界

一句话

Spur 是 Pi 的 worktree 遥控器 / 工作区 OS: 管 project 与隔离 worktree,把 Pi 丢进正确的 cwd;不重做 Agent 对话能力。

做

不做(明确)

2. 产品原则

  1. Project first, then worktree — 底部只加 project;worktree 在 project 下管理。
  2. One chain — 创建/选中 worktree ⇒ 右侧即 Pi,且 cwd 已绑定。
  3. Pi is the runtime — Spur 只做编排与生命周期,不抄 Pi 功能。
  4. Chrome folds up — 顶栏合并、少空占位(无 idle/Restart 噪音)。
  5. Safety on destroy — 关 wt / 移 project 时若 Pi 在跑必须确认。
  6. Local-first — 核心循环不依赖云;登录只增强同步。
  7. Speed is a feature — 桌面目标:侧栏与切换体感极致快(Rust + 异步 git)。

3. 用户与场景

主用户

  • 并行开多个 feature / agent 任务
  • 已用或准备用 Pi 写代码
  • 需要 git worktree 隔离,讨厌分支互踩

核心场景

  • 从固定 base(如 origin/main)开隔离区
  • 立刻在隔离区里和 Pi 干活
  • 多仓库同时挂在一个窗口侧栏
  • 收工:关 wt / 移 project

4. 信息架构 / 各区说明

以当前 Preview 布局为准(桌面 GPUI 应对齐同一信息架构)。

┌─ Spur window ──────────────────────────────────────────────────┐ │ ┌─ Left sidebar ──────────┐ ┌─ Right main ───────────────────┐ │ │ │ [logo] Search… │ │ Pi · ctx… [Sign in] │ │ ← 同一顶栏行 │ │ │ │ env chips (仅 Pi running) │ │ │ │ ▾ project │ │ ┌────────────────────────────┐ │ │ │ │ default origin/main │ │ │ │ │ │ │ │ [+] [⋯] │ │ │ Pi surface (placeholder │ │ │ │ │ · worktree rows │ │ │ → real Pi PTY later) │ │ │ │ │ · No worktrees yet │ │ │ │ │ │ │ │ │ │ └────────────────────────────┘ │ │ │ │ [+ Add project] │ │ │ │ │ └─────────────────────────┘ └────────────────────────────────┘ │ └────────────────────────────────────────────────────────────────┘

4.1 左侧 · 顶栏(side-titlebar)

元素说明
Logo markSpur 品牌(锐利 spear/shark 造型)
Search过滤 project 名 / quick base / worktree 名与分支

4.2 左侧 · 列表

元素说明
Project 行 折叠 ▾/▸ · 名称 · default <quickBase>
[+] 在该 project 下新建 worktree
[⋯] 菜单:Set default base / New worktree / Remove project
Worktree 行 名称 · 分支(非 main 显示 branch ← base)· main 角标
点击 = 选中并启动/附着 Pi
hover × = 关闭 linked worktree(main 不可关)
空态 project 下无 wt 时显示 No worktrees yet(点击同 +)

4.3 左侧 · 底栏(side-footer)

规则说明
只加 Project 文案:Add project directory / + Add project。禁止在底栏放 New worktree。
提示 空:先加 project 再建 wt;有 project:worktree 在上方各 project 下管理。

4.4 右侧 · 顶栏(main-titlebar,单行折叠)

元素说明
Pi context(左) 与 Sign in 同一行,不单独占第二行状态条。
空:Pi · waiting / Pi · select a worktree
有 wt:Pi · name · branch · ← base · path
Sign in(右) 低调文字按钮占位;登录后为小 chip + Sign out。功能以后再扩。
已否决的 chrome

右侧大 SPUR 字标单独一行;idle 徽章;Restart 按钮;假聊天 Send 输入框。

4.5 右侧 · Env 条

仅当 Pi running 时展示。字段(启动契约):

4.6 右侧 · Pi surface

整块 = Pi 本体占位(真产品为嵌入 PTY/TUI)。 Spur 不在此实现对话、Send、流式、/login。 Preview 显示 mock「Pi is running here」+ cd/pi 命令提示。

5. User Journey

J1 · 主路径(必须丝滑)

1. 打开 Spur
2. 底部 Add project → 选择本地 git 根目录 + 设 default base(默认 origin/main)
3. Project 出现在侧栏
4. 点项目行 [+](或 ⋯ → New worktree)
5. 填 name + base(默认带出 quick base)→ Create & open in Pi
6. 链:create wt → select → boot Pi(cwd=wt)
7. 右侧 Pi surface 进入 running;env 条出现
8. 用户在 Pi 内 /login、写代码、提交(Pi 能力)
9. 收工:worktree 行 × 关闭(若 Pi 在跑则确认)或 ⋯ Remove project

J2 · 继续已有 worktree

1. 侧栏点击已有 worktree
2. 自动 select + boot/attach Pi
3. 右侧显示该 wt 上下文

J3 · 仅浏览 project

1. 点击 project 行折叠/展开
2. 未选 wt 时右侧 Pi 为 waiting / select a worktree
3. 不在「仅 project 选中」时误起 Pi 改主目录

J4 · 账号(占位)

1. 点 Sign in → 预览 mock 登录
2. 显示账号 chip;可 Sign out
3. 后续:同步 Pi auth sources / 偏好(未开工)

6. 功能说明

功能优先级PreviewDesktop 目标
Add project(本地目录) P0 路径输入 + Browse mock 系统目录选择器;校验 git root
Project quick base P0 ⋯ → Set default base 持久化;创建 wt 默认填入
Create worktree from base P0 mock path + 日志 git worktree add -b name path base
List / select worktree P0 localStorage 列表 git worktree list --porcelain
Open wt → auto Pi P0 bootPi mock + surface spawn/embed pi,cwd=wt
Context env P0 env chips 真实 process env
Close worktree / remove project safety P0 confirm if Pi running 停进程 + git worktree remove
Search filter P0 有 有
Sign in 占位 P1 mock Google OAuth + 后端(后置)
Sync Pi config P2 不做深 vault / providers
Embedded Pi PTY P0 桌面 占位块 portable-pty + 终端渲染
GPUI 原生窗 P0 桌面 HTML mock 唯一生产桌面实现;由 canonical Preview 规划
多 Pi session / wt P2 不做 默认 1:1

7. 状态与交互规则

选择状态

Pi 状态(每 worktree)

删除保护

快捷键(preview)

键动作
a / oAdd project
nNew worktree(无 project 时引导先加)
bDefault base

8. Pi 集成契约

核心契约

cwd = worktree_abs_path 时执行 pi(或配置的 pi bin)。 Spur 不解析 Pi TUI 协议(P0);只管理进程与展示表面。

启动

# conceptual
cd $SPUR_WORKTREE
env \
  SPUR_WORKTREE=... \
  SPUR_MAIN_REPO=... \
  SPUR_BRANCH=... \
  SPUR_QUICK_BASE=... \
  pi

Session

生命周期

事件Spur 行为
select / create wtstart or focus Pi for that cwd
close wtstop Pi then remove worktree(确认)
remove projectstop all child Pi then drop from store
Pi exit标记 stopped;表面显示未运行(可再附着)

UI 边界

9. 账号 / 登录(占位)

10. 技术栈

层选型备注
桌面语言Rust性能优先
桌面 UI 生产实现GPUI唯一构建与发布路径
设计与评审基线Canonical HTML Preview与 GPUI 共享 tokens 和场景清单
异步tokio
Gitgit CLI正确性优先
AgentPi CLIcwd + env
PTYportable-pty 等嵌入 Pi
本地状态JSON → sqlite 可演进~/Library/Application Support/spur/
官网Vite 静态 + Cloudflare Pagesspur.kevin.top
包装macOS .app + codesign DMGDeveloper ID
仓库github.com/kevinaimonster/spurprivate

11. 架构与 Crate

spur/
├── crates/
│   ├── spur_core      # 模型 · Command · Event · Error
│   ├── spur_git       # worktree / branch / path / default base
│   ├── spur_store     # 持久化 projects / prefs / auth stub
│   ├── spur_agent     # Pi LaunchSpec + env
│   ├── spur_runtime   # 多 repo 编排 · 队列 · 生命周期
│   ├── spur_pty       # PTY 生命周期
│   ├── spur_terminal  # VT 网格(供 UI 绘制)
│   ├── spur_gpui      # 唯一原生桌面入口与生产 UI
│   ├── spur_design_system # tokens / contract / fixtures
│   ├── spur_ui_catalog # native design harness
│   └── spur_cli       # 无头金样
├── apps/web           # 官网 + preview/
├── packaging/macos    # 签名 DMG
├── branding           # logo SVG
└── docs/              # 本 spec 等

依赖方向:UI → runtime → (git | store | agent | pty);core 不依赖 UI。

12. 数据模型(逻辑)

Project {
  id, name, path,              // git root
  quickBase,                   // e.g. origin/main
  open: bool,                  // sidebar expanded
  worktrees: Worktree[]
}

Worktree {
  id, name, path, branch,
  fromBase?,                   // create base
  isMain: bool
}

Selection { projectId?, worktreeId? }

PiSession {                    // per worktree
  running: bool,
  startedAt?,
  env: { SPUR_* }
}

Auth {                         // placeholder
  signedIn, provider, user?,
  piSync?: { status, lastSyncAt, sources[] }
}

13. 非功能需求

14. MVP 范围 / 分期

已完成(Preview / 基建)

Desktop MVP(开工目标)

  1. GPUI(或阶段性 UI)对齐 Preview 布局
  2. 真 git:add project / list / create / remove worktree
  3. 真 Pi:select/create wt → spawn pi(cwd) + env
  4. 嵌入或先系统级附着 Pi;表面容器对齐占位
  5. 关闭/删除安全确认

随后

15. 开工清单

建议第一周
  1. 以本 spec + apps/web/public/preview/ 为 UX 源,冻结 IA
  2. spur_git:create/list/remove 与 path 模板对齐 Preview
  3. spur_agent + runtime:selectWorktree → bootPi 真进程
  4. UI:左侧列表 + 底栏 Add project + 顶栏 Pi context + Pi surface 容器
  5. 手工验收:走通 J1 全路径

验收标准(J1)

资源位置
私仓github.com/kevinaimonster/spur
官网spur.kevin.top
Preview UXspur.kevin.top/preview
Preview 源apps/web/public/preview/
本 Specdocs/spec.html
架构备忘docs/architecture.md
Logobranding/
包装packaging/macos/