#!/bin/bash # Momentry Studio v0.1.0 - Release Build Script # Purpose: Build production release package # Usage: ./build_release.sh set -e # Exit on error echo "================================================================================" echo " Momentry Studio v0.1.0 - Release Build" echo "================================================================================" echo "" # Configuration VERSION="0.1.0" PROJECT_NAME="momentry-studio" BUILD_DIR="release-build" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Functions log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Check prerequisites check_prerequisites() { log_info "Checking prerequisites..." # Check Node.js if ! command -v node &> /dev/null; then log_error "Node.js not installed. Please install Node.js 18+" exit 1 fi log_info "Node.js: $(node --version)" # Check npm if ! command -v npm &> /dev/null; then log_error "npm not installed" exit 1 fi log_info "npm: $(npm --version)" # Check Rust if ! command -v rustc &> /dev/null; then log_error "Rust not installed. Please install Rust 1.70+" exit 1 fi log_info "Rust: $(rustc --version)" # Check Cargo if ! command -v cargo &> /dev/null; then log_error "Cargo not installed" exit 1 fi log_info "Cargo: $(cargo --version)" log_info "Prerequisites OK ✓" echo "" } # Clean previous builds clean_build() { log_info "Cleaning previous builds..." rm -rf dist rm -rf src-tauri/target/release rm -rf $BUILD_DIR log_info "Clean completed ✓" echo "" } # Install dependencies install_deps() { log_info "Installing dependencies..." npm install log_info "Dependencies installed ✓" echo "" } # Build frontend build_frontend() { log_info "Building frontend..." npm run build if [ ! -d "dist" ]; then log_error "Frontend build failed - dist/ not found" exit 1 fi log_info "Frontend built ✓" log_info "Output: dist/" ls -lh dist/ echo "" } # Build Rust proxy build_proxy() { log_info "Building Rust proxy..." cd src-tauri cargo build --release cd .. if [ ! -f "src-tauri/target/release/momentry-proxy" ]; then log_error "Proxy build failed - binary not found" exit 1 fi log_info "Proxy built ✓" log_info "Binary: src-tauri/target/release/momentry-proxy" ls -lh src-tauri/target/release/momentry-proxy echo "" } # Build Tauri desktop app (optional) build_desktop() { log_warn "Build Tauri desktop app? (y/n)" read -t 10 -n 1 answer if [[ $answer == "y" || $answer == "Y" ]]; then log_info "Building Tauri desktop app..." cargo tauri build if [ -d "src-tauri/target/release/bundle" ]; then log_info "Desktop app built ✓" log_info "Output: src-tauri/target/release/bundle/" ls -lh src-tauri/target/release/bundle/dmg/ 2>/dev/null || true else log_warn "Desktop app build may have failed" fi else log_info "Skipping desktop app build" fi echo "" } # Create release package create_package() { log_info "Creating release package..." mkdir -p $BUILD_DIR # Package structure PACKAGE_NAME="${PROJECT_NAME}-v${VERSION}-${TIMESTAMP}" PACKAGE_DIR="${BUILD_DIR}/${PACKAGE_NAME}" mkdir -p $PACKAGE_DIR # Copy files log_info "Copying files..." # Frontend cp -r dist $PACKAGE_DIR/ # Proxy binary mkdir -p $PACKAGE_DIR/bin cp src-tauri/target/release/momentry-proxy $PACKAGE_DIR/bin/ # Configuration files cp .env $PACKAGE_DIR/ 2>/dev/null || log_warn "No .env file found" cp package.json $PACKAGE_DIR/ cp package-lock.json $PACKAGE_DIR/ 2>/dev/null || true # Documentation cp README.md $PACKAGE_DIR/ cp CHANGELOG.md $PACKAGE_DIR/ cp RELEASE_v0.1.0_INSTALLATION_GUIDE.md $PACKAGE_DIR/INSTALLATION_GUIDE.md cp AGENTS.md $PACKAGE_DIR/ # Directories mkdir -p $PACKAGE_DIR/data/users mkdir -p $PACKAGE_DIR/logs # Create startup script cat > $PACKAGE_DIR/start.sh << 'EOF' #!/bin/bash # Momentry Studio v0.1.0 - Startup Script export MOMENTRY_API_KEY=muser_68600856036340bcafc01930eb4bd839_1774418104_97221b69 export MOMENTRY_DATA_DIR=$(pwd)/data/users ./bin/momentry-proxy > logs/proxy.log 2>&1 & echo "Momentry Studio started on http://localhost:8888" echo "Health check: curl http://localhost:8888/health" EOF chmod +x $PACKAGE_DIR/start.sh # Create stop script cat > $PACKAGE_DIR/stop.sh << 'EOF' #!/bin/bash pkill -f momentry-proxy echo "Momentry Studio stopped" EOF chmod +x $PACKAGE_DIR/stop.sh # Create tar.gz log_info "Creating tar.gz archive..." cd $BUILD_DIR tar -czf ${PACKAGE_NAME}.tar.gz ${PACKAGE_NAME} cd .. # Calculate checksum log_info "Calculating checksum..." shasum -a 256 ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz > ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz.sha256 log_info "Package created ✓" log_info "Location: ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz" log_info "Size: $(du -h ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz | cut -f1)" log_info "Checksum: ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz.sha256" echo "" } # Verify package verify_package() { log_info "Verifying package..." PACKAGE_NAME="${PROJECT_NAME}-v${VERSION}-${TIMESTAMP}" # Check tar.gz if [ ! -f "${BUILD_DIR}/${PACKAGE_NAME}.tar.gz" ]; then log_error "Package not found: ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz" exit 1 fi # Verify checksum log_info "Verifying checksum..." cd ${BUILD_DIR} shasum -a 256 -c ${PACKAGE_NAME}.tar.gz.sha256 cd .. # List package contents log_info "Package contents:" tar -tzf ${BUILD_DIR}/${PACKAGE_NAME}.tar.gz | head -20 log_info "Verification completed ✓" echo "" } # Generate release notes generate_notes() { log_info "Generating release notes..." cat > ${BUILD_DIR}/RELEASE_NOTES.md << EOF # Momentry Studio v${VERSION} Release Notes **Release Date**: $(date +"%Y-%m-%d") **Build**: ${TIMESTAMP} ## Package Contents - \`dist/\` - Compiled frontend (Vue 3) - \`bin/momentry-proxy\` - Rust proxy binary - \`data/users/\` - SQLite database directory - \`logs/\` - Log files directory - \`start.sh\` - Startup script - \`stop.sh\` - Stop script - \`README.md\` - Project overview - \`CHANGELOG.md\` - Version history - \`INSTALLATION_GUIDE.md\` - Installation instructions - \`AGENTS.md\` - Developer guide ## Installation 1. Extract the archive 2. Configure \`.env\` file 3. Run \`./start.sh\` 4. Access: http://localhost:8888 ## Prerequisites - Node.js 18+ - Rust 1.70+ - PostgreSQL 14+ - Qdrant 1.6+ - Momentry Core API (port 3002) - MarkBase API (port 11438) ## Verification \`\`\`bash # Start ./start.sh # Check health curl http://localhost:8888/health # Stop ./stop.sh \`\`\` ## Features - ✅ Search pagination with "Load More" button - ✅ 118 files display in Library - ✅ Scene VLM status visualization - ✅ Advanced Mode toggle - ✅ All search modes supported ## Known Issues - Visual Search API does not support \`offset\` parameter - Agent Search fallback to Semantic Search - WebSocket not implemented (using polling) ## Support - Issues: https://github.com/anomalyco/momentry_studio/issues - Internal: http://localhost:3000/admin/momentry_studio EOF log_info "Release notes generated: ${BUILD_DIR}/RELEASE_NOTES.md" echo "" } # Main main() { check_prerequisites clean_build install_deps build_frontend build_proxy build_desktop create_package verify_package generate_notes echo "================================================================================" echo " ✅ Build Completed" echo "================================================================================" echo "" echo "Package: ${BUILD_DIR}/${PROJECT_NAME}-v${VERSION}-${TIMESTAMP}.tar.gz" echo "Size: $(du -h ${BUILD_DIR}/${PROJECT_NAME}-v${VERSION}-${TIMESTAMP}.tar.gz | cut -f1)" echo "Checksum: ${BUILD_DIR}/${PROJECT_NAME}-v${VERSION}-${TIMESTAMP}.tar.gz.sha256" echo "" echo "Next steps:" echo "1. Verify prerequisites on target server" echo "2. Copy package to target server" echo "3. Extract and configure" echo "4. Run ./start.sh" echo "5. Verify health check" echo "" } # Run main main