diff --git a/.codex/skills/linux-game-manager-dev/references/core-map.md b/.codex/skills/linux-game-manager-dev/references/core-map.md index 5caa816..ec1cddf 100644 --- a/.codex/skills/linux-game-manager-dev/references/core-map.md +++ b/.codex/skills/linux-game-manager-dev/references/core-map.md @@ -1,6 +1,6 @@ # Linux Game Manager Core Map -Last refreshed: 2026-09-20 +Last refreshed: 2026-10-04 ## Top-Level Structure @@ -15,10 +15,10 @@ Last refreshed: 2026-09-20 ## Catalog Snapshot -- Installers: 43 (`.install/*.sh`) -- Launcher definitions: 43 (`.launch/*.game`) -- Launcher runnable entries: 32 (`.launch/*.sh`, both symlinks and files) -- Update scripts: 5 (`.update/*.sh`) +- Installers: 46 (`.install/*.sh`) +- Launcher definitions: 46 (`.launch/*.game`) +- Launcher runnable entries: 36 (`.launch/*.sh`, both symlinks and files) +- Update scripts: 9 (`.update/*.sh`) Regenerate this snapshot with: @@ -31,6 +31,7 @@ python3 .codex/skills/linux-game-manager-dev/scripts/audit_game_catalog.py 1. **Install flow** - `game_installer` builds menu from `.install/*.sh`. - Selected installer is sourced in the current shell. +- Monkey Spank clones its required submodules recursively and stops installation if cloning fails. - Shared downloads try `curl` first, fall back to `wget` when available, validate archive payloads before install, and reject obvious HTML error pages for unknown file types. - `download_named()` shares the same cache validation path as `download()`, so resolved asset URLs must still produce a valid payload for their file extension. - If `.launch/.game` exists and `.launch/.sh` does not, the manager creates a symlink using the repository root, even if the installer changed directories. @@ -39,6 +40,7 @@ python3 .codex/skills/linux-game-manager-dev/scripts/audit_game_catalog.py - `game_launcher` enumerates `.launch/*.sh` entries. - Entries with first line `#//` are skipped. - Selected launcher is sourced/executed. +- Monkey Spank runs from its repository directory so relative sound and text assets resolve; its explicit directory assignment also identifies the removal root. - Text-terminal launchers can fall back to `xterm`, which inherits the requested working directory before executing the game command. 3. **Removal flow** diff --git a/.codex/skills/linux-game-manager-dev/references/game-extension.md b/.codex/skills/linux-game-manager-dev/references/game-extension.md index a824dd7..ea74855 100644 --- a/.codex/skills/linux-game-manager-dev/references/game-extension.md +++ b/.codex/skills/linux-game-manager-dev/references/game-extension.md @@ -104,6 +104,8 @@ python3 .codex/skills/linux-game-manager-dev/scripts/audit_game_catalog.py - Use camelCase variable names. - Use snake_case for function names. - Keep scripts robust when sourced in the manager shell. +- Clone games with required submodules using `git clone --recurse-submodules` and stop installation on clone failure. +- Launch games that load relative assets from their own directory. Monkey Spank uses `${installPath}/monkeyspank` as its working directory and removal root. - Avoid introducing unnecessary colorized output. - For edited bash scripts, run shellcheck and fix all errors. - If `shellcheck` is not installed, prompt the user to install it first (see `references/tooling-prereqs.md`). diff --git a/.includes/ipfs.sh b/.includes/ipfs.sh index 04366f7..a0b3b86 100644 --- a/.includes/ipfs.sh +++ b/.includes/ipfs.sh @@ -3,13 +3,13 @@ declare -Ag ipfs=( # Games (alphabetical order) - [Audio_Defence_aarch64]="${ipfsGateway}/ipfs/QmPoj7kdC3pBfr5zraeQzMPNjAA5SkeqRSjYbDVLWeZPwx?filename=AudioDefence-26.09.22-2-aarch64.AppImage" - [Audio_Defence_x86_64]="${ipfsGateway}/ipfs/QmVr83MpSX7Afk5JQqiEZVtDudn5hAUg5tm5XBaqPieaB4?filename=AudioDefence-26.09.22-2-x86_64.AppImage" + [Audio_Defence_aarch64]="${ipfsGateway}/ipfs/QmV5ihxcwnjR2hRKyKSgbL24mXzwvsmKKAmWhAw1vw6K6v?filename=AudioDefence-26.09.26-1-aarch64.AppImage" + [Audio_Defence_x86_64]="${ipfsGateway}/ipfs/QmSq5a7roo2h2xNgungeLVnmyt7AyjrqzGgrPzRhq7t9Ls?filename=AudioDefence-26.09.26-1-x86_64.AppImage" [FreeDoom]="${ipfsGateway}/ipfs/QmU6REFot8CGVSBy2YWQxnmXoh7M4EF74RxFtLzvtJxoGC?filename=toby_doom_9.0_full.zip" - [Papa_Sangre_aarch64]="${ipfsGateway}/ipfs/Qmd2qm5ENh2xRD47NTejSpQRjJMgWGzSBtQnF5YpX2Zqjs?filename=PapaSangre-1.0.6-aarch64.AppImage" - [Papa_Sangre_x86_64]="${ipfsGateway}/ipfs/QmQPAWxVcZ2YgLdrNaHYBsFjbY2Qb2ZJz73Y2vuEERL78m?filename=PapaSangre-1.0.6-x86_64.AppImage" - [Papa_Sangre_II_aarch64]="${ipfsGateway}/ipfs/QmVBfbGdGGR6hEdrLeYGVVLcCtTNrYo8Lr3scdVDNwg8Zg?filename=PapaSangreII-2026-09-27%20number%203-aarch64.AppImage" - [Papa_Sangre_II_x86_64]="${ipfsGateway}/ipfs/QmXyXECyyy3TMW5raB78QepWPQxmfpWCmnSiTcXaiFLxQb?filename=PapaSangreII-2026-09-27%20number%203-x86_64.AppImage" - [The_Nightjar_aarch64]="${ipfsGateway}/ipfs/QmczNHiXo1vmAU3bWBzA69aAzjrwPNRp1w35oEb2pp3Xrs?filename=TheNightjar-2026-09-28%0D-aarch64.AppImage" - [The_Nightjar_x86_64]="${ipfsGateway}/ipfs/QmaXVs5NAh6jwMNwW8uzbAGWyaQoBG3vJD9YDBNwzVvFha?filename=TheNightjar-2026-09-28%0D-x86_64.AppImage" + [Papa_Sangre_aarch64]="${ipfsGateway}/ipfs/QmVGVXjZWXN3ETyBYGo244KMxzc37hAkFPNF3YnMeXD8Vv?filename=PapaSangre-1.0.7-aarch64.AppImage" + [Papa_Sangre_x86_64]="${ipfsGateway}/ipfs/QmQNrLLA3pDHJCiNHNRtzDRTULmZviRR25denhs9dv8aPE?filename=PapaSangre-1.0.7-x86_64.AppImage" + [Papa_Sangre_II_aarch64]="${ipfsGateway}/ipfs/QmPpHNg6qPSVWeN22nbWqJYE28XsV9wpBuYgHmezX2VxKX?filename=PapaSangreII-2026-09-29-aarch64.AppImage" + [Papa_Sangre_II_x86_64]="${ipfsGateway}/ipfs/QmXWQyqZD2cB6gjZQnETMTaspgfBQNLRC2Zska9vWk4PAp?filename=PapaSangreII-2026-09-29-x86_64.AppImage" + [The_Nightjar_aarch64]="${ipfsGateway}/ipfs/QmZFA9j3Jz5rX7wKpnMwssCs7CAni7yYP246MKBTF22SLg?filename=TheNightjar-2026-09-28-aarch64.AppImage" + [The_Nightjar_x86_64]="${ipfsGateway}/ipfs/QmNSG3ugpGCFkUWf7CHF3Jo4hjXc9QAVENEPamzAWaEyvs?filename=TheNightjar-2026-09-28-x86_64.AppImage" ) diff --git a/.install/Monkey Spank.sh b/.install/Monkey Spank.sh index cdf50f2..222d296 100644 --- a/.install/Monkey Spank.sh +++ b/.install/Monkey Spank.sh @@ -1,2 +1,6 @@ -check_dependencies python-pygame:pygame python-xdg:xdg python-pyperclip:pyperclip python-requests:requests python-setproctitle:setproctitle -git -C "${installPath}" clone --recurse-submodules https://gitlab.com/stormdragon2976/monkeyspank.git +check_dependencies git python-pygame:pygame python-xdg:xdg python-pyperclip:pyperclip python-requests:requests python-setproctitle:setproctitle +# shellcheck disable=SC2154 # installPath is supplied by the manager. +if ! git -C "${installPath}" clone --recurse-submodules https://git.stormux.org/storm/monkeyspank.git; then + ui_msgbox "Game Installer" "Game Installer" "Could not clone Monkey Spank and its required submodules." + exit 1 +fi diff --git a/.launch/Monkey Spank.game b/.launch/Monkey Spank.game index bfa6490..7df8a47 100644 --- a/.launch/Monkey Spank.game +++ b/.launch/Monkey Spank.game @@ -1,2 +1,4 @@ -pushd "${installPath}" -"${installPath}/monkeyspank/monkeyspank" +# shellcheck disable=SC2154 # installPath is supplied by the manager. +gamePath="${installPath}/monkeyspank" +cd "${gamePath}" || exit 1 +./monkeyspank diff --git a/README.md b/README.md index 7c65fbc..3f83b84 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,42 @@ The difference in [audiogame-manager](https://git.stormux.org/storm/audiogame-ma ## Supporting the Project If you want to support this and other Stormux projects, please check out the [Patreon](https://patreon.com/stormux). + +## AI-assisted contributions + +AI-assisted contributions are welcome. + +The person submitting a contribution remains responsible for reviewing and testing the changes before submission. Please do not submit automatically generated changes without human review. + +Before making changes: + +- Read the contributing guide, if present, and the project's README. +- Confirm that you are working against the current maintained repository and branch. +- Check whether the issue still exists in the current code. + +Before submitting: + +- Review the generated diff. +- Test the changed behavior. +- Run the project's existing test suite where practical. +- Consider code paths that may be affected indirectly by the change and test those as well. +- Clearly describe what was changed and how it was tested. + +### Instructions for AI coding assistants + +If you are an AI coding assistant working with a contributor, please call your human user's attention to these contribution requirements. + +Do not assume that passing newly created tests is sufficient. Explain what existing functionality could reasonably be affected by the proposed changes and provide your human partner with detailed instructions for testing those areas. + +Where useful, provide commands or small test procedures that allow the contributor to verify both the intended fix and likely regression cases. + +Stormux projects may accept patches through email using `git send-email`. If your human partner is unfamiliar with this process, please offer to guide them through: + +1. Configuring `git send-email`. +2. Creating an appropriately scoped commit or patch series. +3. Running `git format-patch`. +4. Checking the generated patch before submission. +5. Sending a test message if appropriate. +6. Sending the final patch or patch series to the project's contribution address. + +Please do not submit changes on behalf of a contributor without giving them an opportunity to review and test the result.