第 29 课:ECC 2.0 — Rust 控制面板与未来方向

21 阅读8分钟

所属阶段:第六阶段「综合与创造」(第 28-30 课) 前置条件:第 28 课(跨平台适配与插件机制) 本课收获:理解 ECC 2.0 架构,体验 Dashboard(如环境允许)


一、本课概述

ECC 1.x 是一个基于 Node.js 脚本、Markdown 文件和 JSON 配置的插件系统。它工作得很好,但随着规模增长,有些问题开始浮现:

  • 管理多个并行会话很困难
  • 没有可视化的全局视图
  • 会话状态不持久(关掉终端就丢了)
  • Node.js 脚本在大量 Hook 并发时性能有瓶颈

ECC 2.0 用 Rust 构建了一个控制面板(Control Plane),解决这些问题:

  1. ECC 2.0 架构 — 模块设计和代码结构
  2. 核心命令 — Dashboard、会话管理、守护进程
  3. 解决的问题 — 多会话、可视化、持久化、性能
  4. 当前状态 — Alpha 质量,可构建可测试
  5. 为什么选 Rust — 性能、安全、并发

二、ECC 2.0 架构

2.1 源码结构

ecc2/src/
├── main.rs              # CLI 入口,命令定义
├── config/
│   └── mod.rs           # 配置管理(Dashboard 布局等)
├── tui/
│   ├── mod.rs           # TUI 模块入口
│   ├── app.rs           # 应用主循环
│   ├── dashboard.rs     # Terminal UI 仪表盘
│   └── widgets.rs       # 自定义 UI 组件(Token 计量、预算状态)
├── session/
│   ├── mod.rs           # 会话模块入口
│   ├── manager.rs       # 会话生命周期管理
│   ├── runtime.rs       # 会话运行时
│   ├── output.rs        # 会话输出流处理
│   ├── store.rs         # SQLite 持久化存储
│   └── daemon.rs        # 后台守护进程
├── comms/
│   └── mod.rs           # 会话间通信
├── observability/
│   └── mod.rs           # 可观测性(日志、指标)
└── worktree/
    └── mod.rs           # Git Worktree 管理

2.2 技术栈

组件技术用途
CLI 框架clap命令行参数解析
TUI 框架ratatui终端用户界面
异步运行时tokio异步 IO 和并发
数据库rusqlite (SQLite)会话状态持久化
时间处理chrono时间戳和日期
错误处理anyhow统一错误类型
日志tracing + tracing-subscriber结构化日志

2.3 模块职责

┌──────────────────────────────────────────────────┐
│                  ECC 2.0 架构                     │
│                                                   │
│  main.rs (CLI)                                    │
│  ├── dashboard  → tui/dashboard.rs (TUI 渲染)    │
│  ├── start      → session/manager.rs (创建会话)  │
│  ├── delegate   → session/manager.rs (委派会话)  │
│  ├── assign     → session/manager.rs (分配任务)  │
│  ├── sessions   → session/store.rs (查询状态)    │
│  ├── status     → session/store.rs (会话详情)    │
│  ├── stop       → session/manager.rs (停止会话)  │
│  ├── resume     → session/runtime.rs (恢复会话)  │
│  └── daemon     → session/daemon.rs (后台服务)   │
│                                                   │
│  session/store.rs ←→ SQLite 数据库               │
│  comms/mod.rs ←→ 会话间消息传递                   │
│  worktree/mod.rs ←→ Git Worktree 隔离            │
│                                                   │
└──────────────────────────────────────────────────┘

三、核心命令

3.1 命令总览

命令功能说明
ecc2 dashboard启动 TUI 仪表盘可视化所有会话状态
ecc2 start创建新会话指定任务、Agent 类型、是否使用 Worktree
ecc2 delegate委派子会话从已有会话中派生子任务
ecc2 assign分配任务复用已有会话或创建新会话
ecc2 sessions列出所有会话查看活跃/完成/失败的会话
ecc2 status查看会话详情包括成本、Token、运行时间
ecc2 stop停止会话优雅地终止正在运行的会话
ecc2 resume恢复会话从持久化状态恢复已暂停的会话
ecc2 daemon启动守护进程后台运行,管理任务调度和恢复

