18 KiB
description, args
| description | args | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Upgrade dependencies or frameworks with breaking change analysis and automated refactoring |
|
User Input
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Goal
Upgrade dependencies or frameworks with automated breaking change analysis and code refactoring.
Purpose: Streamline complex upgrade processes by automating dependency updates, breaking change detection, and code refactoring.
Workflow: Analyze → Plan → Update → Refactor → Test → Report
Scope:
- Framework upgrades (React 18→19, Vue 2→3, Next.js 13→14, etc.)
- Dependency upgrades (specific packages or all dependencies)
- Breaking change detection from changelogs
- Automated code refactoring for breaking changes
- Test validation after upgrade
User Experience:
- Single command handles complex multi-step upgrades
- Automatic breaking change detection
- Guided refactoring with codemod suggestions
- Test-driven validation
- Clear migration report with manual tasks
Pre-Flight Checks
# Parse arguments
UPGRADE_TARGET=""
UPGRADE_ALL_DEPS=false
PACKAGE_NAME=""
DRY_RUN=false
# Extract upgrade target (first non-flag argument)
for arg in $ARGUMENTS; do
if [ "${arg:0:2}" != "--" ] && [ -z "$UPGRADE_TARGET" ]; then
UPGRADE_TARGET="$arg"
elif [ "$arg" = "--deps" ]; then
UPGRADE_ALL_DEPS=true
elif [ "$arg" = "--package" ]; then
shift
PACKAGE_NAME="$1"
elif [ "$arg" = "--dry-run" ]; then
DRY_RUN=true
fi
done
# Validate upgrade target
if [ -z "$UPGRADE_TARGET" ] && [ "$UPGRADE_ALL_DEPS" = false ] && [ -z "$PACKAGE_NAME" ]; then
echo "❌ Error: Upgrade target required"
echo ""
echo "Usage: /specswarm:upgrade \"target\" [--deps] [--package name] [--dry-run]"
echo ""
echo "Examples:"
echo " /specswarm:upgrade \"React 18 to React 19\""
echo " /specswarm:upgrade \"Next.js 14 to Next.js 15\""
echo " /specswarm:upgrade --deps # All dependencies"
echo " /specswarm:upgrade --package react # Specific package"
echo " /specswarm:upgrade \"Vue 2 to Vue 3\" --dry-run"
exit 1
fi
# Normalize upgrade target
if [ "$UPGRADE_ALL_DEPS" = true ]; then
UPGRADE_TARGET="all dependencies"
elif [ -n "$PACKAGE_NAME" ]; then
UPGRADE_TARGET="$PACKAGE_NAME to latest"
fi
# Get project root
if ! git rev-parse --git-dir > /dev/null 2>&1; then
echo "❌ Error: Not in a git repository"
exit 1
fi
REPO_ROOT=$(git rev-parse --show-toplevel)
cd "$REPO_ROOT"
# Check for package.json
if [ ! -f "package.json" ]; then
echo "❌ Error: package.json not found"
echo " This command currently supports Node.js/npm projects."
exit 1
fi
Execution Steps
Step 1: Display Welcome Banner
if [ "$DRY_RUN" = true ]; then
echo "🔍 SpecSwarm Upgrade - Analysis Mode (Dry Run)"
else
echo "⬆️ SpecSwarm Upgrade - Dependency & Framework Migration"
fi
echo "══════════════════════════════════════════"
echo ""
echo "Upgrade: $UPGRADE_TARGET"
echo ""
if [ "$DRY_RUN" = true ]; then
echo "🔍 DRY RUN MODE: Analyzing only, no changes will be made"
echo ""
echo "This analysis will:"
echo " 1. Detect current versions"
echo " 2. Identify latest available versions"
echo " 3. Analyze breaking changes from changelogs"
echo " 4. Estimate refactoring impact"
echo " 5. Generate migration plan"
echo ""
else
echo "This workflow will:"
echo " 1. Analyze breaking changes"
echo " 2. Generate migration plan"
echo " 3. Update dependencies"
echo " 4. Refactor code for breaking changes"
echo " 5. Run tests to verify compatibility"
echo " 6. Report manual migration tasks"
echo ""
fi
read -p "Press Enter to start, or Ctrl+C to cancel..."
echo ""
Step 2: Phase 1 - Analyze Current State
YOU MUST NOW analyze the current dependency state:
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🔍 Phase 1: Analyzing Current Dependencies"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
Analysis steps:
-
Read package.json to get current dependencies
-
Identify the packages to upgrade:
- If UPGRADE_ALL_DEPS: all dependencies + devDependencies
- If PACKAGE_NAME: specific package
- If upgrade target like "React 18 to React 19": extract package names (react, react-dom, etc.)
-
For each package, detect:
- Current version (from package.json)
- Latest version (from npm registry)
- Installed version (from package-lock.json or node_modules)
-
Check for framework-specific packages:
- React: react, react-dom, @types/react
- Vue: vue, @vue/*, vue-router
- Next.js: next, react, react-dom
- Remix: @remix-run/*
- Angular: @angular/*
# Example analysis output
echo "📦 Current Versions:"
echo " react: 18.2.0"
echo " react-dom: 18.2.0"
echo " @types/react: 18.0.28"
echo ""
echo "📦 Target Versions:"
echo " react: 19.0.0"
echo " react-dom: 19.0.0"
echo " @types/react: 19.0.0"
echo ""
Store:
- PACKAGES_TO_UPGRADE (array of package names)
- CURRENT_VERSIONS (map of package → version)
- TARGET_VERSIONS (map of package → version)
Step 3: Phase 2 - Breaking Change Analysis
YOU MUST NOW analyze breaking changes:
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📋 Phase 2: Analyzing Breaking Changes"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Fetching changelogs and release notes..."
echo ""
For each package being upgraded:
-
Fetch changelog/release notes:
- Check GitHub releases (if repository URL in package.json)
- Check npm package page
- Use WebFetch tool to get changelog content
-
Extract breaking changes:
- Look for "BREAKING CHANGE", "Breaking Changes", "⚠️", "❗" sections
- Extract version-specific breaking changes (between current and target)
- Parse common patterns:
- "Removed X"
- "X is now Y"
- "X has been deprecated"
- "X no longer supports Y"
-
Categorize breaking changes:
- API changes: Function signature changes, removed methods
- Behavior changes: Default behavior modifications
- Deprecations: Deprecated but still working
- Removals: Features completely removed
- Configuration: Config file format changes
-
Assess impact on codebase:
- Search codebase for usage of affected APIs
- Estimate files requiring manual changes
- Identify automated refactoring opportunities
echo "🔍 Breaking Changes Detected:"
echo ""
echo "React 18 → 19:"
echo " ⚠️ ReactDOM.render removed (use createRoot)"
echo " ⚠️ Legacy Context API deprecated"
echo " ⚠️ PropTypes moved to separate package"
echo " ✅ Automatic migration available for 2/3 changes"
echo ""
echo "Impact Analysis:"
echo " 📁 3 files use ReactDOM.render"
echo " 📁 1 file uses Legacy Context"
echo " 📁 0 files use PropTypes"
echo ""
Store:
- BREAKING_CHANGES (array of change descriptions)
- AFFECTED_FILES (map of change → files)
- AUTO_FIXABLE (array of changes with codemods available)
Step 4: Phase 3 - Generate Migration Plan
YOU MUST NOW generate a detailed migration plan:
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 Phase 3: Generating Migration Plan"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
Create a migration plan that includes:
-
Dependency Update Steps:
npm install react@19 react-dom@19 @types/react@19 -
Automated Refactoring Steps:
- For each auto-fixable breaking change
- Codemod command or manual find/replace pattern
- Example:
npx react-codemod create-root src/
-
Manual Migration Tasks:
- For each non-auto-fixable breaking change
- Which files need manual updates
- What changes to make
- Code examples (before/after)
-
Test Validation:
- Test commands to run after changes
- Expected test results
-
Risk Assessment:
- Low/Medium/High risk rating
- Estimated time
- Recommended approach (all at once vs incremental)
echo "Migration Plan Generated:"
echo ""
echo "1. Update Dependencies (automated)"
echo " └─ npm install react@19 react-dom@19"
echo ""
echo "2. Automated Refactoring (3 codemods)"
echo " └─ ReactDOM.render → createRoot"
echo " └─ Legacy Context → New Context API"
echo " └─ Update TypeScript types"
echo ""
echo "3. Manual Tasks (1 required)"
echo " └─ Review and test Legacy Context migration in src/contexts/ThemeContext.tsx"
echo ""
echo "4. Test Validation"
echo " └─ npm test (all tests must pass)"
echo ""
echo "Risk Assessment: MEDIUM"
echo "Estimated Time: 15-30 minutes"
echo ""
IF DRY_RUN = true:
- Stop here, display plan, exit
- Do NOT make any changes
Step 5: Phase 4 - Update Dependencies
IF NOT dry run, YOU MUST NOW update dependencies:
if [ "$DRY_RUN" = false ]; then
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📦 Phase 4: Updating Dependencies"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
fi
Use Bash tool to run npm install:
# Build install command
INSTALL_CMD="npm install"
for package in "${PACKAGES_TO_UPGRADE[@]}"; do
target_version="${TARGET_VERSIONS[$package]}"
INSTALL_CMD="$INSTALL_CMD $package@$target_version"
done
echo "Running: $INSTALL_CMD"
echo ""
# Execute
$INSTALL_CMD
if [ $? -eq 0 ]; then
echo ""
echo "✅ Dependencies updated successfully"
echo ""
else
echo ""
echo "❌ Dependency update failed"
echo " Check npm output above for errors"
exit 1
fi
Step 6: Phase 5 - Automated Refactoring
IF NOT dry run, YOU MUST NOW apply automated refactorings:
if [ "$DRY_RUN" = false ]; then
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🔧 Phase 5: Automated Refactoring"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
fi
For each auto-fixable breaking change:
-
Apply codemod (if available):
- React:
npx react-codemod <codemod-name> <path> - Vue:
npx vue-codemod <codemod-name> <path> - Other: Custom find/replace using Edit tool
- React:
-
Apply manual refactoring patterns:
- Use Grep tool to find affected code
- Use Edit tool to make changes
- Log each change for rollback if needed
-
Verify changes:
- Check syntax (bash -n for shell, tsc --noEmit for TypeScript)
- Quick validation that files parse correctly
echo "Applying refactoring 1/3: ReactDOM.render → createRoot"
# Apply codemod or manual refactoring
echo "✅ Refactored 3 files"
echo ""
echo "Applying refactoring 2/3: Legacy Context → New Context API"
# Apply codemod or manual refactoring
echo "✅ Refactored 1 file"
echo ""
echo "Applying refactoring 3/3: Update TypeScript types"
# Apply codemod or manual refactoring
echo "✅ Updated type definitions"
echo ""
Step 7: Phase 6 - Test Validation
IF NOT dry run, YOU MUST NOW run tests:
if [ "$DRY_RUN" = false ]; then
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✓ Phase 6: Testing Compatibility"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
fi
Run test suite:
- Detect test command (package.json scripts.test)
- Run tests with Bash tool
- Capture results
- Report pass/fail
echo "Running test suite..."
echo ""
npm test
TEST_RESULT=$?
if [ $TEST_RESULT -eq 0 ]; then
echo ""
echo "✅ All tests passing after upgrade!"
echo ""
TESTS_PASSING=true
else
echo ""
echo "⚠️ Some tests failing after upgrade"
echo " This may be expected for breaking changes requiring manual migration"
echo ""
TESTS_PASSING=false
fi
Step 8: Final Report
Display completion summary:
echo ""
echo "══════════════════════════════════════════"
if [ "$DRY_RUN" = true ]; then
echo "🔍 UPGRADE ANALYSIS COMPLETE (DRY RUN)"
echo "══════════════════════════════════════════"
echo ""
echo "Upgrade: $UPGRADE_TARGET"
echo ""
echo "📋 Migration Plan Ready"
echo "📊 Risk Assessment: [RISK_LEVEL]"
echo "⏱️ Estimated Time: [TIME_ESTIMATE]"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 NEXT STEPS"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "1. Review migration plan above"
echo "2. If acceptable, run actual upgrade:"
echo " /specswarm:upgrade \"$UPGRADE_TARGET\""
echo ""
echo "3. Or handle migration manually using plan as guide"
echo ""
else
echo "🎉 UPGRADE COMPLETE"
echo "══════════════════════════════════════════"
echo ""
echo "Upgrade: $UPGRADE_TARGET"
echo ""
echo "✅ Dependencies updated"
echo "✅ Automated refactoring applied"
if [ "$TESTS_PASSING" = true ]; then
echo "✅ All tests passing"
else
echo "⚠️ Tests require attention (see output above)"
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 MANUAL TASKS REMAINING"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# List manual tasks from migration plan
echo "The following tasks require manual intervention:"
echo ""
for task in "${MANUAL_TASKS[@]}"; do
echo " ⚠️ $task"
done
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🧪 RECOMMENDED TESTING"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "1. 🔍 Review Changes"
echo " git diff"
echo ""
echo "2. 🧪 Manual Testing"
echo " - Start development server"
echo " - Test critical user flows"
echo " - Verify no console errors"
echo " - Check for visual regressions"
echo ""
echo "3. 📊 Performance Check"
echo " - Compare bundle size (if applicable)"
echo " - Verify no performance degradation"
echo ""
if [ "$TESTS_PASSING" = true ]; then
echo "4. 🚢 Ship When Ready"
echo " /specswarm:ship"
echo ""
echo " All tests passing - ready to merge after manual verification"
else
echo "4. 🔧 Fix Failing Tests"
echo " - Address test failures"
echo " - Complete manual migration tasks above"
echo " - Re-run: npm test"
echo ""
echo "5. 🚢 Ship When Tests Pass"
echo " /specswarm:ship"
fi
echo ""
fi
echo "══════════════════════════════════════════"
Error Handling
If any step fails:
- Changelog fetch fails: Continue with generic breaking change warnings
- Dependency update fails: Display npm errors, suggest manual resolution
- Refactoring fails: Roll back changes, report errors
- Tests fail: Report as warning, not error (expected for breaking changes)
All errors should report clearly and suggest remediation.
Design Philosophy
Automated Where Possible: Codemods and refactoring patterns reduce manual work
Transparent Process: Clear breaking change analysis before making changes
Safety First: Dry run mode for risk assessment, test validation after changes
Guidance: Manual tasks clearly documented with examples
Realistic: Acknowledges that some migrations require manual intervention
Use Cases
Framework Upgrades:
- React 18 → 19
- Vue 2 → 3
- Next.js 14 → 15
- Angular major versions
Dependency Upgrades:
- All dependencies to latest
- Specific package upgrades
- Security vulnerability fixes
Breaking Change Migrations:
- API removals
- Configuration format changes
- Behavior modifications
Limitations
Current Support:
- ✅ Node.js/npm projects (package.json)
- ✅ React framework upgrades
- ✅ Common JavaScript libraries
Future Enhancements:
- Python (pip, requirements.txt)
- Ruby (Gemfile)
- Rust (Cargo.toml)
- More framework-specific codemods
- Automated rollback on test failure