
Reforce as configurações do seu gerenciador de pacotes contra ataques à cadeia de suprimentos.
```text
_ _
| | ___ _ __ ___ __ _ _ _ __ _ _ __ | |
/
|/ _ \ '_ \/ __|/ _ | | | |/ | '__/ _ |
| (| | __/ |) _ \ (| | || | (| | | | (| |
_,_|_| ./|/_, |_,|_,|| _,|
|| |___/
Por **[[arnica](https://arnica.io?utm_source=depsguard&utm_medium=referral&utm_campaign=community)]**
## Índice
- [Visão geral](#overview)
- [Instalação](#install)
- [Uso](#usage)
- [O que é verificado](#what-gets-checked)
- [Locais dos arquivos de configuração](#config-file-locations)
- [Correção de segurança urgente](#urgent-security-fix)
- [Backups e restauração](#backups-and-restore)
- [Como funciona](#how-it-works)
- [Solução de problemas](#troubleshooting)
- [Ajuda e feedback](#help--feedback)
- [Guias](#guides)
- [Veja também](#see-also)
- [Licença](#license)
## Visão geral
O DepsGuard procura por **npm**, **pnpm**, **yarn**, **bun**, **uv**, **pip**, **poetry** e **aube** na sua máquina, lê seus arquivos de configuração, compara-os com as configurações recomendadas de cadeia de suprimentos e pode **aplicar correções interativamente**. Ele também verifica a existência de configurações do **Renovate** e do **Dependabot** nos seus repositórios. Ele nunca executa instalações de pacotes; apenas edita arquivos de configuração que você aprovar e cria **backups** antes de qualquer alteração.
### Principais recursos
- TUI interativa: verificar, revisar, alternar correções, aplicar
- Subcomando `scan` para relatórios somente leitura
- Subcomando `restore` para escolher um backup e reverter um arquivo
- Multiplataforma: Linux, macOS, Windows
- Sem crates Rust de terceiros incorporados (stdlib + pequena quantidade de FFI de plataforma para o terminal)
### Stack de tecnologia
| Área | Detalhes |
|------|----------|
| Linguagem | Rust (MSRV **1.74**, veja `Cargo.toml`) |
| CLI / TUI | `src/main.rs`, `src/ui.rs`, `src/term.rs` |
| Lógica de configuração | `src/manager.rs`, `src/fix.rs` |
| Site | Site estático em `docs/` (separado do binário) |
## Instalação
### Binários pré-compilados
Cada [GitHub Release](https://github.com/arnica/depsguard/releases) inclui arquivos para:
- Linux: `x86_64` (glibc), `x86_64` (musl), `aarch64` (glibc)
- macOS: Intel e Apple Silicon
- Windows: `x86_64` ZIP contendo `depsguard.exe`
Baixe o arquivo para sua plataforma, descompacte-o e coloque o binário no seu `PATH`.
Verifique a integridade usando o arquivo `.sha256` correspondente ao lado de cada artefato na página de lançamento.
### Instalação por plataforma
#### Linux (Debian/Ubuntu via 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
O DepsGuard está no [homebrew-core](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/d/depsguard.rb), portanto, nenhum tap personalizado é necessário.
> **Migrando do antigo tap `arnica/depsguard`?** Troque para a fórmula core uma 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
Ou baixe manualmente via 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
Requer uma cadeia de ferramentas Rust com cargo.
Se a sua organização distribui o DepsGuard via Homebrew, Scoop ou WinGet, use as instruções correspondentes. Configurar ou automatizar esses canais (PRs do Homebrew core, buckets, PRs do WinGet, segredos de CI) é documentação de mantenedores; consulte AGENTS.md na seção Release & distribution.
Use o canal pelo qual você instalou:
Verifique sua versão instalada a qualquer momento com depsguard --version e veja a página de releases para a versão mais recente.
git clone https://github.com/arnica/depsguard.git cd depsguard cargo build --release
O binário é `target/release/depsguard` (`.exe` no Windows). É necessário 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 iniciar a TUI interativa. Ela verifica seu sistema e mostra uma tabela de resultados. Pressione qualquer tecla para continuar para o seletor de correções. A descoberta de configurações no nível do repositório começa no diretório atual e busca para baixo. Use depsguard scan para um relatório somente leitura, ou depsguard --no-search para pular a busca recursiva de arquivos e verificar apenas configurações de nível de usuário.
Nota: algumas configurações exigem uma versão mínima. Se sua versão for muito antiga, você verá:
ℹ min-release-age – requires npm ≥ 11.10 (have 10.2.0). Atualize comnpm install -g npm@lateste execute novamente.
↑ ↓ para percorrer a lista (^u ^d para paginar). Pressione Espaço para ativar ou desativar uma correção. Use as teclas de filtro rápido para selecionar em massa por arquivo: a todos, .npmrc, uv.toml, etc. – pressione uma vez para selecionar, novamente para desmarcar, uma terceira vez para limpar o filtro. Pressione para mostrar apenas as correções atualmente selecionadas.Os arquivos de configuração de nível de usuário são lidos de suas localizações padrão (incluindo caminhos baseados em XDG quando a ferramenta os suporta). As configurações de nível de repositório são descobertas procurando a partir do diretório atual, ignorando diretórios grandes conhecidos (node_modules, .git, target, Library, .cache e outros) para que as verificações permaneçam rápidas. .npmrc, .yarnrc.yml, pnpm-workspace.yaml, configurações do Renovate e configurações do Dependabot de nível de repositório são todos pesquisados. As configurações do pnpm podem estar em ~/.npmrc (apenas pnpm <= 10; pnpm >= 11 lê apenas configurações de autenticação/registro do .npmrc), no arquivo de configuração global do pnpm (rc em pnpm <= 10, config.yaml em pnpm >= 11), ou em pnpm-workspace.yaml; o DepsGuard verifica os três locais independentemente. Para pip, uv e poetry, o DepsGuard resolve a única configuração efetiva de nível de usuário e relata apenas esse arquivo, em vez de sinalizar separadamente arquivos sombreados. pip e poetry mesclam seus arquivos de configuração por precedência (o arquivo de maior precedência que define o cooldown vence, ou a localização preferida se nenhum o fizer); uv lê um único arquivo de usuário ( quando está definido, caso contrário ) em vez de mesclar ambos. Para bun, se existirem vários arquivos de configuração de nível de usuário (por exemplo, um caminho XDG e um caminho no diretório inicial), o DepsGuard verifica cada arquivo existente separadamente. aube lê o mesmo que npm/pnpm (, em minutos) e também é verificado nos arquivos de nível de repositório descobertos; pip e poetry são verificados em sua configuração de nível de usuário ( / ).
Se a versão corrigida for mais nova que sua janela de cooldown, adicione uma exceção restrita, instale a correção e depois remova a exceção.
Prefira uma exceção específica ao pacote em vez de reduzir o cooldown global. Isso mantém o atraso para todas as outras dependências.
Antes de ignorar o cooldown:
Antes de modificar um arquivo, o DepsGuard grava um backup em ~/.depsguard/backups/.
Execute depsguard restore para listar backups e restaurar um.
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 third-party crates**: intencional para uma pequena ferramenta relacionada à segurança; consulte `AGENTS.md` se você mudar essa política.
- **Cores** usam sequências ANSI; terminais modernos no Windows (ex.: Windows Terminal) são suportados.
## Solução de problemas
| Sintoma | O que tentar |
|---------|-------------|
| `depsguard: command not found` | Garanta que o diretório de instalação esteja no `PATH`, ou use o caminho completo para o binário. |
| Erros de permissão ao gravar configuração | O DepsGuard só edita arquivos no seu perfil de usuário; execute como um usuário normal, sem elevação, a menos que esses arquivos sejam propriedade do administrador. |
| Teclas não funcionando no Windows | Use o **Windows Terminal** ou outro terminal com suporte a VT; o `cmd.exe` legado pode não lidar com todas as teclas. |
| pnpm workspaces ausentes | Garanta que o `pnpm-workspace.yaml` esteja dentro da árvore do seu diretório pessoal; layouts muito incomuns podem não ser descobertos. |
| `cargo install` falha | Instale o Rust via [rustup](https://rustup.rs/) e use Rust **≥ 1.74**. |
## Ajuda e feedback
- [Relatar um bug ou solicitar um recurso](https://github.com/arnica/depsguard/issues)
- [Relatar uma vulnerabilidade de segurança](https://github.com/arnica/depsguard/security/advisories/new) (veja [`SECURITY.md`](https://github.com/arnica/depsguard/blob/HEAD/SECURITY.md))
- O fluxo de desenvolvimento para contribuidores está em [`AGENTS.md`](https://github.com/arnica/depsguard/blob/HEAD/AGENTS.md).
## Guias
Guias detalhados em [depsguard.com](https://depsguard.com) explicam cada configuração de endurecimento e os ataques à cadeia de suprimentos contra os quais eles defendem:
- [Como se proteger contra ataques à cadeia de suprimentos do npm](https://depsguard.com/guide/) (o guia completo de endurecimento)
- [Cooldown de dependências (idade mínima de lançamento)](https://depsguard.com/cooldown/)
- [Bloquear scripts de instalação com ignore-scripts](https://depsguard.com/ignore-scripts/)
- [Bloquear dependências transitivas não confiáveis (block-exotic-subdeps)](https://depsguard.com/block-exotic-subdeps/)
- [Falhar em scripts de build não revisados (strict-dep-builds)](https://depsguard.com/strict-dep-builds/)
- [Bloquear rebaixamentos de proveniência (trust-policy)](https://depsguard.com/trust-policy/)
- Relatos de incidentes: [axios](https://depsguard.com/axios-npm-attack/) · [Shai-Hulud](https://depsguard.com/shai-hulud/) · [TanStack](https://depsguard.com/tanstack-npm-attack/)
## Veja também
- [**Dependency Cooldowns** (`cooldowns.dev`)](https://cooldowns.dev/): um guia de referência e utilitário shell complementar (`cooldowns.sh`) focado especificamente em **cooldowns de idade mínima de lançamento**. Complementa o DepsGuard: cobre um conjunto mais amplo de ecossistemas no eixo de cooldown (pip, uv, npm, pnpm, Yarn, Bun, Deno, Cargo), enquanto o DepsGuard cobre npm/pnpm/yarn/bun/aube/uv/pip/poetry além de Renovate/Dependabot e adiciona outras configurações de endurecimento (`ignore-scripts`, `block-exotic-subdeps`, `trust-policy`, `strict-dep-builds`) com uma TUI interativa, pré-visualização de diff e backup/restauração.
## Licença
MIT
---
**Links:** [Repositório](https://github.com/arnica/depsguard) · [Site de documentação](https://depsguard.com)
| Canal | Linux | macOS | Windows | Comando de instalação |
|---|
| APT (repositório personalizado) | sim | não | não | sudo apt install depsguard (após a configuração do repositório acima) |
| crates.io | sim | sim | sim | cargo install depsguard |
| Homebrew (homebrew-core) | sim | sim | não | brew install depsguard |
| Scoop (bucket personalizado) | não | não | sim | scoop bucket add depsguard https://github.com/arnica/depsguard ; scoop install depsguard |
| WinGet | não | não | sim | winget install Arnica.DepsGuard |
| Canal | Comando de atualização |
|---|
| Homebrew | brew update && brew upgrade depsguard |
| APT (repositório personalizado) | sudo apt update && sudo apt install --only-upgrade depsguard |
| crates.io | cargo install --force depsguard (reinstala a versão mais recente) |
| Scoop | scoop update && scoop update depsguard |
| WinGet | winget upgrade Arnica.DepsGuard |
nufd para ver um diff do que será alterado antes de confirmar qualquer coisa.Enter para aplicar as correções selecionadas. Um backup com carimbo de data/hora é criado antes de qualquer arquivo ser gravado.depsguard restore a qualquer momento para reverter a partir da lista de backups. Pressione q ou Esc para sair.| Gerenciador | Configuração | Definição | Alvo | Motivo |
|---|
| npm | ~/.npmrc | min-release-age | 7 (dias) | Atrasa lançamentos recém-publicados (requer npm >= 11.10) |
| npm/pnpm | ~/.npmrc | ignore-scripts | true | Reduz o risco de scripts de instalação (npm respeita isso no .npmrc; pnpm >= 11 lê isso de pnpm-workspace.yaml / config.yaml global, não do .npmrc) |
| pnpm | ~/.npmrc | minimum-release-age | 10080 (minutos) | Atrasa novas versões por 7 dias (apenas pnpm 10.16–10.x; pnpm >= 11 ignora .npmrc; use pnpm-workspace.yaml) |
| pnpm | rc global (pnpm <= 10) | minimum-release-age | 10080 (minutos) | Atrasa novas versões por 7 dias (requer pnpm >= 10.16) |
| pnpm | rc global (pnpm <= 10) | block-exotic-subdeps | true | Bloqueia dependências transitivas não confiáveis (requer pnpm >= 10.26) |
| pnpm | rc global (pnpm <= 10) | trust-policy | no-downgrade | Bloqueia downgrades de proveniência (requer pnpm >= 10.21) |
| pnpm | rc global (pnpm <= 10) | strict-dep-builds | true | Falha em scripts de build não revisados (requer pnpm >= 10.3) |
| pnpm | rc global (pnpm <= 10) | ignore-scripts | true | Bloqueia scripts de instalação maliciosos |
| pnpm | config.yaml global (pnpm >= 11) | minimumReleaseAge | 10080 (minutos) | Atrasa novas versões por 7 dias |
| pnpm | config.yaml global (pnpm >= 11) | blockExoticSubdeps | true | Bloqueia dependências transitivas não confiáveis |
| pnpm | config.yaml global (pnpm >= 11) | trustPolicy | no-downgrade | Bloqueia downgrades de proveniência |
| pnpm | config.yaml global (pnpm >= 11) | strictDepBuilds | true | Falha em scripts de build não revisados |
| pnpm | config.yaml global (pnpm >= 11) | ignoreScripts | true | Bloqueia scripts de instalação maliciosos |
| yarn | .yarnrc.yml | npmMinimalAgeGate | 7d | Atrasa novas versões por 7 dias (requer yarn >= 4.10) |
| pnpm | pnpm-workspace.yaml | minimumReleaseAge | 10080 (minutos) | Atrasa novas versões por 7 dias (requer pnpm >= 10.16) |
| pnpm | pnpm-workspace.yaml | strictDepBuilds | true | Falha em scripts de build não revisados (requer pnpm >= 10.3) |
| pnpm | pnpm-workspace.yaml | trustPolicy | no-downgrade | Bloqueia downgrades de proveniência (requer pnpm >= 10.21) |
| pnpm | pnpm-workspace.yaml | blockExoticSubdeps | true | Bloqueia dependências transitivas não confiáveis (requer pnpm >= 10.26) |
| pnpm | pnpm-workspace.yaml | ignoreScripts | true | Bloqueia scripts de instalação maliciosos (requer pnpm >= 10.16) |
| bun | ~/.bunfig.toml | install.minimumReleaseAge | 604800 (segundos) | Atraso de ~7 dias (requer bun >= 1.3) |
| aube | ~/.npmrc | minimumReleaseAge | 10080 (minutos) | Atrasa novas versões por 7 dias |
| uv | uv.toml | exclude-newer | 7 days | Atrasa novas publicações (requer uv >= 0.9.17) |
| pip | pip.conf ([install]) | uploaded-prior-to | P7D (7 dias) | Atrasa novas publicações (requer pip >= 26.1) |
| poetry | config.toml ([solver]) | min-release-age | 7 (dias) | Atrasa novas publicações (requer poetry >= 2.4) |
| renovate | renovate.json etc. | minimumReleaseAge | 7 days | Atrasa PRs de atualização de dependências por 7 dias |
| dependabot | .github/dependabot.yml | cooldown.default-days | 7 | Atrasa PRs de atualização de dependências por 7 dias |
| Gerenciador | Linux | macOS | Windows |
|---|
| npm/pnpm/aube | ~/.npmrc | ~/.npmrc | %USERPROFILE%\.npmrc |
| pnpm global (pnpm <= 10) | $XDG_CONFIG_HOME/pnpm/rc ou ~/.config/pnpm/rc | $XDG_CONFIG_HOME/pnpm/rc ou ~/Library/Preferences/pnpm/rc | %LOCALAPPDATA%\pnpm\config\rc |
| pnpm global (pnpm >= 11) | $XDG_CONFIG_HOME/pnpm/config.yaml ou ~/.config/pnpm/config.yaml | $XDG_CONFIG_HOME/pnpm/config.yaml ou ~/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 ou ~/.bunfig.toml | $XDG_CONFIG_HOME/.bunfig.toml ou ~/.bunfig.toml | %USERPROFILE%\.bunfig.toml |
| uv | $XDG_CONFIG_HOME/uv/uv.toml ou ~/.config/uv/uv.toml | $XDG_CONFIG_HOME/uv/uv.toml ou ~/.config/uv/uv.toml | %APPDATA%\uv\uv.toml |
| pip | $XDG_CONFIG_HOME/pip/pip.conf ou ~/.config/pip/pip.conf | ~/Library/Application Support/pip/pip.conf ou ~/.config/pip/pip.conf (ou $XDG_CONFIG_HOME/pip/pip.conf quando definido) | %APPDATA%\pip\pip.ini |
| poetry | $XDG_CONFIG_HOME/pypoetry/config.toml ou ~/.config/pypoetry/config.toml | $XDG_CONFIG_HOME/pypoetry/config.toml (quando definido) ou ~/Library/Application Support/pypoetry/config.toml | %APPDATA%\pypoetry\config.toml |
| renovate | renovate.json, .renovaterc, .github/renovate.json, etc. | (mesmo) | (mesmo) |
| dependabot | .github/dependabot.yml | (mesmo) | (mesmo) |
$XDG_CONFIG_HOME/uv/uv.tomlXDG_CONFIG_HOME~/.config/uv/uv.toml~/.npmrcminimumReleaseAge.npmrcpip.confpypoetry/config.toml| Gerenciador | Como ignorar o cooldown |
|---|
| npm | npm install <pkg>@<ver> --min-release-age=0 |
| pnpm | Adicione uma entrada a minimumReleaseAgeExclude em pnpm-workspace.yaml, execute pnpm add <pkg>@<ver>, e depois remova a entrada. Excluir pelo nome do pacote funciona no pnpm 10.16+; fixar uma versão específica (<pkg>@<ver>) adicionalmente requer pnpm 10.19+. O pnpm não possui sobrescrita de CLI documentada para minimumReleaseAge. |
| yarn | Adicione <pkg> (ou um glob) a npmPreapprovedPackages em .yarnrc.yml, ou execute YARN_NPM_MINIMAL_AGE_GATE=0s yarn up <pkg>@<ver> para um único comando. npmPreapprovedPackages isenta correspondências de todos os limites de pacotes do Yarn, não apenas do limite de idade. |
| bun | Adicione <pkg> a install.minimumReleaseAgeExcludes em um bunfig.toml de nível de repositório ou em ~/.bunfig.toml de nível de usuário, ou execute bun add <pkg>@<ver> --minimum-release-age 0. |
| aube | Adicione <pkg> a minimumReleaseAgeExclude em .npmrc, ou defina AUBE_MINIMUM_RELEASE_AGE=0 (ou npm_config_minimum_release_age=0) para uma única instalação. |
| uv | Adicione "<pkg>" = false a exclude-newer-package em uv.toml ou pyproject.toml, execute uv add <pkg>==<ver>, e depois remova a entrada. exclude-newer-package é uma sobrescrita separada por pacote do limite global exclude-newer. A CLI do uv aceita --exclude-newer-package PACKAGE=DATE, mas não PACKAGE=false. |
| pip | Execute pip install <pkg>==<ver> --uploaded-prior-to=P0D para uma instalação. P0D desativa o cooldown apenas para esse comando; o pip não tem exclusão por pacote na configuração. |
| poetry | Adicione <pkg> a solver.min-release-age-exclude (separado por vírgulas) em poetry.toml/config.toml, execute poetry add <pkg>@<ver>, e depois remova a entrada. solver.min-release-age-exclude-source isenta todos os pacotes de um índice nomeado em vez disso. |
| Renovate | Atualizações de segurança já ignoram minimumReleaseAge. Para uma atualização de versão, adicione uma entrada packageRules com matchPackageNames: ["<pkg>"] e minimumReleaseAge: null. |
| Dependabot | Atualizações de segurança já ignoram cooldown. Para uma atualização de versão, adicione <pkg> a cooldown.exclude. |