[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71PZFN7YSXJ6WDV0HAEZAW5":3,"skill-same:01M71PZFN7YSXJ6WDV0HAEZAW5":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":34,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M71PZFN7YSXJ6WDV0HAEZAW5","sync-run-bob",null,"维护者一键流程 — 把 run-bob 上游 main 分支的最新模板同步到本仓库 cli\u002Ftemplates\u002Fbob\u002F → 自动把 ARCHITECTURE.md 字串改写为 BOB.md → 跑测试 → bump cli 版本 → 提交 → 打 tag → 推送，最后输出消费者升级通知文案。当用户说\"同步 run-bob\"、\"bob 插件有更新同步一下\"、\"run-bob 出新版了\"或输入 \u002Fsync-run-bob 时触发。**与 sync-ddd-run 的区别**：那个同步 ddd-run 模板 → cli\u002Ftemplates\u002Fddd\u002F，本 skill 同步 run-bob → cli\u002Ftemplates\u002Fbob\u002F，并且会做 ARCHITECTURE.md → BOB.md 字串替换。","amwtke\u002Fsuperpowers-to-trae","amwtke","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8730051?v=4","01M71PZAWYBGZAE53GZD5335Z3","01M71PZAXKV49CRG9KWRAKZNKV",1,"MIT","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsync-run-bob\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35],"sync","run","bob","sync run bob","testing","cli","architecture","ddd","templates","消费","bump","main","文案","2026-11-10 13:02:02",false,"---\nname: sync-run-bob\ndescription: 维护者一键流程 — 把 run-bob 上游 main 分支的最新模板同步到本仓库 cli\u002Ftemplates\u002Fbob\u002F → 自动把 ARCHITECTURE.md 字串改写为 BOB.md → 跑测试 → bump cli 版本 → 提交 → 打 tag → 推送，最后输出消费者升级通知文案。当用户说\"同步 run-bob\"、\"bob 插件有更新同步一下\"、\"run-bob 出新版了\"或输入 \u002Fsync-run-bob 时触发。**与 sync-ddd-run 的区别**：那个同步 ddd-run 模板 → cli\u002Ftemplates\u002Fddd\u002F，本 skill 同步 run-bob → cli\u002Ftemplates\u002Fbob\u002F，并且会做 ARCHITECTURE.md → BOB.md 字串替换。\n---\n\n# sync-run-bob\n\n把 `https:\u002F\u002Fgithub.com\u002Famwtke\u002Frun-bob` main 分支的最新模板同步进 `superpowers-to-trae` 的 `cli\u002Ftemplates\u002Fbob\u002F` 目录、跑测试、bump cli 版本、发 release，最后给出消费者升级通知。\n\n## 触发\n\n用户说：\n- \"同步 run-bob\" \u002F \"bob 插件有更新同步一下\" \u002F \"run-bob 出新版了\"\n- 输入 `\u002Fsync-run-bob`\n\n## 前置约束\n\n- 必须在 `~\u002Fworkshop\u002Fsuperpowers-to-trae` 仓库根（项目级 skill 默认就在）\n- 工作树干净（`git status` 无未提交改动）；如果脏，先让用户决定 commit \u002F stash\n- 网络可达 `github.com`\n- 任一步失败 → **立即终止流程**，不做自动回滚（保留现场让人查）\n\n## 文件映射（SSOT）\n\n下表是同步范围。**不在表里的文件，skill 不动**。\n**注意**：本仓库统一把 `ARCHITECTURE.md` 重命名为 `BOB.md`（避免与项目里已有的 ARCHITECTURE.md 撞名）。所有同步进来的文件必须做 `s\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg` 字串替换。\n\n| run-bob 上游 | 本仓库 | 同步策略 |\n|---|---|---|\n| `src\u002Ftemplates\u002Fskills\u002Fbob-identify.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-identify.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Fskills\u002Fbob-onion.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-onion.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Fskills\u002Fbob-spec.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-spec.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Froot\u002FARCHITECTURE.md` | `cli\u002Ftemplates\u002Fbob\u002Froot\u002FBOB.md` | 强制覆盖 + sed 改写（同时改文件名）|\n| `src\u002Ftemplates\u002Froot\u002FREADME-RUN-BOB.md` | `cli\u002Ftemplates\u002Fbob\u002Froot\u002FREADME-RUN-BOB.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Froot\u002FCLAUDE.md` | — | **不同步**（本地 `claude-md-merge.md` 是 trae 专用合并模板）|\n| `src\u002Ftemplates\u002Froot\u002FCleanArchitectureTest.java` | — | **不同步**（属 cli 安装逻辑改动，超出本 skill 范围）|\n| `src\u002Ftemplates\u002Froot\u002FUseCase.java` | — | **不同步**（同上）|\n| `src\u002Ftemplates\u002Froot\u002FTransactionalUseCaseDecorator.java` | — | **不同步**（同上）|\n\n## 9 步流程\n\n### Step 1 — 检查工作树干净\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\ngit status --porcelain\n```\n\n非空 → 终止，让用户决定 commit \u002F stash。\n\n### Step 2 — 拉上游最新到 tmp\n\n```bash\nrm -rf \u002Ftmp\u002Frun-bob-sync\ngit clone --depth 50 https:\u002F\u002Fgithub.com\u002Famwtke\u002Frun-bob.git \u002Ftmp\u002Frun-bob-sync\nUPSTREAM_SHA=$(git -C \u002Ftmp\u002Frun-bob-sync rev-parse --short HEAD)\nUPSTREAM_DATE=$(git -C \u002Ftmp\u002Frun-bob-sync log -1 --format=%ci)\necho \"Upstream HEAD: $UPSTREAM_SHA ($UPSTREAM_DATE)\"\n```\n\n### Step 3 — 对比上游版本，判断要不要继续\n\nrun-bob SHA 的 SSOT 是 `cli\u002FCargo.toml` 的 `[package.metadata.upstream].run_bob_version` 字段（同一段还有 `superpowers_version` \u002F `ddd_run_version`）。\n\n```bash\nLOCAL_SHA=$(grep '^run_bob_version' ~\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002FCargo.toml | sed -E 's\u002F.*\"([^\"]+)\".*\u002F\\1\u002F')\necho \"Local recorded SHA:  $LOCAL_SHA\"\necho \"Upstream HEAD SHA:   $UPSTREAM_SHA\"\n```\n\n判断：\n- `LOCAL_SHA == UPSTREAM_SHA` → **流程终止**，告诉用户\"已是最新，无需同步\"。不要瞎跑下面的步骤\n- `LOCAL_SHA != UPSTREAM_SHA` → 继续\n\n### Step 4 — Review 5 个 md 文件 diff\n\n对每个映射的 md 文件先做 sed 改写，再跑 unified diff，把摘要打印给用户：\n\n```bash\nTMP_REWRITE=\u002Ftmp\u002Frun-bob-sync-rewrite\nrm -rf $TMP_REWRITE && mkdir -p $TMP_REWRITE\u002Fskills $TMP_REWRITE\u002Froot\n\nfor f in bob-identify.md bob-onion.md bob-spec.md; do\n  sed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Fskills\u002F$f \\\n    > $TMP_REWRITE\u002Fskills\u002F$f\ndone\nsed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Froot\u002FREADME-RUN-BOB.md \\\n  > $TMP_REWRITE\u002Froot\u002FREADME-RUN-BOB.md\nsed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Froot\u002FARCHITECTURE.md \\\n  > $TMP_REWRITE\u002Froot\u002FBOB.md\n\nfor pair in \\\n  \"skills\u002Fbob-identify.md\" \\\n  \"skills\u002Fbob-onion.md\" \\\n  \"skills\u002Fbob-spec.md\" \\\n  \"root\u002FBOB.md\" \\\n  \"root\u002FREADME-RUN-BOB.md\"; do\n  echo \"=== $pair ===\"\n  diff -q \"\u002Fhome\u002Fxiaojin\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002Ftemplates\u002Fbob\u002F$pair\" \\\n          \"$TMP_REWRITE\u002F$pair\" || \\\n    diff -u \"\u002Fhome\u002Fxiaojin\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002Ftemplates\u002Fbob\u002F$pair\" \\\n            \"$TMP_REWRITE\u002F$pair\" | head -60\ndone\n```\n\n**同时检查上游有没有新增超出映射表的文件**——这是为了防止映射表过时漏掉新文件：\n\n```bash\necho \"=== 上游全部 templates 文件 ===\"\nfind \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates -type f\n```\n\n把上游列表跟映射表对比，**新增的非 md 文件提醒用户**（例如又冒出来个新 `*.java` 模板），由用户决定是否要扩 cli 安装逻辑——本 skill 不动。\n\n### Step 5 — 强制覆盖 5 个 md 文件（已 sed 改写）\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\n\ncp $TMP_REWRITE\u002Fskills\u002Fbob-identify.md cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Fskills\u002Fbob-onion.md    cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Fskills\u002Fbob-spec.md     cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Froot\u002FBOB.md            cli\u002Ftemplates\u002Fbob\u002Froot\u002F\ncp $TMP_REWRITE\u002Froot\u002FREADME-RUN-BOB.md cli\u002Ftemplates\u002Fbob\u002Froot\u002F\n\n# 防御性检查：确认没有任何残留 ARCHITECTURE.md 字串\necho \"--- 检查残留 ARCHITECTURE.md 字串（应当只有零结果） ---\"\ngrep -rn 'ARCHITECTURE\\.md' cli\u002Ftemplates\u002Fbob\u002F || echo \"(clean)\"\n\ngit status --short cli\u002Ftemplates\u002Fbob\u002F\n```\n\n如果 grep 命中任何 `ARCHITECTURE.md` → **停下来**，sed 替换可能没覆盖所有引用形式（如带反斜杠的 markdown link），手工修复后再继续。\n\n### Step 6 — 跑全套测试\n\n```bash\nmake test\n```\n\n74+ 项必须全绿。失败 → 修，不继续装。常见失败：\n\n| 失败 | 原因 \u002F 处理 |\n|---|---|\n| frontmatter `name` 字段校验失败 | 上游某个 skill 改了 frontmatter，cli 校验规则不接受 → 看 `cli\u002Fsrc\u002Ftemplates.rs` 调一下 |\n| bob_install_creates_skills_and_root_files 失败 | 上游加了 \u002F 删了 skill → 改 `cli\u002Fsrc\u002Faddons\u002Fbob.rs` 测试断言 |\n| 其它 hard-coded 路径校验失败 | 上游新增了硬编码路径 → 看 cli 是否需要相应更新 |\n\n### Step 7 — 更新 Cargo.toml 里的 run_bob_version\n\n把 `cli\u002FCargo.toml` 的 `[package.metadata.upstream].run_bob_version = \"\u003C旧 SHA>\"` 改成 `\"\u003C新 UPSTREAM_SHA>\"`。这一步与 Step 8 的 version bump 一起改 Cargo.toml，可一次性完成。\n\n### Step 8 — Bump cli 版本\n\n读 `cli\u002FCargo.toml` 当前版本，按上游变更影响判断：\n\n| 上游变化范围 | cli bump |\n|---|---|\n| 仅文档措辞改动（README \u002F 注释） | patch (0.4.0 → 0.4.1) |\n| skill 内容增量（加了规则 \u002F 反模式 \u002F 示例） | patch (0.4.0 → 0.4.1) |\n| skill frontmatter 改名 \u002F 删了 skill \u002F 加了新 skill | minor (0.4.0 → 0.5.0) |\n| 上游新增非 md 文件且决定移植 → 改 cli 代码 | minor (0.4.0 → 0.5.0) |\n\n### Step 9 — Commit + Tag + Push\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\ngit add -A\ngit commit -m \"$(cat \u003C\u003CEOF\nchore(bob): sync run-bob upstream → $UPSTREAM_SHA\n\n主要变更（从 Step 4 diff 摘）:\n- \u003C要点 1>\n- \u003C要点 2>\n\ncli bump: \u003C旧版> → \u003C新版>\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003Cnoreply@anthropic.com>\nEOF\n)\"\n\ngit tag v\u003C新 cli 版本>\ngit push origin main --tags\n```\n\nGitHub Actions 会基于 tag 自动出 release（如已配）。如未配，提示用户去 GitHub UI 手动发 release。\n\n### Step 10 — 输出消费者升级通知\n\n把以下 markdown 文案**原样输出**到对话里，告诉用户\"复制这段发给订阅你的人\"：\n\n````markdown\n🎉 superpowers-to-trae 已升级到 **v\u003C新 cli 版本>**（同步上游 run-bob `\u003CUPSTREAM_SHA>`）。\n\n## 升级二进制（消费者跑）\n\n```bash\n# Linux + macOS + Windows (bash\u002Fzsh\u002Fgit-bash)\ncargo install --git https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae.git superpowers-trae --force\n```\n\n## 升级项目内的 bob 插件\n\n二进制装好后，进到自己的项目根目录跑：\n\n```bash\nsuperpowers-trae upgrade --addons bob\n```\n\n`BOB.md` 是 install-once，不会被覆盖；3 个 bob skill + README-RUN-BOB.md 会刷成最新。\n\n## 主要变更\n\n\u003C这里粘 Step 4 diff 摘的要点>\n````\n\n## 失败处理\n\n| 失败点 | 行为 |\n|---|---|\n| Step 1 工作树脏 | 终止，让用户先 commit \u002F stash |\n| Step 2 git clone 网络失败 | 原文输出错误，让用户检查代理 \u002F GitHub 可达性 |\n| Step 3 SHA 一致 | 终止流程，告诉用户\"已是最新\"，不做空 commit |\n| Step 4 上游有新增非映射文件 | 不阻断；汇报给用户由其决定是否扩映射 |\n| Step 5 sed 残留 `ARCHITECTURE.md` | 停下，让用户手工修（可能是带反斜杠\u002F链接的边界情况）|\n| Step 6 测试挂 | 把失败用例贴出来，停下让用户判断（修 cli 代码 vs. 退回上一版） |\n| Step 9 push 被拒（无权限 \u002F 网络）| 原样输出 git 错误，不要 force push，让用户处理 |\n\n## 不做\n\n- 不自动 stash \u002F reset --hard——脏工作树留给用户决定\n- 不跳过测试——发版必须全绿\n- 不动 `claude-md-merge.md`——这是 trae 专用文件\n- 不自动移植上游新增的非 md 模板（如 Java 文件）——属 cli 安装逻辑变更\n- 不修改 git 配置 \u002F 不改远端 \u002F 不强 push\n- 不替消费者执行 install——本 skill 只产出通知文案\n\n## 与其它 skill 的区别\n\n| skill | 用途 | 操作对象 |\n|---|---|---|\n| **sync-run-bob**（本 skill）| 维护者：同步 run-bob 上游 | `cli\u002Ftemplates\u002Fbob\u002F` + 发版 |\n| sync-ddd-run | 维护者：同步 ddd-run 上游 | `cli\u002Ftemplates\u002Fddd\u002F` + 发版 |\n| update-from-upstream | 维护者：同步 obra\u002Fsuperpowers 上游 | `upstream\u002F` + `dist\u002F` + 发版 |\n| install-superpowers-trae | 消费者：拉 binary | `~\u002F.cargo\u002Fbin\u002F` |\n","# sync-run-bob\n\n把 `https:\u002F\u002Fgithub.com\u002Famwtke\u002Frun-bob` main 分支的最新模板同步进 `superpowers-to-trae` 的 `cli\u002Ftemplates\u002Fbob\u002F` 目录、跑测试、bump cli 版本、发 release，最后给出消费者升级通知。\n\n## 触发\n\n用户说：\n- \"同步 run-bob\" \u002F \"bob 插件有更新同步一下\" \u002F \"run-bob 出新版了\"\n- 输入 `\u002Fsync-run-bob`\n\n## 前置约束\n\n- 必须在 `~\u002Fworkshop\u002Fsuperpowers-to-trae` 仓库根（项目级 skill 默认就在）\n- 工作树干净（`git status` 无未提交改动）；如果脏，先让用户决定 commit \u002F stash\n- 网络可达 `github.com`\n- 任一步失败 → **立即终止流程**，不做自动回滚（保留现场让人查）\n\n## 文件映射（SSOT）\n\n下表是同步范围。**不在表里的文件，skill 不动**。\n**注意**：本仓库统一把 `ARCHITECTURE.md` 重命名为 `BOB.md`（避免与项目里已有的 ARCHITECTURE.md 撞名）。所有同步进来的文件必须做 `s\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg` 字串替换。\n\n| run-bob 上游 | 本仓库 | 同步策略 |\n|---|---|---|\n| `src\u002Ftemplates\u002Fskills\u002Fbob-identify.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-identify.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Fskills\u002Fbob-onion.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-onion.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Fskills\u002Fbob-spec.md` | `cli\u002Ftemplates\u002Fbob\u002Fskills\u002Fbob-spec.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Froot\u002FARCHITECTURE.md` | `cli\u002Ftemplates\u002Fbob\u002Froot\u002FBOB.md` | 强制覆盖 + sed 改写（同时改文件名）|\n| `src\u002Ftemplates\u002Froot\u002FREADME-RUN-BOB.md` | `cli\u002Ftemplates\u002Fbob\u002Froot\u002FREADME-RUN-BOB.md` | 强制覆盖 + sed 改写 |\n| `src\u002Ftemplates\u002Froot\u002FCLAUDE.md` | — | **不同步**（本地 `claude-md-merge.md` 是 trae 专用合并模板）|\n| `src\u002Ftemplates\u002Froot\u002FCleanArchitectureTest.java` | — | **不同步**（属 cli 安装逻辑改动，超出本 skill 范围）|\n| `src\u002Ftemplates\u002Froot\u002FUseCase.java` | — | **不同步**（同上）|\n| `src\u002Ftemplates\u002Froot\u002FTransactionalUseCaseDecorator.java` | — | **不同步**（同上）|\n\n## 9 步流程\n\n### Step 1 — 检查工作树干净\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\ngit status --porcelain\n```\n\n非空 → 终止，让用户决定 commit \u002F stash。\n\n### Step 2 — 拉上游最新到 tmp\n\n```bash\nrm -rf \u002Ftmp\u002Frun-bob-sync\ngit clone --depth 50 https:\u002F\u002Fgithub.com\u002Famwtke\u002Frun-bob.git \u002Ftmp\u002Frun-bob-sync\nUPSTREAM_SHA=$(git -C \u002Ftmp\u002Frun-bob-sync rev-parse --short HEAD)\nUPSTREAM_DATE=$(git -C \u002Ftmp\u002Frun-bob-sync log -1 --format=%ci)\necho \"Upstream HEAD: $UPSTREAM_SHA ($UPSTREAM_DATE)\"\n```\n\n### Step 3 — 对比上游版本，判断要不要继续\n\nrun-bob SHA 的 SSOT 是 `cli\u002FCargo.toml` 的 `[package.metadata.upstream].run_bob_version` 字段（同一段还有 `superpowers_version` \u002F `ddd_run_version`）。\n\n```bash\nLOCAL_SHA=$(grep '^run_bob_version' ~\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002FCargo.toml | sed -E 's\u002F.*\"([^\"]+)\".*\u002F\\1\u002F')\necho \"Local recorded SHA:  $LOCAL_SHA\"\necho \"Upstream HEAD SHA:   $UPSTREAM_SHA\"\n```\n\n判断：\n- `LOCAL_SHA == UPSTREAM_SHA` → **流程终止**，告诉用户\"已是最新，无需同步\"。不要瞎跑下面的步骤\n- `LOCAL_SHA != UPSTREAM_SHA` → 继续\n\n### Step 4 — Review 5 个 md 文件 diff\n\n对每个映射的 md 文件先做 sed 改写，再跑 unified diff，把摘要打印给用户：\n\n```bash\nTMP_REWRITE=\u002Ftmp\u002Frun-bob-sync-rewrite\nrm -rf $TMP_REWRITE && mkdir -p $TMP_REWRITE\u002Fskills $TMP_REWRITE\u002Froot\n\nfor f in bob-identify.md bob-onion.md bob-spec.md; do\n  sed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Fskills\u002F$f \\\n    > $TMP_REWRITE\u002Fskills\u002F$f\ndone\nsed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Froot\u002FREADME-RUN-BOB.md \\\n  > $TMP_REWRITE\u002Froot\u002FREADME-RUN-BOB.md\nsed 's\u002FARCHITECTURE\\.md\u002FBOB.md\u002Fg' \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates\u002Froot\u002FARCHITECTURE.md \\\n  > $TMP_REWRITE\u002Froot\u002FBOB.md\n\nfor pair in \\\n  \"skills\u002Fbob-identify.md\" \\\n  \"skills\u002Fbob-onion.md\" \\\n  \"skills\u002Fbob-spec.md\" \\\n  \"root\u002FBOB.md\" \\\n  \"root\u002FREADME-RUN-BOB.md\"; do\n  echo \"=== $pair ===\"\n  diff -q \"\u002Fhome\u002Fxiaojin\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002Ftemplates\u002Fbob\u002F$pair\" \\\n          \"$TMP_REWRITE\u002F$pair\" || \\\n    diff -u \"\u002Fhome\u002Fxiaojin\u002Fworkshop\u002Fsuperpowers-to-trae\u002Fcli\u002Ftemplates\u002Fbob\u002F$pair\" \\\n            \"$TMP_REWRITE\u002F$pair\" | head -60\ndone\n```\n\n**同时检查上游有没有新增超出映射表的文件**——这是为了防止映射表过时漏掉新文件：\n\n```bash\necho \"=== 上游全部 templates 文件 ===\"\nfind \u002Ftmp\u002Frun-bob-sync\u002Fsrc\u002Ftemplates -type f\n```\n\n把上游列表跟映射表对比，**新增的非 md 文件提醒用户**（例如又冒出来个新 `*.java` 模板），由用户决定是否要扩 cli 安装逻辑——本 skill 不动。\n\n### Step 5 — 强制覆盖 5 个 md 文件（已 sed 改写）\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\n\ncp $TMP_REWRITE\u002Fskills\u002Fbob-identify.md cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Fskills\u002Fbob-onion.md    cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Fskills\u002Fbob-spec.md     cli\u002Ftemplates\u002Fbob\u002Fskills\u002F\ncp $TMP_REWRITE\u002Froot\u002FBOB.md            cli\u002Ftemplates\u002Fbob\u002Froot\u002F\ncp $TMP_REWRITE\u002Froot\u002FREADME-RUN-BOB.md cli\u002Ftemplates\u002Fbob\u002Froot\u002F\n\n# 防御性检查：确认没有任何残留 ARCHITECTURE.md 字串\necho \"--- 检查残留 ARCHITECTURE.md 字串（应当只有零结果） ---\"\ngrep -rn 'ARCHITECTURE\\.md' cli\u002Ftemplates\u002Fbob\u002F || echo \"(clean)\"\n\ngit status --short cli\u002Ftemplates\u002Fbob\u002F\n```\n\n如果 grep 命中任何 `ARCHITECTURE.md` → **停下来**，sed 替换可能没覆盖所有引用形式（如带反斜杠的 markdown link），手工修复后再继续。\n\n### Step 6 — 跑全套测试\n\n```bash\nmake test\n```\n\n74+ 项必须全绿。失败 → 修，不继续装。常见失败：\n\n| 失败 | 原因 \u002F 处理 |\n|---|---|\n| frontmatter `name` 字段校验失败 | 上游某个 skill 改了 frontmatter，cli 校验规则不接受 → 看 `cli\u002Fsrc\u002Ftemplates.rs` 调一下 |\n| bob_install_creates_skills_and_root_files 失败 | 上游加了 \u002F 删了 skill → 改 `cli\u002Fsrc\u002Faddons\u002Fbob.rs` 测试断言 |\n| 其它 hard-coded 路径校验失败 | 上游新增了硬编码路径 → 看 cli 是否需要相应更新 |\n\n### Step 7 — 更新 Cargo.toml 里的 run_bob_version\n\n把 `cli\u002FCargo.toml` 的 `[package.metadata.upstream].run_bob_version = \"\u003C旧 SHA>\"` 改成 `\"\u003C新 UPSTREAM_SHA>\"`。这一步与 Step 8 的 version bump 一起改 Cargo.toml，可一次性完成。\n\n### Step 8 — Bump cli 版本\n\n读 `cli\u002FCargo.toml` 当前版本，按上游变更影响判断：\n\n| 上游变化范围 | cli bump |\n|---|---|\n| 仅文档措辞改动（README \u002F 注释） | patch (0.4.0 → 0.4.1) |\n| skill 内容增量（加了规则 \u002F 反模式 \u002F 示例） | patch (0.4.0 → 0.4.1) |\n| skill frontmatter 改名 \u002F 删了 skill \u002F 加了新 skill | minor (0.4.0 → 0.5.0) |\n| 上游新增非 md 文件且决定移植 → 改 cli 代码 | minor (0.4.0 → 0.5.0) |\n\n### Step 9 — Commit + Tag + Push\n\n```bash\ncd ~\u002Fworkshop\u002Fsuperpowers-to-trae\ngit add -A\ngit commit -m \"$(cat \u003C\u003CEOF\nchore(bob): sync run-bob upstream → $UPSTREAM_SHA\n\n主要变更（从 Step 4 diff 摘）:\n- \u003C要点 1>\n- \u003C要点 2>\n\ncli bump: \u003C旧版> → \u003C新版>\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003Cnoreply@anthropic.com>\nEOF\n)\"\n\ngit tag v\u003C新 cli 版本>\ngit push origin main --tags\n```\n\nGitHub Actions 会基于 tag 自动出 release（如已配）。如未配，提示用户去 GitHub UI 手动发 release。\n\n### Step 10 — 输出消费者升级通知\n\n把以下 markdown 文案**原样输出**到对话里，告诉用户\"复制这段发给订阅你的人\"：\n\n````markdown\n🎉 superpowers-to-trae 已升级到 **v\u003C新 cli 版本>**（同步上游 run-bob `\u003CUPSTREAM_SHA>`）。\n\n## 升级二进制（消费者跑）\n\n```bash\n# Linux + macOS + Windows (bash\u002Fzsh\u002Fgit-bash)\ncargo install --git https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae.git superpowers-trae --force\n```\n\n## 升级项目内的 bob 插件\n\n二进制装好后，进到自己的项目根目录跑：\n\n```bash\nsuperpowers-trae upgrade --addons bob\n```\n\n`BOB.md` 是 install-once，不会被覆盖；3 个 bob skill + README-RUN-BOB.md 会刷成最新。\n\n## 主要变更\n\n\u003C这里粘 Step 4 diff 摘的要点>\n````\n\n## 失败处理\n\n| 失败点 | 行为 |\n|---|---|\n| Step 1 工作树脏 | 终止，让用户先 commit \u002F stash |\n| Step 2 git clone 网络失败 | 原文输出错误，让用户检查代理 \u002F GitHub 可达性 |\n| Step 3 SHA 一致 | 终止流程，告诉用户\"已是最新\"，不做空 commit |\n| Step 4 上游有新增非映射文件 | 不阻断；汇报给用户由其决定是否扩映射 |\n| Step 5 sed 残留 `ARCHITECTURE.md` | 停下，让用户手工修（可能是带反斜杠\u002F链接的边界情况）|\n| Step 6 测试挂 | 把失败用例贴出来，停下让用户判断（修 cli 代码 vs. 退回上一版） |\n| Step 9 push 被拒（无权限 \u002F 网络）| 原样输出 git 错误，不要 force push，让用户处理 |\n\n## 不做\n\n- 不自动 stash \u002F reset --hard——脏工作树留给用户决定\n- 不跳过测试——发版必须全绿\n- 不动 `claude-md-merge.md`——这是 trae 专用文件\n- 不自动移植上游新增的非 md 模板（如 Java 文件）——属 cli 安装逻辑变更\n- 不修改 git 配置 \u002F 不改远端 \u002F 不强 push\n- 不替消费者执行 install——本 skill 只产出通知文案\n\n## 与其它 skill 的区别\n\n| skill | 用途 | 操作对象 |\n|---|---|---|\n| **sync-run-bob**（本 skill）| 维护者：同步 run-bob 上游 | `cli\u002Ftemplates\u002Fbob\u002F` + 发版 |\n| sync-ddd-run | 维护者：同步 ddd-run 上游 | `cli\u002Ftemplates\u002Fddd\u002F` + 发版 |\n| update-from-upstream | 维护者：同步 obra\u002Fsuperpowers 上游 | `upstream\u002F` + `dist\u002F` + 发版 |\n| install-superpowers-trae | 消费者：拉 binary | `~\u002F.cargo\u002Fbin\u002F` |\n",{"name":5,"description":7},"3e3bc6cfe459248bb69acbd0e0e546ce7e5b842b",".claude\u002Fskills\u002Fsync-run-bob",0,"https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae","https:\u002F\u002Fgithub.com\u002Famwtke","2026-05-09 16:09:50",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add amwtke\u002Fsuperpowers-to-trae --skill sync-run-bob",{"tool":53,"command":54},"bunx","bunx skills add amwtke\u002Fsuperpowers-to-trae --skill sync-run-bob",{"tool":56,"command":57},"pnpm","pnpm dlx skills add amwtke\u002Fsuperpowers-to-trae --skill sync-run-bob","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsync-run-bob\u002FSKILL.md",true,[],[62,87,106,126,141,163],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":77,"publishedAt":36},"01M71Q0GPS4KBXHKBMHQFT9W87","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Fwriting-skills\u002FSKILL.md",[68,69,72],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":70,"categoryName":71,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[78,79,80,81,82,83,84,85,86],"writing","writing skills","Existing","new","when","work","editing","deployment","use",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":95,"publishedAt":36},"01M71Q0FA7VRWAJG5CV19M5YVR","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Fwriting-plans\u002FSKILL.md",[93,94],{"categoryNo":70,"categoryName":71,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},[78,96,97,98,86,82,99,100,101,102,103,104,105],"writing plans","plans","for","you","requirements","code","task","multi","spec","multi-step task",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":36},"01M71Q0D9J5VE91MSCX3T8BF7P","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Fverification-before-completion\u002FSKILL.md",[],[113,114,115,116,117,83,118,119,82,120,86,121,122,123,124,125],"verification","verification before completion","output","commands","about","claims","committing","claim","prs","assertions","complete","running","evidence",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":36},"01M71Q0BFN0CGY5X8KAVHPA7D8","using-superpowers","Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Fusing-superpowers\u002FSKILL.md",[],[133,134,135,136,137,138,139,140,86,82],"using superpowers","superpowers","conversation","how","find","questions","tool","how to",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":36},"01M71Q09AC9E2HR7RS2AP9QYZ7","using-git-worktrees","Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Fusing-git-worktrees\u002FSKILL.md",[],[148,149,150,151,152,153,154,155,156,157,158,83,82,159,97,86,160,161,162],"git","Using git","worktrees","git worktrees","using git worktrees","fallback","isolation","Tools","native","worktree","git worktree","feature","via","workspace","implementation",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":36},"01M71Q07QBK64JB67F10R9ZRBT","test-driven-development","Use when implementing any feature or bugfix, before writing implementation code","https:\u002F\u002Fgithub.com\u002Famwtke\u002Fsuperpowers-to-trae\u002Fblob\u002Fmain\u002Fupstream\u002Fskills\u002Ftest-driven-development\u002FSKILL.md",[169],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[171,172,173,174,162,86,159,175,101,82,78,176],"development","test","driven","test driven development","bugfix","implementing"]