mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-06-28 01:53:40 +02:00
c5a7b5f396
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.
152 lines
5.3 KiB
Bash
Executable File
152 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# bmad-init-project.sh
|
|
# Initialise la structure BMAD d'un nouveau projet en symlinkant la carcasse centralisée.
|
|
#
|
|
# Usage : bmad-init (depuis la racine du projet)
|
|
# Ou : ./bmad-init-project.sh <chemin-absolu-du-projet>
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
BMAD_BASE="$(cd "$SCRIPT_DIR/../80_bmad/base" && pwd)"
|
|
|
|
# ─── Résolution du dossier projet ────────────────────────────────────────────
|
|
|
|
if [[ $# -ge 1 ]]; then
|
|
PROJECT_ROOT="$1"
|
|
else
|
|
PROJECT_ROOT="$(pwd)"
|
|
fi
|
|
|
|
if [[ ! -d "$PROJECT_ROOT" ]]; then
|
|
echo "Erreur : le dossier '$PROJECT_ROOT' n'existe pas."
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -d "$BMAD_BASE" ]]; then
|
|
echo "Erreur : BMAD base introuvable à '$BMAD_BASE'."
|
|
exit 1
|
|
fi
|
|
|
|
PROJECT_NAME="$(basename "$PROJECT_ROOT")"
|
|
|
|
echo "→ Initialisation BMAD pour : $PROJECT_ROOT"
|
|
|
|
# ─── CLAUDE.md + AGENTS.md ───────────────────────────────────────────────────
|
|
|
|
"$SCRIPT_DIR/generate_project_claude.sh" "$PROJECT_NAME" "$PROJECT_ROOT"
|
|
|
|
# ─── Modules à symlinkter dans _bmad/ ────────────────────────────────────────
|
|
|
|
BMAD_MODULES=(core bmm cis tea _config custom scripts)
|
|
|
|
mkdir -p "$PROJECT_ROOT/_bmad"
|
|
|
|
for module in "${BMAD_MODULES[@]}"; do
|
|
TARGET="$PROJECT_ROOT/_bmad/$module"
|
|
SOURCE="$BMAD_BASE/_bmad/$module"
|
|
|
|
if [[ ! -d "$SOURCE" ]]; then
|
|
echo " ⚠ Module '$module' absent de la base, ignoré."
|
|
continue
|
|
fi
|
|
|
|
if [[ -L "$TARGET" ]]; then
|
|
echo " ~ symlink déjà présent : _bmad/$module"
|
|
elif [[ -e "$TARGET" ]]; then
|
|
echo " ⚠ '$TARGET' existe déjà (pas un symlink), ignoré."
|
|
else
|
|
ln -s "$SOURCE" "$TARGET"
|
|
echo " ✓ symlink créé : _bmad/$module → $SOURCE"
|
|
fi
|
|
done
|
|
|
|
# ─── _memory : copie locale (écrite par les agents) ──────────────────────────
|
|
|
|
MEMORY_TARGET="$PROJECT_ROOT/_bmad/_memory"
|
|
MEMORY_SOURCE="$BMAD_BASE/_bmad/_memory"
|
|
|
|
if [[ -L "$MEMORY_TARGET" ]]; then
|
|
echo " ⚠ _bmad/_memory est un symlink — conversion en copie locale..."
|
|
rm "$MEMORY_TARGET"
|
|
cp -r "$MEMORY_SOURCE" "$MEMORY_TARGET"
|
|
echo " ✓ _memory copié localement"
|
|
elif [[ -d "$MEMORY_TARGET" ]]; then
|
|
echo " ~ _bmad/_memory existe déjà, non écrasé."
|
|
else
|
|
cp -r "$MEMORY_SOURCE" "$MEMORY_TARGET"
|
|
echo " ✓ _memory initialisé depuis la base"
|
|
fi
|
|
|
|
# ─── .agents/ : symlink complet (Codex n'écrit pas dans ce dossier) ─────────
|
|
|
|
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 " ⚠ '.claude/$sub' absent de la base, ignoré."
|
|
continue
|
|
fi
|
|
|
|
if [[ -L "$TARGET" ]]; then
|
|
echo " ~ symlink déjà présent : .claude/$sub"
|
|
elif [[ -d "$TARGET" ]]; then
|
|
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éé : .claude/$sub → $SOURCE"
|
|
fi
|
|
done
|
|
|
|
# ─── _bmad-output/ : dossier local vide ─────────────────────────────────────
|
|
|
|
OUTPUT_DIR="$PROJECT_ROOT/_bmad-output"
|
|
if [[ ! -d "$OUTPUT_DIR" ]]; then
|
|
mkdir -p "$OUTPUT_DIR"/{brainstorming,planning-artifacts,implementation-artifacts,test-artifacts}
|
|
echo " ✓ _bmad-output/ créé"
|
|
else
|
|
echo " ~ _bmad-output/ existe déjà"
|
|
fi
|
|
|
|
# ─── Résumé ──────────────────────────────────────────────────────────────────
|
|
|
|
echo ""
|
|
echo "Structure BMAD initialisée :"
|
|
echo ""
|
|
echo " $PROJECT_ROOT/"
|
|
echo " ├── _bmad/"
|
|
for module in "${BMAD_MODULES[@]}"; do
|
|
echo " │ ├── $module → symlink (centralisé)"
|
|
done
|
|
echo " │ └── _memory/ (local)"
|
|
echo " ├── .agents/ → 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."
|