- Auto-patch Angular CLI 22.1.6 node-version.js requirement from ^22.22.3 to 22.22.0 across Linux, macOS, and Windows startup scripts - Automatically detect and load nvm in start.sh and install_deps.sh when available - Ensure Showcase UI can be built on Cloudtop and Debian systems running Node 22.22.x without requiring root privileges
205 lines
8.5 KiB
Bash
Executable File
205 lines
8.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright 2026 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
set -euo pipefail
|
|
|
|
BOLD='\033[1m'
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "${SCRIPT_DIR}"
|
|
|
|
echo -e "${BOLD}${CYAN}======================================================${NC}"
|
|
echo -e "${BOLD}${CYAN} β¨ Artemis Autonomous Mobile Agent UI ${NC}"
|
|
echo -e "${BOLD}${CYAN}======================================================${NC}"
|
|
echo ""
|
|
|
|
# 1. Normalize PATH with standard toolchain and package manager paths
|
|
STANDARD_PATHS=(
|
|
"/opt/homebrew/bin"
|
|
"/opt/homebrew/sbin"
|
|
"/usr/local/bin"
|
|
"/usr/local/sbin"
|
|
"${HOME}/.local/bin"
|
|
"${HOME}/.cargo/bin"
|
|
"${HOME}/Library/Android/sdk/platform-tools"
|
|
"${HOME}/Android/Sdk/platform-tools"
|
|
)
|
|
for p in "${STANDARD_PATHS[@]}"; do
|
|
if [ -d "${p}" ] && [[ ":${PATH}:" != *":${p}:"* ]]; then
|
|
export PATH="${p}:${PATH}"
|
|
fi
|
|
done
|
|
|
|
# 2. Check or install uv (Fast Python package manager)
|
|
if ! command -v uv >/dev/null 2>&1; then
|
|
echo -e "${YELLOW}β‘ uv not found. Installing Astral uv...${NC}"
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
export PATH="${HOME}/.local/bin:${HOME}/.cargo/bin:${PATH}"
|
|
fi
|
|
|
|
# 3. Check and auto-install missing system toolchains (ADB, FFmpeg, scrcpy)
|
|
MISSING_CORE=()
|
|
if ! command -v adb >/dev/null 2>&1; then MISSING_CORE+=("adb"); fi
|
|
if ! command -v ffmpeg >/dev/null 2>&1; then MISSING_CORE+=("ffmpeg"); fi
|
|
if ! command -v scrcpy >/dev/null 2>&1; then MISSING_CORE+=("scrcpy"); fi
|
|
|
|
if [ ${#MISSING_CORE[@]} -gt 0 ]; then
|
|
OS_NAME="$(uname -s)"
|
|
if [ "${OS_NAME}" = "Darwin" ]; then
|
|
export HOMEBREW_NO_AUTO_UPDATE=1
|
|
export HOMEBREW_NO_INSTALL_CLEANUP=1
|
|
export HOMEBREW_NO_ENV_HINTS=1
|
|
|
|
if ! command -v brew >/dev/null 2>&1; then
|
|
if [ -x "/opt/homebrew/bin/brew" ]; then
|
|
eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
elif [ -x "/usr/local/bin/brew" ]; then
|
|
eval "$(/usr/local/bin/brew shellenv)"
|
|
fi
|
|
fi
|
|
|
|
if command -v brew >/dev/null 2>&1; then
|
|
echo -e " ${YELLOW}β‘ Auto-installing missing components (${MISSING_CORE[*]})...${NC}"
|
|
if ! command -v adb >/dev/null 2>&1; then
|
|
brew install --cask android-platform-tools >/dev/null 2>&1 || brew install android-platform-tools >/dev/null 2>&1 || true
|
|
fi
|
|
if ! command -v ffmpeg >/dev/null 2>&1; then
|
|
brew install ffmpeg >/dev/null 2>&1 || true
|
|
fi
|
|
if ! command -v scrcpy >/dev/null 2>&1; then
|
|
brew install scrcpy >/dev/null 2>&1 || true
|
|
fi
|
|
fi
|
|
elif [ "${OS_NAME}" = "Linux" ]; then
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
apt-get update -qq && apt-get install -y -qq "${MISSING_CORE[@]}" >/dev/null 2>&1 || true
|
|
elif command -v sudo >/dev/null 2>&1; then
|
|
sudo -n apt-get update -qq && sudo -n apt-get install -y -qq "${MISSING_CORE[@]}" >/dev/null 2>&1 || true
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# 4. Check or initialize .env configuration file
|
|
if [ ! -f ".env" ]; then
|
|
if [ -f ".env.example" ]; then
|
|
cp .env.example .env
|
|
echo -e " ${GREEN}β Initialized .env configuration file.${NC}"
|
|
else
|
|
touch .env
|
|
fi
|
|
fi
|
|
|
|
# 5. Synchronize Python runtime & dependencies
|
|
echo -e " ${BLUE}π¦ Synchronizing Python runtime and project dependencies...${NC}"
|
|
uv sync --quiet
|
|
|
|
# 6. Check and build Showcase UI if not already compiled
|
|
SHOWCASE_INDEX="${SCRIPT_DIR}/apps/showcase_ui/dist/frontend/browser/index.html"
|
|
SHOWCASE_INDEX_ALT1="${SCRIPT_DIR}/apps/showcase_ui/dist/browser/index.html"
|
|
SHOWCASE_INDEX_ALT2="${SCRIPT_DIR}/apps/showcase_ui/dist/index.html"
|
|
if [ ! -f "${SHOWCASE_INDEX}" ] && [ ! -f "${SHOWCASE_INDEX_ALT1}" ] && [ ! -f "${SHOWCASE_INDEX_ALT2}" ]; then
|
|
if ! command -v npm >/dev/null 2>&1; then
|
|
OS_NAME="$(uname -s)"
|
|
echo -e " ${YELLOW}β‘ npm/Node.js not found. Auto-installing Node.js for Showcase UI compilation...${NC}"
|
|
if [ "${OS_NAME}" = "Darwin" ] && command -v brew >/dev/null 2>&1; then
|
|
brew install node >/dev/null 2>&1 || true
|
|
elif [ "${OS_NAME}" = "Linux" ]; then
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
apt-get update -qq && apt-get install -y -qq nodejs npm >/dev/null 2>&1 || true
|
|
elif command -v sudo >/dev/null 2>&1; then
|
|
sudo -n apt-get update -qq && sudo -n apt-get install -y -qq nodejs npm >/dev/null 2>&1 || true
|
|
fi
|
|
elif command -v dnf >/dev/null 2>&1; then
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
dnf install -y nodejs npm >/dev/null 2>&1 || true
|
|
elif command -v sudo >/dev/null 2>&1; then
|
|
sudo -n dnf install -y nodejs npm >/dev/null 2>&1 || true
|
|
fi
|
|
elif command -v pacman >/dev/null 2>&1; then
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
pacman -S --noconfirm nodejs npm >/dev/null 2>&1 || true
|
|
elif command -v sudo >/dev/null 2>&1; then
|
|
sudo -n pacman -S --noconfirm nodejs npm >/dev/null 2>&1 || true
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Try loading nvm if available in user environment
|
|
export NVM_DIR="${HOME}/.nvm"
|
|
if [ -s "${NVM_DIR}/nvm.sh" ]; then
|
|
# shellcheck disable=SC1090,SC1091
|
|
. "${NVM_DIR}/nvm.sh" 2>/dev/null || true
|
|
fi
|
|
|
|
if command -v npm >/dev/null 2>&1; then
|
|
echo -e " ${YELLOW}π¨ Showcase UI build not found. Compiling Angular Showcase UI...${NC}"
|
|
(
|
|
cd "${SCRIPT_DIR}/apps/showcase_ui"
|
|
npm install --silent
|
|
# Auto-patch Angular CLI node version constraint if running on Node 22.22.x (e.g. Cloudtop / Debian)
|
|
CLI_NODE_VERSION="${SCRIPT_DIR}/apps/showcase_ui/node_modules/@angular/cli/src/utilities/node-version.js"
|
|
if [ -f "${CLI_NODE_VERSION}" ]; then
|
|
if [ "$(uname -s)" = "Darwin" ]; then
|
|
sed -i '' 's/22\.22\.3/22.22.0/g' "${CLI_NODE_VERSION}" 2>/dev/null || true
|
|
else
|
|
sed -i 's/22\.22\.3/22.22.0/g' "${CLI_NODE_VERSION}" 2>/dev/null || true
|
|
fi
|
|
fi
|
|
npm run build
|
|
)
|
|
else
|
|
echo -e " ${YELLOW}β Could not auto-install Node.js. Showcase UI will serve fallback build notice.${NC}"
|
|
fi
|
|
fi
|
|
|
|
# 7. Optionally configure MCP for detected AI IDEs
|
|
echo ""
|
|
echo -e " ${CYAN}π Would you like to configure ARTEMIS MCP & testing rules for your AI IDEs?${NC}"
|
|
echo -e " (Supported: Antigravity, Cursor, Claude Code/Desktop, Codex, OpenClaw, Windsurf)"
|
|
if [ -t 0 ]; then
|
|
read -r -p " Install MCP configuration & rules now? [Y/n]: " INSTALL_MCP
|
|
INSTALL_MCP=${INSTALL_MCP:-Y}
|
|
else
|
|
INSTALL_MCP="n"
|
|
fi
|
|
|
|
if [[ "${INSTALL_MCP}" =~ ^[Yy]$ ]]; then
|
|
echo -e " ${CYAN}Installing MCP server configuration & testing rules...${NC}"
|
|
if uv run artemis mcp --install all; then
|
|
echo -e " ${GREEN}β MCP configuration and rules installed successfully.${NC}"
|
|
echo -e " ${CYAN}π‘ Tip: You can update or re-install anytime with: ${BOLD}uv run artemis mcp --install all${NC}"
|
|
else
|
|
echo -e " ${YELLOW}β MCP installation failed. Review the error above and retry with: ${BOLD}uv run artemis mcp --install all${NC}"
|
|
fi
|
|
else
|
|
echo -e " ${YELLOW}βοΈ Skipped. You can install MCP anytime later with: ${BOLD}uv run artemis mcp --install all${NC}"
|
|
fi
|
|
echo ""
|
|
|
|
# 8. Launch unified Showcase UI & auto-open browser
|
|
echo -e " ${GREEN}π Launching Artemis Showcase UI & Admin Console...${NC}"
|
|
# Launch via `python -m artemis` (not the `artemis` console-script shim) so the
|
|
# long-running server never pins .venv/Scripts/artemis[.exe] against reinstalls.
|
|
exec uv run python -m artemis ui --open "$@"
|