From efc8182aa27fa9595ce9e410ec428c544ba7fc97 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 12 Apr 2026 21:06:59 +0800 Subject: [PATCH] fix: complete build scripts with all required hidden imports - Add all core and ui module hidden imports - Add textual and its submodules - Add openai and neo4j dependencies - Update trulymem.spec with dynamic data collection - Add all platform build scripts (Linux/Windows/macOS) --- build/build_linux.sh | 54 +++++++++++++++++++++++++++++++++------- build/trulymem.spec | 59 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/build/build_linux.sh b/build/build_linux.sh index a596dd0..0b26548 100644 --- a/build/build_linux.sh +++ b/build/build_linux.sh @@ -1,22 +1,58 @@ #!/bin/bash set -e -echo "Building Linux binary..." +echo "===== Building TrulyMEM for Linux =====" -if ! command -v python3 &> /dev/null; then - echo "Error: python3 not found" - exit 1 -fi +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_ROOT" -pip3 install -r requirements.txt +echo "Project root: $PROJECT_ROOT" -python3 -m PyInstaller --clean --onefile --console \ +echo "Installing dependencies..." +pip3 install -r requirements.txt 2>/dev/null || pip install -r requirements.txt + +echo "Cleaning previous builds..." +rm -rf build/dist build/__pycache__ 2>/dev/null || true + +echo "Running PyInstaller..." +python3 -m PyInstaller trulymem_entry.py \ + --clean \ + --onefile \ + --console \ + --name TrulyMEM \ --add-data "ui/styles:ui/styles" \ --add-data "core/prompts/templates:core/prompts/templates" \ --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 \ + --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 ui \ + --hidden-import ui.app \ + --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 \ --collect-all textual \ - trulymem_entry.py + --noconfirm -echo "Done! Binary: dist/TrulyMEM" \ No newline at end of file +echo "===== Build Complete =====" +echo "Binary: dist/TrulyMEM" +ls -la dist/ \ No newline at end of file diff --git a/build/trulymem.spec b/build/trulymem.spec index c1a38cd..810ca53 100644 --- a/build/trulymem.spec +++ b/build/trulymem.spec @@ -1,17 +1,66 @@ # -*- mode: python ; coding: utf-8 -*- +import os +import sys + +block_cipher = None + +project_root = os.path.dirname(os.path.abspath(SPEC)) +sys.path.insert(0, project_root) + +datas = [] +if os.path.exists(os.path.join(project_root, 'ui', 'styles')): + for root, dirs, files in os.walk(os.path.join(project_root, 'ui', 'styles')): + for f in files: + src = os.path.join(root, f) + dst = os.path.join('ui', 'styles', os.path.relpath(src, os.path.join(project_root, 'ui', 'styles'))) + datas.append((src, dst)) + +if os.path.exists(os.path.join(project_root, 'core', 'prompts', 'templates')): + for root, dirs, files in os.walk(os.path.join(project_root, 'core', 'prompts', 'templates')): + for f in files: + src = os.path.join(root, f) + dst = os.path.join('core', 'prompts', 'templates', os.path.relpath(src, os.path.join(project_root, 'core', 'prompts', 'templates'))) + datas.append((src, dst)) + a = Analysis( ['trulymem_entry.py'], pathex=[], binaries=[], - datas=[ - ('ui/styles', 'ui/styles'), - ('core/prompts/templates', 'core/prompts/templates'), - ], + datas=datas, hiddenimports=[ 'textual', + 'textual.app', + 'textual.widgets', + 'textual.css', 'openai', + 'openai._client', 'neo4j', 'sqlite3', + 'graph_memory_tui', + 'core', + 'core.embedded_db', + 'core.graph_client', + 'core.tool_executor', + 'core.tool_limiter', + 'core.tools', + 'core.tools.memory_tools', + 'core.prompts', + 'core.prompts.prompt_manager', + 'ui', + 'ui.app', + 'ui.models', + 'ui.models.message', + 'ui.models.config', + 'ui.models.log_entry', + 'ui.widgets', + 'ui.widgets.left_panel', + 'ui.widgets.right_panel', + 'ui.widgets.input_box', + 'ui.widgets.message_history', + 'ui.widgets.status_bar', + 'ui.handlers', + 'ui.services', + 'ui.services.config_manager', ], hookspath=[], hooksconfig={}, @@ -20,7 +69,7 @@ a = Analysis( noarchive=False, optimize=0, ) -pyz = PYZ(a.pure) +pyz = PYZ(a.pure, block_cipher) exe = EXE( pyz, a.scripts,