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