Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 100 additions & 39 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,27 +7,22 @@
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)

`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma
camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar e prevenir a exposição
indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.
`envguard` é uma ferramenta open source de linha de comando (CLI) desenvolvida em **Go**, projetada para atuar como uma camada leve de proteção entre o desenvolvedor e o Git. O foco principal é detectar, alertar, remediar e prevenir a exposição indevida de arquivos de variáveis de ambiente (`.env`, `.env.production`, `.env.local`, etc.) em repositórios.

---

## Por que o `envguard`?

Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados.
Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no
histórico de versão.
Arquivos `.env` costumam armazenar dados sensíveis: credenciais de banco de dados, chaves de API, tokens e certificados. Um descuido na configuração do `.gitignore` ou um simples `git add .` desavisado pode comitar esses segredos no histórico de versão.

O `envguard` resolve isso com foco específico em arquivos de ambiente:

- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado
(_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local,
_precommit hooks_ e pipelines de CI/CD.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis, ou segredos em logs, ou saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para
automação.
- **Git-Aware:** Entende o estado do repositório — diferencia se um `.env` está rastreado (_tracked_), preparado (_staged_), ignorado ou desprotegido.
- **Rápido & Local:** Funciona 100% offline, sem envio de dados para servidores externos. Ideal para execução local, _pre-commit hooks_ e pipelines de CI/CD.
- **Remediação Automática:** Adiciona padrões ausentes ao `.gitignore` automaticamente (`envguard fix`).
- **Hooks Nativos & Framework Pre-commit:** Instalação direta em `.git/hooks/pre-commit` e suporte ao framework Python `pre-commit`.
- **Seguro por Design:** Nunca imprime ou expõe valores de variáveis ou segredos em logs e saídas do terminal.
- **Pronto para CI/CD:** Suporta formato JSON estruturado (`--format json`) e códigos de saída determinísticos para automação.

---

Expand DownExpand Up@@ -67,17 +62,27 @@ envguard scan
Exemplo de saída no terminal:

```text
envguard v0.1.0

Repository: ./my-project
Scanning...

✗ .env CRITICAL tracked by Git
⚠ .env.local WARNING not covered by .gitignore
✓ .env.example INFO allowed template file

Found 2 finding(s) (1 CRITICAL, 1 WARNING)
Exit code: 1
🛡️ envguard v0.2.0
Target: ./meu-projeto
──────────────────────────────────────────────────

Findings:
✗ [CRITICAL] .env
Message: Environment file is tracked by Git (committed in repository history).
Suggestions:
• Remove file from git tracking: git rm --cached .env
• Add to .gitignore
• Rotate any leaked credentials

⚠ [WARNING] .env.local
Message: Environment file exists locally and is not ignored by .gitignore.
Suggestions:
• Add to .gitignore

──────────────────────────────────────────────────
Summary:
Total Findings: 2 (Critical: 1, High: 0, Warning: 1, Info: 0)
Status: ✗ FAILED
```

### 2. Validação para CI/CD (`check`)
Expand All@@ -88,7 +93,34 @@ Ideal para pipelines e automações. Retorna código de erro (`exit code 1`) cas
envguard check
```

### 3. Remediação Automática (`fix`)
### 3. Git Pre-Commit Hooks (`hook`)

Instala ou executa inspeções ultrarrápidas (<10ms) focadas exclusivamente em arquivos preparados para commit (`staged`):

```bash
# Instalar o hook nativo em .git/hooks/pre-commit
envguard hook install

# Executar checagem de stage (bloqueia commits com .env não permitidos)
envguard hook run

# Desinstalar o hook nativo
envguard hook uninstall
```

#### Integração com Python `pre-commit`:

Adicione ao seu `.pre-commit-config.yaml`:

```yaml
repos:
- repo: https://github.com/joaooncode/envguard
rev: v0.2.0
hooks:
- id: envguard
```

### 4. Remediação Automática (`fix`)

Adiciona automaticamente padrões correspondentes para arquivos desprotegidos (`WARNING`) no `.gitignore` da raiz, preservando comentários e formatação existente:

Expand All@@ -103,7 +135,7 @@ envguard fix --dry-run
envguard fix --path ./meu-projeto
```

### 4. Inicialização de Configuração e Templates (`init`)
### 5. Inicialização de Configuração e Templates (`init`)

Gera o arquivo de configuração `.envguard.yaml` documentado e, opcionalmente, cria templates `.env.example` sanitizados a partir de variáveis locais:

Expand All@@ -114,32 +146,59 @@ envguard init
# Inicializar configuração e gerar template .env.example sanitizado
envguard init --template

# Inicializar em diretório específico sobrescrevendo arquivos existentes
envguard init --path ./meu-projeto --force
# Inicializar a partir de arquivo de origem específico
envguard init --template-from .env.production
```

