← Contextes /
bootstrap-env-claude-code.md 369 lignes · 12 KB
Personnaliser Télécharger
# CLAUDE.md — Bootstrap environnement Claude Code

> Contexte spécialisé pour Claude Code. Reconstitue un environnement complet sur un nouvel ordinateur : `~/.claude/CLAUDE.md`, `go-best-practices.md`, `settings.json`, statusline, plugins et mémoires persistantes.

Prérequis système : `bash 4+`, `jq`, `tmux`, `python3`

---

## Quand utiliser ce contexte

- ✅ Nouveau poste de travail ou réinstallation OS
- ✅ Premier setup Claude Code sur une machine sans configuration existante
- ✅ Audit de l'environnement actuel — vérifier que tout est en place
- ✅ Partager sa configuration avec un autre développeur
- ❌ Modifier la configuration d'un projet existant — utiliser le CLAUDE.md du projet

---

## Section 1 : ~/.claude/CLAUDE.md

```markdown
# Global Claude Code Instructions

## Mise à jour CLAUDE.md & mémoire
**Quoi ajouter** : ce qui n'est pas déductible du code — gotchas, contraintes métier invisibles, conventions déviantes, décisions d'archi non-évidentes.
**Quoi ne pas ajouter** : ce que Claude redécouvre en lisant le code.
**Format** : 1 règle = 1 ligne. Cible : < 80 lignes par fichier.
**Segmentation** : `CLAUDE.{domaine}.md` pour les sections rarement utiles ; référencer en texte brut.
**`.claudeignore`** : exclure vendor/, node_modules/, assets/, tmp/, fichiers générés et binaires.
**MAJ auto CLAUDE.md** : en fin de tâche, signaler ce qui mérite d'être ajouté. Filtre : (1) non-déductible du code, (2) se reproduira en future session, (3) pas spécifique au contexte immédiat.
**MAJ auto mémoire** : même déclencheur. Test : *"Si je supprime et relis le code, manquera-t-il quelque chose ?"* Types : user, feedback (Règle → Why → How to apply), project, reference. Ne pas sauvegarder : état temporaire, ce qui est déjà dans CLAUDE.md.

## Références
Go : `~/.claude/go-best-practices.md`

## Plugins disponibles
Plugins installés : superpowers, code-simplifier, frontend-design, playground, context7, playwright, gopls-lsp.
Si un besoin spécifique émerge (ex: revue sécurité, gestion CLAUDE.md), installer via `claude plugins install <nom>@claude-plugins-official`. Plugins connus disponibles : feature-dev, code-review, security-guidance, claude-md-management.

## Restrictions
- **INTERDIT** lire `.env`/`.env.*` — exception `.env.example`, `.env.local.example`
- **INTERDIT** `git add` sans permission explicite — l'utilisateur contrôle le staging
- **INTERDIT** mentionner Claude/AI dans commits, PR, branches, commentaires code
- **AUCUN** `Co-Authored-By: Claude ...`

## Principes Conception
**Règle d'or** : toujours la solution la plus simple qui fonctionne. Équilibre : Simplicité > Testabilité > Robustesse (sauf composants critiques).

**4 Questions AVANT refactoring** : (1) Simplifie vraiment ? (2) Testabilité vaut la complexité ? (3) Même résultat plus simplement ? (4) Sur-ingénierie "au cas où" ? → Si oui, stop.

**YAGNI** : abstraire seulement si 3+ implémentations existent, logique complexe (50+ lignes), ou mock apporte vraie valeur.

**Red flags → STOP** : struct pour grouper fonctions, interface à 1 implémentation, séparation multi-fichiers sans raison, abstraction prématurée, code plus complexe après refactoring.

## Délégation Opus / Sonnet
Opus = tech lead : analyse, planifie, décide, review, délègue via Agent tool.
Sonnet (Agent) = exécution : écriture code > 5 lignes, recherche large, refacto, tests.

**Opus directement** : Read/Grep/Glob < 3 fichiers, modifications < 5 lignes, décisions archi, review résultats, réponses conversationnelles.
**Opus délègue** : code > 5 lignes, recherche exploratoire, refactoring, tests, tâches mécaniques. Indépendantes → parallèle.
**Règles** : prompt Sonnet = contexte complet ; relire résultat avant présentation ; ne jamais déléguer une décision d'archi ; ne pas lire fichiers > 200 lignes dans contexte Opus.
```

---

## Section 2 : ~/.claude/go-best-practices.md

> Référence — consulter lors de reviews ou en cas de doute.