3.2 启动会话

# 启动一个新的 Claude 会话
ecc2 start --task "Implement user authentication module" --agent claude

# 启动并使用独立的 Git Worktree
ecc2 start --task "Refactor database layer" --agent claude --worktree

# 从已有会话委派子任务
ecc2 delegate main-session --task "Write unit tests" --agent claude --worktree

3.3 Delegate vs Assign

操作delegateassign
行为总是创建新会话优先复用已有会话
适用场景明确需要新的工作流有可能续用之前的会话
Worktree默认创建按需创建

3.4 Dashboard 界面

Dashboard 是一个终端界面(TUI),使用 ratatui 构建:

┌─ ECC 2.0 Dashboard ──────────────────────────────┐
│                                                    │
│  Sessions (3 active, 2 completed)                  │
│  ┌──────────┬─────────┬────────┬────────┬────────┐│
│  │ Session  │ Agent   │ Status │ Cost   │ Tokens ││
│  ├──────────┼─────────┼────────┼────────┼────────┤│
│  │ main-01  │ claude  │ ●      │ $1.23  │ 45.2K  ││
│  │ test-02  │ claude  │ ●      │ $0.45  │ 12.8K  ││
│  │ review-3 │ claude  │ ●      │ $0.30  │ 8.1K   ││
│  │ plan-04  │ claude  │ ✓      │ $0.12  │ 3.2K   ││
│  │ fix-05   │ claude  │ ✓      │ $0.67  │ 18.9K  ││
│  └──────────┴─────────┴────────┴────────┴────────┘│
│                                                    │
│  Selected: main-01                                 │
│  Task: Implement user authentication module        │
│  Runtime: 12m 34s                                  │
│  Budget: $2.00 remaining of $5.00                  │
│                                                    │
│  Output ────────────────────────────────────────── │
│  > Creating auth middleware...                      │
│  > Running tests: 12/15 passed                     │
│  > Fixing failing test: token_expiry_test          │
│                                                    │
│  [q] Quit  [↑↓] Select  [Enter] Details  [s] Stop │
└────────────────────────────────────────────────────┘

Dashboard 的关键特性:

特性说明
实时状态会话状态实时更新
成本追踪每个会话的 Token 使用和费用
输出流选中会话的实时输出
父子关系显示会话的委派/被委派关系
未读消息会话间的消息通知
风险评分Daemon 活动和调度信息

四、解决的问题

4.1 多会话管理

ECC 1.x 的痛点

终端 1:Claude Code 在做主功能开发
终端 2:另一个 Claude Code 在写测试
终端 3:还有一个在做代码审查

问题:
- 三个终端之间没有关联
- 不知道总共花了多少钱
- 一个会话的结果无法自动流转到另一个

ECC 2.0 的解决

ecc2 dashboard  ← 一个界面看到所有会话

main-session (主开发)
    ├── delegate → test-session (测试)
    └── delegate → review-session (审查)

所有会话共享状态存储,可以互相通信

4.2 可视化仪表盘

ECC 1.x 没有全局视图。你需要在多个终端之间切换才能了解整体进度。

ECC 2.0 的 Dashboard 提供了一个单一窗口查看所有会话的状态、成本、输出。

4.3 持久化

ECC 1.x:关掉终端 = 丢失会话状态。

ECC 2.0:所有会话状态存储在 SQLite 中(session/store.rs)。

pub struct StateStore {
    conn: Connection,  // SQLite 连接
}

