From c5a7b5f396cc5c1e3b1dfcb45dec4bedd1c2ff03 Mon Sep 17 00:00:00 2001 From: MaksTinyWorkshop Date: Fri, 26 Jun 2026 11:23:32 +0200 Subject: [PATCH] =?UTF-8?q?fix(bmad-init):=20symlinker=20.claude/skills=20?= =?UTF-8?q?+=20commands=20s=C3=A9par=C3=A9ment=20(pas=20.claude=20entier)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: bmad-init-project.sh symlinkait .claude/ EN ENTIER. Or Claude Code a besoin d'un .claude réel (settings.local.json, worktrees/) — le symlink échouait donc silencieusement ("existe déjà, ignoré"), et les skills BMAD n'arrivaient JAMAIS côté Claude Code. Conséquence: BMAD 6.9 + customisations .toml inactifs dans les projets via Claude Code (seul Codex/.agents fonctionnait, lui étant symlinkable). Fix: - .agents/ reste un symlink complet (Codex n'y écrit pas) - .claude/ reste un dossier RÉEL ; on symlinke seulement .claude/skills et .claude/commands vers la base centralisée → à jour sans écraser les fichiers propres à Claude Code - ajout de custom/ + scripts/ aux modules _bmad symlinkés (resolver de customisation) Validé: resolve_customization.py résout désormais les overrides (.toml gates MCP + capitalisation) depuis .claude/skills dans RL799_V2 et app-alexandrie. --- scripts/bmad-init-project.sh | 44 ++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/scripts/bmad-init-project.sh b/scripts/bmad-init-project.sh index f99b71c..21673f8 100755 --- a/scripts/bmad-init-project.sh +++ b/scripts/bmad-init-project.sh @@ -38,7 +38,7 @@ echo "→ Initialisation BMAD pour : $PROJECT_ROOT" # ─── Modules à symlinkter dans _bmad/ ──────────────────────────────────────── -BMAD_MODULES=(core bmm cis tea _config) +BMAD_MODULES=(core bmm cis tea _config custom scripts) mkdir -p "$PROJECT_ROOT/_bmad" @@ -78,24 +78,46 @@ else echo " ✓ _memory initialisé depuis la base" fi -# ─── .agents/ et .claude/ : symlinks à la racine du projet ────────────────── +# ─── .agents/ : symlink complet (Codex n'écrit pas dans ce dossier) ───────── -for dir in .agents .claude; do - TARGET="$PROJECT_ROOT/$dir" - SOURCE="$BMAD_BASE/$dir" +AGENTS_TARGET="$PROJECT_ROOT/.agents" +AGENTS_SOURCE="$BMAD_BASE/.agents" + +if [[ ! -d "$AGENTS_SOURCE" ]]; then + echo " ⚠ '.agents' absent de la base, ignoré." +elif [[ -L "$AGENTS_TARGET" ]]; then + echo " ~ symlink déjà présent : .agents" +elif [[ -d "$AGENTS_TARGET" ]]; then + echo " ⚠ '.agents' existe déjà (dossier réel), ignoré. Merge manuel requis." +else + ln -s "$AGENTS_SOURCE" "$AGENTS_TARGET" + echo " ✓ symlink créé : .agents → $AGENTS_SOURCE" +fi + +# ─── .claude/ : dossier RÉEL (Claude Code y écrit settings.local, worktrees) ── +# On ne symlinke PAS .claude en entier (le symlink échouerait car le dossier réel +# est nécessaire). On symlinke uniquement les sous-dossiers fournis par BMAD +# (skills/, commands/) pour qu'ils restent centralisés et à jour, sans toucher +# aux fichiers propres à Claude Code. + +mkdir -p "$PROJECT_ROOT/.claude" + +for sub in skills commands; do + TARGET="$PROJECT_ROOT/.claude/$sub" + SOURCE="$BMAD_BASE/.claude/$sub" if [[ ! -d "$SOURCE" ]]; then - echo " ⚠ '$dir' absent de la base, ignoré." + echo " ⚠ '.claude/$sub' absent de la base, ignoré." continue fi if [[ -L "$TARGET" ]]; then - echo " ~ symlink déjà présent : $dir" + echo " ~ symlink déjà présent : .claude/$sub" elif [[ -d "$TARGET" ]]; then - echo " ⚠ '$dir' existe déjà (dossier réel), ignoré. Merge manuel requis." + echo " ⚠ '.claude/$sub' existe déjà (dossier réel), non écrasé. Remplacer manuellement par un symlink si voulu." else ln -s "$SOURCE" "$TARGET" - echo " ✓ symlink créé : $dir → $SOURCE" + echo " ✓ symlink créé : .claude/$sub → $SOURCE" fi done @@ -121,7 +143,9 @@ for module in "${BMAD_MODULES[@]}"; do done echo " │ └── _memory/ (local)" echo " ├── .agents/ → symlink (centralisé)" -echo " ├── .claude/ → symlink (centralisé)" +echo " ├── .claude/ (local — Claude Code y écrit)" +echo " │ ├── skills/ → symlink (centralisé)" +echo " │ └── commands/ → symlink (centralisé)" echo " └── _bmad-output/ (local)" echo "" echo "✓ Prêt."