
Fortalezca sus configuraciones de gestor de paquetes contra ataques a la cadena de suministro.
```text
_ _
| | ___ _ __ ___ __ _ _ _ __ _ _ __ | |
/
|/ _ \ '_ \/ __|/ _ | | | |/ | '__/ _ |
| (| | __/ |) _ \ (| | || | (| | | | (| |
_,_|_| ./|/_, |_,|_,|| _,|
|| |___/
Guarda tus dependencias contra ataques a la cadena de suministro. **Binario estático único, cero dependencias de crates Rust.**
Por **[[arnica](https://arnica.io?utm_source=depsguard&utm_medium=referral&utm_campaign=community)]**
## Tabla de contenidos
- [Resumen](#overview)
- [Instalación](#install)
- [Uso](#usage)
- [Qué se comprueba](#what-gets-checked)
- [Ubicaciones de los archivos de configuración](#config-file-locations)
- [Corrección de seguridad urgente](#urgent-security-fix)
- [Copias de seguridad y restauración](#backups-and-restore)
- [Cómo funciona](#how-it-works)
- [Solución de problemas](#troubleshooting)
- [Ayuda y comentarios](#help--feedback)
- [Guías](#guides)
- [Ver también](#see-also)
- [Licencia](#license)
## Resumen
DepsGuard busca **npm**, **pnpm**, **yarn**, **bun**, **uv**, **pip**, **poetry**, y **aube** en tu máquina, lee sus archivos de configuración, los compara con configuraciones recomendadas de cadena de suministro, y puede **aplicar correcciones de forma interactiva**. También escanea configuraciones de **Renovate** y **Dependabot** en tus repositorios. Nunca ejecuta instalaciones de paquetes; solo edita archivos de configuración que apruebes, y escribe **copias de seguridad** antes de cualquier cambio.
### Características principales
- TUI interactiva: escanear, revisar, alternar correcciones, aplicar
- Subcomando `scan` para informes de solo lectura
- Subcomando `restore` para elegir una copia de seguridad y revertir un archivo
- Multiplataforma: Linux, macOS, Windows
- Sin crates Rust de terceros incluidos (stdlib + pequeña cantidad de FFI de plataforma para la terminal)
### Stack tecnológico
| Área | Detalles |
|------|---------|
| Idioma | Rust (MSRV **1.74**, ver `Cargo.toml`) |
| CLI / TUI | `src/main.rs`, `src/ui.rs`, `src/term.rs` |
| Lógica de configuración | `src/manager.rs`, `src/fix.rs` |
| Sitio web | Sitio estático en `docs/` (separado del binario) |
## Instalación
### Binarios precompilados
Cada [GitHub Release](https://github.com/arnica/depsguard/releases) incluye archivos para:
- Linux: `x86_64` (glibc), `x86_64` (musl), `aarch64` (glibc)
- macOS: Intel y Apple Silicon
- Windows: `x86_64` ZIP conteniendo `depsguard.exe`
Descarga el archivo para tu plataforma, descomprímelo y coloca el binario en tu `PATH`.
Verifica la integridad usando el archivo `.sha256` correspondiente junto a cada activo en la página de la versión.
### Instalar por plataforma
#### Linux (Debian/Ubuntu mediante APT)```bash
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://depsguard.com/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/depsguard.gpg
echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/depsguard.gpg] https://depsguard.com/apt stable main" | sudo tee /etc/apt/sources.list.d/depsguard.list >/dev/null
sudo apt update
sudo apt install depsguard
brew install depsguard
DepsGuard está en [homebrew-core](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/d/depsguard.rb), por lo que no se requiere un tap personalizado.
> **¿Migrando desde el antiguo tap `arnica/depsguard`?** Cambia a la fórmula principal una vez:
>
> ```bash
> brew uninstall depsguard
> brew untap arnica/depsguard
> brew update
> brew install depsguard
> ```
#### Windows```powershell
# WinGet
winget install Arnica.DepsGuard
# Scoop
scoop bucket add depsguard https://github.com/arnica/depsguard
scoop install depsguard
O descárgalo manualmente mediante PowerShell:```powershell $zip = "$env:TEMP\depsguard.zip" Invoke-WebRequest -Uri "https://github.com/arnica/depsguard/releases/latest/download/depsguard-x86_64-pc-windows-msvc.zip" -OutFile $zip Expand-Archive -LiteralPath $zip -DestinationPath "$env:TEMP\depsguard" -Force Copy-Item "$env:TEMP\depsguard\depsguard.exe" "$HOME\AppData\Local\Microsoft\WindowsApps\depsguard.exe" -Force depsguard.exe --help
### crates.io```bash
cargo install depsguard
Requiere un toolchain de Rust con cargo.
Si tu organización distribuye DepsGuard a través de Homebrew, Scoop o WinGet, usa sus instrucciones. Configurar o automatizar esos canales (PRs core de Homebrew, buckets, PRs de WinGet, secretos de CI) es documentación del mantenedor; consulta AGENTS.md en Release & distribution.
Usa el canal con el que instalaste:
Verifica tu versión instalada en cualquier momento con depsguard --version, y consulta la página de lanzamientos para la versión más reciente.
git clone https://github.com/arnica/depsguard.git cd depsguard cargo build --release
El binario es `target/release/depsguard` (`.exe` en Windows). Se requiere Rust **1.74+**.
## Uso```bash
depsguard # interactive: scan, choose fixes, apply
depsguard scan # report only; no writes (exits 1 if action is needed)
depsguard --no-search # skip recursive file search, check local configs only
depsguard restore # restore from a previous backup
depsguard --help # CLI help
depsguard para lanzar la TUI interactiva. Escanea tu sistema y muestra una tabla de hallazgos. Presiona cualquier tecla para continuar al selector de correcciones. El descubrimiento de configuración a nivel de repositorio comienza desde el directorio actual y busca hacia abajo. Usa depsguard scan para un informe de solo lectura, o depsguard --no-search para omitir la búsqueda recursiva de archivos y solo verificar configuraciones de nivel de usuario.
Nota: algunas configuraciones requieren una versión mínima. Si tu versión es demasiado antigua, verás:
ℹ min-release-age – requires npm ≥ 11.10 (have 10.2.0). Actualiza connpm install -g npm@latesty vuelve a ejecutar.
↑ ↓ para moverte por la lista (^u ^d para paginar). Presiona Espacio para activar o desactivar una corrección. Usa las teclas de filtro rápido para seleccionar por lotes según el archivo: todo, .npmrc, uv.toml, etc. – presiona una vez para seleccionar, otra vez para deseleccionar, y una tercera vez para limpiar el filtro. Presiona para mostrar solo las correcciones seleccionadas actualmente.Los archivos de configuración a nivel de usuario se leen desde sus ubicaciones estándar (incluyendo rutas basadas en XDG donde la herramienta las soporta). Las configuraciones a nivel de repositorio se descubren buscando hacia abajo desde el directorio actual, omitiendo directorios grandes conocidos (node_modules, .git, target, Library, .cache, y otros) para que los escaneos sean rápidos. Se buscan configuraciones a nivel de repositorio como .npmrc, .yarnrc.yml, pnpm-workspace.yaml, configuraciones de Renovate y Dependabot. Los ajustes de pnpm pueden residir en ~/.npmrc (solo pnpm <= 10; pnpm >= 11 lee solo ajustes de autenticación/registro de .npmrc), el archivo de configuración global de pnpm (rc en pnpm <= 10, config.yaml en pnpm >= 11), o pnpm-workspace.yaml; DepsGuard verifica las tres ubicaciones de forma independiente. Para pip, uv y poetry, DepsGuard resuelve la única configuración efectiva a nivel de usuario e informa solo ese archivo, en lugar de marcar archivos sombreados por separado. pip y poetry fusionan sus archivos de configuración por precedencia (el archivo de mayor precedencia que establece el período de espera gana, o la ubicación preferida si ninguno lo hace); uv lee un solo archivo de usuario ( cuando está configurado, de lo contrario ) en lugar de fusionar ambos. Para bun, si existen múltiples archivos de configuración a nivel de usuario (por ejemplo, tanto una ruta XDG como una ruta de directorio personal), DepsGuard escanea cada archivo existente por separado. aube lee el mismo que npm/pnpm (, en minutos) y también se verifica en los archivos de nivel de repositorio descubiertos; pip y poetry se escanean en su configuración de nivel de usuario ( / ).
Si la versión parcheada es más reciente que tu ventana de espera, agrega una excepción específica, instala la corrección y luego elimina la excepción.
Prefiere una excepción específica de paquete en lugar de reducir el período de espera global. Eso mantiene el retraso vigente para todas las demás dependencias.
Antes de omitir el período de espera:
Antes de modificar un archivo, DepsGuard escribe una copia de seguridad en ~/.depsguard/backups/.
Ejecuta depsguard restore para listar las copias de seguridad y restaurar una.
src/ main.rs CLI args, run loop term.rs Raw mode + input (Unix termios / Windows console FFI) manager.rs Detection, scanning, recommendations fix.rs Read/write .npmrc, TOML, YAML; backup/restore ui.rs Banner, tables, selector
- **Zero crates de terceros**: intencional para una herramienta pequeña relacionada con seguridad; consulta `AGENTS.md` si cambias esa política.
- **Colores** usan secuencias ANSI; terminales modernas en Windows (por ejemplo, Windows Terminal) son compatibles.
## Solución de problemas
| Síntoma | Qué probar |
|---------|-------------|
| `depsguard: command not found` | Asegúrate de que el directorio de instalación esté en `PATH`, o usa la ruta completa al binario. |
| Errores de permiso al escribir la configuración | DepsGuard solo edita archivos en tu perfil de usuario; ejecútalo como usuario normal, no elevado, a menos que esos archivos sean propiedad del administrador. |
| Teclas que no funcionan en Windows | Usa **Windows Terminal** u otra terminal compatible con VT; el `cmd.exe` heredado puede no manejar todas las teclas. |
| Faltan workspaces de pnpm | Asegúrate de que `pnpm-workspace.yaml` esté dentro del árbol de tu directorio principal; diseños muy inusuales pueden no ser detectados. |
| `cargo install` falla | Instala Rust mediante [rustup](https://rustup.rs/) y usa Rust **≥ 1.74**. |
## Ayuda y comentarios
- [Reportar un error o solicitar una función](https://github.com/arnica/depsguard/issues)
- [Reportar una vulnerabilidad de seguridad](https://github.com/arnica/depsguard/security/advisories/new) (ver [`SECURITY.md`](https://github.com/arnica/depsguard/blob/HEAD/SECURITY.md))
- El flujo de trabajo de desarrollo para contribuyentes está en [`AGENTS.md`](https://github.com/arnica/depsguard/blob/HEAD/AGENTS.md).
## Guías
Guías detalladas en [depsguard.com](https://depsguard.com) explican cada ajuste de endurecimiento y los ataques a la cadena de suministro contra los que protegen:
- [Cómo protegerse contra ataques a la cadena de suministro de npm](https://depsguard.com/guide/) (la guía completa de endurecimiento)
- [Período de enfriamiento de dependencias (antigüedad mínima de lanzamiento)](https://depsguard.com/cooldown/)
- [Bloquear scripts de instalación con ignore-scripts](https://depsguard.com/ignore-scripts/)
- [Bloquear dependencias transitivas no confiables (block-exotic-subdeps)](https://depsguard.com/block-exotic-subdeps/)
- [Fallar en scripts de compilación no revisados (strict-dep-builds)](https://depsguard.com/strict-dep-builds/)
- [Bloquear degradaciones de procedencia (trust-policy)](https://depsguard.com/trust-policy/)
- Informes de incidentes: [axios](https://depsguard.com/axios-npm-attack/) · [Shai-Hulud](https://depsguard.com/shai-hulud/) · [TanStack](https://depsguard.com/tanstack-npm-attack/)
## Véase también
- [**Dependency Cooldowns** (`cooldowns.dev`)](https://cooldowns.dev/): una guía de referencia y un script auxiliar de shell (`cooldowns.sh`) centrado específicamente en **períodos de enfriamiento de antigüedad mínima de lanzamiento**. Complementa a DepsGuard: cubre un conjunto más amplio de ecosistemas en el eje de enfriamiento (pip, uv, npm, pnpm, Yarn, Bun, Deno, Cargo), mientras que DepsGuard cubre npm/pnpm/yarn/bun/aube/uv/pip/poetry más Renovate/Dependabot y añade otros ajustes de endurecimiento (`ignore-scripts`, `block-exotic-subdeps`, `trust-policy`, `strict-dep-builds`) con una TUI interactiva, vista previa de diferencias y copia de seguridad/restauración.
## Licencia
MIT
---
**Enlaces:** [Repositorio](https://github.com/arnica/depsguard) · [Sitio de documentación](https://depsguard.com)
| Canal | Linux | macOS | Windows | Comando de instalación |
|---|
| APT (repositorio personalizado) | sí | no | no | sudo apt install depsguard (después de configurar el repositorio anterior) |
| crates.io | sí | sí | sí | cargo install depsguard |
| Homebrew (homebrew-core) | sí | sí | no | brew install depsguard |
| Scoop (bucket personalizado) | no | no | sí | scoop bucket add depsguard https://github.com/arnica/depsguard ; scoop install depsguard |
| WinGet | no | no | sí | winget install Arnica.DepsGuard |
| Canal | Comando de actualización |
|---|
| Homebrew | brew update && brew upgrade depsguard |
| APT (repositorio personalizado) | sudo apt update && sudo apt install --only-upgrade depsguard |
| crates.io | cargo install --force depsguard (reinstala la última versión) |
| Scoop | scoop update && scoop update depsguard |
| WinGet | winget upgrade Arnica.DepsGuard |
anufd para ver un diff de lo que cambiará antes de comprometerte.Enter para aplicar las correcciones seleccionadas. Se crea una copia de seguridad con marca de tiempo antes de escribir cualquier archivo.depsguard restore en cualquier momento para revertir desde la lista de copias de seguridad. Presiona q o Esc para salir.| Gestor | Config | Ajuste | Objetivo | Por qué |
|---|
| npm | ~/.npmrc | min-release-age | 7 (días) | Retrasar versiones nuevas (requiere npm >= 11.10) |
| npm/pnpm | ~/.npmrc | ignore-scripts | true | Reducir el riesgo de scripts de instalación (npm lo respeta en .npmrc; pnpm >= 11 lo lee desde pnpm-workspace.yaml / config.yaml global, no desde .npmrc) |
| pnpm | ~/.npmrc | minimum-release-age | 10080 (minutos) | Retrasar nuevas versiones por 7 días (solo pnpm 10.16–10.x; pnpm >= 11 ignora .npmrc; usa pnpm-workspace.yaml) |
| pnpm | rc global (pnpm <= 10) | minimum-release-age | 10080 (minutos) | Retrasar nuevas versiones por 7 días (requiere pnpm >= 10.16) |
| pnpm | rc global (pnpm <= 10) | block-exotic-subdeps | true | Bloquear dependencias transitivas no confiables (requiere pnpm >= 10.26) |
| pnpm | rc global (pnpm <= 10) | trust-policy | no-downgrade | Bloquear degradaciones de procedencia (requiere pnpm >= 10.21) |
| pnpm | rc global (pnpm <= 10) | strict-dep-builds | true | Fallar en scripts de compilación no revisados (requiere pnpm >= 10.3) |
| pnpm | rc global (pnpm <= 10) | ignore-scripts | true | Bloquear scripts de instalación maliciosos |
| pnpm | config.yaml global (pnpm >= 11) | minimumReleaseAge | 10080 (minutos) | Retrasar nuevas versiones por 7 días |
| pnpm | config.yaml global (pnpm >= 11) | blockExoticSubdeps | true | Bloquear dependencias transitivas no confiables |
| pnpm | config.yaml global (pnpm >= 11) | trustPolicy | no-downgrade | Bloquear degradaciones de procedencia |
| pnpm | config.yaml global (pnpm >= 11) | strictDepBuilds | true | Fallar en scripts de compilación no revisados |
| pnpm | config.yaml global (pnpm >= 11) | ignoreScripts | true | Bloquear scripts de instalación maliciosos |
| yarn | .yarnrc.yml | npmMinimalAgeGate | 7d | Retrasar nuevas versiones por 7 días (requiere yarn >= 4.10) |
| pnpm | pnpm-workspace.yaml | minimumReleaseAge | 10080 (minutos) | Retrasar nuevas versiones por 7 días (requiere pnpm >= 10.16) |
| pnpm | pnpm-workspace.yaml | strictDepBuilds | true | Fallar en scripts de compilación no revisados (requiere pnpm >= 10.3) |
| pnpm | pnpm-workspace.yaml | trustPolicy | no-downgrade | Bloquear degradaciones de procedencia (requiere pnpm >= 10.21) |
| pnpm | pnpm-workspace.yaml | blockExoticSubdeps | true | Bloquear dependencias transitivas no confiables (requiere pnpm >= 10.26) |
| pnpm | pnpm-workspace.yaml | ignoreScripts | true | Bloquear scripts de instalación maliciosos (requiere pnpm >= 10.16) |
| bun | ~/.bunfig.toml | install.minimumReleaseAge | 604800 (segundos) | Retraso de ~7 días (requiere bun >= 1.3) |
| aube | ~/.npmrc | minimumReleaseAge | 10080 (minutos) | Retrasar nuevas versiones por 7 días |
| uv | uv.toml | exclude-newer | 7 days | Retrasar nuevas publicaciones (requiere uv >= 0.9.17) |
| pip | pip.conf ([install]) | uploaded-prior-to | P7D (7 días) | Retrasar nuevas publicaciones (requiere pip >= 26.1) |
| poetry | config.toml ([solver]) | min-release-age | 7 (días) | Retrasar nuevas publicaciones (requiere poetry >= 2.4) |
| renovate | renovate.json etc. | minimumReleaseAge | 7 days | Retrasar PRs de actualización de dependencias por 7 días |
| dependabot | .github/dependabot.yml | cooldown.default-days | 7 | Retrasar PRs de actualización de dependencias por 7 días |
| Gestor | Linux | macOS | Windows |
|---|
| npm/pnpm/aube | ~/.npmrc | ~/.npmrc | %USERPROFILE%\.npmrc |
| pnpm global (pnpm <= 10) | $XDG_CONFIG_HOME/pnpm/rc o ~/.config/pnpm/rc | $XDG_CONFIG_HOME/pnpm/rc o ~/Library/Preferences/pnpm/rc | %LOCALAPPDATA%\pnpm\config\rc |
| pnpm global (pnpm >= 11) | $XDG_CONFIG_HOME/pnpm/config.yaml o ~/.config/pnpm/config.yaml | $XDG_CONFIG_HOME/pnpm/config.yaml o ~/Library/Preferences/pnpm/config.yaml | %LOCALAPPDATA%\pnpm\config\config.yaml |
| yarn | ~/.yarnrc.yml | ~/.yarnrc.yml | %USERPROFILE%\.yarnrc.yml |
| pnpm | pnpm-workspace.yaml | pnpm-workspace.yaml | pnpm-workspace.yaml |
| bun | $XDG_CONFIG_HOME/.bunfig.toml o ~/.bunfig.toml | $XDG_CONFIG_HOME/.bunfig.toml o ~/.bunfig.toml | %USERPROFILE%\.bunfig.toml |
| uv | $XDG_CONFIG_HOME/uv/uv.toml o ~/.config/uv/uv.toml | $XDG_CONFIG_HOME/uv/uv.toml o ~/.config/uv/uv.toml | %APPDATA%\uv\uv.toml |
| pip | $XDG_CONFIG_HOME/pip/pip.conf o ~/.config/pip/pip.conf | ~/Library/Application Support/pip/pip.conf o ~/.config/pip/pip.conf (o $XDG_CONFIG_HOME/pip/pip.conf cuando está configurado) | %APPDATA%\pip\pip.ini |
| poetry | $XDG_CONFIG_HOME/pypoetry/config.toml o ~/.config/pypoetry/config.toml | $XDG_CONFIG_HOME/pypoetry/config.toml (cuando está configurado) o ~/Library/Application Support/pypoetry/config.toml | %APPDATA%\pypoetry\config.toml |
| renovate | renovate.json, .renovaterc, .github/renovate.json, etc. | (igual) | (igual) |
| dependabot | .github/dependabot.yml | (igual) | (igual) |
$XDG_CONFIG_HOME/uv/uv.tomlXDG_CONFIG_HOME~/.config/uv/uv.toml~/.npmrcminimumReleaseAge.npmrcpip.confpypoetry/config.toml| Gestor | Cómo omitir el período de espera |
|---|
| npm | npm install <pkg>@<ver> --min-release-age=0 |
| pnpm | Agrega una entrada a minimumReleaseAgeExclude en pnpm-workspace.yaml, ejecuta pnpm add <pkg>@<ver>, luego elimina la entrada. Excluir por nombre de paquete funciona en pnpm 10.16+; fijar una versión específica (<pkg>@<ver>) adicionalmente requiere pnpm 10.19+. pnpm no tiene una anulación CLI documentada para minimumReleaseAge. |
| yarn | Agrega <pkg> (o un glob) a npmPreapprovedPackages en .yarnrc.yml, o ejecuta YARN_NPM_MINIMAL_AGE_GATE=0s yarn up <pkg>@<ver> para un solo comando. npmPreapprovedPackages exime coincidencias de todas las compuertas de paquetes de Yarn, no solo de la compuerta de antigüedad. |
| bun | Agrega <pkg> a install.minimumReleaseAgeExcludes en un bunfig.toml a nivel de repositorio o a nivel de usuario ~/.bunfig.toml, o ejecuta bun add <pkg>@<ver> --minimum-release-age 0. |
| aube | Agrega <pkg> a minimumReleaseAgeExclude en .npmrc, o establece AUBE_MINIMUM_RELEASE_AGE=0 (o npm_config_minimum_release_age=0) para una sola instalación. |
| uv | Agrega "<pkg>" = false a exclude-newer-package en uv.toml o pyproject.toml, ejecuta uv add <pkg>==<ver>, luego elimina la entrada. exclude-newer-package es una anulación separada por paquete del límite global exclude-newer. La CLI de uv acepta --exclude-newer-package PACKAGE=DATE pero no PACKAGE=false. |
| pip | Ejecuta pip install <pkg>==<ver> --uploaded-prior-to=P0D para una instalación. P0D desactiva el período de espera solo para ese comando; pip no tiene exclusión por paquete en la configuración. |
| poetry | Agrega <pkg> a solver.min-release-age-exclude (separado por comas) en poetry.toml/config.toml, ejecuta poetry add <pkg>@<ver>, luego elimina la entrada. solver.min-release-age-exclude-source exime a cada paquete de un índice nombrado en su lugar. |
| Renovate | Las actualizaciones de seguridad ya omiten minimumReleaseAge. Para una actualización de versión, agrega una entrada packageRules con matchPackageNames: ["<pkg>"] y minimumReleaseAge: null. |
| Dependabot | Las actualizaciones de seguridad ya omiten cooldown. Para una actualización de versión, agrega <pkg> a cooldown.exclude. |