mcpField
U
updatefirstmate

updatefirstmate

github.com/kunchenguidAgent 工作流8.4k48 次安装今天更新
代码仓库

关于 updatefirstmate

updatefirstmate 是从上游更新 Firstmate 仓库及已登记 secondmate 主目录的技能。它采用受保护的快进更新,报告跳过的目标,并协调安全重启,避免干扰进行中的工作。

主要功能

  1. 01快进更新 Firstmate 默认分支
  2. 02更新已登记的本地和远程 secondmate 主目录
  3. 03对存在本地修改或分歧的检出进行保护
  4. 04记录尚未解决的 secondmate 分歧
  5. 05更新后重启符合条件的 secondmate
  6. 06报告重读、重启和发送提醒等操作

适用场景

  1. 01更新 Firstmate 的指令与技能
  2. 02在保留进行中工作的同时更新 secondmate 主目录
  3. 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/ 下的任何内容。

功能说明

  1. 运行更新器:

    bin/fm-update.sh
    

    它会将此 firstmate 仓库的默认分支从 origin 快进更新,然后通过各自位置专属的防护路径,更新每个已注册的本地或远程 secondmate 主目录。 它会为每个目标打印一行状态(updated <old>..<new> / reconciled redundant divergence <old>..<new> / already current / skipped: <reason>),然后打印三行操作提示,明确告诉你接下来该做什么:

    • reread-firstmate: yes|no
    • restart-secondmates: fm-<id>...|none
    • nudge-secondmates: fm-<id>...|none

    两组 secondmate 互不重叠,脚本负责划分;不要重新推导。 restart-secondmates: 会列出本轮结束时已处于最新提交版本的所有在线 mate,无论它们是刚更新到该版本,还是原本就已在该版本。 mate 不在这两组中的原因只有以下几种:其主目录被跳过;这里没有记录其在线端点;或其端点已被明确判定为失效或不存在。 若遇到真正分歧而跳过,仍需通过持久化的协调记录进行处理;另外两种情况无需你采取更新操作。

  2. 如果你自己的指令发生变化,请重新读取 AGENTS.md。 当更新器打印 reread-firstmate: yes 时,受跟踪的指令文件(AGENTS.md、bin/ 或 .agents/skills/)刚刚在你运行期间更新。 现在读取 AGENTS.md(CLAUDE.md 是指向它的真实 @AGENTS.md 指针),在执行其他操作前刷新你的操作指令,以便按照新指令而非启动时的旧指令行事。 若打印的是 reread-firstmate: no,说明你的指令没有变化——跳过重新读取。

  3. 重启更新器列出的每个 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> - 无法确认安全的运行状态,包括无法确定的重新启动结果。
  4. 向其余目标发送重新读取提示。 对于 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 仍在使用启动时加载的配置运行。

  5. 用简明结果向船长汇报,尽量用一句话。 根据 AGENTS.md 第 9 节,总结哪些船员现在已更新到最新版本,哪些保持原样,以及原因;不要使用 firstmate 的内部术语。 例如:“船长,firstmate 和两位 second mate 现在都已更新到最新版本。” 如果某位船员收到的是消息,而不是完成了干净重载,请直白说明,并解释原因——绝不能把部分重载说成完整重载。 对于任何需要船长关注而被跳过的目标,都要明确指出跳过原因——例如,某个 home 有尚未合并的独有更改(diverged)或本地编辑(dirty),因此有意保持未动。

安全

  • 只进行有保护的收敛操作。 脏状态、离线、非默认或存在独有分歧的目标都将被跳过并报告,绝不强制操作或暂存更改。 只有当某个干净的 secondmate 分歧目标的全部本地结果已存在于上游时,才可以在没有共同祖先的情况下推进;reset --keep 仍会拒绝与工作树更改冲突的操作。 绝不丢弃任何尚未合并的工作——这是首要原则 #3。
  • 只操作 firstmate 仓库及其工作树,绝不操作 projects/。 这与舰队同步一样,属于获准的自我写入操作。
  • 绝不打断正在进行的工作。 只有当本地或远程 second mate 自身的检出状态可以安全推进时,才会对其跟踪文件执行快进;home 被跳过的船员也不会重启。 重启会在记录其未完成工作后,于同一 home 和端点中替换该船员的 Agent;绝不会拆除,也绝不会强制执行。 其同伴会继续在各自的端点运行;每条持久记录——待办事项、待处理的船长呼叫、未读状态、未处理指令——都会在启动时重新交给替代者。 如果在尝试重启前拒绝了重启,该船员会走重新读取路径;一旦尝试重新启动,任何失败或结果不明的情况都会报告为未知,而不会归因于任一代实例。

评论

支持 Markdown