
CLI de Python que crea repositorios de GitHub con valores predeterminados seguros: protección de ramas, Dependabot, escaneo de secretos y escaneo de seguridad previo al vuelo, aplicados automáticamente.
Crea repositorios de GitHub con valores predeterminados seguros aplicados automáticamente. Reemplaza la lista de verificación de configuración posterior a la creación de cinco minutos con un solo comando.``` gh-safe-repo create <owner/repo>
La protección de ramas, las etiquetas inmutables, Dependabot, los permisos restringidos de Actions y el escaneo de secretos con protección de push — todo configurado antes de que escribas tu primera línea de código.
> **Estado:** gh-safe-repo está en pleno desarrollo. Funciona bien para el caso de uso principal — crear un nuevo repositorio con valores predeterminados seguros — pero las opciones de la CLI todavía se están puliendo para ajustarse mejor a las expectativas de los usuarios. Espera cambios que rompan la compatibilidad hasta que las versiones y CI/CD estén definidos. ✌️
---
## Qué obtienes
Los valores predeterminados de GitHub están optimizados para la descubribilidad y la flexibilidad, no para la seguridad: cada repositorio nuevo se crea sin protección de ramas, sin Dependabot y con Actions que tienen acceso de escritura al repositorio y pueden aprobar sus propias pull requests.
`gh-safe-repo` soluciona todo eso de una vez, mostrándote primero un plan:
- **Privado por defecto** — pasa `--public` cuando quieras que el mundo lo vea
- **Protección de ramas** — PR obligatoria, 1 revisión aprobatoria, revisiones obsoletas descartadas, conversaciones resueltas, sin force pushes, sin eliminación de ramas
- **Etiquetas inmutables** — las etiquetas de release no se pueden reescribir ni eliminar
- **Actions bloqueadas** — token de solo lectura, sin PRs autoaprobadas, acciones fijadas por SHA, solo publicadores propiedad de GitHub y verificados
- **Dependabot activado** — alertas de vulnerabilidades más PRs de corrección automáticas
- **Escaneo de secretos con protección de push** — se bloquean los commits que contienen secretos compatibles
- **Informes privados de vulnerabilidades** — los investigadores pueden contactarte sin hacerlo público
- **Escaneo de secretos previo** — al hacer push de código existente (`--local` / `--from`), tu árbol de trabajo y el historial de git se escanean localmente antes de que nada llegue a GitHub
- **Extras opcionales** — wiki, projects e issues se dejan intactos a menos que solicites que se gestionen (`has_wiki = false` en la configuración)
Todo es configurable. Consulta [Valores predeterminados seguros en detalle](#safe-defaults-in-full) para ver la configuración exacta y [Configuración](#configuration) para saber cómo cambiarla.
## Requisitos
- **Python 3.10+**
- **[`gh` CLI](https://cli.github.com/)** autenticado (`gh auth login`), **o** `GITHUB_TOKEN` definido en tu entorno
- **[`uv`](https://docs.astral.sh/uv/)** para la instalación desde el código fuente
- **truffleHog v3** *(opcional)* — usado por el escáner previo; se detecta automáticamente desde PATH o se ejecuta mediante podman/docker, con un fallback de regex si ninguno existe
Hacer push de código con `--local` o `--from` requiere además tus credenciales normales de git para GitHub — consulta [Trabajar desde código local o existente](#working-from-local-or-existing-code).
## Instalación```bash
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
Esto instala gh-safe-repo en el entorno de herramientas de uv y lo añade a tu PATH.
Para ejecutarlo sin instalarlo:```bash uv sync # creates .venv ./gh-safe-repo create <owner/repo>
## Tu primer repositorio
**1. Vista previa.** `--dry-run` no realiza ninguna llamada a la API — no se crea nada:```
$ 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.
Las filas SKIP anteriores corresponden a un repositorio privado del plan gratuito: esas características requieren un repositorio público o un plan de pago. Nada falla silenciosamente — consulta Limitaciones del plan de GitHub.
2. Aplicar. El mismo comando sin --dry-run. Obtienes el mismo plan y, a continuación, un mensaje de confirmación (--yes lo omite):```bash
gh-safe-repo create AriESQ/demo-repo
**3. Empieza a trabajar.** Si tiene éxito, obtienes la URL del repositorio y comandos remotos listos para pegar:```
╭─ 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-… │
╰──────────────────────────────────────────────────────────╯
Los remotos se listan con tu protocolo preferido primero (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
Un `create` simple inicializa el repositorio para que exista una rama por defecto (la protección de rama necesita una), luego elimina el `README.md` autogenerado para que empieces desde cero. Establece `auto_init = true` en la configuración para conservarlo.