6.5 KiB
6.5 KiB
Skill multi 迁移:技术方案(as-implemented)与 Roadmap
本文是 multi 迁移的当前事实源,记录 PR #922 在 2026-08-11 的最终实现。 原始设计过程见 skill-multi-migration-plan.md, 分发机制调研见 skill-distribution-mechanism.md。两份文档是历史 输入;发生冲突时以本文和代码为准。
状态速览
| 项 | 内容 |
|---|---|
| 当前阶段 | 默认 multi、安全迁移、官方 Skill 全量覆盖升级已落地;独立 dws skill mode lifecycle 命令不建设 |
| 硬 deadline | 2026-08-30:安装/升级默认 multi;mono 仅 opt-in;物理下线在独立 retirement 版本推进 |
| 已完成 | 五面默认 multi、互斥清理、删除前备份、setup 确认/--dry-run、官方清单全量覆盖升级 |
| 下一步 | beta/L1 观察、可选 agent-home 清单门禁、mono retirement |
| 终态 | multi 为唯一默认布局;每次升级全量覆盖预制 Skill,不持久化本地删除选择 |
1. 最终语义
1.1 安装和模式切换
- 新装默认 multi;
DWS_SKILL_MODE=mono、--skill-mode mono或dws skill setup --mode mono为 legacy opt-in。 - 不新增
dws skill mode status|set|rollback产品面。需要切换时重新执行dws skill setup --mode <mono|multi>。 - setup 的
--dry-run和交互确认消费同一份精确计划。非交互环境必须显式--yes,公开可复制示例不携带确认绕过参数。 - 对面布局、过期 Skill 和同名目标在替换前都移入
~/.dws/skill-backups/<时间戳>/;备份失败时保留原目录并跳过整个 Agent 目标,避免 mono/multi 混装。
1.2 升级布局与 Skill 集合
LocateSkillsRoot优先返回 release zip 内的multi/。包中存在 multi 树时, 存量 mono 布局会迁移为 multi;仅 legacy mono-only 包走 mono 回退路径。- 布局和 Skill 集合都由当前升级包驱动,不写 mode sticky 状态,也不根据本地 目录缺失推断排除意图。每次 upgrade 都安装并覆盖本版官方全量集合。
- 因此,本地删除或通过 setup 临时排除的预制 Skill 会在下一次 upgrade 恢复,
新版新增官方 Skill 也会自动加入;
--force主要用于重装当前 CLI 版本。 dingtalk-shared随官方全量集合始终安装。
1.3 状态与缓存
- multi setup/upgrade 成功后写入信息快照
~/.dws/skills-state.json;设置DWS_CONFIG_DIR时写到该目录下的skills-state.json。 - 状态记录当前版本官方清单、本次更新集合和更新时间,不参与安装集合求解, 也不决定 mono/multi 布局。
~/.dws/skills/{mono,multi}是 setup 的本地回退源。所有渠道先在缓存同级 staging 目录完成复制,再通过 rename 发布;复制或发布失败时保留/恢复旧缓存。
2. 分发入口
以下入口默认 multi,并保持相同的布局互斥与失败保护:
| 入口 | 默认/opt-in | 缓存与备份 |
|---|---|---|
dws skill setup |
默认 multi;--mode mono opt-in |
embed 为主源;确认后备份替换 |
scripts/install.sh |
默认 multi;DWS_SKILL_MODE=mono |
双缓存原子刷新;目录替换前备份 |
scripts/install.ps1 |
同上 | 同上 |
scripts/install-skills.sh |
默认 multi;环境变量 opt-in | DWS_CACHE_ROOT 下双缓存原子刷新 |
npm install.js |
默认 multi;环境变量或 --skill-mode opt-in |
~/.dws/skills 双缓存原子刷新 |
Homebrew 不直接铺 Agent home,安装后由 dws skill setup 完成布局安装。
3. 已验证的安全边界
- 空或损坏的 multi bundle 不进入 multi 安装分支,也不会覆盖有效缓存。
- 备份失败不复制新布局;扫描或 HOME 解析失败会让相应目标失败。
- setup 拒绝确认时零文件操作;显式确认只处理预览中列出的路径。
- Go、npm、Shell、PowerShell 的缓存复制失败均保留旧缓存。
- 多 Agent 目标彼此独立;一个目标失败不阻止其他目标尝试。upgrade 仅在无失败 且至少一个目标成功时更新状态;setup 在至少一个目标安装成功后记录本次快照。
4. 决策记录
- D1:布局包驱动,集合状态驱动。 state 不做 mode sticky;它保存官方清单 快照以区分“用户删除的旧 Skill”和“新版本新增 Skill”。
- D2:无服务端灰度。 使用 beta 轨、issue 和主动回访观察;不实现
rollout.json或x-dws-skill-mode。 - D3:不采用
npx skills add作为主分发通道。 DWS 继续维护 zip、embed 和平台安装器,确保版本绑定、无 Node 环境和国内下载链路可用。 - D4:不新增 mode lifecycle 命令。 setup 保留双向重装能力;删除前备份是 安全机制,不等于提供自动 rollback 产品。
- D5:mono retirement 独立推进。 当前版本仍保留 mono 源和 opt-in 入口。
5. Roadmap
已完成
- 默认 multi 和五面安装入口对齐。
- mono/multi 互斥、过期目录与同名目录删除前备份。
- setup 精确计划、
--dry-run、非交互确认门禁。 - 官方清单信息快照与普通/
--force全量覆盖升级语义。 - 缓存 staged publish 与旧缓存恢复。
后续可选
- 收敛各语言的 Agent home 清单并增加 policy 门禁。
- 增加显式的备份查看/恢复 UX;当前恢复副本已存在,但没有自动 rollback 命令。
- 满足观察期、mono opt-in 率和内容策略门禁后,单独删除 mono 产物与入口。
6. mono 下线判据
- 连续两周无 multi 相关 P1;
- mono 主动 opt-in 已降到可接受范围;
- multi 内容与 mono 能力完全对等;
- policy 不再依赖
skills/mono/SKILL.md; - 存量
<agent>/dws可通过常规 upgrade 安全迁移,并留有恢复副本。
7. 风险与缓解
| 风险 | 缓解 |
|---|---|
| 多目标复制中断 | 旧目录保存在 skill-backups,目标报告失败;后续可补自动 rollback UX |
| mono/multi 漂移 | 安装互斥清理;备份失败时不铺相反布局;upgrade 有 multi 包时迁移布局 |
| 预制 Skill 被用户删除或修改 | 下一次 upgrade 从官方 bundle 全量恢复并覆盖 |
| 状态文件损坏 | 明确回退全量并重写有效状态,不从目录猜测 CLI 参数意图 |
| 缓存复制失败 | 同级 staging 完整复制后发布;失败保留或恢复旧缓存 |
| 无服务端灰度 | beta 轨先行、issue/回访观察、必要时撤回 release 并引导重装 mono |