gwm-cli 1.6.1

git worktree manager — TUI + CLI, native libgit2, per-repo bootstrap
Documentation
---
title: Guards regex
description: Patterns de deny-list sur les fichiers copiés — l'incident d'origine « pas d'AWS RDS dans .env », généralisé.
---

# Guards regex

Les règles `[[bootstrap.guard]]` examinent chaque fichier produit par l'étape 1 du [pipeline de bootstrap](/fr/configuration/bootstrap) face à une liste de patterns regex de deny. Une correspondance déclenche soit un abort, soit une substitution depuis un fallback réputé sûr.

## l'histoire d'origine

L'incident d'origine : quelqu'un a créé un worktree depuis un dépôt dont le `.env` pointait vers l'hôte AWS RDS de **production**, puis a exécuté `php artisan migrate:fresh --seed` dans le worktree en pensant que c'était la base locale. La migration s'est exécutée contre la prod.

La correction fut institutionnelle : ne jamais copier un `.env` aveuglément entre worktrees. Le mécanisme est `[[bootstrap.guard]]`.

## schéma

```toml
[[bootstrap.guard]]
name = "no-aws-rds"
deny_patterns = ["amazonaws\\.com", "\\.rds\\."]
on_match      = "seed-from-example"        # or "abort"
example_file  = ".env.example"             # required when on_match=seed-from-example
```

| Champ           | Type            | Défaut    | Signification                                                                          |
|:----------------|:----------------|:----------|:---------------------------------------------------------------------------------------|
| `name`          | string          || référencé par `[[bootstrap.copy]].guards = [...]`                                       |
| `deny_patterns` | liste de strings | `[]`      | patterns regex Rust (syntaxe de la crate `regex`). Les correspondances n'importe où dans le fichier sont signalées. |
| `on_match`     | string          | `"abort"` | `"abort"` ou `"seed-from-example"`                                                      |
| `example_file` | string          | aucun     | chemin (relatif au checkout principal) du fichier à substituer quand `on_match=seed-from-example` |

## brancher un guard sur une copie

Le guard ne s'exécute que lorsqu'une étape `[[bootstrap.copy]]` le référence par son nom :

```toml
[[bootstrap.copy]]
from = ".env"
to   = ".env"
required = false
guards = ["no-aws-rds"]            # ← referenced here
```

Un guard qu'aucune copie ne référence est de la config morte — `gwm doctor` (check #2) ne le signale pas (encore), donc auditez à la main ou exécutez `grep guards .gwm.toml` pour repérer les orphelins.

## sémantique de `on_match`

### `abort` (défaut)

Une correspondance interrompt tout le bootstrap avec `✗`. Le worktree lui-même avait déjà été créé (l'étape 1 a réussi), donc gwm le rollback : supprime le répertoire du worktree et la branche.

```
bootstrap report:
  ✗ guard no-aws-rds on .env
      pattern 'amazonaws\.com' matched on line 12
      → bootstrap aborted, worktree rolled back
```

L'utilisateur voit le pattern fautif, la ligne, et le fait que rien n'a été laissé derrière. La ré-exécution est sûre.

### `seed-from-example`

Une correspondance déclenche une substitution : gwm écrase le fichier fautif avec le contenu de `example_file` (toujours relatif au checkout **principal**, puisque le worktree est frais et a peu de chances d'avoir son propre exemple). Rapporté comme `!` (warning), le pipeline continue.

```
bootstrap report:
  ! guard no-aws-rds on .env
      pattern 'amazonaws\.com' matched on line 12
      → substituted from .env.example
```

Utile quand `.env` est réellement sensible mais que vous voulez que le worktree ait **une** config fonctionnelle (par ex. sqlite local) — la substitution vous place sur une base connue comme sûre depuis laquelle itérer.

## syntaxe regex

Les patterns utilisent la [crate `regex`](https://docs.rs/regex) — façon Perl, sans look-around. Ancres :

- Pas d'ancre → correspond n'importe où dans le fichier.
- `^…$` avec le flag multi-ligne `(?m)` → correspond ligne par ligne.

Patterns courants :

```toml
deny_patterns = [
  "amazonaws\\.com",                # AWS endpoints
  "(?m)^DB_PASSWORD=(?!$|\"\"$)",   # any non-empty DB_PASSWORD line
  "BEGIN .* PRIVATE KEY",           # accidental SSH keys
  "sk_live_[A-Za-z0-9]{20,}",       # Stripe live secret keys
]
```

Les backslashes doivent être doublés dans les chaînes TOML. Utilisez les chaînes littérales de TOML (`'...'`) pour de la regex brute si vous avez beaucoup de backslashes :

```toml
deny_patterns = ['amazonaws\.com', '\.rds\.']
```

## couverture par doctor

Le check **#2** de `gwm doctor` (`guard references resolve`) valide que chaque nom dans `[[bootstrap.copy]].guards = [...]` pointe vers un `[[bootstrap.guard]]` existant. Attrape les fautes de frappe au moment de la config au lieu d'attendre que le prochain `gwm create` échoue. Voir [Intégrations → `gwm doctor`](/fr/integrations/doctor).

## en lien

- [Pipeline de bootstrap]/fr/configuration/bootstrap — où les guards se situent dans l'ordre d'exécution
- [schéma `.gwm.toml`]/fr/configuration/gwm-toml — référence de types complète