ship-gate について
ship-gateは、コミット前にステージ済みの差分を調べる安全確認スキルです。認証情報、デバッグコード、コメントアウトされたコード、大型またはバイナリの追加ファイルを検出し、BLOCKまたはPASSで判定します。
主な機能
- 01ステージ済み差分のみを確認
- 02シークレットとAPI認証情報を検査
- 03デバッグコードとコメントアウト部分を検出
- 04大型またはバイナリの追加ファイルを特定
- 05場所を報告して最終判定を提示
活用シーン
- 01コミット前にステージ内容を確認
- 02誤って追加した認証情報や環境ファイルを検出
- 03残存するデバッグ記述や大型ファイルを発見
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ unlearndev/ skills --skill ship-gateインストール後、Claude Code で/ship-gateを入力して読み込まれたか確認します。
詳細
コミット前にステージ済みの差分を確認する
現在コミット用にステージされている内容をすべて確認し、コミットすべきでないものがあれば指摘してください。これは安全性に絞ったチェックであり、コードレビューではありません。スタイル、命名、アーキテクチャ、正確性についてはコメントしないでください。以下の4種類の問題だけを見つけ、それぞれファイル名と行番号、問題となる理由を報告し、最後に判定を1つだけ示してください。
1. ステージ済みの差分を取得する
実際にステージされている内容(--cached)だけを確認してください。ステージされていない変更は対象外です。
git diff --cached --stat # overview of staged files
git diff --cached # full staged diff (read this)
git diff --cached --numstat # added/removed line counts; "-" marks binary files
git diff --cached --name-only --diff-filter=A # newly ADDED files (for size/binary checks)
ステージ済みの差分をすべて読んでください。デバッグコード、シークレット、コメントアウトされたブロックについては、追加された行(+ で始まる行)だけを対象にしてください。コンテキストとして表示されている既存の行は、このコミットで追加されたものではないため、指摘しないでください。追加ファイル/バイナリファイルの確認では、追加されたものとして報告された作業ツリー上のファイルを調べてください。
何もステージされていない場合は、その旨を明確に伝えて終了してください。確認するものはありません。
2. 指摘対象
以下の各観点で、ステージ済みの差分を確認してください。ほとんどのコミットでは該当する項目は少数です。それで問題ありません。項目を埋めるために問題を捏造しないでください。各指摘は、実際に追加された行またはファイルを示す必要があります。
シークレットと API キー
実際の認証情報に見える追加行を対象にしてください。認証情報への参照は対象外です。以下を確認してください。
- 値がリテラルなシークレットである代入:API キー、トークン、パスワード、秘密鍵、認証情報を含む接続文字列。
- 判別可能なキーの形式:
AKIA…(AWS アクセスキー)、sk-…/sk-ant-…(OpenAI/Anthropic)、ghp_…/gho_…(GitHub トークン)、xox[baprs]-…(Slack)、Google のAIza…、Stripe のsk_live_…/rk_live_…、JWT(eyJ…)、-----BEGIN … PRIVATE KEY-----ブロック。 *_KEY、*_SECRET、*_TOKEN、*_PASSWORD、PASSWD、*_DSN、AUTH、CREDENTIALのような名前に代入された、エントロピーの高い長い文字列。
誤検知を避けるため、安全な値とシークレットを区別してください。
- 安全なため指摘しないもの: プレースホルダー(
your-api-key-here、xxxxx、changeme、example、<token>)、値が空またはダミーの.env.exampleの項目、設定から読み込む値(env('STRIPE_SECRET')、process.env.X、config(...))、明らかなテスト用フィクスチャ。 - 指摘するもの: ソースコードにコミットされた、具体的な値に見えるシークレット。また、コミット用にステージされた実際の
.envファイルに含まれるシークレット(実際の値を含む.envは通常コミットすべきではないため、その点を明示してください)。
文字列が実際に有効なシークレットか判断できない場合は、理由を説明して疑いありとして指摘してください。黙って見過ごすより、人が確認できるようにすることを優先してください。
残存するデバッグコード
そのファイルの言語を踏まえ、追加された行に明らかにデバッグ用のコードが残っていないか確認してください。
- PHP:
dd(、dump(、ddd(、var_dump(、(返却または使用されていない)print_r(、ray(、error_log(、その場しのぎで追加された\Log::debug(、Debugbar::。 - JS / TS / Vue: デバッグ目的で追加された
console.log(/console.debug(/console.warn(、debugger;、alert(。 - 全般:
TODO: remove、FIXME、XXX、一時的なsleep(、if (true)/return; // skipのようなハードコードされたテスト用切り替え。
状況に応じて判断してください。正当なエラーハンドラー内の console.error や、アプリケーション本来のログ処理の一部であるログ呼び出しは、デバッグの残骸ではありません。残されたと思われるトレースだけを指摘してください。
大きなコメントアウト済みブロック
説明文ではなく、追加された連続するコメントアウト済みのコードを対象にしてください。コメントアウトされたコードが連続しておよそ5行以上ある場合は、削除すべき不要なコードとして指摘してください。短いコメント、ドキュメントコメント、1行のメモは問題ありません。指摘しないでください。ファイルのコメント構文(//、#、/* … */、``)を使って、それがコード(文、関数本体、マークアップ)に見える内容であることを確認してください。
誤って追加された大容量ファイルまたはバイナリファイル
新たに追加されたファイル(--diff-filter=A)から確認します。
- バイナリファイル —
git diff --cached --numstatでは、バイナリファイルの追加列と削除列の両方に-が表示されます。意図せず追加されたと思われるバイナリを指摘してください。例:コンパイル済みの出力、アーカイブ、ソースにダンプされた画像、.zip、.tar、.gz、.pdf、.sqlite、.db、フォント、メディアファイル。適切に判断してください。assets ディレクトリにある意図的なアセットは問題ありません。 - 大容量ファイル — 追加されたファイルのディスク上のサイズを確認します(例:
wc -c、またはステージされた blob の場合はgit cat-file -s :<path>)。およそ 1 MB 超のものを指摘してください。また、サイズにかかわらず、そもそも git に含めるべきでない種類のもの(vendor/、node_modules/、*.log、ビルド成果物、実際の値が含まれる.env、.DS_Storeなどの OS の不要ファイル)は必ず指摘してください。
3. 検出結果の報告
Markdown で出力してください。最初に、上記 4 つのカテゴリ別に検出結果をまとめてください。該当する検出結果があるカテゴリのみを含めます。検出結果ごとに、次の内容を記載してください。
- ファイルと行番号 —
path/to/file.php:42。新しいファイル内の追加行の行番号を使用してください。コメントアウトされたブロックの場合は、開始〜終了の範囲を記載してください。ファイル全体に関する問題(バイナリ/大容量/.env)の場合は、パスだけで構いません。 - 内容 — 問題のある箇所(秘密情報は一部を省略または伏せてください。例:
STRIPE_SECRET=sk_live_51H…。有効なキーを全文表示してはいけません)。 - 理由 — コミットすべきでない理由を短い句で 1 つ記載してください。
各検出結果は 1〜2 行に収めてください。前置きやコード品質に関する補足は不要です。
4. 判定
最後に、太字の判定語を 1 つだけ記載してください。**BLOCK** または **PASS** のいずれかで、その後には何も記載しないでください。まとめや説明を続けてはいけません。理由は上記の検出結果に記載されています。
- BLOCK — 秘密情報/API キーが 1 つでもある場合、またはコミットすると問題になるほど重大な検出結果(実際の
.env、コミットされた認証情報、紛れ込んだバイナリ/大容量ファイル、明らかなデバッグ用の不要物)がある場合。秘密情報の疑いがある場合は、BLOCK と判定する方に傾けてください。 - PASS — 検出結果がない場合、または明らかに問題のない検出結果のみの場合。
形式:
**BLOCK**
または
**PASS**
実際の秘密情報が見つかった場合に、判定を甘くしてはいけません。漏えいしたキーを履歴から取り除くのは大変です。