### 5. Saída Estruturada em JSON
### 6. Saída Estruturada em JSON

```bash
envguard scan --format json
```

### 6. Verificar Versão
### 7. Verificar Versão

```bash
envguard version
```

---

## Arquivo de Configuração (`.envguard.yaml`)

O `envguard` pode ser personalizado criando um arquivo `.envguard.yaml` na raiz do repositório:

```yaml
version: '1'

scanner:
ignore_dirs:
- 'node_modules'
- '.git'
- 'vendor'

detector:
custom_patterns:
- '*.env.vault'
allowlist:
- '.env.example'
- '.env.sample'
- '.env.template'
severity_overrides:
- pattern: '.env.test'
severity: 'warning'
```

---

## Níveis de Severidade

| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git reset HEAD <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |
| Nível | Situação | Ação Recomendada |
| :------------------ | :---------------------------------------------------------------------- | :--------------------------------------------------------------------------- |
| **`CRITICAL`** | Arquivo de ambiente rastreado (_tracked_) no histórico Git | Remover do rastreamento (`git rm --cached`) e rotacionar credenciais |
| **`HIGH`** | Arquivo de ambiente adicionado para commit (_staged_) | Retirar da stage (`git restore --staged <file>`) e adicionar ao `.gitignore` |
| **`WARNING`** | Arquivo existe localmente mas **não está** no `.gitignore` | Executar `envguard fix` ou adicionar padrão ao `.gitignore` |
| **`INFO` / `SAFE`** | Arquivo protegido ou template permitido (`.env.example`, `.env.sample`) | Nenhuma ação necessária |

---

Expand All@@ -157,14 +216,16 @@ envguard version
- [x] Integração Git (_tracked_, _staged_, _gitignore_)
- [x] Relatórios em Terminal e JSON
- [x] Códigos de saída para CI/CD
- [] **v0.2.0:**
- [x] **v0.2.0:**
- [x] `envguard init` (criação automática de `.envguard.yaml` e templates)
- [x] `envguard fix` (auxílio na adição automática ao `.gitignore`)
- [ ] Instalação de _Git Precommit Hooks_
- [x] Suporte a arquivo de configuração `.envguard.yaml` e flag `--config`
- [x] Instalação de _Git Pre-commit Hooks_ nativos e suporte a Python `pre-commit`
- [ ] **v0.3.0:**
- [ ] Secret scanning básico por conteúdo & cálculo de entropia
- [ ] Deteção de padrões comuns de chaves (AWS, Stripe, GitHub, etc.)
- [ ] **v1.0.0:**
- [ ] GitHub Action oficial
- [ ] GitHub Action oficial do envguard
- [ ] Pacotes para Homebrew, Scoop, WinGet e AUR

---
Expand Down
8 changes: 4 additions & 4 deletions internal/cli/cli_test.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ func TestCLIVersion(t *testing.T) {
}

