名称:取消 描述:取消任何活跃的OMC模式(自动导航、ralph、超工作、超QA、群集、超导航、流水线、团队)
取消技能
智能取消,检测并取消活跃的OMC模式。
取消技能是完成和退出任何OMC模式的标准方式。
当停止钩子检测到工作完成时,它指示LLM调用此技能进行适当的状态清理。如果取消失败或被中断,使用--force标志重试,或等待2小时陈旧超时作为最后手段。
功能
自动检测哪个模式活跃并取消它:
- 自动导航:停止工作流,保留进度以便恢复
- Ralph:停止持久化循环,清除链接的超工作(如果适用)
- 超工作:停止并行执行(独立或链接)
- 超QA:停止QA循环工作流
- 群集:停止协调的代理群集,释放已认领的任务
- 超导航:停止并行自动导航工作器
- 流水线:停止顺序代理流水线
- 团队:向所有团队成员发送shutdown_request,等待响应,调用TeamDelete,清除链接的ralph(如果存在)
- 团队+Ralph(链接):首先取消团队(优雅关闭),然后清除ralph状态。取消链接的ralph时也首先取消团队。
使用方式
/oh-my-claudecode:cancel
或者说:“cancelomc”、“stopomc”
自动检测
/oh-my-claudecode:cancel遵循会话感知状态合约:
- 默认情况下,命令通过
state_list_active和state_get_status检查当前会话,导航.omc/state/sessions/{sessionId}/…以发现哪个模式活跃。 - 当提供会话ID或已知时,该会话范围路径是权威的。仅在会话ID缺失或为空时,才咨询
.omc/state/*.json中的遗留文件作为兼容性回退。 - 群集是共享的SQLite/标记模式(
.omc/state/swarm.db/.omc/state/swarm-active.marker),不是会话范围的。 - 默认清理流程调用
state_clear与会话ID,仅移除匹配的会话文件;模式保持绑定到其原始会话。
活跃模式仍按依赖顺序取消:
- 自动导航(包括链接的ralph/超QA/清理)
- Ralph(清理其链接的超工作或)
- 超工作(独立)
- 超QA(独立)
- 群集(独立)
- 超导航(独立)
- 流水线(独立)
- 团队(Claude Code原生)
- 计划共识(独立)
强制清除所有
当需要擦除每个会话加上遗留工件时,使用--force或--all,例如完全重置工作区。
/oh-my-claudecode:cancel --force
/oh-my-claudecode:cancel --all
底层步骤:
state_list_active枚举.omc/state/sessions/{sessionId}/…以找到每个已知会话。state_clear为每个会话运行一次以删除该会话的文件。- 没有
session_id的全局state_clear移除.omc/state/*.json、.omc/state/swarm*.db下的遗留文件和兼容性工件(见列表)。 - 团队工件(
~/.claude/teams/*/、~/.claude/tasks/*/、.omc/state/team-state.json)作为遗留回退部分尽力清除。
每个state_clear命令都尊重session_id参数,因此即使强制模式在删除遗留文件之前仍首先使用会话感知路径。
遗留兼容性列表(仅在--force/--all下移除):
.omc/state/autopilot-state.json.omc/state/ralph-state.json.omc/state/ralph-plan-state.json.omc/state/ralph-verification.json.omc/state/ultrawork-state.json.omc/state/ultraqa-state.json.omc/state/swarm.db.omc/state/swarm.db-wal.omc/state/swarm.db-shm.omc/state/swarm-active.marker.omc/state/swarm-tasks.db.omc/state/ultrapilot-state.json.omc/state/ultrapilot-ownership.json.omc/state/pipeline-state.json.omc/state/plan-consensus.json.omc/state/ralplan-state.json.omc/state/boulder.json.omc/state/hud-state.json.omc/state/subagent-tracking.json.omc/state/subagent-tracker.lock.omc/state/rate-limit-daemon.pid.omc/state/rate-limit-daemon.log.omc/state/checkpoints/(目录).omc/state/sessions/(清除会话后的空目录清理)
实现步骤
当调用此技能时:
1. 解析参数
# 检查--force或--all标志
FORCE_MODE=false
if [[ "$*" == *"--force"* ]] || [[ "$*" == *"--all"* ]]; then
FORCE_MODE=true
fi
2. 检测活跃模式
技能现在依赖会话感知状态合约,而不是硬编码文件路径:
- 调用
state_list_active枚举.omc/state/sessions/{sessionId}/…并发现每个活跃会话。 - 对于每个会话ID,调用
state_get_status以了解哪个模式正在运行(autopilot、ralph、ultrawork等)以及是否存在依赖模式。 - 如果向
/oh-my-claudecode:cancel提供了session_id,则完全跳过遗留回退,仅在该会话路径内操作;否则,仅当状态工具报告无活跃会话时,才咨询.omc/state/*.json中的遗留文件。群集保持为会话范围外的共享SQLite/标记模式。 - 本文档中的任何取消逻辑都反映通过状态工具发现的依赖顺序(自动导航 → ralph → …)。
3A. 强制模式(如果–force或–all)
使用强制模式通过state_clear清除每个会话加上遗留工件。直接文件移除保留用于状态工具报告无活跃会话时的遗留清理。
3B. 智能取消(默认)
如果团队活跃(Claude Code原生)
通过检查~/.claude/teams/中的配置文件来检测团队:
# 检查活跃团队
TEAM_CONFIGS=$(find ~/.claude/teams -name config.json -maxdepth 2 2>/dev/null)
两遍取消协议:
第一遍:优雅关闭
对于在~/.claude/teams/中找到的每个团队:
1. 读取config.json以获取team_name和成员列表
2. 对于每个非领导成员:
a. 通过SendMessage发送shutdown_request
b. 等待最多15秒以获取shutdown_response
c. 如果收到响应:成员终止并自动移除
d. 如果超时:标记成员为无响应,继续下一个
3. 日志:“优雅遍:X/Y成员响应”
第二遍:协调
优雅遍之后:
1. 重新读取config.json以检查剩余成员
2. 如果仅剩领导(或配置为空):继续TeamDelete
3. 如果仍有无响应成员:
a. 再等待5秒(他们可能仍在处理)
b. 再次重新读取config.json
c. 如果仍卡住:尝试TeamDelete
d. 如果TeamDelete失败:报告手动清理路径
TeamDelete + 清理:
1. 调用TeamDelete() — 移除~/.claude/teams/{name}/和~/.claude/tasks/{name}/
2. 清除团队状态:state_clear(mode="team")
3. 检查链接的ralph:state_read(mode="ralph") — 如果linked_team为true:
a. 清除ralph状态:state_clear(mode="ralph")
b. 清除链接的超工作(如果存在):state_clear(mode="ultrawork")
4. 运行孤儿扫描(见下文)
5. 发出结构化取消报告
孤儿检测(清理后):
TeamDelete后,验证无代理进程剩余:
node "${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-orphans.mjs" --team-name "{team_name}"
孤儿扫描器:
- 检查
ps aux(Unix)或tasklist(Windows)中具有--team-name匹配已删除团队的进程 - 对于每个团队配置不再存在的孤儿:发送SIGTERM,等待5秒,如果仍活着则发送SIGKILL
- 以JSON报告清理结果
使用--dry-run检查而不杀死。扫描器可安全运行多次。
结构化取消报告:
团队“{team_name}”已取消:
- 信号成员:N
- 收到响应:M
- 无响应:K(列出任何名称)
- TeamDelete:成功/失败
- 需要手动清理:是/否
路径:~/.claude/teams/{name}/和~/.claude/tasks/{name}/
实现注意: 取消技能由LLM执行,而不是作为bash脚本。当检测到活跃团队时:
- 读取
~/.claude/teams/*/config.json以找到活跃团队 - 如果存在多个团队,首先取消最旧的(按
createdAt) - 对于每个非领导成员,调用
SendMessage(type: "shutdown_request", recipient: member-name, content: "Cancelling") - 短暂等待关闭响应(每个成员15秒超时)
- 重新读取config.json以检查剩余成员(协调遍)
- 调用
TeamDelete()进行清理 - 移除任何本地状态:
rm -f .omc/state/team-state.json - 向用户报告结构化摘要
如果自动导航活跃
从src/hooks/autopilot/cancel.ts:27-78调用cancelAutopilot():
# 自动导航处理自己的清理 + ralph + ultraqa
# 只需标记自动导航为不活跃(保留状态以便恢复)
if [[ -f .omc/state/autopilot-state.json ]]; then
# 如果ralph活跃,清理它
if [[ -f .omc/state/ralph-state.json ]]; then
RALPH_STATE=$(cat .omc/state/ralph-state.json)
LINKED_UW=$(echo "$RALPH_STATE" | jq -r '.linked_ultrawork // false')
# 首先清理链接的超工作
if [[ "$LINKED_UW" == "true" ]] && [[ -f .omc/state/ultrawork-state.json ]]; then
rm -f .omc/state/ultrawork-state.json
echo "已清理:超工作(链接到ralph)"
fi
# 清理ralph
rm -f .omc/state/ralph-state.json
rm -f .omc/state/ralph-verification.json
echo "已清理:ralph"
fi
# 如果ultraqa活跃,清理它
if [[ -f .omc/state/ultraqa-state.json ]]; then
rm -f .omc/state/ultraqa-state.json
echo "已清理:ultraqa"
fi
# 标记自动导航为不活跃但保留状态
CURRENT_STATE=$(cat .omc/state/autopilot-state.json)
CURRENT_PHASE=$(echo "$CURRENT_STATE" | jq -r '.phase // "unknown"')
echo "$CURRENT_STATE" | jq '.active = false' > .omc/state/autopilot-state.json
echo "自动导航已取消在阶段:$CURRENT_PHASE。进度保留以便恢复。"
echo "运行/oh-my-claudecode:autopilot以恢复。"
fi
如果Ralph活跃(但不是自动导航)
从src/hooks/ralph-loop/index.ts:147-182调用clearRalphState() + clearLinkedUltraworkState():
if [[ -f .omc/state/ralph-state.json ]]; then
# 检查超工作是否链接
RALPH_STATE=$(cat .omc/state/ralph-state.json)
LINKED_UW=$(echo "$RALPH_STATE" | jq -r '.linked_ultrawork // false')
# 首先清理链接的超工作
if [[ "$LINKED_UW" == "true" ]] && [[ -f .omc/state/ultrawork-state.json ]]; then
UW_STATE=$(cat .omc/state/ultrawork-state.json)
UW_LINKED=$(echo "$UW_STATE" | jq -r '.linked_to_ralph // false')
# 仅当它链接到ralph时清除
if [[ "$UW_LINKED" == "true" ]]; then
rm -f .omc/state/ultrawork-state.json
echo "已清理:超工作(链接到ralph)"
fi
fi
# 清理ralph状态
rm -f .omc/state/ralph-state.json
rm -f .omc/state/ralph-plan-state.json
rm -f .omc/state/ralph-verification.json
echo "Ralph已取消。持久化模式已停用。"
fi
如果超工作活跃(独立,未链接)
从src/hooks/ultrawork/index.ts:150-173调用deactivateUltrawork():
if [[ -f .omc/state/ultrawork-state.json ]]; then
# 检查是否链接到ralph
UW_STATE=$(cat .omc/state/ultrawork-state.json)
LINKED=$(echo "$UW_STATE" | jq -r '.linked_to_ralph // false')
if [[ "$LINKED" == "true" ]]; then
echo "超工作链接到Ralph。使用/oh-my-claudecode:cancel以取消两者。"
exit 1
fi
# 移除本地状态
rm -f .omc/state/ultrawork-state.json
echo "超工作已取消。并行执行模式已停用。"
fi
如果超QA活跃(独立)
从src/hooks/ultraqa/index.ts:107-120调用clearUltraQAState():
if [[ -f .omc/state/ultraqa-state.json ]]; then
rm -f .omc/state/ultraqa-state.json
echo "超QA已取消。QA循环工作流已停止。"
fi
无活跃模式
echo "未检测到活跃的OMC模式。"
echo ""
echo "检查了:"
echo " - 自动导航(.omc/state/autopilot-state.json)"
echo " - Ralph(.omc/state/ralph-state.json)"
echo " - 超工作(.omc/state/ultrawork-state.json)"
echo " - 超QA(.omc/state/ultraqa-state.json)"
echo ""
echo "使用--force以清除所有状态文件。"
实现注意
取消技能运行如下:
- 解析
--force/--all标志,跟踪清理是否应跨越每个会话或保持范围在当前会话ID。 - 使用
state_list_active枚举已知会话ID和state_get_status以了解每个会话的活跃模式(autopilot、ralph、ultrawork等)。 - 在默认模式下操作时,调用
state_clear与该会话ID以仅移除该会话的文件,然后基于状态工具信号运行模式特定清理(自动导航 → ralph → …)。 - 在强制模式下,迭代每个活跃会话,为每个会话调用
state_clear,然后运行没有session_id的全局state_clear以删除遗留文件(.omc/state/*.json、兼容性工件)并报告成功。群集保持为会话范围外的共享SQLite/标记模式。 - 团队工件(
~/.claude/teams/*/、~/.claude/tasks/*/、.omc/state/team-state.json)保持为遗留/全局遍期间调用的尽力清理项。
状态工具始终尊重session_id参数,因此即使强制模式在删除仅兼容性遗留状态之前仍首先清除会话范围路径。
模式特定子节描述每个处理程序在状态范围操作完成后执行的额外清理。
消息参考
| 模式 | 成功消息 |
|---|---|
| 自动导航 | “自动导航已取消在阶段:{phase}。进度保留以便恢复。” |
| Ralph | “Ralph已取消。持久化模式已停用。” |
| 超工作 | “超工作已取消。并行执行模式已停用。” |
| 超QA | “超QA已取消。QA循环工作流已停止。” |
| 群集 | “群集已取消。协调代理已停止。” |
| 超导航 | “超导航已取消。并行自动导航工作器已停止。” |
| 流水线 | “流水线已取消。顺序代理链已停止。” |
| 团队 | “团队已取消。团队成员已关闭并清理。” |
| 计划共识 | “计划共识已取消。规划会话已结束。” |
| 强制 | “所有OMC模式已清除。您可以重新开始。” |
| 无 | “未检测到活跃的OMC模式。” |
保留内容
| 模式 | 状态保留 | 恢复命令 |
|---|---|---|
| 自动导航 | 是(阶段、文件、规格、计划、裁决) | /oh-my-claudecode:autopilot |
| Ralph | 否 | N/A |
| 超工作 | 否 | N/A |
| 超QA | 否 | N/A |
| 群集 | 否 | N/A |
| 超导航 | 否 | N/A |
| 流水线 | 否 | N/A |
| 计划共识 | 是(计划文件路径保留) | N/A |
注意
- 依赖感知:自动导航取消清理Ralph和超QA
- 链接感知:Ralph取消清理链接的超工作
- 安全:仅清除链接的超工作,保留独立的超工作
- 仅本地:清除
.omc/state/目录中的状态文件 - 恢复友好:自动导航状态保留以便无缝恢复
- 团队感知:检测原生Claude Code团队并执行优雅关闭
MCP工作器清理
当取消可能生成MCP工作器(团队桥守护进程)的模式时,取消技能还应:
- 检查活跃MCP工作器:在
.omc/state/team-bridge/{team}/*.heartbeat.json查找心跳文件 - 发送关闭信号:为每个活跃工作器写入关闭信号文件
- 杀死tmux会话:为每个工作器运行
tmux kill-session -t omc-team-{team}-{worker} - 清理心跳文件:移除团队的所有心跳文件
- 清理影子注册表:移除
.omc/state/team-mcp-workers.json
强制清除附加
当使用--force时,还清理:
rm -rf .omc/state/team-bridge/ # 心跳文件
rm -f .omc/state/team-mcp-workers.json # 影子注册表
# 杀死所有omc-team-* tmux会话
tmux list-sessions -F '#{session_name}' 2>/dev/null | grep '^omc-team-' | while read s; do tmux kill-session -t "$s" 2>/dev/null; done