大 PR 周知 · feat/phase1-kanban-frontend

Phase-1 看板:把 Eyrie 的工程骨架立起来了

这一版表面是「看板规划界面」,但真正的重心是:为了把这个界面做扎实, 顺手把从「线缆契约」到「渲染层分层」的整条栈重塑了一遍。 所以看待它的角度不是「加了个看板」,而是 —— 工程骨架成型,看板是它的第一个落地验证。

55
commits 领先 main
196
文件改动
+14.1k −753
行变更
3 → 5
apps → apps + 契约/客户端包

这个分支的弧线

不是一口气堆出来的 —— 搭建后经过一轮架构自审,再做硬化收口
① 搭建
把功能搭出来

看板界面、数据层、主题、设置流跑通,先有一个能用的 Phase-1。

② 自审
架构 review

对照「会不会阻碍后续迭代」逐条审,定位事务边界、看板投影、并发框架等问题。

③ 硬化
收口到正确形状

一批 follow-up:服务端 board projection、原子事务、幂等 mount、typed 冲突、退役过度设计的并发框架。

核心架构:契约成为整条栈的脊梁

三端不再各自手搓路由,全部通过契约 + 语义客户端对话
apps/desktop · 渲染层
Electron + React 19;只能经 @eyrie/client 碰 daemon
apps/cli
把参数映射成 @eyrie/api 请求
▼   只依赖 语义客户端   ▼
语义客户端
@eyrie/client
client.tasks.move() / client.projects.board() · 传输层按运行时拆分(node / electron-renderer / electron-main) + 凭证 seam
协议真相源
@eyrie/api
endpoint manifest + 请求/响应 schema + DTO + 错误码 + 事件信封 —— 协议一处定义,三端类型贯通
▼   实现契约   ▼
apps/daemon · 本地 HTTP 守护进程(SQLite)
use-case 层(原子事务) service 层 board projection 单一路径安全 chokepoint typed 冲突错误

6 个大块

每块:做了什么 / 新设计 / 为什么重要
01 · 契约

契约独立成包:@eyrie/api + @eyrie/client

做了什么协议从 daemon 里抽出来,独立成「契约包 + 语义客户端包」两层。

新设计@eyrie/api 是唯一协议真相源;三端只消费它,渲染层只能经 @eyrie/client 碰 daemon。

为什么协议一处定义、端到端类型安全,CLI 和桌面端不会再各写一套、互相漂移。

02 · 服务端

Daemon 分层:service → use-case,事务回服务端

做了什么新增 use-case 层(建项目、建任务带关系、挂载 repo),多步写入包进一个 SQLite 事务。

新设计「要么全成要么全败」由服务端保证;唯一约束冲突映射成 typed 409,不再裸 500。

为什么前端不再串「建任务→挂 repo→挂 label」然后兜半成功,数据一致性收回到服务端。

03 · 看板

服务端权威的 board projection

做了什么新端点 GET /api/projects/:id/board,直接返回按 status 排好的列 × 列内按 position 排好的任务。

新设计列结构 / 排序 / 分组的权威在服务端;前端只渲染投影。

为什么不再把全项目任务拉到内存重建列,性能不随任务数恶化,也为将来实时同步留好接缝。

04 · 数据模型

Repo 按 git 身份注册

做了什么repo 主键从文件路径改为 git_common_dir(仓库的规范身份),迁移 0002

新设计同一仓库自动去重;task_reposworktree_path,为「每任务一个 worktree」铺路。

为什么文件夹改名 / 搬动 / 多 worktree 都不再破坏 repo 身份,是 Agent 工作区隔离的地基。

05 · 渲染层

渲染层 Feature-Sliced 四层 + CI 强制

做了什么shared → entities → features → app 单向依赖分层,并做了去重收敛。

新设计依赖方向用 eslint-plugin-boundaries 在 CI 里作为 error 强制(不是 warning)。

为什么feature 之间不能再互相深 import、依赖不会反转;规模一大也不靠肉眼 review 守。

06 · 体感层

主题系统 + 凭证 seam

做了什么light + dark 双色板,全走 --color-* token(组件禁 hex);与传输平行的凭证 seam。

新设计侧栏切换并持久化、原生窗口 chrome 跟随主题;请求 401 时自动失效凭证 + 重试一次。

为什么主题不留死角;daemon 重启换 token 后客户端无感续上,本地/远程两种部署形态都成立。

看板这一版交付的界面

骨架之上的第一个落地验证

以上架构都不是空转 —— 它们支撑起一个对照原型做出来的、能用的 Phase-1 看板:

看板列 + 卡片拖拽 跨列移动
任务详情面板 改名 / 移动 / 删除
建项目流 + 项目选择器
设置:项目 / 仓库两个 Tab
内联标签选择器
目录选择走 daemon 文件系统

另: 一层 CI 护栏在背后兜底 —— 包边界 / 渲染层边界 / 注释覆盖 / 语言 · 密钥 · lockfile 检查,全部随每次 push 跑。