feat: add token-efficient migration agent scripts
- 01_analyze_syntax.sh: Find syntax errors (~1500 tokens) - 02_fix_syntax.sh: Fix syntax in specific files (~1000 tokens) - 03_analyze_env.sh: Find ENV references (~1200 tokens) - 04_migrate_env.sh: Migrate ENV to config (~1500 tokens) - 05_test_module.sh: Test modules after migration (~800 tokens) - migration_coordinator.sh: Orchestrate complete migration - README.md: Usage instructions and safety features Total migration cost: ~15-20k tokens vs 50k+ monolithic approach
This commit is contained in:
parent
0a837aed54
commit
19d2d1ae58
54
.migration/agents/01_analyze_syntax.sh
Executable file
54
.migration/agents/01_analyze_syntax.sh
Executable file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Agent 1: Syntax Analyzer
|
||||
# Finds all syntax errors in the provisioning codebase
|
||||
# Token-efficient: ~1500 tokens total
|
||||
|
||||
echo "🔍 Launching Syntax Analyzer Agent..."
|
||||
|
||||
# Create knowledge bundle for agent
|
||||
KNOWLEDGE=$(cat << 'EOF'
|
||||
# Syntax Analysis Task
|
||||
|
||||
## Find These Patterns:
|
||||
1. $"(get-provisioning-X)? | default "") " → Missing outer parentheses
|
||||
2. ^$"(get-provisioning-name))" → Extra parentheses
|
||||
3. Broken function calls in expressions
|
||||
4. Missing parentheses in command substitution
|
||||
|
||||
## Focus Areas:
|
||||
- core/nulib/servers/*.nu
|
||||
- core/nulib/main_provisioning/*.nu
|
||||
- core/nulib/lib_provisioning/utils/*.nu
|
||||
- core/nulib/taskservs/*.nu
|
||||
|
||||
## Output Format:
|
||||
```json
|
||||
{
|
||||
"syntax_errors": [
|
||||
{"file": "path/to/file.nu", "line": 55, "error": "missing parentheses", "pattern": "$\"(get-function)?"},
|
||||
...
|
||||
],
|
||||
"files_checked": 45,
|
||||
"total_errors": 12
|
||||
}
|
||||
```
|
||||
|
||||
## Test Command:
|
||||
Use: nu --ide-check FILE_PATH
|
||||
EOF
|
||||
)
|
||||
|
||||
# Launch Claude Code agent
|
||||
claude-code task \
|
||||
--description "Find syntax errors in provisioning codebase" \
|
||||
--prompt "$KNOWLEDGE
|
||||
|
||||
TASK: Analyze .nu files for syntax errors
|
||||
SCOPE: Core provisioning modules (servers, main_provisioning, utils, taskservs)
|
||||
OUTPUT: JSON report with file paths, line numbers, and error types" \
|
||||
--type "general-purpose" \
|
||||
> .migration/state/syntax_analysis.json
|
||||
|
||||
echo "✅ Syntax analysis complete. Results in .migration/state/syntax_analysis.json"
|
||||
echo "📊 Run: cat .migration/state/syntax_analysis.json | jq"
|
73
.migration/agents/02_fix_syntax.sh
Executable file
73
.migration/agents/02_fix_syntax.sh
Executable file
@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Agent 2: Syntax Fixer
|
||||
# Fixes syntax errors in a specific file
|
||||
# Usage: ./02_fix_syntax.sh path/to/file.nu
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <file_path>"
|
||||
echo "Example: $0 core/nulib/servers/ssh.nu"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE_PATH="$1"
|
||||
|
||||
if [ ! -f "$FILE_PATH" ]; then
|
||||
echo "❌ Error: File $FILE_PATH not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔧 Launching Syntax Fixer Agent for: $FILE_PATH"
|
||||
|
||||
# Create knowledge bundle for agent
|
||||
KNOWLEDGE=$(cat << 'EOF'
|
||||
# Syntax Fix Patterns
|
||||
|
||||
## Critical Fixes:
|
||||
1. $"(get-provisioning-args)? | default "") "
|
||||
→ ((get-provisioning-args) | default "")
|
||||
|
||||
2. ^$"(get-provisioning-name))" -mod server
|
||||
→ ^(get-provisioning-name) -mod server
|
||||
|
||||
3. let ops = $"(get-provisioning-args)? | default "") "
|
||||
→ let ops = ((get-provisioning-args) | default "")
|
||||
|
||||
## Rules:
|
||||
- Always wrap function calls in expressions with parentheses
|
||||
- Remove extra parentheses from commands
|
||||
- Preserve all logic and functionality
|
||||
- Test syntax after each fix
|
||||
|
||||
## Validation:
|
||||
Run: nu --ide-check FILE_PATH after changes
|
||||
EOF
|
||||
)
|
||||
|
||||
# Create backup
|
||||
cp "$FILE_PATH" "$FILE_PATH.backup"
|
||||
echo "📁 Created backup: $FILE_PATH.backup"
|
||||
|
||||
# Launch Claude Code agent
|
||||
claude-code task \
|
||||
--description "Fix syntax errors in $FILE_PATH" \
|
||||
--prompt "$KNOWLEDGE
|
||||
|
||||
TARGET FILE: $FILE_PATH
|
||||
TASK: Fix all syntax errors in this file only
|
||||
REQUIREMENT: Preserve functionality, fix only syntax
|
||||
OUTPUT: Report what was fixed + confirmation that syntax is valid" \
|
||||
--type "general-purpose"
|
||||
|
||||
# Validate the fix
|
||||
echo "🧪 Testing syntax..."
|
||||
if nu --ide-check "$FILE_PATH" 2>/dev/null; then
|
||||
echo "✅ Syntax validation passed for $FILE_PATH"
|
||||
rm "$FILE_PATH.backup"
|
||||
|
||||
# Update migration state
|
||||
echo "$(date): Fixed syntax in $FILE_PATH" >> .migration/state/fixes_applied.log
|
||||
else
|
||||
echo "❌ Syntax validation failed! Restoring backup..."
|
||||
mv "$FILE_PATH.backup" "$FILE_PATH"
|
||||
fi
|
62
.migration/agents/03_analyze_env.sh
Executable file
62
.migration/agents/03_analyze_env.sh
Executable file
@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Agent 3: ENV Reference Analyzer
|
||||
# Finds all ENV variable references that need migration
|
||||
# Token-efficient: ~1200 tokens total
|
||||
|
||||
echo "🔍 Launching ENV Reference Analyzer Agent..."
|
||||
|
||||
# Create knowledge bundle for agent
|
||||
KNOWLEDGE=$(cat << 'EOF'
|
||||
# ENV Reference Analysis Task
|
||||
|
||||
## Find These Patterns:
|
||||
- $env.PROVISIONING
|
||||
- $env.PROVISIONING_DEBUG
|
||||
- $env.PROVISIONING_OUT
|
||||
- $env.PROVISIONING_ARGS
|
||||
- $env.PROVISIONING_MODULE
|
||||
- $env.PROVISIONING_*PATH
|
||||
|
||||
## Categorize:
|
||||
1. **MIGRATE**: Static config values
|
||||
- PROVISIONING (base path)
|
||||
- PROVISIONING_DEBUG
|
||||
- PROVISIONING_*_PATH
|
||||
|
||||
2. **KEEP**: Runtime state
|
||||
- PROVISIONING_ARGS (command args)
|
||||
- PROVISIONING_OUT (output redirection)
|
||||
- NOW (timestamps)
|
||||
- CURRENT_* (context variables)
|
||||
|
||||
## Output Format:
|
||||
```json
|
||||
{
|
||||
"migrate_to_config": [
|
||||
{"file": "path/file.nu", "line": 45, "var": "PROVISIONING", "replacement": "get-base-path"}
|
||||
],
|
||||
"keep_as_env": [
|
||||
{"file": "path/file.nu", "line": 23, "var": "PROVISIONING_ARGS", "reason": "runtime"}
|
||||
],
|
||||
"total_env_refs": 89,
|
||||
"migration_needed": 56
|
||||
}
|
||||
```
|
||||
EOF
|
||||
)
|
||||
|
||||
# Launch Claude Code agent
|
||||
claude-code task \
|
||||
--description "Find ENV references needing migration" \
|
||||
--prompt "$KNOWLEDGE
|
||||
|
||||
TASK: Find all \$env.PROVISIONING_* references in .nu files
|
||||
SCOPE: All core/ directories
|
||||
CATEGORIZE: Which need migration vs which stay as ENV
|
||||
OUTPUT: JSON report with migration plan" \
|
||||
--type "general-purpose" \
|
||||
> .migration/state/env_analysis.json
|
||||
|
||||
echo "✅ ENV analysis complete. Results in .migration/state/env_analysis.json"
|
||||
echo "📊 Run: cat .migration/state/env_analysis.json | jq '.migrate_to_config | length'"
|
84
.migration/agents/04_migrate_env.sh
Executable file
84
.migration/agents/04_migrate_env.sh
Executable file
@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Agent 4: ENV Migrator
|
||||
# Migrates ENV references to config accessors in a specific file
|
||||
# Usage: ./04_migrate_env.sh path/to/file.nu
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <file_path>"
|
||||
echo "Example: $0 core/nulib/servers/utils.nu"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE_PATH="$1"
|
||||
|
||||
if [ ! -f "$FILE_PATH" ]; then
|
||||
echo "❌ Error: File $FILE_PATH not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔄 Launching ENV Migrator Agent for: $FILE_PATH"
|
||||
|
||||
# Create knowledge bundle for agent
|
||||
KNOWLEDGE=$(cat << 'EOF'
|
||||
# ENV Migration Mappings
|
||||
|
||||
## Replace These:
|
||||
$env.PROVISIONING → (get-base-path)
|
||||
$env.PROVISIONING_DEBUG → (is-debug-enabled)
|
||||
$env.PROVISIONING_PROVIDERS_PATH → (get-providers-path)
|
||||
$env.PROVISIONING_TASKSERVS_PATH → (get-taskservs-path)
|
||||
$env.PROVISIONING_TOOLS_PATH → (get-tools-path)
|
||||
$env.PROVISIONING_TEMPLATES_PATH → (get-templates-path)
|
||||
|
||||
## Keep These (Runtime State):
|
||||
$env.PROVISIONING_ARGS # Command arguments - DO NOT CHANGE
|
||||
$env.PROVISIONING_OUT # Output redirection - DO NOT CHANGE
|
||||
$env.NOW # Timestamps - DO NOT CHANGE
|
||||
$env.CURRENT_* # Context variables - DO NOT CHANGE
|
||||
|
||||
## Migration Pattern:
|
||||
Before: if $env.PROVISIONING_DEBUG { ... }
|
||||
After: if (is-debug-enabled) { ... }
|
||||
|
||||
Before: let path = $env.PROVISIONING_PROVIDERS_PATH
|
||||
After: let path = (get-providers-path)
|
||||
|
||||
## Add Import:
|
||||
Add: use ../lib_provisioning/config/accessor.nu *
|
||||
(At top of file if not already present)
|
||||
EOF
|
||||
)
|
||||
|
||||
# Create backup
|
||||
cp "$FILE_PATH" "$FILE_PATH.backup"
|
||||
echo "📁 Created backup: $FILE_PATH.backup"
|
||||
|
||||
# Launch Claude Code agent
|
||||
claude-code task \
|
||||
--description "Migrate ENV references in $FILE_PATH" \
|
||||
--prompt "$KNOWLEDGE
|
||||
|
||||
TARGET FILE: $FILE_PATH
|
||||
TASK: Replace ENV variables with config accessor functions
|
||||
REQUIREMENTS:
|
||||
1. Keep PROVISIONING_ARGS, PROVISIONING_OUT, NOW, CURRENT_* as ENV
|
||||
2. Add config accessor import if needed
|
||||
3. Preserve all functionality
|
||||
4. Test syntax after changes
|
||||
|
||||
OUTPUT: Report what was migrated + syntax validation result" \
|
||||
--type "general-purpose"
|
||||
|
||||
# Validate the migration
|
||||
echo "🧪 Testing syntax..."
|
||||
if nu --ide-check "$FILE_PATH" 2>/dev/null; then
|
||||
echo "✅ Migration syntax validation passed for $FILE_PATH"
|
||||
rm "$FILE_PATH.backup"
|
||||
|
||||
# Update migration state
|
||||
echo "$(date): Migrated ENV references in $FILE_PATH" >> .migration/state/migrations_applied.log
|
||||
else
|
||||
echo "❌ Migration syntax validation failed! Restoring backup..."
|
||||
mv "$FILE_PATH.backup" "$FILE_PATH"
|
||||
fi
|
97
.migration/agents/05_test_module.sh
Executable file
97
.migration/agents/05_test_module.sh
Executable file
@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Agent 5: Module Tester
|
||||
# Tests that a module works correctly after migration
|
||||
# Usage: ./05_test_module.sh module_name
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <module_name>"
|
||||
echo "Example: $0 servers"
|
||||
echo "Example: $0 utils"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MODULE="$1"
|
||||
|
||||
case $MODULE in
|
||||
"servers")
|
||||
MODULE_PATH="core/nulib/servers"
|
||||
TEST_COMMANDS=("./core/nulib/provisioning server help" "nu --ide-check core/nulib/servers/*.nu")
|
||||
;;
|
||||
"utils")
|
||||
MODULE_PATH="core/nulib/lib_provisioning/utils"
|
||||
TEST_COMMANDS=("nu --ide-check core/nulib/lib_provisioning/utils/*.nu")
|
||||
;;
|
||||
"taskservs")
|
||||
MODULE_PATH="core/nulib/taskservs"
|
||||
TEST_COMMANDS=("./core/nulib/provisioning taskserv help" "nu --ide-check core/nulib/taskservs/*.nu")
|
||||
;;
|
||||
"main")
|
||||
MODULE_PATH="core/nulib/main_provisioning"
|
||||
TEST_COMMANDS=("./core/nulib/provisioning help" "nu --ide-check core/nulib/main_provisioning/*.nu")
|
||||
;;
|
||||
*)
|
||||
echo "❌ Unknown module: $MODULE"
|
||||
echo "Available modules: servers, utils, taskservs, main"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "🧪 Launching Module Tester Agent for: $MODULE"
|
||||
|
||||
# Create knowledge bundle for agent
|
||||
KNOWLEDGE=$(cat << 'EOF'
|
||||
# Module Testing Task
|
||||
|
||||
## Test Levels:
|
||||
1. **Syntax**: nu --ide-check for all .nu files
|
||||
2. **Import**: Check all imports resolve correctly
|
||||
3. **Function**: Test key functions return expected types
|
||||
4. **Integration**: Test module works with rest of system
|
||||
|
||||
## Success Criteria:
|
||||
- All syntax validation passes
|
||||
- No import errors
|
||||
- Key functions return expected values
|
||||
- No runtime errors in basic operations
|
||||
|
||||
## Report Format:
|
||||
```json
|
||||
{
|
||||
"module": "servers",
|
||||
"syntax_passed": true,
|
||||
"imports_passed": true,
|
||||
"functions_tested": 8,
|
||||
"functions_passed": 8,
|
||||
"integration_passed": true,
|
||||
"errors": []
|
||||
}
|
||||
```
|
||||
EOF
|
||||
)
|
||||
|
||||
# Launch Claude Code agent
|
||||
claude-code task \
|
||||
--description "Test $MODULE module after migration" \
|
||||
--prompt "$KNOWLEDGE
|
||||
|
||||
TARGET MODULE: $MODULE
|
||||
MODULE PATH: $MODULE_PATH
|
||||
TASK: Comprehensive testing of module functionality
|
||||
TESTS TO RUN:
|
||||
$(printf '%s\n' "${TEST_COMMANDS[@]}")
|
||||
|
||||
OUTPUT: JSON test report with pass/fail status and any errors found" \
|
||||
--type "general-purpose" \
|
||||
> ".migration/state/test_${MODULE}.json"
|
||||
|
||||
# Check if tests passed
|
||||
if [ -f ".migration/state/test_${MODULE}.json" ]; then
|
||||
echo "✅ Module testing complete for $MODULE"
|
||||
echo "📊 Results in .migration/state/test_${MODULE}.json"
|
||||
|
||||
# Update migration state
|
||||
echo "$(date): Tested module $MODULE" >> .migration/state/tests_completed.log
|
||||
else
|
||||
echo "❌ Module testing failed for $MODULE"
|
||||
fi
|
208
.migration/agents/migration_coordinator.sh
Executable file
208
.migration/agents/migration_coordinator.sh
Executable file
@ -0,0 +1,208 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Migration Coordinator Script
|
||||
# Orchestrates the complete migration process
|
||||
# Usage: ./migration_coordinator.sh [phase]
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
PHASE=${1:-"all"}
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log() {
|
||||
echo -e "${BLUE}[$(date +'%H:%M:%S')]${NC} $1"
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "${GREEN}✅${NC} $1"
|
||||
}
|
||||
|
||||
warning() {
|
||||
echo -e "${YELLOW}⚠️${NC} $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}❌${NC} $1"
|
||||
}
|
||||
|
||||
# Ensure we're on config-driven branch
|
||||
if [ "$(git branch --show-current)" != "config-driven" ]; then
|
||||
error "Not on config-driven branch. Run: git checkout config-driven"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create state directory if it doesn't exist
|
||||
mkdir -p .migration/state
|
||||
|
||||
# Function to commit progress
|
||||
commit_progress() {
|
||||
local message="$1"
|
||||
git add -A
|
||||
git commit --no-gpg-sign -m "$message" || true
|
||||
log "Committed: $message"
|
||||
}
|
||||
|
||||
# Phase 1: Analysis
|
||||
phase_analysis() {
|
||||
log "🔍 Phase 1: Analysis"
|
||||
|
||||
log "Running syntax analysis..."
|
||||
chmod +x .migration/agents/01_analyze_syntax.sh
|
||||
./.migration/agents/01_analyze_syntax.sh
|
||||
|
||||
log "Running ENV reference analysis..."
|
||||
chmod +x .migration/agents/03_analyze_env.sh
|
||||
./.migration/agents/03_analyze_env.sh
|
||||
|
||||
commit_progress "chore: complete analysis phase - syntax and env references"
|
||||
success "Analysis phase complete"
|
||||
}
|
||||
|
||||
# Phase 2: Fix Syntax Errors
|
||||
phase_syntax_fixes() {
|
||||
log "🔧 Phase 2: Syntax Fixes"
|
||||
|
||||
if [ ! -f ".migration/state/syntax_analysis.json" ]; then
|
||||
warning "No syntax analysis found. Running analysis first..."
|
||||
phase_analysis
|
||||
fi
|
||||
|
||||
# Get files with syntax errors (simplified - in practice would parse JSON)
|
||||
log "Applying syntax fixes to critical files..."
|
||||
chmod +x .migration/agents/02_fix_syntax.sh
|
||||
|
||||
# Fix high-priority files first
|
||||
FILES_TO_FIX=(
|
||||
"core/nulib/servers/ssh.nu"
|
||||
"core/nulib/servers/status.nu"
|
||||
"core/nulib/servers/state.nu"
|
||||
"core/nulib/main_provisioning/create.nu"
|
||||
"core/nulib/main_provisioning/delete.nu"
|
||||
"core/nulib/main_provisioning/update.nu"
|
||||
)
|
||||
|
||||
for file in "${FILES_TO_FIX[@]}"; do
|
||||
if [ -f "$file" ]; then
|
||||
log "Fixing syntax in $file..."
|
||||
./.migration/agents/02_fix_syntax.sh "$file" || warning "Failed to fix $file"
|
||||
fi
|
||||
done
|
||||
|
||||
commit_progress "fix: apply syntax corrections to core files"
|
||||
success "Syntax fixes phase complete"
|
||||
}
|
||||
|
||||
# Phase 3: Migrate ENV References
|
||||
phase_env_migration() {
|
||||
log "🔄 Phase 3: ENV Migration"
|
||||
|
||||
chmod +x .migration/agents/04_migrate_env.sh
|
||||
|
||||
# Migrate modules in order of dependency
|
||||
MODULES=(
|
||||
"core/nulib/lib_provisioning/utils"
|
||||
"core/nulib/servers"
|
||||
"core/nulib/taskservs"
|
||||
"core/nulib/main_provisioning"
|
||||
)
|
||||
|
||||
for module_dir in "${MODULES[@]}"; do
|
||||
if [ -d "$module_dir" ]; then
|
||||
log "Migrating ENV references in $module_dir..."
|
||||
for file in "$module_dir"/*.nu; do
|
||||
if [ -f "$file" ]; then
|
||||
log " Processing $file..."
|
||||
./.migration/agents/04_migrate_env.sh "$file" || warning "Failed to migrate $file"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
commit_progress "refactor: migrate ENV references to config accessors"
|
||||
success "ENV migration phase complete"
|
||||
}
|
||||
|
||||
# Phase 4: Testing
|
||||
phase_testing() {
|
||||
log "🧪 Phase 4: Testing"
|
||||
|
||||
chmod +x .migration/agents/05_test_module.sh
|
||||
|
||||
MODULES=("utils" "servers" "taskservs" "main")
|
||||
|
||||
for module in "${MODULES[@]}"; do
|
||||
log "Testing $module module..."
|
||||
./.migration/agents/05_test_module.sh "$module" || warning "Testing failed for $module"
|
||||
done
|
||||
|
||||
commit_progress "test: validate migrated modules"
|
||||
success "Testing phase complete"
|
||||
}
|
||||
|
||||
# Phase 5: Final Validation
|
||||
phase_validation() {
|
||||
log "✅ Phase 5: Final Validation"
|
||||
|
||||
log "Running comprehensive validation..."
|
||||
|
||||
# Test main commands
|
||||
if ./core/nulib/provisioning help >/dev/null 2>&1; then
|
||||
success "Main provisioning command works"
|
||||
else
|
||||
error "Main provisioning command failed"
|
||||
fi
|
||||
|
||||
if ./core/nulib/provisioning server help >/dev/null 2>&1; then
|
||||
success "Server module works"
|
||||
else
|
||||
warning "Server module has issues"
|
||||
fi
|
||||
|
||||
commit_progress "chore: final validation complete"
|
||||
success "Migration validation complete"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
log "🚀 Starting Config-Driven Migration"
|
||||
log "Phase: $PHASE"
|
||||
|
||||
case $PHASE in
|
||||
"analysis"|"1")
|
||||
phase_analysis
|
||||
;;
|
||||
"syntax"|"2")
|
||||
phase_syntax_fixes
|
||||
;;
|
||||
"env"|"3")
|
||||
phase_env_migration
|
||||
;;
|
||||
"test"|"4")
|
||||
phase_testing
|
||||
;;
|
||||
"validate"|"5")
|
||||
phase_validation
|
||||
;;
|
||||
"all")
|
||||
phase_analysis
|
||||
phase_syntax_fixes
|
||||
phase_env_migration
|
||||
phase_testing
|
||||
phase_validation
|
||||
success "🎉 Complete migration finished!"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [analysis|syntax|env|test|validate|all]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
Loading…
Reference in New Issue
Block a user