out := stdout.String()
if !strings.Contains(out, "envguard v0.1.0") {
t.Fatalf("expected stdout to contain 'envguard v0.1.0', got: %s", out)
if !strings.Contains(out, "envguard v0.2.0") {
t.Fatalf("expected stdout to contain 'envguard v0.2.0', got: %s", out)
}
})
}
Expand DownExpand Up@@ -168,8 +168,8 @@ func TestCLIScanCleanDirectory(t *testing.T) {
if !report.Summary.Passed {
t.Fatalf("expected report summary passed to be true, got false")
}
if report.Version != "0.1.0" {
t.Fatalf("expected report version 0.1.0, got %s", report.Version)
if report.Version != "0.2.0" {
t.Fatalf("expected report version 0.2.0, got %s", report.Version)
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/version.go
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ package cli
import "fmt"

// Version is the current semantic version of envguard.
const Version = "0.1.0"
const Version = "0.2.0"

// VersionString returns the formatted version string.
func VersionString() string {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
{
"name": "envguard",
"version": "0.1.0",
"version": "0.2.0",
"private": true,
"description": "Prevent .env files and environment secrets from accidentally reaching Git.",
"scripts": {
Expand Down
51 changes: 51 additions & 0 deletions website/blog/2026-09-02-lancamento-envguard-v020.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
---
slug: lancamento-envguard-v020
title: Lançamento do envguard v0.2.0 - Hooks, Configuração, Init e Fix
authors: [joaooncode]
tags: [release, security, cli, golang, git-hooks, automation]
---

É com muito orgulho que anunciamos o lançamento do **`envguard` v0.2.0**! 🎉

Esta versão consolida a automação e remediação do ecossistema do `envguard`, trazendo recursos nativos para proteger o fluxo de desenvolvimento antes mesmo da execução de commits.

<!-- truncate -->

## Principais Novidades da v0.2.0

### 1. Suporte a Git Pre-commit Hooks (`envguard hook`)

- **Instalação Nativa (`envguard hook install`):** Cria o script executável em `.git/hooks/pre-commit` com detecção de assinatura e proteção contra sobrescrita acidental.
- **Inspeção Instantânea (`envguard hook run`):** Avalia exclusivamente os arquivos preparados para commit (`staged`) em menos de 10ms, bloqueando o commit se houver variáveis de ambiente desprotegidas.
- **Integração Oficial com Python `pre-commit`:** Arquivo `.pre-commit-hooks.yaml` incluído na raiz do repositório para adoção imediata.

### 2. Remediação Automática com `envguard fix`

- Analisa o repositório e insere automaticamente os arquivos de ambiente desprotegidos no `.gitignore` da raiz.
- Suporte a simulação não-destrutiva com `--dry-run` para pré-visualizar as alterações antes de aplicar no disco.

### 3. Inicialização e Sanitização de Templates (`envguard init`)

- Gera o arquivo `.envguard.yaml` completo e comentado.
- Suporte à geração de templates `.env.example` através da higienização automática (`--template` e `--template-from`), removendo valores sensíveis e preservando chaves e comentários.

### 4. Arquivo de Configuração `.envguard.yaml`

- Controle total de `ignore_dirs`, `custom_patterns`, `allowlist` e `severity_overrides` por projeto ou via flag `--config`.

---

## Como Atualizar

```bash
go install github.com/joaooncode/envguard/cmd/envguard@latest
```

Verifique a versão instalada:

```bash
envguard version
# envguard v0.2.0
```

Confira a [documentação oficial](/docs/intro) para explorar todos os novos comandos e guias de integração!
10 changes: 10 additions & 0 deletions website/blog/tags.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,3 +17,13 @@ golang:
label: Go
permalink: /golang
description: Tópicos sobre o ecossistema Go

git-hooks:
label: Git Hooks
permalink: /git-hooks
description: Gerenciamento e boas práticas com Git Hooks

automation:
label: Automação
permalink: /automacao
description: Automação e pipelines de segurança
75 changes: 75 additions & 0 deletions website/docs/commands/fix.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
---
sidebar_position: 4
title: envguard fix
---

# envguard fix

O comando **`envguard fix`** realiza a remediação automática de arquivos de ambiente desprotegidos (`WARNING`), inserindo os padrões correspondentes no `.gitignore` da raiz do repositório de forma não destrutiva.

---

## Uso

```bash
envguard fix [flags]
```

---

## Flags Disponíveis

| Flag | Tipo | Padrão | Descrição |
| :---------------- | :------- | :------ | :--------------------------------------------------------------------------- |
| `-p`, `--path` | `string` | `"."` | Diretório alvo para varredura e remediação. |
| `-d`, `--dry-run` | `bool` | `false` | Pré-visualiza as alterações propostas no `.gitignore` sem modificar o disco. |
| `-c`, `--config` | `string` | `""` | Caminho para um arquivo de configuração customizado. |
| `--no-color` | `bool` | `false` | Desativa cores ANSI na saída do terminal. |

---

## Exemplos de Uso

### 1. Aplicar correções automáticas no `.gitignore`

```bash
envguard fix
```

Saída de exemplo:

```text
✓ Successfully updated .gitignore with 2 rule(s):
+ .env
+ /services/api/.env.local
```

### 2. Modo Dry-Run (Simulação)

Permite inspecionar quais regras seriam adicionadas antes de alterar qualquer arquivo:

```bash
envguard fix --dry-run
```

Saída de exemplo:

```text
🔍 Dry run mode: changes will not be written to disk

Proposed .gitignore additions:
+ .env
+ .env.local
```

### 3. Alertas para Arquivos Rastreados (`CRITICAL`)

Se um arquivo já foi commitado no Git, o `.gitignore` não é suficiente para remover o histórico. O `envguard fix` detecta a situação, exibe instruções práticas de remoção do cache (`git rm --cached <arquivo>`) e retorna `exit code 1` alertando sobre a pendência.

---

## Características de Segurança

- **Formatação Não Destrutiva:** Novas regras são adicionadas sob o cabeçalho `# Added by envguard`, preservando comentários existentes, indentação e quebras de linha.
- **Prevenção de Duplicatas:** Verifica regras já presentes no `.gitignore` e não insere padrões repetidos.
- **Resolução de Caminhos Relativos:** Arquivos localizados em subpastas (ex: `packages/backend/.env`) são mapeados corretamente em relação à raiz do repositório.
Loading
Loading