### Simplicité d'abord
- Fonctions courtes (20-30 lignes max), 2-3 params max, sinon struct
- Early return + guard clauses, jamais de nesting profond
- Accept interfaces, return structs
- "A little copying is better than a little dependency" — ne pas abstraire pour 2 usages
- Make the zero value useful
- 1 fichier si < 500 lignes et cohésion forte
- Newspaper layout : publics en haut, helpers privés en bas

### Error Handling

```go
// ✅ Wrapper avec contexte
return fmt.Errorf("failed to process item %s: %w", itemID, err)
// ✅ errors.Is / errors.As — pas type assertions
// ❌ return err — perd le contexte
// ❌ panic(err) — sur erreurs normales
```

**Resilient Execution** (partial success > total failure) :

```go
for _, item := range items {
    if err := process(item); err != nil {
        slog.Error("Failed item, continuing", "item", item.ID, "error", err)
        continue
    }
    successCount++
}
```

### Concurrency

```go
// Goroutine avec exit propre
go func() {
    for {
        select {
        case val := <-ch: process(val)
        case <-ctx.Done(): return
        }
    }
}()

// Mutex pour shared data
type SafeCounter struct {
    mu    sync.Mutex
    count int
}
func (c *SafeCounter) Inc() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++
}
```

### PostgreSQL

```go
// ✅ Prepared statements (jamais string concatenation)
err := db.GetContext(ctx, &user, "SELECT * FROM users WHERE email = $1", email)
// Transaction : defer tx.Rollback() avant les opérations, tx.Commit() à la fin
```

### Context
- Toujours propager `ctx` — jamais remplacer par `context.Background()`

### Testing

```go
// Stdlib testing uniquement — PAS testify — assertions manuelles
// Table-driven avec → dans les noms
tests := []struct {
    name    string
    input   string
    wantErr bool
}{
    {"valid → ok", "ok", false},
    {"empty → error", "", true},
}
```

