本轮实现功能: 1. 多用户隔离:每个用户独立 config.json + graph.db 2. TUI 登录页 + 旧版自动迁移(core/migrate.py) 3. Admin/User 角色体系(core/embedded_db.py) 4. Web 后台管理 API(userinfo + admin CRUD) 5. Web 设置页用户管理区(仅 admin 可见) 6. TUI 侧栏配置区权限同步(非 admin 隐藏 Web 服务设置) 7. Web 服务打包为独立二进制(trulymem-web) 8. 双入口 PyInstaller 构建脚本(TUI + Web) 9. 活动记录器(core/activity_recorder.py) 10. 静态页面模板(登录/设置/首次引导)
106 lines
3.1 KiB
Bash
106 lines
3.1 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
echo "===== Building TrulyMEM for macOS ====="
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
cd "$PROJECT_ROOT"
|
||
echo "Project root: $PROJECT_ROOT"
|
||
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo "Error: python3 not found"; exit 1
|
||
fi
|
||
|
||
VENV_DIR="$PROJECT_ROOT/.venv_build"
|
||
echo "Creating virtual environment: $VENV_DIR"
|
||
python3 -m venv "$VENV_DIR"
|
||
source "$VENV_DIR/bin/activate"
|
||
pip install --upgrade pip
|
||
pip install -r requirements.txt
|
||
|
||
# 生成图标
|
||
if [ -d "pic/TrulyMEM.iconset" ]; then
|
||
iconutil -c icns pic/TrulyMEM.iconset -o pic/TrulyMEM.icns
|
||
echo "ICNS icon generated: pic/TrulyMEM.icns"
|
||
fi
|
||
|
||
echo "Cleaning previous builds..."
|
||
rm -rf build/dist build/__pycache__ 2>/dev/null || true
|
||
|
||
CORE_HIDDEN=(
|
||
--hidden-import core
|
||
--hidden-import core.embedded_db
|
||
--hidden-import core.graph_client
|
||
--hidden-import core.tool_executor
|
||
--hidden-import core.tool_limiter
|
||
--hidden-import core.tools
|
||
--hidden-import core.tools.memory_tools
|
||
--hidden-import core.prompts
|
||
--hidden-import core.prompts.prompt_manager
|
||
--hidden-import core.server
|
||
--hidden-import core.client
|
||
--hidden-import core.migrate
|
||
--hidden-import core.activity_recorder
|
||
)
|
||
|
||
echo "================================"
|
||
echo "1️⃣ Build TUI: TrulyMEM"
|
||
echo "================================"
|
||
python -m PyInstaller trulymem_entry.py \
|
||
--clean --onefile --console --name TrulyMEM \
|
||
--icon "pic/TrulyMEM.icns" \
|
||
--add-data "ui/styles:ui/styles" \
|
||
--add-data "core/prompts/templates:core/prompts/templates" \
|
||
--add-data "static:static" \
|
||
--add-data "templates:templates" \
|
||
--add-data "web_api.py:." \
|
||
--hidden-import textual \
|
||
--hidden-import textual.app \
|
||
--hidden-import textual.widgets \
|
||
--hidden-import textual.css \
|
||
--hidden-import openai \
|
||
--hidden-import openai._client \
|
||
--hidden-import neo4j \
|
||
--hidden-import sqlite3 \
|
||
"${CORE_HIDDEN[@]}" \
|
||
--hidden-import ui \
|
||
--hidden-import ui.app \
|
||
--hidden-import ui.login_screen \
|
||
--hidden-import ui.models \
|
||
--hidden-import ui.models.message \
|
||
--hidden-import ui.models.config \
|
||
--hidden-import ui.models.log_entry \
|
||
--hidden-import ui.widgets \
|
||
--hidden-import ui.handlers \
|
||
--hidden-import ui.services \
|
||
--hidden-import ui.services.config_manager \
|
||
--hidden-import ui.services.config_service \
|
||
--hidden-import web_api \
|
||
--hidden-import flask \
|
||
--hidden-import flask_cors \
|
||
--collect-all textual \
|
||
--noconfirm
|
||
|
||
echo "================================"
|
||
echo "2️⃣ Build Web: trulymem-web"
|
||
echo "================================"
|
||
python -m PyInstaller web_api.py \
|
||
--clean --onefile --console --name trulymem-web \
|
||
--add-data "templates:templates" \
|
||
--add-data "static:static" \
|
||
--hidden-import flask \
|
||
--hidden-import flask_cors \
|
||
"${CORE_HIDDEN[@]}" \
|
||
--noconfirm
|
||
|
||
echo "================================"
|
||
echo "===== Build Complete ====="
|
||
echo "Binary: dist/TrulyMEM"
|
||
echo "Binary: dist/trulymem-web"
|
||
ls -la dist/
|
||
|
||
deactivate
|
||
rm -rf "$VENV_DIR"
|
||
echo "Build finished successfully!"
|