## 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>
281 lines
7.7 KiB
Bash
Executable File
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"
|