
안전한 기본 설정 — 브랜치 보호, Dependabot, 비밀 스캐닝, 사전 보안 스캐닝 — 이 자동으로 적용된 GitHub 저장소를 생성하는 Python CLI입니다.
안전한 기본값이 자동으로 적용된 GitHub 저장소를 생성합니다. 생성 후 5분 동안 설정 체크리스트를 확인하는 과정을 단일 명령으로 대체합니다.``` gh-safe-repo create <owner/repo>
브랜치 보호, 변경 불가 태그, Dependabot, 제한된 Actions 권한, 푸시 보호 기능이 포함된 시크릿 스캐닝 — 코드를 한 줄도 작성하기 전에 모두 구성됩니다.
> **상태:** gh-safe-repo는 활발히 개발 중입니다. 핵심 사용 사례 — 안전한 기본값으로 새 저장소를 생성하는 것 — 에서는 잘 작동하지만, CLI 옵션은 사용자 기대에 더 잘 부합하도록 여전히 다듬어지고 있습니다. 릴리스와 CI/CD가 확정될 때까지 호환성이 깨지는 변경이 있을 수 있습니다. ✌️
---
## 제공되는 기능
GitHub의 기본값은 보안이 아닌 발견 가능성과 유연성에 최적화되어 있습니다. 모든 새 저장소는 브랜치 보호 없이, Dependabot 없이, 그리고 저장소에 대한 쓰기 권한이 있고 자체 풀 리퀘스트를 승인할 수 있는 Actions와 함께 제공됩니다.
`gh-safe-repo`는 이 모든 것을 한 번에 해결하며, 먼저 계획을 보여줍니다:
- **기본적으로 비공개** — 전 세계에 공개하려면 `--public`을 전달하세요
- **브랜치 보호** — PR 필수, 1명의 승인 리뷰, 오래된 리뷰 무효화, 대화 해결, 강제 푸시 금지, 브랜치 삭제 금지
- **변경 불가 태그** — 릴리스 태그는 재작성하거나 삭제할 수 없습니다
- **Actions 잠금** — 읽기 전용 토큰, 자체 승인 PR 금지, SHA 고정 액션, GitHub 소유 및 검증된 게시자만 허용
- **Dependabot 활성화** — 취약점 경고 및 자동 수정 PR
- **푸시 보호 기능이 포함된 시크릿 스캐닝** — 지원되는 시크릿이 포함된 커밋은 차단됩니다
- **비공개 취약점 신고** — 연구자가 공개하지 않고도 연락할 수 있습니다
- **사전 시크릿 스캔** — 기존 코드를 푸시할 때(`--local` / `--from`), GitHub에 도달하기 전에 작업 트리와 git 히스토리가 로컬에서 스캔됩니다
- **선택적 추가 기능** — 위키, 프로젝트, 이슈는 관리하도록 요청하지 않는 한 그대로 유지됩니다(설정에서 `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을 표시하며, 변경 사항이 없는 항목에 대해서는 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`의 경우 대신 대상 repo에 대한 admin 권한이 필요하며, 이를 통해 admin 접근 권한이 있는 조직이나 다른 계정이 소유한 repo를 수정할 수 있습니다.
#### `create` — 새 repo 생성