MMS Pilot 是 MMS 的本地 Web 客户端,从 v4 起随安装包分发。 安装后运行
mms web --open打开。会话仍通过原有 MMS 启动链交给本机 Pi 执行,浏览器只是交互入口。安装与使用 · 功能与边界 · 首版说明 · 产品方向。已有 CLI 启动能力全部保留。
MMS 是一个 launcher-first 的本地 AI Coding CLI 运行时管理器。它把
claude、codex、opencode、pi、agy放到同一个入口里,让你选择模型、通道、账号、session 能力包和隔离 HOME,而不是让失败路径偷偷掉回真实全局账号。
如果你同时使用 Claude Code、Codex、OpenCode、New API / OpenAI-compatible 平台、国产模型和多个 provider,MMS 负责把“启动前应该想清楚的事”集中起来:
- 一个入口启动多个 CLI:
mms进入 TUI,或直接mms claude/mms codex/mms opencode。 - 一个地方管理模型来源:provider、account、route、fallback、thinking、vision、cache-sensitive transport 都在启动前可见。
- 隔离但可恢复:Claude/Codex session 使用 MMS 管理的 HOME / config seed,减少污染真实全局配置,同时保留 resume。
- Web UI 配置:加通道、拉模型、改能力开关都在
mms web(Pilot)里做,和终端写同一个配置根。mmf config web已降级为维护入口。 - 按 session 注入能力包:CodeGraph、TOON、grill-me、Web automation bundle 等能力默认是 session-local,不改你的全局 hook;已移除 Caveman 与 token-saver 的内建安装。
- 诊断优先:在怀疑模型之前,先看 route、协议、cache、API Key、请求路径和 runtime exposure。
MMS Pilot 是原 launcher 的可视交互入口。chat、discuss 和高上下文 helper 现在只作为 maintenance-only 表面;主线是把本地 coding CLI 启动、路由、隔离和诊断做好。
产品名固定为 MMS Pilot。 命令入口不变,仍然是 mms web、独立的 mms-web,macOS 上还有 ~/.mms/MMS Pilot.command。旧的 MMS Web.command 会在升级时被移除,避免 ~/.mms 里留下两个一样的启动器。
Pilot 和 mmf config web 是两个不同的页面,不要混:
| 打开方式 | 用来做什么 | |
|---|---|---|
| MMS Pilot | mms web --open |
日常干活,以及全部日常配置:开会话、加通道、拉模型列表、改能力开关、管工作文件夹 |
| 配置 Web UI(已降级) | mmf config web |
只剩 Pilot 尚未覆盖的部分:账号、偏好、Skill / MCP、迁移与人工确认动作 |
Pilot 保存通道和模型后,终端读到的是同一份配置,不需要再去配置 Web UI 确认一遍。 配置 Web UI 启动时会打印这条降级提示;它仍然可用,但不再是配置 MMS 的推荐方式。
Pilot 当前的 harness 是 Pi。Claude、Codex、OpenCode、agy 仍从 MMS CLI 启动,尚未接入 Pilot 的统一会话。
v4 各版累积下来的能力:
- 会话:连续对话、恢复、停止、分叉、归档、导出,会话内切换模型与通道且保留上下文。
- 模型能力:按模型设置默认 effort、上下文长度和能否读图,每一项都标明当前值来自哪里,与 MMF 目录不一致时可以一键填回目录值。
- 工作区:侧栏管理工作文件夹的排序、重命名和移除,会话行支持复制 ID、重命名、分叉、导出与归档。
- 成果与资料:预览和比较记录下来的产出,管理项目资料并记录每轮实际提交的上下文来源。
- 外观:设置是弹窗;主题可跟随系统,主题色、界面/等宽/中文字体和字号都能实时改,只列出本机真的装了的字体。
边界:只监听本机地址,没有远程多用户认证,配置隔离不等于文件系统 sandbox。要给别人用,让对方在自己机器上安装并使用自己的模型服务。
从 2026-09-16 起,main 和 dev 是两条长期并行的发布线,不再互相追赶:
| 线 | 分支 | 版本 | 安装命令 | 适合谁 | 里面有什么 |
|---|---|---|---|---|---|
| 稳定线 | main |
4.23.x | --channel stable(默认) |
所有把它当日常工具用的人 | 已经坐稳的功能。新版本只收修复和验证过的能力 |
| 预览线 | dev |
5.x | --channel dev |
愿意试新东西、能接受波动的人 | 稳定线的全部内容,外加还在打磨的 Bot 工作台 |
| Canary | canary |
跟随 canary 分支 |
--channel canary |
专门验证某个修复的人 | 小步高频,允许短期破 |
改动的流向是固定的:main 上的每一处改动都默认进入 dev;dev 上稳定下来的能力再定期回流 main。 所以预览线永远是稳定线的超集,不存在"用了 5.x 就丢掉 4.x 的某个修复"。
两条线在同一台机器上不能共存,装了一条就是那一条。要换线,重跑安装器并带上对应的 --channel;配置、通道和会话历史都在同一个 config root(~/.config/mms-next)里,换线不会清空它们。
换线怎么操作:Pilot 的「版本与更新」可以选择
4.x 稳定版或5.x 预览版,检查并确认高于当前版本的更新。两个通道各自缓存结果。已经安装 5.x 时,仅选回 stable 不会降到 4.x;降回稳定线需要重跑安装器并带上--channel stable,原配置和历史保留。
分支约定见 docs/RELEASE_CHANNELS.md。除非人类明确要求改 release/channel contract,否则不要再重命名、重映射或混用这些关系。
v4.0.0 是 MMS Pilot 的首个大版本。4.x 现在是稳定线(main),5.x 是预览线(dev)。下列 3.x 轨道为此前分支发布历史,不代表 v4 已晋级各分支:Stable/Main 3.4.z、Dev 3.5.z、Canary 3.6.z。z 是各 channel 内的 release 计数:单 commit release 就 z+1,复合多个已验证 commits 的 release 也只 bump 一次;未 tag 的日常小步 commit 继续用 git hash 追踪。
维护者本地开发命令矩阵:mms 是公开安装副本;mmf 指 dev worktree;mmg 指 canary worktree。mmd / mmm 已退休。唯一的 config root 是 ~/.config/mms-next,mms / mmf / mmg 和 Pilot 网页都落在它上面;legacy ~/.config/mms 不再被任何入口读取。普通用户不需要配置这些 worktree 命令,只需要使用安装器提供的 channel 参数。
维护者默认从仓库根目录进入 MMS,且根目录应 checkout dev 并保持干净、最新。.worktrees/* 只用于具体 issue/PR 的隔离施工,不再把 .worktrees/dev 当作多人共享的默认开发入口。
标准循环:
- 进入仓库根目录,确认当前分支是
dev。 - 执行
git pull --ff-only,保持dev最新且干净。 - 先开 issue,并把计划写进 issue 或对应计划文档。
- 从最新
dev创建独立 worktree/branch,例如.worktrees/issue-14-redline-gate。 - 在独立 worktree 中开发、验证、commit、push。
- 提 PR 到
dev,由 committee 审核。 - committee/human 同意后 merge;根目录
dev再 fast-forward 到最新,进入下一轮。
除非人类明确要求直接在 dev 根入口编辑,否则 agent 不得在共享 dev 入口叠加实质性改动或留下未跟踪文件。docs-only 计划/报告类改动在用户要求“记录/提交/产出文档”时可以默认 commit,但必须只 stage 目标文档,不能带入任何无关脏文件。
辅助命令:
scripts/dev_doctor.sh
scripts/start_issue_worktree.sh 14 redline-gatedev_doctor.sh 只检查并报告状态:根目录是否在 dev、是否跟踪并落后于 origin/dev、是否有共享根目录脏文件、旧 .worktrees/dev 是否仍占用 dev、mmf 是否指向根目录 dev checkout,以及是否存在 git 标记的 prunable worktree。它不会自动删除或 reset。
start_issue_worktree.sh 会先确认根目录 dev 干净并 fast-forward 到最新,再创建 issue/<number>-<slug> 分支和 .worktrees/issue-<number>-<slug> worktree。代码、配置、CI 行为改动都应从这个隔离 worktree 开始;docs-only 计划/报告变更才允许在明确请求下直接落到根目录 dev。
如果 LLM/agent 负责执行 merge,且能识别该 PR 对应的本地 task worktree,merge 成功后还必须清理关联 worktree,除非人类明确要求保留。默认使用:
scripts/cleanup_merged_worktree.sh <branch-or-pr>该脚本只会删除已经合入 base 且 git status 干净的 worktree;传入 PR 编号或可由 gh 解析的 branch 时,也支持 GitHub squash/rebase merge 的 merged 状态核验。遇到未合并、未 push、未提交或未跟踪文件时会保留现场并报告原因。
在新电脑上打开终端,粘贴这一条:
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash装完会问一句要不要打开 MMS Web。回车即可,浏览器自动弹出,服务在后台运行,安装进程随即退出。在页面里添加 provider 和 API Key 就能开始对话。
安装过程不问任何会影响安装内容的问题,默认走 stable 通道并把 ~/.local/bin 写进 shell PATH。默认 UI 语言是中文,要英文加 --lang en。
升级同样是重新粘贴这一条命令,但如果 Pilot 正在运行,安装器会暂停并拒绝,不会替你关闭它:请先在 Pilot 页面里点“更新”,或者执行 mms web stop(本机有多个实例用 mms web stop --all)退出后再重新执行安装命令。跨配置根的版本会在 Pilot 更新中心明确要求先执行这条安装命令;它不会自动删除或移动旧 ~/.config/mms,因为那里可能还有 gateway/session 运行数据。
install.sh是 macOS/Linux 的安装器;Windows 请使用上面的 PowerShell 安装方式。--channel dev会安装dev分支当前内容,版本号应不低于 Stable;只想安装已发布版本请使用 Stable 命令或固定--ref vX.Y.Z。
Windows 目前是 Native Preview。下面按一台刚装好 Windows 11、还没有开发环境的电脑来写;普通用户不需要先懂 Python、Node 或 Git。
-
打开开始菜单,搜索 Windows PowerShell,打开普通窗口即可,不要先用管理员权限。复制下面几行检查系统有没有包管理器和运行时:
winget --version python --version node --version npm --version
-
如果
python或node提示找不到,逐条执行对应安装命令:winget install --id Python.Python.3.12 -e --source winget winget install --id OpenJS.NodeJS.LTS -e --source winget
安装完成后,关闭所有 PowerShell 窗口,再打开一个新窗口。这样新的
PATH才会生效。然后再次执行python --version、node --version和npm --version。如果电脑没有winget,从 python.org 和 nodejs.org 安装,并在安装向导中勾选加入PATH。Pi 是 MMS 调用的本机 coding agent,需要单独安装到 Node 的 global package。PowerShell 里使用
npm.cmd可以避开执行策略对npm.ps1的拦截:npm.cmd install --global @earendil-works/pi-coding-agent pi.cmd --version
如果
pi.cmd找不到,关闭所有 PowerShell 窗口后再开一个新窗口;仍找不到就执行npm.cmd prefix --global,把显示的目录本身加入用户PATH(Windows 通常不是bin子目录),然后再开新窗口。安装器只检查 Pi 是否已经在PATH,不会替你安装 Pi。 -
安装 MMS Windows Native Preview。下面的命令会下载官方安装脚本;它会准备 MMS 自己的 Python venv 和 Pilot,不会导入或覆盖已有 config/session:
$script = Join-Path $env:TEMP 'mms-install-v4.21.14.ps1' Invoke-WebRequest -UseBasicParsing ` -Uri 'https://raw.githubusercontent.com/CtriXin/multi-model-switch/v4.21.14/packages/mms-install/bin/install.ps1' ` -OutFile $script powershell.exe -NoProfile -ExecutionPolicy Bypass ` -File $script -Ref v4.21.14
安装结束后再打开一个 PowerShell,确认命令来自 MMS:
Get-Command mms mms config root -
启动 Pilot:
mms web start --open Start-Sleep -Seconds 5 mms web status
浏览器地址通常是
http://127.0.0.1:8765。它只在这台电脑上可访问。停止、重启和查看 JSON 状态分别是mms web stop、mms web restart和mms web status --json。 -
Windows 暂时没有可依赖的 MMS TUI(直接输入不带参数的
mms可能遇到 Pythoncurses/_curses)。启动 Pi 请用下面这个明确的命令;它会显示模型选择,选好后按 Enter:$mms = "$env:LOCALAPPDATA\MMS\versions\v4.21.14\mms" $python = "$env:LOCALAPPDATA\MMS\.venv\Scripts\python.exe" & $python $mms pi
先发送
hi、你是什么模型和Get-Location,再试创建一个中文/emoji 文件。不要把PYTHONUTF8=1永久写入系统环境变量;如果以前设置过,当前窗口可以清掉:Remove-Item Env:PYTHONUTF8 -ErrorAction SilentlyContinue
先把问题当作一个可以交给维护者的“小 issue”,不要把 API Key、credentials.sh、整个 mms-next 配置目录或未脱敏的 session 发出去。可以在 Pilot 里直接让本地 AI 先诊断当前电脑;完成诊断后,让它根据你有没有 GitHub 账号选择提交方式:有账号就做 fork 和 PR,没有账号就生成一份脱敏的 Markdown 报告和 .patch 文件,由维护者代提交。
给本地 AI 的可复制提示词、完整 PowerShell 取证命令、GitHub fork/PR 的小白步骤和 PR 模板都在 docs/mms-web/WINDOWS-CONTRIBUTING.md。
其他安装方式
# 需要最新修复的开发用户
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --channel dev
# 只给测试机
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --channel canary
# 固定到某个 release 或分支
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --ref v4.23.0
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --ref main
# 不打开 Web 端,也不改 shell 配置(CI、脚本)
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --no-launch-web --no-shell-rc
# 装完直接打开,不询问
curl -fsSL https://raw.githubusercontent.com/CtriXin/multi-model-switch/main/install.sh | bash -s -- --launch-web安装器默认会:
- 安装到
~/.mms,默认只把公开命令mms(以及mms-web、mmslogs)链接到~/.local/bin。mmf、mmg等是维护者本机的开发入口,不会被普通安装覆盖。 - 创建
~/.mms/.venv;系统 Python 不够新时,用 MMS-managed Python 兜底。 - 发现 PATH、Homebrew、NVM 下的
claude/codex/opencode/agy。 - 安装内建 session assets,但不会静默改写真实 provider/account 配置。
- 写入
~/.config/mms-next/version.json,记录安装 ref、channel 和语言;旧版本写在~/.config/mms的记录仍可读。
安装后检查:
mms doctor
mms models
mms routes
mms test --provider <provider-id> --cli claude
mms test --provider <provider-id> --cli codex长期固定语义是:
mms -> public installed copy # 只用于公开版本复现
mmf -> Dev worktree # preview DB root,固定 ~/.config/mms-next
mmg -> Canary worktree # preview DB root,固定 ~/.config/mms-next
当前本机用 scripts/link_local_channel_commands.sh 把 5 个命令写到 ~/.local/bin。另一台家里工作机如果要和白天电脑保持一致,建议同样准备 dev/canary/stable/main worktree 后运行这个脚本;如果只是普通用户安装,仍使用公开 mms 安装命令。
启动更新提醒默认只提醒、手动确认更新:mmg 每次启动检查,mmf 每日检查,mms 每日只提示 public installed copy。手动运行 mmf update / mmg update 时只允许 clean worktree fast-forward;dirty 或分叉会拒绝。
唯一的 config root 是 ~/.config/mms-next。mms / mmf / mmg 和 Pilot 网页都落在它上面;legacy ~/.config/mms 不再被任何入口读取,只剩 *-gateway/ 这类会话运行时目录还留在那里。
本地修改优先走 Registry v2:TUI / mms config / WebUI 先创建 DB candidate,审阅通过后发布成 generated/model-registry.latest-approved.json,它引用的 generated Profile 就是 runtime boundary。终端和 Pilot 读的是同一份发布结果,所以两边看到的通道、模型和能力一致。
保存一律走写入预览 DB + 发布,没有第二条绕开审阅的写入路径。
这一节讲的是 mmf config web 的配置页面,不是 MMS Pilot。配置 Web UI 是现在最适合做教程的入口,比 TUI 更容易截图和解释。注意:mmf / mmg 都是 preview DB 入口,所以预览 DB 保存跟 ~/.config/mms-next workflow 绑定;mms 也落在同一个 preview DB root 上,所以保存同样走 写入预览 DB + 发布;legacy root 与 mmd / mmm 已退休,不再有 legacy audited save 入口。等价入口:
mmf config web常见流程:
- 打开 Web UI:先看首页的 Root / Registry DB / Latest Approved Bundle 状态。
- 添加或选择通道:填写内部 ID、显示名、OpenAI / Anthropic base URL、API Key、models endpoint、protocols、supported CLIs。
- 拉取模型列表:查看远端返回模型;如果远端不返回但你确认可用,用 extra/manual 模型补到当前通道。
- 设置模型能力:隐藏噪音模型,标记 vision / reasoning / cache-sensitive 等能力。注意 Web UI 的
reason是能力 metadata,不是 launch-time Thinking 开关。 - 生成保存预览:先看 diff、risk、route publish guard 和 redacted plan JSON。
- 保存/发布 preview bundle:preview root 会写 DB candidate、secret backend 和
generated/model-registry.latest-approved.json。 - 回到启动器验证:用
mmf config check --json、mmf config bundle --json、mmf doctor和一次真实mms test确认。
更完整的 Web UI 图文脚本见 docs/WEB_UI_QUICKSTART.md。后续要做截图时,用 Playwright 打开本地 Web UI 会比截 TUI 更稳定。
mms web --open # 打开 MMS Pilot
mms # 交互式启动器
mms claude # 启动 Claude
mms codex # 启动 Codex
mms opencode --profile agent
mms opencode --profile review
mms --provider <id> codex
mms --account <id> claudeOpenCode Review 推荐直接走 mms TUI:选 OpenCode -> Review,在 reviewer 模型页用 Space 勾选、Enter 启动;这次选择会自动写入 [opencode.review].models,下次自动预选。--review-models 仍保留给脚本/高级用户。
只导出环境变量,不立即启动:
mms --export codex
mms --export opencode
mms --export claude --apply配置与诊断:
mms config preferences.help
mms exposure
mms logs
mms doctor full
mmf config web能。把 New API 当成 provider:填 base URL / key / models endpoint,然后让 Web UI 拉模型;拉不到但真实可用的模型放到 extra/manual 模型。隐藏、能力标记和 fallback 属于本地 policy,不应因为一次远端拉取缺失就盲删。
Web UI 模型表里的 reason / reasoning 是模型能力 metadata。真正启动时是否开 Thinking,取决于 provider/model compatibility profile 的 thinking.supported/default_enabled、effort 配置,以及 runtime 的 thinking_mode。
Caveman 已全局下线,不再随 MMS 安装、显示或注入;旧配置字段会被忽略。
如果多台机器需要保持一致,建议使用同一个 channel,并在必要时用 --ref <commit-or-tag> 固定到同一版本。Stable 更适合生产环境;Dev 适合需要最新修复的开发环境;Canary 更适合专门测试。
| Pack | 状态 | 用途 |
|---|---|---|
| CodeGraph | 内建 passive skill | 优先用 symbol graph 做代码定位、callers/callees、impact 分析 |
| TOON | 内建 | 压缩 agent-facing JSON / status / handoff |
| grill-me | 内建 | 逐题澄清目标、约束和验收,直接可用 |
| Web automation bundle | 内建 | 只暴露 weber router;web-access 与 agent-browser 作为内部 backend |
| NSR | 显式 /nsr 手动工作循环 |
沿用原 task 推进;不注册 Stop/compact hook、不跨 session 续跑 |
| ECC / OMC | 可选安装 | Claude agent pack;启动确认页显式选择 |
| Figma / Pilot MCP | 检测到也默认关闭 | 需要时用 MMS_ENABLE_MCP_FIGMA=1 / MMS_ENABLE_MCP_PILOT=1 显式开启 |
xmem 改为 global-only:MMS / MMF 不再 bundle、安装或注入 xmem skill/hook/plugin;如果全局 agent 目录里有 xmem,就由全局版本自己生效,避免 dev channel 复制出低版本。
NSR、Map、CodeGraph 的自动 hook 已退出默认路径。旧 nsr-*-hook、nsr-stop-wrapper.py、Map/CodeGraph auto-index wrapper 保留为 no-op,不读取或删除现有 marker,不同步索引。显式 /nsr、nsrctl、Map 与 CodeGraph CLI 仍可使用。MMS 在合并旧 managed hooks 后也过滤自有退休入口;旧 runtime 的 NSR toggle 不会恢复自动 hook。
安装器只提供全局注册的只读清理计划。需要清理已存在注册时,使用 mms_hook_retirement.py 明确指定 --file;默认只输出 locator/hash。--apply 另要求审阅时 SHA256 和私有 backup 目录,且只删除精确自有入口。它不处理 MMS generated session/config;旧 session 可通过激活 shared no-op wrapper 停止自动行为。
全局 Superset terminal 注册可使用 hooks/owned-superset-notify.sh:先检查原 app 已使用的 SUPERSET_TAB_ID,无 owner 时不读取 stdin、不通知;有 owner 时委托原 ~/.superset/hooks/notify.sh,保留 app 的直接 Mastra 路径。此 wrapper 不证明 app 上游模板已修改;app 升级若重建全局注册,需要重新检查精确命令。
Figma 和 Pilot MCP 不再默认注入;即使检测到已安装 plugin/server,也需要用 MMS_ENABLE_MCP_FIGMA=1、MMS_ENABLE_FIGMA_MCP=1、MMS_ENABLE_MCP_PILOT=1 或 MMS_ENABLE_PILOT_MCP=1 显式 opt-in。
安装器不再提供可选包。RTK、BrainKeeper、Map、CodeGraph、全局 token-saver、全局 TOON、ops-env-safe、ECC 与 OMC 的安装路径已移除;对应的 --install-* 参数会打印一条提示后忽略。TOON、grill-me、weber 仍作为内建 session assets 随 MMS 提供;web-access 与 agent-browser 仅作为 Weber 内部 backend。
从旧版本升级时,仅将有 MMS 专属标记的 wrapper/命令、明确指向当前 MMS vendor 的 Skill 链接和安装目录内的旧 agent packs 移入 ~/.mms/retired-backup.*,保留原文件供恢复。同名自定义 Skills、全局 hooks/MCP 设置及真实配置目录不自动修改,也不卸载第三方程序。全局退休 hook 可按上面的只读清理计划另行检查。想单独整理 MMS 条目而不重装:
bash install.sh --cleanup-retired-packs安装过程零交互:不再询问 UI 语言,也不再逐项确认可选包。pi 是必装项,pilot web 端依赖它;缺失的 claude / codex / opencode 会自动补装,已安装的保持不动。需要精确控制时仍可用 --install-cli:
bash install.sh --install-cli claude,codex- 真实
HOME和全局 OAuth 状态是保护面,不是 fallback 池。 - provider/account 失败时,应在当前 runtime 内 fail closed,不静默切到另一个全局账号。
- Claude 语义在 route 支持时优先走
Anthropic /v1/messages。 OpenAI /v1/chat/completions是 fallback transport,不是等价默认值。- Web UI / TUI 写配置前应先生成 preview / diff / backup / audit evidence。
- legacy
~/.config/mms/**,尤其 Claude 相关字段,仍然是 human-gated 配置:Web 不写它。默认根~/.config/mms-next的写入统一走 Registry 审阅计划。
docs/mms-web/GETTING-STARTED.md— MMS Pilot 安装与使用docs/mms-web/FEATURES.md— MMS Pilot 功能与交互边界docs/mms-web/API.md— MMS Pilot 本地 API v1docs/WEB_UI_QUICKSTART.md— 配置 Web UIdocs/RELEASE_CHANNELS.mddocs/MMS_USER_PREFERENCES.mddocs/MODEL_CONFIG_CONTRACT.mddocs/AGENT_GUARDRAILS.md
- 从
dev挑选已验证变更进入 Stable 候选;同步窗口结束后,main本身就是 Stable/default。 - 运行 installer check、config check、关键 launcher smoke、Web UI save-plan smoke。
- 更新 README / release notes,明确 Stable / Dev / Canary 安装命令。
- 打 tag,推送 GitHub Release。
- 对家里工作机这类同步使用场景,记录推荐 pinned commit。