{"id":"fd694b68-3a43-4d54-aeee-3ed85637700b","shortId":"XrZqq7","kind":"skill","title":"forge-ship","tagline":"发布工作流：检测并合并基础分支、运行测试、审查 diff、\n更新 CHANGELOG、提交、推送、创建 PR。","description":"> **文档落地路径**：遵循 forge-doc-policy 规范。完整白名单 + frontmatter schema 见\n> `~/claudecode_workspace/工具/forge-cookbook/skills/forge-doc-policy/doc-paths.md`。\n\n# /forge-ship：发布上线\n\n## 前置脚本（每次先运行）\n\n```bash\n_BRANCH=$(git branch --show-current 2>/dev/null || echo \"unknown\")\necho \"当前分支: $_BRANCH\"\ngit status --short\n```\n\n---\n\n## AskUserQuestion 格式规范\n\n每次提问结构：\n1. **重新聚焦**：当前项目、分支、当前正在做的步骤\n2. **通俗解释**：说清楚需要决策的内容\n3. **给出建议**：推荐选项 + 一句话原因\n4. **列出选项**：`A) B) C)`\n\n---\n\n## 第0步：确定基础分支\n\n```bash\n# 1. 检查是否已有 PR\ngh pr view --json baseRefName -q .baseRefName 2>/dev/null\n\n# 2. 没有 PR 则获取仓库默认分支\ngh repo view --json defaultBranchRef -q .defaultBranchRef.name 2>/dev/null\n\n# 3. 都失败则回退到 main\n```\n\n---\n\n## 第1步：审查就绪检查\n\n```bash\n# 检查是否有未提交的更改\ngit status --short\n\n# 查看与基础分支的差异摘要\ngit fetch origin <基础分支> --quiet\ngit diff origin/<基础分支> --stat\ngit log origin/<基础分支>..HEAD --oneline\n```\n\n如果有未提交的更改，通过 AskUserQuestion 询问：\n- A) 将所有更改加入暂存区并提交（推荐）\n- B) 交互式选择要提交的文件\n- C) 先停下来，让我处理这些更改\n\n---\n\n## 第2步：合并基础分支（获取最新代码）\n\n```bash\ngit fetch origin <基础分支>\ngit merge origin/<基础分支> --no-edit\n```\n\n如果有合并冲突：\n1. 列出所有冲突文件\n2. 通过 AskUserQuestion 逐一询问解决方式\n3. 帮助解决冲突\n4. 提交合并结果\n\n---\n\n## 第3步：运行测试\n\n按优先级依次尝试以下测试命令，直到找到可用的：\n\n```bash\n# 依次尝试，找到第一个成功的\nnpm test 2>/dev/null || \\\nyarn test 2>/dev/null || \\\ngo test ./... 2>/dev/null || \\\npython -m pytest 2>/dev/null || \\\ncargo test 2>/dev/null || \\\necho \"未找到测试命令\"\n```\n\n**如果测试失败**：\n1. 分析失败输出\n2. 判断是否是本次改动导致的\n3. 通过 AskUserQuestion 询问：\n   - A) 修复测试（推荐，如果失败与本次改动相关）\n   - B) 跳过测试（如果确认失败与本次改动无关）\n   - C) 停下来，我来处理\n\n**如果没有测试**：\n通过 AskUserQuestion 询问：\n- A) 现在为本次改动添加基础测试（推荐）\n- B) 跳过，直接继续发布\n\n---\n\n## 第4步：审查本次 diff\n\n```bash\ngit diff origin/<基础分支> --stat\ngit diff origin/<基础分支>\n```\n\n快速自检（不是完整的 `/forge-review`，是发布前的最后把关）：\n\n- [ ] 有没有调试代码遗留？（`console.log`、`print`、`debugger`、`byebug`）\n- [ ] 有没有硬编码的测试数据或密钥？\n- [ ] 有没有 `TODO: 上线前删除` 类型的注释？\n- [ ] 变更文件数量是否合理？（意外包含大量无关文件？）\n\n如果发现问题，通过 AskUserQuestion 确认是否修复。\n\n---\n\n## 第5步：更新 CHANGELOG\n\n读取现有 `CHANGELOG.md`（如果存在），基于 git log 生成本次发布记录：\n\n```bash\ngit log origin/<基础分支>..HEAD --oneline --no-merges\n```\n\n**CHANGELOG 格式**：\n```markdown\n## [版本号] - YYYY-MM-DD\n\n### 新增\n- 功能描述（来自 feat: 类型的提交）\n\n### 修复\n- 修复描述（来自 fix: 类型的提交）\n\n### 改进\n- 改进描述（来自 refactor:/perf: 类型的提交）\n\n### 其他\n- 其他改动\n```\n\n如果存在 `VERSION` 文件，询问是否需要升级版本号：\n- A) 升级补丁版本（如 1.0.0 → 1.0.1，Bug修复）\n- B) 升级次版本（如 1.0.0 → 1.1.0，新功能）\n- C) 升级主版本（如 1.0.0 → 2.0.0，破坏性变更）\n- D) 不升级版本号\n\n---\n\n## 第6步：最终提交\n\n如果有未提交的更改（CHANGELOG、VERSION 等）：\n\n```bash\ngit add CHANGELOG.md VERSION  # 只提交文档更新\ngit commit -m \"chore: 更新 CHANGELOG 和版本号 for v{version}\"\n```\n\n---\n\n## 第7步：推送\n\n```bash\ngit push origin <当前分支>\n```\n\n如果推送被拒绝（远端有新提交）：\n```bash\ngit pull origin <当前分支> --rebase\ngit push origin <当前分支>\n```\n\n---\n\n## 第8步：创建 PR\n\n```bash\n# 检查是否已有 PR\ngh pr view 2>/dev/null\n```\n\n如果没有 PR，生成 PR 描述并创建：\n\n**PR 标题格式**：`[类型] 一句话描述主要变更`（类型：feat/fix/refactor/chore）\n\n**PR 描述格式**：\n```markdown\n## 变更摘要\n- 主要改动1\n- 主要改动2\n\n## 测试情况\n- [ ] 单元测试通过\n- [ ] 手动测试通过（测试了哪些场景）\n\n## 注意事项\n（有特殊部署步骤、数据库迁移等提前说明）\n```\n\n```bash\ngh pr create \\\n  --title \"<PR标题>\" \\\n  --body \"<PR描述>\" \\\n  --base <基础分支>\n```\n\n---\n\n## 发布完成总结\n\n```\n+====================================================+\n|                  发布完成                            |\n+====================================================+\n| 分支：<当前分支>                                     |\n| 基础分支：<基础分支>                                  |\n| 提交数：X 个                                         |\n| 文件变更：X 个文件，+X 行，-X 行                       |\n| 测试：通过 / 跳过 / 新增                              |\n| 版本：X.X.X                                         |\n| PR：<PR URL>                                        |\n+====================================================+\n```\n\n---\n\n## 重要规则\n\n- **先合并，后发布** — 永远先把基础分支的最新代码合并进来\n- **测试失败不发布** — 除非明确确认失败与本次改动无关\n- **CHANGELOG 必须更新** — 让未来的自己和同事感谢你\n- **不要 force push** — 除非用户明确要求，且当前在功能分支上","tags":["forge","ship","skills","yike-gunshi","agent-skills","ai-development","claude-code","skill-md","skillsmp"],"capabilities":["skill","source-yike-gunshi","skill-forge-ship","topic-agent-skills","topic-ai-development","topic-claude-code","topic-forge","topic-skill-md","topic-skillsmp"],"categories":["forge-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/yike-gunshi/forge-skills/forge-ship","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add yike-gunshi/forge-skills","source_repo":"https://github.com/yike-gunshi/forge-skills","install_from":"skills.sh"}},"qualityScore":"0.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 11 github stars · SKILL.md body (3,736 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:07:34.402Z","embedding":null,"createdAt":"2026-04-24T07:03:38.917Z","updatedAt":"2026-05-18T19:07:34.402Z","lastSeenAt":"2026-05-18T19:07:34.402Z","tsv":"'/claudecode_workspace':26 '/dev/null':41,84,97,173,177,181,186,190,376 '/forge-cookbook/skills/forge-doc-policy/doc-paths.md':28 '/forge-review':237 '/forge-ship':29 '/perf':297 '1':53,73,153,194 '1.0.0':308,314,320 '1.0.1':309 '1.1.0':315 '2':40,58,83,85,96,155,172,176,180,185,189,196,375 '2.0.0':321 '3':61,98,159,198 '4':65,161 'add':333 'askuserquest':50,127,157,200,214,253 'b':68,132,206,219,311 'base':407 'baserefnam':80,82 'bash':33,72,103,140,167,225,265,331,349,356,369,401 'bodi':406 'branch':34,36,46 'bug修复':310 'byebug':243 'c':69,134,209,317 'cargo':187 'changelog':10,257,275,328,342,438 'changelog.md':259,334 'chore':340 'commit':338 'console.log':240 'creat':404 'current':39 'd':323 'dd':282 'debugg':242 'defaultbranchref':93 'defaultbranchref.name':95 'diff':8,115,224,227,232 'doc':19 'echo':42,44,191 'edit':151 'feat':286 'feat/fix/refactor/chore':387 'fetch':110,142 'fix':291 'forc':442 'forg':2,18 'forge-doc-polici':17 'forge-ship':1 'frontmatt':23 'gh':76,89,372,402 'git':35,47,105,109,114,119,141,145,226,231,262,266,332,337,350,357,362 'go':178 'head':123,270 'json':79,92 'log':120,263,267 'm':183,339 'main':100 'markdown':277,390 'merg':146,274 'mm':281 'no-edit':149 'no-merg':272 'npm':170 'onelin':124,271 'origin':111,116,121,143,147,228,233,268,352,359,364 'polici':20 'pr':14,75,77,87,368,371,373,378,380,382,388,403,431 'print':241 'pull':358 'push':351,363,443 'pytest':184 'python':182 'q':81,94 'quiet':113 'rebas':361 'refactor':296 'repo':90 'schema':24 'ship':3 'short':49,107 'show':38 'show-curr':37 'skill' 'skill-forge-ship' 'source-yike-gunshi' 'stat':118,230 'status':48,106 'test':171,175,179,188 'titl':405 'todo':246 'topic-agent-skills' 'topic-ai-development' 'topic-claude-code' 'topic-forge' 'topic-skill-md' 'topic-skillsmp' 'unknown':43 'v':345 'version':302,329,335,346 'view':78,91,374 'x':416,419,421,423 'x.x.x':430 'yarn':174 'yyyi':280 'yyyy-mm-dd':279 '一句话原因':64 '一句话描述主要变更':385 '上线前删除':247 '不升级版本号':324 '不是完整的':236 '不要':441 '且当前在功能分支上':445 '个':417 '个文件':420 '主要改动1':392 '主要改动2':393 '交互式选择要提交的文件':133 '依次尝试':168 '修复':288 '修复描述':289 '修复测试':203 '停下来':210 '先停下来':135 '先合并':433 '其他':299 '其他改动':300 '分支':56,411 '分析失败输出':195 '列出所有冲突文件':154 '列出选项':66 '则获取仓库默认分支':88 '创建':13,367 '判断是否是本次改动导致的':197 '前置脚本':31 '功能描述':284 '升级主版本':318 '升级次版本':312 '升级补丁版本':306 '单元测试通过':395 '发布上线':30 '发布完成':410 '发布完成总结':409 '发布工作流':4 '变更摘要':391 '变更文件数量是否合理':249 '只提交文档更新':336 '合并基础分支':138 '后发布':434 '和版本号':343 '基于':261 '基础分支':112,117,122,144,148,229,234,269,408,413,414 '如':307,313,319 '如果发现问题':251 '如果失败与本次改动相关':205 '如果存在':260,301 '如果推送被拒绝':354 '如果有合并冲突':152 '如果有未提交的更改':125,327 '如果没有':377 '如果没有测试':212 '如果测试失败':193 '如果确认失败与本次改动无关':208 '完整白名单':22 '审查':7 '审查就绪检查':102 '审查本次':223 '将所有更改加入暂存区并提交':130 '工具':27 '帮助解决冲突':160 '当前分支':45,353,360,365,412 '当前正在做的步骤':57 '当前项目':55 '必须更新':439 '快速自检':235 '意外包含大量无关文件':250 '我来处理':211 '手动测试通过':396 '找到第一个成功的':169 '按优先级依次尝试以下测试命令':165 '推荐':131,204,218 '推荐选项':63 '推送':12,348 '描述并创建':381 '描述格式':389 '提交':11 '提交合并结果':162 '提交数':415 '改进':293 '改进描述':294 '数据库迁移等提前说明':400 '文件':303 '文件变更':418 '文档落地路径':15 '新功能':316 '新增':283,428 '是发布前的最后把关':238 '更新':9,256,341 '最终提交':326 '有没有':245 '有没有硬编码的测试数据或密钥':244 '有没有调试代码遗留':239 '有特殊部署步骤':399 '未找到测试命令':192 '来自':285,290,295 '查看与基础分支的差异摘要':108 '标题格式':383 '格式':276 '格式规范':51 '检查是否已有':74,370 '检查是否有未提交的更改':104 '检测并合并基础分支':5 '每次先运行':32 '每次提问结构':52 '永远先把基础分支的最新代码合并进来':435 '没有':86 '注意事项':398 '测试':425 '测试了哪些场景':397 '测试失败不发布':436 '测试情况':394 '版本':429 '版本号':278 '现在为本次改动添加基础测试':217 '生成':379 '生成本次发布记录':264 '直到找到可用的':166 '直接继续发布':221 '破坏性变更':322 '确定基础分支':71 '确认是否修复':254 '第0步':70 '第1步':101 '第2步':137 '第3步':163 '第4步':222 '第5步':255 '第6步':325 '第7步':347 '第8步':366 '等':330 '类型':384,386 '类型的提交':287,292,298 '类型的注释':248 '给出建议':62 '获取最新代码':139 '行':422,424 '见':25 '规范':21 '让我处理这些更改':136 '让未来的自己和同事感谢你':440 '询问':128,201,215 '询问是否需要升级版本号':304 '说清楚需要决策的内容':60 '读取现有':258 '跳过':220,427 '跳过测试':207 '运行测试':6,164 '远端有新提交':355 '逐一询问解决方式':158 '通俗解释':59 '通过':126,156,199,213,252,426 '遵循':16 '都失败则回退到':99 '重新聚焦':54 '重要规则':432 '除非明确确认失败与本次改动无关':437 '除非用户明确要求':444","prices":[{"id":"0aaeaf44-174a-4c55-94e1-7a58fb9dd52a","listingId":"fd694b68-3a43-4d54-aeee-3ed85637700b","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"yike-gunshi","category":"forge-skills","install_from":"skills.sh"},"createdAt":"2026-04-24T07:03:38.917Z"}],"sources":[{"listingId":"fd694b68-3a43-4d54-aeee-3ed85637700b","source":"github","sourceId":"yike-gunshi/forge-skills/forge-ship","sourceUrl":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-ship","isPrimary":false,"firstSeenAt":"2026-04-24T07:03:38.917Z","lastSeenAt":"2026-05-18T19:07:34.402Z"}],"details":{"listingId":"fd694b68-3a43-4d54-aeee-3ed85637700b","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"yike-gunshi","slug":"forge-ship","github":{"repo":"yike-gunshi/forge-skills","stars":11,"topics":["agent-skills","ai-development","claude-code","forge","skill-md","skillsmp"],"license":"mit","html_url":"https://github.com/yike-gunshi/forge-skills","pushed_at":"2026-04-28T05:11:10Z","description":"Forge — 文档驱动的 AI 辅助开发框架 | Document-driven AI development framework with 14 Skills covering brainstorm → PRD → design → engineering → QA → review → ship → retrospective","skill_md_sha":"c7d132debe9361a32df33ab0e1fa724e1e32c780","skill_md_path":"skills/forge-ship/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-ship"},"layout":"multi","source":"github","category":"forge-skills","frontmatter":{"name":"forge-ship","description":"发布工作流：检测并合并基础分支、运行测试、审查 diff、\n更新 CHANGELOG、提交、推送、创建 PR。"},"skills_sh_url":"https://skills.sh/yike-gunshi/forge-skills/forge-ship"},"updatedAt":"2026-05-18T19:07:34.402Z"}}