Crate 结构与仓库布局

适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:chengflow/Cargo.tomlchengflow/CLAUDE.mdcrates/

后端是一个 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 buildcargo run 只作用于 cheng-apichengctl。要全部构建用 --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 持久化;迁移;DieselWorkflowRepositoryDieselExecutionRepository;领域 ↔ 数据行转换
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-statelang-typescriptlang-javascriptlang-pythonRust 支持是内建的,其他语言由 feature 控制。

共享的「本地执行三件套」

这三个 crate 之所以存在,是因为同一批操作必须在服务端与客户端以完全一致的语义运行:

Crate 拥有
cheng-file-ops 纯文件操作内核——逻辑加 JSON 兼容的 I/O 类型,不含节点/引擎/API 代码
cheng-workspace-tools 对非文件类工作区工具做同样的切分:进程、shell、git、测试、markdown、预览
cheng-local-executor 与界面无关的客户端本地执行外壳:请求分类、只读策略、变更/进程串行化、取消

cheng-file-opstools/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-clilib.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-helperworkflow-json-builderskill-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 值——triggercontrolwebui 等——是给界面用的逻辑分组,可能与目录名不同。不要以为 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 openapimake docsmake devmake test-api;完整列表用 make help./build.sh 构建发行二进制并打包 Docker 与 hybrid 产物,默认单用户模式与 x86_64-unknown-linux-musl 目标。

下一步

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容