#!/usr/bin/env bash set -euo pipefail SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TARGET_DIR="${MOSAIC_HOME:-$HOME/.config/mosaic}" # Colors (disabled if not a terminal) if [[ -t 1 ]]; then GREEN='\033[0;32m' YELLOW='\033[0;33m' RED='\033[0;31m' CYAN='\033[0;36m' BOLD='\033[1m' RESET='\033[0m' else GREEN='' YELLOW='' RED='' CYAN='' BOLD='' RESET='' fi ok() { echo -e " ${GREEN}✓${RESET} $1"; } warn() { echo -e " ${YELLOW}⚠${RESET} $1" >&2; } fail() { echo -e " ${RED}✗${RESET} $1" >&2; } step() { echo -e "\n${BOLD}$1${RESET}"; } step "Installing Mosaic framework" mkdir -p "$TARGET_DIR" if command -v rsync >/dev/null 2>&1; then rsync -a --delete "$SOURCE_DIR/" "$TARGET_DIR/" else rm -rf "$TARGET_DIR"/* cp -R "$SOURCE_DIR"/* "$TARGET_DIR"/ fi chmod +x "$TARGET_DIR"/bin/* chmod +x "$TARGET_DIR"/install.sh ok "Framework installed to $TARGET_DIR" step "Post-install tasks" if "$TARGET_DIR/bin/mosaic-link-runtime-assets" >/dev/null 2>&1; then ok "Runtime assets linked" else warn "Runtime asset linking failed (non-fatal)" fi if [[ "${MOSAIC_SKIP_SKILLS_SYNC:-0}" == "1" ]]; then ok "Skills sync skipped (MOSAIC_SKIP_SKILLS_SYNC=1)" else if "$TARGET_DIR/bin/mosaic-sync-skills" >/dev/null 2>&1; then ok "Skills synced" else warn "Skills sync failed (non-fatal)" fi fi if "$TARGET_DIR/bin/mosaic-migrate-local-skills" --apply >/dev/null 2>&1; then ok "Local skills migrated" else warn "Local skill migration failed (non-fatal)" fi if "$TARGET_DIR/bin/mosaic-doctor" >/dev/null 2>&1; then ok "Health audit passed" else warn "Health audit reported issues — run 'mosaic doctor' for details" fi step "PATH configuration" PATH_LINE="export PATH=\"$TARGET_DIR/bin:\$PATH\"" # Find the right shell profile if [[ -n "${ZSH_VERSION:-}" ]] || [[ "$(basename "${SHELL:-}")" == "zsh" ]]; then SHELL_PROFILE="$HOME/.zshrc" elif [[ -f "$HOME/.bashrc" ]]; then SHELL_PROFILE="$HOME/.bashrc" elif [[ -f "$HOME/.profile" ]]; then SHELL_PROFILE="$HOME/.profile" else SHELL_PROFILE="$HOME/.profile" fi PATH_CHANGED=false if grep -qF "$TARGET_DIR/bin" "$SHELL_PROFILE" 2>/dev/null; then ok "Already in PATH via $SHELL_PROFILE" else { echo "" echo "# Mosaic agent framework" echo "$PATH_LINE" } >> "$SHELL_PROFILE" ok "Added to PATH in $SHELL_PROFILE" PATH_CHANGED=true fi # ── Summary ────────────────────────────────────────────────── echo "" echo -e "${GREEN}${BOLD} Mosaic installed successfully.${RESET}" echo "" # Collect next steps NEXT_STEPS=() if [[ "$PATH_CHANGED" == "true" ]]; then NEXT_STEPS+=("Run ${CYAN}source $SHELL_PROFILE${RESET} or log out and back in to activate PATH.") fi if [[ ! -f "$TARGET_DIR/SOUL.md" ]]; then NEXT_STEPS+=("Run ${CYAN}mosaic init${RESET} to set up your agent identity (SOUL.md).") fi if [[ ${#NEXT_STEPS[@]} -gt 0 ]]; then echo -e " ${BOLD}Next steps:${RESET}" for i in "${!NEXT_STEPS[@]}"; do echo -e " $((i+1)). ${NEXT_STEPS[$i]}" done echo "" fi