fix(bmad-init): symlinker .claude/skills + commands séparément (pas .claude entier)

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.
This commit is contained in:
MaksTinyWorkshop
2026-06-26 11:23:32 +02:00
parent 16707b6aaf
commit c5a7b5f396
+34 -10
View File
@@ -38,7 +38,7 @@ echo "→ Initialisation BMAD pour : $PROJECT_ROOT"
# ─── Modules à symlinkter dans _bmad/ ──────────────────────────────────────── # ─── 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" mkdir -p "$PROJECT_ROOT/_bmad"
@@ -78,24 +78,46 @@ else
echo " ✓ _memory initialisé depuis la base" echo " ✓ _memory initialisé depuis la base"
fi 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 AGENTS_TARGET="$PROJECT_ROOT/.agents"
TARGET="$PROJECT_ROOT/$dir" AGENTS_SOURCE="$BMAD_BASE/.agents"
SOURCE="$BMAD_BASE/$dir"
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 if [[ ! -d "$SOURCE" ]]; then
echo " ⚠ '$dir' absent de la base, ignoré." echo " ⚠ '.claude/$sub' absent de la base, ignoré."
continue continue
fi fi
if [[ -L "$TARGET" ]]; then if [[ -L "$TARGET" ]]; then
echo " ~ symlink déjà présent : $dir" echo " ~ symlink déjà présent : .claude/$sub"
elif [[ -d "$TARGET" ]]; then 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 else
ln -s "$SOURCE" "$TARGET" ln -s "$SOURCE" "$TARGET"
echo " ✓ symlink créé : $dir$SOURCE" echo " ✓ symlink créé : .claude/$sub$SOURCE"
fi fi
done done
@@ -121,7 +143,9 @@ for module in "${BMAD_MODULES[@]}"; do
done done
echo " │ └── _memory/ (local)" echo " │ └── _memory/ (local)"
echo " ├── .agents/ → symlink (centralisé)" 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 " └── _bmad-output/ (local)"
echo "" echo ""
echo "✓ Prêt." echo "✓ Prêt."