- Static compiler with STRC pattern (Static Template Resolution with
Compartmentalized Layers)
- Template syntax: { } interpolation, { s-for }, { s-if/s-elif/s-else
}
- File types: .strata, .compiler.sts, .service.sts, .api.sts, .sts,
.scss
- CLI tools: strata dev, strata build, strata g (generators)
- create-strata scaffolding CLI with Pokemon API example
- Dev server with WebSocket HMR (Hot Module Replacement)
- Documentation: README, ARCHITECTURE, CHANGELOG, CONTRIBUTING,
LICENSE
295 lines
8.0 KiB
Bash
Executable File
295 lines
8.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Strata Framework - Doctor Script
|
|
# Diagnoses installation issues and provides fixes
|
|
# Usage: ./scripts/doctor.sh [--fix]
|
|
|
|
set -e
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
BOLD='\033[1m'
|
|
|
|
# Directories
|
|
STRATA_HOME="${STRATA_HOME:-$HOME/.strata}"
|
|
STRATA_BIN="$STRATA_HOME/bin"
|
|
STRATA_CONFIG="$STRATA_HOME/config"
|
|
LOCAL_BIN="/usr/local/bin"
|
|
|
|
# Script directory
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_DIR="$(dirname "$SCRIPT_DIR")"
|
|
|
|
# Options
|
|
AUTO_FIX=false
|
|
|
|
if [ "$1" = "--fix" ] || [ "$1" = "-f" ]; then
|
|
AUTO_FIX=true
|
|
fi
|
|
|
|
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
|
echo "Strata Framework - Doctor"
|
|
echo ""
|
|
echo "Usage: ./scripts/doctor.sh [options]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --fix, -f Automatically fix issues where possible"
|
|
echo " --help Show this help message"
|
|
exit 0
|
|
fi
|
|
|
|
# Counters
|
|
ISSUES=0
|
|
WARNINGS=0
|
|
FIXES=0
|
|
|
|
print_check() {
|
|
echo -e "${BLUE}[CHECK]${NC} $1"
|
|
}
|
|
|
|
print_ok() {
|
|
echo -e "${GREEN} [OK]${NC} $1"
|
|
}
|
|
|
|
print_warn() {
|
|
echo -e "${YELLOW} [WARN]${NC} $1"
|
|
((WARNINGS++))
|
|
}
|
|
|
|
print_fail() {
|
|
echo -e "${RED} [FAIL]${NC} $1"
|
|
((ISSUES++))
|
|
}
|
|
|
|
print_fix() {
|
|
echo -e "${CYAN} [FIX]${NC} $1"
|
|
((FIXES++))
|
|
}
|
|
|
|
print_info() {
|
|
echo -e " $1"
|
|
}
|
|
|
|
echo ""
|
|
echo -e "${CYAN}╔═══════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${CYAN}║ Strata Framework - Doctor ║${NC}"
|
|
echo -e "${CYAN}╚═══════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
|
|
# Check Go installation
|
|
print_check "Go installation"
|
|
if command -v go &> /dev/null; then
|
|
GO_VERSION=$(go version | grep -oE 'go[0-9]+\.[0-9]+' | sed 's/go//')
|
|
GO_MAJOR=$(echo "$GO_VERSION" | cut -d. -f1)
|
|
GO_MINOR=$(echo "$GO_VERSION" | cut -d. -f2)
|
|
if [ "$GO_MAJOR" -ge 1 ] && [ "$GO_MINOR" -ge 21 ]; then
|
|
print_ok "Go $GO_VERSION installed"
|
|
else
|
|
print_warn "Go $GO_VERSION installed (>= 1.21 recommended)"
|
|
fi
|
|
else
|
|
print_fail "Go is not installed"
|
|
print_info "Install from: https://go.dev/dl/"
|
|
fi
|
|
|
|
# Check Node.js installation
|
|
print_check "Node.js installation"
|
|
if command -v node &> /dev/null; then
|
|
NODE_VERSION=$(node -v | sed 's/v//')
|
|
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
|
|
if [ "$NODE_MAJOR" -ge 18 ]; then
|
|
print_ok "Node.js $NODE_VERSION installed"
|
|
else
|
|
print_fail "Node.js $NODE_VERSION installed (>= 18.0 required)"
|
|
print_info "Install from: https://nodejs.org/"
|
|
fi
|
|
else
|
|
print_fail "Node.js is not installed"
|
|
print_info "Install from: https://nodejs.org/"
|
|
fi
|
|
|
|
# Check npm installation
|
|
print_check "npm installation"
|
|
if command -v npm &> /dev/null; then
|
|
NPM_VERSION=$(npm -v)
|
|
print_ok "npm $NPM_VERSION installed"
|
|
else
|
|
print_fail "npm is not installed"
|
|
fi
|
|
|
|
# Check STRATA_HOME directory
|
|
print_check "Strata home directory ($STRATA_HOME)"
|
|
if [ -d "$STRATA_HOME" ]; then
|
|
print_ok "Directory exists"
|
|
else
|
|
print_fail "Directory does not exist"
|
|
if [ "$AUTO_FIX" = true ]; then
|
|
mkdir -p "$STRATA_HOME" "$STRATA_BIN" "$STRATA_CONFIG"
|
|
print_fix "Created $STRATA_HOME"
|
|
else
|
|
print_info "Run with --fix or: mkdir -p $STRATA_HOME"
|
|
fi
|
|
fi
|
|
|
|
# Check strata binary
|
|
print_check "Strata binary"
|
|
if [ -x "$STRATA_BIN/strata" ]; then
|
|
print_ok "Binary exists at $STRATA_BIN/strata"
|
|
# Try to get version
|
|
if STRATA_VERSION=$("$STRATA_BIN/strata" version 2>/dev/null); then
|
|
print_ok "Binary works: $STRATA_VERSION"
|
|
else
|
|
print_warn "Binary exists but may not be functional"
|
|
fi
|
|
elif [ -x "$REPO_DIR/bin/strata" ]; then
|
|
print_warn "Binary only in repo ($REPO_DIR/bin/strata)"
|
|
if [ "$AUTO_FIX" = true ]; then
|
|
mkdir -p "$STRATA_BIN"
|
|
cp "$REPO_DIR/bin/strata" "$STRATA_BIN/strata"
|
|
chmod +x "$STRATA_BIN/strata"
|
|
print_fix "Copied binary to $STRATA_BIN"
|
|
else
|
|
print_info "Run with --fix or: cp $REPO_DIR/bin/strata $STRATA_BIN/"
|
|
fi
|
|
else
|
|
print_fail "Strata binary not found"
|
|
if [ "$AUTO_FIX" = true ]; then
|
|
print_info "Rebuilding compiler..."
|
|
cd "$REPO_DIR/compiler"
|
|
go build -ldflags="-s -w" -o "$REPO_DIR/bin/strata" ./cmd/strata
|
|
mkdir -p "$STRATA_BIN"
|
|
cp "$REPO_DIR/bin/strata" "$STRATA_BIN/strata"
|
|
chmod +x "$STRATA_BIN/strata"
|
|
print_fix "Built and installed binary"
|
|
cd "$REPO_DIR"
|
|
else
|
|
print_info "Run with --fix or: make build"
|
|
fi
|
|
fi
|
|
|
|
# Check PATH
|
|
print_check "PATH configuration"
|
|
if echo "$PATH" | grep -q "$STRATA_BIN"; then
|
|
print_ok "$STRATA_BIN is in PATH"
|
|
elif echo "$PATH" | grep -q "$LOCAL_BIN" && [ -L "$LOCAL_BIN/strata" ]; then
|
|
print_ok "Using global symlink at $LOCAL_BIN/strata"
|
|
else
|
|
print_warn "$STRATA_BIN is not in PATH"
|
|
print_info "Add to your shell config: export PATH=\"\$STRATA_HOME/bin:\$PATH\""
|
|
fi
|
|
|
|
# Check shell configuration
|
|
print_check "Shell configuration"
|
|
SHELL_TYPE=$(basename "$SHELL")
|
|
case "$SHELL_TYPE" in
|
|
zsh)
|
|
SHELL_CONFIG="$HOME/.zshrc"
|
|
;;
|
|
bash)
|
|
if [ -f "$HOME/.bash_profile" ]; then
|
|
SHELL_CONFIG="$HOME/.bash_profile"
|
|
else
|
|
SHELL_CONFIG="$HOME/.bashrc"
|
|
fi
|
|
;;
|
|
*)
|
|
SHELL_CONFIG="$HOME/.profile"
|
|
;;
|
|
esac
|
|
|
|
if [ -f "$SHELL_CONFIG" ] && grep -q "# Strata Framework" "$SHELL_CONFIG"; then
|
|
print_ok "Shell configured in $SHELL_CONFIG"
|
|
else
|
|
print_warn "Shell not configured"
|
|
print_info "Run: ./scripts/install.sh (will configure shell)"
|
|
fi
|
|
|
|
# Check completions
|
|
print_check "Shell completions"
|
|
if [ -f "$STRATA_HOME/completions/strata.bash" ] || [ -f "$STRATA_HOME/completions/_strata" ]; then
|
|
print_ok "Completions installed"
|
|
else
|
|
print_warn "Shell completions not installed"
|
|
print_info "Run: ./scripts/install.sh (will install completions)"
|
|
fi
|
|
|
|
# Check npm dependencies
|
|
print_check "npm dependencies"
|
|
if [ -d "$REPO_DIR/node_modules" ]; then
|
|
print_ok "node_modules exists"
|
|
else
|
|
print_fail "node_modules not found"
|
|
if [ "$AUTO_FIX" = true ]; then
|
|
cd "$REPO_DIR"
|
|
npm install --silent
|
|
print_fix "Installed npm dependencies"
|
|
else
|
|
print_info "Run: npm install"
|
|
fi
|
|
fi
|
|
|
|
# Check Go modules
|
|
print_check "Go modules"
|
|
if [ -f "$REPO_DIR/compiler/go.sum" ]; then
|
|
print_ok "go.sum exists"
|
|
else
|
|
print_warn "go.sum not found (may need go mod download)"
|
|
fi
|
|
|
|
# Check compiler source
|
|
print_check "Compiler source"
|
|
if [ -f "$REPO_DIR/compiler/cmd/strata/main.go" ]; then
|
|
print_ok "Compiler source found"
|
|
else
|
|
print_fail "Compiler source missing"
|
|
print_info "Repository may be incomplete"
|
|
fi
|
|
|
|
# Check runtime source
|
|
print_check "Runtime source"
|
|
if [ -f "$REPO_DIR/runtime/core/strata.sts" ]; then
|
|
print_ok "Runtime source found"
|
|
else
|
|
print_fail "Runtime source missing"
|
|
print_info "Repository may be incomplete"
|
|
fi
|
|
|
|
# Check example app
|
|
print_check "Example application"
|
|
if [ -f "$REPO_DIR/examples/basic-app/strataconfig.ts" ]; then
|
|
print_ok "Example app found"
|
|
else
|
|
print_warn "Example app not found"
|
|
fi
|
|
|
|
# Summary
|
|
echo ""
|
|
echo "════════════════════════════════════════════════════════"
|
|
echo ""
|
|
|
|
if [ $ISSUES -eq 0 ] && [ $WARNINGS -eq 0 ]; then
|
|
echo -e "${GREEN}All checks passed! Strata is healthy.${NC}"
|
|
elif [ $ISSUES -eq 0 ]; then
|
|
echo -e "${YELLOW}Found $WARNINGS warning(s), but no critical issues.${NC}"
|
|
else
|
|
echo -e "${RED}Found $ISSUES issue(s) and $WARNINGS warning(s).${NC}"
|
|
fi
|
|
|
|
if [ $FIXES -gt 0 ]; then
|
|
echo -e "${CYAN}Applied $FIXES automatic fix(es).${NC}"
|
|
fi
|
|
|
|
if [ $ISSUES -gt 0 ] && [ "$AUTO_FIX" = false ]; then
|
|
echo ""
|
|
echo "Run with --fix to attempt automatic repairs:"
|
|
echo -e " ${CYAN}./scripts/doctor.sh --fix${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
exit $ISSUES
|