# 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 @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/\/memory/MEMORY.md ```markdown # MEMORY ## Feedback - [Segmentation CLAUDE.md et .claudeignore](./feedback_claudemd_segmentation.md) — approche optimisation tokens ``` ### ~/.claude/projects/\/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).*