Sync from development - prepare for v0.3.0

This commit is contained in:
Omni
2026-02-07 18:26:54 +00:00
parent b55e1cf768
commit 12294d3186
169 changed files with 31749 additions and 33649 deletions

View File

@@ -0,0 +1,106 @@
"""
Install Wabbajack Application Command
Provides CLI interface for automated Wabbajack installation
Uses backend service for complete workflow orchestration
"""
import logging
from pathlib import Path
from jackify.backend.services.wabbajack_installer_service import WabbajackInstallerService
from jackify.shared.colors import COLOR_PROMPT, COLOR_RESET, COLOR_INFO, COLOR_SUCCESS, COLOR_ERROR
class InstallWabbajackCommand:
"""CLI command for installing Wabbajack application"""
def __init__(self):
self.logger = logging.getLogger(__name__)
def run(self):
"""Execute Wabbajack installation workflow using backend service"""
print(f"\n{COLOR_INFO}=== Install Wabbajack Application ==={COLOR_RESET}\n")
print("This will download and configure Wabbajack.exe via Proton.")
print("Wabbajack will be added to your Steam library as a non-Steam game.\n")
# Prompt for installation directory
default_dir = str(Path.home() / "Games" / "Wabbajack")
install_dir_input = input(
f"{COLOR_PROMPT}Installation directory [{default_dir}]: {COLOR_RESET}"
).strip()
install_dir = Path(install_dir_input) if install_dir_input else Path(default_dir)
# Prompt for shortcut name
shortcut_name = "Wabbajack"
shortcut_input = input(
f"{COLOR_PROMPT}Shortcut name [{shortcut_name}]: {COLOR_RESET}"
).strip()
if shortcut_input:
shortcut_name = shortcut_input
# Confirm installation with Steam restart warning
print(f"\n{COLOR_INFO}Installation directory: {install_dir}{COLOR_RESET}")
print(f"{COLOR_INFO}Shortcut name: {shortcut_name}{COLOR_RESET}")
print(f"\n{COLOR_PROMPT}{'='*60}{COLOR_RESET}")
print(f"{COLOR_PROMPT}Important: Steam will be restarted during installation.{COLOR_RESET}")
print(f"{COLOR_PROMPT}Please do not manually start or close Steam until installation is complete.{COLOR_RESET}")
print(f"{COLOR_PROMPT}{'='*60}{COLOR_RESET}")
confirm = input(f"\n{COLOR_PROMPT}Proceed with installation? (Y/n): {COLOR_RESET}").strip().lower()
if confirm == 'n':
print("Installation cancelled.")
return
# Execute installation using backend service
print(f"\n{COLOR_INFO}Starting Wabbajack installation...{COLOR_RESET}\n")
service = WabbajackInstallerService()
def progress_callback(message: str, percentage: int):
step_num = int((percentage / 100) * 12) if percentage < 100 else 12
print(f"{COLOR_INFO}[{step_num}/12] {message}{COLOR_RESET}")
def log_callback(message: str):
if "ERROR" in message or "WARNING" in message or "Failed" in message:
print(f"{COLOR_ERROR}{message}{COLOR_RESET}")
elif "successfully" in message.lower() or "created" in message.lower() or "installed" in message.lower():
print(f"{COLOR_SUCCESS}{message}{COLOR_RESET}")
else:
print(f"{COLOR_INFO}{message}{COLOR_RESET}")
success, app_id, launch_options, gog_count, time_taken, error_msg = service.install_wabbajack(
install_folder=install_dir,
shortcut_name=shortcut_name,
enable_gog=True,
progress_callback=progress_callback,
log_callback=log_callback
)
if success:
print(f"\n{COLOR_SUCCESS}{'='*60}{COLOR_RESET}")
print(f"{COLOR_SUCCESS}Wabbajack installation complete!{COLOR_RESET}")
print(f"{COLOR_SUCCESS}{'='*60}{COLOR_RESET}\n")
print(f"{COLOR_INFO}Installation directory: {install_dir}{COLOR_RESET}")
print(f"{COLOR_INFO}Steam AppID: {app_id}{COLOR_RESET}")
if time_taken:
print(f"{COLOR_INFO}Time taken: {time_taken}{COLOR_RESET}")
# Show launch options note (matches GUI)
if launch_options and "STEAM_COMPAT_MOUNTS" in launch_options:
print(f"\n{COLOR_INFO}Note: To access other drives, add paths to launch options (Steam → Properties).{COLOR_RESET}")
print(f"{COLOR_INFO}Append with colons: STEAM_COMPAT_MOUNTS=\"/existing:/new/path\" %command%{COLOR_RESET}")
elif not launch_options:
print(f"\n{COLOR_INFO}Note: To access other drives, add to launch options (Steam → Properties):{COLOR_RESET}")
print(f"{COLOR_INFO}STEAM_COMPAT_MOUNTS=\"/path/to/directory\" %command%{COLOR_RESET}")
print(f"\n{COLOR_INFO}Next steps:{COLOR_RESET}")
print(f" 1. Find '{shortcut_name}' in your Steam library")
print(f" 2. Launch Wabbajack from Steam")
else:
print(f"\n{COLOR_ERROR}Installation failed: {error_msg}{COLOR_RESET}")
print(f"{COLOR_INFO}Check logs for details{COLOR_RESET}")
input(f"\n{COLOR_PROMPT}Press Enter to continue...{COLOR_RESET}")