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
macOS / Linux (Homebrew)```bash
Homebrew
brew install depsguard
root@kitploit:~
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
Gestores de paquetes (cuando estén publicados por tu distribuidor)
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.
Tiendas de aplicaciones / gestores de paquetes
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)
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
Ejecutardepsguard 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 con npm install -g npm@latest y vuelve a ejecutar.
Navegar y seleccionar – usa ↑↓ 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: a todo, n .npmrc, u uv.toml, etc. – presiona una vez para seleccionar, otra vez para deseleccionar, y una tercera vez para limpiar el filtro. Presiona f para mostrar solo las correcciones seleccionadas actualmente.
Vista previa – presiona d para ver un diff de lo que cambiará antes de comprometerte.
Aplicar – presiona Enter para aplicar las correcciones seleccionadas. Se crea una copia de seguridad con marca de tiempo antes de escribir cualquier archivo.
Reescanear – DepsGuard vuelve a ejecutar el escaneo automáticamente después de aplicar, para que puedas verificar que todo está en verde.
Restaurar – ejecuta depsguard restore en cualquier momento para revertir desde la lista de copias de seguridad. Presiona q o Esc para salir.
Qué se comprueba
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
(minutos)
Ubicaciones de archivos de configuración
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
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 ($XDG_CONFIG_HOME/uv/uv.toml cuando XDG_CONFIG_HOME está configurado, de lo contrario ~/.config/uv/uv.toml) 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 ~/.npmrc que npm/pnpm (minimumReleaseAge, en minutos) y también se verifica en los archivos .npmrc de nivel de repositorio descubiertos; pip y poetry se escanean en su configuración de nivel de usuario (pip.conf / pypoetry/config.toml).
Corrección urgente de seguridad
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.
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 (separado por comas) en /, ejecuta , luego elimina la entrada. exime a cada paquete de un índice nombrado en su lugar.
Antes de omitir el período de espera:
Verifica si el CVE realmente afecta tu uso.
Verifica si ya hay disponible una versión anterior conocida como buena. Una reversión puede ser más segura.
Elimina las excepciones temporales después de la actualización.
Copias de seguridad y restauración
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.
- **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/main/SECURITY.md))
- El flujo de trabajo de desarrollo para contribuyentes está en [`AGENTS.md`](https://github.com/arnica/depsguard/blob/main/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)
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
$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)
solver.min-release-age-exclude
poetry.toml
config.toml
poetry add <pkg>@<ver>
solver.min-release-age-exclude-source
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.