
안전한 기본 설정 — 브랜치 보호, Dependabot, 비밀 스캐닝, 사전 보안 스캐닝 — 이 자동으로 적용된 GitHub 저장소를 생성하는 Python CLI입니다.
단 하나의 명령으로 안전한 기본 설정이 적용된 GitHub 저장소를 생성하세요.
gh-safe-repo create <owner/repo>
브랜치 보호, 변경 불가능한 태그, 잠금 설정된 Actions, Dependabot, 푸시 보호 기능이 포함된 시크릿 스캐닝, 그리고 비공개 취약점 신고 기능이 첫 커밋을 푸시하기 전에 모두 구성됩니다. 동일한 도구가 이미 보유한 저장소를 감사하고 수정하며, 코드가 로컬 머신을 떠나기 전에 시크릿을 스캔합니다.
상태: 핵심 워크플로는 안정적이며 엔드 투 엔드로 검증되었지만, CLI는 아직 다듬어지는 중입니다. 1.0 이전에는 간헐적인 호환성 깨지는 변경이 있을 수 있습니다.
--local 및 --fromGitHub의 기본값은 안전성보다 발견 가능성을 우선합니다: 새 저장소에는
브랜치 보호도, Dependabot도 없으며, Actions는 저장소에 쓰고
자체 풀 리퀘스트를 승인할 수 있습니다. gh-safe-repo는 이를 바꾸고,
무엇이든 건드리기 전에 계획을 보여줍니다:
--public을 전달하세요.모든 설정은 구성 가능합니다. 정확한 값은 안전한 기본값을, 변경 방법은 구성을 참조하세요.
요구 사항:
gh CLI (gh auth login), 또는
환경에 설정된 GITHUB_TOKENuvPATH에서 찾거나
podman/docker를 통해 실행됩니다. 둘 다 없으면 정규식 스캐너가 사용됩니다.--local 또는 --from으로 코드를 푸시하려면 GitHub에 대한 일반 git
자격 증명도 필요합니다. 코드 푸시를 참조하세요.
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
설치 없이 실행하려면:
uv sync
./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는 이를 건너뜁니다).
gh-safe-repo create AriESQ/demo-repo
3. 작업 시작. 성공하면 Verified 섹션(GitHub에서 다시 읽어온 모든 설정)과 바로 붙여넣을 수 있는 명령이 담긴 배너가 표시됩니다:
╭─ 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
저장소가 초기화되어 기본 브랜치가 존재하게 되며(브랜치 보호에 필요함), 그런 다음 자동 생성된 README.md가 삭제되어 깨끗한 상태에서 시작합니다. 이를 유지하려면 config에서 auto_init = true로 설정하세요. 소유자는 인증된 계정과 일치해야 하며, 이는 다중 계정 시스템에서의 실수를 방지합니다.
gh-safe-repo create <owner/repo> --local ~/projects/myapp
디렉터리에서 시크릿을 스캔하고, 저장소를 생성한 뒤 모든 브랜치와
태그를 푸시하고, 원래 디렉터리에 origin과 업스트림 추적을 설정하여
git push가 즉시 작동하도록 합니다. 이미 다른 곳을 가리키는 origin은
그대로 두고, 배너에서 대신 실행해야 할 명령을 알려줍니다. 이후 푸시된 모든
브랜치와 태그를 GitHub SHA와 SHA 단위로 대조하여 검증합니다. 자세한 내용은
코드 푸시를 참조하세요.
gh-safe-repo create <owner/repo> --from <owner/source>
gh-safe-repo create <owner/pub> --from <owner/priv> --public # scanned thoroughly first
전체 이력을 포함하여 소스를 클론하고, 스캔한 뒤, 새 저장소로 미러링하고, 소스의 기본 브랜치, 설명 및 토픽을 복사합니다. 스캔 단계에서 중단하면 어떤 코드도 GitHub에 도달하지 않습니다.
gh-safe-repo fix <owner/repo> --dry-run # what is 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 . && git push # exit 1 on critical findings
로컬 전용입니다. GitHub로 아무것도 전송되지 않습니다. 사전 점검 스캐너를 참조하세요.
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 <path> [OPTIONS]
--config와 --debug는 전역 옵션이며 명령 앞이나 뒤에 올 수 있습니다.
두 번 지정하면 나중 것이 우선합니다. 다른 옵션은 명령 뒤에 와야 합니다.
--config는 선택적 값을 받으므로, 값 없는 --config는 마지막에 와야 합니다:
gh-safe-repo --config scan ./src는 scan을 경로로 읽게 됩니다.
GitHub를 대상으로 하는 모든 명령은 owner/repo를 받습니다 (예: myuser/my-repo).
전역 옵션
| 옵션 | 설명 |
|---|---|
--config [PATH] | 사용할 설정 파일. 값 없는 --config는 내장 기본값만 사용 |
--debug | 모든 API 호출과 응답을 출력. fix의 경우 해석된 저장소 식별 정보(id, 전체 이름, 소유자 유형)도 출력 |
create <owner/repo>