#!/usr/bin/env bash # post-bmad-install.sh # À lancer après `npx bmad-method install` dans un projet BMAD. # Injecte la memory de capitalisation Lead_tech dans les agents producteurs. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TEMPLATES_DIR="$SCRIPT_DIR/../70_templates/bmad_post_install" # Projet courant PROJECT_ROOT="$(pwd)" PROJECT_NAME="$(basename "$PROJECT_ROOT")" AGENTS_DIR="$PROJECT_ROOT/_bmad/_config/agents" CLAUDE_MD="$PROJECT_ROOT/CLAUDE.md" DEV_STORY_XML="$PROJECT_ROOT/_bmad/bmm/workflows/4-implementation/dev-story/instructions.xml" CODE_REVIEW_XML="$PROJECT_ROOT/_bmad/bmm/workflows/4-implementation/code-review/instructions.xml" DEV_STORY_CHECKLIST="$PROJECT_ROOT/_bmad/bmm/workflows/4-implementation/dev-story/checklist.md" CODE_REVIEW_CHECKLIST="$PROJECT_ROOT/_bmad/bmm/workflows/4-implementation/code-review/checklist.md" PRODUCER_AGENTS_CONFIG="$TEMPLATES_DIR/config/producer_agents.tsv" MEMORIES_DIR="$TEMPLATES_DIR/memories" WORKFLOWS_DIR="$TEMPLATES_DIR/workflows" CLAUDE_FRAGMENTS_DIR="$TEMPLATES_DIR/claude" CAPITALIZE_MARKER="95_a_capitaliser.md" CAPITALIZE_MARKER_XML="Capitalisation Lead_tech" if [ ! -d "$AGENTS_DIR" ]; then echo "Erreur : dossier _bmad/_config/agents/ introuvable dans $PROJECT_ROOT" >&2 echo "Lance ce script depuis la racine d'un projet BMAD installé." >&2 exit 1 fi require_file() { local file="$1" if [ ! -f "$file" ]; then echo "Erreur : fichier requis introuvable : $file" >&2 exit 1 fi } escape_sed_replacement() { printf '%s' "$1" | sed -e 's/[\/&]/\\&/g' } render_template() { local file="$1" require_file "$file" sed "s/__PROJECT_NAME__/$(escape_sed_replacement "$PROJECT_NAME")/g" "$file" } patch_line_after_match() { local file="$1" local match="$2" local fragment_file="$3" if [ ! -f "$file" ]; then echo " [skip] $(basename "$file") — fichier absent" return 0 fi if grep -q "$CAPITALIZE_MARKER_XML" "$file"; then echo " [skip] $(basename "$file") — capitalisation déjà présente" return 0 fi local fragment fragment="$(render_template "$fragment_file")" awk -v match="$match" -v block="$fragment" ' index($0, match) { print print block next } { print } ' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file" echo " [ok] $(basename "$file") — capitalisation injectée" } patch_block_before_match() { local file="$1" local match="$2" local fragment_file="$3" if [ ! -f "$file" ]; then echo " [skip] $(basename "$file") — fichier absent" return 0 fi if grep -q "$CAPITALIZE_MARKER_XML" "$file"; then echo " [skip] $(basename "$file") — capitalisation déjà présente" return 0 fi local fragment fragment="$(render_template "$fragment_file")" awk -v match="$match" -v block="$fragment" ' index($0, match) { print block } { print } ' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file" echo " [ok] $(basename "$file") — capitalisation injectée" } patch_agent() { local agent="$1" local template_name="$2" local file="$AGENTS_DIR/${agent}.customize.yaml" local template_file="$MEMORIES_DIR/${template_name}.txt" if [ ! -f "$file" ]; then return 0 fi require_file "$template_file" if grep -q "$CAPITALIZE_MARKER" "$file"; then echo " [skip] $agent — memory déjà présente" return 0 fi if ! grep -q "^memories: \[\]" "$file"; then echo " [warn] $agent — format memories: inattendu, patch manuel requis" return 0 fi local memory memory="$(render_template "$template_file")" awk -v mem="$memory" ' /^memories: \[\]/ { print "memories:"; print " - \"" mem "\""; next } { print } ' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file" echo " [ok] $agent — memory injectée" } patch_agents() { require_file "$PRODUCER_AGENTS_CONFIG" while IFS=$'\t' read -r agent template_name; do if [ -z "${agent:-}" ] || [ "${agent#\#}" != "$agent" ]; then continue fi patch_agent "$agent" "$template_name" done < "$PRODUCER_AGENTS_CONFIG" } patch_dev_story() { patch_block_before_match \ "$DEV_STORY_XML" \ "" \ "$WORKFLOWS_DIR/dev-story-capitalisation.xmlfrag" } patch_code_review() { local file="$CODE_REVIEW_XML" local fragment_file="$WORKFLOWS_DIR/code-review-capitalisation.xmlfrag" if [ ! -f "$file" ]; then echo " [skip] $(basename "$file") — fichier absent" return 0 fi if grep -q "$CAPITALIZE_MARKER_XML" "$file"; then echo " [skip] $(basename "$file") — capitalisation déjà présente" return 0 fi local fragment fragment="$(render_template "$fragment_file")" awk -v block="$fragment" ' /✅ Review Complete!/ { in_review_complete = 1 } in_review_complete && /<\/output>/ { print print "" print block in_review_complete = 0 next } { print } ' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file" echo " [ok] $(basename "$file") — capitalisation injectée" } patch_dev_story_checklist() { patch_line_after_match \ "$DEV_STORY_CHECKLIST" \ "**User Communication Ready**" \ "$WORKFLOWS_DIR/dev-story-checklist.mdfrag" } patch_code_review_checklist() { patch_line_after_match \ "$CODE_REVIEW_CHECKLIST" \ "Story saved successfully" \ "$WORKFLOWS_DIR/code-review-checklist.mdfrag" } patch_claude_md() { local fragment_file="$CLAUDE_FRAGMENTS_DIR/leadtech-capitalisation.mdfrag" if [ ! -f "$CLAUDE_MD" ]; then echo " [skip] CLAUDE.md — fichier absent" return 0 fi if grep -q "$CAPITALIZE_MARKER" "$CLAUDE_MD"; then echo " [skip] CLAUDE.md — section capitalisation déjà présente" return 0 fi render_template "$fragment_file" >> "$CLAUDE_MD" echo " [ok] CLAUDE.md — section capitalisation ajoutée" } # --- Main --- echo "" echo "post-bmad-install — injection Lead_tech capitalisation" echo "Projet : $PROJECT_NAME ($PROJECT_ROOT)" echo "Agents : $AGENTS_DIR" echo "Templates : $TEMPLATES_DIR" echo "" echo "Patch agents :" patch_agents echo "" echo "Patch workflows :" patch_dev_story patch_code_review patch_dev_story_checklist patch_code_review_checklist echo "" echo "Patch CLAUDE.md :" patch_claude_md echo "" echo "Terminé. Lance 'git diff' pour vérifier les changements."