stemedb/scripts/run-demo.sh
jordan 157dbbb9eb feat: Complete Aphoria Phase 8-9 + UAT suite (90/90 tests passing)
## Phase 8: Enterprise Extractor Improvements 
- 14 security extractors (TLS, JWT, SQL injection, XSS, etc.)
- 10 framework-specific extractors (Spring, Django, Rails, etc.)
- Config file security detection (YAML, TOML)

## Phase 9: Autonomous Extractor Generation 
- Shadow mode executor with TP/FP tracking
- Graduation pipeline with confidence thresholds
- Auto-rollback on regression detection
- Cross-project pattern syncing

## UAT Suite Complete (14 scripts, 90 tests)
- test-core-detection.sh (6 tests)
- test-declarative-extractors.sh (5 tests)
- test-domain-frameworks.sh (5 tests)
- test-domain-unreal.sh (3 tests)
- test-llm-extraction.sh (6 tests)
- test-eval-harness.sh (5 tests)
- test-cross-language.sh (3 tests)
- test-precommit-performance.sh (4 tests)
- test-output-formats.sh (8 tests)
- test-drift-detection.sh (6 tests)
- test-exit-codes.sh (12 tests)
+ 3 more scripts

## Other Changes
- Updated roadmap to mark Phase 8-9 complete
- Added .gitignore entries for build artifacts
- Updated pre-commit: 800 line limit, exclude tests/data/cmd

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 22:50:55 -07:00

281 lines
7.7 KiB
Bash
Executable File

