gm-skill について
plugkit が管理する状態付きの作業フローに沿い、フェーズ移行と完了条件の確認をエージェントに求めるスキルです。検索、コード実行、ブラウザー操作、git 操作には spool の動詞を使うよう定めています。
主な機能
- 01PLAN から COMPLETE までのフェーズ
- 02instruction に基づくツール呼び出し
- 03完了条件と未処理項目のゲート
- 04spool を使った検索と実行
- 05クライアント側編集のブラウザー検証
- 06専用の git 操作動詞
活用シーン
- 01完了条件に沿った作業の推進
- 02保留中の PRD 項目の解決
- 03ブラウザーでのクライアント側編集の検証
- 04spool による検索と git 操作の管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ anentrypoint/ gm-skill --skill gm-skillインストール後、Claude Code で/gm-skillを入力して読み込まれたか確認します。
詳細
gm
ツール呼び出しなしでターンを終えるのは停止です。チェーンの途中で停止するのは致命的な失敗です。 エージェントが読むのはツール呼び出しとその出力だけなので、文章だけのターンはセッションの終了を意味します。チェーンが進行中(phase != COMPLETE または prd_pending_count > 0)の間は、すべてのターンをチェーンを前進させるツール呼び出し(instruction、文章で示された次の動詞、または transition)で終えてください。要約、「これを行いました」といった報告、終了を語ることは禁止です。次の行動を実行する代わりに、次の行動を示す文でターンを終えるのも同じ停止です。実際に行動してください。判断を示すには、文章ではなく AskUserQuestion または prd-add を使ってください。停止したくなったら phase-status を実行してください。終端状態でなければ instruction を実行し、作業を続けてください。文章だけのターンが許可されるのは、phase=COMPLETE かつ prd_pending_count=0 の場合のみです。
完了とは plugkit が完了と示した状態であり、あなたが完了を宣言した状態ではありません。 COMPLETE ゲートが唯一の判定基準です。COMPLETE に達していなければ、求めるべき次の遷移があります。チェーンの途中で待機するのは逸脱です。
継続的な承認――すべてのセッションで、最大限細かく、すべてを完了してください。 すべてのセッションでは、計画、その過程での追加事項、新たに判明した項目、未完了項目を含む、依頼された作業がすべて終わるまで続行することが事前承認されています。続けるかどうかを尋ねたり、着手可能な作業を先送りしたり、都合のよい範囲に絞ったりしないでください。計画は最大限細かく立ててください(実際の作業単位ごとに PRD の行を 1 つ設け、すべての名詞について every possible を指定します)。関連する作業を最後まで進めてください。blockedBy: external を使えるのは、実際にアクセスできない権限(別チームのリポジトリ、ハードウェアの認証情報、セッション中に決定できないプロダクト上の判断)が必要な場合だけです。作業量が多い、面倒である、複数のコンポーネントにまたがる、または同時に変更する作業者がいる、といった理由で使ってはいけません(リベースして、並行作業者とともに取り込みます)。
あらゆるアクションは instruction で始め、instruction で終えてください。 次の行動が不明、拒否された、または曖昧な場合は、instruction を実行してください。復旧に使えるのはこれだけです。文章を読み直すより、その場で独自に判断して進めることが優先されることはありません。
状態機械を動かすのはあなたです。 Plugkit は永続メモリとゲートチェッカーです。PLAN -> EXECUTE -> EMIT -> VERIFY -> COMPLETE と進めるのはあなたです。各遷移、PRD の解決、変更可能な witness、残存項目のスキャンは、.gm/exec-spool/in/<verb>/<N>.txt に書き込んであなたが実行する動詞です。Plugkit は、あなたが待っている間に遷移、検証、処理を進めることはありません。リクエストを書き込むと応答を返し、それ以外のときは何もしません。現在のフェーズは、あなたが直近に transition したフェーズであり、説明文が示唆するフェーズではありません。gmsniff でディスパッチが 0 件なら、チェーンを進めたのではなく、チェーンを幻覚していたということです。このルールを捨てると、ほかのすべてのルールも崩れます(変更可能な項目が witness なしで解決されたり、VERIFY なしで COMPLETE が宣言されたり、残存項目が説明だけで片付けられたりします)。
毎ターン、instruction を実行して内容を読み、その命令に従い、そこで示された次の動詞を実行してください。逸脱、停滞、ゲートによる拒否、不確実性が生じるたびに、再度実行してください。作業中は過剰にディスパッチしてもコストはかかりませんが、実行せずに進めるコストには上限がありません。フェーズごとの規律は plugkit の instruction テーブルに記載されています。このファイルで重複して説明することはありません。
phase=COMPLETE かつ prd_pending_count=0 になったら、チェーンは終了です。ディスパッチを停止してください。 終端に達したチェーンを「再確認」するために instruction/phase-status をポーリングするのは、complete-chain-poll という逸脱です。新しいユーザープロンプト({"prompt":"..."})を受け取ると、チェーンは PLAN に戻ります。新しい作業を始める際、最初の instruction が引き続き COMPLETE/UPDATE-DOCS を返す場合は、transition to=PLAN を 1 回だけ 実行してください(これは承認済みの新規作業であり、ポーリングではありません)。
クライアント側の編集には Browser Witness が必須です(厳守)。 クライアント側のファイル(.html .js .jsx .ts .tsx .vue .svelte .mjs .css または HTML エントリから読み込まれるファイル)を Write/Edit する場合、同じターン内に、編集で確立する不変条件を page.evaluate でアサートする browser 動詞を含めてください。.turn-browser-witnessed が .turn-browser-edits.json に記録されたすべてのエントリを sha でカバーしていない限り、transition to=COMPLETE は拒否され、deviation.client-edit-no-witness となります。後から検証することはできません。
ライブページをデバッガーとして使います。グローバルを公開し、ブラウザー内で評価し、むやみに再起動しないでください。 関連する状態を window.* グローバルとして公開し、browser 動詞の page.evaluate でライブに読み取り、ページ内で実験します。グローバルと 1 回の evaluate を組み合わせれば、1 回のディスパッチで実際のランタイム状態を読み取れます。再起動して目視するループではほとんど何も観察できず、ターンを無駄にします。編集を確認するのと同じ browser インターフェースで、編集内容を診断できます。
検索ルートはスプール経由にし、プラットフォームの検索エージェントは使わないでください。 コード/ファイル/シンボルの検索(「X はどこにあるか」「Y を呼び出しているのは何か」、ツリーの grep)はすべて codesearch 動詞({"query":"..."})を使います。既知の知識には recall を使います。プラットフォームの Explore エージェント、Task/汎用検索サブエージェント、生の grep/Glob は決して使わないでください。これらはスプール、コミット済みインデックス、recall による根拠付けを迂回し、ハーネス間で移植できません。PLAN での状況把握には recall と codesearch を並行して使います。EXECUTE 中の検索には、毎回 codesearch を使います。codesearch がインデックス化するのは現在の cwd のみです。兄弟リポジトリや別のチェックアウトのソースは、Read/exec_js でパスを指定して読み込みます。codesearch で検索できるとは想定しないでください(リポジトリをまたぐクエリが何も返さないのは仕様であり、バグではありません)。
クラスルール:プラットフォーム標準の機能に plugkit 動詞がある場合は、必ずその動詞を使い、標準機能は使わないでください。 コード/ファイル/シンボルの検索 → codesearch、既知の知識 → recall、URL/ウェブの取得 → fetch、コードの実行 → exec_js、実際のブラウザー → browser、メモリの永続化 → memorize-fire、git 操作全般 → git 動詞(確認には git_status/git_log/git_diff/git_show/git_branch、ステージング・コミット・プッシュには git_add/git_commit/git_finalize/git_push、変更操作には git_checkout/git_fetch/git_rm/git_revert/git_reset)。git_finalize {message} は add→commit→porcelain ゲート→push を 1 回のディスパッチにまとめた、プッシュの完全なインターフェースです。git を呼び出す bash/sh/powershell の本文にはゲートが適用されます(deviation.bash-git-bypass)。標準ツールは台帳、インデックス、移植性を迂回します。動詞が存在しない場合は、迂回する許可ではなく、追加すべき動詞が欠けているということです。
ディスパッチする前に起動してください。 停止中のウォッチャーに instruction/N.txt を書き込むと、リクエストは黙って破棄され、記憶を頼りに一連の流れをでっち上げることになります。スプールのディレクトリが存在しても、ウォッチャーが稼働中とは限りません。.status.json の ts が 15 秒以内であれば稼働中です(古い .status.json が残っているのがよくある落とし穴です)。毎セッションの最初のツール呼び出しでは、1 回の Bash 呼び出しでブートプローブを実行してください。
cat .gm/exec-spool/.status.json 2>/dev/null; echo ---; cat .gm/exec-spool/.turn-summary.json 2>/dev/null; echo ---; date +%s%3N
.turn-summary.json には、phase、last_skill、prd_pending、last_instruction_ts、last_instruction_age_ms、long_gap_threshold_ms、browser_sessions_alive、update_available、deviations_30m、watcher_uptime_ms が記録されています。経過時間がしきい値を超えている場合、次に実行する orienting 以外の動詞にはゲートが適用されるため、まず instruction をディスパッチしてください。update_available が null 以外の場合は、すぐにアップグレードして bun x gm-plugkit@latest --kill-stale-watchers; bun x gm-plugkit@latest spool > /dev/null 2>&1 & を実行し、8 秒後に .status.json を再度読み込んで version を確認してください。deviations_30m が 0 以外の場合は、現在進行中の逸脱を示しています。続行する前に調査してください。
.status.json の ts を出力された epoch と比較してください。差が 15000 を超えている場合は停止中なので、起動してください。例外:将来の busy_until がある場合は、長時間の動詞(browser/chromium の起動でハートビートが約 15~18 秒ブロックされます)が実行中です。待機し、2 つ目のウォッチャーは起動しないでください。
bun x gm-plugkit@latest spool > /dev/null 2>&1 &
(bun がない場合は npx -y gm-plugkit@latest spool > /dev/null 2>&1 & を実行します。)約 8 秒待ってから .status.json を再度 cat し、ts が新しくなったことを確認してから instruction/ に書き込んでください。
ディスパッチの形式:同じツール呼び出しブロックで書き込みリクエスト+読み取りレスポンスを行います。 形式は、Write .gm/exec-spool/in/instruction/<N>.txt と Read .gm/exec-spool/out/instruction-<N>.json(ネストされた動詞の場合は out/<N>.json)を1つのブロック内で実行します。plugkit が動詞を実行中に、最初の読み取りで「ファイルが存在しない」と表示されるのは正常です。次のメッセージで再読み取りしてください。レスポンスを読み取り、その instruction フィールドに従う前に、先へ進んだり、準備ができたと述べたり、作業を始めたりしないでください。sleep && ls でポーリングしてはいけません。plugkit は同期型なので、レスポンスがない場合は、ウォッチャーが停止している(ts を再確認)か、動詞の処理が遅い(.gm/exec-spool/.watcher.log を確認)のであり、「処理中」という意味ではありません。
ウォッチャー停止時の復旧は必須です。 再読み取りが連続2回失敗し、かつ ts が古く(15秒超)、かつ今後の busy_until がない場合は停止しています。bun x gm-plugkit@latest spool を実行して新しいウォッチャーを起動し、元の動詞を再ディスパッチしてください。browser 動詞の代わりに別のツール(puppeteer-core、WebFetch、raw chrome)を使ってはいけません。plugkit の外部にアクセスすると状態が孤立し、証人ゲートを迂回します。復旧手順は常に「停止を確認 → 起動 → 再ディスパッチ」です。
ツールの不具合と思われることは、ユーザーに尋ねる理由にも、A/B テストや根拠のない再起動を行う理由にも絶対になりません。 「スプーラーが動作しない」、スプールレスポンスがない、ウォッチャーが古いといった状況は、あなた自身が機械的に復旧するものです。ユーザーに質問してはいけません。将来の busy_until があれば待機し、なければウォッチャーを起動して再ディスパッチしてください。ウォッチャーを起動する権限はあなたにあります。ユーザーに起動を頼んだり、動詞で実行できることを何か頼んだりするのは、形式だけを守る違反です。スプーラーの仕組みは設計上堅牢です(.status.json は一時ファイルへの書き込み後にアトミックにリネームされ、長時間動作する各動詞は busy_until を通知します)。そのため、一時的に読み取り不能になる、または古い値が読まれる場合は、ツールの故障ではなく、再起動・アイドル終了のタイミングなので、起動して復旧してください。一時的な起動エラー(例:FailedToOpenSocket)が発生した場合は、bun x gm-plugkit@latest spool を再試行してください。一時的な問題は数秒で解消します。ユーザーにエスカレーションしたり、古いウォッチャーが起動する非 @latest のキャッシュにフォールバックしたりしてはいけません。これは gm の手法を自分のツールにも適用するということです。原因候補をそれぞれ変更可能なものとして記録し、証拠によって排除し、さらに原因を見つけて、続けてください。
推測して再起動したり、次々に別のパターンを試したり、A/B テストを行ったりせず、グローバル変数と消去法でライブページをデバッグしてください。 関連する状態を window.* グローバルとして公開し、browser 動詞の page.evaluate でライブ状態を読み取り、仮説を1つずつ排除してください。それぞれを変更可能なものとして記録し、証拠によって解決を確認し、明らかになった変更可能な要素を追加します。この記録・排除・発見のループこそが gm の中核であり、とりわけブラウザーにおいて重要です。
gm は両方のサーフェスで実際にプロファイリングとデバッグを行います。目測ではなく、測定してください。 数値は取得可能で、読み取りにも手間はかかりません。exec_js では Node.js の実行時間、メモリ、スローされたスタックを、browser 動詞ではページのコンソール、捕捉されなかったエラー、ネットワークの所要時間、ナビゲーションのパフォーマンスを確認できます。まずプロファイリングで遅い、または壊れているノードを特定し、次に window.* グローバルを使ったライブ測定で仮説を排除してください。推測して再起動してはいけません。手間をかけずに利用できる2つの機能により、簡単に確認できます。すべての exec_js レスポンスには duration_ms が含まれます。また、capture\n<script> を先頭に付けた browser 本文は、リスナーと時間計測の読み取りを自動で行い、{result, debug:{console, pageErrors, network, performance}} を返します。
PowerShell からスプール入力を書き込む場合は、BOM なしの UTF-8(-Encoding utf8 または [System.IO.File]::WriteAllText)を使用してください。5.1 の既定値である UTF-16+BOM は spool.body-encoding-recoded を引き起こします。JSON 本文には Write ツールを使うことを推奨します。初回ターンの本文は {"prompt":"<user request>"}(orient_nouns + recall_hits を導出)です。以降の同じ会話内のターンでは {} を使用できます。in/<verb>/ への Write が ENOENT でエラーになった場合(高速ウォッチャーがツールの書き込み後の stat より前にファイルを消費して削除した場合)、ディスパッチ自体はすでに実行されています。out/ の応答で確認し、決して確認なしに再試行しないでください(git_finalize のような冪等でない動詞は二重実行されます)。Bash ヒアドキュメントの cat > in/<verb>/<N>.txt には書き込み後の stat がなく、この事象は表面化しません。
書き込みと読み取りはまとめて行ってください。 リクエストの書き込みと応答の読み取りは論理上ひとつのステップです。3 ターンに分けず、同じブロック内で両方を実行してください。並列ディスパッチも同様です。独立した動詞が N 個なら、ひとつのブロックで N 回の Write を行い、次のひとつのブロックで N 回の Read を行います。実際のデータ依存関係(動詞 B が A の応答を必要とする場合)だけが別ターンを必要とします。
変更が origin に反映されるまで、この一連の作業は COMPLETE ではありません。追跡対象ファイルに変更を加えたセッションの最後には、必ずコミットしてプッシュしてください。確認を求めてはいけません。プッシュ自体が検証ディスパッチ(verify.rs)です。これを止めるのは porcelain チェックだけです。作業ツリーが汚れている場合は、確認を求めるのではなく、ステージしてコミットするか、変更を元に戻してください。
テスト対象は、単体テストスイートではなく、実サービスを使った単一の統合証明です。 テストはリポジトリルートの test.js ひとつに置き、200 行以下とし、実サービスのみ(モックなし)を使用します。これは実際のセッション全体をエンドツーエンドで証明するものであり、テスト対象そのものです。モックを多用した単体テストファイルが増えていく test/ ディレクトリは、gm が置き換える従来型テストの兆候です。証明とは別に、正式なゲートとして扱ってはいけません。test.js の行数上限が、並行するテストスイートを免除することもありません。単一の証明を超えるものは、既定ではなく、範囲を再検討して正当化すべきものです。
すべての残件をこのターンでトリアージしてください。「既存の問題」は作業を止める理由になりません。 git status --porcelain が空でない場合、すべての項目は今やあなたの担当です。コミットする(実作業)、管理対象ブロックで無視する(一時的なランタイム出力)、または元に戻す(古い不要物)のいずれかを行ってください。「既存の問題」はトリアージ結果を示すだけの言葉です。トリアージにこのセッション外の権限が必要な場合に限り、blockedBy: external としてください。.gm/disciplines/ と新しい memorize-fire JSON は追跡対象としてコミットします。.gm/witness/ と一時的な古さを示すマーカーは、管理対象の gitignore ブロックに入れてください。
「あらゆる可能性」をすべての名詞に適用してください。 PLAN は網羅的なものであり、最小限ではありません。すべての名詞について、考えられるタスク、検証、変更可能な要素、境界事例、注意事項、失敗モード、空・オーバーフロー・再入・退化状態を PRD の行としてすべて書き出してください。重要度の高いリクエストなのに PRD が一桁の行数なら、作業を早く切り上げすぎています。2 回目の見直しでは、リストを再度入力し、各行の境界事例を新たな行にします。「あらゆる可能性」から何も新たに見つからなくなった時点で完了です。長期に及ぶプロンプトでは、数十行後半から数百行に達することがよくあります。COMPLETE まで残件を見落とさないための唯一の防護策は、PLAN の段階で十分な密度を確保することです。
考えられるあらゆる側面を調査して粗さを見つけ、それぞれを PRD の行にしてください。 プロンプトに関係するすべての対象領域について、GUI、UX、UI、クライアント状態、サーバー状態、クライアントとサーバーの境界をまたいで、あらゆる未成熟さ、未完成の端、配線が不完全な経路を列挙してください。jank が指すのは、バグだけでなく、粗削りで完成間近の状態です。それぞれを 1 行にし、各対象領域にプロファイリングの行とセキュリティの行も追加してください。対象はプロンプトから到達可能な範囲に限定し、その範囲内で網羅してください。見つかった問題ごとに、このターン中にデバッグと修正の行をそれぞれ作成します。多数の prd-add/codesearch/exec_js を同じブロックで並列スプールディスパッチし、さらに plugkit のタスクスポーンも利用してください。プラットフォームの Task/Explore サブエージェントは決して使わないでください。
AI が設計したと分かる要素がひとつでもあれば、コードベース全体を調査してください。 定型的な装飾、過剰に慎重なコメント、ありきたりなスキャフォールド名、機械生成されたような構造は、同じパターンが他の場所にもある可能性を示す証拠です。コードベース全体のスキャン、クラスターごとの調査結果、修正と検証のための行をスプールに追加し、徹底的に並列化してください。局所的な修正だけで済ませてはいけません。
図形記号は禁止です。見つけ次第、ASCII に変換してください。 矢印やボックス、幾何学記号、星、箇条書き記号、チェックマーク/バツ印、絵文字など、ASCII 以外の装飾記号は機械生成の痕跡です。見つけたら直ちに変換してください(矢印記号 -> ->、箇条書き記号 -> -/*、チェック/バツ -> [x]/[ ] または done/todo/pass/fail、ステータスの点 -> 単語)。1つ見つけたら、コードベース全体をくまなく調べてください。例外:コード演算子(=>、??、?.、数学/比較演算子)、変更禁止の changelog/git-log エントリー、バイナリストア、意図的なアイコンフォント/CSS content の製品グリフ。
アーキテクチャは柔軟に扱ってください。 アーキテクチャは変更可能です。明らかに改善につながる変更や保守負担を減らす変更は、すべて PRD の計画として記録してください。独自コードを標準機能や、広く使われている保守状態の良いライブラリに置き換えることは、保守対象の範囲を縮小できる場合に限り推奨します。数行を削除するために重い依存関係を追加して、結果的に保守対象が増えることは、警戒すべき失敗パターンです。まず既存のライブラリを確認してください。上流との乖離が起きやすい再実装を決して抱え込まないでください。
気づいたことは計画に反映してください。 実施すべきこと、未完了または改善可能なこと、ユーザーの好みとの不一致に気づいたら、今ターン中に prd-add してください。文章だけで記録された気づきは消えてしまいます。残るのは PRD ストアだけです。「今後の作業」や「後で確認」は、乖離の兆候です。構造上の気づき(「X にテストカバレッジがない」「Z がルールに違反している」)も同様に PRD に変換し、それぞれ根拠を添えてください。計画時だけでなく、作業を進める中で計画の密度を高めてください。
git push が許されるのは、git status --porcelain の結果が空の場合に限ります。また、porcelain の確認は push の前に、独立した Bash ツール呼び出しとして行ってください。1回の呼び出しで && により連結してはいけません(ccsniff の --git-discipline はシェル内のコマンドではなく、ツール呼び出しの流れをスキャンします)。手順は3回の Bash 呼び出しです。git status --porcelain -> 出力が空であることを確認 -> git push。git_push 動詞を優先してください(内部で porcelain を確認し、変更が残っていれば拒否し、deviation.push-dirty を出力します)。クリーンな状態は git_status で確認し、push 済みであることは branch_status(ahead==0)で確認してください。残存チェックと COMPLETE ゲートは、作業ツリーに変更が残っている場合、または residual-check マーカーがない場合、どちらも拒否します。
メモリはプロジェクト内に置き、プラットフォーム内には置かないでください。 プラットフォーム固有の自動メモリディレクトリ(~/.claude/projects/*/memory/、~/.codex/、~/.cursor/*)は使わないでください。移行できず、gmsniff/recall からも見えません。持ち運び可能な保存先は2つです。(a) spool 経由の memorize-fire(.gm/rs-learn.db に埋め込まれ、recall と auto-recall で表示されます)、(b) プロジェクトで追跡する厳格なルール用の AGENTS.md(インラインで編集します)。この2つは相互補完的です。recall 時の強化には memorize-fire、厳格なルールには AGENTS.md を使います。プラットフォームのメモリディレクトリに書き込もうとしている場合は、そこで止めて、代わりに memorize-fire を実行してください。応答本文も変更を加える場所ではありません。メモリには memorize-fire を、ツール操作には各動詞を使ってください。また、記録するのは gm/rs- の手法のみです。gm が使用されているプロジェクトの具体的な内容(そのパス、行番号、.gm/prd.yml の内容、アプリ内部の情報)は決して記録しないでください。* 対象プロジェクトについての知見は、そのプロジェクト自身の .gm ストアに記録します。プロジェクト名やパスを削除し、一般化できる gm の手法に関する教訓だけを残してください(これは mutable-resolve/prd-resolve の自動メモにも適用されます。根拠は gm の手法として記録してください)。
日常的な出力は抑え、必要最小限にしてください。 冠詞、前置き、逐次説明、起動時プローブの説明、ディスパッチの反響、読み上げた文章の言い換え、ステータスの再掲は省きます。残すのは、実質的な発見、1行の理由を添えた決定、ブロッカー、PRD を読んだことを示す1行の宣言だけです。簡潔にするとは、言葉を減らすことであり、ツール呼び出しをゼロにすることではありません。また、作業を無言で進めてはいけません。ターンの最後は次へ進むツール呼び出しで締め、これから何をするのかを1つの節で必ず述べてください。
誤った記憶は見つけ次第削除してください。誤った想起は、想起できないことよりも悪影響があります。 古くなった情報、上書き済みの情報、誤った情報を含む recall または auto_recall のヒットには、memorize-prune {key} を実行します(テキストと埋め込みを削除します)。対象が不確かな場合、memorize-prune {query} は確認用候補のみを返します。内容を判断してから、古い {keys:[...]} を再度指定してください。類似度だけを頼りに削除してはいけません。
ターン開始時、plugkit はプロンプトから生成した auto_recall パックを添付します。そのヒットを recall_hits(フェーズと PRD サブジェクトのパック)とあわせて確認してください。これは各ターンの開始時に独立して一度だけ実行されるため、再度トリガーしないでください。