updatefirstmate について
updatefirstmateは、Firstmateリポジトリと登録済みsecondmateのホームを上流から更新するスキルです。保護された早送り更新を行い、スキップ対象を報告し、進行中の作業を妨げずに安全な再起動を調整します。
主な機能
- 01Firstmateのデフォルトブランチを早送り更新
- 02登録済みのローカル・リモートsecondmateホームを更新
- 03変更や分岐のあるチェックアウトへの更新を保護
- 04未解決のsecondmateの分岐を記録
- 05更新後に条件を満たすsecondmateを再起動
- 06再読込・再起動・通知の対応を報告
活用シーン
- 01Firstmateの指示やスキルを最新化
- 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 がプルするまでは反映されません。
実行中の firstmate の指示対象となるのは AGENTS.md、bin/、.agents/skills/ だけです。公開用の skills/ はインストーラー向けであり、firstmate に読み込まれません。
このスキルは、実行中の main firstmate とすべての secondmate に対して、進行中の作業を妨げることなくプルを実行します。
ファイルをプルするだけでは不十分です。
実行中のエージェントは、起動した時点で AGENTS.md と、それまでに読み込んだすべてのスキルを固定して保持します。また、リロード機能を備えていることが検証済みのハーネスはないため、新しい内容がディスク上にあっても、新しい会話を開始するまでは反映されません。
再読み込みでは代用できません。優先順位が定義されていないまま、mate 自身の職務記述書のコピーが二重に追加され、すでに読み込まれているスキルにはアクセスできないためです。
エージェントの置き換えは、起動時に mate が固定した起動時の配線(ターン終了フック、ハーネスのフラグ、ハーネスごとの機能スイッチ)を再解決する唯一の方法でもあります。これらはディスク上のどのファイルにも記述されていません。
そのため、更新が成功した後は、すでに対象のコミットにあるものも含め、実行中の secondmate をすべて再起動します。 起動時の配線はファイル差分から導き出せないため、追跡対象の状態に変化がないことは、実行中のエージェントがすでに最新の動作になっている証拠にはなりません。再起動しないのは、更新処理でホームをスキップせざるを得なかった mate と、実行環境で再起動を確認できない mate だけです。アップデーターは両方のケースを正確に扱い、どちらもリロードしたとは報告しません。
初回ロールアウトに関する注意: この変更を含む更新は、変更前のリリースによって実行されるため、そのパスで AGENTS.md または .agents/skills/ が変更された mate だけが再起動されます。完了後、リリースで指定された mate だけでなく、実行中の secondmate の ID をすべて指定して、bin/fm-secondmate-restart.sh <fm-id>... を一度実行してください。以降の更新では、以下の通常のフローに従います。
メインの更新は早送りのみです。一方、各 secondmate には、ガード付き収束パスに加え、スカッシュマージされたローカル履歴に対する限定的なリカバリーを適用します。
リモート経由の場合、対象ホストに設定された Firstmate コードルートを、そのホストの origin から更新してから、ガード付きで永続ホームをコードルートのコミットまで早送りします。
強制更新、マージコミットの作成、スタッシュは一切行いません。
secondmate のクリーンな分岐では、3 方向のツリー証明により、ローカルの完全な変更内容がすでに対象に含まれていると確認できた場合に限り、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>)を 1 行ずつ出力し、その後、次に実行すべき内容を正確に示す 3 行を出力します:reread-firstmate: yes|norestart-secondmates: fm-<id>...|nonenudge-secondmates: fm-<id>...|none2つの second-mate セットは互いに重複せず、スクリプトが振り分けを管理しています。振り分けをやり直さないでください。restart-secondmates:には、このパスが最新のコミットに残した稼働中の mate がすべて含まれます。更新されたものも、すでに最新だったものも対象です。 mate がどちらのセットにも含まれないのは、そのホームがスキップされた場合、この一覧に稼働中のエンドポイントが記録されていない場合、またはそのエンドポイントが停止中か欠落していると明確に判定された場合に限られます。 正当な差分があるためにスキップされた mate については、永続的な調整記録を通じて対応が必要です。残り2つのケースでは、あなたが更新作業を行う必要はありません。
-
自分の指示が変更された場合は、AGENTS.md を読み直します。 更新ツールが
reread-firstmate: yesと出力した場合、追跡対象の指示ファイル(AGENTS.md、bin/、または.agents/skills/)が、作業中に更新されています。 ほかの作業をする前に、今すぐAGENTS.mdを読んでください(CLAUDE.md はAGENTS.mdを指す実際の@AGENTS.mdポインターです)。古い指示ではなく、新しい指示に従って作業できるよう、実行手順を更新してください。reread-firstmate: noと出力された場合、自分に関わる変更はありません。読み直しは不要です。 -
更新ツールが指定した second mate をすべて再起動します。
restart-secondmates:の一覧全体を1つのコマンドに渡します(noneの場合はこの手順を省略します)。FM_HOME=<this-firstmate-home> bin/fm-secondmate-restart.sh <fm-id>...FM_HOMEがすでにアクティブな firstmate のホームに設定されていない場合は、FM_HOME=<this-firstmate-home>を指定します。 これは自動で行われるため、船長による mate ごとの確認は不要です。 ローカルとリモートの mate は同じ一覧に指定します。コマンドが、通信方法、各 mate の新しいプロセスが使用するプロファイル、待機を管理します。一覧にある各 mate に対し、まず会話内だけに保持している未完了の作業を書き留めるよう依頼し、その mate 自身から応答が返ってから再起動します。 ターンの途中にある mate には、ターンの終了後に依頼が送信されます。 これがこの手順の目的なので、回避しないでください。これにより、船長への呼び出しを考えていたものの、登録する前に会話が失われる事態を防げます。 ヘッダーには、依頼、その期限、およびそれらを変更する2つの設定が記載されています。
結果は mate ごとの行と、最後の
summary:行を確認してください。restarted: <id>- その mate は、現在の指示と起動時の設定で確実に稼働しています。nudged: <id>: <reason>- 安全に再起動できなかったため、代わりに以前の再読み込みメッセージが送られています。その mate は、開始時の会話と起動時の設定で引き続き稼働しています。 これを正常な再読み込みとして報告しないでください。unreached: <id>: <reason>- 再起動結果が不明確な場合も含め、安全に稼働していることを確認できませんでした。
-
残りには再読み込みメッセージを送ります。
nudge-secondmates:行にあるすべての対象に、1行の再読み込み指示を送信します(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 はすでに追跡対象ファイルの安全な早送りを受けており、この指示によって作業が強制されたり、終了されたり、破棄されたりすることはありません。 これらを再読み込み済みと説明しないでください。エージェントは、起動時に読み込んだ設定のまま稼働しています。
-
船長には、結果を明確に、できるだけ1行で報告します。 firstmate 内部の用語を使わず、
AGENTS.mdのセクション9に基づいて何が反映されたかを要約します。つまり、どの範囲のフリートが最新の状態になり、どの範囲がそのまま残されたか、その理由を伝えます。 例:「船長、firstmate と2人の second mate は最新の状態です。」 mate に正常な再読み込みではなくメッセージだけが送られた場合は、その旨と理由を明確に伝えてください。一部だけの再読み込みを、完全な再読み込みのように伝えてはいけません。 船長の対応が必要な理由でスキップされた対象は、明示してください。たとえば、独自の未反映変更があるため差分が発生しているホーム(diverged)や、ローカル編集があるホーム(dirty)は、意図的に変更されずに残されています。
安全性
- ガード付きの収束のみを行います。
変更のあるターゲット、オフラインのターゲット、デフォルトでないターゲット、または独自に分岐したターゲットはスキップして報告し、強制操作もスタッシュも行いません。
履歴をたどらずに移動できるのは、変更のない secondmate の分岐で、ローカルの結果全体がすでに upstream に存在する場合のみです。また、
reset --keepでも、作業ツリーに競合する変更がある場合は処理を拒否します。 未反映の作業があるものを破棄することは決してありません。これは最優先指令 #3 です。 - firstmate リポジトリとそのワークツリーのみを操作し、
projects/には触れません。 fleet sync と同じ、認可された自己書き込みです。 - 作業中のものを妨げることはありません。 ローカルまたはリモートの second mate は、そのチェックアウト自体が安全に進められる場合に限り、追跡対象ファイルを fast-forward します。ホームの更新がスキップされた mate も再起動しません。 再起動では、未完了の作業を書き留めた後、同じホームとエンドポイントでその mate のエージェントを置き換えます。ティアダウンでも強制操作でもありません。 そのクルーメイトたちは、それぞれのエンドポイントで動作し続けます。また、バックログ、保留中の captain への呼び出し、未読ステータス、未処理の指示など、永続的な記録はすべて、起動時に置き換え後のエージェントへ再提示されます。 再起動が試みられる前に拒否された場合、その mate は再読み込みの経路に残ります。再起動が試みられた後は、失敗または結果が不明確な場合、どちらのインスタンスに起因するとも判断せず、結果不明として報告します。