Collections are curated mod sets that install in phases. Each phase must complete and deploy before the next begins:
- Phase 0: Framework mods (e.g., SMAPI)
- Phase 1+: Content mods depending on previous phases
src/extensions/mod_management/InstallManager.ts
Read the source code comments on mInstallPhaseState for critical invariants.
ensurePhaseState()- Initialize phase trackingmarkPhaseDownloadsFinished()- Mark phase ready for installationmaybeAdvancePhase()- Attempt to advance to next phasepollPhaseSettlement()- Coordinate deployment timingstartPendingForPhase()- Resume queued installations after deployment
When modifying phase logic:
- Never bypass phase gating, even for optional/recommended mods
- Check BOTH
active === 0ANDpending === 0before deployment - Always set
isDeployingduring deployment, clear it after - Call
startPendingForPhase()after deployment completes
__tests__/PhasedInstaller.test.ts- Phase advancement logic