mcpField
S
safe-push

safe-push

github.com/thatrebeccaraeセキュリティ187100 回インストール24 週間前に更新
リポジトリ

safe-push について

GitHub リポジトリへのプッシュ前に、変更内容とコミットメッセージを調べる Claude スキルです。機密情報、リポジトリの公開状態、プッシュ手順を確認し、実行前に承認を求めます。

主な機能

  1. 01差分から個人情報やシークレットを検査
  2. 02コミットメッセージ全体を監査
  3. 03個人用の正規表現ブロックリストを適用
  4. 04公開・非公開に応じて検査を調整
  5. 05プッシュ前に承認を要求

活用シーン

  1. 01公開リポジトリへのプッシュ前確認
  2. 02追跡対象ファイル全体の機密情報監査
  3. 03プッシュ範囲のコミットタイトルと本文を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/thatrebeccarae/claude-marketing --skill safe-push

インストール後、Claude Code で/safe-pushを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

EXAMPLES.md
LICENSE
REFERENCE.md
safe-push-blocklist.template

詳細

Safe Push

GitHub リポジトリ向けの push 前衛生チェックです。ユーザーがコードの push を依頼した場合、特にパブリックリポジトリへの push で使用します。

トリガー

ユーザーが「push」「safe push」「push to GitHub」と言うか、/safe-push を実行した場合にトリガーされます。

インストール

このスキルは ~/.claude/safe-push-blocklist からパターンを読み込みます。同梱のテンプレートをコピーして、必要に応じてカスタマイズしてください。

cp safe-push-blocklist.template ~/.claude/safe-push-blocklist
$EDITOR ~/.claude/safe-push-blocklist

テンプレートには、クライアント名、ホスト名、IP 範囲、トラッキング ID、Slack トークンの形式に関するコメントアウト済みの例が含まれています。ご利用の環境に合わせた値に置き換えてください。

ファイルが見つからない場合、スキルはエラーではなく警告を出して実行されます。ただし、個人用パターンのチェックはスキップされるため、ファイルを作成することを強く推奨します。

手順

1. リポジトリを分類する
# Check if public repo
git remote -v
# Check for .public-repo marker
test -f .public-repo && echo "PUBLIC" || echo "private or unmarked"

パブリックの場合(またはパブリックリモートに push する場合):以下のすべてのチェックを適用します。 プライベートの場合:PII スキャン(手順 2)のみを適用します。

2. PII とシークレットのスキャン

個人用パターンリストを ~/.claude/safe-push-blocklist から読み込み、それに照らしてスキャンします。同じパターンを差分の内容(手順 2)とコミットメッセージ(手順 3)の両方に適用します。どちらも同じ信頼できる情報源を使用して実行します。

デフォルトモード — 対象ブランチとの差分をスキャンします。

# Load personal patterns (graceful fallback if file missing):
if [ -f ~/.claude/safe-push-blocklist ]; then
  PATTERNS=$(grep -v '^#' ~/.claude/safe-push-blocklist | grep -v '^$' | paste -sd '|' -)
else
  PATTERNS=""
  echo "WARNING: ~/.claude/safe-push-blocklist not found. Personal pattern checks skipped."
fi

git diff origin/main...HEAD
[ -n "$PATTERNS" ] && git diff origin/main...HEAD | grep -nE "$PATTERNS" \
  || echo "NO MATCHES IN DIFF"

リポジトリ全体モード(/safe-push --full)— 差分だけでなく、追跡対象のすべてのファイルをスキャンします。ベースライン監査、既存リポジトリの初回 push、または定期的な衛生チェックに使用してください。

git ls-files | xargs grep -n -E "$PATTERNS" \
  --include='*.md' --include='*.py' --include='*.js' --include='*.ts' \
  --include='*.html' --include='*.sh' --include='*.json' \
  --include='*.yml' --include='*.yaml'

以下のカテゴリを確認します(正規表現で検出できる項目は ~/.claude/safe-push-blocklist で網羅します)。

  • クライアント名または内部プロジェクトのコードネーム
  • 個人用インフラストラクチャ:ホスト名、内部ディレクトリ名、デバイス ID、ハードウェアモデル、セルフホストサービス名
  • メールアドレス(個人用またはクライアントのもの)、電話番号、住所
  • API キー、トークン、シークレット(AWS、GitHub、Slack、Telegram、汎用)
  • プライベート IP アドレス、内部ホスト名
  • 秘密鍵のデータ
  • Slack トークン(xoxb-)、Slack チャンネル ID
  • トラッキング ID:GA4(G-XXXXXXXXXX)、GTM(GTM-XXXXXXX)

個人用パターンを管理するには、~/.claude/safe-push-blocklist を編集してください。このスキルファイルに、実際のクライアント名やインフラストラクチャ識別子をハードコードしないでください。ブロックリストを唯一の信頼できる情報源とします。

何か見つかった場合:

  • 検出項目ごとに、ファイル、行番号、検出内容を一覧表示します
  • 続行する前に、修正するようユーザーに依頼します
  • 解決するまで push しないでください
