Commit Graph
2 Commits
Author SHA1 Message Date
obscuremindandClaude Opus 5.5 e9b5299016 feat(update): patch builds, to ship fixes without a new release
A fix reached panels only with the next release, and a release is a
ceremony: a version bump, a changelog, a translation pass, a release PR.

A patch build is the release with the fixes made since, published as
X.Y.Z-pN by one run of the new Build Patch workflow from any ref: it picks
the release the ref contains, numbers the patch, runs the unit tests, stamps
the version into the build (as a nightly's is), builds the files a release
has and publishes them on the channel of the release it patches. Nothing is
prepared by hand.

The panel takes it as it takes a release, on MAIN and on load balancers:
- version_compare() already orders 2.6.5 < 2.6.5-p1 < 2.6.6. The release
  list is now ordered by version on every channel, not by publication: a
  patch of an older release is published after the release that follows it
  and must not hide it.
- An update, a pin and a rollback accept a patch version.
- A patch's changelog is read from its own asset.
- A module that asks for core X.Y.Z keeps loading on X.Y.Z-pN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AneTzAHPPkYWPQjwyZ2td9
2026-10-11 14:56:19 +00:00
Divarion_D be115bd053 feat(modules): enforce requires_core when loading, installing and updating
`requires_core` was only read and shown in the Modules table. A module
release that needs a newer core could be installed or updated anyway and
take the panel down, the update check offered such releases, and modules
left behind by a core rollback kept loading.

ModuleLoader::coreRequirementError() checks a manifest's constraint
(one or more `>= > <= < = == !=` conditions, a bare version meaning >=;
empty = any core; anything else unreadable and refused) against
XC_VM_VERSION, a nightly `X.Y.Z-dev.N` counting as X.Y.Z. It is applied:

- on load: the module is skipped with a log line, its dependents with it;
- on install (placeModuleFiles: zip, LB, standard set, platform) and on a
  git/url update: refused before the installed copy is touched; a refused
  copy the platform extracted into the modules directory is removed;
- in the update check: git offers the newest release whose module.json
  (repository root, read from raw.githubusercontent.com, up to 10 tags)
  this core can run, url honours requires_core in version.json;
- in the Modules table: the reason on the existing warning badge, now
  labelled "Issue(s)".

The checks sit in small helpers, so discoverModules() and
updateModuleFromSource() come out simpler than before.
2026-10-04 11:59:43 +03:00