完善 DirectProject 客户端扩展导入方案

新增客户端 Skill 与 MCP 扩展导入技术方案。

记录独立扩展拆分、统一原生命名、默认启用和 Plugin 边界。

同步文档总览、文档地图和长期决策记录。
This commit is contained in:
2026-08-31 09:40:09 +00:00
parent 80b8238d0a
commit 8bae66108a
4 changed files with 493 additions and 6 deletions
+1
View File
@@ -20,6 +20,7 @@
## AI 游戏创作与 Agent Runtime
- [AI 游戏创作智能体 App 实施计划](./technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md):当前 DirectProject、受控语义工具、UI workflow、资源和运行时合同。
- [DirectProject 客户端 Skill 与 MCP 扩展导入方案](./technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md):客户端扩展导入、按独立 Skill/MCP 拆分、命名、启用和启动时注入边界。
- [项目开发工作台 PRD](./prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md):当前工作台页面和验收边界。
- [立项策划 AgentFast GDD](<./technical/【技术方案】立项策划AgentFast GDD-2026-08-10.md>):当前策划入口、审批和恢复合同。
- [GameAgent 资源自由画板与快速编辑](./technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md)
@@ -15,6 +15,17 @@
- 关联文档:相关 PRD、技术文档、提交或 Issue
```
## 2026-08-31 DirectProject 客户端扩展按独立 Skill/MCP 导入
- 背景:DirectProject 需要使用用户在 AGC 客户端导入的市面原生 Skill、MCP 和 Plugin 内容,但第三方内容不应直接安装到运行时 Codex,也不应要求用户转换为 AGC 自定义格式。
- 决策:客户端提供一个全局“扩展”入口,统一接受文件、目录、zip 和标准 Plugin;目录、zip、Plugin 只是导入来源,发现出的每个 Skill 和每个 MCP Server 分别成为独立扩展项,分别列表、重命名、启用、禁用和删除。已识别项导入后默认启用,下次 DirectProject Codex 启动时按原生 Skill root 和 MCP 配置注入。
- 命名:客户端列表名称与 Codex 运行时名称使用同一个原生标识,不维护 display/runtime 两套名称;重复或同名项保留为新的独立项并自动追加 `-2``-3`。Skill 重命名只修改客户端运行时副本中的有效名称,原始导入内容不修改。
- Plugin 边界:Plugin 只作为导入容器提取 Skill/MCP;当前 DirectProject 关闭的 hooks、apps、remote plugin 和完整 Plugin Runtime 不接入。单个可执行文件或脚本不提供手动指定为 MCP 入口的功能。
- 信任边界:不审核第三方 Skill 文案、脚本、二进制、MCP tool 或网络行为;导入阶段不执行内容。客户端只做标准结构识别、必要配置解析和 zip staging 路径边界处理,且不向第三方扩展注入 AGC 凭据或内部路径。
- 影响范围:AGC 客户端扩展设置 UI、客户端本地扩展存储、DirectProject Codex app-server 启动准备和 pool fingerprint;不新增 HTTP 服务、SpacetimeDB schema、公开 API 或独立 Plugin Runtime。
- 验证方式:分三阶段验收:先验证导入拆分和完整列表,再验证 Skill 运行时发现和重命名,最后验证 MCP 配置合并、Plugin 提取和失败隔离;只增加对应的定向测试、`npm run check:encoding``git diff --check`
- 关联文档:`docs/technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md``apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx``apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server.rs`
## 2026-08-30 批准 GDD 直接进入做游戏链路
- 背景:立项策划 GDD 批准后需要给用户一个进入做游戏的自然出口,产品决策改为点击按钮后直接开始建造。
@@ -1,6 +1,6 @@
# 文档地图与阅读索引
更新时间:`2026-08-25`
更新时间:`2026-08-31`
## 阅读顺序
@@ -22,11 +22,12 @@
AI 游戏创作 / DirectProject / UI workflow
1. `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md`
2. `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`
3. `docs/technical/【技术方案】立项策划AgentFast GDD-2026-08-10.md`
4. `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md`
5. `docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md`
6. UI 编辑器、宿主壳和当前测试专题文档
2. `docs/technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md`
3. `docs/prd/【AI游戏创作】项目开发工作台PRD-2026-07-20.md`
4. `docs/technical/【技术方案】立项策划AgentFast GDD-2026-08-10.md`
5. `docs/technical/【技术方案】GameAgent资源自由画板与快速编辑-2026-08-20.md`
6. `docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md`
7. UI 编辑器、宿主壳和当前测试专题文档
图片画布 / 媒体生成:
@@ -0,0 +1,474 @@
# DirectProject 客户端 Skill 与 MCP 扩展导入方案
更新时间:`2026-08-31`
## 1. 文档定位
本方案是 DirectProject 客户端第三方 Skill、MCP 和 Plugin 导入能力的当前实现依据。它描述客户端侧的导入、拆分、命名、启用和 DirectProject 启动注入边界,不改变 AGC 内置 Skill Pack、`agc_tools` MCP、项目文件工具和现有 Runtime 权威。
本方案只覆盖客户端安装和下一次 Codex 启动时接入。第三方扩展不是安装到全局运行时 Codex,也不要求用户把市面上的扩展重新打包为 AGC 自定义格式。
## 2. 一句话交付结果
客户端提供一个全局“扩展”入口,直接接受文件、目录、zip 和标准 Plugin;导入后把其中发现的每个 Skill 和每个 MCP Server 拆成独立扩展项,用户可以分别重命名、启用、禁用和删除;DirectProject 启动 Codex 时只注入已启用的独立项。
## 3. 已确定的产品边界
### 3.1 客户端安装、运行时注入
- 扩展内容保存在 AGC 客户端的扩展仓库。
- 不把扩展永久安装到用户的全局 `CODEX_HOME`
- DirectProject 创建或复用 app-server 时,读取客户端当前已启用的扩展并生成本次运行的临时 Skill root 与 MCP 配置。
- 导入、启用、禁用和重命名不热更新正在运行的 Codex;变更从下一次 DirectProject 启动生效。
- 扩展默认对客户端内所有 DirectProject 生效,不做项目级启用映射。
### 3.2 用户信任和最小处理
用户自行负责第三方扩展的信任判断。客户端不审核 Skill 文案、脚本、二进制、MCP tool description、网络域名或扩展行为。
客户端只做导入流程正常运行所需的最小结构处理:
- 识别标准 Skill、MCP 和 Plugin 结构;
- 读取必要的 TOML/JSON 配置;
- 生成运行时名称和临时配置;
- 解压时防止路径穿越到 staging 目录外。
导入阶段不执行脚本、不启动 MCP、不调用第三方网络服务。
即使不审核第三方行为,也不得向第三方扩展注入 AGC provider key、Codex 登录态、Cookie、bridge token、内部服务令牌或客户端内部路径。
### 3.3 明确不支持
- 单个 `.exe``.py``.js` 或其它可执行文件/脚本由用户手动指定为 MCP 入口;
- 根据 README 或文件后缀猜测如何启动普通程序;
- 完整 Codex Plugin Runtime
- Plugin hooks、apps、remote plugin 和依赖这些能力的运行时行为;
- 自定义扩展 manifest、审核清单或自定义安装包格式;
- Skill/MCP 行为安全扫描、脚本沙箱和网络白名单;
- 项目级扩展配置;
- 热更新、后台扩展服务、在线市场、版本历史、回滚和自动升级。
## 4. 导入与拆分模型
目录、zip 和 Plugin 是“导入来源”,不是管理对象。一个来源中识别出的每个 Skill 和每个 MCP Server 都独立成为客户端扩展项。
```text
导入来源
保存原始内容
发现标准结构
拆成独立 Skill/MCP 扩展项
分别列表显示、命名、启用和删除
```
### 4.1 Skill 发现
以下内容分别导入为独立 Skill
- 根目录的 `SKILL.md`
- 标准 Skill root 中的每个 `*/SKILL.md`
- Plugin 中包含的标准 Skill 目录。
例如:
```text
my-package/
└── skills/
├── art-skill/SKILL.md
└── code-skill/SKILL.md
```
导入结果是两个独立项:
```text
art-skill
code-skill
```
### 4.2 MCP 发现
以下配置中的每个 Server 分别导入为独立 MCP 项:
- Codex 原生 `config.toml``[mcp_servers.<name>]`
- 兼容的 `.mcp.json` 顶层 `mcpServers.<name>`
- 标准 Plugin 中能够解析出的 MCP 配置。
例如一个配置包含:
```toml
[mcp_servers.search]
command = "..."
[mcp_servers.filesystem]
command = "..."
```
导入结果是两个独立项:
```text
search
filesystem
```
`.mcp.json` 只作为兼容输入读取,不作为新的 AGC 配置格式;只支持能直接转换为 MCP Server 连接描述的字段,不为各客户端的私有扩展建立独立系统。
### 4.3 Plugin 处理
存在 `.codex-plugin/plugin.json` 时,将目录或 zip 识别为标准 Plugin 导入来源。
本期只提取其中可识别的 Skill 和 MCP,并分别创建独立扩展项:
```text
Plugin
├── Skill A → 独立 Skill 项
├── Skill B → 独立 Skill 项
└── MCP C → 独立 MCP 项
```
Plugin 自身不生成父级列表项,也不提供 Plugin 级开关。hooks、apps、remote plugin 以及依赖完整 Plugin Runtime 的内容忽略;如果没有任何可支持的 Skill/MCP,则来源保留为未知内容。
### 4.4 未知输入
- 单个无关文件或二进制:保存为一个 `unknown` 项,不执行。
- 完全无法发现标准内容的目录或 zip:保存一个 `unknown` 项。
- 含有已识别 Skill/MCP 的来源中其它普通文件:不把每个普通文件都变成独立项,但保留原始来源用于溯源。
未知项可以展示和删除,但没有有效的启动入口。
## 5. 命名规则
### 5.1 一个名称同时用于 UI 和 Codex
每个独立 Skill/MCP 项使用一个有效名称:
```text
name 当前名称,前端和 Codex 运行时使用
original_name 原始名称,用于溯源,不随用户改名变化
```
不维护 `display_name``runtime_name` 两套可见名称。
用户把 Skill 从 `art-skill` 改为 `pixel-art-skill` 后:
- 前端列表显示 `pixel-art-skill`
- Codex 的 Skill 列表也使用 `pixel-art-skill`
- 客户端只在运行时副本中修改 Skill 的有效名称;
- 原始 `SKILL.md` 不修改。
MCP 重命名同理:客户端列表名称和运行时生成配置中的 Server key 使用同一个名称,原始 TOML/JSON 不修改。
### 5.2 自动重命名
每次重复导入都保留为新的独立项,不覆盖旧项、不去重。
名称冲突统一使用原生标识形式追加后缀:
```text
art-skill
art-skill-2
art-skill-3
```
不使用 `art-skill (2)` 这一类仅适用于 UI 的第二套名称。
同一类型内名称需要唯一:
- Skill 与 Skill 之间避免重复;
- MCP 与 MCP 之间避免重复;
- Skill 和 MCP 可以同名,因为属于不同的运行时命名空间。
如果名称相同但内容不同,视为名称冲突;如果内容指纹相同,视为重复导入。两种情况都保留新项并使用同一套后缀分配逻辑。
提示合并为一次普通通知,例如:
```text
检测到重复或同名扩展,已自动命名为“art-skill-2”。
```
内容指纹只用于识别重复导入,不用于安全审核。
### 5.3 手动重命名
前端允许用户直接编辑独立扩展项的 `name`
- 名称不能为空;
- 使用对应 Skill/MCP 的原生标识格式;
- 保存时检查同类型名称冲突;
- 冲突时自动分配 `-2``-3` 后缀并提示用户。
Skill 的手动重命名必须反映到 Codex 运行时名称。客户端保留原始内容,在临时运行副本中修改标准名称字段,不修改用户导入的源文件。
目录或 Plugin 中的多个 Skill 已经在导入时拆成独立项,因此用户可以分别重命名每个 Skill,不存在“重命名整个多 Skill 包”的操作。
## 6. 客户端存储
扩展仓库使用客户端本地存储和内部元数据,不对用户要求任何自定义包结构。
```text
ImportedSource
├── id
├── original_name
├── storage_path
└── fingerprint
ExtensionItem
├── id
├── source_id
├── type: skill | mcp | unknown
├── name
├── original_name
├── source_relative_path
├── enabled
├── fingerprint
└── last_error
```
`source_id` 只用于来源溯源和清理,不形成可操作的父级扩展项,也不产生父子级联启用状态。
对于目录或 zip
- 原始来源保存一次;
- 每个发现的 Skill/MCP 保存独立元数据;
- 删除某个子项不影响其它子项;
- 原始来源不因删除一个子项而立即删除。
重复导入同一来源时创建新的来源和新的子项,名称按规则追加后缀。
## 7. 前端设计
### 7.1 入口
复用现有 [RuntimeConfigDialog.tsx](../../apps/ai-game-creator-shell/src/features/runtime-config/RuntimeConfigDialog.tsx) 的设置弹窗,在设置导航中增加“扩展”分区。
不在项目聊天区新增入口,不按项目创建扩展页面。
### 7.2 页面
页面只包含:
- “导入扩展”按钮;
- 独立扩展项列表;
- 每项的名称、类型、来源摘要和当前状态;
- 启用/禁用开关;
- 重命名操作;
- 删除操作;
- 必要时的一行启动错误。
一个目录、zip 或 Plugin 中的多个内容直接平铺显示,不显示父级包和父级开关:
```text
art-skill
Skill · 来自 my-plugin.zip 已启用
code-skill
Skill · 来自 my-plugin.zip 已禁用
search
MCP · 来自 my-plugin.zip 启动失败
```
完整列表包括:
- 已启用;
- 已禁用;
- 未识别;
- 当前不可用;
- 启动失败。
“完整列表”指所有用户导入的独立扩展项,不指 zip 内每个普通文件或每个 MCP tool。
### 7.3 导入后的默认状态
已识别的 Skill/MCP 导入后默认启用,下一次 DirectProject 启动时加载。
未识别内容保留在列表中,但没有有效启动能力。
导入和状态变化不需要和 Agent 模型配置共用“保存”按钮,扩展操作可以单项即时保存。
## 8. DirectProject 运行时接入
### 8.1 Skill
启动准备阶段:
```text
读取 enabled=true 的 Skill 项
创建本次运行的临时 Skill root
为重命名 Skill 生成运行时副本
调用 skills/extraRoots/set
调用 skills/list 复核
```
每个独立 Skill 的启用状态单独生效。Skill 内容中的脚本、二进制和引用资源不做行为扫描。
### 8.2 MCP
启动准备阶段:
```text
读取 enabled=true 的 MCP 项
为每个项生成 mcp_servers 配置
处理同类型 Server key 冲突
与 AGC 内置 agc_tools 合并
启动 Codex
```
每个 MCP Server 独立启用和禁用。相对路径按来源目录解析,原始 command、args、cwd、env 或 URL 按原生配置保留。
`agc_tools` 为 AGC 内部保留名称,第三方扩展不得覆盖。第三方 MCP 的工具调用继续继承 DirectProject 当前既有运行策略;本功能不新增逐工具审核系统。
### 8.3 失败处理
第三方扩展的解析或启动失败时:
- 记录对应独立项的 `last_error`
- 列表显示“启动失败”或“当前不可用”;
- 尽量跳过失败项,保留 AGC 内置 Skill 和 `agc_tools`
- 不自动重试、不启动后台修复服务、不删除原始内容。
扩展集合的 fingerprint 纳入现有 DirectProject app-server pool key,扩展集合变化后不复用不匹配的旧运行实例。
## 9. 客户端接口
Skill 和 MCP 共用客户端扩展接口:
```text
list_client_extensions()
import_client_extension(path)
set_client_extension_enabled(id, enabled)
rename_client_extension(id, name)
remove_client_extension(id)
```
不新增按类型分开的安装接口。导入接口返回拆分后的多个独立项:
```text
{
imported: [
{ id, type: "skill", name: "art-skill" },
{ id, type: "skill", name: "code-skill" },
{ id, type: "mcp", name: "search" }
],
unknown: false
}
```
前端不直接处理 Skill root 路径、MCP command 或 zip staging 路径;这些属于客户端后端和 DirectProject 启动适配层。
## 10. 分阶段实施与验收
不采用一次性大改动。按垂直闭环分三阶段,每阶段完成后验收再进入下一阶段。
### 阶段 0:冻结契约和样例
确认:
- 导入来源与独立扩展项的关系;
- 名称统一使用原生标识;
- 重复导入自动追加后缀;
- 已识别内容默认启用;
- Plugin 只作为导入容器;
- 单个可执行文件/脚本不作为 MCP 入口;
- 客户端全局生效。
准备最小样例并确认每个样例的预期拆分结果。
### 阶段 1:客户端导入和列表
完成:
- 客户端存储;
- 文件、目录、zip 导入;
- Skill/MCP/Plugin 结构发现;
- 多内容拆分为独立项;
- 未知项保留;
- 默认启用;
- 原生名称自动追加后缀;
- 手动重命名;
- 独立启用、禁用、删除;
- 设置弹窗中的完整列表。
验收:
- 一个来源包含多个 Skill/MCP 时,列表出现多个独立项;
- 相同来源重复导入时不覆盖旧项;
- 同名和重复内容均自动使用 `-2``-3`
- 单个二进制不会被启动;
- 原始来源内容未被改写。
### 阶段 2Skill 运行时闭环
完成:
- 读取客户端已启用 Skill
- 临时 Skill root 生成;
- Skill 重命名同步到运行时副本;
- `skills/extraRoots/set``skills/list` 接入;
- 扩展 fingerprint 纳入 app-server pool key。
验收:
- 多个 Skill 可以独立发现;
- 重命名后的 Skill 在 `skills/list` 中使用新名称;
- 单独禁用一个 Skill 不影响其它 Skill
- 当前 Codex 不热更新;
- AGC 内置 Skill 不受影响。
### 阶段 3MCP 和 Plugin 部分闭环
完成:
- `config.toml` 每个 Server 独立导入;
- `.mcp.json` 每个 Server 独立导入;
- Plugin 中 Skill/MCP 独立导入;
- MCP Server 重名自动追加原生后缀;
- MCP 运行时配置合并;
- 单项错误记录和内置能力保留。
验收:
- 一个 MCP 配置包含多个 Server 时,列表出现多个独立项;
- 每个 MCP 可以单独启用、禁用和重命名;
- 重名 Server 能生成稳定的唯一 key
- Plugin 不会开启 hooks、apps 或完整 Plugin Runtime
- 单个可执行文件/脚本仍不会自动作为 MCP 入口。
## 11. 最小验证范围
只增加和本功能直接相关的定向验证:
- 多 Skill/MCP 来源拆分;
- 原生名称自动重命名和手动重命名;
- 重复导入保留多个独立项;
- Skill 运行时名称复核;
- MCP Server key 冲突;
- 未知文件不执行;
- zip 解压路径边界。
不新增完整第三方扩展行为测试、安全扫描框架、在线测试服务或大规模 E2E 基础设施。
## 12. 非目标和后续议题
以下内容不属于本方案的交付判据:
- 完整 Codex Plugin Runtime
- Plugin hooks/apps/remote plugin
- 单文件 MCP 入口配置;
- 项目级扩展开关;
- MCP 工具逐项权限管理;
- OAuth/密钥管理中心;
- 在线市场和自动更新;
- 第三方扩展安全评级和行为沙箱。
后续如果要支持这些能力,必须另立技术方案,不在本方案中预留复杂抽象或隐藏开关。