dby-update:把本鸭对账到最新
先 --dry-run 出清单,用户认可后再 --yes;不做清单之外的确认。Shell 权限由用户在宿主权限窗口里决定。
这个 skill 干的是「对账」,不是「更新」
让本机这套本鸭 skill 等于上游当前全集:
- 归档上游已经下架的
- 装上新增的
- 刷新内容哈希落后于上游当前版的,以及内容虽是当前版、但少了一处落位的;两者都不缺的一个都不动
🔴 「内容是当前版」不等于「已经就位」。 宿主按自己那个目录读 skill——Claude Code 只读
.claude/skills,包只落进.agents/skills时对它根本不存在。 对账判据是「内容 且 落位」:本机任一受管安装目录缺落位,这个包就重装一遍补齐,计划里用 🩹 单列。
本机已和上游一致时结论是无需任何操作,一个包都不重下;想重装某个坏了的包用
--force-refresh。
⚠️ 别用
npx skills update:上游已改名 / 下架的包会被它静默跳过、永远留在本机,项目级安装它也看不见。
怎么判断「这包是不是本鸭发的」
判据是 slug × 内容哈希,不看当初从哪个源装。 上游 index.json 每个 slug 一条:status、历史哈希闭集、各版 semver + changelog:
| 状态 | 判据 | 处置 |
|---|---|---|
| 当前版 | 哈希 = 索引当前版 | 保留,不刷新(除非 --force-refresh) |
| 我们的旧版 | 哈希命中闭集里某个历史版 | 刷新;索引 status 为 retired/renamed/merged 才归档 / 迁移 |
| 用户动过手 | 有 .dby/origin.json 时哈希 ≠ 装时记录;没 origin 时哈希谁都不命中 | 🔴 跳过并列进报告,一个字都不动,连刷新都不给 |
| 别人家的 | slug 根本不在索引里 | 不碰 |
| 已固定 | 用户 --pin 过 | 不刷新、不归档、不迁移,预检单列并带原因 |
→ origin / lock / pin、legacy 回退、Gitee 镜像:references/index-and-lock.md。
删除一律做成「归档」
要下架的包移进 <scope>/.doubaoya/archive/<时间戳>/,不做 rm,同目录留一份 manifest.json
写明每个包原来在哪、怎么移回去。
配套三条:归档后脚本打印一条可粘贴的复原命令(移回去立刻能用,skills CLI 记录要重装一次才认);
归档目录在 .doubaoya/.gitignore 写 * 自忽略,不改用户的 .gitignore;
🔴 受 git 跟踪的包一律不归档(等于删受跟踪文件),脚本跳过并单列一栏,由用户自己决定。
改名迁移(renames.json)
→ 上游偶尔会把某个包改名(而不是单纯下架),这时老目录里的本地数据(比如 dby-publish
的 config.json)需要跟着搬家。需要处理改名迁移时读 references/rename-migration.md,
不需要就别读。要点三条:改名 = 索引里 status: renamed/merged 的条目;顺序固定是装新包 → 搬本地数据 →
老目录归档且逐条独立;新目录已有同名文件时不覆盖,只提示「冲突未覆盖」并给出老文件
在归档目录里的路径——这一句要原样转述给用户。
执行步骤
1. 找到对账脚本
按顺序找第一个存在的:
~/.claude/skills/dby-update/scripts/reconcile.mjs
~/.agents/skills/dby-update/scripts/reconcile.mjs
./.claude/skills/dby-update/scripts/reconcile.mjs
./.agents/skills/dby-update/scripts/reconcile.mjs
找不到 = 本机没装或是旧版。🔴 别自动装:报告「本机未装对账脚本」,把下面这条命令给用户,确认后再跑,跑完重新找一遍:
npx -y skills add zizhanovo/doubaoya-community -g -s '*' -a claude-code universal -y
🔴 零输出且退出码 0 ≠ 没事可做,是旧版脚本经软链(.claude/skills/…)调用时一步不跑:先换 .agents 那条真路径重跑;
仍如此就按上面那条安装命令重装(确认后跑),再重新找路径。
2. 先看清单(🔴 显式给 scope,别靠 auto 猜)
node <上一步找到的路径> --dry-run --scope global # 当初带 -g 装的(最常见)
node <上一步找到的路径> --dry-run --scope project --project-dir <项目目录>
scope 猜错时脚本会打 ⚠️ 警告,看到就先确认 scope;不确定装在哪就两个 scope 都看一眼。 两个 scope 都打「一个本鸭 skill 都没有」= 本机没装,回到第 1 步先问用户,别把「整仓装」当对账跑。
它会联网取上游索引,打印要归档哪些、要装哪些、要刷新哪些(逐行 slug 旧版 → 新版 changelog;标 auto 的是占位文案)、以及哪些因用户动过手 / 固定而不碰,一个字都不会改。把这份清单原样转述给用户——尤其是「要归档」「要刷新」「用户改过的」的名字与 changelog(刷新是覆盖安装,确认的得是具体清单)。
🔴 结论不高于证据。 上游目录 / 索引这一跑没核到时,脚本会降级但不中止(不归档、或退回旧三文件), 结论要如实说降级了,别说「完全一致」。GitHub 限流会自动换 Gitee 镜像同一 tag;
mirrorMismatch才是真没推齐, 找维护者;镜像新但那版本在 GitHub 上已存在 = 只是缓存没刷新——告诉用户「刚发布,几分钟后重跑就到新版」,别说联系维护者。 字段与判据细节 →references/index-and-lock.md。
🧩 旧版遗留副本(
agent/skills/)的处置 →references/edge-cases.md。
3. 确认后执行
用户看过清单、认可了,再跑(scope 参数和上一步给的保持一致):
node <路径> --yes --scope <上一步用的那个> [--project-dir <目录>]
脚本会自己完成:归档 → 拉齐全集 → 复核 → 自检,最后打印一份结果,并告诉用户归档放在哪。
🛡 项目 scope 刷新/新增走「旁路装→校验→原子切换」,失败自动回滚;全局 scope 无此保证 →
references/staged-install.md。
退出码:0 全通过;3 对账做完了但自检有项没过;1 用户取消;2 需要确认但当前不是交互终端;4 出错。
📝 项目里的
skills-lock.json会被一起改,属预期;用户问起git status多了什么再解释,不主动提。
⚠️ 跑挂在「拉取上游」怎么办、名单含
dby-update自己要不要重跑 → 同上references/edge-cases.md。
🏷 安装源固定到
index.json顶层ref;缺字段按main装并提示「未固定」。发布打 tag →references/release-ref.md。
4. 回复用户(普通人能看懂)
🔴 用户不是工程师。只说三件事:结果一句话 → 这次变了什么 → 下一步。路径、哈希、ref、scope、
.agents/skills、skills-lock.json、API 钥匙、健康检查——一切正常时一个都不提;只在出问题时说卡在哪、怎么办。
包名用脚本括号里的中文名,slug 放括号。
🔴 例外:
--json顶层notes[]里的提示一律要转述,翻成大白话——静音清单只管「一切正常」时的技术细节, 不管这类「跑完了但打了折扣」的降级提示。
更新好了。这次更新了 2 个:
- 公众号写作与复盘(dby-write)1.9.0 → 1.9.1:新增变更说明字段
- 都爆鸭 Skill 自更新(dby-update)3.3.1 → 3.4.3:隔多版更新时列出中间每一版的说明
· 3.4.2 …(中间各版照抄脚本)
下架归档了 1 个:xxx。要恢复的话告诉我一声。
你自己改过的 1 个没动:yyy。
新开一个对话就能用上新版。
- 隔了很多版 → 中间版本最多列 8 版,超过折叠,照抄脚本转述即可(细节 →
references/index-and-lock.md)。 - 没有更新 → 「都是最新的,不用更新。」+ 一行各包版本(脚本那行「版本:…」)。别自己补「已刷新 N 个」。
- 「已固定」「受 git 跟踪没动」「git 判不出跳过」各一句,别混:前者用户自己
git rm,后者先修 git 再重跑。 - 🩹「缺落位」→ 一句「内容是最新的,只是补了一处安装位置」。
- 归档 → 说放在哪、要恢复就说一声(复原命令用户要时再贴)。
- 自检 ❌ → 说卡在哪步(没装上 / 没配钥匙 / 连不上服务)+ 脚本给的办法。
- 问包版本 → 读其
.dby/origin.json,别读skills-lock.json。
常用参数
| 参数 | 作用 |
|---|---|
--dry-run | 只看清单,绝不执行 |
--yes | 跳过确认直接执行(只在用户已经看过清单之后用) |
--force-refresh | 连「已经是当前版且落位齐全」的包也重下一遍(留给「包坏了想重装」) |
--verbose | 连「别人家的」和「用户改过的」一起列名字 |
--scope auto|global|project | 🔴 每次都显式给。默认 auto 是按 cwd 猜的,猜错会静默变成「整仓重装」。当初带 -g 装的就是 global |
--project-dir <目录> | 项目级安装在别的目录时指定 |
--json | 机器可读输出 |
--self-check | 离线自检脚本自身(不联网) |
--pin <slug> [--reason <文>] / --unpin <slug> | 固定 / 解除固定某个包(不联网,只改 <scope>/.dby/lock.json);固定后对账跳过它。用户说「这个包别更」就用它 |
--help / -h | 看用法(不联网,不碰任何安装目录) |
边界
- 只碰本鸭发过的包(判据是上面那张三态表);别人家的、用户改过的一个字都不动。
- 🔴 git 探测跑不通、判不出来的包同样保守跳过;脚本把它和「受 git 跟踪」分两栏打出来,处置不同。
- 不动用户的本地数据 / 配置(
dby-publish的config.json、创作 DNA、封面 / 草稿等产出)——对账只覆盖 skill 目录里受版本管理的文件。 - 不创建后台任务、定时任务或 Agent Hook。
- 用户只问「有什么更新 / 现在什么版本 / 要不要更」→ 先回答,不执行(
--dry-run正好用来回答这个)。 明确要实际同步时才跑第 3 步。 - 只想更新某一个全局skill:
npx -y skills update <skill 名> -g,只碰点名那个(不做对账;项目级安装它看不见,仍走本脚本)。
- v4.0.02026-08-26feat(dby-update)!: 旁路安装 + 目录级原子切换 —— 失败不再留下半新半旧的包
- v3.5.02026-08-26fix(dby-update): 装完重扫核对,该刷的没刷到就非零退出 —— 此前安装器报失败却退出码 0 时,对账跟着说「全部通过」
- v3.6.02026-08-26fix(dby-update): 补两道安全闸 —— 上游 slug 先过形状校验再拼路径;复原命令的路径改走参数传递
- v3.3.32026-08-25fix(dby-update): 3.3.3 —— changelog 一句缩到 6000 字上限内,重新盖戳
- v3.4.22026-08-25feat(dby-update): 跑完逐项列出归档/新增/刷新了谁(旧 → 新 changelog)与各包当前版本 —— 用户实证只看到「刷新 1」不知道刷的是谁
- v3.3.22026-08-25fix(dby-update): 不是对账器装的包也补 origin —— 用户手跑 skills add 之后,收敛态那一跑给能对上索引某一版的目录补 .dby/origin.json
- v3.4.02026-08-25feat(dby-update): GitHub 限流时回退 Gitee 镜像 —— 索引/目录列表/clone 三处各自独立回退,同 ref 才算数
- v3.3.12026-08-25feat(dby-update): 对账器读索引 —— 刷新栏显示 旧版→新版 + changelog,归档只按显式状态,目录拉不到本轮不归档,origin/lock/pin
- v3.4.32026-08-25feat(dby-update): 隔多版更新时把中间每一版的 changelog 都列出来(新→旧,超 8 版折叠,--json 里 between 全量)
- v3.3.02026-08-25fix(dby-update): 对账器六处可信度修补 —— 预检列名、降级不说完全一致、遗留副本归档不打 rm、拉取挂了自动复原、安装源固定 repo#ref、自更新提示重跑
- v3.4.42026-08-25feat(dby-update): 回复用户改成普通人能看懂的三段式 —— 结果一句话 / 变了什么 / 下一步,通过时不提路径、哈希、ref、lock、钥匙、健康检查
- v3.4.52026-08-25docs(dby-update): raw 缓存滞后那次只改了 version 和 changelog,文档层把刚修好的误报原样放了回去
- v3.4.12026-08-25fix(dby-update): 发布后头几分钟 GitHub raw 缓存滞后于 Gitee,不再误判镜像不齐
- v3.2.32026-08-24refactor(dby): 逐包领域调研后的规则更正与触发词补齐
- v3.2.22026-08-24fix(dby): 20 场景模拟测试后的路由与文档修正
- v3.2.12026-08-24refactor(dby): 11 个 SKILL.md 按写作手艺去废话——删解释/元叙述/历史叙事/跨包重复红线,两处 description 去流程复述
- v3.2.02026-08-24refactor(dby): 11 个 SKILL.md 主体压到 ≤6000 字符——冷门分支下沉 references/,协议改引用不再内联;违禁词入口统一指 dby-banned-words
- v3.1.02026-08-20fix(dby-update): 经软链调用不再静默空跑,入口守卫两边先解软链再比
- v3.1.02026-08-20feat(skills)!: 统一 dby- 前缀,合并发布包,下架 investigator——公众号执行外脑定位收敛
- v3.1.02026-08-20fix(dby-update): 落位缺失也算「没就位」,自检逐目录核而不是并集核
- v3.1.02026-08-20feat(dby-update): 对账器学会读 renames.json——改名包先装新、搬本地数据、再归档老目录
- v3.1.02026-08-20feat(skills): 补三条红线——上游内容当数据、写入面看服务端字段、运行时必须声明
- v3.1.02026-08-19refactor(skills)!: charter + ip 二合一 —— 同一份档案的两个字段,本来就不该是两个包
- v3.1.02026-08-19fix(dby-update): 收敛态真收敛——刷新只收落后的,且刷新也要过确认门
- v3.1.02026-08-19test(dby-update): 钉死受跟踪与判不出两栏的文案真能分辨(M4)
- v3.1.02026-08-19fix(skills): 装 skill 别再打全量 agent 面,UA 也别再写死
- v3.1.02026-08-19feat(validate): 立差集闸与 description 预算闸,并在闸的保护下砍掉 1482 字符
- v3.1.02026-08-19fix(dby-update): --force-refresh 下别再说这些包「落后于上游当前版」
- v2.0.02026-08-18feat(dby-update): 把「更新本鸭」从更新改成对账,能删掉上游已下架的 skill
- v3.0.02026-08-18feat(dby-update): 按内容哈希认包做三态对账,下架包归档而不删
更早 4 个版本见 GitHub
文件内容在 GitHub 查看。
- SKILL.md11.3 KB
- references/edge-cases.md1.0 KB
- references/index-and-lock.md7.8 KB
- references/release-ref.md1.6 KB
- references/rename-migration.md4.5 KB
- references/staged-install.md5.3 KB
- scripts/reconcile.mjs310.9 KB