{"id":"26de541b-67b9-453f-aa45-17ada126e205","shortId":"ukzdS3","kind":"skill","title":"forge-status","tagline":"查看并清理 .forge/active.md 里登记的并行会话记录。扫描所有\"进行中\"条目，\n基于硬信号（worktree 目录是否存在、分支是否已合并到 main）判断哪些是僵尸记录，\n列清单 → 用户一次 y/n 确认 → 批量清理。\n不使用时间戳、不使用启发式\"超过 N 小时算失联\"，完全依赖 git / 文件系统现实状态。\n触发方式：用户说\"forge 状态\"、\"看下谁在跑\"、\"清理 worktree\"、\"forge-status\"、\n新会话启动 forge-bugfix / forge-prd / forge-eng 时 P0 阶段主动调用（只","description":"> **文档落地路径**：遵循 forge-doc-policy 规范。完整白名单 + frontmatter schema 见\n> `~/claudecode_workspace/工具/forge-cookbook/skills/forge-doc-policy/doc-paths.md`。\n\n# /forge-status：并行会话巡检 + 清理\n\n## 设计哲学\n\n**只读扫描 + 一次确认 + 硬信号判定。**\n\n- 多会话并行的心跳文件是 `.forge/active.md`，由 forge-bugfix / forge-prd / forge-eng 在领取任务时追加、由 forge-fupan 在会话结束时清理\n- 但人会漏复盘、会话会崩掉、worktree 可能被手动删，导致 active.md 里残留\"僵尸\"记录\n- 本 skill 专治僵尸：扫一遍表 → 按硬信号判活/死 → 让你确认后清理\n\n**硬信号（僵尸判定）**：\n- 对应 worktree 目录不存在 → 真·已弃用或已清理\n- 对应分支已 `merged` 到 main/master → 真·已完成，只是漏清理\n- 以上两个都不满足 → 真·活跃，保留\n\n**明确不用的信号**：\n- ❌ 时间戳 / \"超过 N 小时\" / \"启动超过 N 天\"——这些不代表工作完成\n- ❌ 最近 commit 时间——AI 慢不等于僵尸\n- ❌ 进程存活检查——Claude Code 会话结束后进程就没了，不代表工作废弃\n\n**Dev server 附加巡检（不参与僵尸判定）**：\n- 可以报告 `.devserver.json`、tmux session、监听端口、PID、cwd，帮助用户发现多余前后端\n- 这些信息只用于\"有哪些服务在跑\"的可见性，不用于判定 `.forge/active.md` 的会话是否僵尸\n- 如需停止服务，优先提示用户在对应 worktree 内运行项目自己的 `npm run dev:stop` / `scripts/dev-stack.sh stop`\n\n## 两种调用模式\n\n| 模式 | 调用方 | 行为 |\n|---|---|---|\n| **交互清理**（默认）| 用户说 `/forge-status` / \"看下 forge 状态\" / \"清理 worktree\" | 扫 → 报告 → 问 y/n → 清理 |\n| **只读巡检** | forge-bugfix / forge-prd / forge-eng 的 P0 阶段自动调用 | 扫 → 只报告\"当前有 N 个活跃会话，其中 M 个疑似僵尸\"，不清理 |\n\n调用方通过自然语言区分：\n- 用户直接触发 → 走交互清理\n- 其他 skill 委托 → 在调用文本中说\"只读巡检，不要清理\"\n\n## 流程\n\n### 步骤 0：前置定位\n\n```bash\n_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)\nACTIVE=\"$_ROOT/.forge/active.md\"\n\nif [ ! -f \"$ACTIVE\" ]; then\n  echo \"（本项目暂无 .forge/active.md，说明还没用过并行化流程）\"\n  exit 0\nfi\n```\n\n### 步骤 1：解析 active.md\n\n读 `.forge/active.md` 的\"进行中会话\"节，按行解析字段：\n```\n- session: <id> / worktree: <path> / 任务: <id> / 域: <domains>\n```\n\n跳过注释行（`<!--`、`-->`）和空行。\n\n### 步骤 2：逐条硬信号判定\n\n对每条记录：\n\n```bash\n# 1) worktree 是否存在\nif [ ! -d \"$WT_PATH\" ]; then\n  verdict=\"已删除\"  # 可清理\n  reason=\"worktree 目录不存在\"\n  continue\nfi\n\n# 2) 分支是否已合并到 main（或 master）\n_MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|^refs/remotes/origin/||' || echo \"main\")\n_WT_BRANCH=$(git -C \"$WT_PATH\" branch --show-current 2>/dev/null)\nif git branch --merged \"$_MAIN_BRANCH\" 2>/dev/null | grep -qE \"^\\s*${_WT_BRANCH}$\"; then\n  verdict=\"已合并\"  # 可清理\n  reason=\"分支 ${_WT_BRANCH} 已合并到 ${_MAIN_BRANCH}\"\n  continue\nfi\n\n# 3) 两个都不满足 → 活跃\nverdict=\"活跃\"\nreason=\"worktree 存在 + 分支未合并\"\n```\n\n### 步骤 3：生成报告\n\n按判定分组输出：\n\n```\n📋 .forge/active.md 巡检结果\n\n✅ 活跃（保留）：\n  - abc-123 / bf-0419-1 / 域:asr      worktree 存在 + 未合并\n  - def-456 / feat-12   / 域:player   worktree 存在 + 未合并\n\n🗑️ 疑似僵尸（建议清理）：\n  - ghi-789 / bf-0418-2 / 域:auth     worktree 目录不存在\n  - jkl-012 / bf-0419-3 / 域:asr      分支已合并到 main\n\n合计：活跃 2 条 / 待清理 2 条\n```\n\n### 步骤 3.5：Dev server 附加巡检\n\n只报告，不清理、不作为 active.md 僵尸判定依据：\n\n```bash\necho \"🖥️ Dev server 附加巡检（只读，不参与僵尸判定）\"\n\nfind \"$_ROOT\" \"$_ROOT/.worktrees\" -name .devserver.json -print 2>/dev/null | while read -r f; do\n  echo \"- devserver: $f\"\n  cat \"$f\" 2>/dev/null\ndone\n\ntmux ls 2>/dev/null | grep -E \"dev|frontend|backend|info2action\" || true\n\nfor port in 3000 3001 3456 3567 3568 3600 5173 8000 8080 8100; do\n  PID=$(lsof -ti :\"$port\" -sTCP:LISTEN 2>/dev/null | head -1)\n  if [ -n \"$PID\" ]; then\n    CWD=$(lsof -p \"$PID\" 2>/dev/null | awk '$4==\"cwd\"{print $9}')\n    echo \"- port $port: PID=$PID cwd=$CWD\"\n  fi\ndone\n```\n\n报告中明确写：\n\n```\n说明：上面的 dev server 只说明\"有服务在跑\"，不说明 active.md 里的任务已完成或已废弃。\n```\n\n### 步骤 4：分模式处理\n\n#### 模式 A：交互清理（默认）\n\n用户触发时，通过 AskUserQuestion：\n\n```\n发现 2 条疑似僵尸，要清理吗？\n\nA) 全部清理 — 从 .forge/active.md 删除上述 2 条（推荐，硬信号已确认）\nB) 我要逐条看 — 一条一条确认\nC) 先不清 — 只报告，暂不改文件\n```\n\n- A) → 批量 Edit active.md 删除对应行，同步把 backlog.md 里对应 bug 的\"领取会话\"字段改回 `—`、状态改为 `resolved`（如果分支已合并）或保持 `pending`（如果 worktree 被删除且未合并，视为放弃）\n- B) → 逐条 AskUserQuestion 确认\n- C) → 不改任何文件\n\n#### 模式 B：只读巡检（被其他 skill 调用）\n\n不 AskUserQuestion，直接输出报告：\n\n```\n（被 forge-bugfix P0 调用，只读模式）\n\n当前 .forge/active.md 状态：\n- 活跃会话：2\n- 疑似僵尸：2（建议用户稍后 /forge-status 清理）\n\n返回供调用方参考。\n```\n\n## backlog.md 联动清理\n\n从 `.forge/active.md` 删除一条记录后，如果该任务在 `docs/bugfix/backlog.md` 仍显示 `in-progress`：\n\n- 如果判定为\"已合并\" → backlog 状态改 `resolved`，剪切到\"🗄️ 已处理\"对应月份，清空\"领取会话\"字段\n- 如果判定为\"已删除\"（worktree 不存在且分支未合并）→ backlog 状态改回 `pending`，清空\"领取会话\"字段（视为本次放弃，下次可重新领取）\n\n## 铁律\n\n1. **不得基于时间戳判定僵尸**。只认 worktree 存在性 + 分支合并状态。\n2. **清理前必须让用户确认**（除非处于只读巡检模式）。\n3. **批量清理只在用户选 A) 时执行**，模糊回复默认走 B) 逐条确认。\n4. **backlog.md 和 active.md 必须联动**，不能只清 active 留 backlog 挂着\"领取会话\"。\n5. **不主动删 worktree 目录或分支**。这是 forge-bugfix P7 的职责，/forge-status 只改文档记录。\n6. **Dev server 巡检不得参与僵尸判定**。进程存在不代表任务活跃，进程不存在也不代表任务废弃。\n\n## 典型使用场景\n\n**场景 1：早上打开电脑**\n```\n用户：/forge-status\nAI：扫一遍 → 昨天有 3 个会话，2 个已合并（漏复盘）、1 个还活着 → 问清理 → 清掉 2 条\n```\n\n**场景 2：新窗口启动 bugfix**\n```\nforge-bugfix P0 调用 /forge-status（只读）\n→ 报告\"当前活跃 2 个会话，域 asr 和 player 已被占用\"\n→ forge-bugfix 据此在 P2 推荐时规避撞车\n```\n\n**场景 3：worktree 手动清理后**\n```\n用户手动跑了 git worktree remove（没走 P7 流程）\n下次 /forge-status 会发现 worktree 目录不存在 → 自动提示清理 active 记录\n```","tags":["forge","status","skills","yike-gunshi","agent-skills","ai-development","claude-code","skill-md","skillsmp"],"capabilities":["skill","source-yike-gunshi","skill-forge-status","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-status","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 (4,631 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.490Z","embedding":null,"createdAt":"2026-04-24T07:03:39.003Z","updatedAt":"2026-05-18T19:07:34.490Z","lastSeenAt":"2026-05-18T19:07:34.490Z","tsv":"'-012':393 '-0418':386 '-0419':365,395 '-1':366,480 '-12':375 '-123':363 '-2':387 '-3':396 '-456':373 '-789':384 '/claudecode_workspace':64 '/dev/null':236,301,318,326,432,444,449,478,490 '/forge-cookbook/skills/forge-doc-policy/doc-paths.md':66 '/forge-status':67,180,596,671,684,708,737 '0':224,249 '1':252,272,634,681,693 '2':235,268,288,300,317,325,403,406,431,443,448,477,489,526,534,592,594,640,690,697,700,712 '3':345,355,643,688,726 '3.5':409 '3000':460 '3001':461 '3456':462 '3567':463 '3568':464 '3600':465 '4':492,516,650 '5':661 '5173':466 '6':673 '8000':467 '8080':468 '8100':469 '9':495 'abc':362 'activ':238,242,656,742 'active.md':97,254,416,513,548,653 'ai':138,685 'askuserquest':524,568,579 'asr':368,398,715 'auth':389 'awk':491 'b':538,566,573,648 'backend':454 'backlog':612,625,658 'backlog.md':551,599,651 'bash':226,271,418 'bf':364,385,394 'branch':294,308,313,321,324,331,339,342 'bug':553 'bugfix':42,79,194,584,668,702,705,721 'c':310,541,570 'cat':441 'claud':141 'code':142 'commit':136 'continu':286,343 'current':316 'cwd':155,485,493,501,502 'd':276 'def':372 'dev':145,169,410,420,452,508,674 'devserv':439 'devserver.json':150,429 'doc':57 'docs/bugfix/backlog.md':605 'done':445,504 'e':451 'echo':244,305,419,438,496 'edit':547 'eng':48,85,200 'exit':248 'f':241,436,440,442 'feat':374 'fi':250,287,344,503 'find':425 'forg':2,31,37,41,44,47,56,78,81,84,89,182,193,196,199,583,667,704,720 'forge-bugfix':40,77,192,582,666,703,719 'forge-doc-polici':55 'forge-eng':46,83,198 'forge-fupan':88 'forge-prd':43,80,195 'forge-status':1,36 'forge/active.md':5,75,161,246,256,358,532,589,602 'frontend':453 'frontmatt':61 'fupan':90 'ghi':383 'git':27,228,295,309,320,730 'grep':327,450 'head':479 'in-progress':607 'info2action':455 'jkl':392 'listen':476 'ls':447 'lsof':472,486 'm':210 'main':14,290,293,306,323,341,400 'main/master':118 'master':292 'merg':116,322 'n':24,129,132,207,482 'name':428 'npm':167 'p':487 'p0':50,202,585,706 'p2':723 'p7':669,734 'pars':231 'path':278,312 'pend':561,627 'pid':154,471,483,488,499,500 'player':377,717 'polici':58 'port':458,474,497,498 'prd':45,82,197 'print':430,494 'progress':609 'pwd':237 'qe':328 'r':435 'read':434 'reason':283,336,350 'ref':298 'refs/remotes/origin':304 'refs/remotes/origin/head':299 'remov':732 'resolv':558,614 'rev':230 'rev-pars':229 'root':227,426 'root/.forge/active.md':239 'root/.worktrees':427 'run':168 'schema':62 'scripts/dev-stack.sh':171 'sed':302 'server':146,411,421,509,675 'session':152,261 'show':233,315 'show-curr':314 'show-toplevel':232 'skill':102,217,576 'skill-forge-status' 'source-yike-gunshi' 'status':3,38 'stcp':475 'stop':170,172 'symbol':297 'symbolic-ref':296 'ti':473 'tmux':151,446 'topic-agent-skills' 'topic-ai-development' 'topic-claude-code' 'topic-forge' 'topic-skill-md' 'topic-skillsmp' 'toplevel':234 'true':456 'verdict':280,333,348 'worktre':11,35,94,111,165,185,262,273,284,351,369,378,390,563,623,637,663,727,731,739 'wt':277,307,311,330,338 'y/n':18,189 '一条一条确认':540 '一次确认':72 '上面的':507 '下次':736 '下次可重新领取':632 '不':578 '不主动删':662 '不代表工作废弃':144 '不作为':415 '不使用启发式':22 '不使用时间戳':21 '不参与僵尸判定':148,424 '不存在且分支未合并':624 '不得基于时间戳判定僵尸':635 '不改任何文件':571 '不清理':212,414 '不用于判定':160 '不能只清':655 '不要清理':221 '不说明':512 '专治僵尸':103 '两个都不满足':346 '两种调用模式':173 '个会话':689,713 '个已合并':691 '个活跃会话':208 '个疑似僵尸':211 '个还活着':694 '交互清理':177,520 '仍显示':606 '从':531,601 '以上两个都不满足':122 '任务':263 '优先提示用户在对应':164 '会发现':738 '会话会崩掉':93 '会话结束后进程就没了':143 '但人会漏复盘':92 '保留':125,361 '僵尸':99 '僵尸判定':109 '僵尸判定依据':417 '先不清':542 '全部清理':530 '其中':209 '其他':216 '典型使用场景':679 '内运行项目自己的':166 '分支':337 '分支合并状态':639 '分支已合并到':399 '分支是否已合并到':13,289 '分支未合并':353 '分模式处理':517 '列清单':16 '删除一条记录后':603 '删除上述':533 '删除对应行':549 '判断哪些是僵尸记录':15 '到':117 '前置定位':225 '剪切到':615 '发现':525 '只':52 '只报告':205,413,543 '只改文档记录':672 '只是漏清理':121 '只认':636 '只说明':510 '只读':423,709 '只读巡检':191,220,574 '只读扫描':71 '只读模式':587 '可以报告':149 '可清理':282,335 '可能被手动删':95 '合计':401 '同步把':550 '启动超过':131 '和':652,716 '和空行':266 '在会话结束时清理':91 '在调用文本中说':219 '在领取任务时追加':86 '场景':680,699,725 '域':264,367,376,388,397,714 '基于硬信号':10 '多会话并行的心跳文件是':74 '天':133 '如果':562 '如果分支已合并':559 '如果判定为':610,621 '如果该任务在':604 '如需停止服务':163 '委托':218 '字段':620,630 '字段改回':556 '存在':352,370,379 '存在性':638 '完全依赖':26 '完整白名单':60 '对应':110 '对应分支已':115 '对应月份':617 '对每条记录':270 '导致':96 '小时':130 '小时算失联':25 '巡检不得参与僵尸判定':676 '巡检结果':359 '工具':65 '已删除':281,622 '已合并':334,611 '已合并到':340 '已处理':616 '已完成':120 '已弃用或已清理':114 '已被占用':718 '帮助用户发现多余前后端':156 '并行会话巡检':68 '建议清理':382 '建议用户稍后':595 '当前':588 '当前有':206 '当前活跃':711 '待清理':405 '必须联动':654 '慢不等于僵尸':139 '我要逐条看':539 '或':291 '或保持':560 '手动清理后':728 '扫':186,204 '扫一遍':686 '扫一遍表':104 '扫描所有':7 '批量':546 '批量清理':20 '批量清理只在用户选':644 '报告':187,710 '报告中明确写':505 '挂着':659 '按判定分组输出':357 '按硬信号判活':105 '按行解析字段':260 '据此在':722 '推荐':536 '推荐时规避撞车':724 '文件系统现实状态':28 '文档落地路径':53 '新会话启动':39 '新窗口启动':701 '早上打开电脑':682 '时':49 '时执行':646 '时间':137 '时间戳':127 '明确不用的信号':126 '昨天有':687 '是否存在':274 '暂不改文件':544 '最近':135 '有哪些服务在跑':158 '有服务在跑':511 '未合并':371,380 '本':101 '本项目暂无':245 '条':404,407,535,698 '条疑似僵尸':527 '条目':9 '查看并清理':4 '模式':174,518,572 '模糊回复默认走':647 '步骤':223,251,267,354,408,515 '死':106 '没走':733 '活跃':124,347,349,360,402 '活跃会话':591 '流程':222,735 '清掉':696 '清理':34,69,184,190,597 '清理前必须让用户确认':641 '清空':618,628 '漏复盘':692 '状态':32,183,590 '状态改':613 '状态改为':557 '状态改回':626 '生成报告':356 '用户':683 '用户一次':17 '用户手动跑了':729 '用户直接触发':214 '用户触发时':522 '用户说':30,179 '由':76,87 '留':657 '疑似僵尸':381,593 '的':201,257,554 '的会话是否僵尸':162 '的可见性':159 '的职责':670 '监听端口':153 '目录不存在':112,285,391,740 '目录或分支':664 '目录是否存在':12 '直接输出报告':580 '看下':181 '看下谁在跑':33 '真':113,119,123 '硬信号':108 '硬信号判定':73 '硬信号已确认':537 '确认':19,569 '联动清理':600 '自动提示清理':741 '节':259 '行为':176 '被':581 '被其他':575 '被删除且未合并':564 '要清理吗':528 '见':63 '规范':59 '视为放弃':565 '视为本次放弃':631 '解析':253 '触发方式':29 '让你确认后清理':107 '记录':100,743 '设计哲学':70 '说明':506 '说明还没用过并行化流程':247 '读':255 '调用':577,586,707 '调用方':175 '调用方通过自然语言区分':213 '走交互清理':215 '超过':23,128 '跳过注释行':265 '返回供调用方参考':598 '这些不代表工作完成':134 '这些信息只用于':157 '这是':665 '进程不存在也不代表任务废弃':678 '进程存在不代表任务活跃':677 '进程存活检查':140 '进行中':8 '进行中会话':258 '逐条':567 '逐条硬信号判定':269 '逐条确认':649 '通过':523 '遵循':54 '里对应':552 '里残留':98 '里登记的并行会话记录':6 '里的任务已完成或已废弃':514 '铁律':633 '问':188 '问清理':695 '阶段主动调用':51 '阶段自动调用':203 '附加巡检':147,412,422 '除非处于只读巡检模式':642 '领取会话':555,619,629,660 '默认':178,521","prices":[{"id":"1ccba7aa-0255-4220-bdf1-04a8a09ab3ca","listingId":"26de541b-67b9-453f-aa45-17ada126e205","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:39.003Z"}],"sources":[{"listingId":"26de541b-67b9-453f-aa45-17ada126e205","source":"github","sourceId":"yike-gunshi/forge-skills/forge-status","sourceUrl":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-status","isPrimary":false,"firstSeenAt":"2026-04-24T07:03:39.003Z","lastSeenAt":"2026-05-18T19:07:34.490Z"}],"details":{"listingId":"26de541b-67b9-453f-aa45-17ada126e205","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"yike-gunshi","slug":"forge-status","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":"ca11124ef23bb634540940662ccfbee2ba8a7417","skill_md_path":"skills/forge-status/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/yike-gunshi/forge-skills/tree/main/skills/forge-status"},"layout":"multi","source":"github","category":"forge-skills","frontmatter":{"name":"forge-status","description":"查看并清理 .forge/active.md 里登记的并行会话记录。扫描所有\"进行中\"条目，\n基于硬信号（worktree 目录是否存在、分支是否已合并到 main）判断哪些是僵尸记录，\n列清单 → 用户一次 y/n 确认 → 批量清理。\n不使用时间戳、不使用启发式\"超过 N 小时算失联\"，完全依赖 git / 文件系统现实状态。\n触发方式：用户说\"forge 状态\"、\"看下谁在跑\"、\"清理 worktree\"、\"forge-status\"、\n新会话启动 forge-bugfix / forge-prd / forge-eng 时 P0 阶段主动调用（只读模式）。"},"skills_sh_url":"https://skills.sh/yike-gunshi/forge-skills/forge-status"},"updatedAt":"2026-05-18T19:07:34.490Z"}}