### Checklist Code Review
- [ ] Pas de SQL string concatenation
- [ ] Erreurs wrappées avec contexte (`fmt.Errorf("... %w", err)`)
- [ ] Channels fermés, goroutines terminables (`ctx.Done()`)
- [ ] Mutex sur shared data, context propagé
- [ ] Pas de `panic` sur erreurs normales
- [ ] Tests passent, logging structuré `slog`
- [ ] Resilient execution (continuer sur erreur d'un item)

### Anti-Patterns
- `file, _ := os.Open(...)` — ne jamais ignorer les erreurs
- Naked returns dans fonctions > 10 lignes
- `close(ch)` oublié → goroutine leak
- Interface avec 1 seule implémentation (YAGNI)
- God object / struct qui fait tout
- `map[string]string` non trié → non-déterministe, `sort.Strings` avant join
- Magic numbers → constantes nommées
- Code mort/commenté → supprimer (Git garde l'historique)
- Logging `log.Printf` → `slog.Info("msg", "key", val)`

---

## Section 3 : ~/.claude/settings.json

```json
{
  "model": "sonnet",
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup|resume",
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/statusline.sh < /dev/null"
          }
        ]
      }
    ]
  },
  "statusLine": {
    "type": "command",
    "command": "bash ~/.claude/hooks/statusline.sh"
  },
  "enabledPlugins": {
    "superpowers@claude-plugins-official": true,
    "code-simplifier@claude-plugins-official": true,
    "frontend-design@claude-plugins-official": true,
    "playground@claude-plugins-official": true,
    "context7@claude-plugins-official": true,
    "playwright@claude-plugins-official": true,
    "gopls-lsp@claude-plugins-official": true
  },
  "effortLevel": "medium",
  "autoUpdatesChannel": "latest"
}
```

---

## Section 4 : ~/.claude/settings.local.json

```json
{
  "permissions": {
    "allow": [
      "Bash(chmod +x:*)",
      "Bash(jq:*)",
      "Bash(curl:*)",
      "Bash(python3:*)",
      "Bash(touch:*)",
      "Bash(bash:*)",
      "Bash(kill:*)",
      "Bash(tmux send-keys:*)",
      "Bash(tmux kill-session:*)",
      "Bash(tmux ls)",
      "Bash(tmux capture-pane:*)",
      "Bash(gh api:*)",
      "Bash(gh auth:*)",
      "Bash(gh release:*)",
      "Bash(git config:*)",
      "Bash(git branch:*)",
      "Bash(git push:*)",
      "Bash(git tag:*)",
      "mcp__plugin_context7_context7__resolve-library-id",
      "mcp__plugin_context7_context7__query-docs",
      "WebSearch",
      "WebFetch(domain:github.com)"
    ]
  }
}
```

> **Note** : `Bash(bash:*)` autorise tout script bash — c'est très permissif. Volontaire.

---

## Section 5 : ~/.claude/hooks/statusline.sh

Repo : **https://github.com/ohugonnot/coder-proprement**

```bash
# Télécharger et installer
mkdir -p ~/.claude/hooks
curl -o ~/.claude/hooks/statusline.sh \
  https://raw.githubusercontent.com/ohugonnot/coder-proprement/main/statusline.sh
chmod +x ~/.claude/hooks/statusline.sh
```

Prérequis : `bash 4+`, `jq`, `tmux`, `python3`

---

## Section 6 : Mémoires persistantes

### ~/.claude/projects/\<projet\>/memory/MEMORY.md

```markdown
# MEMORY

## Feedback
- [Segmentation CLAUDE.md et .claudeignore](./feedback_claudemd_segmentation.md) — approche optimisation tokens
```

### ~/.claude/projects/\<projet\>/memory/feedback_claudemd_segmentation.md

```markdown
---
name: Segmentation CLAUDE.md et .claudeignore
description: Règles d'optimisation CLAUDE.md — cibles réelles, filtres et comportements
type: feedback
---

CLAUDE.md principal < 80 lignes ; sous-fichiers `CLAUDE.{domaine}.md` pour sections rarement utiles ; `.claudeignore` pour vendor/, node_modules/, assets/, fichiers générés.

**Why:** Testé sur gofab — 70 lignes suffisent. 150 lignes trop permissif. Tout ce qu'un `ls` ou lecture de fichier donne n'a pas sa place.

**How to apply:** Filtre : "Si je supprime cette ligne et relis le code, manquera-t-il quelque chose ?" Si non → ne pas ajouter. Références aux sous-fichiers en texte brut (jamais `@`).
```

---

## Section 7 : Installation

```bash
# 1. Créer l'arborescence
mkdir -p ~/.claude/hooks

# 2. Copier les fichiers (contenu des sections ci-dessus)
# ~/.claude/CLAUDE.md
# ~/.claude/go-best-practices.md
# ~/.claude/settings.json
# ~/.claude/settings.local.json
# ~/.claude/hooks/statusline.sh && chmod +x ~/.claude/hooks/statusline.sh

# 3. Créer ~/.claudeignore à la racine du projet
cat > .claudeignore <<'EOF'
# Données runtime
uploads/
scripts/.retro-state.json
scripts/.veille.lock

# Outils
.playwright-mcp/

# Plans/specs générés
docs/superpowers/

# Assets binaires
assets/images/
assets/plugins/

# Commentaires blog
blog/comments/
EOF

# 4. Créer ~/.claude/commands/audit-memory.md
mkdir -p ~/.claude/commands
cat > ~/.claude/commands/audit-memory.md <<'EOF'
Audite les fichiers mémoire dans `.claude/projects/.../memory/`
(et `~/.claude/memory/` pour la mémoire globale si elle existe).

Pour chaque fichier mémoire :
1. Le contenu est-il encore exact ?
2. Est-il non déductible du code ou du CLAUDE.md ?
3. Le type est-il correct ? (user / feedback / project / reference)
4. La description dans le frontmatter est-elle assez précise ?

Cohérence globale : doublons, contradictions, mémoires project obsolètes, MEMORY.md à jour ?

Résultat en tableau : Fichier | Problème | Action recommandée
Puis applique les corrections.
EOF

# 5. Installer les plugins
claude plugins install superpowers@claude-plugins-official
claude plugins install code-simplifier@claude-plugins-official
claude plugins install frontend-design@claude-plugins-official
claude plugins install playground@claude-plugins-official
claude plugins install context7@claude-plugins-official
claude plugins install playwright@claude-plugins-official
claude plugins install gopls-lsp@claude-plugins-official

# Plugins disponibles si besoin ponctuel :
# claude plugins install feature-dev@claude-plugins-official
# claude plugins install code-review@claude-plugins-official
# claude plugins install security-guidance@claude-plugins-official
# claude plugins install claude-md-management@claude-plugins-official

# 6. Prérequis système
sudo apt install jq tmux python3

```

---

*Last updated: 2026-03 — Contexte associé à l'article [Réinstaller son environnement Claude Code](https://www.web-developpeur.com/blog/reinstaller-env-claude-code).*