# DEV

面向熟练 Rust 工程师的上手指南：只保留本仓库约定与高频命令。

## 一键检查（提交前）

```bash
cargo fmt --all
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-features
```

## 常用命令

```bash
# workspace / IDE 解析
cargo metadata --format-version 1

# 快速编译检查
cargo check
cargo check --workspace --all-features

# 运行默认 server（示例承载）
cargo run -p smcp-server-hyper

# 依赖管理（需要 cargo-edit）
cargo add <crate>
cargo add -D <crate>
cargo update
cargo tree
```

## 目录与职责

- `Cargo.toml`
  - workspace + 主包 `a2c-smcp` 配置，包含 features 定义。
- `src/`
  - 主包入口：根据 features 重新导出各子 crate 的 API。
- `tests/`
  - 跨 crate 集成测试：Agent + Computer + Server 联合测试。
  - `tests/common/`：共享测试工具和 fixtures。
- `crates/smcp/`
  - 协议与类型层：只放**协议层公共类型**（事件常量、`AgentCallData`、`ToolCallReq`、`GetToolsReq/Ret`、`EnterOfficeReq` 等跨角色共享的协议结构）。
- `crates/smcp-agent/`
  - Agent 客户端 SDK：connect/auth、join_office、tool_call（ack + timeout + cancel）、订阅 `notify:*`。
  - 包含 Agent 专属类型（如 `AgentEventHandler`）。
  - 依赖 `tf-rust-socketio` 作为 Socket.IO 客户端。
- `crates/smcp-computer/`
  - Computer 客户端 SDK：注册 handler trait，处理 `client:get_tools`/`client:tool_call`/`client:get_desktop`，并支持上报 `server:update_*`。
  - 包含 Computer 专属配置类型（如 `MCPServerConfig`、`MCPServerStdioConfig` 等）。
  - 依赖 `tf-rust-socketio` 作为 Socket.IO 客户端。
- `crates/smcp-server-core/`
  - Server 核心逻辑（会话/路由/鉴权/转发/广播），紧绑定 `socketioxide`。
- `crates/smcp-server-hyper/`
  - 默认 HTTP 承载适配（Hyper），作为示例/默认 adapter。
- `docs/`
  - 设计/协议补充文档。
- `examples/`
  - 可运行的最小示例。

## 对外 API 风格（Decision）

- 当前版本：采用 A（回调/事件驱动）。使用者通过注册 handler trait/回调函数处理事件；SDK 内部负责 spawn 接收循环、分发与 ack。
- 未来增强：如遇到需要更强背压/组合控制的场景，再追加 B（显式 await / stream）形态作为可选接口，不破坏 A 的现有使用方式。

## 测试约定（简要）

- **Unit**：放在各 crate 的 `src/**` 内 `#[cfg(test)]`，不做真实网络/真实进程。
- **Integration**：
  - 根目录 `tests/`：跨 crate 联合测试（如 Agent + Computer + Server）
  - 各 crate 的 `tests/`：单个 crate API 测试
  - 所有等待必须 `tokio::time::timeout`，公共 fixtures 放到 `tests/common/`。
- **E2E**：放在 `tests/e2e/`（如需要），建议做可跳过策略（feature/env），产物落 `target/tmp/<test_name>/`。

## 运行测试

```bash
# 运行所有测试（不包括E2E）
cargo test --workspace

# 运行特定 features 的测试
cargo test --features "agent,computer"

# 运行跨 crate 集成测试
cargo test --test full_stack --features full

# 运行单个 crate 的测试
cargo test -p smcp-server-core

# 运行 E2E 测试（需要 e2e feature）
cargo test --features e2e -- --ignored

# 运行所有测试包括 E2E
cargo test --workspace --features e2e

# 运行特定的 E2E 测试
cargo test --features e2e test_playwright_mcp_server_basic_connection -- --ignored
```

### E2E 测试说明

E2E 测试用于验证与真实的 MCP 服务器的集成，目前包括：

- **Playwright MCP Server 测试**：测试与 `npx @playwright/mcp@latest` 的集成
- 使用 stdio 模式启动服务器
- 测试包括基础连接、工具执行和错误处理

运行 E2E 测试前确保：
1. 已安装 Node.js 和 npm
2. `npx` 命令可用
3. 网络连接正常（用于下载 Playwright MCP 包）

E2E 测试默认被忽略，需要使用 `--features e2e` 和 `-- --ignored` 参数运行。

## 代码覆盖率

需要先安装 cargo-llvm-cov：
```bash
cargo install cargo-llvm-cov
```

### 生成覆盖率报告

```bash
# 运行测试并生成覆盖率报告（显示到终端）
cargo llvm-cov --workspace

# 生成 HTML 覆盖率报告（会在 target/llvm-cov/html/index.html）
cargo llvm-cov --workspace --html

# 生成覆盖率报告并显示未覆盖的行
cargo llvm-cov --workspace --show-missing-lines

# 只对特定 crate 生成覆盖率
cargo llvm-cov -p smcp-server-core --show-missing-lines

# 生成 LCOV 格式报告（用于 CI 集成）
cargo llvm-cov --workspace --lcov --output-path lcov.info
```

### 常用覆盖率组合命令

```bash
# 运行测试并打开 HTML 报告（macOS）
cargo llvm-cov --workspace --html && open target/llvm-cov/html/index.html

# 查看特定文件的覆盖率详情
cargo llvm-cov --workspace --show-missing-lines --file src/lib.rs
```

## vendor/rust-socketio 修改说明 / Vendor rust-socketio Modifications

### 主要修改 / Key Modifications

本仓库使用的是修改版的 `rust-socketio`，主要增强并发 ACK 支持：

1. **并发 ACK 支持 / Concurrent ACK Support**
   - `Payload` 枚举变体新增可选 `ack_id` 字段
   - `Payload::Text`、`Payload::Binary`、`Payload::String` 现在都支持 `ack_id`
   - 新增 `ack_with_id()` 方法用于显式指定 ack_id
   - 新增 `with_ack_id()`、`ack_id()`、`set_ack_id()` 辅助方法

2. **测试增强 / Test Enhancements**
   - 添加 `test_concurrent_ack.rs` 和 `test_async_concurrent_ack.rs`
   - 验证并发 ACK 功能的正确性

### 测试执行与覆盖 / Testing Execution & Coverage

#### 运行 rust-socketio 测试

```bash
# 进入 vendor 目录
cd vendor/rust-socketio

# 运行所有测试
cargo test

# 运行特定模块测试
cargo test test_concurrent_ack
cargo test test_async_concurrent_ack

# 运行带输出信息的测试
cargo test -- --nocapture

# 运行单个测试文件
cargo test --lib test_concurrent_ack
```

#### 生成覆盖率报告

```bash
# 在 vendor/rust-socketio 目录下

# 安装覆盖率工具（如果未安装）
cargo install cargo-llvm-cov

# 生成覆盖率报告
cargo llvm-cov --html

# 查看未覆盖的行
cargo llvm-cov --show-missing-lines

# 只对 socketio crate 生成覆盖率
cargo llvm-cov -p socketio --show-missing-lines

# 生成 LCOV 格式报告
cargo llvm-cov --lcov --output-path lcov.info
```

#### 测试覆盖率最佳实践

```bash
# 一键运行测试并生成 HTML 报告
cargo llvm-cov --workspace --html && open target/llvm-cov/html/index.html

# 只运行修改相关测试并查看覆盖率
cargo llvm-cov --files src/payload.rs src/client/client.rs

# 持续监控覆盖率变化
cargo llvm-cov --summary --output-file coverage.txt
```
