
Metabase Autobot 会话拆解全解-autobot-kill命令如何清理 worktree、Docker 容器与 tmux 会话【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase在 Metabase 仓库的自动化开发机器人autobot体系中每个 bot 会话都由三部分组成一个独立的 git worktree、一个 tmux 会话内含 agent 与前后端开发环境窗口、以及按 worktree 隔离启动的 Docker 开发环境容器。.claude/commands/autobot-kill.md是清理这一切的 Claude Code 斜杠命令封装它通过./bin/mage -autobot-kill一条命令完成「拆除并移除」操作。读完本文你可以理解该命令的两种调用模式带参/无参背后的完整实现链包括会话解析、workmux 钩子触发的 Docker 清理以及退出码契约。一、先理解 autobot 会话是什么kill 拆的是哪三样东西autobot-kill.md开篇即给出定义Tear down and remove an autobot session (worktree, Docker containers, and tmux)。这三样东西分别由不同的机制创建拆解时也需要不同路径git worktree由 mage/src/mage/bot/autobot.clj 中launch-workmux-session!调用workmux add branch-ref --config cfg --name session创建worktree 目录以会话 slug 命名autobot 总是用会话 slug 命名 worktree。tmux 会话当在 tmux 外启动时代码给 workmux 追加-s -b参数让 workmux 自己创建同名 tmux 会话会话内模板window_prefix被设为空串见 dev/bot/workmux-template.yaml保证 tmux 会话名与 autobot 的会话名完全一致后续find-session、tmux kill-session等按名操作才能精确命中。Docker 开发环境worktree 创建后模板的post_create钩子依次执行mise trust、git pull、-bot-setup-worktree、-bot-dev-env --app-db {{APP_DB}} --bot {{BOT_NAME}}。bot 模式下开发环境一律使用按 worktree 前缀命名的 Docker 容器见 mage/src/mage/bot/dev_env.clj 中的容器编排与check-docker!检查逻辑每个会话占一套 slot 化端口。理解了会话的构成才能理解kill命令要按什么顺序回收先拆除 worktreeworkmux 移除钩子顺带停掉 Docker 环境再杀掉 tmux 会话。二、斜杠命令入口.claude/commands/autobot-kill.md的完整约定该命令文件的全部约定可以归纳为四条硬性规则必须在当前工作目录执行禁止cd。原因是./bin/mage在任意 worktree 内都可用且无参模式依赖「调用者正处于待移除的 worktree 内」这一前提来自动识别会话。执行命令固定为./bin/mage -autobot-kill $ARGUMENTS$ARGUMENTS是用户在调用/autobot-kill时传入的参数可以为空。两种模式都由 mage 自身处理带参数把参数当作会话名。若没有匹配到的会话mage 会打印可用会话列表并以非零码退出不带参数从当前 worktree 路径自动检测会话名。若调用者位于主仓库而非 worktree内mage 打印 usage 错误并以非零码退出。禁止预先执行-autobot-list再询问用户选择。直接把用户给的参数或什么都不给交给-autobot-kill然后把命令的完整 stdoutstderr 展示给用户即可。这条「不要预判」规则与源码实现吻合mage 在找不到匹配会话时已经自带了打印可用列表、非零退出的兜底行为Agent 层再做一次 list 属于冗余交互。三、实现核心kill!只有两行 shell 调用重活全在钩子里任务在 bb.edn 中注册第 821–827 行-autobot-kill {:doc Tear down and remove an autobot session. No args remove current session. :examples [[./bin/mage -autobot-kill qabot-master Remove named session] [./bin/mage -autobot-kill Remove current session (from inside an autobot session)]] :requires [[mage.bot.autobot :as autobot]] :arg-schema [:? [:string {:name name-or-id}]] :task (task! (autobot/kill! parsed))}:arg-schema中的:?表示参数可选这正是文档中「带参/无参两种模式」在 CLI 层的落点。实际实现在 mage/src/mage/bot/autobot.clj(defn kill! Tear down and remove a session. Works with a session name argument, or detects current session if no args. [{:keys [arguments]}] (let [session (resolve-session-name (first arguments))] (println (c/yellow Removing worktree: session ...)) (shell/sh* {:quiet? true} workmux remove -f session) (shell/sh* {:quiet? true} tmux kill-session -t session) (println) (println (c/bold (c/green Session removed: ) (c/cyan session)))))执行链清晰为三步resolve-session-name解析出 worktree 名→workmux remove -f session强制移除 worktree-f跳过确认→tmux kill-session -t session杀掉同名 tmux 会话。注意kill!本身并没有直接调用docker rm——Docker 容器的清理发生在workmux remove触发的pre_remove钩子中见第五节。与kill!对照的是stop!同文件 L521–L536stop 只执行-bot-dev-env --down加tmux kill-session并明确提示 Worktree preserved. Use /autobot to restart.。也就是说stop 保留 worktree 以便重启kill 连同 worktree 一起彻底移除这是两个命令最本质的区别。四、会话解析带参精确匹配与无参自我检测resolve-session-nameautobot.clj实现了文档所述两种分支的完整语义(defn- resolve-session-name [name-or-id] (if (str/blank? name-or-id) (or (detect-current-session) (do (println (c/red No session name provided and not inside a session.)) (println Usage: ./bin/mage -autobot-stop session-name) (println (or run from inside a session with no arguments)) (u/exit 1))) (or (find-session name-or-id) (do (println (c/red No session found matching: ) name-or-id) (print-available-sessions!) (u/exit 1)))))4.1 带参数路径find-session的两级匹配find-sessionL49–L64先对workmux list的输出做解析后 worktree 名的精确匹配忽略大小写未命中再退化为原始行的子串匹配。parse-worktree-nameL38–L47负责从workmux list每行末尾的路径提取 worktree 名路径中含__worktrees/时取其后一段路径为(here)标记当前所在 worktree时返回 nil否则取最后一级目录名。匹配失败时print-available-sessions!打印黄色 Available sessions: 列表并u/exit 1——这正是命令文档中「If no session matches, mage prints the available sessions and exits non-zero」的实现出处。4.2 无参数路径用 git 元数据自我检测detect-current-sessionL113–L130的实现策略在文档字符串中写得很直白git rev-parse --show-toplevel得到当前 worktree 绝对路径git rev-parse --git-common-dir得到主仓库路径两者相同 → 调用者位于主仓库返回 nil此时打印 usage 错误并退出码 1对应文档中 mage prints a usage error and exits non-zero两者不同 → 取 worktree 路径的 basename 作为会话名因为 autobot 创建 worktree 时总是用会话 slug 命名。这里有个值得注意的实现取舍注释中说明 workmux 没有current子命令所以代码从源码结构看选择了「从路径反推」而非「问 workmux」。这要求调用者确实站在 worktree 目录内——也就是命令文档第一条「Run this from the current working directory (dontcdanywhere)」的技术依据。4.3 会话名与分支名的换算规则会话名由branch-to-session-nameL17–L28从分支名生成小写化 → 非[a-z0-9-]字符替换为连字符 → 折叠连续连字符 → 截断到 40 字符 → 去掉首尾连字符。例如feature/my-branch→feature-my-branchMB-12345-Fix→mb-12345-fix。因此当你在会话内无参执行 kill 时检测到的 basename 正是这个 slug。这些规则由 mage/test/mage/bot/autobot_test.clj 中的branch-to-session-name-test与parse-worktree-name-test逐一覆盖含斜杠替换、大小写、特殊字符、连字符折叠、40 字符截断、(here)标记返回 nil 等用例可作为行为边界的权威参照。五、Docker 容器的实际清理点pre_remove钩子命令文档说 kill 会移除 Docker containers但kill!的源码里并没有 docker 命令——清理发生在 workmux 移除 worktree 前执行的pre_remove钩子中。dev/bot/workmux-template.yaml本地开发模式模板第 17–18 行pre_remove: - ./bin/mage -bot-dev-env --down-bot-dev-env --down会停止该 worktree 前缀下的全部 Docker 容器。容器层面mage/src/mage/bot/dev_env.clj 提供了check-docker!校验 docker 可执行且 daemon 运行中以及安静的docker killdocker rm组合L127–L130注释明确 quiet, no error on missing保证容器不存在时不报错。与之相对PR 预览环境模式--pr-env-url启动的会话没有本地开发环境使用精简模板 dev/bot/workmux-template-pr-env.yaml其pre_remove: []为空——没有 Docker 容器可清理kill 流程只涉及 worktree 与 tmux。模板选择由generate-workmux-configautobot.clj L151–L163依据pr-env-url是否存在决定并对模板做{{BOT_NAME}}、{{APP_DB}}、{{PR_ENV_URL}}、{{PR_NUM}}变量替换每次启动的临时配置写入 gitignored 的root/.bot/launch/session.yaml调用完成后在with-workmux-config!的 finally 中删除该清理语义也有对应测试with-workmux-config!-writes-and-cleans-up。六、使用方式与退出码契约汇总场景命令行为失败时移除指定会话./bin/mage -autobot-kill name-or-id精确/子串匹配会话 →workmux remove -f→tmux kill-session打印可用会话列表退出码 1在 worktree 内移除当前会话./bin/mage -autobot-kill无参从 git 元数据检测当前 worktree 会话名后同上主仓库内执行打印 usage 错误退出码 1保留工作现场./bin/mage -autobot-stop [name]仅停 dev env 与 tmux保留 worktree可用/autobot重启同上配套命令还包括-autobot-list列出全部会话状态与-autobot-result branch bot打印wt/.bot/bot/*/result.md中最新的结果文件见result!L489–L516用于在 kill 之前确认会话状态与 bot 产出。两点适用前提值得强调其一无参模式依赖「当前 shell 位于目标 worktree 内」这是命令文档第一条规则与detect-current-session实现共同约束的其二kill 是不可逆操作——worktree 被workmux remove -f强制移除后其上的未推送改动不会自动备份与可重启的 stop 不同执行前应先用-autobot-list或查看.bot/下的日志与 result.md 确认现场已无价值。七、小结autobot-kill.md虽然只有十余行但它封装的是一条完整的资源回收链会话名解析精确/子串匹配或 git 路径自检测→workmux remove -f经pre_remove钩子触发-bot-dev-env --down清理 Docker 容器并删除 worktree→tmux kill-session。命令文档中的每条约定——禁止cd、两种参数模式、不匹配时打印列表并非零退出、不要预先 list——都能在 mage/src/mage/bot/autobot.clj、bb.edn、dev/bot/workmux-template.yaml 及 mage/test/mage/bot/autobot_test.clj 中找到一一对应的源码实现与测试证据。掌握这套机制后无论是人工清理遗留 bot 会话还是编写相关的 Agent 工作流都能准确预测每一步的副作用与退出行为。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考