Spaces:
Running
Running
Download shadow_brain_core/build_agent_macos.command from taemin1980/shadowbrain: direct link, hf CLI and curl.
- Browser
- Download file 6.57 kB
-
https://huggingface.co/spaces/taemin1980/shadowbrain/resolve/main/shadow_brain_core/build_agent_macos.command
- Command line
-
hf download hf://spaces/taemin1980/shadowbrain/shadow_brain_core/build_agent_macos.command
-
curl -L -o build_agent_macos.command https://huggingface.co/spaces/taemin1980/shadowbrain/resolve/main/shadow_brain_core/build_agent_macos.command
6.57 kB
| # ============================================================ | |
| # ๐ฑ [Taemini CLI] macOS Local Agent Build (PyInstaller) | |
| # ============================================================ | |
| # build_agent.bat ์ macOS ๋์ํ. venv Python์ผ๋ก PyInstaller --windowed | |
| # ์คํํด dist/TaeminiCLI.app ์ ๋ง๋ ๋ค. ์ฝ๋์๋ช /๊ณต์ฆ/dmg๋ ์์ | |
| # BUILD_TAEMINI_CLI_MACOS.command ๊ฐ ๋ด๋นํ๋ค(์ด ์คํฌ๋ฆฝํธ๋ ์์ ๋น๋๋ง). | |
| # ============================================================ | |
| set -uo pipefail | |
| ROOT="$(cd "$(dirname "$0")" && pwd)" | |
| cd "$ROOT" | |
| echo "[Taemini CLI] Starting Local Agent Build (macOS)..." | |
| # venv Python ๊ฒฝ๋ก: ์ธ๋ถ(BUILD_TAEMINI_CLI_MACOS.command)์์ ์ฃผ์ ๋๊ฑฐ๋ ์๋ ํ์ | |
| if [ -z "${SHADOW_VENV_PYTHON:-}" ]; then | |
| if [ -x "$ROOT/venv/bin/python3" ]; then | |
| SHADOW_VENV_PYTHON="$ROOT/venv/bin/python3" | |
| else | |
| SHADOW_VENV_PYTHON="python3" | |
| fi | |
| fi | |
| echo "[*] Using Python: $SHADOW_VENV_PYTHON" | |
| # 0. Kill existing TaeminiCLI process to prevent file lock | |
| echo "[Step 0] Stopping existing TaeminiCLI process..." | |
| pkill -f "dist/TaeminiCLI.app/Contents/MacOS/TaeminiCLI" 2>/dev/null || true | |
| sleep 1 | |
| # 1. Check and install dependencies | |
| echo "[Step 1] Installing dependencies..." | |
| "$SHADOW_VENV_PYTHON" -m pip install --upgrade pip | |
| "$SHADOW_VENV_PYTHON" -m pip install pyinstaller | |
| "$SHADOW_VENV_PYTHON" -m pip install -r requirements.txt | |
| # 2. Clean previous builds | |
| echo "[Step 2] Cleaning previous builds..." | |
| rm -rf build dist TaeminiCLI.spec taemini.spec | |
| # 3. Package with PyInstaller (macOS: --windowed โ .app ๋ฒ๋ค, GUI/์ฝ์ ์์) | |
| echo "" | |
| echo "[Step 3] Packaging into .app bundle..." | |
| "$SHADOW_VENV_PYTHON" -m PyInstaller --name "TaeminiCLI" --windowed -y \ | |
| --icon "resources/app_icon.icns" \ | |
| --osx-bundle-identifier com.taemingames.shadowbrain \ | |
| --add-data "config:config" \ | |
| --hidden-import=flask --hidden-import=flask_cors --hidden-import=flask_sock \ | |
| --hidden-import=requests --hidden-import=dotenv --hidden-import=psycopg2 \ | |
| --hidden-import=google.genai --hidden-import=tkinter --hidden-import=mcp \ | |
| --hidden-import=yaml --hidden-import=PIL --hidden-import=psutil \ | |
| --hidden-import=pyautogui --hidden-import=pyperclip --hidden-import=boto3 \ | |
| --hidden-import=soundfile --hidden-import=cffi --hidden-import=discord \ | |
| --hidden-import=sqlite3 --hidden-import=_sqlite3 --hidden-import=obsidian_index \ | |
| --hidden-import=rumps \ | |
| --collect-submodules=keyring.backends --hidden-import=jwt --hidden-import=cryptography \ | |
| --add-data "packs:packs" --hidden-import=addon_packs --hidden-import=mlx_engine_fetch \ | |
| `# ๐งฉ ์ถ๊ฐ ํฉ โ ๋ฐฐํฌํ์ ๋ฃ์ง ์๊ณ ์ฒ์ ์ธ ๋ ๋ฐ๋๋ค(addon_packs.py ยท packs/*.lock, 2026-10-13)` \ | |
| `# ๋ณด์ปฌ ๋ถ๋ฆฌ(Demucs): torchยทsympyยทmpmathยทdemucsยทjuliusยทeinopsยทlameenc (์ฝ 0.5GB)` \ | |
| --exclude-module torch --exclude-module torchaudio --exclude-module torchvision \ | |
| --exclude-module demucs --exclude-module julius --exclude-module einops --exclude-module lameenc \ | |
| --exclude-module sympy --exclude-module mpmath \ | |
| --paths ../jarvis_django --paths ../scripts/tools local_launcher.py | |
| echo "" | |
| echo "[COMPLETE] Please check the dist/TaeminiCLI.app bundle." | |
| # 3.1. Dock/Finder ํ์ ์ด๋ฆ์ "Taemini CLI"(๊ณต๋ฐฑ)๋ก ์ง์ . | |
| # ๋ฒ๋ค/๋ฐ์ด๋๋ฆฌ๋ TaeminiCLI(๊ณต๋ฐฑ ์์)์ง๋ง, ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ์ด๋ฆ์ | |
| # CFBundleDisplayName ์ผ๋ก "Taemini CLI"๋ฅผ ๋ ธ์ถํ๋ค. | |
| if [ -d "dist/TaeminiCLI.app" ]; then | |
| /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName Taemini CLI" \ | |
| "dist/TaeminiCLI.app/Contents/Info.plist" 2>/dev/null \ | |
| || /usr/libexec/PlistBuddy -c "Add :CFBundleDisplayName string Taemini CLI" \ | |
| "dist/TaeminiCLI.app/Contents/Info.plist" | |
| echo "[+] CFBundleDisplayName set to 'Taemini CLI'." | |
| fi | |
| # 3.5. taemini CLI ๋จ์ผ ์คํํ์ผ ๋น๋ โ .app ์์ ๋๋ด | |
| # Contents/MacOS/ ์ ๋๋ ์ด์ : --deep ์ฝ๋์๋ช ์ด '์ค์ฒฉ ์ฝ๋'๋ก ์ธ์ํด ํจ๊ป | |
| # ์๋ช ยท๊ณต์ฆ๋๋ ์์น๋ค (Resources์ ๋๋ฉด ์๋ช ์ ๋ Mach-O๋ก ๊ณต์ฆ ๊ฑฐ๋ถ๋จ). | |
| # PATH ๋ฑ๋ก์ ์ฑ์ด ๋ถํ ์ ์ค์ค๋ก ํ๋ค (local_launcher._ensure_taemini_cli_on_path). | |
| echo "" | |
| echo "[Step 3.5] Building taemini CLI (onefile console)..." | |
| "$SHADOW_VENV_PYTHON" -m PyInstaller --name "taemini" --onefile -y \ | |
| --hidden-import=prompt_toolkit taemini_cli.py | |
| if [ -f "dist/taemini" ] && [ -d "dist/TaeminiCLI.app" ]; then | |
| cp "dist/taemini" "dist/TaeminiCLI.app/Contents/MacOS/taemini" | |
| chmod +x "dist/TaeminiCLI.app/Contents/MacOS/taemini" | |
| echo "[+] taemini CLI bundled into TaeminiCLI.app/Contents/MacOS/" | |
| else | |
| echo "[!] taemini CLI build failed - app will ship without the CLI." | |
| fi | |
| # 4. Copy config files to dist (mcp_servers.json, Supertonic ์์ค vendoring) | |
| # ๐ฑ local_settings.json์ dist์ ๋ง๋ค์ง ์๋๋ค. ์ฑ์ด ~/Library/Application Support ์์ | |
| # ์ฝ๊ณ ์ต์ด ์คํ ์ ์๋ ์์ฑํ๋ฏ๋ก, ์ ์ฝํ๋ ์ฌ๋ณธ์ ํผ๋๋ง ์ค๋ค. | |
| echo "[Step 4] Copying config files to dist..." | |
| RESOURCES_DIR="dist/TaeminiCLI.app/Contents/Resources" | |
| if [ -d "dist/TaeminiCLI.app" ]; then | |
| if [ -f "mcp_servers.json" ]; then | |
| cp "mcp_servers.json" "$RESOURCES_DIR/mcp_servers.json" | |
| echo "[+] mcp_servers.json copied." | |
| fi | |
| if [ -d "config" ]; then | |
| mkdir -p "$RESOURCES_DIR/config" | |
| cp -R config/* "$RESOURCES_DIR/config/" | |
| echo "[+] config directory copied." | |
| fi | |
| # [Supertonic] vendoring๋ ์์ค๋ฅผ ์ฑ ๋ฆฌ์์ค ์์ผ๋ก ๋ณต์ฌ | |
| # ๋ชจ๋ธ ๊ฐ์ค์น(ONNX)๋ ์ต์ด ์คํ ์ HF์์ ์๋ ๋ค์ด๋ก๋๋จ | |
| if [ -d "../vendor/supertonic" ]; then | |
| mkdir -p "$RESOURCES_DIR/vendor" | |
| cp -R "../vendor/supertonic" "$RESOURCES_DIR/vendor/supertonic" | |
| echo "[+] Supertonic source vendored into dist (Resources/vendor/supertonic)" | |
| else | |
| echo "[!] vendor/supertonic not found - Supertonic engine will be unavailable in this build." | |
| fi | |
| # 4.5. [MLX Serve] ๐ Apple Silicon ๋ค์ดํฐ๋ธ ์๋น ๋ฐํ์ ๋ฒ๋ค๋ง (Zero-Setup Metal ๊ฐ์) | |
| echo "" | |
| echo "[Step 4.5] Bundling MLX Serve native runtime into TaeminiCLI.app..." | |
| # ๋ฐฐํฌํ์๋ ๋ฃ์ง ์๋๋ค โ ์ฑ์ด ์ฒ์ ์ธ ๋ ๊ณต์ GitHub ๋ฆด๋ฆฌ์ค์์ ๋ฐ๋๋ค(shadow_brain_core/mlx_engine_fetch.py). | |
| # ์์ ์ ์ฌ๊ธฐ์ ์์ง๊ณผ ๊ฐ์ 174MB metallib ๋ฅผ ๋ค์ฏ ๊ตฐ๋ฐ ๋ณต์ฌํด ์ฑ์ด 870MB ๋ถํ์๋ค(2026-10-13 ์ธก์ ). | |
| echo "[=] MLX Serve: ๋ฒ๋ค ์ ํจ โ ์ฒ์ ์ธ ๋ github.com/ddalcu/mlx-serve ์์ ๋ฐ๋๋ค(์ฝ 79MB)" | |
| fi | |
| if [ "${1:-}" = "--no-pause" ]; then | |
| exit 0 | |
| fi | |
| read -r "?Press Enter to continue..." | |