#!/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 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."