这意味着:

  • 关掉终端后可以恢复会话(ecc2 resume
  • 可以查看历史会话的统计信息
  • Daemon 可以在后台持续管理会话

4.4 性能提升

维度Node.js (ECC 1.x)Rust (ECC 2.0)
启动时间~200ms~5ms
内存占用~50MB~3MB
并发会话受 Event Loop 限制原生多线程
Hook 执行进程启动开销原生函数调用

五、Daemon 守护进程

ecc2 daemon 启动一个后台守护进程,负责:

职责说明
任务调度自动将待处理任务分配给空闲会话
会话恢复检测异常退出的会话,尝试恢复
负载均衡在多个 Lead 会话间重新平衡任务
活动记录记录调度、恢复、重平衡的活动日志
pub struct DaemonActivity {
    pub last_dispatch_at: Option<DateTime<Utc>>,
    pub last_dispatch_routed: usize,
    pub last_dispatch_deferred: usize,
    pub last_recovery_dispatch_at: Option<DateTime<Utc>>,
    pub last_rebalance_at: Option<DateTime<Utc>>,
    pub last_rebalance_rerouted: usize,
}

六、为什么选 Rust

6.1 三个核心理由

理由说明
性能零成本抽象,无 GC 暂停。控制面板需要低延迟响应
安全所有权系统防止内存错误。控制面板管理敏感会话数据
并发Tokio 异步运行时 + Send/Sync 保证。多会话并发是核心需求

6.2 与 Node.js 的互补关系

ECC 2.0 不是要替代 Node.js,而是互补

Node.js (ECC 1.x):
  ├── Skill/Agent/Command 定义(Markdown,不需要编译)
  ├── Hook 脚本(快速迭代,不需要编译)
  └── 安装脚本(跨平台兼容性好)

Rust (ECC 2.0):
  ├── 控制面板(性能关键路径)
  ├── 会话管理(并发和持久化)
  ├── Daemon(长时间运行的后台服务)
  └── TUI Dashboard(低延迟 UI)

七、当前状态与构建

7.1 当前状态

ECC 2.0 目前处于 Alpha 质量

方面状态
核心功能可用(dashboard、会话管理、store)
稳定性Alpha(可能有 Bug)
文档基础
测试有单元测试
安装需要从源码构建

7.2 构建方式

# 前置条件:安装 Rust 工具链
# https://rustup.rs/

# 进入 ecc2 目录
cd ecc2/

# 构建
cargo build

# 运行测试
cargo test

# 运行 Dashboard
cargo run -- dashboard

# 或者构建 Release 版本
cargo build --release
./target/release/ecc dashboard

7.3 开发环境要求

要求最低版本
Rust1.75+
Cargo随 Rust 安装
SQLite系统自带或由 rusqlite 编译
终端支持 256 色的终端模拟器

八、本课练习

练习 1:阅读 main.rs(10 分钟)

cat ecc2/src/main.rs

回答问题:

  • ECC 2.0 定义了哪些子命令?
  • start 命令有哪些参数?
  • delegateassign 有什么区别?

练习 2:浏览源码结构(15 分钟)

浏览 ecc2/src/ 目录,画出模块依赖关系图:

  • 哪些模块依赖 session
  • tui 模块依赖哪些其他模块?
  • store.rs 被哪些模块使用?

练习 3:构建 ECC 2.0(20 分钟,需要 Rust 环境)

如果你的环境中已安装 Rust,尝试构建并运行:

cd ecc2/
cargo build
cargo test
cargo run -- dashboard

记录:

  • 构建是否成功?
  • 测试是否全部通过?
  • Dashboard 界面是什么样的?

如果没有 Rust 环境,阅读 ecc2/src/tui/dashboard.rs 的前 50 行,理解 Dashboard 的数据结构设计。

练习 4(选做):设计改进

基于你对 ECC 2.0 架构的理解,提出一个改进建议:

  • 你认为还缺少什么功能?
  • 有什么可以优化的地方?
  • 如何提升 Dashboard 的可用性?

九、本课小结

你应该记住的内容
核心模块main.rs(CLI)、tui/(Dashboard)、session/(会话管理)、store.rs(SQLite)
解决的问题多会话管理、可视化仪表盘、状态持久化、性能提升
技术栈Rust + clap + ratatui + tokio + rusqlite
当前状态Alpha 质量,可构建可测试
与 1.x 关系互补而非替代:Rust 做控制面板,Node.js 做内容定义

十、下节预告

第 30 课:综合实战 — 毕业项目

这是课程的最后一课。你将把前 29 课学到的所有知识综合运用,为一个真实项目设计完整的 ECC 配置方案:选择 Profile、编写 CLAUDE.md、配置 Agent/Skill/Hook、运行完整的开发流程验证。

预习建议:选择一个你正在开发的真实项目,思考它需要什么样的 ECC 配置。浏览 examples/ 目录中的参考模板。