Add CCLI (CLI agent integration) complete implementation
- Complete Gemini CLI agent adapter with SSH execution - CLI agent factory with connection pooling - SSH executor with AsyncSSH for remote CLI execution - Backend integration with CLI agent manager - MCP server updates with CLI agent tools - Frontend UI updates for mixed agent types - Database migrations for CLI agent support - Docker deployment with CLI source integration - Comprehensive documentation and testing 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
270
scripts/test-connectivity.sh
Executable file
270
scripts/test-connectivity.sh
Executable file
@@ -0,0 +1,270 @@
|
||||
#!/bin/bash
|
||||
|
||||
# CCLI Connectivity Test Suite
|
||||
# Tests SSH connectivity and Gemini CLI functionality on target machines
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Test configuration
|
||||
WALNUT_NODE_VERSION="v22.14.0"
|
||||
IRONWOOD_NODE_VERSION="v22.17.0"
|
||||
TEST_PROMPT="What is 2+2? Answer briefly."
|
||||
|
||||
function log() {
|
||||
echo -e "${BLUE}[$(date +'%H:%M:%S')]${NC} $1"
|
||||
}
|
||||
|
||||
function success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
function warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
function error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
function test_ssh_connection() {
|
||||
local host=$1
|
||||
log "Testing SSH connection to $host..."
|
||||
|
||||
if ssh -o ConnectTimeout=5 -o BatchMode=yes $host "echo 'SSH connection successful'" > /dev/null 2>&1; then
|
||||
success "SSH connection to $host working"
|
||||
return 0
|
||||
else
|
||||
error "SSH connection to $host failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function test_node_environment() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
log "Testing Node.js environment on $host (version $node_version)..."
|
||||
|
||||
local cmd="source ~/.nvm/nvm.sh && nvm use $node_version && node --version"
|
||||
local result=$(ssh $host "$cmd" 2>/dev/null)
|
||||
|
||||
if [[ $result == *$node_version ]]; then
|
||||
success "Node.js $node_version working on $host"
|
||||
return 0
|
||||
else
|
||||
error "Node.js $node_version not working on $host (got: $result)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function test_gemini_cli() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
log "Testing Gemini CLI on $host..."
|
||||
|
||||
local cmd="source ~/.nvm/nvm.sh && nvm use $node_version && echo '$TEST_PROMPT' | timeout 30s gemini --model gemini-2.5-pro"
|
||||
local result=$(ssh $host "$cmd" 2>/dev/null)
|
||||
|
||||
if [[ -n "$result" ]] && [[ ${#result} -gt 10 ]]; then
|
||||
success "Gemini CLI working on $host"
|
||||
log "Response preview: ${result:0:100}..."
|
||||
return 0
|
||||
else
|
||||
error "Gemini CLI not responding on $host"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function benchmark_response_time() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
log "Benchmarking response time on $host..."
|
||||
|
||||
local cmd="source ~/.nvm/nvm.sh && nvm use $node_version && echo '$TEST_PROMPT' | gemini --model gemini-2.5-pro"
|
||||
local start_time=$(date +%s.%N)
|
||||
local result=$(ssh $host "$cmd" 2>/dev/null)
|
||||
local end_time=$(date +%s.%N)
|
||||
local duration=$(echo "$end_time - $start_time" | bc -l)
|
||||
|
||||
if [[ -n "$result" ]]; then
|
||||
success "Response time on $host: ${duration:0:5}s"
|
||||
echo "$duration" > "/tmp/ccli_benchmark_${host}.txt"
|
||||
return 0
|
||||
else
|
||||
error "Benchmark failed on $host"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function test_concurrent_execution() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
local max_concurrent=${3:-2}
|
||||
log "Testing concurrent execution on $host (max: $max_concurrent)..."
|
||||
|
||||
local pids=()
|
||||
local results_dir="/tmp/ccli_concurrent_${host}"
|
||||
mkdir -p "$results_dir"
|
||||
|
||||
# Start concurrent tasks
|
||||
for i in $(seq 1 $max_concurrent); do
|
||||
{
|
||||
local cmd="source ~/.nvm/nvm.sh && nvm use $node_version && echo 'Task $i: What is $i + $i?' | gemini --model gemini-2.5-pro"
|
||||
ssh $host "$cmd" > "$results_dir/task_$i.out" 2>&1
|
||||
echo $? > "$results_dir/task_$i.exit"
|
||||
} &
|
||||
pids+=($!)
|
||||
done
|
||||
|
||||
# Wait for all tasks and check results
|
||||
wait
|
||||
local successful=0
|
||||
for i in $(seq 1 $max_concurrent); do
|
||||
if [[ -f "$results_dir/task_$i.exit" ]] && [[ $(cat "$results_dir/task_$i.exit") -eq 0 ]]; then
|
||||
((successful++))
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $successful -eq $max_concurrent ]]; then
|
||||
success "Concurrent execution successful on $host ($successful/$max_concurrent tasks)"
|
||||
return 0
|
||||
else
|
||||
warning "Partial success on $host ($successful/$max_concurrent tasks)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function test_error_handling() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
log "Testing error handling on $host..."
|
||||
|
||||
# Test invalid model
|
||||
local cmd="source ~/.nvm/nvm.sh && nvm use $node_version && echo 'test' | gemini --model invalid-model"
|
||||
if ssh $host "$cmd" > /dev/null 2>&1; then
|
||||
warning "Expected error not returned for invalid model on $host"
|
||||
else
|
||||
success "Error handling working on $host"
|
||||
fi
|
||||
}
|
||||
|
||||
function run_full_test_suite() {
|
||||
local host=$1
|
||||
local node_version=$2
|
||||
|
||||
echo ""
|
||||
echo "🧪 Testing $host with Node.js $node_version"
|
||||
echo "================================================"
|
||||
|
||||
local tests_passed=0
|
||||
local tests_total=6
|
||||
|
||||
# Run all tests
|
||||
test_ssh_connection "$host" && ((tests_passed++))
|
||||
test_node_environment "$host" "$node_version" && ((tests_passed++))
|
||||
test_gemini_cli "$host" "$node_version" && ((tests_passed++))
|
||||
benchmark_response_time "$host" "$node_version" && ((tests_passed++))
|
||||
test_concurrent_execution "$host" "$node_version" 2 && ((tests_passed++))
|
||||
test_error_handling "$host" "$node_version" && ((tests_passed++))
|
||||
|
||||
echo ""
|
||||
if [[ $tests_passed -eq $tests_total ]]; then
|
||||
success "$host: All tests passed ($tests_passed/$tests_total)"
|
||||
return 0
|
||||
else
|
||||
warning "$host: Some tests failed ($tests_passed/$tests_total)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function generate_test_report() {
|
||||
log "Generating test report..."
|
||||
|
||||
local report_file="/tmp/ccli_connectivity_report_$(date +%s).md"
|
||||
cat > "$report_file" << EOF
|
||||
# CCLI Connectivity Test Report
|
||||
|
||||
**Generated**: $(date)
|
||||
**Test Suite**: Phase 1 Connectivity & Environment Testing
|
||||
|
||||
## Test Results
|
||||
|
||||
### WALNUT (Node.js $WALNUT_NODE_VERSION)
|
||||
$(if [[ -f "/tmp/ccli_benchmark_walnut.txt" ]]; then
|
||||
echo "- ✅ All connectivity tests passed"
|
||||
echo "- Response time: $(cat /tmp/ccli_benchmark_walnut.txt | cut -c1-5)s"
|
||||
else
|
||||
echo "- ❌ Some tests failed"
|
||||
fi)
|
||||
|
||||
### IRONWOOD (Node.js $IRONWOOD_NODE_VERSION)
|
||||
$(if [[ -f "/tmp/ccli_benchmark_ironwood.txt" ]]; then
|
||||
echo "- ✅ All connectivity tests passed"
|
||||
echo "- Response time: $(cat /tmp/ccli_benchmark_ironwood.txt | cut -c1-5)s"
|
||||
else
|
||||
echo "- ❌ Some tests failed"
|
||||
fi)
|
||||
|
||||
## Performance Comparison
|
||||
$(if [[ -f "/tmp/ccli_benchmark_walnut.txt" ]] && [[ -f "/tmp/ccli_benchmark_ironwood.txt" ]]; then
|
||||
walnut_time=$(cat /tmp/ccli_benchmark_walnut.txt)
|
||||
ironwood_time=$(cat /tmp/ccli_benchmark_ironwood.txt)
|
||||
echo "- WALNUT: ${walnut_time:0:5}s"
|
||||
echo "- IRONWOOD: ${ironwood_time:0:5}s"
|
||||
faster_host=$(echo "$walnut_time < $ironwood_time" | bc -l)
|
||||
if [[ $faster_host -eq 1 ]]; then
|
||||
echo "- WALNUT is faster"
|
||||
else
|
||||
echo "- IRONWOOD is faster"
|
||||
fi
|
||||
else
|
||||
echo "- Benchmark data incomplete"
|
||||
fi)
|
||||
|
||||
## Next Steps
|
||||
- [ ] Proceed to Phase 2: CLI Agent Adapter Implementation
|
||||
- [ ] Address any failed tests
|
||||
- [ ] Document environment requirements
|
||||
EOF
|
||||
|
||||
success "Test report generated: $report_file"
|
||||
echo "Report location: $report_file"
|
||||
cat "$report_file"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
echo "🚀 CCLI Connectivity Test Suite"
|
||||
echo "Testing Gemini CLI on WALNUT and IRONWOOD"
|
||||
echo ""
|
||||
|
||||
# Check dependencies
|
||||
if ! command -v bc &> /dev/null; then
|
||||
error "bc (basic calculator) not found. Please install: sudo apt-get install bc"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run tests
|
||||
walnut_result=0
|
||||
ironwood_result=0
|
||||
|
||||
run_full_test_suite "walnut" "$WALNUT_NODE_VERSION" || walnut_result=1
|
||||
run_full_test_suite "ironwood" "$IRONWOOD_NODE_VERSION" || ironwood_result=1
|
||||
|
||||
# Generate report
|
||||
generate_test_report
|
||||
|
||||
# Final status
|
||||
echo ""
|
||||
if [[ $walnut_result -eq 0 ]] && [[ $ironwood_result -eq 0 ]]; then
|
||||
success "🎉 All connectivity tests passed! Ready for Phase 2"
|
||||
exit 0
|
||||
else
|
||||
error "❌ Some tests failed. Please review and fix issues before proceeding"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user