open-source-checker について
open-source-checkerは、非公開リポジトリを公開できる状態か判断する読み取り専用の監査スキルです。ライセンス、履歴内の秘密情報、内部参照、公開準備状況を確認し、公開可否を報告します。
主な機能
- 01ライセンスと帰属表示の確認
- 02リポジトリ履歴の秘密情報スキャン
- 03内部参照の検索
- 04公開準備状況の確認
- 05重大度付きの指摘と判定
活用シーン
- 01非公開リポジトリの公開前監査
- 02ローテーションが必要な認証情報の特定
- 03リポジトリ履歴に含まれる内部情報の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ shipshitdev/ skills --skill open-source-checkerインストール後、Claude Code で/open-source-checkerを入力して読み込まれたか確認します。
同梱ファイルplugin.jsonreferences/full-guide.md
詳細
オープンソース公開チェッカー
公開前のゲートです。これまでずっと非公開だったリポジトリを、誰かが公開しようとする時点で、一度だけ実行します。非公開リポジトリのすべては、外部の人には読まれないという前提で書かれています。コメント、ホスト名、クライアント名、そしてこれまでのすべてのコミットが対象です。この監査では、その前提によって残されたものを見つけます。
4 つのパスを実行し、その後に判定します。定期的に実行するコミット時のガードは別のスキルです。関連項目を参照してください。
契約
入力:
- 全履歴を取得済みのリポジトリルート(
git fetch --all --tags) - すでに決定している場合は、公開予定のライセンス
- 非公開情報として扱う名前:会社のドメイン、クライアント名、内部ホスト名
出力:
- ファイル、行またはコミット、重大度を含む、パスごとの検出結果
- 公開可/ブロックの判定と、ブロック対象の一覧
git-safetyに引き渡す、ローテーション対象と履歴書き換え対象の一覧
作成/変更:
- 何もありません。この監査は読み取り専用です。
外部への副作用:
- ありません。修正はここでは行わず、委任します。
確認が必要な操作:
- リポジトリを公開に切り替える前。判定は助言であり、切り替えは所有者が行います。
委任先:
- 認証情報のローテーション、履歴の書き換え、継続的なコミット時ガードの導入は
git-safety - アプリケーションレベルの脆弱性レビューは
security-audit
事前確認
監査の完全性は、ローカルに存在する参照の範囲に左右されます。
git fetch --all --tags --prune
git log --all --oneline | wc -l # commits in scope
git branch -a && git tag -l # refs in scope
git stash list # stashes are not in --all
すべてのリモートブランチとタグがローカルにそろった時点で完了です。
パス 1 — ライセンスと帰属表示
非公開リポジトリにライセンスは必要ありません。明確なライセンスなしで公開されたリポジトリは、見つけた人が法的に利用できません。また、あるライセンスのもとで借用したコードを、別のライセンスで再公開できるとは限りません。
確認項目:
- ルートに
LICENSEファイルがあり、所有者の意図と一致している - 依存関係のライセンスが、公開時に適用するライセンスと互換性がある — コピーレフト(GPL、AGPL)の依存関係は、寛容なライセンスでの公開を制約します
- ベンダーとして取り込んだコードやコピー&ペーストしたコードに帰属表示がある — Stack Overflow、ブログ記事、別のリポジトリから抜き出したコード片には、出典元の利用条件が適用されます
- 著作権表示が一貫しており、正しい組織名が記載されている
- 会社の勤務時間中にコードを書いた場合、雇用主の所有権が整理されている
ls LICENSE* COPYING* 2>/dev/null
bunx license-checker --summary # JS dependency licenses
grep -rniE 'copyright|\(c\) [0-9]{4}|SPDX-License' --include='*.*' -l . | head -30
grep -rniE 'adapted from|based on|taken from|source: http' --include='*.*' . | head -30
公開時に適用するライセンスが決まり、すべての依存関係のライセンスとの互換性が確認され、借用したコードのすべてに帰属表示を付けるか削除した時点で完了です。
パス 2 — 履歴内のシークレット
作業ツリーからシークレットを削除しても、それを含んでいたすべてのコミットには残っています。リポジトリを公開すると、それらのコミットも公開されます。
HEAD だけでなく、すべての参照をスキャンしてください。
# Automated sweep across all history — start here
gitleaks detect --source . --verbose
trufflehog git file://. --only-verified
# Every file that ever existed
git log --all --pretty=format: --name-only --diff-filter=A | sort -u \
| grep -iE '\.(env|pem|key|secret)$|credentials|secrets\.|id_rsa'
# Files deleted from the tree but alive in history
git log --all --pretty=format: --name-only --diff-filter=D | sort -u \
| grep -iE '\.(env|pem|key|secret)$|credentials'
# Content search across every commit
git log -p --all -S 'API_KEY' --source -- ':(exclude)*.lock'
git log -p --all -G 'AKIA[0-9A-Z]{16}' --source
また、--all では対象にならない場所も調べます。スタッシュ、マージコミット、すべてのタグが対象です。コマンドについては references/full-guide.md §3 を参照してください。
検出されたものはすべて、まず ローテーション対象、次に履歴書き換え対象です。履歴をクリーンアップしても、一度でもプッシュされた認証情報の漏えいを取り消すことはできません。
全履歴を対象に gitleaks と truffleHog の両方で問題が検出されず、過去に検出されたものすべてについてローテーションの完了が確認された時点で完了です。
パス 3 — 非公開の参照情報
ツールを使わずに行うパスであり、最も情報漏えいにつながりやすいパスです。これらは認証情報ではありません。社内でしか意味をなさない、会社に関する情報です。
| カテゴリ | 確認する項目 |
|---|---|
| 内部ホスト | *.internal、*.corp、*.local、VPN ホスト名、RFC1918 IP アドレス |
| 内部サービス | Jira/Linear のチケット URL、社内 Wiki、管理ダッシュボード |
| 人物 | 従業員のメールアドレス、個人のメールアドレス、TODO や FIXME コメント内の名前 |
| 顧客 | クライアント名、ロゴ、契約条件、テストフィクスチャ内の顧客データ |
| インフラストラクチャ | アカウント ID、バケット名、クラスター名、ステージング URL |
| 商業情報 | 価格設定のロジック、未公開の製品名、社内ロードマップのメモ |
| コミットメタデータ | すべてのコミットの作成者メールアドレス — これらも公開されます |
# Internal domains and hosts (substitute your own)
grep -rniE '@(yourcompany|internal|corp)\.(com|net|local)' . | grep -v node_modules
grep -rniE '\b(10|192\.168|172\.(1[6-9]|2[0-9]|3[01]))\.[0-9]+\.[0-9]+\b' . | grep -v node_modules
# People and intent left in comments
grep -rniE '(TODO|FIXME|HACK|XXX|NOTE)[:( ].*(ask|per|@[a-z]+)' --include='*.*' . | head -40
# Author identities that ship with the history
git log --all --format='%ae' | sort -u
git log --all --format='%an <%ae>' | sort -u | head -30
見つかった項目は、次の 1 つの質問で判断します。見知らぬ人がこれを読んで、会社が公開しない情報を知ることになりますか? ステージング URL は該当します。公開ドキュメントへのリンクは該当しません。
すべてのカテゴリを検索し、各項目を削除、無難なプレースホルダーへの置換、または所有者による明示的な許容のいずれかで処理したら完了です。
パス 4 — 公開の準備状況
見知らぬ人が最初の 30 秒で確認するもの:
- README は外部の人向けに書かれています — これは何か、実行方法、「#eng でチームに聞いてください」といった案内がないこと
.env.exampleがあり、内容も揃っているため、社内アクセスなしでセットアップできます- ドキュメント に社内 Wiki、ダッシュボード、ランブックへのリンクがないこと
- Issue と PR のテンプレート が社内プロセスに誘導しないこと
- CI 設定 が、フォークから現実的に提供できるシークレットのみを参照し、社内レジストリやランナーを参照していないこと
- テストフィクスチャ に本番データのエクスポートではなく、合成データが含まれていること
- リポジトリ設定 — 既存の
.github/設定にあるCODEOWNERSから社内チーム名が漏れる可能性があります
ls README* .env.example .github/ 2>/dev/null
grep -rniE 'internal|confidential|do not distribute|proprietary' README* docs/ 2>/dev/null
cat .github/CODEOWNERS 2>/dev/null
社内アクセスのない読者が、リポジトリに含まれる情報だけでインストール、実行、コントリビュートできる状態になったら完了です。
判定
結果は 2 つのうちいずれかを報告してください。中間状態はありません — 「ほぼクリーン」でもシークレットが公開されます。
ブロック — 公開を妨げる検出事項をすべて列挙します。
BLOCK — 3 blockers
License No LICENSE file; two AGPL dependencies conflict with intended MIT
History AWS key in commit a1b2c3d (deleted in e4f5g6h, still in history)
Private Client name "Acme Corp" in 14 files and 3 commit messages
Rotate now: AWS key AKIA… (leak precedes any rewrite)
Then hand to: git-safety clean — strip .env from all refs, force-push
Re-run this audit after the rewrite; commit hashes will have changed.
公開 — 判定を監査可能にするため、何を確認したかを記載します。
PUBLISH
License MIT at root; 214 deps all permissive; 2 adapted blocks attributed
History gitleaks + truffleHog clean across 1,847 commits, 12 branches, 40 tags
Private No internal hosts, customer names, or employee emails outside git authorship
Ready README, .env.example, CI runs on a fork without internal secrets
Note: 4 distinct author emails remain in commit history and will be public.
Next: install the ongoing commit-time guard — git-safety prevent
書き換えを行うと、検出事項に記載されたすべてのコミットハッシュが無効になるため、git-safety の完了後にパス 2 と 3 を再実行してください。
関連項目
git-safety— 日常的に利用しているリポジトリを継続的に保護するガードです。次のコミットへのシークレット混入をブロックし、強制プッシュと履歴の書き換えを制御して、ignore ルールと pre-commit フックをインストールします。この監査から引き継ぐ認証情報のローテーションと履歴の書き換えも実施します。すべてのコミット時に実行し、この監査は公開を決定する際に 1 回実行してください。security-audit— コード自体のアプリケーションレベルの脆弱性レビューです。
認証情報パターンの完全なカタログ、全 ref を対象にした履歴コマンド(stash、マージ、タグ、ブランチ)、ライセンス互換性マトリックス、非公開の参照情報を検索する手順、レポートのテンプレート: references/full-guide.md