Skip to content

支持 GitHub Skill 原位更新与备份恢复 - #3057

Open
130040167 wants to merge 14 commits into
BigPizzaV3:mainfrom
130040167:codex/skill-update-backup-review
Open

130040167 wants to merge 14 commits into
BigPizzaV3:mainfrom
130040167:codex/skill-update-backup-review

Conversation

@130040167

@130040167 130040167 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

问题

关联 GitHub 来源后,本地 Skill 需要在原安装位置更新,并保留用户修改和可恢复的备份。不同 Agent 的独立安装不能被误当作受控副本覆盖。

修改

  • 来源关联与更新接管分开;确认后才在原目录更新,并重新检查仓库版本、目录身份及文件内容。
  • 只同步已确认由管理器维护的副本;独立安装和被修改的副本保留原状。
  • 更新和恢复保留原位置及备份组;写入失败时回滚。已丢失的外部备份可清除记录,同组剩余备份不会误报可恢复。
  • 关闭或重新检查更新预览时释放仓库压缩包;失败时清理本次创建且身份未变的暂存目录。
  • 备份抽屉按需在后台统计数量和文件大小,显示不完整结果及错误。

依赖与拆分

共享 Skill 发现与启停 #3045 已合入。本 PR 依赖来源关联 #3056,建议在 #3056 之后合入。

上游目前没有中间基准分支,#3056 合入前本 PR 的文件列表包含其内容。仅查看相对 #3056 的更新和备份差异。

重复副本归档及文件修改时间已拆至独立 PR #3079;本项保留旧归档记录的恢复兼容。本 PR 不包含针对特定 Skill 的专门处理。

验证

  • Windows 隔离环境的 Skill 核心并行回归:248 通过、5 项按环境忽略;生命周期回归:10 通过。
  • 相关前端测试 32 项、TypeScript 检查、Vite 构建通过。
  • Windows release 构建通过。后台隔离管理页在业务断言前等待 WebView 调试端口超时,原生管理页验收未完成。
  • 三平台 CI 的最新结果以检查页面为准。

@130040167
130040167 marked this pull request as ready for review November 11, 2026 20:58
@BigPizzaV3

BigPizzaV3 commented Nov 12, 2026 •

Copy link
Copy Markdown
Owner

感谢!本 PR 基于 #3056,合并无冲突,相对 #3056 的增量是 13 个文件,+4238/-115。原位更新的核心路径做得很扎实:不覆盖已有目标的 rename、前后路径身份核验、发布或保存失败时回滚、拒绝链接和 junction、.git 冲突检测,串行跑 Skill 核心测试都通过。合入前想请你处理几点:

  1. 测试锁中毒:partially_deleted_backup_remains_out_of_restore_and_releases_the_lock 的子线程在持有 skills_coordination() 的情况下执行 sender.send(()).unwrap()。并行跑时 5 秒的 recv_timeout 容易超时(单个用例约 1 秒,并行时超过 60 秒),接收端被丢掉后 send 失败、panic,全局锁中毒,之后 48 个用例全部报 PoisonError。本地 cargo test -p codex-plus-core --lib skills 两次都是 50 个失败,CI 上也会遇到。请改成 let _ = sender.send(()),并避免用墙钟超时断言锁已释放。
  2. 预览占用内存:update_previews 保存了完整的仓库 zip(最多 4 份、每份最多 64 MiB),关掉抽屉后不释放,最多常驻约 256 MiB。建议关闭时丢弃,或者只保存解压好的暂存内容和摘要。
  3. 外部备份丢失后整个列表报错:手动删掉一个 @external/... 备份目录后,try_list_backups 在 symlink_metadata(&path)? 处整体失败,所有备份都不显示,delete_backup 也删不掉这条记录。建议把缺失项标成「已丢失」并允许清除记录;list_backups() 也不要用 expect 直接 panic。
  4. 暂存目录残留:原位更新的 .codex-plus-update-* 建在用户的 Skill 目录里,下载或解压失败后不清理,请在失败时清理自己创建的暂存目录。
  5. 备份累积:每次更新、每次恢复都会给每个路径新增备份,没有保留策略。建议至少在界面上显示占用和数量,或者提供「只保留最近 N 份」。
  6. 范围:「重复副本归档(包括归档受控源)」和「文件修改时间」是独立的新功能,和原位更新、备份恢复关系不大,按之前拆小的约定,建议拆到单独的 PR。

另外测试夹具里的 id: "rea" 可以换成中性名字。CI 卡在 GitHub 队列里,我们这边取消不掉,推下一个提交时会重新跑。谢谢!

@130040167

Copy link
Copy Markdown
Contributor Author

感谢详细复核,已在 d2ef7862 处理:

  1. 移除了依赖 5 秒墙钟超时和跨线程发送结果的断言,相关备份状态测试不再因接收端退出而毒化全局锁。Windows 隔离环境的 Skill 核心并行回归为 248 通过、5 项按环境条件忽略。
  2. 更新预览抽屉关闭、重新检查或请求返回前已关闭时,会释放后端对应的压缩包;执行时也会移除预览。
  3. 已丢失的外部备份显示为已丢失,可清除其记录;不完整的备份组不会误报可恢复。备份列表改为返回错误,不再通过 expect 使进程 panic。
  4. 更新暂存失败时清理本次创建且身份未改变的目录;若目录被替换或清理失败,保留并报告,不删除其他内容。
  5. 备份面板按需在后台展示备份数量与占用空间;读取不完整或失败时明确显示。本次未增加自动删除策略。
  6. 重复副本归档和文件修改时间已拆到独立 PR:支持 Skill 重复副本归档与文件时间查看 #3079。本 PR 仍保留旧归档备份记录的恢复兼容。

测试夹具中的特定 Skill 名称已换为中性名称。相关前端测试 32 项、TypeScript、Vite 和 Windows release 构建通过;隔离管理页在业务断言前等待 WebView 调试端口超时,未计作原生页面验收。

@130040167

130040167 commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor Author

补充一下 d2ef7862 的 CI:Windows 和 macOS 已通过;Linux 在 Rust 测试中有 1 项失败,connect::inbox::tests::ttl_boundary_and_modified_or_foreign_content_are_preserved 的 assert!(!path.exists()) 未通过,其余 2486 项通过、11 项忽略。这个测试文件不在本 PR 相对 #3056 的改动中。

#3079 的前一提交 8a65aa84 的 Linux CI 中,同一个 inbox 测试通过;这不能代替本 PR 的检查。我尝试重跑本 PR 的 Linux job,但当前账号收到仓库权限不足的 403。麻烦有权限时协助重跑,谢谢!

This branch has not been deployed

No deployments
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.

2 participants