safe-push について
GitHub リポジトリへのプッシュ前に、変更内容とコミットメッセージを調べる Claude スキルです。機密情報、リポジトリの公開状態、プッシュ手順を確認し、実行前に承認を求めます。
主な機能
- 01差分から個人情報やシークレットを検査
- 02コミットメッセージ全体を監査
- 03個人用の正規表現ブロックリストを適用
- 04公開・非公開に応じて検査を調整
- 05プッシュ前に承認を要求
活用シーン
- 01公開リポジトリへのプッシュ前確認
- 02追跡対象ファイル全体の機密情報監査
- 03プッシュ範囲のコミットタイトルと本文を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thatrebeccarae/ claude-marketing --skill safe-pushインストール後、Claude Code で/safe-pushを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
EXAMPLES.mdLICENSEREFERENCE.mdsafe-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 を実行してください
- 判断に迷う場合は、リポジトリを公開用として扱ってください