c118996746
- SwiftUI macOS app with C++17 code analysis engine (ObjC++ bridge) - Agentic AI loop: LLM plans → tool calls → execution → feedback loop - 15 agent tools: file ops, terminal, git, xcode build, code intel - 7 persistent terminal tools with background session management - Chat sidebar with agent step rendering and auto-apply - NVIDIA NIM API integration (Llama 3.3 70B default) - OpenAI tool_calls format with prompt-based fallback - Code editor with syntax highlighting and multi-tab support - File tree, console view, terminal view - Git integration and workspace management
150 lines
5.5 KiB
Bash
Executable File
150 lines
5.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ──────────────────────────────────────────────────────────────────
|
|
# CxIDE — Test Runner
|
|
# Runs the CxSwiftAgent test suite and validates the C++ engine.
|
|
# ──────────────────────────────────────────────────────────────────
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
AGENT_DIR="$ROOT_DIR/CxSwiftAgent"
|
|
BUILD_DIR="$ROOT_DIR/.build"
|
|
|
|
RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[0;33m'; BOLD='\033[1m'; RESET='\033[0m'
|
|
info() { printf "${CYAN}▸${RESET} %s\n" "$*"; }
|
|
ok() { printf "${GREEN}✓${RESET} %s\n" "$*"; }
|
|
warn() { printf "${YELLOW}⚠${RESET} %s\n" "$*"; }
|
|
fail() { printf "${RED}✗${RESET} %s\n" "$*" >&2; exit 1; }
|
|
|
|
PASSED=0
|
|
FAILED=0
|
|
|
|
# ─── C++ Engine Validation ───────────────────────────────────────
|
|
info "Validating C++ CodeEngine compilation..."
|
|
mkdir -p "$BUILD_DIR"
|
|
|
|
if clang++ -std=c++17 -fsyntax-only "$ROOT_DIR/Core/CodeEngine.cpp" -I "$ROOT_DIR/Core" 2>&1; then
|
|
ok "CodeEngine.cpp — syntax valid"
|
|
((PASSED++))
|
|
else
|
|
warn "CodeEngine.cpp — syntax errors detected"
|
|
((FAILED++))
|
|
fi
|
|
|
|
if clang++ -std=c++17 -fobjc-arc -fsyntax-only \
|
|
"$ROOT_DIR/Core/SwiftEngineWrapper.mm" -I "$ROOT_DIR/Core" 2>&1; then
|
|
ok "SwiftEngineWrapper.mm — syntax valid"
|
|
((PASSED++))
|
|
else
|
|
warn "SwiftEngineWrapper.mm — syntax errors detected"
|
|
((FAILED++))
|
|
fi
|
|
|
|
# ─── Header Consistency ──────────────────────────────────────────
|
|
info "Checking header consistency..."
|
|
HPP_FUNCS=$(grep -c 'std::string\|std::vector\|int \|double \|bool \|void ' "$ROOT_DIR/Core/CodeEngine.hpp" 2>/dev/null || echo 0)
|
|
WRAPPER_METHODS=$(grep -c '^\s*-\s*(' "$ROOT_DIR/Core/SwiftEngineWrapper.h" 2>/dev/null || echo 0)
|
|
|
|
if [[ "$HPP_FUNCS" -gt 0 && "$WRAPPER_METHODS" -gt 0 ]]; then
|
|
ok "Headers present — $HPP_FUNCS C++ declarations, $WRAPPER_METHODS ObjC methods"
|
|
((PASSED++))
|
|
else
|
|
warn "Header check inconclusive"
|
|
fi
|
|
|
|
# ─── Swift Source Validation ──────────────────────────────────────
|
|
info "Checking Swift sources for syntax issues..."
|
|
SWIFT_FILES=0
|
|
SWIFT_ERRORS=0
|
|
|
|
while IFS= read -r -d '' f; do
|
|
((SWIFT_FILES++))
|
|
if ! swift -typecheck "$f" 2>/dev/null; then
|
|
# swift -typecheck may fail without full module context, just note it
|
|
: # skip — expected without Xcode build context
|
|
fi
|
|
done < <(find "$ROOT_DIR" -maxdepth 1 -name "*.swift" -print0)
|
|
|
|
while IFS= read -r -d '' f; do
|
|
((SWIFT_FILES++))
|
|
done < <(find "$ROOT_DIR/Core" "$ROOT_DIR/Models" "$ROOT_DIR/Views" "$ROOT_DIR/ViewModels" \
|
|
"$ROOT_DIR/Services" "$ROOT_DIR/Agent" -name "*.swift" -print0 2>/dev/null)
|
|
|
|
ok "Found $SWIFT_FILES Swift source files"
|
|
((PASSED++))
|
|
|
|
# ─── CxSwiftAgent Tests ──────────────────────────────────────────
|
|
if [[ -d "$AGENT_DIR" ]]; then
|
|
info "Running CxSwiftAgent test suite..."
|
|
if (cd "$AGENT_DIR" && swift test 2>&1); then
|
|
ok "CxSwiftAgent tests passed"
|
|
((PASSED++))
|
|
else
|
|
warn "CxSwiftAgent tests failed"
|
|
((FAILED++))
|
|
fi
|
|
else
|
|
warn "CxSwiftAgent directory not found — skipping agent tests"
|
|
fi
|
|
|
|
# ─── Agent Tool Registration Sanity ──────────────────────────────
|
|
info "Checking agent tool modules..."
|
|
TOOL_MODULES=0
|
|
for f in "$ROOT_DIR/Agent/Tools/"*.swift; do
|
|
[[ -f "$f" ]] || continue
|
|
((TOOL_MODULES++))
|
|
BASENAME="$(basename "$f" .swift)"
|
|
if grep -q "static func register" "$f" 2>/dev/null; then
|
|
ok "$BASENAME — register() present"
|
|
else
|
|
warn "$BASENAME — missing register() function"
|
|
((FAILED++))
|
|
fi
|
|
done
|
|
ok "$TOOL_MODULES agent tool modules checked"
|
|
((PASSED++))
|
|
|
|
# ─── File Structure ──────────────────────────────────────────────
|
|
info "Verifying project structure..."
|
|
REQUIRED_FILES=(
|
|
"SwiftIDEApp.swift"
|
|
"EngineFactory.swift"
|
|
"Core/CodeEngine.hpp"
|
|
"Core/CodeEngine.cpp"
|
|
"Core/CodeEngine.swift"
|
|
"Core/SwiftEngineWrapper.h"
|
|
"Core/SwiftEngineWrapper.mm"
|
|
"Models/Models.swift"
|
|
"Services/AgentService.swift"
|
|
"ViewModels/EditorViewModel.swift"
|
|
"Views/IDEContainerView.swift"
|
|
"Views/ConsoleView.swift"
|
|
"Views/CodeEditorView.swift"
|
|
"Views/AgentSidebarView.swift"
|
|
"Agent/MCPServer.swift"
|
|
"Agent/MCPTypes.swift"
|
|
"Agent/AgentConfig.swift"
|
|
"Agent/AgentMemory.swift"
|
|
)
|
|
|
|
for rf in "${REQUIRED_FILES[@]}"; do
|
|
if [[ -f "$ROOT_DIR/$rf" ]]; then
|
|
ok "$rf"
|
|
((PASSED++))
|
|
else
|
|
warn "MISSING: $rf"
|
|
((FAILED++))
|
|
fi
|
|
done
|
|
|
|
# ─── Summary ─────────────────────────────────────────────────────
|
|
echo ""
|
|
printf "${BOLD}Test Summary:${RESET}\n"
|
|
printf " ${GREEN}Passed: $PASSED${RESET}\n"
|
|
if [[ "$FAILED" -gt 0 ]]; then
|
|
printf " ${RED}Failed: $FAILED${RESET}\n"
|
|
exit 1
|
|
else
|
|
printf " ${RED}Failed: 0${RESET}\n"
|
|
ok "All checks passed"
|
|
fi
|