docs(workspace): whitelist ratatui/crossterm for focus-tui

Terminal interaction (raw mode, incremental redraw, scrolling, mouse, keys)
is a genuine need that pure std cannot reasonably solve, so AGENTS.md §2.1
now exempts ratatui + crossterm for focus-tui only (transitives follow).
Workspace gains the focus-tui member and the 7-crate layout is documented.
This commit is contained in:
DaiChaoXiong 2026-08-09 21:35:58 +08:00
parent 159f1ca815
commit 792f2fae4c
4 changed files with 1609 additions and 13 deletions

2
.gitignore vendored
View File

@ -2,3 +2,5 @@
/pi-main /pi-main
/pi_agent_rust-main /pi_agent_rust-main
.VSCodeCounter

View File

@ -77,6 +77,7 @@ let b = self.buf.pop_front();
|---|---|---| |---|---|---|
| 异步运行时 | `tokio` | `tokio`features 按需,见下) | | 异步运行时 | `tokio` | `tokio`features 按需,见下) |
| TLS | rustls 生态 | `rustls`、`tokio-rustls`、`rustls-native-certs`(或 `webpki-roots` | | TLS | rustls 生态 | `rustls`、`tokio-rustls`、`rustls-native-certs`(或 `webpki-roots` |
| TUI 渲染 | `ratatui` + `crossterm` | 仅 `focus-tui` 可用。终端交互(原始模式、增量重绘、滚动、鼠标、键盘事件)属于纯 std 无法合理解决的**真实需求**,故特批;`ratatui` 的传递依赖(`crossterm`、`unicode-width` 等)随其引入。其余 crate 一律禁止引用 |
**这就是全部。** 以下 crate **明确禁止** **这就是全部。** 以下 crate **明确禁止**
- ❌ `serde` / `serde_json` — JSON 用自研 `focus-json` crate - ❌ `serde` / `serde_json` — JSON 用自研 `focus-json` crate
@ -110,8 +111,8 @@ let b = self.buf.pop_front();
## 3. Workspace 结构 ## 3. Workspace 结构
细粒度 6-crate 拆分,每个 crate 职责单一、边界清晰、可独立测试。 细粒度 7-crate 拆分,每个 crate 职责单一、边界清晰、可独立测试。
`focus-cli` 已删除TUI 交互层将在后续里程碑以新 crate 加入,届时再更新本图。) `focus-cli` 已删除,由 `focus-tui` 替代。)
```text ```text
focus/ focus/
@ -123,8 +124,9 @@ focus/
│ ├── focus-core/ # agent 层:类型 + 循环 + Tool trait │ ├── focus-core/ # agent 层:类型 + 循环 + Tool trait
│ ├── focus-transport/ # Transport trait + HTTP/1.1 + TLS + SSE 解析 │ ├── focus-transport/ # Transport trait + HTTP/1.1 + TLS + SSE 解析
│ ├── focus-providers/ # provider 实现Anthropic / OpenAI │ ├── focus-providers/ # provider 实现Anthropic / OpenAI
│ ├── focus-tools/ # 文件工具read / write / bash │ ├── focus-tools/ # 文件工具read / write / edit / shell
│ └── focus-harness/ # 会话持久化 + 上下文压缩 + 系统提示模板 │ ├── focus-harness/ # 会话持久化 + 上下文压缩 + 系统提示模板
│ └── focus-tui/ # 终端交互层ratatui + crossterm
├── docs/ ├── docs/
│ └── architecture/ # 架构解读文档(已存在) │ └── architecture/ # 架构解读文档(已存在)
└── tests/ # workspace 级集成测试(可选) └── tests/ # workspace 级集成测试(可选)
@ -137,8 +139,9 @@ focus-json ← (零外部依赖,纯 std
focus-core ← focus-json, tokio focus-core ← focus-json, tokio
focus-transport ← focus-json, tokio, rustls, tokio-rustls, rustls-native-certs focus-transport ← focus-json, tokio, rustls, tokio-rustls, rustls-native-certs
focus-providers ← focus-core, focus-transport focus-providers ← focus-core, focus-transport
focus-tools ← focus-core, tokio focus-tools ← focus-core
focus-harness ← focus-core, focus-json focus-harness ← focus-core, focus-json
focus-tui ← focus-core, focus-providers, focus-tools, focus-harness, focus-json, ratatui, crossterm
``` ```
**规则** **规则**
@ -181,11 +184,14 @@ focus-harness ← focus-core, focus-json
- **会话存储**:参考 pi 的设计——树结构(每条 entry 有 `id` + `parentId`JSONL 追加写。 - **会话存储**:参考 pi 的设计——树结构(每条 entry 有 `id` + `parentId`JSONL 追加写。
- **测试**:会话树的构建/查询/分支、压缩的 token 估算与切点算法。 - **测试**:会话树的构建/查询/分支、压缩的 token 估算与切点算法。
#### `focus-cli` — 已删除(由 TUI 替代) #### `focus-tui` — 终端交互层(组装职责)
- `focus-cli` 已彻底删除(不再作为 workspace 成员)。后续里程碑将新增 TUI crate - **内容**provider + tools + harness 的装配、base_url / api_key / model 等配置
(届时命名,如 `focus-tui`),承担**组装**职责provider + tools + harness 的装配、 `~/.focus/config.json`TUI 内 `/config` 编辑provider 构造时传入)、动态系统
base_url / api_key / model 等配置provider 构造时传入)、动态系统提示注入、 提示注入(方案 E 的 Usage/上下文占用、自动上下文压缩的执行harness 产出方案 →
自动上下文压缩的执行harness 产出方案 → 调 provider 摘要 → `Agent::replace_messages` 写回)。 调 provider 摘要 → `Agent::replace_messages` 写回)、会话持久化(`~/.focus/sessions/`)。
- **交互**多行输入、流式显示、Esc 中止、折叠的思考/工具块(显示耗时与内容摘要,
点击或 Tab 展开)、命令(`/new` `/sessions` `/config` `/compact`)。
- **禁止**:把业务逻辑放这里。这里只做**组装与呈现**。
## 4. 代码规范 ## 4. 代码规范

1592
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@ members = [
"crates/focus-providers", "crates/focus-providers",
"crates/focus-tools", "crates/focus-tools",
"crates/focus-harness", "crates/focus-harness",
"crates/focus-tui",
] ]
# Shared dependency versions. Member crates reference these with # Shared dependency versions. Member crates reference these with
@ -37,6 +38,7 @@ focus-transport = { path = "crates/focus-transport" }
focus-providers = { path = "crates/focus-providers" } focus-providers = { path = "crates/focus-providers" }
focus-tools = { path = "crates/focus-tools" } focus-tools = { path = "crates/focus-tools" }
focus-harness = { path = "crates/focus-harness" } focus-harness = { path = "crates/focus-harness" }
focus-tui = { path = "crates/focus-tui" }
[profile.release] [profile.release]
lto = true lto = true