关于 updatefirstmate
updatefirstmate 是从上游更新 Firstmate 仓库及已登记 secondmate 主目录的技能。它采用受保护的快进更新,报告跳过的目标,并协调安全重启,避免干扰进行中的工作。
主要功能
- 01快进更新 Firstmate 默认分支
- 02更新已登记的本地和远程 secondmate 主目录
- 03对存在本地修改或分歧的检出进行保护
- 04记录尚未解决的 secondmate 分歧
- 05更新后重启符合条件的 secondmate
- 06报告重读、重启和发送提醒等操作
适用场景
- 01更新 Firstmate 的指令与技能
- 02在保留进行中工作的同时更新 secondmate 主目录
- 03找出因本地修改或分歧而跳过的主目录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kunchenguid/ firstmate --skill updatefirstmate安装后在 Claude Code 中输入/updatefirstmate确认已加载。
详细介绍
updatefirstmate
原地更新 firstmate。
Firstmate 有自己的仓库,也和任何项目一样受同一套防错门禁约束,因此新跟踪的内容(AGENTS.md、bin/、.agents/skills/ 和公开的 skills/)会进入 main,然后留在那里,直到每个正在运行的 firstmate 拉取这些内容。
只有 AGENTS.md、bin/ 和 .agents/skills/ 属于正在运行的 firstmate 的指令界面;公开的 skills/ 面向安装程序,不会由 firstmate 加载。
此技能会为正在运行的 main firstmate 和每个 secondmate 拉取更新,且不会干扰任何进行中的工作。
更新是拉取使用,而非发布:它只从上游拉取,因此每个 home 无论角色是什么都要运行它;firstmate 仓库发布边界(firstmate-self-repo)永远不适用于它。
拉取文件只完成了一半。
正在运行的 Agent 会将 AGENTS.md 和已加载的每项技能冻结为启动时的版本;没有经过验证的运行框架提供重新加载功能,因此磁盘上的新内容对它毫无影响,直到它开始新的对话。
重新读取无法替代重新启动:它会追加一份 mate 自身工作说明的副本,但没有定义优先级,而且无法触及已经加载的技能。
替换 Agent 也是重新解析启动时接线配置的唯一方式——回合结束钩子、运行框架标志、各运行框架的功能开关——mate 在启动时冻结了这些配置,而磁盘上的文件并未描述它们。
因此,成功更新后,每个正在运行的 secondmate 都会重启,包括已经位于目标提交的 secondmate。 启动时接线配置无法从文件差异中推导出来,因此跟踪内容未变,并不能证明正在运行的 Agent 已具备当前行为。 只有更新过程中必须跳过其 home 的 mate,以及其运行时无法确认是否已重启的 mate,不会重启;更新程序会如实保留这两种情况,且不会将它们报告为已重新加载。
一次性推出说明: 携带此更改的更新仍由上一版本执行,该版本只会重启本次更新中 AGENTS.md 或 .agents/skills/ 有变动的 mate。更新完成后,请使用所有正在运行的 secondmate ID 运行一次 bin/fm-secondmate-restart.sh <fm-id>...,而不仅是该版本列出的 ID;后续更新则按下文的常规流程执行。
主更新仅允许快进;每个 secondmate 则使用相同的受保护收敛流程,另有一项针对本地历史被压缩合并的有限恢复措施。
对于远程路由,会在该主机上通过其自身的 origin 更新已配置的 Firstmate 代码根目录,然后受保护地将持久化 home 快进到该代码根目录的提交。
它绝不强制更新、绝不创建合并提交,也绝不暂存更改。
当三方树证明表明 secondmate 的完整本地结果已存在于目标中时,干净的分支分歧才会通过 reset --keep 前进;这能识别压缩合并的贡献,同时不丢弃独有内容。
其他所有脏乱、分歧、离线或分支错误的目标都会被跳过并报告;真正的分歧会留下持久化的 state/.secondmate-update-reconcile/<id>.pending 记录,后续引导和更新流程会持续提示该记录,直到收敛后将其清除。
仅针对跟踪文件的快进不会触及被 Git 忽略的操作目录(data/、state/、config/、projects/、.no-mistakes/),因此 secondmate 的进行中工作绝不会受到干扰。
此操作只涉及 firstmate 仓库及其自身工作树,绝不会涉及 projects/ 下的任何内容。
功能说明
-
运行更新器:
bin/fm-update.sh它会将此 firstmate 仓库的默认分支从 origin 快进更新,然后通过各自位置专属的防护路径,更新每个已注册的本地或远程 secondmate 主目录。 它会为每个目标打印一行状态(
updated <old>..<new>/reconciled redundant divergence <old>..<new>/already current/skipped: <reason>),然后打印三行操作提示,明确告诉你接下来该做什么:reread-firstmate: yes|norestart-secondmates: fm-<id>...|nonenudge-secondmates: fm-<id>...|none
两组 secondmate 互不重叠,脚本负责划分;不要重新推导。
restart-secondmates:会列出本轮结束时已处于最新提交版本的所有在线 mate,无论它们是刚更新到该版本,还是原本就已在该版本。 mate 不在这两组中的原因只有以下几种:其主目录被跳过;这里没有记录其在线端点;或其端点已被明确判定为失效或不存在。 若遇到真正分歧而跳过,仍需通过持久化的协调记录进行处理;另外两种情况无需你采取更新操作。 -
如果你自己的指令发生变化,请重新读取 AGENTS.md。 当更新器打印
reread-firstmate: yes时,受跟踪的指令文件(AGENTS.md、bin/或.agents/skills/)刚刚在你运行期间更新。 现在读取AGENTS.md(CLAUDE.md是指向它的真实@AGENTS.md指针),在执行其他操作前刷新你的操作指令,以便按照新指令而非启动时的旧指令行事。 若打印的是reread-firstmate: no,说明你的指令没有变化——跳过重新读取。 -
重启更新器列出的每个 secondmate。 将完整的
restart-secondmates:列表传给一条命令(若显示none,则完全跳过此步骤):FM_HOME=<this-firstmate-home> bin/fm-secondmate-restart.sh <fm-id>...除非
FM_HOME已设置为当前 firstmate 主目录,否则请包含FM_HOME=<this-firstmate-home>。 这是自动操作,无需 captain 逐个确认。 本地和远程 mate 放在同一列表中;命令负责传输、每个替代实例所使用的配置文件,以及等待过程。命令会先要求列表中的每个 mate 记录下仅保存在其对话中的未完成工作,并且只会在收到该 mate 自己的答复后才重启它。 如果 mate 正处于某轮处理中,请求会排在该轮之后。 这正是此步骤的全部目的,因此不要绕过它:这样才能避免丢失 captain 曾向 mate 提出、但从未登记的调用,而该调用会随对话一起消失。 命令头部说明了请求、限制,以及两个可更改这些设置的参数。
根据每个 mate 的输出行和末尾的
summary:行判断结果:restarted: <id>- 该 mate 现在确实在使用当前指令和启动时设置运行。nudged: <id>: <reason>- 重启不安全,因此 mate 收到的是较早的重新读取提示;它仍在使用其启动时的对话和启动时设置运行。 绝不要将这种情况报告为成功重新加载。unreached: <id>: <reason>- 无法确认安全的运行状态,包括无法确定的重新启动结果。
-
向其余目标发送重新读取提示。 对于
nudge-secondmates:行中的每个目标,发送以下单行重新读取指示(若显示none,则不执行任何操作):FM_HOME=<this-firstmate-home> bin/fm-send.sh <id> 'firstmate was updated to the latest - please re-read your AGENTS.md to pick up the new instructions.'这些 mate 已获取最新文件,但无法确定是否能安全重启,因此本轮能为它们做的只有发送提示。 这是温和的提示,不会打断它们:mate 已安全地快进更新了受跟踪文件,提示也绝不会强制操作、终止进程或丢弃其工作。 绝不要称这些 mate 已重新加载;其 Agent 仍在使用启动时加载的配置运行。
-
用简明结果向船长汇报,尽量用一句话。 根据
AGENTS.md第 9 节,总结哪些船员现在已更新到最新版本,哪些保持原样,以及原因;不要使用 firstmate 的内部术语。 例如:“船长,firstmate 和两位 second mate 现在都已更新到最新版本。” 如果某位船员收到的是消息,而不是完成了干净重载,请直白说明,并解释原因——绝不能把部分重载说成完整重载。 对于任何需要船长关注而被跳过的目标,都要明确指出跳过原因——例如,某个 home 有尚未合并的独有更改(diverged)或本地编辑(dirty),因此有意保持未动。
安全
- 只进行有保护的收敛操作。
脏状态、离线、非默认或存在独有分歧的目标都将被跳过并报告,绝不强制操作或暂存更改。
只有当某个干净的 secondmate 分歧目标的全部本地结果已存在于上游时,才可以在没有共同祖先的情况下推进;
reset --keep仍会拒绝与工作树更改冲突的操作。 绝不丢弃任何尚未合并的工作——这是首要原则 #3。 - 只操作 firstmate 仓库及其工作树,绝不操作
projects/。 这与舰队同步一样,属于获准的自我写入操作。 - 绝不打断正在进行的工作。 只有当本地或远程 second mate 自身的检出状态可以安全推进时,才会对其跟踪文件执行快进;home 被跳过的船员也不会重启。 重启会在记录其未完成工作后,于同一 home 和端点中替换该船员的 Agent;绝不会拆除,也绝不会强制执行。 其同伴会继续在各自的端点运行;每条持久记录——待办事项、待处理的船长呼叫、未读状态、未处理指令——都会在启动时重新交给替代者。 如果在尝试重启前拒绝了重启,该船员会走重新读取路径;一旦尝试重新启动,任何失败或结果不明的情况都会报告为未知,而不会归因于任一代实例。