Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
284
vendor/ruvector/examples/vibecast-7sense/.claude/helpers/adr-compliance.sh
vendored
Executable file
284
vendor/ruvector/examples/vibecast-7sense/.claude/helpers/adr-compliance.sh
vendored
Executable file
@@ -0,0 +1,284 @@
|
||||
#!/bin/bash
|
||||
# 7sense - ADR Compliance Checker Worker
|
||||
# Checks compliance with Architecture Decision Records for bioacoustics platform
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
METRICS_DIR="$PROJECT_ROOT/.claude-flow/metrics"
|
||||
ADR_FILE="$METRICS_DIR/adr-compliance.json"
|
||||
LAST_RUN_FILE="$METRICS_DIR/.adr-last-run"
|
||||
|
||||
mkdir -p "$METRICS_DIR"
|
||||
|
||||
# 7sense ADRs (from /docs/adr/)
|
||||
declare -A ADRS=(
|
||||
["ADR-001"]="System Architecture - Modular Monolith"
|
||||
["ADR-002"]="DDD Bounded Contexts"
|
||||
["ADR-003"]="Security Architecture"
|
||||
["ADR-004"]="Performance Optimization"
|
||||
["ADR-005"]="Self-Learning & Hooks"
|
||||
["ADR-006"]="Data Architecture & Vector Storage"
|
||||
["ADR-007"]="ML Inference Pipeline"
|
||||
["ADR-008"]="API Design"
|
||||
["ADR-009"]="Visualization & UI"
|
||||
)
|
||||
|
||||
should_run() {
|
||||
if [ ! -f "$LAST_RUN_FILE" ]; then return 0; fi
|
||||
local last_run=$(cat "$LAST_RUN_FILE" 2>/dev/null || echo "0")
|
||||
local now=$(date +%s)
|
||||
[ $((now - last_run)) -ge 900 ] # 15 minutes
|
||||
}
|
||||
|
||||
check_adr_001() {
|
||||
# ADR-001: System Architecture - Modular Monolith (10 domain modules)
|
||||
local score=0
|
||||
|
||||
# Check for modular crate structure
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-core" ] && score=$((score + 15))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-audio" ] && score=$((score + 15))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-embedding" ] && score=$((score + 15))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-vector" ] && score=$((score + 15))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-learning" ] && score=$((score + 10))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-analysis" ] && score=$((score + 10))
|
||||
[ -d "$PROJECT_ROOT/crates/sevensense-interpretation" ] && score=$((score + 10))
|
||||
|
||||
# Check for Cargo.toml workspace
|
||||
grep -q "sevensense" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 10))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_002() {
|
||||
# ADR-002: DDD Bounded Contexts (6 contexts)
|
||||
local score=0
|
||||
local contexts_found=0
|
||||
|
||||
# Check for bounded context implementations
|
||||
for ctx in audio embedding vector learning analysis interpretation; do
|
||||
if [ -d "$PROJECT_ROOT/crates/sevensense-$ctx" ] || \
|
||||
[ -d "$PROJECT_ROOT/src/domains/$ctx" ] || \
|
||||
grep -rq "mod ${ctx}" "$PROJECT_ROOT/src" 2>/dev/null; then
|
||||
contexts_found=$((contexts_found + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Score based on contexts found (6 total)
|
||||
score=$((contexts_found * 100 / 6))
|
||||
|
||||
# Bonus for domain events
|
||||
grep -rq "DomainEvent\|Event\|EventBus" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 10))
|
||||
[ "$score" -gt 100 ] && score=100
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_003() {
|
||||
# ADR-003: Security Architecture
|
||||
local score=0
|
||||
|
||||
# Check for input validation
|
||||
grep -rq "validate\|InputValidator\|sanitize" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for path traversal protection
|
||||
grep -rq "PathValidator\|secure_path\|canonicalize" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for authentication
|
||||
grep -rq "auth\|jwt\|Argon2\|bcrypt" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for audit logging
|
||||
grep -rq "audit\|AuditLog\|provenance" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for rate limiting
|
||||
grep -rq "rate_limit\|RateLimiter\|throttle" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_004() {
|
||||
# ADR-004: Performance Optimization (HNSW, quantization, caching)
|
||||
local score=0
|
||||
|
||||
# Check for HNSW implementation
|
||||
grep -rq "hnsw\|HNSW\|HierarchicalNSW" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 30))
|
||||
|
||||
# Check for quantization
|
||||
grep -rq "quantize\|int8\|float16\|compression" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for caching
|
||||
grep -rq "cache\|Cache\|LruCache\|moka" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for batch processing
|
||||
grep -rq "batch\|Batch\|parallel\|rayon" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_005() {
|
||||
# ADR-005: Self-Learning & Hooks (claude-flow integration)
|
||||
local score=0
|
||||
|
||||
# Check for hooks integration
|
||||
[ -f "$PROJECT_ROOT/.claude/settings.json" ] && score=$((score + 20))
|
||||
grep -q "hooks" "$PROJECT_ROOT/.claude/settings.json" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for learning patterns
|
||||
grep -rq "pattern\|learn\|train" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for memory namespaces
|
||||
grep -rq "namespace\|patterns\|motifs\|species" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for EWC/consolidation
|
||||
grep -rq "ewc\|consolidate\|forget" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_006() {
|
||||
# ADR-006: Data Architecture & Vector Storage (3-tier, hyperbolic)
|
||||
local score=0
|
||||
|
||||
# Check for entity definitions
|
||||
grep -rq "Recording\|CallSegment\|Embedding\|Cluster" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for tiered storage
|
||||
grep -rq "hot\|warm\|cold\|tier" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for hyperbolic embeddings
|
||||
grep -rq "poincare\|hyperbolic\|Poincar" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for graph relationships
|
||||
grep -rq "SIMILAR\|NEXT\|HAS_SEGMENT\|edge\|graph" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_007() {
|
||||
# ADR-007: ML Inference Pipeline (Perch 2.0, ONNX)
|
||||
local score=0
|
||||
|
||||
# Check for ONNX integration
|
||||
grep -rq "onnx\|ONNX\|onnxruntime" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 30))
|
||||
|
||||
# Check for audio preprocessing
|
||||
grep -rq "mel\|spectrogram\|resample\|32000\|32kHz" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for embedding normalization
|
||||
grep -rq "normalize\|L2\|norm" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for model management
|
||||
grep -rq "ModelManager\|model_version\|model_registry" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_008() {
|
||||
# ADR-008: API Design (REST, GraphQL, WebSocket)
|
||||
local score=0
|
||||
|
||||
# Check for REST/HTTP
|
||||
grep -rq "axum\|actix\|rocket\|warp\|http" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 30))
|
||||
|
||||
# Check for GraphQL
|
||||
grep -rq "graphql\|async-graphql\|juniper" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for WebSocket
|
||||
grep -rq "websocket\|ws\|tungstenite" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 25))
|
||||
|
||||
# Check for OpenAPI/schema
|
||||
grep -rq "openapi\|swagger\|schema" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_adr_009() {
|
||||
# ADR-009: Visualization & UI (UMAP, WASM, D3)
|
||||
local score=0
|
||||
|
||||
# Check for UMAP/dimensionality reduction
|
||||
grep -rq "umap\|tsne\|reduction\|project" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 30))
|
||||
|
||||
# Check for WASM support
|
||||
grep -rq "wasm\|wasm-bindgen\|web-sys" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/Cargo.toml" 2>/dev/null && score=$((score + 30))
|
||||
|
||||
# Check for visualization (plotly, D3, etc)
|
||||
grep -rq "plotly\|d3\|chart\|viz" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" "$PROJECT_ROOT/apps" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
# Check for evidence pack display
|
||||
grep -rq "EvidencePack\|evidence\|citation" "$PROJECT_ROOT/src" "$PROJECT_ROOT/crates" 2>/dev/null && score=$((score + 20))
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
check_compliance() {
|
||||
echo "[$(date +%H:%M:%S)] Checking 7sense ADR compliance..."
|
||||
|
||||
local total_score=0
|
||||
local compliant_count=0
|
||||
|
||||
# Check each ADR
|
||||
local adr_001=$(check_adr_001)
|
||||
local adr_002=$(check_adr_002)
|
||||
local adr_003=$(check_adr_003)
|
||||
local adr_004=$(check_adr_004)
|
||||
local adr_005=$(check_adr_005)
|
||||
local adr_006=$(check_adr_006)
|
||||
local adr_007=$(check_adr_007)
|
||||
local adr_008=$(check_adr_008)
|
||||
local adr_009=$(check_adr_009)
|
||||
|
||||
# Calculate totals
|
||||
for score in $adr_001 $adr_002 $adr_003 $adr_004 $adr_005 $adr_006 $adr_007 $adr_008 $adr_009; do
|
||||
total_score=$((total_score + score))
|
||||
[ "$score" -ge 50 ] && compliant_count=$((compliant_count + 1))
|
||||
done
|
||||
|
||||
local avg_score=$((total_score / 9))
|
||||
|
||||
# Write ADR compliance metrics
|
||||
cat > "$ADR_FILE" << EOF
|
||||
{
|
||||
"timestamp": "$(date -Iseconds)",
|
||||
"project": "7sense",
|
||||
"overallCompliance": $avg_score,
|
||||
"compliantCount": $compliant_count,
|
||||
"totalADRs": 9,
|
||||
"adrs": {
|
||||
"ADR-001": {"score": $adr_001, "title": "System Architecture - Modular Monolith"},
|
||||
"ADR-002": {"score": $adr_002, "title": "DDD Bounded Contexts"},
|
||||
"ADR-003": {"score": $adr_003, "title": "Security Architecture"},
|
||||
"ADR-004": {"score": $adr_004, "title": "Performance Optimization"},
|
||||
"ADR-005": {"score": $adr_005, "title": "Self-Learning & Hooks"},
|
||||
"ADR-006": {"score": $adr_006, "title": "Data Architecture & Vector Storage"},
|
||||
"ADR-007": {"score": $adr_007, "title": "ML Inference Pipeline"},
|
||||
"ADR-008": {"score": $adr_008, "title": "API Design"},
|
||||
"ADR-009": {"score": $adr_009, "title": "Visualization & UI"}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "[$(date +%H:%M:%S)] ✓ 7sense ADR Compliance: ${avg_score}% | Compliant: $compliant_count/9"
|
||||
|
||||
date +%s > "$LAST_RUN_FILE"
|
||||
}
|
||||
|
||||
case "${1:-check}" in
|
||||
"run") check_compliance ;;
|
||||
"check") should_run && check_compliance || echo "[$(date +%H:%M:%S)] Skipping (throttled)" ;;
|
||||
"force") rm -f "$LAST_RUN_FILE"; check_compliance ;;
|
||||
"status")
|
||||
if [ -f "$ADR_FILE" ]; then
|
||||
jq -r '"7sense Compliance: \(.overallCompliance)% | Compliant: \(.compliantCount)/\(.totalADRs)"' "$ADR_FILE"
|
||||
else
|
||||
echo "No ADR data available"
|
||||
fi
|
||||
;;
|
||||
"details")
|
||||
if [ -f "$ADR_FILE" ]; then
|
||||
jq -r '.adrs | to_entries[] | "\(.key): \(.value.score)% - \(.value.title)"' "$ADR_FILE"
|
||||
fi
|
||||
;;
|
||||
*) echo "Usage: $0 [run|check|force|status|details]" ;;
|
||||
esac
|
||||
193
vendor/ruvector/examples/vibecast-7sense/.claude/helpers/ddd-tracker.sh
vendored
Executable file
193
vendor/ruvector/examples/vibecast-7sense/.claude/helpers/ddd-tracker.sh
vendored
Executable file
@@ -0,0 +1,193 @@
|
||||
#!/bin/bash
|
||||
# 7sense - DDD Progress Tracker Worker
|
||||
# Tracks Domain-Driven Design implementation progress for bioacoustics platform
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
METRICS_DIR="$PROJECT_ROOT/.claude-flow/metrics"
|
||||
DDD_FILE="$METRICS_DIR/ddd-progress.json"
|
||||
V3_PROGRESS="$METRICS_DIR/v3-progress.json"
|
||||
LAST_RUN_FILE="$METRICS_DIR/.ddd-last-run"
|
||||
|
||||
mkdir -p "$METRICS_DIR"
|
||||
|
||||
# 7sense Bounded Contexts (from ADR-002)
|
||||
DOMAINS=("audio-ingestion" "embedding" "vector-space" "learning" "analysis" "interpretation")
|
||||
|
||||
# Domain descriptions for display
|
||||
declare -A DOMAIN_NAMES=(
|
||||
["audio-ingestion"]="Audio Ingestion"
|
||||
["embedding"]="Embedding"
|
||||
["vector-space"]="Vector Space"
|
||||
["learning"]="Learning"
|
||||
["analysis"]="Analysis"
|
||||
["interpretation"]="Interpretation"
|
||||
)
|
||||
|
||||
should_run() {
|
||||
if [ ! -f "$LAST_RUN_FILE" ]; then return 0; fi
|
||||
local last_run=$(cat "$LAST_RUN_FILE" 2>/dev/null || echo "0")
|
||||
local now=$(date +%s)
|
||||
[ $((now - last_run)) -ge 600 ] # 10 minutes
|
||||
}
|
||||
|
||||
check_domain() {
|
||||
local domain="$1"
|
||||
local domain_short="${domain//-/}"
|
||||
|
||||
# Possible paths for domain implementation
|
||||
local crate_path="$PROJECT_ROOT/crates/sevensense-${domain//-/}"
|
||||
local alt_crate_path="$PROJECT_ROOT/crates/sevensense-${domain}"
|
||||
local domain_path="$PROJECT_ROOT/src/domains/$domain"
|
||||
local alt_domain_path="$PROJECT_ROOT/src/domains/${domain//-/_}"
|
||||
|
||||
local score=0
|
||||
|
||||
# Check if domain directory exists (20 points)
|
||||
local path=""
|
||||
if [ -d "$crate_path" ]; then
|
||||
path="$crate_path"
|
||||
score=$((score + 20))
|
||||
elif [ -d "$alt_crate_path" ]; then
|
||||
path="$alt_crate_path"
|
||||
score=$((score + 20))
|
||||
elif [ -d "$domain_path" ]; then
|
||||
path="$domain_path"
|
||||
score=$((score + 20))
|
||||
elif [ -d "$alt_domain_path" ]; then
|
||||
path="$alt_domain_path"
|
||||
score=$((score + 20))
|
||||
fi
|
||||
|
||||
if [ -n "$path" ]; then
|
||||
# Check for domain layer (15 points) - entities, aggregates, value objects
|
||||
[ -d "$path/domain" ] || [ -d "$path/src/domain" ] || \
|
||||
[ -f "$path/entities.rs" ] || [ -f "$path/src/entities.rs" ] && score=$((score + 15))
|
||||
|
||||
# Check for application layer (15 points) - use cases, services
|
||||
[ -d "$path/application" ] || [ -d "$path/src/application" ] || \
|
||||
[ -f "$path/services.rs" ] || [ -f "$path/src/services.rs" ] && score=$((score + 15))
|
||||
|
||||
# Check for infrastructure layer (15 points) - repositories, adapters
|
||||
[ -d "$path/infrastructure" ] || [ -d "$path/src/infrastructure" ] || \
|
||||
[ -f "$path/repository.rs" ] || [ -f "$path/src/repository.rs" ] && score=$((score + 15))
|
||||
|
||||
# Check for API/interface layer (10 points)
|
||||
[ -d "$path/api" ] || [ -d "$path/src/api" ] || \
|
||||
[ -f "$path/handlers.rs" ] || [ -f "$path/src/handlers.rs" ] && score=$((score + 10))
|
||||
|
||||
# Check for tests (15 points)
|
||||
local test_count=$(find "$path" -name "*_test.rs" -o -name "*_tests.rs" -o -name "test_*.rs" 2>/dev/null | wc -l)
|
||||
[ "$test_count" -gt 0 ] && score=$((score + 15))
|
||||
|
||||
# Check for module exports (10 points)
|
||||
[ -f "$path/lib.rs" ] || [ -f "$path/mod.rs" ] || [ -f "$path/src/lib.rs" ] && score=$((score + 10))
|
||||
fi
|
||||
|
||||
echo "$score"
|
||||
}
|
||||
|
||||
count_artifacts() {
|
||||
local pattern="$1"
|
||||
|
||||
find "$PROJECT_ROOT/crates" "$PROJECT_ROOT/src" -name "*.rs" 2>/dev/null | \
|
||||
xargs grep -l "$pattern" 2>/dev/null | \
|
||||
grep -v target | wc -l || echo "0"
|
||||
}
|
||||
|
||||
track_ddd() {
|
||||
echo "[$(date +%H:%M:%S)] Tracking 7sense DDD progress..."
|
||||
|
||||
local total_score=0
|
||||
local domain_scores=""
|
||||
local completed_domains=0
|
||||
|
||||
for domain in "${DOMAINS[@]}"; do
|
||||
local score=$(check_domain "$domain")
|
||||
total_score=$((total_score + score))
|
||||
domain_scores="$domain_scores\"$domain\": $score, "
|
||||
|
||||
[ "$score" -ge 50 ] && completed_domains=$((completed_domains + 1))
|
||||
done
|
||||
|
||||
# Calculate overall progress
|
||||
local max_total=$((${#DOMAINS[@]} * 100))
|
||||
local progress=$((total_score * 100 / max_total))
|
||||
|
||||
# Count 7sense DDD artifacts
|
||||
local entities=$(count_artifacts "struct.*Recording\|struct.*CallSegment\|struct.*Embedding\|struct.*Cluster\|struct.*Taxon")
|
||||
local value_objects=$(count_artifacts "struct.*Id\|struct.*Timestamp\|struct.*Metadata")
|
||||
local aggregates=$(count_artifacts "impl.*Recording\|impl.*EvidencePack\|impl.*AnalysisSession")
|
||||
local repositories=$(count_artifacts "trait.*Repository\|impl.*Repository")
|
||||
local services=$(count_artifacts "struct.*Service\|impl.*Service")
|
||||
local events=$(count_artifacts "enum.*Event\|struct.*Event\|DomainEvent")
|
||||
|
||||
# Write DDD metrics
|
||||
cat > "$DDD_FILE" << EOF
|
||||
{
|
||||
"timestamp": "$(date -Iseconds)",
|
||||
"project": "7sense",
|
||||
"progress": $progress,
|
||||
"domains": {
|
||||
${domain_scores%,*}
|
||||
},
|
||||
"completed": $completed_domains,
|
||||
"total": ${#DOMAINS[@]},
|
||||
"boundedContexts": {
|
||||
"audio-ingestion": "Recording capture, segmentation, preprocessing",
|
||||
"embedding": "Perch 2.0 inference, vector normalization",
|
||||
"vector-space": "HNSW indexing, similarity search",
|
||||
"learning": "GNN training, pattern discovery",
|
||||
"analysis": "Clustering, motif detection, sequences",
|
||||
"interpretation": "RAB evidence packs, constrained generation"
|
||||
},
|
||||
"artifacts": {
|
||||
"entities": $entities,
|
||||
"valueObjects": $value_objects,
|
||||
"aggregates": $aggregates,
|
||||
"repositories": $repositories,
|
||||
"services": $services,
|
||||
"domainEvents": $events
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Update v3-progress.json if it exists
|
||||
if [ -f "$V3_PROGRESS" ] && command -v jq &>/dev/null; then
|
||||
jq --argjson progress "$progress" --argjson completed "$completed_domains" \
|
||||
'.ddd.progress = $progress | .domains.completed = $completed' \
|
||||
"$V3_PROGRESS" > "$V3_PROGRESS.tmp" 2>/dev/null && mv "$V3_PROGRESS.tmp" "$V3_PROGRESS"
|
||||
fi
|
||||
|
||||
echo "[$(date +%H:%M:%S)] ✓ 7sense DDD: ${progress}% | Contexts: $completed_domains/${#DOMAINS[@]} | Entities: $entities | Services: $services"
|
||||
|
||||
date +%s > "$LAST_RUN_FILE"
|
||||
}
|
||||
|
||||
case "${1:-check}" in
|
||||
"run"|"track") track_ddd ;;
|
||||
"check") should_run && track_ddd || echo "[$(date +%H:%M:%S)] Skipping (throttled)" ;;
|
||||
"force") rm -f "$LAST_RUN_FILE"; track_ddd ;;
|
||||
"status")
|
||||
if [ -f "$DDD_FILE" ]; then
|
||||
jq -r '"7sense DDD: \(.progress)% | Contexts: \(.completed)/\(.total) | Entities: \(.artifacts.entities) | Services: \(.artifacts.services)"' "$DDD_FILE"
|
||||
else
|
||||
echo "No DDD data available"
|
||||
fi
|
||||
;;
|
||||
"contexts")
|
||||
if [ -f "$DDD_FILE" ]; then
|
||||
echo "7sense Bounded Contexts:"
|
||||
jq -r '.boundedContexts | to_entries[] | " \(.key): \(.value)"' "$DDD_FILE"
|
||||
fi
|
||||
;;
|
||||
"details")
|
||||
if [ -f "$DDD_FILE" ]; then
|
||||
echo "Domain Progress:"
|
||||
jq -r '.domains | to_entries[] | " \(.key): \(.value)%"' "$DDD_FILE"
|
||||
fi
|
||||
;;
|
||||
*) echo "Usage: $0 [run|check|force|status|contexts|details]" ;;
|
||||
esac
|
||||
286
vendor/ruvector/examples/vibecast-7sense/.claude/settings.json
vendored
Normal file
286
vendor/ruvector/examples/vibecast-7sense/.claude/settings.json
vendored
Normal file
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "^(Write|Edit|MultiEdit)$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_INPUT_file_path\" ] && npx @claude-flow/cli@latest hooks pre-edit --file \"$TOOL_INPUT_file_path\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "^Bash$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_INPUT_command\" ] && npx @claude-flow/cli@latest hooks pre-command --command \"$TOOL_INPUT_command\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "^Task$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_INPUT_prompt\" ] && npx @claude-flow/cli@latest hooks pre-task --task-id \"task-$(date +%s)\" --description \"$TOOL_INPUT_prompt\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "^(Write|Edit|MultiEdit)$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_INPUT_file_path\" ] && npx @claude-flow/cli@latest hooks post-edit --file \"$TOOL_INPUT_file_path\" --success \"${TOOL_SUCCESS:-true}\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "^Bash$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_INPUT_command\" ] && npx @claude-flow/cli@latest hooks post-command --command \"$TOOL_INPUT_command\" --success \"${TOOL_SUCCESS:-true}\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "^Task$",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$TOOL_RESULT_agent_id\" ] && npx @claude-flow/cli@latest hooks post-task --task-id \"$TOOL_RESULT_agent_id\" --success \"${TOOL_SUCCESS:-true}\" 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"UserPromptSubmit": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$PROMPT\" ] && npx @claude-flow/cli@latest hooks route --task \"$PROMPT\" || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"SessionStart": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "npx @claude-flow/cli@latest daemon start --quiet 2>/dev/null || true",
|
||||
"timeout": 5000,
|
||||
"continueOnError": true
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$SESSION_ID\" ] && npx @claude-flow/cli@latest hooks session-restore --session-id \"$SESSION_ID\" 2>/dev/null || true",
|
||||
"timeout": 10000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Stop": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "echo '{\"ok\": true}'",
|
||||
"timeout": 1000
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Notification": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "[ -n \"$NOTIFICATION_MESSAGE\" ] && npx @claude-flow/cli@latest memory store --namespace notifications --key \"notify-$(date +%s)\" --value \"$NOTIFICATION_MESSAGE\" 2>/dev/null || true",
|
||||
"timeout": 3000,
|
||||
"continueOnError": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"statusLine": {
|
||||
"type": "command",
|
||||
"command": "npx @claude-flow/cli@latest hooks statusline 2>/dev/null || node .claude/helpers/statusline.cjs 2>/dev/null || echo \"▊ Claude Flow V3\"",
|
||||
"refreshMs": 5000,
|
||||
"enabled": true
|
||||
},
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(npx claude-flow:*)",
|
||||
"Bash(npx @claude-flow/cli:*)",
|
||||
"mcp__claude-flow__:*"
|
||||
],
|
||||
"deny": []
|
||||
},
|
||||
"claudeFlow": {
|
||||
"version": "3.0.0",
|
||||
"project": "7sense",
|
||||
"description": "Bioacoustics platform - transforming bird calls into navigable geometric space",
|
||||
"enabled": true,
|
||||
"modelPreferences": {
|
||||
"default": "claude-opus-4-5-20251101",
|
||||
"routing": "claude-3-5-haiku-20241022"
|
||||
},
|
||||
"swarm": {
|
||||
"topology": "hierarchical-mesh",
|
||||
"maxAgents": 12
|
||||
},
|
||||
"memory": {
|
||||
"backend": "hybrid",
|
||||
"enableHNSW": true,
|
||||
"namespaces": ["patterns", "motifs", "species", "corrections"]
|
||||
},
|
||||
"neural": {
|
||||
"enabled": true
|
||||
},
|
||||
"daemon": {
|
||||
"autoStart": true,
|
||||
"workers": [
|
||||
"map",
|
||||
"audit",
|
||||
"optimize",
|
||||
"consolidate",
|
||||
"testgaps",
|
||||
"ultralearn",
|
||||
"deepdive",
|
||||
"document",
|
||||
"refactor",
|
||||
"benchmark"
|
||||
],
|
||||
"schedules": {
|
||||
"audit": {
|
||||
"interval": "1h",
|
||||
"priority": "critical"
|
||||
},
|
||||
"optimize": {
|
||||
"interval": "30m",
|
||||
"priority": "high"
|
||||
},
|
||||
"consolidate": {
|
||||
"interval": "2h",
|
||||
"priority": "low"
|
||||
},
|
||||
"document": {
|
||||
"interval": "1h",
|
||||
"priority": "normal",
|
||||
"triggers": [
|
||||
"adr-update",
|
||||
"api-change"
|
||||
]
|
||||
},
|
||||
"deepdive": {
|
||||
"interval": "4h",
|
||||
"priority": "normal",
|
||||
"triggers": [
|
||||
"complex-change"
|
||||
]
|
||||
},
|
||||
"ultralearn": {
|
||||
"interval": "1h",
|
||||
"priority": "normal"
|
||||
}
|
||||
}
|
||||
},
|
||||
"learning": {
|
||||
"enabled": true,
|
||||
"autoTrain": true,
|
||||
"patterns": [
|
||||
"coordination",
|
||||
"optimization",
|
||||
"prediction",
|
||||
"bioacoustic-clustering",
|
||||
"motif-detection"
|
||||
],
|
||||
"retention": {
|
||||
"shortTerm": "24h",
|
||||
"longTerm": "30d"
|
||||
}
|
||||
},
|
||||
"adr": {
|
||||
"autoGenerate": true,
|
||||
"directory": "/docs/adr",
|
||||
"template": "madr",
|
||||
"total": 9,
|
||||
"adrs": [
|
||||
"ADR-001: System Architecture",
|
||||
"ADR-002: DDD Bounded Contexts",
|
||||
"ADR-003: Security Architecture",
|
||||
"ADR-004: Performance Optimization",
|
||||
"ADR-005: Self-Learning & Hooks",
|
||||
"ADR-006: Data Architecture",
|
||||
"ADR-007: ML Inference Pipeline",
|
||||
"ADR-008: API Design",
|
||||
"ADR-009: Visualization & UI"
|
||||
]
|
||||
},
|
||||
"ddd": {
|
||||
"trackDomains": true,
|
||||
"validateBoundedContexts": true,
|
||||
"directory": "/docs/ddd",
|
||||
"contexts": [
|
||||
"audio-ingestion",
|
||||
"embedding",
|
||||
"vector-space",
|
||||
"learning",
|
||||
"analysis",
|
||||
"interpretation"
|
||||
],
|
||||
"cratePrefix": "sevensense"
|
||||
},
|
||||
"security": {
|
||||
"autoScan": true,
|
||||
"scanOnEdit": true,
|
||||
"cveCheck": true,
|
||||
"threatModel": true,
|
||||
"dataClassification": ["public", "research", "protected-species"]
|
||||
},
|
||||
"pipeline": {
|
||||
"description": "Audio → Mel Spectrogram → Perch 2.0 → HNSW → GNN → RAB",
|
||||
"embedding": {
|
||||
"model": "perch-2.0",
|
||||
"dimensions": 1536,
|
||||
"sampleRate": 32000,
|
||||
"windowSize": "5s"
|
||||
},
|
||||
"vectorSpace": {
|
||||
"index": "HNSW",
|
||||
"params": {
|
||||
"M": 32,
|
||||
"efConstruction": 200,
|
||||
"efSearch": 128
|
||||
}
|
||||
},
|
||||
"targets": {
|
||||
"hnswSpeedup": "150x",
|
||||
"queryLatency": "<100ms",
|
||||
"ingestion": "10k vectors/sec"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
252
vendor/ruvector/examples/vibecast-7sense/.claude/statusline.sh
vendored
Executable file
252
vendor/ruvector/examples/vibecast-7sense/.claude/statusline.sh
vendored
Executable file
@@ -0,0 +1,252 @@
|
||||
#!/bin/bash
|
||||
# 7sense Bioacoustics Platform - Development Status Line
|
||||
# Shows DDD bounded contexts, ADR compliance, and pipeline status
|
||||
|
||||
# Read Claude Code JSON input from stdin (if available)
|
||||
CLAUDE_INPUT=$(cat 2>/dev/null || echo "{}")
|
||||
|
||||
# Get project directory from Claude Code input or use current directory
|
||||
PROJECT_DIR=$(echo "$CLAUDE_INPUT" | jq -r '.workspace.project_dir // ""' 2>/dev/null)
|
||||
if [ -z "$PROJECT_DIR" ] || [ "$PROJECT_DIR" = "null" ]; then
|
||||
PROJECT_DIR=$(pwd)
|
||||
fi
|
||||
|
||||
# File paths relative to project directory
|
||||
DDD_METRICS="${PROJECT_DIR}/.claude-flow/metrics/ddd-progress.json"
|
||||
ADR_METRICS="${PROJECT_DIR}/.claude-flow/metrics/adr-compliance.json"
|
||||
SECURITY_AUDIT="${PROJECT_DIR}/.claude-flow/security/audit-status.json"
|
||||
PERFORMANCE_METRICS="${PROJECT_DIR}/.claude-flow/metrics/performance.json"
|
||||
|
||||
# ANSI Color Codes
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
PURPLE='\033[0;35m'
|
||||
CYAN='\033[0;36m'
|
||||
WHITE='\033[0;37m'
|
||||
BOLD='\033[1m'
|
||||
DIM='\033[2m'
|
||||
RESET='\033[0m'
|
||||
|
||||
# Bright colors
|
||||
BRIGHT_RED='\033[1;31m'
|
||||
BRIGHT_GREEN='\033[1;32m'
|
||||
BRIGHT_YELLOW='\033[1;33m'
|
||||
BRIGHT_BLUE='\033[1;34m'
|
||||
BRIGHT_PURPLE='\033[1;35m'
|
||||
BRIGHT_CYAN='\033[1;36m'
|
||||
|
||||
# 7sense Architecture Targets
|
||||
CONTEXTS_TOTAL=6 # Audio, Embedding, Vector, Learning, Analysis, Interpretation
|
||||
ADRS_TOTAL=9 # ADR-001 through ADR-009
|
||||
AGENTS_TARGET=12
|
||||
PERF_TARGET="150x" # HNSW search improvement target
|
||||
|
||||
# Default values
|
||||
CONTEXTS_COMPLETED=0
|
||||
ADR_COMPLIANCE=0
|
||||
ADRS_COMPLIANT=0
|
||||
AGENTS_ACTIVE=0
|
||||
DDD_PROGRESS=0
|
||||
HNSW_SPEEDUP="--"
|
||||
SECURITY_STATUS="PENDING"
|
||||
|
||||
# Get current git branch
|
||||
GIT_BRANCH=""
|
||||
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "")
|
||||
fi
|
||||
|
||||
# Get GitHub username
|
||||
GH_USER=""
|
||||
if command -v gh >/dev/null 2>&1; then
|
||||
GH_USER=$(gh api user --jq '.login' 2>/dev/null || echo "")
|
||||
fi
|
||||
if [ -z "$GH_USER" ]; then
|
||||
GH_USER=$(git config user.name 2>/dev/null || echo "dev")
|
||||
fi
|
||||
|
||||
# Check DDD bounded context progress
|
||||
if [ -f "$DDD_METRICS" ]; then
|
||||
CONTEXTS_COMPLETED=$(jq -r '.completed // 0' "$DDD_METRICS" 2>/dev/null || echo "0")
|
||||
DDD_PROGRESS=$(jq -r '.progress // 0' "$DDD_METRICS" 2>/dev/null || echo "0")
|
||||
else
|
||||
# Check for actual domain directories (crates or src/domains)
|
||||
CONTEXTS_COMPLETED=0
|
||||
for ctx in audio embedding vector learning analysis interpretation; do
|
||||
[ -d "$PROJECT_DIR/crates/sevensense-$ctx" ] && ((CONTEXTS_COMPLETED++)) && continue
|
||||
[ -d "$PROJECT_DIR/src/domains/$ctx" ] && ((CONTEXTS_COMPLETED++))
|
||||
done
|
||||
fi
|
||||
|
||||
# Check ADR compliance
|
||||
if [ -f "$ADR_METRICS" ]; then
|
||||
ADR_COMPLIANCE=$(jq -r '.overallCompliance // 0' "$ADR_METRICS" 2>/dev/null || echo "0")
|
||||
ADRS_COMPLIANT=$(jq -r '.compliantCount // 0' "$ADR_METRICS" 2>/dev/null || echo "0")
|
||||
fi
|
||||
|
||||
# Check security status
|
||||
if [ -f "$SECURITY_AUDIT" ]; then
|
||||
SECURITY_STATUS=$(jq -r '.status // "PENDING"' "$SECURITY_AUDIT" 2>/dev/null || echo "PENDING")
|
||||
fi
|
||||
|
||||
# Check performance metrics (HNSW speedup)
|
||||
if [ -f "$PERFORMANCE_METRICS" ]; then
|
||||
HNSW_SPEEDUP=$(jq -r '.hnsw.speedup // "--"' "$PERFORMANCE_METRICS" 2>/dev/null || echo "--")
|
||||
fi
|
||||
|
||||
# Real-time swarm detection
|
||||
ACTIVE_PROCESSES=$(ps aux 2>/dev/null | grep -E "(agentic-flow|claude-flow)" | grep -v grep | wc -l)
|
||||
SWARM_ACTIVITY="${PROJECT_DIR}/.claude-flow/metrics/swarm-activity.json"
|
||||
if [ -f "$SWARM_ACTIVITY" ]; then
|
||||
DYNAMIC_AGENTS=$(jq -r '.swarm.agent_count // 0' "$SWARM_ACTIVITY" 2>/dev/null || echo "0")
|
||||
[ "$DYNAMIC_AGENTS" -gt 0 ] && AGENTS_ACTIVE="$DYNAMIC_AGENTS"
|
||||
elif [ "$ACTIVE_PROCESSES" -gt 0 ]; then
|
||||
AGENTS_ACTIVE=$((ACTIVE_PROCESSES / 2))
|
||||
[ "$AGENTS_ACTIVE" -eq 0 ] && AGENTS_ACTIVE=1
|
||||
fi
|
||||
|
||||
# Context window usage
|
||||
CONTEXT_PCT=0
|
||||
CONTEXT_COLOR="${DIM}"
|
||||
if [ "$CLAUDE_INPUT" != "{}" ]; then
|
||||
CONTEXT_REMAINING=$(echo "$CLAUDE_INPUT" | jq '.context_window.remaining_percentage // null' 2>/dev/null)
|
||||
if [ "$CONTEXT_REMAINING" != "null" ] && [ -n "$CONTEXT_REMAINING" ]; then
|
||||
CONTEXT_PCT=$((100 - CONTEXT_REMAINING))
|
||||
fi
|
||||
if [ "$CONTEXT_PCT" -lt 50 ]; then
|
||||
CONTEXT_COLOR="${BRIGHT_GREEN}"
|
||||
elif [ "$CONTEXT_PCT" -lt 75 ]; then
|
||||
CONTEXT_COLOR="${BRIGHT_YELLOW}"
|
||||
else
|
||||
CONTEXT_COLOR="${BRIGHT_RED}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Intelligence score from learning patterns
|
||||
INTEL_SCORE=0
|
||||
INTEL_COLOR="${DIM}"
|
||||
PATTERNS_DB="${PROJECT_DIR}/.claude-flow/learning/patterns.db"
|
||||
if [ -f "$PATTERNS_DB" ] && command -v sqlite3 &>/dev/null; then
|
||||
PATTERN_COUNT=$(sqlite3 "$PATTERNS_DB" "SELECT COUNT(*) FROM short_term_patterns" 2>/dev/null || echo "0")
|
||||
INTEL_SCORE=$((PATTERN_COUNT * 10))
|
||||
[ "$INTEL_SCORE" -gt 100 ] && INTEL_SCORE=100
|
||||
fi
|
||||
if [ "$INTEL_SCORE" -lt 25 ]; then
|
||||
INTEL_COLOR="${DIM}"
|
||||
elif [ "$INTEL_SCORE" -lt 50 ]; then
|
||||
INTEL_COLOR="${YELLOW}"
|
||||
elif [ "$INTEL_SCORE" -lt 75 ]; then
|
||||
INTEL_COLOR="${BRIGHT_CYAN}"
|
||||
else
|
||||
INTEL_COLOR="${BRIGHT_GREEN}"
|
||||
fi
|
||||
|
||||
# Domain status indicators (6 bounded contexts)
|
||||
COMPLETED_CTX="${BRIGHT_GREEN}●${RESET}"
|
||||
PENDING_CTX="${DIM}○${RESET}"
|
||||
CTX_STATUS="${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}"
|
||||
|
||||
case $CONTEXTS_COMPLETED in
|
||||
1) CTX_STATUS="${COMPLETED_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}" ;;
|
||||
2) CTX_STATUS="${COMPLETED_CTX}${COMPLETED_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}" ;;
|
||||
3) CTX_STATUS="${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${PENDING_CTX}${PENDING_CTX}${PENDING_CTX}" ;;
|
||||
4) CTX_STATUS="${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${PENDING_CTX}${PENDING_CTX}" ;;
|
||||
5) CTX_STATUS="${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${PENDING_CTX}" ;;
|
||||
6) CTX_STATUS="${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}${COMPLETED_CTX}" ;;
|
||||
esac
|
||||
|
||||
# Security status color
|
||||
SECURITY_ICON="🔴"
|
||||
SECURITY_COLOR="${BRIGHT_RED}"
|
||||
if [ "$SECURITY_STATUS" = "CLEAN" ]; then
|
||||
SECURITY_ICON="🟢"
|
||||
SECURITY_COLOR="${BRIGHT_GREEN}"
|
||||
elif [ "$SECURITY_STATUS" = "AUDIT" ]; then
|
||||
SECURITY_ICON="🟡"
|
||||
SECURITY_COLOR="${BRIGHT_YELLOW}"
|
||||
fi
|
||||
|
||||
# ADR compliance color
|
||||
ADR_COLOR="${BRIGHT_GREEN}"
|
||||
if [ "$ADR_COMPLIANCE" -lt 50 ]; then
|
||||
ADR_COLOR="${RED}"
|
||||
elif [ "$ADR_COMPLIANCE" -lt 75 ]; then
|
||||
ADR_COLOR="${YELLOW}"
|
||||
fi
|
||||
|
||||
# Swarm status color
|
||||
AGENTS_COLOR="${BRIGHT_GREEN}"
|
||||
if [ "$AGENTS_ACTIVE" -lt 4 ]; then
|
||||
AGENTS_COLOR="${YELLOW}"
|
||||
fi
|
||||
if [ "$AGENTS_ACTIVE" -eq 0 ]; then
|
||||
AGENTS_COLOR="${DIM}"
|
||||
fi
|
||||
|
||||
# Activity indicator
|
||||
ACTIVITY_INDICATOR="${DIM}○${RESET}"
|
||||
if [ "$ACTIVE_PROCESSES" -gt 0 ]; then
|
||||
ACTIVITY_INDICATOR="${BRIGHT_GREEN}◉${RESET}"
|
||||
fi
|
||||
|
||||
# Model name from Claude Code input
|
||||
MODEL_NAME=""
|
||||
if [ "$CLAUDE_INPUT" != "{}" ]; then
|
||||
MODEL_NAME=$(echo "$CLAUDE_INPUT" | jq -r '.model.display_name // ""' 2>/dev/null)
|
||||
fi
|
||||
|
||||
# Memory display
|
||||
MEMORY_DISPLAY="--"
|
||||
NODE_MEM=$(ps aux 2>/dev/null | grep -E "(node|claude)" | grep -v grep | awk '{sum += $6} END {print int(sum/1024)}')
|
||||
if [ -n "$NODE_MEM" ] && [ "$NODE_MEM" -gt 0 ]; then
|
||||
MEMORY_DISPLAY="${NODE_MEM}MB"
|
||||
fi
|
||||
|
||||
# Format values with padding
|
||||
CONTEXT_DISPLAY=$(printf "%3d" "$CONTEXT_PCT")
|
||||
INTEL_DISPLAY=$(printf "%3d" "$INTEL_SCORE")
|
||||
AGENT_DISPLAY=$(printf "%2d" "$AGENTS_ACTIVE")
|
||||
ADR_DISPLAY=$(printf "%3d" "$ADR_COMPLIANCE")
|
||||
DDD_DISPLAY=$(printf "%3d" "$DDD_PROGRESS")
|
||||
|
||||
# Build output
|
||||
OUTPUT=""
|
||||
|
||||
# Header: 7sense + Branch + User
|
||||
OUTPUT="${BOLD}${BRIGHT_CYAN}▊ 7sense${RESET} ${DIM}bioacoustics${RESET}"
|
||||
OUTPUT="${OUTPUT} ${BRIGHT_PURPLE}${GH_USER}${RESET}"
|
||||
if [ -n "$GIT_BRANCH" ]; then
|
||||
OUTPUT="${OUTPUT} ${DIM}│${RESET} ${BRIGHT_BLUE}⎇ ${GIT_BRANCH}${RESET}"
|
||||
fi
|
||||
if [ -n "$MODEL_NAME" ]; then
|
||||
OUTPUT="${OUTPUT} ${DIM}│${RESET} ${PURPLE}${MODEL_NAME}${RESET}"
|
||||
fi
|
||||
|
||||
# Separator
|
||||
OUTPUT="${OUTPUT}\n${DIM}──────────────────────────────────────────────────────────${RESET}"
|
||||
|
||||
# Line 1: DDD Bounded Contexts (6 total)
|
||||
DDD_COLOR="${BRIGHT_GREEN}"
|
||||
[ "$DDD_PROGRESS" -lt 50 ] && DDD_COLOR="${YELLOW}"
|
||||
[ "$DDD_PROGRESS" -eq 0 ] && DDD_COLOR="${RED}"
|
||||
|
||||
OUTPUT="${OUTPUT}\n${BRIGHT_CYAN}🎵 DDD Contexts${RESET} [${CTX_STATUS}] ${DDD_COLOR}${CONTEXTS_COMPLETED}${RESET}/${BRIGHT_WHITE}${CONTEXTS_TOTAL}${RESET}"
|
||||
OUTPUT="${OUTPUT} ${CYAN}ADR${RESET} ${ADR_COLOR}${ADR_DISPLAY}%${RESET} (${ADRS_COMPLIANT}/${ADRS_TOTAL})"
|
||||
|
||||
# Line 2: Swarm + Performance + Security
|
||||
OUTPUT="${OUTPUT}\n${BRIGHT_YELLOW}🐝 Swarm${RESET} ${ACTIVITY_INDICATOR}[${AGENTS_COLOR}${AGENT_DISPLAY}${RESET}/${BRIGHT_WHITE}${AGENTS_TARGET}${RESET}]"
|
||||
OUTPUT="${OUTPUT} ${CYAN}HNSW${RESET} ${BRIGHT_GREEN}${HNSW_SPEEDUP}${RESET}→${BRIGHT_YELLOW}${PERF_TARGET}${RESET}"
|
||||
OUTPUT="${OUTPUT} ${SECURITY_ICON} ${SECURITY_COLOR}${SECURITY_STATUS}${RESET}"
|
||||
OUTPUT="${OUTPUT} ${CONTEXT_COLOR}📂 ${CONTEXT_DISPLAY}%${RESET}"
|
||||
OUTPUT="${OUTPUT} ${INTEL_COLOR}🧠 ${INTEL_DISPLAY}%${RESET}"
|
||||
|
||||
# Line 3: Architecture Components
|
||||
OUTPUT="${OUTPUT}\n${BRIGHT_PURPLE}🔧 Pipeline${RESET} ${DIM}Audio→Mel→Perch→HNSW→GNN→RAB${RESET}"
|
||||
OUTPUT="${OUTPUT} ${CYAN}Mem${RESET} ${BRIGHT_CYAN}${MEMORY_DISPLAY}${RESET}"
|
||||
|
||||
# Footer separator
|
||||
OUTPUT="${OUTPUT}\n${DIM}──────────────────────────────────────────────────────────${RESET}"
|
||||
|
||||
printf "%b\n" "$OUTPUT"
|
||||
Reference in New Issue
Block a user