面向团队的 AI 能力集中管理与分发平台。
由少数「能力建设者」开发 Skill、配置 MCP、维护环境与基础设施,平台在权限管控下将这些能力分发给团队的其他成员——包括不具备技术背景的同事。平台同时提供「人机求助」机制:AI 无法自行解决的问题可以转交给团队中掌握相关信息的人,所得答复沉淀为可复用的 Skill 经验。
AI 的能力边界往往不取决于模型本身,而取决于它在具体环境中能获取到什么。
团队里每个人负责不同的职责,不会拥有团队的全部业务上下文,也不应握有全部权限。因此 AI 在真实工作中会稳定地 遇到两类阻塞:
- 权限缺失:所需的密钥、数据库与部署资源不在本地,需要向管理者申请。
- 信息缺失:所需的业务上下文分散在他人或内部系统中,需要向了解的人求助。
以往这两类阻塞只能由人介入化解:使用者中断手上的工作,代替 AI 去申请与询问,再将结果转述回来。eat 把这一过程 交还给 AI 自行完成——发起授权申请、发起求助、获取答复,并将答复沉淀为可复用的经验供后续检索;人只需在各自的 职责范围内完成审批或回复。
第三类阻塞出现在交付的最后一公里。AI 让团队中的任何人都能快速做出一个网站或工具来支撑业务,但要真正投入使用, 仍需要一个数据库和一次上线。eat 同样覆盖这一段:任何成员的 AI 都能按权限获得专属数据库账号,自助创建应用并将其直接部署 上线,无需等待运维介入。
eat 的定位由此确定:作为 AI 与人之间的协作层,让权限、信息与基础设施在团队内按规则流动,而不是滞留在少数人手中。
- 让每个成员的 AI 独立完成交付:一名成员——即使不编写代码——从开发到上线所需的 Skill、MCP 配置、环境变量、数据库账号与部署能力,均由平台按权限直接下发至其本地 AI;缺少权限即时申请,缺少上下文即时求助,无需自行搭建环境、无需四处索取密钥、无需等待他人配合。
- 集中管理:Skill、MCP 配置、环境变量、数据库账号与部署能力统一纳管,不再分散于各成员本地。
- 权限管控:资源级授权、元数据可见 + 取值受控、申请审批流、审计日志。
- 能力分发:角色模板批量套用,CLI / MCP 自动同步至本地 AI 工作环境。
- 人机协作求助:AI 可主动向团队成员求助,答复沉淀为经验 Skill,团队知识持续累积。
| 环境变量:元数据可见、取值受控 | 求助 → 答复 → 沉淀为经验 | 部署记录:绕过门禁的也看得见 |
|---|---|---|
![]() |
![]() |
![]() |
eat sync 把能力同步到本地 AI |
eat env 申请与拉取 |
eat ask 让 AI 找人求助 |
|---|---|---|
![]() |
![]() |
![]() |
点开可看大图。控制台每个页面与 CLI 关键流程的全集:界面截图与录屏。
flowchart TB
subgraph U["使用侧:团队成员与他们的本地 AI"]
direction LR
P["团队成员<br/>开发 / 运营 / 新人"]
AI["本地 AI<br/>Claude Code 等"]
CLI["eat CLI"]
MCPS["MCP Server<br/>eat mcp"]
WEB["Web 控制台"]
P -->|"提出需求"| AI
P -->|"浏览器"| WEB
AI -->|"执行命令"| CLI
AI -->|"stdio"| MCPS
end
CLOUD["云端 AI 服务<br/>装不了 CLI 的客户端"] ==>|"HTTP MCP · API Key 鉴权"| S
U ==>|"HTTPS REST · Token 鉴权"| S
subgraph S["平台服务:NestJS + Fastify 单体(一个容器)"]
API["API 层<br/>zod 契约校验 · 资源级权限"]
DOM["领域模块<br/>能力分发 · 人机协作 · 资源交付"]
INF["平台基建<br/>信封加密 · 审计 · Webhook 投递 · 控制台与 CLI 托管"]
API --> DOM --> INF
end
S --> PG[("PostgreSQL<br/>业务数据 + 审计")]
S --> DOK["Dokploy<br/>部署与日志"]
S --> TDB[("团队数据库实例")]
S --> IM["群机器人 webhook<br/>求助通知"]
S --> LLM["AI 网关<br/>OpenAI 接口范式"]
- 单体 + 单库:REST API 与后台任务运行在同一个 NestJS 进程内,业务数据与审计写入同一个 PostgreSQL——不引入 Redis,也不部署独立 worker。控制台构建产物由后端静态托管,整体仍为单个容器。
- 三端一套契约:请求 / 响应契约以 zod 定义在
packages/shared,server 据此校验,CLI 与前端复用同一份类型,三端类型一致由编译器保证。 - AI 是一等用户:面向人的能力均提供对应的 MCP 工具,AI 可自助调用,无需人工转述。
- 元数据公开、取值受控:AI 默认可见配置的存在与用途说明,读取取值则需授权;无权限时返回可执行的申请引导,而非静默失败。
| 能力 | 说明 |
|---|---|
| 账号与角色 | 管理员 / 成员两级平台角色 + 资源级 Owner,不引入复杂 RBAC |
| 用户管理 | 创建账号、变更角色、禁用 / 启用、重置密码;禁用与改密即时吊销该用户全部 Token |
| 开放注册 | 管理员开关 + 允许的邮箱后缀白名单,注册后即登录,无审批流程 |
| 设备码登录 | eat login 生成设备码 → 浏览器授权页确认,CLI 凭证写入 ~/.eat/credentials.json;AI 代为登录时用 eat login --no-wait 发起、eat login --status 领取,不阻塞会话 |
| 能力 | 说明 |
|---|---|
| 两级结构 | 环境(如 internal-api)+ 变量;变量元数据(key、用途备注)默认对全员可见,也可按变量单独关闭 |
| 敏感 / 非敏感 | 敏感值信封加密存储(AES-256-GCM + KEK);非敏感值明文存储,有读取权限者在清单与控制台中直接可见 |
| 资源级授权 | 授权粒度为「用户 × 单个变量」或「用户 × 整个环境」,可设置有效期,由 Owner 与管理员管理 |
| 申请审批 | 无权限拉取时引导发起申请,由 Owner 审批;CLI / MCP / 控制台三端均可查询状态 |
| 取值下发 | eat env pull 按权限拉取并写入 ./.env;同名文件不是 eat 生成的会中止不覆盖(--out / --print 换条路,--force 覆盖前自动备份) |
| 读取审计 | 敏感值的每次读取均记入审计日志 |
| 能力 | 说明 |
|---|---|
| 纳管与版本 | eat skill push 上传,首次推送创建,再次推送由服务端自动递增版本 |
| 可见性与订阅 | 三档可见性(团队可见 / 授权可见 / 私有)控制可见范围;成员订阅后随同步写入本地 |
| 捆绑(全员必装) | 管理员可将某个 Skill 设为捆绑:对全体成员恒为已订阅、不可退订,同步时必定下发(管理员自身不受约束) |
| 订阅者管理 | 订阅人数对全员可见;管理员可查阅订阅者名单(含来源)并直接为某位成员订阅或取消订阅 |
| 清单检索 | 按关键词、范围(已订阅 / 未订阅 / 我创建的)与类型筛选,服务端分页,控制台支持跳页 |
| 本地同步 | eat sync 将实际文件写入 ~/.agents/skills/,并逐个软链至 ~/.claude/skills/(Windows 下改为复制实文件) |
| 安装范围 | 默认安装至全局,也可仅安装至当前项目(./.agents/skills/ + 相对软链)或指定的自定义目录 |
| 内置平台指南 | 为每个成员自动注入 eat-platform-guide Skill 并置于首位,使本地 AI 了解平台能力与正确用法 |
| 更新提示 | 服务端通过响应头下发 CLI 版本与用户级 Skill 指纹,CLI / MCP 侧提示存在新版本;eat self-update 一条命令完成升级 |
| 能力 | 说明 |
|---|---|
| 集中维护 | 管理员统一维护 MCP server 配置,成员订阅后随 eat sync 写入本地 |
| 密钥占位符 | 配置中使用 ${env:环境/KEY},下发时按该成员的权限渲染,无权限则不下发明文 |
| 能力 | 说明 |
|---|---|
| 能力套餐 | 管理员预定义「一组 Skill + MCP 配置 + 环境引用」 |
| 一键套用 | 成员选定模板即批量订阅,新成员入职当天即可开始工作 |
| 能力 | 说明 |
|---|---|
| 两类入口 | 向指定成员求助,或向某个 Skill 的作者求助(AI 依据能力描述自行选择) |
| 可求助登记 | 用户自助登记能力描述,并配置接收求助 / 接收回复两个开关 |
| 飞书通知 | 飞书群自定义机器人 webhook(支持加签,密钥由用户填入),通知为卡片消息,包含「查看请求」按钮与「发送给 Agent」代码块 |
| 多轮对话 | 求助 → 回复 → 追问 → 标记解决,CLI / MCP / 控制台三端均可读写 |
| 频率限制 | 按用户限制每小时求助次数(可配置,见 EAT_HELP_RATE_LIMIT) |
| 能力 | 说明 |
|---|---|
| 经验即 Skill | 求助解决后由平台 AI 将对话整理为结构化经验,以 Skill 形式分发与订阅 |
| 自助检索 | AI 可先检索经验库,同类问题无需重复求助 |
| 能力 | 说明 |
|---|---|
| 实例登记 | 管理员登记团队数据库实例,管理员凭证加密存储 |
| 真实建库建号 | 成员申请 → 审批 → 平台在实例上实际创建数据库与专属账号并授权(PostgreSQL) |
| 凭证下发 | 凭证自动生成为一组环境变量,其中仅 DB_PASSWORD 为敏感值,整组默认仅授权给申请人 |
| 能力 | 说明 |
|---|---|
| 自助创建应用 | 成员填 Git 地址与构建方式即可创建应用,平台自动在 Dokploy 上建 application、绑定 Git 源与管理员预置的 SSH key;Dokploy 侧任一步失败自动回滚,不留孤儿应用 |
| 构建方式 | 仅开放两种:Dockerfile(可指定 Dockerfile 路径与构建上下文)与静态托管(发布目录 + SPA 模式;不跑构建命令,仓库里需直接有产物),创建后可改、下次部署生效 |
| 自动分配域名 | 管理员配置域名后缀后,成员新建的应用自动绑定 <slug>.<后缀>(可选 HTTPS),创建结果与应用详情直接给出访问地址;域名流量转发到应用声明的容器端口(静态托管固定 80) |
| 应用 env | 运行时 env 与构建时 Build Args 两块,CLI / MCP / 控制台均可拉取与推送,推送为整体覆盖、只回 key 级差异;读写记入审计 |
| 部署授权 | 成员自建的应用首次部署需管理员授权一次,之后不再拦;被拒的尝试会在控制台标为「待授权」 |
| 挂载已有应用 | 管理员可把 Dokploy 上既有的 application 挂载进平台(可从 Dokploy 搜索选择),构建配置仍在 Dokploy 侧维护,删除只解绑 |
| 成员管理 | 应用成员制,日志、env 与部署权限收敛至应用成员,操作记入审计 |
| 部署入口 | eat deploy / MCP trigger_deploy / 控制台「部署」按钮三个入口门禁一致(应用成员 + 管理员授权),均按应用绑定的 Git 分支构建,记录标注从哪触发;eat deploy 可选配一条本地预检命令(--check),非零退出即中止部署。部署前不做本地密钥扫描 |
| 状态透传 | 部署记录与状态一律以 Dokploy 的构建记录为准,平台库仅存储 Dokploy 不具备的业务元数据(触发人、触发入口);构建失败时将构建日志末尾写入错误信息,在平台内即可看到真实报错 |
| 绕过可见 | 直接在 Dokploy 侧触发的部署同样列入部署历史,并标注为绕过平台,成员与授权门禁被绕过的情况因此可见 |
| 历史留存 | Dokploy 每个应用仅保留最近 10 次构建记录,平台侧元数据只增不删,--all 可回溯已被清理记录的触发人与触发入口 |
| 日志读取 | 构建日志(用于排查部署失败)与容器运行日志(用于排查构建成功但服务异常),CLI 与控制台均可读取 |
对接的 Dokploy 版本会影响部署记录的归属准确度,另有两条 Dokploy 自身的行为限制会影响使用预期, 见文末的 Dokploy 版本兼容性。
| 能力 | 说明 |
|---|---|
| 信封加密 | 敏感值采用 AES-256-GCM 加密,KEK 由部署环境变量提供,不依赖外部 KMS |
| 明文不外泄 | 密钥不会下发给无权限方,错误消息、日志与 webhook payload 同样不含明文(webhook 仅携带事件与链接) |
| 审计日志 | 敏感值读取、授权变更、审批决策、部署与日志读取全程留存记录 |
上述各模块的能力,在以下入口均可使用:
| 入口 | 说明 |
|---|---|
| Web 控制台 | 管理、授权与审批的图形入口;桌面侧边栏 + 移动端抽屉布局,移动端同样可用 |
| eat CLI | 成员与本地 AI 的主通道,命令按模块分组;完整命令与参数以 eat --help 为准 |
| MCP(本机) | eat mcp 启动 stdio server,将平台能力封装为工具供本地 AI 自助调用;完整工具清单以 MCP 客户端中列出的为准 |
| MCP(云端) | 平台自带标准 Streamable HTTP 端点 <平台>/mcp,鉴权为请求头 Authorization: Bearer <API Key>(密钥在控制台「安装与接入」页自助生成、随时吊销),供装不了 CLI 的云端 AI 服务接入;工具集与本机一致 |
| CLI 分发 | 由平台自托管分发,不发布至 npm registry:一条命令完成安装(见下方「快速开始」),版本与平台天然一致,升级即重新安装;macOS / Linux / Windows 全链路兼容 |
pnpm install && pnpm build
pnpm db:migrate && pnpm db:seed # 初始管理员 admin@example.com / admin12345
node apps/server/dist/main.js # http://localhost:3000
node apps/cli/dist/index.js login # CLI 设备码登录团队成员安装 CLI(由平台自托管分发,无需 npm registry;亦可打开控制台「安装 CLI」页,一键复制 Agent 安装指令交给自己的 AI):
# macOS / Linux / WSL / Git Bash
curl -fsSL http://<平台地址>/install.sh | sh
# Windows PowerShell
powershell -ExecutionPolicy ByPass -c "irm http://<平台地址>/install.ps1 | iex"
eat login --server http://<平台地址>配置项以 .env.example 为准(复制为 .env 后填写;.env 已在 .gitignore 中,不纳入版本库)。三个必填项:
| 变量 | 说明 |
|---|---|
DATABASE_URL |
PostgreSQL 连接串,生产必须指向持久化实例 |
EAT_KEK |
值加密主密钥,32 字节 base64:openssl rand -base64 32。丢失后密文不可恢复,务必备份;开发环境默认使用内置的不安全值 |
EAT_PUBLIC_URL |
平台对外地址,设备码授权页与 webhook 链接以此拼接 |
其余均为可选项(服务端口、初始管理员、种子开关、求助限流等),默认值与说明均见 .env.example。
使用方式:Docker 传入 --env-file .env;本地直接运行使用 node --env-file=.env apps/server/dist/main.js(Node 20.6+ 原生支持)。
仓库根目录提供 Dockerfile(国内网络环境使用 Dockerfile_cn,依赖源切换为 npmmirror),详细步骤见部署文档。
- 界面截图与录屏 —— 控制台每个页面与 CLI 关键流程的全集;生成方式见
scripts/demo/。 - 产品设计文档 —— 产品与技术设计的唯一事实源,含权限模型、数据模型、接口设计与全部决策记录。
- 部署文档 —— 镜像构建、Dokploy 部署步骤、备份与 CLI 自举分发。
平台不自建部署系统,而是挂载 Dokploy 并通过其 API 操作,因此对接的 Dokploy 版本会影响一部分行为。
平台触发部署时会将 eat:<id> 标记写入 Dokploy 构建记录的 description,读取时据此精确判定该构建记录对应
哪一次平台部署——触发人与触发入口均依赖这一对应关系。而 application.deploy 的 title /
description 两个入参自 v0.25.0 起才存在:v0.24.0 及更早的版本仅接受 applicationId,多传的键会被静默
丢弃,既不报错,也没有任何迹象提示版本过低。
在更早的版本上平台仍可正常使用,但会自动降级为按触发时间就近推断归属,并在 CLI 与控制台中将该记录标注为 「⚠ 归属按时间推断」。该降级存在实际代价:同一 Dokploy 应用被并发部署时(例如几乎同时有人在 Dokploy 控制台 也触发了一次),归属可能出现错配,将绕过平台、在 Dokploy 侧直接触发的部署显示为经平台触发的部署。如需部署记录的归属可靠, 请升级至 v0.25.0 以上。
- 每个应用仅保留最近 10 条构建记录,超出部分连同构建日志文件一并删除,且该数值在 Dokploy 中为硬编码、
不可配置。这是部署历史默认只有 10 条的原因;更早的部署可通过
eat app deployments <app> --all(或控制台的「显示全部历史」)从平台侧元数据回溯,可查看触发人与触发入口,但构建日志已不存在。 - 在 Dokploy 侧触发、且构建记录已被上述清理删除的部署,平台无法感知——平台从未为其创建过元数据。 因此「有多少次部署绕过了平台门禁」这一问题,仅在最近 10 次构建的窗口内可以准确回答。
| 版本 | 表现 |
|---|---|
| ≥ v0.25.0 | application.deploy 接受 title / description 并持久化到构建记录,部署归属精确 |
| ≤ v0.24.0 | 上述两个入参不存在、被静默丢弃,部署归属降级为按时间推断(标注 inferred) |
| v0.30.4(实测) | project.all 返回的应用条目不含 appName 与 description,控制台「从 Dokploy 选择应用」无法按容器名搜索,只能按应用显示名与 application id 搜索(清单本身可正常使用) |
| v0.30.5(实测) | Git 来源的应用构建一结束就把构建记录的 title / description 覆盖成提交信息(init / Commit: <hash>),平台写入的 eat:<id> 标记只在排队与构建期间存在。eat deploy 会立刻轮询、通常赶在覆盖前完成精确认领并把认领方式记进平台库;MCP / 控制台触发后若无人及时查看,则回落为按时间推断(标注 inferred)。自助创建应用、SSH key 绑定、构建方式、env 读写、部署与日志均已在该版本真机验证 |





