Compare commits
2
Commits
ed71a6d081
...
1becf8366d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1becf8366d | ||
|
|
4d6f9b8be0 |
@@ -22,19 +22,9 @@ Before acting, read the shared policy references:
|
|||||||
test -f pyproject.toml && test -d src/plugin_helper && test -d registry && test -d locks
|
test -f pyproject.toml && test -d src/plugin_helper && test -d registry && test -d locks
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Read the local helper behavior before changing files.
|
2. Read the locked plugin entry and its registry file before changing them.
|
||||||
|
Open `src/plugin_helper` only when the command output disagrees with the
|
||||||
Inspect at least:
|
lock. `docs/SMOKETEST.md` is for the smoke after apply.
|
||||||
|
|
||||||
```bash
|
|
||||||
sed -n '1,220p' README.md
|
|
||||||
sed -n '1,260p' src/plugin_helper/cli.py
|
|
||||||
sed -n '1,260p' src/plugin_helper/planner.py
|
|
||||||
sed -n '1,220p' src/plugin_helper/models.py
|
|
||||||
sed -n '1,220p' registry/plugins.toml
|
|
||||||
sed -n '1,220p' locks/<instance>.lock.toml
|
|
||||||
sed -n '1,220p' docs/SMOKETEST.md
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Determine the instance.
|
3. Determine the instance.
|
||||||
|
|
||||||
@@ -103,22 +93,22 @@ release URL only.
|
|||||||
curl -sS https://api.github.com/repos/<owner>/<repo>/releases/tags/<tag>
|
curl -sS https://api.github.com/repos/<owner>/<repo>/releases/tags/<tag>
|
||||||
```
|
```
|
||||||
|
|
||||||
Pick the asset that matches the Beat Saber instance/version. Prefer an exact versioned asset such as `1.40.8.zip` over broad or source archives. If multiple plausible assets remain, ask the user.
|
Pick the asset that matches the Beat Saber instance/version. Prefer an exact versioned asset such as `1.40.8.zip` over broad or source archives. If multiple plausible assets remain, ask the user. When a release ships one zip per game version, record the asset name and the `gameVersion` string embedded in the DLL. A stale manifest is a warning on the chosen asset. It is not a reason to select a lower-named zip.
|
||||||
|
|
||||||
5. Inspect the asset before selecting an install strategy.
|
5. Inspect the asset before selecting an install strategy.
|
||||||
|
|
||||||
Download to the helper state directory:
|
Download to the helper cache the planner searches:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p .state/instances/<instance>/downloads/<plugin-id>
|
mkdir -p .state/cache/downloads/<instance>/<plugin-id>
|
||||||
curl -L --fail -o .state/instances/<instance>/downloads/<plugin-id>/<asset-name> "<browser_download_url>"
|
curl -L --fail -o .state/cache/downloads/<instance>/<plugin-id>/<asset-name> "<browser_download_url>"
|
||||||
sha256sum .state/instances/<instance>/downloads/<plugin-id>/<asset-name>
|
sha256sum .state/cache/downloads/<instance>/<plugin-id>/<asset-name>
|
||||||
```
|
```
|
||||||
|
|
||||||
Match the checksum against GitHub's `digest` when available. Inspect zip contents:
|
Match the checksum against GitHub's `digest` when available. Inspect zip contents:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
unzip -l .state/instances/<instance>/downloads/<plugin-id>/<asset-name>
|
unzip -l .state/cache/downloads/<instance>/<plugin-id>/<asset-name>
|
||||||
```
|
```
|
||||||
|
|
||||||
Use the install strategy guide in the artifact policy.
|
Use the install strategy guide in the artifact policy.
|
||||||
@@ -152,15 +142,22 @@ release URL only.
|
|||||||
|
|
||||||
7. Use the helper to validate, plan, and apply.
|
7. Use the helper to validate, plan, and apply.
|
||||||
|
|
||||||
Always pass `--state-dir .state` so the helper uses the repo-local downloaded asset:
|
Pass `--state-dir .state` so the helper uses the repo-local download. On a
|
||||||
|
native Windows BSManager install, also pass
|
||||||
|
`--config plugin-helper.windows.toml.example --profile windows` when
|
||||||
|
`plugin-helper.local.toml` is absent. `--state-dir .state` alone selects the
|
||||||
|
`default` install id, which is a different bootstrap record from the
|
||||||
|
`windows` profile.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --state-dir .state check --instance <instance>
|
PYTHONPATH=src .venv/bin/python -m plugin_helper --config plugin-helper.windows.toml.example --profile windows --state-dir .state check --instance <instance>
|
||||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --state-dir .state plan --instance <instance> --plugin <plugin-id>
|
PYTHONPATH=src .venv/bin/python -m plugin_helper --config plugin-helper.windows.toml.example --profile windows --state-dir .state plan --instance <instance> --plugin <plugin-id>
|
||||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --state-dir .state apply <generated-plan-path>
|
PYTHONPATH=src .venv/bin/python -m plugin_helper --config plugin-helper.windows.toml.example --profile windows --state-dir .state apply <generated-plan-path>
|
||||||
```
|
```
|
||||||
|
|
||||||
Before applying, read or summarize the generated plan enough to confirm it changes only the intended plugin files.
|
`plan` keeps the dependency closure in `unchanged` when those live files
|
||||||
|
already match. `changes` is what `apply` writes. Confirm `Changes:` is the
|
||||||
|
intended plugin before applying.
|
||||||
|
|
||||||
8. Verify the result.
|
8. Verify the result.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: beatsaber-plugin-update-auditor
|
name: beatsaber-plugin-update-auditor
|
||||||
description: Audit Beat Saber plugin-helper locks for available plugin updates and follow-up work. Use when the user asks to check all Beat Saber plugins for updates, compare locked mods against GitHub or BeatMods, review plugin/version compatibility tracking notes, identify PR/local/manual builds that need follow-up, or skip paid/private Patreon and Discord plugin sources during update checks.
|
description: Audit Beat Saber plugin-helper locks for available plugin updates and follow-up work. Use when the user asks to check all Beat Saber plugins for updates, compare locked mods against GitHub or BeatMods, review plugin/version compatibility tracking notes, identify PR/local/manual builds that need follow-up, or skip paid/private Patreon and Discord plugin sources during update checks. Read docs/notes/update-checks/<version>/ before the audit and add a new markdown file there when the audit finishes.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Beat Saber Plugin Update Auditor
|
# Beat Saber Plugin Update Auditor
|
||||||
@@ -32,7 +32,14 @@ Before auditing, read the shared policy references:
|
|||||||
PYTHONPATH=src .venv/bin/python -m plugin_helper instances
|
PYTHONPATH=src .venv/bin/python -m plugin_helper instances
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Run the update audit with repo-local state unless the user explicitly targets
|
3. Read the update journal for that Beat Saber version before drawing
|
||||||
|
conclusions. Journals live under `docs/notes/update-checks/<version>/`, one
|
||||||
|
directory per game version, with as many markdown files as needed (usually
|
||||||
|
one dated file per check). List the directory and read the recent files.
|
||||||
|
Treat them as prior findings, not as a substitute for a fresh audit. If the
|
||||||
|
directory does not exist yet, create it when recording this check.
|
||||||
|
|
||||||
|
4. Run the update audit with repo-local state unless the user explicitly targets
|
||||||
another configured profile:
|
another configured profile:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -44,7 +51,7 @@ Before auditing, read the shared policy references:
|
|||||||
verified metadata, skips `patreon/` and `discord/` sources, and marks local,
|
verified metadata, skips `patreon/` and `discord/` sources, and marks local,
|
||||||
PR, manual, failed-trial, or pending-smoke entries as review items.
|
PR, manual, failed-trial, or pending-smoke entries as review items.
|
||||||
|
|
||||||
4. Read the active compatibility tracker before proposing updates for review
|
5. Read the active compatibility tracker before proposing updates for review
|
||||||
items. For the current migration notes, inspect:
|
items. For the current migration notes, inspect:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -53,15 +60,22 @@ Before auditing, read the shared policy references:
|
|||||||
```
|
```
|
||||||
|
|
||||||
Follow up on rows marked failed, omitted, currently failed, smoke blocked,
|
Follow up on rows marked failed, omitted, currently failed, smoke blocked,
|
||||||
manual resmoke pending, local build, PR build, or local/private. Do not
|
manual resmoke pending, local build, PR build, or local/private. The lock
|
||||||
reinstall failed or omitted plugins unless the notes identify a newer
|
`reason` and `docs/notes/update-checks/<version>/` are the current record.
|
||||||
compatible source.
|
When an older note says a plugin was removed and the lock still has a local
|
||||||
|
or pull-request build, the lock wins. Correct that note in the same change.
|
||||||
|
Do not reinstall failed or omitted plugins unless the lock or journal
|
||||||
|
identifies a newer compatible source.
|
||||||
|
|
||||||
5. For each public update candidate, inspect source notes before changing the
|
To see what BeatMods has for one mod, query `status=all` for that game
|
||||||
|
version and filter by mod name in the client. BeatMods ignores `search` and
|
||||||
|
`name`. An empty verified list is not the whole catalog.
|
||||||
|
|
||||||
|
6. For each public update candidate, inspect source notes before changing the
|
||||||
lock. Follow the shared artifact policy for GitHub-first sourcing and
|
lock. Follow the shared artifact policy for GitHub-first sourcing and
|
||||||
BeatMods fallback cases.
|
BeatMods fallback cases.
|
||||||
|
|
||||||
6. Do not attempt automated public update checks for:
|
7. Do not attempt automated public update checks for:
|
||||||
|
|
||||||
- `patreon/NalulunaModAssistant` or Naluluna bundles
|
- `patreon/NalulunaModAssistant` or Naluluna bundles
|
||||||
- `discord/BeatSaberPlus` or BeatSaberPlus/ChatPlexSDK bundles
|
- `discord/BeatSaberPlus` or BeatSaberPlus/ChatPlexSDK bundles
|
||||||
@@ -69,7 +83,7 @@ Before auditing, read the shared policy references:
|
|||||||
|
|
||||||
Report them as skipped/manual follow-up only.
|
Report them as skipped/manual follow-up only.
|
||||||
|
|
||||||
7. If the user asks to apply an update, switch to the `beatsaber-plugin-manager`
|
8. If the user asks to apply an update, switch to the `beatsaber-plugin-manager`
|
||||||
workflow for download, lock update, planning, apply, and smoketest.
|
workflow for download, lock update, planning, apply, and smoketest.
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
@@ -84,3 +98,15 @@ Summarize in four groups:
|
|||||||
|
|
||||||
Mention BeatMods/GitHub API errors separately from "no update found"; those are
|
Mention BeatMods/GitHub API errors separately from "no update found"; those are
|
||||||
unknowns, not proof that the plugin is current.
|
unknowns, not proof that the plugin is current.
|
||||||
|
|
||||||
|
## Journal
|
||||||
|
|
||||||
|
After the audit, add a new markdown file. Do not rewrite earlier journal files.
|
||||||
|
|
||||||
|
```text
|
||||||
|
docs/notes/update-checks/<beat-saber-version>/<YYYY-MM-DD>.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `<YYYY-MM-DD>-<short-slug>.md` when that date already has an entry. Keep
|
||||||
|
the note short: date, instance, the four summary groups, and any comparison
|
||||||
|
that changed a recommendation. A version directory may hold many files.
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ dependency closure before downloading.
|
|||||||
- Download artifacts into the selected helper state directory, normally:
|
- Download artifacts into the selected helper state directory, normally:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
<state_dir>/instances/<instance>/downloads/<plugin-id>/
|
<state_dir>/cache/downloads/<instance>/<plugin-id>/
|
||||||
```
|
```
|
||||||
|
|
||||||
- Record SHA-256 checksums for downloaded or built artifacts.
|
- Record SHA-256 checksums for downloaded or built artifacts.
|
||||||
|
|||||||
@@ -9,8 +9,12 @@ Use this policy when a task changes or verifies a live BSManager instance.
|
|||||||
the current duration in `docs/SMOKETEST.md` unless the user requested a
|
the current duration in `docs/SMOKETEST.md` unless the user requested a
|
||||||
different duration.
|
different duration.
|
||||||
- Do not rely on `timeout` to kill the full game process tree.
|
- Do not rely on `timeout` to kill the full game process tree.
|
||||||
- Prefer the documented foreground Proton launch with a background watchdog that
|
- On Linux, prefer the documented foreground Proton launch with a background watchdog that
|
||||||
sleeps for the smoke window, then terminates Beat Saber by process name.
|
sleeps for the smoke window, then terminates Beat Saber by process name.
|
||||||
|
- On native Windows, launch `Beat Saber.exe --no-yeet fpfc` from the instance
|
||||||
|
directory. Wait until `Logs/_latest.log` shows `MainSystemInit`, or about 20
|
||||||
|
seconds, then stop the `Beat Saber` process. See the Windows section in
|
||||||
|
`docs/SMOKETEST.md`.
|
||||||
- After the run, confirm no Beat Saber process remains. If cleanup fails, say so
|
- After the run, confirm no Beat Saber process remains. If cleanup fails, say so
|
||||||
and ask the user to close it manually.
|
and ask the user to close it manually.
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ checkout locations.
|
|||||||
|
|
||||||
## Profiles
|
## Profiles
|
||||||
|
|
||||||
- Read `plugin-helper.local.toml` before choosing a configured profile:
|
- `--state-dir .state` without a profile uses the `default` install id. A native Windows BSManager tree is the `windows` profile. When `plugin-helper.local.toml` is absent, pass `--config plugin-helper.windows.toml.example --profile windows`.
|
||||||
|
- Read `plugin-helper.local.toml` before choosing a configured profile when that file exists:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sed -n '1,220p' plugin-helper.local.toml
|
sed -n '1,220p' plugin-helper.local.toml
|
||||||
|
|||||||
@@ -278,3 +278,5 @@ custom content or non-obvious user choices rather than pure cache data.
|
|||||||
checks, and teardown commands.
|
checks, and teardown commands.
|
||||||
- The 1.44.1 migration tracker lives in
|
- The 1.44.1 migration tracker lives in
|
||||||
[`docs/notes/install-and-verify-plugins-1.44.1.md`](docs/notes/install-and-verify-plugins-1.44.1.md).
|
[`docs/notes/install-and-verify-plugins-1.44.1.md`](docs/notes/install-and-verify-plugins-1.44.1.md).
|
||||||
|
- Lightshow mods in the 1.44.1 lock, and how they fit together, are described in
|
||||||
|
[`docs/notes/lightshow-mods.md`](docs/notes/lightshow-mods.md).
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Usage
|
||||||
|
|
||||||
|
Check locked plugins for updates against the repo-local state:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:PYTHONPATH = "src"
|
||||||
|
.\.venv\Scripts\python.exe -m plugin_helper --state-dir .state updates --instance 1.44.1
|
||||||
|
```
|
||||||
@@ -110,6 +110,22 @@ Expected Setlist signals include `platformUserId=...`, playlist lines with
|
|||||||
sync, adding a map to an owned BeatLeader-synced playlist should log an HTTP
|
sync, adding a map to an owned BeatLeader-synced playlist should log an HTTP
|
||||||
success line.
|
success line.
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
From the instance directory, for example `C:\Users\pleb\BSManager\BSInstances\1.44.1`:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Start-Process -FilePath ".\Beat Saber.exe" -ArgumentList "--no-yeet","fpfc" -WorkingDirectory $PWD
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait until `Logs\_latest.log` contains `MainSystemInit`, or about 20 seconds, then stop the process:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Stop-Process -Name "Beat Saber" -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
Confirm no `Beat Saber` process remains. The Proton recipe above is for Linux.
|
||||||
|
|
||||||
## Teardown
|
## Teardown
|
||||||
|
|
||||||
When the expected log lines are present before the watchdog fires, stop Beat
|
When the expected log lines are present before the watchdog fires, stop Beat
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ Purpose: restore in-game song discovery and playlist management.
|
|||||||
| Plugin | Upstream | Status | Source/version | Verification notes |
|
| Plugin | Upstream | Status | Source/version | Verification notes |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| BeatSaverDownloader | [beatmods zip](https://beatmods.com/cdn/mod/a740c6e68a9b5d1dfda3cc8e81f7cf06.zip) | <span style="color:#d29922; font-weight:600">verified with warning</span> | BeatMods 6.0.7, version id 2217, zipHash `a740c6e68a9b5d1dfda3cc8e81f7cf06`; BeatMods preferred repo `Top-Cat/BeatSaverDownloader` exposes no release assets through the GitHub releases API | IPA loaded BeatSaver Downloader 6.0.7 and started its internal webserver. Warning: it probed for missing `BetterSongList.dll` with IPA library-loader `CRITICAL` lines, then continued. |
|
| BeatSaverDownloader | [beatmods zip](https://beatmods.com/cdn/mod/a740c6e68a9b5d1dfda3cc8e81f7cf06.zip) | <span style="color:#d29922; font-weight:600">verified with warning</span> | BeatMods 6.0.7, version id 2217, zipHash `a740c6e68a9b5d1dfda3cc8e81f7cf06`; BeatMods preferred repo `Top-Cat/BeatSaverDownloader` exposes no release assets through the GitHub releases API | IPA loaded BeatSaver Downloader 6.0.7 and started its internal webserver. Warning: it probed for missing `BetterSongList.dll` with IPA library-loader `CRITICAL` lines, then continued. |
|
||||||
| PlaylistManager | [github](https://github.com/rithik-b/PlaylistManager) | <span style="color:#f85149; font-weight:600">failed compatibility trial</span> | Local PR82 build from `.state/build/playlistmanager-pr82-skilltest`, artifact `PlaylistManager-1.7.4-bs1.44.0-da1ad17.zip`; removed from the 1.44.1 lock after DiTails smoketest failure | IPA loaded PlaylistManager 1.7.4, but later smoketest coverage showed it was still incompatible with this stack. Removed from both live BS installs and do not reinstall until a compatible build is available. |
|
| PlaylistManager | [github](https://github.com/rithik-b/PlaylistManager) | <span style="color:#d29922; font-weight:600">locked local build</span> | Lock tag `localbuild-pr82-da1ad17-1.44`, artifact `PlaylistManager-1.7.4-bs1.44.0-da1ad17.zip`, manifest game version 1.44.0. BeatMods has no PlaylistManager package for 1.44.0 or 1.44.1 as of 2026-10-03; the newest BeatMods package is 1.7.3 for 1.40.8. PR 82 is closed and unmerged. | The earlier 1.7.4 trial was recorded as removed. The lock and the live Windows `Plugins/PlaylistManager.dll` are still this 1.7.4 build, and the 2026-10-03 smoke loaded it. Do not replace it with BeatMods 1.7.3. |
|
||||||
| BeatSaverUpdater | [github](https://github.com/ibillingsley/BeatSaverUpdater) | <span style="color:#3fb950; font-weight:600">verified</span> | GitHub `ibillingsley/BeatSaverUpdater` tag `1.2.11`, asset `BeatSaverUpdater-1.2.11-bs1.39.1-3698f98.zip`; BeatMods version id 2352, zipHash `d9ea8dd0cbaac66cbb02fa59a548e42b` | GitHub asset is byte-identical to the BeatMods CDN zip. IPA loaded BeatSaverUpdater 1.2.11. |
|
| BeatSaverUpdater | [github](https://github.com/ibillingsley/BeatSaverUpdater) | <span style="color:#3fb950; font-weight:600">verified</span> | GitHub `ibillingsley/BeatSaverUpdater` tag `1.2.11`, asset `BeatSaverUpdater-1.2.11-bs1.39.1-3698f98.zip`; BeatMods version id 2352, zipHash `d9ea8dd0cbaac66cbb02fa59a548e42b` | GitHub asset is byte-identical to the BeatMods CDN zip. IPA loaded BeatSaverUpdater 1.2.11. |
|
||||||
| BeatSaverVoting | [beatmods zip](https://beatmods.com/cdn/mod/bc002ed1a43e2c6d3a10d0750e5d94b4.zip) | <span style="color:#f85149; font-weight:600">failed compatibility trial</span> | BeatMods 2.4.6, version id 2159, zipHash `bc002ed1a43e2c6d3a10d0750e5d94b4`; most recent blessed entry found was for Beat Saber 1.40.8, with no BeatMods verified entry for 1.44.1, 1.44.0, 1.43.0, 1.42.0, or 1.41.1 | IPA discovered and loaded BeatSaverVoting 2.4.6, but BS Utils caught a menu event failure from `BeatSaverVoting` caused by `TypeLoadException` resolving `IPlatformUserModel` from `PlatformUserModel`. Removed from the live instance after the failed smoketest. |
|
| BeatSaverVoting | [beatmods zip](https://beatmods.com/cdn/mod/bc002ed1a43e2c6d3a10d0750e5d94b4.zip) | <span style="color:#f85149; font-weight:600">failed compatibility trial</span> | BeatMods 2.4.6, version id 2159, zipHash `bc002ed1a43e2c6d3a10d0750e5d94b4`; most recent blessed entry found was for Beat Saber 1.40.8, with no BeatMods verified entry for 1.44.1, 1.44.0, 1.43.0, 1.42.0, or 1.41.1 | IPA discovered and loaded BeatSaverVoting 2.4.6, but BS Utils caught a menu event failure from `BeatSaverVoting` caused by `TypeLoadException` resolving `IPlatformUserModel` from `PlatformUserModel`. Removed from the live instance after the failed smoketest. |
|
||||||
| BeatSaberPlaylistsLib | [beatmods zip](https://beatmods.com/cdn/mod/a3418b75ed7294a3856f3eca12bbd672.zip) | <span style="color:#3fb950; font-weight:600">verified</span> | BeatMods 1.7.2, version id 2175, zipHash `a3418b75ed7294a3856f3eca12bbd672`; BeatMods preferred repo `Meivyn/BeatSaberPlaylistsLib` exposes no release assets through the GitHub releases API | IPA loaded BeatSaberPlaylistsLib 1.7.2. |
|
| BeatSaberPlaylistsLib | [beatmods zip](https://beatmods.com/cdn/mod/a3418b75ed7294a3856f3eca12bbd672.zip) | <span style="color:#3fb950; font-weight:600">verified</span> | BeatMods 1.7.2, version id 2175, zipHash `a3418b75ed7294a3856f3eca12bbd672`; BeatMods preferred repo `Meivyn/BeatSaberPlaylistsLib` exposes no release assets through the GitHub releases API | IPA loaded BeatSaberPlaylistsLib 1.7.2. |
|
||||||
@@ -316,7 +316,7 @@ Record plugins skipped for this 1.44.1 pass. This is not a fix list for today.
|
|||||||
| Chroma | [github](https://github.com/Aeroluna/Heck) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
| Chroma | [github](https://github.com/Aeroluna/Heck) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
||||||
| NoodleExtensions | [github](https://github.com/Aeroluna/Heck) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
| NoodleExtensions | [github](https://github.com/Aeroluna/Heck) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
||||||
| Vivify | [github](https://github.com/Aeroluna/Vivify) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
| Vivify | [github](https://github.com/Aeroluna/Vivify) | No BeatMods verified 1.44.1 entry found on 2026-06-28. | Not installed. | Revisit after Heck is available. |
|
||||||
| PlaylistManager | [github](https://github.com/rithik-b/PlaylistManager) | No BeatMods verified 1.44.1 entry found on 2026-06-28; latest blessed BeatMods entry found was 1.7.3 for Beat Saber 1.40.8. | Installed for a compatibility trial, then removed after smoketest failure. | Fails on 1.44.1 menu setup with `IPlatformUserModel` / `PlatformUserModel` type resolution; needs a newer compatible build. |
|
| PlaylistManager | [github](https://github.com/rithik-b/PlaylistManager) | No BeatMods entry for 1.44.0 or 1.44.1 on 2026-10-03, including `status=all`. Newest BeatMods package remains 1.7.3 for 1.40.8. | The omitted-trial row is stale. The 1.44.1 lock and live install keep local 1.7.4. | Leave the local build in place. BeatMods 1.7.3 is older and targets 1.40.8. |
|
||||||
| BeatSaverVoting | [beatmods zip](https://beatmods.com/cdn/mod/bc002ed1a43e2c6d3a10d0750e5d94b4.zip) | No BeatMods verified 1.44.1 entry found on 2026-06-28; latest blessed BeatMods entry found was 2.4.6 for Beat Saber 1.40.8. | Installed for a compatibility trial, then removed after smoketest failure. | Fails on 1.44.1 menu event handling with `IPlatformUserModel` / `PlatformUserModel` type resolution; needs a newer compatible build. |
|
| BeatSaverVoting | [beatmods zip](https://beatmods.com/cdn/mod/bc002ed1a43e2c6d3a10d0750e5d94b4.zip) | No BeatMods verified 1.44.1 entry found on 2026-06-28; latest blessed BeatMods entry found was 2.4.6 for Beat Saber 1.40.8. | Installed for a compatibility trial, then removed after smoketest failure. | Fails on 1.44.1 menu event handling with `IPlatformUserModel` / `PlatformUserModel` type resolution; needs a newer compatible build. |
|
||||||
|
|
||||||
## Batch Results
|
## Batch Results
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# Lightshow Mods
|
||||||
|
|
||||||
|
These plugins play mapper-authored lighting and visuals. The 1.44.1 lock uses
|
||||||
|
each mod's newest upstream zip built for Beat Saber 1.42.1. Chroma, Noodle
|
||||||
|
Extensions, Vivify, ChromaGLS, and BeatToTheFuture all ship that way, and
|
||||||
|
ChromaGLS documents the 1.42.1 plugin as the build for 1.44.1.
|
||||||
|
|
||||||
|
Mapper docs for the Aeroluna stack live at [heck.aeroluna.dev](https://heck.aeroluna.dev/).
|
||||||
|
|
||||||
|
## What each mod is for
|
||||||
|
|
||||||
|
| Mod | Role |
|
||||||
|
| --- | --- |
|
||||||
|
| [Heck](https://github.com/Aeroluna/Heck) | Shared runtime for Chroma and Noodle Extensions. It reads the custom events those mods animate. It is not a lightshow by itself. |
|
||||||
|
| [Chroma](https://github.com/Aeroluna/Heck) | Custom colors for lights, notes, bombs, sabers, and obstacles, plus extra environment controls such as ring movement. LookupID is the small id library Chroma loads with it. |
|
||||||
|
| [Noodle Extensions](https://github.com/Aeroluna/Heck) | Moves and reshapes notes, obstacles, and environment objects. Maps that bend the playfield usually require it alongside Chroma. |
|
||||||
|
| [Vivify](https://github.com/Aeroluna/Vivify) | Loads mapper-built asset bundles: models, textures, audio, and post-processing shaders, then places them with in-game events. This is the mod for custom scenes, not just recolored stock lights. |
|
||||||
|
| [ChromaGLS](https://github.com/EklipZgit/BeatSaberChromaGLS) | Custom RGBA colors, strobe colors, easing, and per-light color spreads on the game's Group Lighting System. Stock GLS still chooses which lights fire; ChromaGLS changes the color of those events. See [Using ChromaGLS](https://github.com/EklipZgit/BeatSaberChromaGLS/blob/master/UsingChromaGLS.md). |
|
||||||
|
| [BeatToTheFuture](https://github.com/EklipZgit/BeatToTheFuture) | Keeps newer map data working in the V3 format ChromaGLS uses: V4 walls, variable note jump speed on 1.40.8 and newer, Chroma ring-speed correction, and a `"lerpType": "TrueHSV"` color blend for Chroma. ChromaGLS requires it. |
|
||||||
|
| [PitchBlack](https://github.com/Loloppe/BeatSaber_PitchBlack) | Player-side switch that darkens the environment for the person playing. |
|
||||||
|
|
||||||
|
## Running them together
|
||||||
|
|
||||||
|
Upstream docs treat this set as one stack.
|
||||||
|
|
||||||
|
- [ChromaGLS](https://github.com/EklipZgit/BeatSaberChromaGLS) says it works alongside Chroma and Heck, and that it keeps its own DLL. Its [usage guide](https://github.com/EklipZgit/BeatSaberChromaGLS/blob/master/UsingChromaGLS.md#compatibility) says BeatToTheFuture supplies the V4-to-V3 compatibility and the ring-speed correction. When Chroma is loaded, Chroma keeps removing the environment gradient on ChromaGLS maps.
|
||||||
|
- [BeatToTheFuture](https://github.com/EklipZgit/BeatToTheFuture) describes itself as the support mod for ChromaGLS maps that still need V4 walls or variable note jump speed. Its ring correction runs once before Chroma reads each event. On 1.42.1 and newer, that slows ring waves on maps published before 29 March 2026 so they match the speed the mapper saw. The gameplay-setup menu has a switch for that correction.
|
||||||
|
- `"lerpType": "TrueHSV"` is an extra Chroma blend. Chroma's existing `"HSV"` blend stays as it is.
|
||||||
|
- [Vivify](https://github.com/Aeroluna/Vivify) documents custom assets on top of the same Heck mapping events. A search of the ChromaGLS, BeatToTheFuture, and Vivify repositories found no warning against loading Vivify with Chroma or ChromaGLS.
|
||||||
|
|
||||||
|
ChromaGLS declares these minimums: BeatToTheFuture 1.0.0, BSIPA 4.2.2, CustomJSONData 2.5.2, SongCore 3.11.1, BeatSaberMarkupLanguage 1.5.9, and SiraUtil 3.0.5. BeatToTheFuture declares the same set except itself. The 1.44.1 lock is already above those floors.
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# 2026-10-03 update check
|
||||||
|
|
||||||
|
Instance `1.44.1`. Public audit: 1 update, 41 current, 9 review, 3 skipped, 2 warnings, 0 API errors.
|
||||||
|
|
||||||
|
## Public updates
|
||||||
|
|
||||||
|
- AccSaber Reloaded `v1.2.1` to `v1.2.2`, GitHub `not-dexter/accsaber-reloaded-plugin`, asset `1.42.0.zip`. Applied to the local Windows instance the same day. Embedded manifest still says game version 1.29.1. A 20-second FPFC smoke loaded AccSaber and wrote config, with no `TypeLoadException`. The process was stopped before `MainSystemInit`.
|
||||||
|
|
||||||
|
## Review follow-ups
|
||||||
|
|
||||||
|
Local or pull-request builds still in the lock: BeatSaverVoting, PlaylistManager, Cinema, KeyRemapper, SquatToBegin, DiTails, JDFixer, and wipbot. IntroSkip is current on BeatMods 4.0.8 with an older-manifest warning. Cinema Tools has no repository. Setlist is on `git.plebsaber.stream`, which the public check does not query.
|
||||||
|
|
||||||
|
## Skipped private sources
|
||||||
|
|
||||||
|
BeatSaberPlus `v6.4.5-bs-1.44.0`, Naluluna utils `5.8.0`, ReeSabers `1.42.0`.
|
||||||
|
|
||||||
|
## PlaylistManager vs BeatMods
|
||||||
|
|
||||||
|
BeatMods has no PlaylistManager entry for Beat Saber 1.44.0 or 1.44.1. Verified, unverified, pending, and all statuses were empty for that mod on both versions, and the same was true for 1.42.0 and 1.43.0. The newest BeatMods package found is **1.7.3** for Beat Saber **1.40.8** (version id 2162, zipHash `777baaf710606b7a194ba26c794cc755`, git `https://github.com/rithik-b/PlaylistManager`).
|
||||||
|
|
||||||
|
The lock and the live `Plugins/PlaylistManager.dll` are the local PR 82 build: version **1.7.4**, manifest game version **1.44.0**, tag `localbuild-pr82-da1ad17-1.44`, archive SHA-256 `cb86029a2defca846e2e1ebdf75bbe1368797fbf1b8ce509615155080b9ffbf9`. That is one patch newer than BeatMods 1.7.3 and targets 1.44.0. GitHub's latest release, 1.6.6, is older than both. PR 82 is closed and was not merged. Do not replace the local build with the BeatMods 1.40.8 package.
|
||||||
+34
-14
@@ -121,6 +121,26 @@ sha256 = "0e8799a7243496925aa527bc4ca7d3bcab770f4e828bbceeed066539f90a0902"
|
|||||||
install_strategy = "bsipa-zip"
|
install_strategy = "bsipa-zip"
|
||||||
reason = "No BeatMods verified 1.44.1 entry was returned on 2026-06-28. Use latest upstream GitHub Vivify asset targeting the highest available Beat Saber version, bs1.42.1; GitHub release digest matched the downloaded asset."
|
reason = "No BeatMods verified 1.44.1 entry was returned on 2026-06-28. Use latest upstream GitHub Vivify asset targeting the highest available Beat Saber version, bs1.42.1; GitHub release digest matched the downloaded asset."
|
||||||
|
|
||||||
|
[[plugins]]
|
||||||
|
id = "beattothefuture"
|
||||||
|
repo = "EklipZgit/BeatToTheFuture"
|
||||||
|
tag = "v2026-10-17-1.0.1"
|
||||||
|
asset = "BeatToTheFuture-1.0.1+1.42.1-bs1.42.1-bdb6ef5.zip"
|
||||||
|
download_url = "https://github.com/EklipZgit/BeatToTheFuture/releases/download/v2026-10-17-1.0.1/BeatToTheFuture-1.0.1%2B1.42.1-bs1.42.1-bdb6ef5.zip"
|
||||||
|
sha256 = "def6409d44fde7b618cc20f962fba5d50758d4324dd97128c9dd18f3417585d6"
|
||||||
|
install_strategy = "bsipa-zip"
|
||||||
|
reason = "Latest upstream GitHub BeatToTheFuture release v2026-10-17-1.0.1, asset BeatToTheFuture-1.0.1+1.42.1-bs1.42.1-bdb6ef5.zip. Required by ChromaGLS. GitHub release digest matched the downloaded asset."
|
||||||
|
|
||||||
|
[[plugins]]
|
||||||
|
id = "chromagls"
|
||||||
|
repo = "EklipZgit/BeatSaberChromaGLS"
|
||||||
|
tag = "v2026-10-17-1.1.0"
|
||||||
|
asset = "ChromaGLS-1.1.0+1.42.1-bs1.42.1-996d98e.zip"
|
||||||
|
download_url = "https://github.com/EklipZgit/BeatSaberChromaGLS/releases/download/v2026-10-17-1.1.0/ChromaGLS-1.1.0%2B1.42.1-bs1.42.1-996d98e.zip"
|
||||||
|
sha256 = "c096efd387659a819df0338bb7ba984be8e34cea3de3cec3bcbfb0f7bda6f8b4"
|
||||||
|
install_strategy = "bsipa-zip"
|
||||||
|
reason = "Latest upstream GitHub ChromaGLS release v2026-10-17-1.1.0, asset ChromaGLS-1.1.0+1.42.1-bs1.42.1-996d98e.zip. Upstream documents 1.44.1 support through the 1.42.1 plugin build. GitHub release digest matched the downloaded asset."
|
||||||
|
|
||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "iniparser"
|
id = "iniparser"
|
||||||
repo = "rickyah/ini-parser"
|
repo = "rickyah/ini-parser"
|
||||||
@@ -201,12 +221,12 @@ reason = "BeatMods verified ScoreSaberSharp 0.1.0 for Beat Saber 1.44.1 as versi
|
|||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "scoresaber"
|
id = "scoresaber"
|
||||||
repo = "ScoreSaber/pc-mod"
|
repo = "ScoreSaber/pc-mod"
|
||||||
tag = "v3.4.1"
|
tag = "v3.4.2"
|
||||||
asset = "ScoreSaber-v3.4.1-bs1.42.0-to-1.44.1-4a3f9ff.zip"
|
asset = "ScoreSaber-v3.4.2-bs1.42.0-to-1.44.1-9b90ec3.zip"
|
||||||
download_url = "https://github.com/ScoreSaber/pc-mod/releases/download/v3.4.1/ScoreSaber-v3.4.1-bs1.42.0-to-1.44.1-4a3f9ff.zip"
|
download_url = "https://github.com/ScoreSaber/pc-mod/releases/download/v3.4.2/ScoreSaber-v3.4.2-bs1.42.0-to-1.44.1-9b90ec3.zip"
|
||||||
sha256 = "6a74de62103b9b6afb1e02a3740d800cf696a88beee68e55d56de24751d5f8de"
|
sha256 = "2161db29305cdc0bf320e734defb55d54c3a8b9b91dcdfa4a261efdd2d788591"
|
||||||
install_strategy = "bsipa-zip"
|
install_strategy = "bsipa-zip"
|
||||||
reason = "Updated from GitHub ScoreSaber/pc-mod tag v3.4.1 release https://github.com/ScoreSaber/pc-mod/releases/tag/v3.4.1, asset ScoreSaber-v3.4.1-bs1.42.0-to-1.44.1-4a3f9ff.zip. GitHub release digest matched 6a74de62103b9b6afb1e02a3740d800cf696a88beee68e55d56de24751d5f8de."
|
reason = "Updated from GitHub ScoreSaber/pc-mod tag v3.4.2 release https://github.com/ScoreSaber/pc-mod/releases/tag/v3.4.2, asset ScoreSaber-v3.4.2-bs1.42.0-to-1.44.1-9b90ec3.zip. GitHub release digest matched 2161db29305cdc0bf320e734defb55d54c3a8b9b91dcdfa4a261efdd2d788591."
|
||||||
|
|
||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "protobuf-net"
|
id = "protobuf-net"
|
||||||
@@ -251,12 +271,12 @@ reason = "User-provided GitHub releases URL https://github.com/BeatLeader/beatle
|
|||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "accsaber-reloaded"
|
id = "accsaber-reloaded"
|
||||||
repo = "not-dexter/accsaber-reloaded-plugin"
|
repo = "not-dexter/accsaber-reloaded-plugin"
|
||||||
tag = "v1.20"
|
tag = "v1.2.2"
|
||||||
asset = "1.42.0.zip"
|
asset = "1.42.0.zip"
|
||||||
download_url = "https://github.com/not-dexter/accsaber-reloaded-plugin/releases/download/v1.20/1.42.0.zip"
|
download_url = "https://github.com/not-dexter/accsaber-reloaded-plugin/releases/download/v1.2.2/1.42.0.zip"
|
||||||
sha256 = "0fccbc51001ef16ef1fe1ca89db6729670e831e05c709542c27e3ff756c520d8"
|
sha256 = "8f0f3e1a54ec838cf5fbfd042f19a8fda7e36b98b9fbceb33112e7ac4f9943a0"
|
||||||
install_strategy = "bsipa-zip"
|
install_strategy = "bsipa-zip"
|
||||||
reason = "User-provided GitHub releases URL https://github.com/not-dexter/accsaber-reloaded-plugin/releases. Latest release v1.20 (v1.2.0) has no 1.44.x asset; use highest available game-version asset 1.42.0.zip. GitHub release digest matched the downloaded asset. Depends on BSIPA, BeatSaberMarkupLanguage, SiraUtil, SongCore, and LeaderboardCore (satisfied by BeatLeader-bundled LeaderboardCore)."
|
reason = "Updated from GitHub not-dexter/accsaber-reloaded-plugin tag v1.2.2 release https://github.com/not-dexter/accsaber-reloaded-plugin/releases/tag/v1.2.2, asset 1.42.0.zip. Highest game-version asset on that release; GitHub release digest matched 8f0f3e1a54ec838cf5fbfd042f19a8fda7e36b98b9fbceb33112e7ac4f9943a0."
|
||||||
|
|
||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "beatsaverdownloader"
|
id = "beatsaverdownloader"
|
||||||
@@ -404,12 +424,12 @@ reason = "User-provided GitHub repository URL https://github.com/kinsi55/BeatSab
|
|||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "hitscorevisualizer"
|
id = "hitscorevisualizer"
|
||||||
repo = "ErisApps/HitScoreVisualizer"
|
repo = "ErisApps/HitScoreVisualizer"
|
||||||
tag = "3.7.3"
|
tag = "3.7.4"
|
||||||
asset = "HitScoreVisualizer-3.7.3-bs1.42.0-a565cbb.zip"
|
asset = "HitScoreVisualizer-3.7.4-bs1.42.0-0c13ea1.zip"
|
||||||
download_url = "https://github.com/ErisApps/HitScoreVisualizer/releases/download/3.7.3/HitScoreVisualizer-3.7.3-bs1.42.0-a565cbb.zip"
|
download_url = "https://github.com/ErisApps/HitScoreVisualizer/releases/download/3.7.4/HitScoreVisualizer-3.7.4-bs1.42.0-0c13ea1.zip"
|
||||||
sha256 = "b889355cd47cc3b09a352f081110b8130ac6e1d285fa58776466117d585814db"
|
sha256 = "d01b473ce7e486c83e904ae91dde675608c2e8bb68c31817b597cdbdb336e5e0"
|
||||||
install_strategy = "bsipa-zip"
|
install_strategy = "bsipa-zip"
|
||||||
reason = "User-provided GitHub repository URL https://github.com/ErisApps/HitScoreVisualizer. Latest non-draft, non-prerelease release 3.7.3 exposes this asset for Beat Saber 1.42.0; GitHub release digest matched the downloaded asset."
|
reason = "Updated from GitHub ErisApps/HitScoreVisualizer tag 3.7.4 release https://github.com/ErisApps/HitScoreVisualizer/releases/tag/3.7.4, asset HitScoreVisualizer-3.7.4-bs1.42.0-0c13ea1.zip. GitHub release digest matched d01b473ce7e486c83e904ae91dde675608c2e8bb68c31817b597cdbdb336e5e0."
|
||||||
|
|
||||||
[[plugins]]
|
[[plugins]]
|
||||||
id = "ditails"
|
id = "ditails"
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
id = "beattothefuture"
|
||||||
|
name = "BeatToTheFuture"
|
||||||
|
repo = "EklipZgit/BeatToTheFuture"
|
||||||
|
asset_patterns = ["BeatToTheFuture-*.zip"]
|
||||||
|
install_strategy = "bsipa-zip"
|
||||||
|
category = "mapping"
|
||||||
|
dependencies = [
|
||||||
|
{ id = "beatsabermarkuplanguage", constraint = ">=1.5.9" },
|
||||||
|
{ id = "bsipa", constraint = ">=4.2.2" },
|
||||||
|
{ id = "customjsondata", constraint = ">=2.5.2" },
|
||||||
|
{ id = "sirautil", constraint = ">=3.0.5" },
|
||||||
|
{ id = "songcore", constraint = ">=3.11.1" },
|
||||||
|
]
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
id = "chromagls"
|
||||||
|
name = "ChromaGLS"
|
||||||
|
repo = "EklipZgit/BeatSaberChromaGLS"
|
||||||
|
asset_patterns = ["ChromaGLS-*.zip"]
|
||||||
|
install_strategy = "bsipa-zip"
|
||||||
|
category = "mapping"
|
||||||
|
dependencies = [
|
||||||
|
{ id = "beattothefuture", constraint = ">=1.0.0" },
|
||||||
|
{ id = "beatsabermarkuplanguage", constraint = ">=1.5.9" },
|
||||||
|
{ id = "bsipa", constraint = ">=4.2.2" },
|
||||||
|
{ id = "customjsondata", constraint = ">=2.5.2" },
|
||||||
|
{ id = "sirautil", constraint = ">=3.0.5" },
|
||||||
|
{ id = "songcore", constraint = ">=3.11.1" },
|
||||||
|
]
|
||||||
@@ -572,6 +572,7 @@ def run(argv: list[str] | None = None) -> int:
|
|||||||
)
|
)
|
||||||
print(f"Wrote plan: {path}")
|
print(f"Wrote plan: {path}")
|
||||||
print(f"Changes: {len(plan['changes'])}")
|
print(f"Changes: {len(plan['changes'])}")
|
||||||
|
print(f"Already match: {len(plan.get('unchanged', []))}")
|
||||||
for warning in plan["warnings"]:
|
for warning in plan["warnings"]:
|
||||||
print(f"Warning: {warning}", file=sys.stderr)
|
print(f"Warning: {warning}", file=sys.stderr)
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -69,6 +69,11 @@ def _asset_matches_patterns(name: str, patterns: tuple[str, ...]) -> bool:
|
|||||||
return not patterns or any(fnmatch.fnmatch(name, pattern) for pattern in patterns)
|
return not patterns or any(fnmatch.fnmatch(name, pattern) for pattern in patterns)
|
||||||
|
|
||||||
|
|
||||||
|
def _target_matches_live(instance_path: Path, change: dict[str, Any]) -> bool:
|
||||||
|
target = instance_path / ensure_relative(change["target"])
|
||||||
|
return target.is_file() and sha256_file(target) == change["sha256"]
|
||||||
|
|
||||||
|
|
||||||
def _expand_required_dependencies(selected_ids: set[str], registry: Registry, lockfile: Lockfile) -> set[str]:
|
def _expand_required_dependencies(selected_ids: set[str], registry: Registry, lockfile: Lockfile) -> set[str]:
|
||||||
locked_ids = {plugin.id for plugin in lockfile.plugins}
|
locked_ids = {plugin.id for plugin in lockfile.plugins}
|
||||||
expanded = set(selected_ids)
|
expanded = set(selected_ids)
|
||||||
@@ -171,6 +176,8 @@ def create_plan(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
unchanged = [change for change in changes if _target_matches_live(instance_path, change)]
|
||||||
|
changes = [change for change in changes if change not in unchanged]
|
||||||
plan = {
|
plan = {
|
||||||
"schemaVersion": 1,
|
"schemaVersion": 1,
|
||||||
"createdAt": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
"createdAt": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
||||||
@@ -179,6 +186,7 @@ def create_plan(
|
|||||||
"beatSaberVersion": beat_saber_version,
|
"beatSaberVersion": beat_saber_version,
|
||||||
"warnings": warnings,
|
"warnings": warnings,
|
||||||
"changes": changes,
|
"changes": changes,
|
||||||
|
"unchanged": unchanged,
|
||||||
}
|
}
|
||||||
if install_id:
|
if install_id:
|
||||||
plan["installId"] = install_id
|
plan["installId"] = install_id
|
||||||
|
|||||||
@@ -793,6 +793,20 @@ install_strategy = "dll-to-plugins"
|
|||||||
)
|
)
|
||||||
self.assertTrue(plan_path.exists())
|
self.assertTrue(plan_path.exists())
|
||||||
self.assertEqual(plan["changes"][0]["target"], "Plugins/Example.dll")
|
self.assertEqual(plan["changes"][0]["target"], "Plugins/Example.dll")
|
||||||
|
self.assertEqual(plan["unchanged"], [])
|
||||||
|
|
||||||
|
apply_plan(plan, state)
|
||||||
|
same_plan, _same_path = create_plan(
|
||||||
|
instance="1.40.8",
|
||||||
|
instance_path=instance,
|
||||||
|
beat_saber_version="1.40.8",
|
||||||
|
registry=registry,
|
||||||
|
lockfile=lockfile,
|
||||||
|
state_root=state,
|
||||||
|
repo_root=work,
|
||||||
|
)
|
||||||
|
self.assertEqual(same_plan["changes"], [])
|
||||||
|
self.assertEqual(same_plan["unchanged"][0]["target"], "Plugins/Example.dll")
|
||||||
|
|
||||||
result = apply_plan(plan, state)
|
result = apply_plan(plan, state)
|
||||||
self.assertEqual(len(result["applied"]), 1)
|
self.assertEqual(len(result["applied"]), 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user