协作模板
Wework 从“协作 → 模板”发现模板,Wegent 从能力商店的协作模板分类进入。
两个入口复用 packages/collaboration/src/templates 的界面、校验和配置模型,读取同一后端。
从能力商店使用模板
在“能力 → 模板”打开模板详情,点击“使用此模板”后选择已有项目,或创建新项目。 内置模板无需再次添加到账号;公开模板会在使用时按现有安装协议获取配置。 已有项目列表只展示账号可管理的活动项目,选择后重新校验当前权限,再确认角色与小组名称。 应用成功后进入项目看板;既有任务、小组和视图保持不变。
创建新项目会带入模板名称、说明、分工和流程,并沿用空间选择及空间创建步骤。 Web 端从模板新建项目时,使用账号指定的在线默认执行设备及对应运行时的唯一默认模型, 不会选择列表中的任意设备或模型。支持后端可访问其模型目录的在线 APP 设备。 新建项目时需明确勾选执行环境授权;表单说明该操作会共享到所选空间并授权给新项目。 缺少授权选择、默认设备或默认模型时在创建项目前保留表单并提示补全。 向已有项目导入时,确认弹窗直接列出项目已授权且在线的设备,不要求该设备同时是账号默认设备。 只有一台时自动选中,多台时由用户选择本次使用的设备,不修改账号默认设备。 设备列表只读取项目设备清单;提交时再读取模型目录并校验设备在线状态、项目授权和默认模型。 缺少可用设备或设备加载失败时,可以在新标签页打开项目执行环境设置,完成配置后返回弹窗刷新并继续应用; 小组名称和角色调整保持不变。导入不会自动增加空间或项目设备权限。 模板保存、收藏和预览不触发这些操作。 本地项目直接使用本机执行环境,不调用云端空间共享或项目设备授权接口。
存储与权限
模板存储在 kinds,使用 kind: Template、spec.category: collaboration。
完整身份为 user_id + namespace + name。官方模板使用 user_id=0、namespace=system,
个人模板使用当前用户和 namespace=default。旧收件箱模板接口仅处理系统收件箱模板,
不能读取、修改或实例化协作模板。
发布复用资源库协议,resource_type=template。发布信息位于 spec.capability,
marketplace_resources 继续作为发现索引。安装复用 resource_members 的
resource_type=Template 引用,不复制模板 Kind。个人引用和有权访问的空间引用均可读取;
每次下载仍需验证当前权限。个人保存默认不发布。
已有账号或空间引用会直接用于下载,不重复申请个人安装;撤下公开发布后,保留引用的用户仍可读取配置。
配置接口
新接口由 Rust 实现并登记在 backend-rs/config/routes.toml:
| 方法与路径 | 用途 |
|---|---|
GET /api/v1/collaboration-templates | 返回可用模板的元数据,不返回完整配置 |
GET /api/v1/collaboration-templates/{id} | 验证权限后读取可移植配置 |
PUT /api/v1/collaboration-templates/{name} | 保存当前用户默认命名空间中的模板 |
保存请求包含 document 与 expectedRevision。创建时 revision 为 null;修改需要当前
revision 和新 spec.version,过期 revision 返回 409。相同文档重复保存返回同一 Kind。
spec.configurationRevision 由服务器维护,不进入 YAML。发现列表中的模板版本始终读取
spec.version。更新已发布模板会更新后续使用者读取的配置;已创建项目持有独立的小组配置。
可移植配置
文档格式为 agent.wecode.io/v1 的 Template,spec.resources.collaboration
包含 project、groups 和可选的 agents。小组包含角色、负责人角色、工作阶段、交付物、验收条件和执行标签。
agents 保存逻辑 key、名称、codex / claude_code 运行时、systemPrompt 与 capabilityDescription,以及可选的执行确认、工作区策略和并发上限。
角色通过 agentKey 引用定义;应用模板时自动在目标项目或空间创建智能体,再把负责人、成员及阶段负责人绑定到新 ID。
同一份定义被多角色或多个小组引用时只创建一次。负责人不能兼任执行角色。
内置模板自带全部智能体,默认展示分工摘要,无需逐个选择;“调整成员(可选)”可以改用已有成员。 从模板创建协作群或项目时,可以点击角色旁的“×”移除不需要的角色及其负责的全部工作阶段。 协作群负责人必须保留,不能移除。没有负责人角色的阶段以及其他角色负责的阶段保持不变。 调整只影响本次创建,不修改源模板;被移除角色独占的智能体不会创建,仍被其他角色引用的智能体继续创建。 缺少智能体定义的旧模板仍可手动安排成员。只把 YAML 保存进模板库不会创建项目智能体,应用到目标位置时才创建。 模型、设备、工作目录和工具沿用导入者执行环境,不携带源账号模型、插件 ID、设备或连接凭据。 创建前会检查全部所需运行时,使用所选设备为该运行时设置的唯一默认模型;缺少默认模型或所选设备的项目授权已失效时,保留确认弹窗并通过设备配置入口修复后继续,不会创建部分智能体或自动授予设备权限。 从模板新建项目时,先检查当前设备和默认模型;预检失败会保留表单,不创建空项目,可切换模板或完成配置后重试。项目创建后仍须独立检查该项目的设备授权;此后发生的持久化失败会保留已创建项目并提示检查配置,避免重复创建。 项目和小组保存、导出会读取真实智能体定义并保留提示词及可移植执行策略,使用新的逻辑引用供其他账号导入。不能表示为单个原生智能体的多机器人资源会明确拒绝导出;云端空间不能表示执行前人工确认、显式工作区策略或并发上限,应用前会提示直接导入项目,不会静默丢失这些设置。本地空间和直接项目导入保留这些策略。
project.taskAssignment 保存 enabled 和逻辑 groupKey,导入后解析为新小组 ID,
复用项目的任务创建自动处理规则。新建需求即可分配给小组,由负责人拆分和协调。
已有项目存在启用的新任务规则时,导入前提示先处理冲突,不覆盖或重复启用规则。
project.board 保存视图名称和阶段标签,导入时追加标签视图并设为默认,保留原视图及业务标签。
负责人按实际进展更新阶段标签,最终提交人工验收;配置阶段列本身不会自动推进需求。
项目保存和导出会带上这些配置,使用逻辑小组引用,不携带原项目的小组 ID。
YAML 导入采用白名单,拒绝未知字段、重复键、别名、错误引用以及超过 1 MB 的配置。 导出从当前项目或小组配置生成,不导出账号身份、任务、评论、执行历史或连接凭据。 入口位于项目设置的“配置共享”和小组管理,不位于任务看板。
向已有项目导入默认追加小组,不覆盖已有小组或任务。名称冲突需要重命名。 若创建部分智能体或小组后失败,会提示检查已添加的配置并阻止直接重复应用,防止重复创建。
本地可用性
shared/data/collaboration-templates.json 是内置模板的源数据。
运行 pnpm --filter @wegent/collaboration exec node ../../scripts/generate-collaboration-templates.mjs
生成后端初始化 YAML。内置模板在首次启动且没有后端连接时即可使用。
下载配置与个人草稿缓存在设备上,缓存按后端、账号隔离。本地未登录身份与云端账号使用 不同作用域;切换账号不会自动转移草稿。已知账号断网时保存的草稿会在同账号连接恢复后 尝试私有同步;冲突保留草稿并显示状态,不自动覆盖源模板或公开发布。
验证
已有项目导入的用户故事:作为已配置项目执行设备的用户,我希望直接选择该设备应用模板; 设备暂不可用时,我希望完成配置后继续当前导入,无需重填小组名称和角色。
| 前置状态 | 操作 | 预期结果 | 覆盖 |
|---|---|---|---|
| 项目只有一台在线已授权 APP 设备 | 打开模板、修改小组名称、刷新、应用、重载项目 | 自动选中项目设备;名称保留;六个智能体绑定该设备;小组持久化 | issue-dispatch-executor.spec.ts 的 authorized 模板用例 |
| 项目尚无已授权设备 | 修改名称、打开设备配置新标签页、添加并初始化设备、返回刷新并应用 | 原确认弹窗和名称保留;刷新后选中设备并成功创建智能体、小组 | 同一套件的 configure 模板用例 |
| 项目有多台在线设备 | 在弹窗选择其中一台并应用 | 使用本次选择;不修改账号默认设备;不展示不可用或离线设备 | ProjectTemplateApplyDialog.test.tsx、templateAgentRouting.test.ts |
| 设备加载失败或提交前授权被撤销 | 刷新恢复或重新选择设备 | 保留输入;提交重新校验;失效设备不创建智能体 | 同上 |
两个真实设备用例复用现有 Executor CI 项目和真实 Backend、设备、存储,不模拟 Wegent 内部接口。
共享包包含配置校验、YAML 往返、缓存隔离、版本更新和部分失败测试。后端覆盖旧模板隔离及
资源库引用安装。collaboration-templates 桌面 checkpoint 覆盖真实 Rust/Python/MySQL
接口、权限、版本冲突、桌面创建、保存发布、项目追加导入和重载持久化;
frontend/e2e/tests/collaboration/templates.spec.ts 覆盖能力商店与 YAML 导入。
frontend/e2e/tests/collaboration/template-use.spec.ts 使用隔离账号验证从能力商店应用到已有项目、
从模板新建项目、阶段及自动处理规则持久化,以及缺少默认设备时零项目创建。
正向用例直接使用内置产品全流程模板,用户明确选择人工负责人及执行成员,校验六阶段绑定,不依赖真实模型;共享组件与 Web 路由测试另覆盖
智能体创建、默认模型解析、显式设备授权、失效权限与失败重试。
collaboration-template-lifecycle checkpoint 以本需求验证模板导入、自动分派、六阶段委派、
阶段标签看板和人工验收,执行真实桌面、Executor、MCP、存储和 shell,只有模型服务使用固定响应。
上述覆盖均接入既有 CI 运行器。证据截图保存在测试产物中,不提交仓库。
collaboration-template-agents checkpoint 覆盖跨账号应用、提示词保留、角色与阶段绑定、保存复用,以及缺少默认模型时零项目创建和切换模板后的恢复;共享测试另覆盖设备预检及部分失败恢复。Executor 测试直接验证首轮及重启后实际执行请求中的负责人提示词和管理约束。
角色裁剪用户故事与用例
作为使用协作模板创建协作群的用户,我希望去掉不需要的角色及其阶段,同时保留负责人,以便创建适合当前工作的分工。
| 前置条件 | 操作 | 预期结果 | 自动覆盖 |
|---|---|---|---|
| 内置模板已选中 | 移除一个执行角色 | 角色及其全部阶段消失;其他阶段和源模板保持原样 | TemplateBindings.test.tsx |
| 旧模板存在未绑定角色 | 移除该角色 | 不再因这个角色未绑定而阻止创建 | TemplateBindings.test.tsx |
| 正在保存或配置已禁用 | 点击移除按钮 | 角色和阶段不变 | TemplateBindings.test.tsx |
| 模板包含负责人和执行角色 | 移除全部执行角色并创建项目 | 负责人移除按钮禁用;持久化小组只有负责人;不创建已移除角色的智能体或阶段 | collaboration-template-agents |
| 从模板新建项目 | 移除角色 | 创建输入中的模板和小组草稿均使用裁剪后的角色及阶段 | TemplateBindings.test.tsx |
| 已移除角色后重新选择模板 | 重新选择原模板或同名同版本的另一份模板 | 重置本次角色配置,不沿用上一份模板的移除状态 | TemplateBindings.test.tsx、collaboration-template-agents |
桌面用例复用 checkpoint 的隔离账号、本地项目、真实 Electron、Executor 与存储,只有模型服务使用固定响应。
运行 pnpm --filter wework e2e:desktop --segment collaboration-template-agents;用例沿用共享运行器清理隔离环境。