Skip to content

fix(installer): plan skills per discovery directory and add --migrate - #17

Closed
3metaJun wants to merge 1 commit into
mainfrom
fix/shared-skill-discovery
Closed

3metaJun wants to merge 1 commit into
mainfrom
fix/shared-skill-discovery

Conversation

@3metaJun

Copy link
Copy Markdown
Owner

Fixes #16

问题

mstack 0.4.0 为四个 Harness 各自复制一份 skills,但 pi 还会发现 ~/.agents/skills,OpenCode 还会发现 ~/.agents/skills 和 ~/.claude/skills。结果是同一 skill 被重复发现:pi 按先加载保留专用目录的旧副本(只更新共享目录不生效),OpenCode 对同名项记录 warning 且后加载项覆盖前者。

方案

按 issue 的期望,安装器现在根据各 Harness 的实际发现规则规划安装:

  • 每条发现目录一份副本:Codex、OpenCode、pi 共享 ~/.agents/skills(三者都发现它),Claude Code 保留 ~/.claude/skills。profiles/harnesses.json 为每个 Harness 增加了 skills.install(安装目标)、skills.discovers(发现目录)和 skills.legacy(0.4.0 旧目录,用于迁移)元数据;目标解析抽取到新的 scripts/harness-targets.mjs,与 smoke-harnesses.mjs 共用。
  • OpenCode 残留的共享/Claude 交叉:OpenCode 同时扫描 ~/.agents/skills 和 ~/.claude/skills,而 Codex 和 Claude Code 各自需要这两个目录,因此该交叉无法靠改变安装目标消除。安装器保证两份副本每次安装都同步刷新(除 Claude frontmatter 适配外内容一致),--dry-run 输出注明 OpenCode 会报告同名重复;需要彻底隔离时可用 HARNESS_SKILLS_OPENCODE_DIR 指定仅 OpenCode 发现的目录。
  • 计划去重:多个 Harness 解析到同一目标且 adapter 相同时合并为一份;adapter 不同(如把 claude 目录别名到 codex 目录后安装 show-me-your-work)则报错,要求配置不同目录。
  • artifacts 不合并:拆分 artifact 基准与 skills 目标,OpenCode/pi 的 artifacts 仍落在各自 config 根目录,行为与 0.4.0 一致;Claude frontmatter 适配保留。
  • 迁移:新增 --migrate,安装后扫描 opencode/pi 的旧 config 目录,仅删除与当前 mstack 源逐字节一致的副本(备份到旧目录的 .harness-skills-backups/),保留用户修改的副本与无关 skills 并逐条报告。--dry-run 可预览;未加 --migrate 时若检测到旧副本会输出 hint。
  • 输出与文档:安装目标按共享关系分组显示(codex, opencode, pi: ~/.agents/skills (shared));README 与 docs/harness-adapters.md 记录发现模型、OpenCode 交叉说明与迁移动作;CHANGELOG 增加 Unreleased 条目。

验证

  • npm test 全绿(170 项,169 通过,1 项 Unix-only 跳过);npm run check-package 通过。
  • 新增测试覆盖:默认共享布局(~/.config/opencode/skills、~/.pi/agent/skills 不再创建)、共享目录分组输出、adapter 一致时的别名去重、dry-run 的 note/hint/migrate 计划、真实迁移(匹配副本删除并备份、修改副本与无关 skill 保留)。
  • 端到端手动验证:用环境变量模拟 0.4.0 四目录布局 → --harness all --replace --migrate 迁移到共享布局(旧目录仅剩备份)→ 重复运行(无 --replace 报冲突、有则替换)→ 单 Harness 更新只刷新共享目录且对三个 Harness 生效。

OpenCode also discovers ~/.agents/skills and ~/.claude/skills, and pi also
discovers ~/.agents/skills, so installing one copy per harness made those
harnesses report duplicate definitions and keep serving stale dedicated
copies after a shared-directory update.

- Install Codex, OpenCode, and pi skills into the shared ~/.agents/skills
  directory; Claude Code keeps ~/.claude/skills. Deduplicate skill plan
  entries that resolve to one directory with identical adapters and reject
  aliased targets whose adapters differ.
- Keep artifacts in their harness-specific destinations by separating the
  artifact base from the shared skills target.
- Add --migrate to remove legacy 0.4.0 copies from the opencode and pi
  config directories after installing. Only copies matching the current
  source byte for byte are removed; modified copies and unrelated skills
  are kept and reported, with backups beside the legacy copy. Dry-run
  previews removals and hints at leftover legacy copies.
- Group shared targets in installer output, note OpenCode's residual scan
  of ~/.claude/skills, and document the discovery model.

Fixes #16
@3metaJun

Copy link
Copy Markdown
Owner Author

已由 #18 合并解决。吸收了本 PR 中 installer 与 smoke 共用路径解析的改进;保留 #18 的 Claude 目录名适配、目录外备份、历史副本识别和事务回滚。感谢这个方案补齐了 smoke 检查的遗漏。

@3metaJun 3metaJun closed this Sep 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(installer): 避免共享技能目录导致重复发现和旧副本覆盖

1 participant