所属阶段:第六阶段「综合与创造」(第 28-30 课) 前置条件:第 28 课(跨平台适配与插件机制) 本课收获:理解 ECC 2.0 架构,体验 Dashboard(如环境允许)
一、本课概述
ECC 1.x 是一个基于 Node.js 脚本、Markdown 文件和 JSON 配置的插件系统。它工作得很好,但随着规模增长,有些问题开始浮现:
- 管理多个并行会话很困难
- 没有可视化的全局视图
- 会话状态不持久(关掉终端就丢了)
- Node.js 脚本在大量 Hook 并发时性能有瓶颈
ECC 2.0 用 Rust 构建了一个控制面板(Control Plane),解决这些问题:
- ECC 2.0 架构 --- 模块设计和代码结构
- 核心命令 --- Dashboard、会话管理、守护进程
- 解决的问题 --- 多会话、可视化、持久化、性能
- 当前状态 --- Alpha 质量,可构建可测试
- 为什么选 Rust --- 性能、安全、并发
二、ECC 2.0 架构
2.1 源码结构
bash
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 模块职责
bash
┌──────────────────────────────────────────────────┐
│ 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 启动会话
bash
# 启动一个新的 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
| 操作 | delegate | assign |
|---|---|---|
| 行为 | 总是创建新会话 | 优先复用已有会话 |
| 适用场景 | 明确需要新的工作流 | 有可能续用之前的会话 |
| Worktree | 默认创建 | 按需创建 |
3.4 Dashboard 界面
Dashboard 是一个终端界面(TUI),使用 ratatui 构建:
bash
┌─ 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 的痛点:
diff
终端 1:Claude Code 在做主功能开发
终端 2:另一个 Claude Code 在写测试
终端 3:还有一个在做代码审查
问题:
- 三个终端之间没有关联
- 不知道总共花了多少钱
- 一个会话的结果无法自动流转到另一个
ECC 2.0 的解决:
scss
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)。
rust
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 会话间重新平衡任务 |
| 活动记录 | 记录调度、恢复、重平衡的活动日志 |
rust
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,而是互补:
scss
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 构建方式
bash
# 前置条件:安装 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 开发环境要求
| 要求 | 最低版本 |
|---|---|
| Rust | 1.75+ |
| Cargo | 随 Rust 安装 |
| SQLite | 系统自带或由 rusqlite 编译 |
| 终端 | 支持 256 色的终端模拟器 |
八、本课练习
练习 1:阅读 main.rs(10 分钟)
bash
cat ecc2/src/main.rs
回答问题:
- ECC 2.0 定义了哪些子命令?
start命令有哪些参数?delegate和assign有什么区别?
练习 2:浏览源码结构(15 分钟)
浏览 ecc2/src/ 目录,画出模块依赖关系图:
- 哪些模块依赖
session? tui模块依赖哪些其他模块?store.rs被哪些模块使用?
练习 3:构建 ECC 2.0(20 分钟,需要 Rust 环境)
如果你的环境中已安装 Rust,尝试构建并运行:
bash
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/ 目录中的参考模板。