fix(link-project): preserve project-specific .claude content when linking
Previously the script would backup and replace the entire .claude directory with a symlink. This broke projects with their own .claude content (like visa-ai with 76 immigration-specific config files). Now the script: - If project has existing .claude/ → only symlinks commands/ subdirectory - If project has no .claude/ → symlinks entire directory - Backs up existing commands/ to commands-local/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
1cc7a84e76
commit
493905915e
|
|
@ -0,0 +1,117 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# BMAD Project Linker
|
||||||
|
# Links external projects to this BMAD-METHOD installation
|
||||||
|
# Usage: ./link-project.sh <target-project-path>
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BMAD_HOME="/Users/hbl/Documents/BMAD-METHOD"
|
||||||
|
TARGET_PROJECT="$1"
|
||||||
|
|
||||||
|
if [ -z "$TARGET_PROJECT" ]; then
|
||||||
|
echo "❌ Usage: ./link-project.sh <target-project-path>"
|
||||||
|
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 ""
|
||||||
Loading…
Reference in New Issue