3. コミットメッセージの監査

push 範囲内の各コミットについて、コミットメッセージ全体(件名(タイトル)と本文(説明)の両方)を確認します。機密パターンはどちらにも含まれる可能性があります。

# Print the full message (subject + body) for every commit:
git log origin/main..HEAD --format="===%h %s===%n%b"

# Programmatically scan the full message text against the same
# blocklist used for diff content (graceful fallback if file missing):
if [ -f ~/.claude/safe-push-blocklist ]; then
  PATTERNS=$(grep -v '^#' ~/.claude/safe-push-blocklist | grep -v '^$' | paste -sd '|' -)
  git log origin/main..HEAD --format="%B" | grep -nE "$PATTERNS" \
    || echo "NO MATCHES IN MESSAGES"
else
  echo "WARNING: ~/.claude/safe-push-blocklist not found. Personal pattern checks skipped on commit messages."
fi

差分の内容をブロックする ~/.claude/safe-push-blocklist のパターンは、コミットメッセージもブロックします。ブロックリスト全体をタイトルと本文の両方に適用してください。差分だけでなく、両方を対象とします。パブリックリポジトリの場合は、さらに以下も指摘します。

  • 個人情報(メールアドレス、電話番号、住所)— カテゴリとして確認し、パターンマッチだけに頼らない
  • 所有するプライベートリポジトリ名(例:upstream の開発ミラー)— ソフト警告を出し、push 前にユーザーに確認する
  • 曖昧なメッセージ(「fix」「update」「wip」)— 書き換えを提案する

問題が見つかった場合は、ユーザーの承認を得たうえで、メッセージを整えるためのインタラクティブな rebase を提案します。

4. 段階的な push(レート制限)

GitHub の一括操作/自動化の悪用検知を誘発しないようにするため:

  • 50 コミット未満の単一ブランチを push する場合:通常どおり push します
  • 複数のブランチ、または 50 コミットを超える場合:
    • ブランチを一度に 1 つずつ push します
    • ブランチの push 間で 5 秒待ちます
    • 非常に大規模な push(100 コミット以上)の場合は、50 件ずつに分け、各バッチの間で 10 秒待ちます
  • 複数のブランチを含む新しいリポジトリを作成し、初期コンテンツを push する場合:
    • 最初に main/デフォルトブランチを push します
    • 10 秒待ちます
    • 残りのブランチは、5 秒間隔で一度に 1 つずつ push します
  • 段階的に実行せず、パブリックリモートに git push --all または git push --mirror を使用することは絶対に避けてください
# Example staggered multi-branch push
for branch in main develop feature/foo; do
  git push origin "$branch"
  sleep 5
done
5. 最終確認

プッシュを実行する前に、以下の概要を提示します。

  • リポジトリ:名前と公開/非公開のステータス
  • プッシュするブランチ
  • コミット数
  • プッシュ範囲内のすべてのコミットの完全なコミットメッセージのプレビュー(タイトルと本文の両方)。修正済みのコミットや、このセッションで作成したコミットも対象です
  • 手順 2~4 での警告
  • プッシュ方法(直接または段階的)

以下を使って、完全なコミットメッセージを表示します。

git log origin/main..HEAD --format="commit %h%n%n%s%n%n%b%n---"

プッシュする前に、ユーザーが各メッセージを目視で確認する必要があります。これにより、次の内容を検出できます。

  • 元の監査が適用されなくなった修正済みのコミット
  • grep の見落としにより手順 3 で表示されなかった本文の内容
  • コンテンツレビューを経ずに、このセッションで場当たり的に作成された内容

プッシュする前に、ユーザーから明示的な確認があるまで待ちます。

6. プッシュと検証

プッシュ後:

git push origin <branch>
# Verify
git log origin/<branch> --oneline -5

成功したこととリモート URL を報告します。

設定ファイル

  • ~/.claude/safe-push-blocklist — 個人用パターンブロックリストです。1 行につき 1 つの正規表現を記述し、コメントは # で始めます。/safe-push の実行ごとに読み込まれます。パターンを追加または削除するには、このファイルを編集してください。このスキルファイルにパターンをハードコードしないでください。設定方法については、上記のインストールを参照してください。
  • リポジトリ内の .pii-allowlist — 1 行につき 1 つの正規表現を記述します。一致したものは PII スキャンから除外されます(ドキュメント内のキーの例など、誤検出を許可するために使用します)。
  • リポジトリ内の .commit-msg-blocklist — このリポジトリの公開コミットメッセージに含めてはならない語句です。

注意事項

  • このスキルはグローバルな pre-commit フックを回避しません。両者は連携して動作します
  • リポジトリを公開用と非公開用に分けているプロジェクト(開発ミラー → 公開リリース)では、必ず最初に開発用リポジトリへプッシュし、同期スクリプトで同期してから、公開用リポジトリで safe-push を実行してください
  • 判断に迷う場合は、リポジトリを公開用として扱ってください

コメント