Mods Manager
Created at: September 13, 2026, last updated at: September 13, 2026
Mods is an interactive CLI for installing, enabling, and disabling Unreal Engine mod triplets across supported games.
It began as Forever Winter Mods, where game discovery, paths, and mod operations all belonged to one game-specific utility. Mods retains that behavior and moves the game-specific decisions behind adapters. Archive inspection, transactional installation, triplet state changes, and the terminal interface are now shared by every supported game.
The current release supports The Forever Winter and Grounded 2. The project is published as @sabinmarcu/mods.
How it works
Run mods without a command to open an interactive game picker. It lists the supported games and reports whether each one is ready, needs its mods directory initialized, or was not detected. After selecting a ready installation, the CLI displays its complete mod triplets.
Each entry can be enabled or disabled as one operation, so its required .pak, .ucas, and .utoc files remain in the same state. Use mods install <archive> with a selected game to inspect a .zip, .7z, or .7zip archive. A single new triplet installs immediately. Archives with multiple triplets or an existing mod open a selector first.
The CLI does not extract an archive with unexpected payloads and does not delete installed mods. Documentation files are permitted, but other file types cause it to stop and leave the archive for manual review. The tool manages complete triplets and refuses to guess how an unfamiliar archive or unrelated file should be handled.
What changed from Forever Winter Mods
The original CLI searched for one game and accepted a direct mods-directory override. Mods introduces an explicit game layer:
- A game picker provides the default interactive entry point.
- Stable game IDs support scripts and direct selection through
--game. mods gamesreports every registered game and its detected installations.--game-rootaccepts an installation root; the selected adapter resolves the final mods directory.mods initcreates a missing canonical~modsdirectory when its parent exists.- Shell completion is generated from the same Commander command graph used for parsing.
These additions change how a target directory is selected, not how mod files are interpreted. The complete-triplet contract and archive safety rules remain shared.
Game adapters
Each adapter owns four facts: a stable ID, a display name, game-root discovery, and the mapping from a game root to its canonical mods directory. The core owns Steam library discovery, installation-state inspection, archive handling, mod operations, and the Ink interface.
Adapters are registered at build time. The CLI does not load arbitrary adapter packages, so adding another game requires a source change and a new release.
Supported games
| Game | ID | Mods directory relative to game root |
|---|---|---|
| The Forever Winter | foreverwinter | Windows/ForeverWinter/Content/Paks/~mods |
| Grounded 2 | grounded2 | Augusta/Content/Paks/~mods |
Both adapters allow the final ~mods directory to be created when its parent game directory exists.
Terminology
Mod triplet
A set of three files with the same basename: .pak, .ucas, and .utoc. For example, Example_P.pak, Example_P.ucas, and Example_P.utoc make one triplet. The CLI only lists, toggles, or installs a mod when all three matching files are present.
Enabled and disabled
An enabled triplet keeps its normal filenames. A disabled triplet appends .disabled after each extension, such as Example_P.pak.disabled. The payload stays in the same directory; only the names change.
Game root
The installation directory for a supported game. --game-root accepts this directory rather than a Paks or ~mods directory. The selected adapter derives the canonical mods path beneath it.
Archive
A .zip, .7z, or .7zip file containing one or more mod triplets. Archive folders are allowed, but each mod is identified by its own complete, same-named triplet.
Steam discovery and installation state
The CLI searches Steam libraries on Windows and Linux, including configured secondary libraries. Each adapter supplies the directory names that identify its game. Every detected installation is then classified as ready, needs-initialization, or invalid.
A ready installation already has its canonical mods directory. An installation needs initialization when the directory is absent but its parent exists. An invalid installation records why the expected location cannot be used. If discovery cannot find a usable installation during an interactive session, the CLI prompts for a game root.
This is a game-root workflow rather than an arbitrary mods-directory override. Supplying --game-root bypasses automatic discovery, but the adapter still derives and validates the final directory.