diff --git a/link-project.sh b/link-project.sh new file mode 100755 index 00000000..e268fd14 --- /dev/null +++ b/link-project.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# BMAD Project Linker +# Links external projects to this BMAD-METHOD installation +# Usage: ./link-project.sh + +set -e + +BMAD_HOME="/Users/hbl/Documents/BMAD-METHOD" +TARGET_PROJECT="$1" + +if [ -z "$TARGET_PROJECT" ]; then + echo "❌ Usage: ./link-project.sh " + echo "" + echo "Example: ./link-project.sh /Users/hbl/Documents/hbl-documents" + exit 1 +fi + +# Resolve absolute path +TARGET_PROJECT=$(cd "$TARGET_PROJECT" && pwd) + +echo "🔗 BMAD Project Linker" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "BMAD Home: $BMAD_HOME" +echo "Target Project: $TARGET_PROJECT" +echo "" + +# Check if target exists +if [ ! -d "$TARGET_PROJECT" ]; then + echo "❌ Target project directory does not exist: $TARGET_PROJECT" + exit 1 +fi + +# Backup existing BMAD directories if they exist +echo "🔍 Checking for existing BMAD installations..." +if [ -d "$TARGET_PROJECT/bmad" ]; then + BACKUP_DIR="$TARGET_PROJECT/bmad.backup.$(date +%Y%m%d-%H%M%S)" + echo "âš ī¸ Found existing bmad/ directory" + echo "đŸ“Ļ Backing up to: $BACKUP_DIR" + mv "$TARGET_PROJECT/bmad" "$BACKUP_DIR" +fi + +# Create symlinks +echo "" +echo "🔗 Creating symlinks..." + +cd "$TARGET_PROJECT" + +# Link bmad directory +ln -s "$BMAD_HOME/bmad" bmad +echo "✅ Linked: bmad/ → $BMAD_HOME/bmad" + +# Handle .claude directory - preserve project-specific content +if [ -d "$TARGET_PROJECT/.claude" ]; then + echo "📁 Found existing .claude/ directory - preserving project-specific content" + + # Backup and symlink commands subdirectory + if [ -d "$TARGET_PROJECT/.claude/commands" ] && [ ! -L "$TARGET_PROJECT/.claude/commands" ]; then + mv "$TARGET_PROJECT/.claude/commands" "$TARGET_PROJECT/.claude/commands-local" + echo "đŸ“Ļ Backed up: .claude/commands → .claude/commands-local" + fi + + if [ ! -e "$TARGET_PROJECT/.claude/commands" ]; then + ln -s "$BMAD_HOME/.claude/commands" "$TARGET_PROJECT/.claude/commands" + echo "✅ Linked: .claude/commands/ → $BMAD_HOME/.claude/commands" + else + echo "â„šī¸ .claude/commands symlink already exists" + fi +else + # No existing .claude - symlink the entire directory + ln -s "$BMAD_HOME/.claude" .claude + echo "✅ Linked: .claude/ → $BMAD_HOME/.claude" +fi + +# Create a marker file to indicate this is a linked project +cat > .bmad-linked << EOF +# BMAD Linked Project +This project is linked to the main BMAD installation at: +$BMAD_HOME + +Linked on: $(date) + +To unlink: + rm bmad .bmad-linked + rm .claude/commands # if .claude was preserved + # OR: rm .claude # if entire .claude was symlinked + +To update BMAD (update the main installation): + cd $BMAD_HOME + npm run update:bmad +EOF + +echo "✅ Created: .bmad-linked (marker file)" + +# Add to .gitignore if it exists +if [ -f "$TARGET_PROJECT/.gitignore" ]; then + if ! grep -q "^bmad$" "$TARGET_PROJECT/.gitignore"; then + echo "" >> "$TARGET_PROJECT/.gitignore" + echo "# BMAD symlinks (linked to $BMAD_HOME)" >> "$TARGET_PROJECT/.gitignore" + echo "bmad" >> "$TARGET_PROJECT/.gitignore" + echo ".bmad-linked" >> "$TARGET_PROJECT/.gitignore" + # Only add .claude if it's a symlink (not if we preserved existing) + if [ -L "$TARGET_PROJECT/.claude" ]; then + echo ".claude" >> "$TARGET_PROJECT/.gitignore" + fi + echo "✅ Updated: .gitignore" + fi +fi + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "✨ Project linked successfully!" +echo "" +echo "Your project now has access to all BMAD agents and workflows." +echo "To update BMAD for ALL linked projects, just update the main installation:" +echo " cd $BMAD_HOME" +echo " npm run update:bmad" +echo ""