#!/bin/bash set -euo pipefail # 08-setup-service.sh — Generate and load service manager config SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" LOG_FILE="$PROJECT_ROOT/logs/setup.log" mkdir -p "$PROJECT_ROOT/logs" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [setup-service] $*" >> "$LOG_FILE"; } cd "$PROJECT_ROOT" # Parse args PLATFORM="" while [[ $# -gt 0 ]]; do case $1 in --platform) PLATFORM="$2"; shift 2 ;; *) shift ;; esac done # Auto-detect platform if [ -z "$PLATFORM" ]; then case "$(uname -s)" in Darwin*) PLATFORM="macos" ;; Linux*) PLATFORM="linux" ;; *) PLATFORM="unknown" ;; esac fi NODE_PATH=$(which node) PROJECT_PATH="$PROJECT_ROOT" HOME_PATH="$HOME" log "Setting up service: platform=$PLATFORM node=$NODE_PATH project=$PROJECT_PATH" # Build first log "Building TypeScript" if ! npm run build >> "$LOG_FILE" 2>&1; then log "Build failed" cat < "$PLIST_PATH" < Label com.nanoclaw ProgramArguments ${NODE_PATH} ${PROJECT_PATH}/dist/index.js WorkingDirectory ${PROJECT_PATH} RunAtLoad KeepAlive EnvironmentVariables PATH /usr/local/bin:/usr/bin:/bin:${HOME_PATH}/.local/bin HOME ${HOME_PATH} StandardOutPath ${PROJECT_PATH}/logs/nanoclaw.log StandardErrorPath ${PROJECT_PATH}/logs/nanoclaw.error.log PLISTEOF log "Loading launchd service" if launchctl load "$PLIST_PATH" >> "$LOG_FILE" 2>&1; then log "launchctl load succeeded" else log "launchctl load failed (may already be loaded)" fi # Verify SERVICE_LOADED="false" if launchctl list 2>/dev/null | grep -q "com.nanoclaw"; then SERVICE_LOADED="true" log "Service verified as loaded" else log "Service not found in launchctl list" fi cat < "$UNIT_PATH" <> "$LOG_FILE" 2>&1 || true systemctl --user enable nanoclaw >> "$LOG_FILE" 2>&1 || true systemctl --user start nanoclaw >> "$LOG_FILE" 2>&1 || true # Verify SERVICE_LOADED="false" if systemctl --user is-active nanoclaw >/dev/null 2>&1; then SERVICE_LOADED="true" log "Service verified as active" else log "Service not active" fi cat <