适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:
chengflow/Cargo.toml、chengflow/CLAUDE.md、crates/
后端是一个 Cargo workspace。本页就是它的地图:每个 crate 拥有什么,以及初次找东西时最费时间的命名陷阱。
工作空间成员
members = [
"crates/cheng-vector", "crates/cheng-common", "crates/cheng-core",
"crates/cheng-storage", "crates/cheng-engine", "crates/cheng-file-ops",
"crates/cheng-code-index","crates/cheng-local-executor",
"crates/cheng-workspace-tools", "crates/cheng-nodes", "crates/cheng-llm",
"crates/cheng-adapters", "benches/cheng-engine-benchmarks",
"crates/cheng-api", "crates/cheng-cli", "crates/cheng-mcp",
"crates/chengctl",
]
default-members = ["crates/cheng-api", "crates/chengctl"]
default-members 很重要。 不带参数的 cargo build 或 cargo run 只作用于 cheng-api 和 chengctl。要全部构建用 --workspace,要构建单个用 -p <crate>。
工作空间使用 edition 2024,依赖版本集中钉在 [workspace.dependencies]——当多个 crate 都需要某个依赖时,加在那里,而不是加在成员 crate 里。
各个 crate
基础
| Crate | 拥有 |
|---|---|
cheng-common |
基础类型、错误处理、共享工具,以及 version.rs——所有组件共读的那个唯一发行版本 |
cheng-core |
领域模型、端口(trait)、领域服务、领域事件。不依赖任何基础设施。 |
cheng-core 是需要守护的那个 crate。如果你要加的东西需要数据库连接、HTTP 客户端或文件系统路径,它就不属于这里。
基础设施
| Crate | 拥有 |
|---|---|
cheng-storage |
基于 Diesel 的 PostgreSQL 持久化;迁移;DieselWorkflowRepository、DieselExecutionRepository;领域 ↔ 数据行转换 |
cheng-vector |
向量数据库抽象——Qdrant 集成、具名向量、BM25 全文 |
cheng-llm |
大语言模型供应商抽象层 |
cheng-adapters |
第一方渠道适配器(WhatsApp、Telegram、Slack、钉钉、企业微信、FlowChat),在 create_default_registry() 中注册 |
cheng-mcp |
MCP 集成:挂在 /mcp 的应用级静态服务(MCP_ENABLED=true),外加按工作流在临时端口上启动的动态服务 |
执行
| Crate | 拥有 |
|---|---|
cheng-engine |
基于 DAG、支持流式的执行器;调度;生命周期 |
cheng-nodes |
内置节点与注册表 |
cheng-runtime |
脚本执行:LightRuntime(QuickJS / Python 沙箱)和 HeavyRuntime(Docker),供 tools/code_* 节点使用 |
cheng-code-index |
基于 Tree-sitter 的代码智能:索引、符号、跳转定义、查找引用、工作区符号 |
cheng-runtime 不是顶层工作空间成员——它是 cheng-nodes 的路径依赖。在成员列表里找它是找不到的。
cheng-code-index 的核心与存储无关,可选的持久 PostgreSQL 存储和 Redis 协调藏在 cargo feature 后面:redis-state、lang-typescript、lang-javascript、lang-python。Rust 支持是内建的,其他语言由 feature 控制。
共享的「本地执行三件套」
这三个 crate 之所以存在,是因为同一批操作必须在服务端与客户端以完全一致的语义运行:
| Crate | 拥有 |
|---|---|
cheng-file-ops |
纯文件操作内核——逻辑加 JSON 兼容的 I/O 类型,不含节点/引擎/API 代码 |
cheng-workspace-tools |
对非文件类工作区工具做同样的切分:进程、shell、git、测试、markdown、预览 |
cheng-local-executor |
与界面无关的客户端本地执行外壳:请求分类、只读策略、变更/进程串行化、取消 |
cheng-file-ops 被 tools/file_ops_hub 的两个后端共享——cheng-nodes 里的服务端本地垫片,以及客户端本地执行器。cheng-local-executor 被每一个本地客户端复用:cheng CLI、它的 TUI 与 headless 外壳,以及桌面客户端。这正是要点所在:文件语义不能在「服务器做的」和「你机器做的」之间发生漂移。
接口
| Crate | 拥有 |
|---|---|
cheng-api |
Axum REST API、经 WsManager 的 WebSocket、main.rs 里的依赖注入 |
cheng-cli |
终端工作流客户端——构建出 cheng 二进制;包含 TUI(tui/、tui.rs)和 headless 模式 |
chengctl |
用于 i18n 工具链的离线 CLI,不需要数据库或服务器 |
cheng-cli 的 lib.rs 暴露了 API 客户端、事件流和会话缓存,以便集成测试驱动它们;main.rs 只是在其上的薄组装层。二进制名叫 cheng,不叫 cheng-cli。
宏
cheng-macros 是 crate 的目录名,但 Cargo 包名是 cheng-workflow-macros,Rust 导入路径是 cheng_workflow_macros。它提供 #[derive(Node)] 和 #[derive(FieldOrder)]。
这是最耗时间的命名陷阱。use cheng_macros::Node; 编译不过。
chengflow/ 下的非 Rust 目录
| 目录 | 内容 |
|---|---|
node_skills/ |
供智能体与 LLM 功能消费的、按节点划分的用法文档/技能定义,每种节点一个目录 |
skills/ |
更高层的工作流构建技能:workflow-helper、workflow-json-builder、skill-importer |
config/i18n |
节点翻译语言包 |
docs/ |
内部设计文档 |
node_skills/ 和 skills/ 是面向 LLM 的资产,不是 Rust 代码。新增一个节点通常也意味着要加一个 node_skills/<node>/ 条目,否则智能体不知道怎么用它。
节点实现目录
在 cheng-nodes/src/nodes/builtin/ 之下:
agent ai chat document io rag table tools translation ui utils workspace
#[node(...)] 宏里的 category 值——trigger、control、webui 等——是给界面用的逻辑分组,可能与目录名不同。不要以为 category = "Utils" 就代表文件在 utils/ 里,反之亦然。
找路
| 你在找 | 从这里开始 |
|---|---|
| 一条业务规则 | cheng-core/src/domain/ |
| 一个接口定义 | cheng-core/src/ports/ |
| 一条数据库查询 | cheng-storage/src/repos/ |
| 调度或 DAG 逻辑 | cheng-engine/src/executor/、.../dag/ |
| 某个节点 | cheng-nodes/src/nodes/builtin/<category>/ |
| 某个 HTTP 接口 | cheng-api/src/rest/handlers/,路由在 rest/routes.rs |
| 某个 WebSocket 消息 | cheng-api/src/ws/protocol.rs |
| 组装与依赖注入 | cheng-api/src/main.rs |
文档与打包
Makefile 从代码生成 API 文档——make openapi、make docs、make dev、make test-api;完整列表用 make help。./build.sh 构建发行二进制并打包 Docker 与 hybrid 产物,默认单用户模式与 x86_64-unknown-linux-musl 目标。

暂无评论内容