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