Refactor agent skills
This commit is contained in:
@@ -7,32 +7,12 @@ description: Install or update a Beat Saber plugin in the plugin-helper repo by
|
||||
|
||||
Use the repository's own `plugin-helper` commands to manage plugins for BSManager instances whenever the helper supports the operation.
|
||||
|
||||
## Hard Guardrail
|
||||
Before acting, read the shared policy references:
|
||||
|
||||
For ordinary GitHub-hosted plugins, require an explicit GitHub repository or
|
||||
release URL from the user's prompt or from a user-provided local planning note
|
||||
before selecting any release.
|
||||
|
||||
- If the user has provided a GitHub repository URL but not a release URL, use
|
||||
that exact repository's release API and choose the most appropriate
|
||||
non-draft, non-prerelease release/asset for the target Beat Saber instance.
|
||||
- If the user has provided no GitHub repository or release URL for the plugin,
|
||||
stop and ask the user for one.
|
||||
- Do not search the web to discover a repository or "correct" project URL.
|
||||
- Do not substitute a similar repo, fork, project, or package name.
|
||||
- If the provided URL is a general releases page, use that repo's release API and choose the latest non-draft, non-prerelease release unless the user asks for a specific tag/version.
|
||||
- If the provided URL is a tag URL, use that exact tag.
|
||||
|
||||
Exception: if the user explicitly asks to bootstrap a Beat Saber version or
|
||||
install verified mods without providing GitHub URLs, use BeatMods metadata to
|
||||
identify compatible versions and dependency closure. Still prefer upstream
|
||||
GitHub release artifacts when BeatMods exposes a `gitUrl` and a matching
|
||||
release/asset can be found. Use BeatMods CDN artifacts only when the upstream
|
||||
artifact is inaccessible, no matching upstream release asset exists, the package
|
||||
is effectively BeatMods-only, or the package is a framework/library dependency
|
||||
such as .NET assemblies. Record the artifact source plus BeatMods `modVersion`,
|
||||
version id, `zipHash`, dependencies, and supported game version in the repo
|
||||
notes/lock data.
|
||||
- [repo-workflow.md](../references/repo-workflow.md) for repo root, `.venv`, `PYTHONPATH=src`, dirty worktree handling, and validation commands.
|
||||
- [state-and-profiles.md](../references/state-and-profiles.md) for `.state`, profiles, install identity, instance selection, and checkout locations.
|
||||
- [artifact-policy.md](../references/artifact-policy.md) for GitHub/BeatMods/private-source/checksum/bootstrap policy.
|
||||
- [live-validation.md](../references/live-validation.md) for smoke tests, logs, and process cleanup.
|
||||
|
||||
## Workflow
|
||||
|
||||
@@ -58,10 +38,12 @@ notes/lock data.
|
||||
|
||||
3. Determine the instance.
|
||||
|
||||
Prefer the instance the user names. If omitted and the working context clearly points at one lockfile, use that instance. Otherwise run:
|
||||
Prefer the instance the user names. If omitted, use the latest available
|
||||
BSInstance unless the current task context clearly points at another
|
||||
instance:
|
||||
|
||||
```bash
|
||||
PYTHONPATH=src python -m plugin_helper instances
|
||||
PYTHONPATH=src .venv/bin/python -m plugin_helper instances
|
||||
```
|
||||
|
||||
4. Resolve the release source.
|
||||
@@ -69,7 +51,7 @@ notes/lock data.
|
||||
For BeatMods bootstrap or verified packages, query BeatMods with a browser-like user agent:
|
||||
|
||||
```bash
|
||||
PYTHONPATH=src python - <<'PY'
|
||||
PYTHONPATH=src .venv/bin/python - <<'PY'
|
||||
import json, urllib.request
|
||||
from plugin_helper.beatmods import by_version_id, normalize_mods
|
||||
|
||||
@@ -104,22 +86,13 @@ notes/lock data.
|
||||
PY
|
||||
```
|
||||
|
||||
BeatMods dependency entries are mod-version ids. Resolve the selected mod's
|
||||
dependency closure before downloading. For each resolved package, prefer its
|
||||
upstream `gitUrl` release artifacts when a matching release asset exists.
|
||||
Fall back to BeatMods CDN only for inaccessible/missing upstream assets,
|
||||
BeatMods-only packages, or framework/library dependencies. CDN URLs are:
|
||||
Follow the artifact policy for GitHub-first sourcing, BeatMods exceptions,
|
||||
and dependency closure. BeatMods CDN URLs are:
|
||||
|
||||
```text
|
||||
https://beatmods.com/cdn/mod/<zipHash>.zip
|
||||
```
|
||||
|
||||
For BSIPA bootstrap, expect the archive to contain root-relative `IPA/` and
|
||||
`IPA.exe` files whether sourced from GitHub or BeatMods. Extract it into the
|
||||
instance root and run `IPA.exe -n` under the same Proton environment used by
|
||||
the smoketest. This creates/copies the root `winhttp.dll` and root `Libs/`
|
||||
substrate that IPA needs.
|
||||
|
||||
For GitHub URLs, resolve the release from the user-provided repository or
|
||||
release URL only.
|
||||
|
||||
@@ -148,13 +121,7 @@ release URL only.
|
||||
unzip -l .state/instances/<instance>/downloads/<plugin-id>/<asset-name>
|
||||
```
|
||||
|
||||
Strategy guide:
|
||||
|
||||
- `dll-to-plugins`: asset is a single `.dll` that belongs in `Plugins/`.
|
||||
- `bsipa-zip`: zip top-level paths are only `IPA/`, `Libs/`, or `Plugins/`.
|
||||
- `root-zip`: zip contains valid game-root paths outside the BSIPA top-level set. Use this for BSIPA/bootstrap archives because `IPA.exe`, `IPA.runtimeconfig*.json`, and root `winhttp.dll` are game-root files.
|
||||
- `zip-to-pending`: only when the release is intended for `IPA/Pending/`.
|
||||
- `manual`: do not use for installable releases.
|
||||
Use the install strategy guide in the artifact policy.
|
||||
|
||||
6. Update the registry and lockfile.
|
||||
|
||||
@@ -188,9 +155,9 @@ release URL only.
|
||||
Always pass `--state-dir .state` so the helper uses the repo-local downloaded asset:
|
||||
|
||||
```bash
|
||||
PYTHONPATH=src python -m plugin_helper --state-dir .state check --instance <instance>
|
||||
PYTHONPATH=src python -m plugin_helper --state-dir .state plan --instance <instance> --plugin <plugin-id>
|
||||
PYTHONPATH=src python -m plugin_helper --state-dir .state apply <generated-plan-path>
|
||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --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 --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.
|
||||
@@ -200,41 +167,15 @@ release URL only.
|
||||
Confirm the installed file hashes match the plan or archive members:
|
||||
|
||||
```bash
|
||||
PYTHONPATH=src python -m plugin_helper --state-dir .state state --instance <instance>
|
||||
PYTHONPATH=src python -m plugin_helper --state-dir .state check --instance <instance>
|
||||
PYTHONPATH=src python -m unittest discover -s tests
|
||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --state-dir .state state --instance <instance>
|
||||
PYTHONPATH=src .venv/bin/python -m plugin_helper --state-dir .state check --instance <instance>
|
||||
PYTHONPATH=src .venv/bin/python -m compileall -q src tests
|
||||
PYTHONPATH=src .venv/bin/python -m unittest discover -s tests
|
||||
```
|
||||
|
||||
Use `PYTHONPATH=src`; plain `python -m unittest` may fail in this source-layout repo.
|
||||
|
||||
After any successful apply that changes a live BSManager instance, always
|
||||
run the documented live smoketest before the final response unless the user
|
||||
explicitly says not to. Do not stop at helper check, unit tests, compile
|
||||
checks, or file-hash verification for live installs. For live Beat Saber
|
||||
validation, follow `docs/SMOKETEST.md`. Before starting the launch, announce
|
||||
in agent chat how long the smoketest window will run for, using the current
|
||||
duration from `docs/SMOKETEST.md` unless the user requested a different
|
||||
duration. Do not rely on `timeout` to kill the full game process tree.
|
||||
Prefer the documented foreground Proton launch with a background watchdog
|
||||
that sleeps for the smoke window, then terminates Beat Saber by process
|
||||
name. Confirm `Logs/_latest.log` has the expected IPA/plugin lines and
|
||||
enough menu/UI initialization evidence for the plugin under test. If the
|
||||
game remains open after the watchdog cleanup, say so and ask the user to
|
||||
close it manually rather than leaving the turn with Beat Saber running.
|
||||
|
||||
For BSIPA/SongCore bootstrap, expected successful log lines include:
|
||||
|
||||
```text
|
||||
Game version <version>
|
||||
Loading plugins from Plugins and found <n>
|
||||
Beat Saber IPA (BSIPA): <version>
|
||||
SongCore (SongCore): <version>
|
||||
```
|
||||
|
||||
Warnings about older mod target game-version metadata can be acceptable when
|
||||
BeatMods verified that exact package for the target Beat Saber version, but
|
||||
record them in the tracker or roadmap. Also record when a BeatMods CDN
|
||||
artifact was used so it can be migrated to upstream GitHub later if possible.
|
||||
For live Beat Saber validation, follow the live-validation reference. Also
|
||||
record when a BeatMods CDN artifact was used so it can be migrated to
|
||||
upstream GitHub later if possible.
|
||||
|
||||
9. Final response.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user