#!/bin/bash
# StemeDB Demo - One-Command Setup
#
# This script:
# 1. Builds the StemeDB API (if needed)
# 2. Starts the API server in the background
# 3. Waits for health check
# 4. Seeds demo data with realistic agent names
# 5. Opens the dashboard in your browser
#
# Usage:
# ./scripts/run-demo.sh
# ./scripts/run-demo.sh --no-open # Don't open browser
# ./scripts/run-demo.sh --clean # Start fresh (delete existing data)
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Configuration
API_PORT="${STEMEDB_PORT:-18180}"
DASHBOARD_PORT="${DASHBOARD_PORT:-18188}"
DATA_DIR="${STEMEDB_DATA_DIR:-$PROJECT_ROOT/data/demo}"
API_PID_FILE="$DATA_DIR/.api.pid"
OPEN_BROWSER=true
CLEAN_START=false
# Parse arguments
for arg in "$@"; do
case $arg in
--no-open)
OPEN_BROWSER=false
shift
;;
--clean)
CLEAN_START=true
shift
;;
--help|-h)
echo "Usage: $0 [--no-open] [--clean]"
echo ""
echo "Options:"
echo " --no-open Don't open browser after starting"
echo " --clean Delete existing data and start fresh"
echo ""
exit 0
;;
esac
done
# Helper functions
print_header() {
echo -e "\n${BOLD}${BLUE}$1${NC}"
echo -e "${BLUE}$(printf '=%.0s' {1..60})${NC}\n"
}
print_step() {
echo -e "${CYAN}=> $1${NC}"
}
print_success() {
echo -e "${GREEN}[OK] $1${NC}"
}
print_error() {
echo -e "${RED}[ERROR] $1${NC}"
}
print_warning() {
echo -e "${YELLOW}[WARN] $1${NC}"
}
cleanup() {
if [ -f "$API_PID_FILE" ]; then
API_PID=$(cat "$API_PID_FILE")
if kill -0 "$API_PID" 2>/dev/null; then
print_step "Stopping StemeDB API (PID: $API_PID)..."
kill "$API_PID" 2>/dev/null || true
fi
rm -f "$API_PID_FILE"
fi
}
# Set up cleanup on exit
trap cleanup EXIT
# ============================================================================
# MAIN
# ============================================================================
print_header "StemeDB Demo Setup"
echo -e "${BOLD}Configuration:${NC}"
echo " Project Root: $PROJECT_ROOT"
echo " API Port: $API_PORT"
echo " Dashboard Port: $DASHBOARD_PORT"
echo " Data Directory: $DATA_DIR"
echo ""
cd "$PROJECT_ROOT"
# Create data directory
mkdir -p "$DATA_DIR"
# Clean start if requested
if [ "$CLEAN_START" = true ]; then
print_step "Cleaning existing data..."
rm -rf "$DATA_DIR"/*
print_success "Data cleaned"
fi
# ============================================================================
# Step 1: Build StemeDB API
# ============================================================================
print_header "Step 1: Building StemeDB API"
if [ ! -f "$PROJECT_ROOT/target/release/stemedb-api" ]; then
print_step "Building release binary..."
cargo build --release --package stemedb-api
print_success "Build complete"
else
print_step "Checking if rebuild needed..."
# Check if source is newer than binary
SRC_TIME=$(find crates -name "*.rs" -newer target/release/stemedb-api 2>/dev/null | head -1)
if [ -n "$SRC_TIME" ]; then
print_step "Source changed, rebuilding..."
cargo build --release --package stemedb-api
print_success "Rebuild complete"
else
print_success "Binary is up to date"
fi
fi
# ============================================================================
# Step 2: Start StemeDB API
# ============================================================================
print_header "Step 2: Starting StemeDB API"
# Check if already running
if [ -f "$API_PID_FILE" ]; then
OLD_PID=$(cat "$API_PID_FILE")
if kill -0 "$OLD_PID" 2>/dev/null; then
print_warning "StemeDB API already running (PID: $OLD_PID)"
print_step "Stopping existing instance..."
kill "$OLD_PID" 2>/dev/null || true
sleep 1
fi
rm -f "$API_PID_FILE"
fi
print_step "Starting StemeDB API on port $API_PORT..."
# Set environment variables for demo
export STEMEDB_BIND_ADDR="127.0.0.1:$API_PORT"
export STEMEDB_DATA_DIR="$DATA_DIR"
export RUST_LOG="${RUST_LOG:-info}"
# Start API in background
"$PROJECT_ROOT/target/release/stemedb-api" > "$DATA_DIR/api.log" 2>&1 &
API_PID=$!
echo "$API_PID" > "$API_PID_FILE"
print_success "API started (PID: $API_PID)"
echo " Log file: $DATA_DIR/api.log"
# ============================================================================
# Step 3: Wait for Health Check
# ============================================================================
print_header "Step 3: Waiting for API Health"
MAX_ATTEMPTS=30
ATTEMPT=0
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
ATTEMPT=$((ATTEMPT + 1))
if curl -s "http://localhost:$API_PORT/v1/health" > /dev/null 2>&1; then
print_success "API is healthy"
break
fi
if ! kill -0 "$API_PID" 2>/dev/null; then
print_error "API process died. Check logs:"
echo " tail -50 $DATA_DIR/api.log"
exit 1
fi
echo -ne "\r Waiting... ($ATTEMPT/$MAX_ATTEMPTS)"
sleep 1
done
if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
print_error "API failed to become healthy after ${MAX_ATTEMPTS}s"
echo " Check logs: tail -50 $DATA_DIR/api.log"
exit 1
fi
echo ""
# ============================================================================
# Step 4: Seed Demo Data
# ============================================================================
print_header "Step 4: Seeding Demo Data"
print_step "Running demo-seed..."
echo ""
cd "$PROJECT_ROOT/cmd/demo-seed"
go run . --api-url "http://localhost:$API_PORT" --keys-file "$PROJECT_ROOT/demo/keys/agents.json"
print_success "Demo data seeded"
# ============================================================================
# Step 5: Open Dashboard
# ============================================================================
print_header "Step 5: Dashboard Ready"
DASHBOARD_URL="http://localhost:$DASHBOARD_PORT"
API_URL="http://localhost:$API_PORT"
echo -e "${BOLD}Demo URLs:${NC}"
echo -e " API: ${CYAN}$API_URL${NC}"
echo -e " Dashboard: ${CYAN}$DASHBOARD_URL${NC}"
echo ""
echo -e "${BOLD}Quick Links:${NC}"
echo -e " Skeptic Query: ${CYAN}$DASHBOARD_URL/skeptic${NC}"
echo -e " Audit Trail: ${CYAN}$DASHBOARD_URL/audit${NC}"
echo -e " Quarantine: ${CYAN}$DASHBOARD_URL/quarantine${NC}"
echo ""
echo -e "${BOLD}Try These API Queries:${NC}"
echo -e " ${YELLOW}curl -s '$API_URL/v1/skeptic?subject=semaglutide:gastroparesis_risk&predicate=risk_level' | jq${NC}"
echo -e " ${YELLOW}curl -s '$API_URL/v1/layered?subject=semaglutide:gastroparesis_risk&predicate=risk_level' | jq${NC}"
echo -e " ${YELLOW}curl -s '$API_URL/v1/admin/quarantine?limit=10' | jq${NC}"
echo ""
if [ "$OPEN_BROWSER" = true ]; then
print_step "Opening dashboard..."
# Try different methods to open browser
if command -v open &> /dev/null; then
open "$DASHBOARD_URL" 2>/dev/null || true
elif command -v xdg-open &> /dev/null; then
xdg-open "$DASHBOARD_URL" 2>/dev/null || true
else
print_warning "Could not detect browser. Open manually: $DASHBOARD_URL"
fi
fi
# ============================================================================
# Keep Running
# ============================================================================
print_header "Demo Running"
echo -e "${GREEN}${BOLD}StemeDB demo is running!${NC}"
echo ""
echo "Press Ctrl+C to stop the server."
echo ""
echo "Logs: tail -f $DATA_DIR/api.log"
echo ""
# Wait for API process
wait "$API_PID"