diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5b83818..61c32f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,19 +47,19 @@ jobs: if: matrix.os == 'windows-latest' shell: pwsh run: | - Compress-Archive -Path "HatariZipLauncher/bin/Release/net10.0/${{ matrix.rid }}/*" -DestinationPath "HatariZipLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip" + Compress-Archive -Path "MarcerGameDvdLauncher/bin/Release/net10.0/${{ matrix.rid }}/*" -DestinationPath "MarcerGameDvdLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip" - name: Create ZIP (Linux/macOS) if: matrix.os != 'windows-latest' run: | - cd HatariZipLauncher/bin/Release/net10.0/${{ matrix.rid }} - zip -r ../../../HatariZipLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip . + cd MarcerGameDvdLauncher/bin/Release/net10.0/${{ matrix.rid }} + zip -r ../../../MarcerGameDvdLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip . - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: HatariZipLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }} - path: HatariZipLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip + name: MarcerGameDvdLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }} + path: MarcerGameDvdLauncher-v${{ steps.version.outputs.version }}-${{ matrix.artifact_name }}.zip release: needs: build @@ -91,7 +91,7 @@ jobs: - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: - name: HatariZipLauncher ${{ github.ref_name }} + name: MarcerGameDvdLauncher ${{ github.ref_name }} body_path: release-notes.md files: artifacts/**/*.zip generate_release_notes: false diff --git a/HatariZipLauncher/AppConfiguration.cs b/MarcerGameDvdLauncher/AppConfiguration.cs similarity index 93% rename from HatariZipLauncher/AppConfiguration.cs rename to MarcerGameDvdLauncher/AppConfiguration.cs index fe18f78..e8d7558 100644 --- a/HatariZipLauncher/AppConfiguration.cs +++ b/MarcerGameDvdLauncher/AppConfiguration.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { // Configuration POCOs separated into their own file for clarity public class AppHatariConfig diff --git a/HatariZipLauncher/FavoritesService.cs b/MarcerGameDvdLauncher/FavoritesService.cs similarity index 98% rename from HatariZipLauncher/FavoritesService.cs rename to MarcerGameDvdLauncher/FavoritesService.cs index acf9adf..7cfafa4 100644 --- a/HatariZipLauncher/FavoritesService.cs +++ b/MarcerGameDvdLauncher/FavoritesService.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { // Manages loading, saving and querying favorite ZIP paths. public class FavoritesService diff --git a/HatariZipLauncher/HatariLauncher.cs b/MarcerGameDvdLauncher/HatariLauncher.cs similarity index 98% rename from HatariZipLauncher/HatariLauncher.cs rename to MarcerGameDvdLauncher/HatariLauncher.cs index 8f3d69e..116a33f 100644 --- a/HatariZipLauncher/HatariLauncher.cs +++ b/MarcerGameDvdLauncher/HatariLauncher.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { public class HatariLauncher { diff --git a/HatariZipLauncher/LauncherApp.cs b/MarcerGameDvdLauncher/LauncherApp.cs similarity index 99% rename from HatariZipLauncher/LauncherApp.cs rename to MarcerGameDvdLauncher/LauncherApp.cs index 5dd64c6..2e42550 100644 --- a/HatariZipLauncher/LauncherApp.cs +++ b/MarcerGameDvdLauncher/LauncherApp.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { // Encapsulates application lifecycle: load config, initialize components, run navigation public class LauncherApp diff --git a/HatariZipLauncher/HatariZipLauncher.csproj b/MarcerGameDvdLauncher/MarcerGameDvdLauncher.csproj similarity index 79% rename from HatariZipLauncher/HatariZipLauncher.csproj rename to MarcerGameDvdLauncher/MarcerGameDvdLauncher.csproj index 48467b2..20d460c 100644 --- a/HatariZipLauncher/HatariZipLauncher.csproj +++ b/MarcerGameDvdLauncher/MarcerGameDvdLauncher.csproj @@ -4,6 +4,8 @@ Exe net10.0 + MarcerGameDvdLauncher + MarcerGameDvdLauncher enable enable diff --git a/HatariZipLauncher/MenuRenderer.cs b/MarcerGameDvdLauncher/MenuRenderer.cs similarity index 99% rename from HatariZipLauncher/MenuRenderer.cs rename to MarcerGameDvdLauncher/MenuRenderer.cs index 6ea4162..251c496 100644 --- a/HatariZipLauncher/MenuRenderer.cs +++ b/MarcerGameDvdLauncher/MenuRenderer.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { public class MenuRenderer { diff --git a/HatariZipLauncher/NavigationController.cs b/MarcerGameDvdLauncher/NavigationController.cs similarity index 99% rename from HatariZipLauncher/NavigationController.cs rename to MarcerGameDvdLauncher/NavigationController.cs index a5c34cb..58d277e 100644 --- a/HatariZipLauncher/NavigationController.cs +++ b/MarcerGameDvdLauncher/NavigationController.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { public class NavigationController { diff --git a/HatariZipLauncher/OverlayDirectoryBrowser.cs b/MarcerGameDvdLauncher/OverlayDirectoryBrowser.cs similarity index 99% rename from HatariZipLauncher/OverlayDirectoryBrowser.cs rename to MarcerGameDvdLauncher/OverlayDirectoryBrowser.cs index d015725..4bc347b 100644 --- a/HatariZipLauncher/OverlayDirectoryBrowser.cs +++ b/MarcerGameDvdLauncher/OverlayDirectoryBrowser.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { public enum EntryKind { Directory, Zip } diff --git a/HatariZipLauncher/Program.cs b/MarcerGameDvdLauncher/Program.cs similarity index 86% rename from HatariZipLauncher/Program.cs rename to MarcerGameDvdLauncher/Program.cs index f4a177f..961e5fa 100644 --- a/HatariZipLauncher/Program.cs +++ b/MarcerGameDvdLauncher/Program.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { class Program { diff --git a/HatariZipLauncher/ProgramHelpers.cs b/MarcerGameDvdLauncher/ProgramHelpers.cs similarity index 99% rename from HatariZipLauncher/ProgramHelpers.cs rename to MarcerGameDvdLauncher/ProgramHelpers.cs index ddf8d19..d30e1a4 100644 --- a/HatariZipLauncher/ProgramHelpers.cs +++ b/MarcerGameDvdLauncher/ProgramHelpers.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.InteropServices; -namespace HatariZipLauncher +namespace MarcerGameDvdLauncher { // Small helpers refactored into their own file to keep Program.cs focused. internal static class ProgramHelpers diff --git a/HatariZipLauncher/UIErrorService.cs b/MarcerGameDvdLauncher/UIErrorService.cs similarity index 89% rename from HatariZipLauncher/UIErrorService.cs rename to MarcerGameDvdLauncher/UIErrorService.cs index 3a40268..613cf21 100644 --- a/HatariZipLauncher/UIErrorService.cs +++ b/MarcerGameDvdLauncher/UIErrorService.cs @@ -1,4 +1,4 @@ -namespace HatariZipLauncher; +namespace MarcerGameDvdLauncher; /// /// Centralized service for error and user message output in the console UI. diff --git a/HatariZipLauncher/launcher.config.example.json b/MarcerGameDvdLauncher/launcher.config.example.json similarity index 100% rename from HatariZipLauncher/launcher.config.example.json rename to MarcerGameDvdLauncher/launcher.config.example.json diff --git a/agents.md b/agents.md index cf1a51f..1bef6ed 100644 --- a/agents.md +++ b/agents.md @@ -4,17 +4,17 @@ applyTo: '**' ## Module Overview (Marcer GameDVD Launcher) -The implementation is split into focused modules (files) under the `HatariZipLauncher/` folder. Keep this section up to date when files are added, removed or responsibilities change. +The implementation is split into focused modules (files) under the `MarcerGameDvdLauncher/` folder. Keep this section up to date when files are added, removed or responsibilities change. -- HatariZipLauncher/Program.cs: Minimal entry point. Sets console title and starts the application by creating `LauncherApp`. -- HatariZipLauncher/LauncherApp.cs: Application lifecycle host — loads configuration, initializes components and runs the main directory navigation loop (contains `AppHost` internal class). -- HatariZipLauncher/AppConfiguration.cs: POCO configuration classes (`AppConfig`, `AppHatariConfig`) used to deserialize `launcher.config.json`. -- HatariZipLauncher/ProgramHelpers.cs: Small shared helpers (resolve relative paths, centralized console message helper) used across modules. -- HatariZipLauncher/OverlayDirectoryBrowser.cs: Filesystem overlay and browsing logic — merges root and patch directories, enumerates folders and ZIPs, protects against path traversal and ensures navigation cannot leave the configured roots. -- HatariZipLauncher/NavigationController.cs: Encapsulates selection, scrolling and relative-path navigation logic (cursor, page up/down, per-directory remembered selection/state). -- HatariZipLauncher/MenuRenderer.cs: Console rendering logic — efficient per-line redraw, double-buffering and color selection according to overlay rules. -- HatariZipLauncher/HatariLauncher.cs: Responsible for validating the Hatari executable and starting Hatari with the configured argument template (replaces `{cfg}` and `{zip}`). -- HatariZipLauncher/UIErrorService.cs: Centralized UI error presentation using the console message helper. +- MarcerGameDvdLauncher/Program.cs: Minimal entry point. Sets console title and starts the application by creating `LauncherApp`. +- MarcerGameDvdLauncher/LauncherApp.cs: Application lifecycle host — loads configuration, initializes components and runs the main directory navigation loop (contains `AppHost` internal class). +- MarcerGameDvdLauncher/AppConfiguration.cs: POCO configuration classes (`AppConfig`, `AppHatariConfig`) used to deserialize `launcher.config.json`. +- MarcerGameDvdLauncher/ProgramHelpers.cs: Small shared helpers (resolve relative paths, centralized console message helper) used across modules. +- MarcerGameDvdLauncher/OverlayDirectoryBrowser.cs: Filesystem overlay and browsing logic — merges root and patch directories, enumerates folders and ZIPs, protects against path traversal and ensures navigation cannot leave the configured roots. +- MarcerGameDvdLauncher/NavigationController.cs: Encapsulates selection, scrolling and relative-path navigation logic (cursor, page up/down, per-directory remembered selection/state). +- MarcerGameDvdLauncher/MenuRenderer.cs: Console rendering logic — efficient per-line redraw, double-buffering and color selection according to overlay rules. +- MarcerGameDvdLauncher/HatariLauncher.cs: Responsible for validating the Hatari executable and starting Hatari with the configured argument template (replaces `{cfg}` and `{zip}`). +- MarcerGameDvdLauncher/UIErrorService.cs: Centralized UI error presentation using the console message helper. Note: This overview is intentionally concise. For behavioral changes (navigation, color scheme, launch command or config schema), update this file (agents.md) and README.md as required by project policy. **Note for Automated Tests/CI:** @@ -35,7 +35,7 @@ Additional policy: - README.md must be written in English. Any functional change that affects usage, configuration, or behavior MUST update README.md in English immediately after the change. If there are consequential changes to developer-facing policies, build steps, or requirements, `agents.md` must be updated as well. Developer note: Visual Studio Solution -- A Visual Studio solution file exists at the repository root: `marcer-gamedvd-launcher.sln`. Developers may open this solution in Visual Studio to work on the project, debug and build from the IDE. The solution references `HatariZipLauncher\HatariZipLauncher.csproj` and includes Debug and Release configurations. Use `build.cmd` (Windows) or `build.sh` (Linux) and `start.cmd` for consistent command-line builds/releases as described elsewhere in this document. +- A Visual Studio solution file exists at the repository root: `marcer-gamedvd-launcher.sln`. Developers may open this solution in Visual Studio to work on the project, debug and build from the IDE. The solution references `MarcerGameDvdLauncher\MarcerGameDvdLauncher.csproj` and includes Debug and Release configurations. Use `build.cmd` (Windows) or `build.sh` (Linux) and `start.cmd` for consistent command-line builds/releases as described elsewhere in this document. With this, it is ensured that binary/release files never end up in git, and the release process is always traceable and performed exclusively manually in the web interface. diff --git a/build.cmd b/build.cmd index fa2889b..9dca052 100644 --- a/build.cmd +++ b/build.cmd @@ -1,7 +1,7 @@ @echo off -REM === Build script for HatariZipLauncher (requires .NET SDK 6 or newer) === -echo Building HatariZipLauncher... +REM === Build script for MarcerGameDvdLauncher (requires .NET SDK 6 or newer) === +echo Building MarcerGameDvdLauncher... where dotnet >nul 2>nul if errorlevel 1 ( echo [ERROR] .NET SDK not found. Please install from https://dotnet.microsoft.com/download @@ -10,7 +10,7 @@ if errorlevel 1 ( REM Im aktuellen Ordner (wo build.cmd liegt) bauen cd /d %~dp0 -cd HatariZipLauncher +cd MarcerGameDvdLauncher dotnet build -c Release if errorlevel 1 ( @@ -19,7 +19,7 @@ if errorlevel 1 ( ) REM Finden der fertigen .exe (Release-Verzeichnis) -for /f "delims=" %%I in ('dir /b /s /a-d bin\Release\*HatariZipLauncher*.exe') do set EXEPATH=%%I +for /f "delims=" %%I in ('dir /b /s /a-d bin\Release\*MarcerGameDvdLauncher*.exe') do set EXEPATH=%%I if exist "%EXEPATH%" ( echo [OK] Build complete. EXE: "%EXEPATH%" ) else ( diff --git a/build.sh b/build.sh index 44df99a..130b12b 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/bash -# === Build script for HatariZipLauncher (requires .NET SDK 6 or newer) === -echo "Building HatariZipLauncher..." +# === Build script for MarcerGameDvdLauncher (requires .NET SDK 6 or newer) === +echo "Building MarcerGameDvdLauncher..." if ! command -v dotnet &> /dev/null; then echo "[ERROR] .NET SDK not found. Please install from https://dotnet.microsoft.com/download" @@ -11,8 +11,8 @@ fi # Build in current directory (where build.sh is located) cd "$(dirname "$0")" -# Change to HatariZipLauncher subdirectory -cd "HatariZipLauncher" +# Change to MarcerGameDvdLauncher subdirectory +cd "MarcerGameDvdLauncher" dotnet build -c Release if [ $? -ne 0 ]; then @@ -21,7 +21,7 @@ if [ $? -ne 0 ]; then fi # Check for the built .exe file -EXEPATH=$(find "bin/Release" -name "HatariZipLauncher*.exe" -print -quit 2>/dev/null) +EXEPATH=$(find "bin/Release" -name "MarcerGameDvdLauncher*.exe" -print -quit 2>/dev/null) if [ -n "$EXEPATH" ] && [ -f "$EXEPATH" ]; then echo "[OK] Build complete. EXE: \"$EXEPATH\"" else diff --git a/marcer-gamedvd-launcher.sln b/marcer-gamedvd-launcher.sln index edc400c..ed64538 100644 --- a/marcer-gamedvd-launcher.sln +++ b/marcer-gamedvd-launcher.sln @@ -2,7 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.6.33424.171 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HatariZipLauncher", "HatariZipLauncher\HatariZipLauncher.csproj", "{B1D2C3E4-F567-48AB-C9D0-1234567890AB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarcerGameDvdLauncher", "MarcerGameDvdLauncher\MarcerGameDvdLauncher.csproj", "{B1D2C3E4-F567-48AB-C9D0-1234567890AB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/start.cmd b/start.cmd index 27b224f..78f85f1 100644 --- a/start.cmd +++ b/start.cmd @@ -1,14 +1,14 @@ @echo off -REM Starts HatariZipLauncher.exe from the correct folder +REM Starts MarcerGameDvdLauncher.exe from the correct folder setlocal -set EXE_PATH=%~dp0HatariZipLauncher\bin\Release\net10.0\HatariZipLauncher.exe +set EXE_PATH=%~dp0MarcerGameDvdLauncher\bin\Release\net10.0\MarcerGameDvdLauncher.exe if not exist "%EXE_PATH%" ( echo [ERROR] Application not built. Please run build.cmd first. exit /b 1 ) -pushd "HatariZipLauncher\bin\Release\net10.0" -"HatariZipLauncher.exe" +pushd "MarcerGameDvdLauncher\bin\Release\net10.0" +"MarcerGameDvdLauncher.exe" popd