
安全なデフォルト設定を自動的に適用してGitHubリポジトリを作成します。作成後の5分間の設定チェックリストを1つのコマンドに置き換えます。``` gh-safe-repo create <owner/repo>
ブランチ保護、イミュータブルタグ、Dependabot、制限されたActions権限、プッシュ保護付きシークレットスキャン — これらすべてが、最初のコードを書く前に設定されます。
> **ステータス:** gh-safe-repo は活発に開発中です。コアユースケース — 安全なデフォルト設定で新しいリポジトリを作成する — では問題なく動作しますが、CLIオプションはユーザーの期待により合致するようまだ調整中です。リリースとCI/CDが固まるまでは破壊的変更が発生する可能性があります。✌️
---
## 得られるもの
GitHubのデフォルト設定は、セキュリティではなく発見しやすさと柔軟性に最適化されています。新しいリポジトリはすべて、ブランチ保護なし、Dependabotなし、そしてリポジトリへの書き込みアクセスを持ち自身のプルリクエストを承認できるActions付きで作成されます。
`gh-safe-repo` はこれらすべてを一度に修正し、まず計画を表示します:
- **デフォルトでプライベート** — 世界中に公開したい場合は `--public` を渡します
- **ブランチ保護** — PR必須、1件の承認レビュー、古いレビューの却下、会話の解決、force push禁止、ブランチ削除禁止
- **イミュータブルタグ** — リリースタグは書き換えや削除ができません
- **Actionsのロックダウン** — 読み取り専用トークン、自己承認PRの禁止、SHA固定のアクション、GitHub所有および検証済みパブリッシャーのみ
- **Dependabot有効化** — 脆弱性アラートと自動修正PR
- **プッシュ保護付きシークレットスキャン** — サポート対象のシークレットを含むコミットはブロックされます
- **プライベート脆弱性報告** — 研究者は公開せずにあなたに連絡できます
- **プリフライトシークレットスキャン** — 既存のコードをプッシュする場合(`--local` / `--from`)、GitHubに到達する前に作業ツリーとgit履歴がローカルでスキャンされます
- **オプトインの追加機能** — wiki、projects、issuesは、管理を要求しない限りそのままにされます(設定で `has_wiki = false`)
すべてが設定可能です。正確な設定については[安全なデフォルト設定の全体](#safe-defaults-in-full)を、変更方法については[設定](#configuration)を参照してください。
## 要件
- **Python 3.10+**
- **認証済みの [`gh` CLI](https://cli.github.com/)**(`gh auth login`)、**または** 環境に設定された `GITHUB_TOKEN`
- ソースからのインストールには **[`uv`](https://docs.astral.sh/uv/)**
- **truffleHog v3** *(オプション)* — プリフライトスキャナーで使用され、PATHから自動検出されるかpodman/docker経由で実行され、どちらも存在しない場合は正規表現フォールバックが使用されます
`--local` または `--from` でコードをプッシュする場合、GitHub用の通常のgit認証情報が追加で必要です — [ローカルまたは既存のコードからの作業](#working-from-local-or-existing-code)を参照してください。
## インストール```bash
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
これは gh-safe-repo を uv のツール環境にインストールし、PATH に追加します。
インストールせずに実行するには:```bash uv sync # creates .venv ./gh-safe-repo create <owner/repo>
## 最初のリポジトリ
**1. プレビュー。** `--dry-run` は API 呼び出しを一切行いません — 何も作成されません:```
$ gh-safe-repo create AriESQ/demo-repo --dry-run
Configuring AriESQ/demo-repo...
Planned Changes
Type Category Setting Value / Note
------ ----------------- -------------------------------------- ----------------------------------------------------------------
ADD repo repository AriESQ/demo-repo
DELETE file readme README.md
UPDATE actions allowed_actions 'all' → 'selected'
UPDATE actions verified_allowed False → True
UPDATE actions sha_pinning_required False → True
UPDATE actions default_workflow_permissions 'write' → 'read'
UPDATE actions can_approve_pull_request_reviews True → False
SKIP branch_protection branch_protection Branch protection requires a public repo or paid GitHub plan
SKIP security dependabot_alerts Requires a public repo or paid GitHub plan
SKIP security secret_scanning Requires a public repo or paid GitHub plan
SKIP security dependabot_security_updates Requires a public repo or paid GitHub plan
SKIP security private_vulnerability_reporting Requires a public repo or paid GitHub plan
SKIP security enable_dependency_graph Requires a public repo or paid GitHub plan
SKIP security enable_secret_scanning_push_protection Requires a public repo or paid GitHub plan
SKIP tag_protection tag_protection Tag protection rulesets require a public repo or paid GitHub plan
7 change(s) to apply, 8 skipped
Dry run — no changes made.
上記の SKIP 行は無料プランのプライベートリポジトリです。これらの機能にはパブリックリポジトリまたは有料プランが必要です。何もサイレントに失敗することはありません — GitHub プランの制限 を参照してください。
2. 適用。 --dry-run なしで同じコマンドを実行します。同じプランが表示され、その後確認プロンプトが表示されます(--yes でスキップできます):```bash
gh-safe-repo create AriESQ/demo-repo
**3. 作業を開始します。** 成功すると、リポジトリのURLとそのまま貼り付けられるリモートコマンドが表示されます:```
╭─ Done ───────────────────────────────────────────────────╮
│ Repository created successfully! │
│ https://github.com/AriESQ/demo-repo │
│ │
│ Add remote to existing repo: │
│ SSH : git remote add origin [email protected]:AriESQ/… │
│ HTTPS: git remote add origin https://github.com/… │
│ │
│ Clone fresh: │
│ SSH : git clone [email protected]:AriESQ/demo-repo.git │
│ HTTPS: git clone https://github.com/AriESQ/demo-… │
╰──────────────────────────────────────────────────────────╯
リモートは、優先プロトコルが最初に表示されます(gh config get -h github.com git_protocol)。
gh-safe-repo create <owner/repo> # private (default) gh-safe-repo create <owner/repo> --public # public — branch and tag protection apply
`create` をそのまま実行すると、デフォルトブランチが存在するようにリポジトリが初期化され(ブランチ保護にはデフォルトブランチが必要)、その後、自動生成された `README.md` が削除されるため、クリーンな状態から始められます。これを保持するには、config で `auto_init = true` を設定します。
### 既存のローカルプロジェクトをプッシュする```bash
gh-safe-repo create <owner/repo> --local ~/projects/myapp
最初にディレクトリ内のシークレットをスキャンし、リポジトリを作成してすべてのブランチとタグをプッシュした後、元のディレクトリで origin と上流トラッキングを設定するため、git push がすぐに機能します。別の場所を指す既存の origin はそのまま残されます。警告と成功バナーが、代わりに実行すべき正確な git push -u origin <branch>:<branch> を通知します。ローカルまたは既存のコードからの作業を参照してください。
gh-safe-repo create <owner/repo> --from <owner/source> gh-safe-repo create <owner/pub> --from <owner/priv> --public # the riskiest move — scanned thoroughly
ソースを完全な履歴とともにクローンし、スキャンして、安全なデフォルト設定で新しいリポジトリにミラーリングします。スキャン時に中止した場合、コードが新しいリポジトリに到達することはありません。
### すでに持っているリポジトリを監査する```bash
gh-safe-repo fix <owner/repo> --dry-run # what's out of compliance?
gh-safe-repo fix <owner/repo> # apply the missing defaults
gh-safe-repo fix <owner/repo> --yes # no prompt, for scripts
fix は各設定の現在値を取得し、差分があるものには UPDATE、すでに正しいものには SKIP を表示し、no-op に対しては API 呼び出しを一切行いません。設定のみを対象としており、シークレットスキャンは行いません。リポジトリの管理者権限が必要で、そのリポジトリは組織または別アカウントが所有するものでもかまいません。
gh-safe-repo scan . gh-safe-repo scan ~/projects/myapp
ローカルのみ。重大な検出事項がない場合は終了コード `0`、ある場合は `1` を返すため、次のように組み合わせられます:```bash
gh-safe-repo scan . && git push
プリフライトセキュリティスキャナーを参照してください。
gh-safe-repo [--config PATH] [--debug] create <owner/repo> [OPTIONS] gh-safe-repo [--config PATH] [--debug] fix <owner/repo> [OPTIONS] gh-safe-repo [--config PATH] [--debug] scan [OPTIONS]
`--config` と `--debug` はグローバルです。コマンドの前後どちらに指定してもよく(`gh-safe-repo --debug fix owner/repo` と `gh-safe-repo fix owner/repo --debug` は同等)、両方を指定した場合は後から指定したものが優先されます。その他のすべてのオプションはコマンド固有であり、コマンドの後に指定する必要があります。`--config` は省略可能な値を受け取るため、値なしの `--config` は最後に指定する必要があることに注意してください — `gh-safe-repo --config scan ./src` は `scan` をパスとして読み取ります。
GitHub とやり取りするすべてのコマンドは `owner/repo` 形式(例: `myuser/my-repo`)を必要とします。`create` の場合、owner は認証済みの GitHub アカウントに対して検証され、マルチアカウント環境でのミスを防ぎます。`fix` の場合は代わりにターゲットリポジトリに対する管理者権限が必要で、管理者アクセスを持つ組織や他のアカウントが所有するリポジトリを修正できます。
#### `create` — 新しいリポジトリを作成する