feat(rust): RunicNPC as the Rust bundle's third artefact (runicnpc stage 4, D224) #37

Merged
whitlocktech merged 1 commits from feat/runicnpc-stage4 into main 2026-09-30 19:52:00 +00:00
Member

What

RunicNPC becomes a third file in the Rust bundle, pinned and checksummed like the bridge and the sidecar (D224).

  • compose-bundles.sh carries the latest RunicNPC release whose API is at least the bridge manifest's runicnpc_api, verified against its SHA256SUMS. It carries none, and says so in the summary, when:
    • the bridge needs no RunicNPC;
    • RunicNPC has not released;
    • its API is too old.
  • The installer reads the optional npc component, so older bundles still parse. It:
    • fetches the tarball and checks it against its own manifest;
    • places RunicNPC.cs before the bridge;
    • records it, puts it back on update when it was edited or deleted, and removes it on uninstall;
    • never touches data/RunicNPC/, the admins' placements;
    • reports it in doctor as a warning, since it is optional until RunicNPC's stage 9;
    • adds Kits to the required plugins it reports.
  • bundle.yml's header names RunicNPC among the dispatchers.

Tested

  • cargo fmt --check, clippy -D warnings, and 174 + 9 tests pass. New tests cover the bundle with and without npc, the tarball reader, and the record round trip.
  • The compose script was run against a mock Gitea in all three cases (RunicNPC at API 3, at API 2, not released). The composed document parses as the installer reads it.
  • The installer's RunicNPC path installs only from real releases, so like phase 18 it is walked at the cutover.

Pairs with

runicnpc-rust feat/stage-4-api3, Rust-Plugins (runicnpc_api), Rust-Link (the egg) and Module-Rust, plus the docs PR.

Checklist

  • I have read CONTRIBUTING.md.
  • The change builds and existing tests/checks pass locally.
  • I have added or updated tests/docs where it makes sense.
  • My commits are reasonably scoped with clear messages.
  • AI tools were used. Tool(s): Claude Code (Claude Opus 5.5). Commits carry the Co-Authored-By trailer.
  • I agree that my contribution is licensed under GPL-3.0-or-later.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

## What RunicNPC becomes a third file in the Rust bundle, pinned and checksummed like the bridge and the sidecar (D224). - **`compose-bundles.sh`** carries the latest RunicNPC release whose API is at least the bridge manifest's `runicnpc_api`, verified against its `SHA256SUMS`. It carries **none**, and says so in the summary, when: - the bridge needs no RunicNPC; - RunicNPC has not released; - its API is too old. - **The installer** reads the optional `npc` component, so older bundles still parse. It: - fetches the tarball and checks it against its own manifest; - places `RunicNPC.cs` **before** the bridge; - records it, puts it back on `update` when it was edited or deleted, and removes it on `uninstall`; - never touches `data/RunicNPC/`, the admins' placements; - reports it in `doctor` as a warning, since it is optional until RunicNPC's stage 9; - adds Kits to the required plugins it reports. - `bundle.yml`'s header names RunicNPC among the dispatchers. ## Tested - `cargo fmt --check`, `clippy -D warnings`, and 174 + 9 tests pass. New tests cover the bundle with and without `npc`, the tarball reader, and the record round trip. - The compose script was run against a mock Gitea in all three cases (RunicNPC at API 3, at API 2, not released). The composed document parses as the installer reads it. - The installer's RunicNPC path installs only from real releases, so like phase 18 it is walked at the cutover. ## Pairs with runicnpc-rust `feat/stage-4-api3`, Rust-Plugins (`runicnpc_api`), Rust-Link (the egg) and Module-Rust, plus the docs PR. ## Checklist - [x] I have read CONTRIBUTING.md. - [x] The change builds and existing tests/checks pass locally. - [x] I have added or updated tests/docs where it makes sense. - [x] My commits are reasonably scoped with clear messages. - [x] AI tools were used. Tool(s): `Claude Code (Claude Opus 5.5)`. Commits carry the `Co-Authored-By` trailer. - [x] I agree that my contribution is licensed under GPL-3.0-or-later. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-09-30 13:46:57 +00:00
feat(rust): RunicNPC as the Rust bundle's third artefact (runicnpc stage 4, D224)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 1m27s
ab2efb62e4
The compose job carries the latest RunicNPC release that answers the API the
bridge's manifest declares (runicnpc_api), verified against its SHA256SUMS
like the other two; none when the bridge needs none, RunicNPC has not
released, or its API is too old, each said in the summary. Walked against a
mock Gitea in all three cases.

The installer reads the optional npc component (older bundles still parse),
fetches and checks RunicNPC's tarball against its manifest, places
RunicNPC.cs before the bridge in each instance's plugins directory, records
it, puts it back on update when edited or deleted, reports it in doctor, and
removes it on uninstall. Its data directory is never touched. Kits joins the
required plugins it reports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech approved these changes 2026-09-30 19:51:54 +00:00
whitlocktech merged commit 2567cf5dd3 into main 2026-09-30 19:52:00 +00:00
whitlocktech deleted branch feat/runicnpc-stage4 2026-09-30 19:52:00 +00:00
Sign in to join this conversation.
No description provided.