Skip to content

9.0.0-alpha.6

Pre-release
Pre-release

Choose a tag to compare

@Griefed Griefed released this 23 Aug 09:59

⚠ BREAKING CHANGES

  • modscanning: remove the deprecated JsonBasedScanner

✂️ Refactor

  • adopt the Kotlin idioms Qodana flagged (d37fc61)
  • collapse the redundant conditionals Qodana flagged (4e16694)
  • use multi-dollar string literals for dollar-heavy patterns (98942b1), closes #106
  • api: compile the Forge annotation-scanner's regexes once (10a5811)
  • api: extract how a timeout is applied into URL.timedConnection (555e9c7)
  • api: extract manifest refreshing into ManifestUpdater (832bf43)
  • api: hoist the per-file path resolution out of the gatherer's walk (0e97be4)
  • api: index the Quilt scan by jar instead of searching it per entry (fca71d3)
  • api: inject PathsConfig's working directory (3c068ce)
  • api: make ModpackZipInspector's archive-opening injectable (8e0c840)
  • api: make the launcher-manifest candidates askable (765e1d5)
  • api: narrow ManifestUpdater to internal, and correct the timeout landmine (342e630)
  • app: extract the upload duplicate-check from saveUploadedFile (aa763be)
  • app: move the check-timer's server probe and pack-name read behind the view model (d6be4b5)
  • app: put the migration's database access behind MigrationStore (5afd12c)
  • app: split the suggestion parse out of allSuggestions (dd4c217)
  • grinder: drop the bind guards' !! and over-tight exception type (ad7aff5)
  • grinder: extract the Preferences-node claim from main() (7cd43b5)
  • grinder: extract the report URL from main() (e04c02e)
  • modscanning: extract the scanner contract and share the dispatch (d04a62a)
  • modscanning: remove the deprecated JsonBasedScanner (d132522)
  • web: extract the config-location composition from start() (18f25c6)

📔 Docs

  • add a CI secrets reference for the Forgejo workflows (5eeb4a7)
  • add BUILD.md, a contributor-facing map of the build (fd8d674)
  • add Kent Beck's ordering mantra to the conventions (52a192c)
  • answer the Docker/Mongo investigation's open question (21bab7f)
  • audit iteration 12 — the systemd home-resolution branch, and its resolutions (3e873af)
  • audit iteration 13 — the report bind-address branch, and its resolutions (1db4b60)
  • audit iteration 15 — third pass, auditing the first two passes' fixes (8ffc8bf)
  • audit iteration 16 — the deployment script and unit (03524c2)
  • audit the build-docs branch (fa3cdd1)
  • audit the context/documentation commits (iteration 10) (08728c2)
  • audit the coroutines/catalog branch, fourth pass (9560ec0)
  • audit the parallelMap/coroutines branch, post-remediation pass (b33da60)
  • audit the post-migration commits (iteration 8) (3db2fcc)
  • audit the readme-refresh and jpa-relics branches (c97ac45)
  • audit the remediation (iteration 9) (47bfaf0)
  • audit the security-manager branch, second pass (141dc20)
  • backlog the CLAUDE.md trim, deferred behind the open merges (3256fef)
  • bring root CLAUDE.md back under the large-memory floor (5f7298b), closes #1 #2
  • carry iteration 4's guards into the refactor-state table (35bcbdb)
  • carry iteration 6's guards into the refactor-state table (34331ad)
  • cite commit subjects in the audit report too, and record iteration 4 (f971438)
  • cite commit subjects instead of hashes, and correct the stale timeout landmine (2052180)
  • clear B30/B31/B32 from the backlog and record them (d37be2d)
  • close L3 in the audit after fixing it (8f3a51f)
  • close out audit findings H-1 and M-3 (1f7aef2)
  • close out the audit findings (96b802a)
  • Consolidate the two audit files into claude-docs/REFACTOR-AUDIT.md (eda82e2)
  • correct the id types in the published API spec (8796eaa)
  • correct the last copy of the clientside-workflow miscount (f9c9d88)
  • correct the marker rule — B35 was tried and does not work (0138f87)
  • correct the published run-configuration API shape (f391518)
  • correct two CLAUDE.md claims that outlived the backlog items behind them (6f7e95c)
  • load the build and CI landmines only when they apply (8dd6af0)
  • mark the lazy-loading saving as unverified, because it is (6c94565), closes claude-code#16299 #16299 #22170 #16299
  • point BUILD.md at where CI lives and what it needs (882f967)
  • record iteration 16's resolutions, and the JVM trap in the README (845fb63)
  • record M-2 as fixed and repair a stray edit in the audit (d56bb4e)
  • record that URI query parameters reach the driver again (a7cf04a)
  • record the build layout after the simplification (24e00c5)
  • record the catalog, [plugins] and Kotlin-unification work (57ba3f2)
  • record the equivalence audit, its method, and the two findings it surfaced (3e70bb4)
  • record the generation-throughput work, including the corrected estimates (53f3e12)
  • record the grinder's report bind address in the status table (7033c23)
  • record the GUI typing-path work (613b9ec)
  • record the index-creation landmine and iteration 5 (2955212)
  • record the network/startup work and backlog its follow-ups (aea1ea5)
  • record the parallelMap fix, the coroutines floor and the BOM landmine (1cc6c4b)
  • record the Qodana moderate cleanup and the two new pins (d280474)
  • record the render-vs-prop test rule, and why the tooltips stay untested (b0ee703)
  • record the systemd home-resolution trap and the ordering it depends on (bb6545b)
  • record the two API-shape changes the generation branch left unrecorded (17a621e)
  • record the web query-shape and DBRef-flattening work (e484a28)
  • record what actually blocks the configuration cache (5fc3ca3)
  • regenerate the API spec for the merged entities, and correct the suite counts (f158362)
  • regenerate the OpenAPI spec from the controllers (ef13d48)
  • stop CI-SECRETS.md pinning an install4j version it does not own (9832ace)
  • the paths: scoping works — verified, and the earlier test was the wrong one (fb96ea3), closes #16299 #22170
  • api: make the SKIP_JAVA_CHECK read intentional and guarded (c0b1457)
  • app: re-verify the Mongo URI landmine at the versions now resolved (e3289e3)
  • ci: record the release pipeline's two silent killers and the alpha-tag repair (7780da5)
  • deprecation: suppress the intentional 6.0.0 deprecation warnings (9f92e8a)
  • modscanning: record the scan-log-level rules (4f67393)
  • modscanning: record the shared dispatch and correct the versioning-scheme survey (d76e2ed)
  • readme: refresh stale content (d1ece9b)
  • updater: record the pre-release ordering fix (486976e)

📦 Other

  • Change logging to suggest report to author and include exception in log (6026f36)
  • ignore Claude Code's per-developer files (f32c820)
  • Please Please Please test your server packs before you release them (d858b8f)
  • Refactor audit thanks to Claude (bd62619)
  • Regenerate the license agreement for install4j-runtime 13.1 (1c90465)
  • Update-To-Date license agreement (2611aed)
  • web: drop the JPA/H2/JDBC relics from the Spring properties (24390e3)

🦊 CI/CD

  • add a [plugins] catalog section and alias it from the build scripts (a8f1588)
  • align springGradle with springBoot at 4.1.0 (f4dec99)
  • Bump install4j to 13 (2c8de2c)
  • bump Kover to 0.9.9 (96cb684)
  • bump the Kotlin compiler to 2.4.10 (f0bf003)
  • bump third-party library versions in the catalog (e55ddfe)
  • collapse the four Kotlin entries onto one version ref (2be03f8)
  • consume plugin markers in buildSrc instead of implementation artifacts (6325735)
  • declare repositories once, in settings.gradle.kts (260f6f0)
  • drop the orphaned io.spring.dependency-management plugin (66c77c0)
  • let Gradle provision the JDK for the modules, not just for buildSrc (efcfbc8)
  • move library versions into the version catalog (010e2f3)
  • move the version catalog to gradle/libs.versions.toml (3e4afb9)
  • remove cross-project configuration from the root build (689e4dc)
  • remove duplicated and dead build logic (7511673)
  • remove script-object captures from task actions (0c3da90)
  • replace plugin-example's configuration-time copies with a Copy task (2c48f22)
  • replace the configuration-time copies with real Copy tasks (2eccd20)
  • route nekodetector and the Boot BOM through the catalog (b4e6fe9)
  • scope publishing and signing to the api module (5992f57)
  • upgrade Gradle to 9.7.1 (2f6894a)
  • use lazy task references everywhere (45bce07)
  • fix the credentials and references the migration got wrong (d894362)
  • fix the ordering and re-run defects the first release would have hit (dfd4352)
  • make the Docker diagnostic name its runner, and record what B26-B29 still need (e295ee0)
  • move CI/CD to Forgejo, and retire GitLab CI (832eb46), closes forgejo#9203
  • stop a release publishing its prereleases' changelogs, and fail loudly on upload errors (d00d094)

🧪 Tests

  • make three guards that passed for the wrong reason actually bite (d3b20a0)
  • api: pin hasteBinPreChecks before it stops reading whole files (522ab1e)
  • api: pin home resolution against an unwritable working directory (ada7476)
  • api: pin how often a modpack archive's central directory is read (e79f0ee)
  • api: pin that a fresh install's fallback database-URI is usable (594cf5a)
  • api: pin that an unknown Java version drops the security-manager flag (0ff2784)
  • api: pin that an unreachable host leaves the present manifest intact (a189022)
  • api: pin that HTTP calls give up instead of hanging forever (13a4b97)
  • api: pin that parallelMap neither leaks a thread nor serialises (e55ba89)
  • api: pin that the fallback-list refresh gives up instead of hanging (8ba6484)
  • api: pin that the regex mod-lists are not shared between reads (40b0934)
  • api: pin that the writability probe cannot be defeated by a name collision (af939d0)
  • api: pin the cost of the clientside-exclusion loop (ac50171)
  • api: pin the Java-resolve and fail-safe guard in all three templates (63a0860)
  • api: pin what a manifest check costs (7dedca7)
  • app: assert the components that only work if Spring created them (a9ddf98)
  • app: characterize the EventService and RunConfigurationService store loops (d603378)
  • app: characterize VersionChecker's pre-release comparison (ec79084)
  • app: cover the migration runner's safety decisions (f021610)
  • app: pin how often the check-timer consults the network and the disk (6537259)
  • app: pin that a duplicate hash cannot break the upload check (7965520)
  • app: pin that an upload's duplicate-check does not scan the collection (57090e1)
  • app: pin that index creation is never a condition of starting up (ff83e6d)
  • app: pin that the autocomplete list is parsed once, not per keystroke (1e9c748)
  • app: pin that the database-URI key is one Spring Boot still reads (a2cdb9e)
  • app: pin that the declared upload-hash index is actually created (3a7efd6)
  • app: pin that the stats endpoint counts instead of scanning (0e0fc76)
  • app: pin that the update check gives up instead of hanging (b58f866)
  • app: pin the 9.0.0 migration for the renamed database property (4a84834)
  • app: pin the migrated collection's name against the mapping it mirrors (c7e9a40)
  • app: pin the two VersionChecker pre-release comparison defects (866c139)
  • app: read the shipped application.properties, not the test copy that shadows it (8ad9f2f)
  • frontend: assert the rendered mod-lists, not the props they came from (15b7754)
  • grinder: bound the ordering guard to main's own body (b4f5c4e)
  • grinder: pin that an already-bracketed IPv6 bind is not bracketed twice (badcc93)
  • grinder: pin that the SPC environment is claimed before the first log statement (4624a57)
  • grinder: pin that the unit tells the operator how to provide Java (68046d4)
  • grinder: pin the logged report URL for wildcard and IPv6 binds (041d3f9)
  • grinder: pin the report's bind address and its wiring (7b8e762)
  • grinder: pin the systemd unit against the variables the service reads (c618340)
  • modscanning: pin Forge scanner selection across both Minecraft schemes (f8cb89b)
  • modscanning: pin that a Forge mod without dependencies keeps its id (b0e52a3)
  • modscanning: pin the shared scanner dispatch directly (9a37368)
  • web: pin the eight-location Spring config chain (d321722)
  • web: replace WebServiceTest with a real application-context test (c8b5512)

🚀 Features

  • api: add configurable network timeouts (8af3540)
  • api: offer an ETag so the Forge manifest can answer 304 too (71c83c1)
  • app: add an indexed findBySha256 to the modpack repository (26f342e)
  • app: report the renamed database property when upgrading to 9.0.0 (2f91f5f)
  • build: cross-package the aarch64 AppImage, so it needs no arm runner (ee766bb)
  • ci: expire test.yml's artifacts instead of keeping them for 90 days (5b32620)
  • ci: link the Qodana report artifact from Discord, not the run page (1cd2ac2)
  • ci: put the report's expiry in the Discord message as a Discord timestamp (420a46b)
  • grinder: make the report's bind address configurable (f91cedf)
  • grinder: ship an example systemd unit and an installer (f9a0494)

🛠 Fixes

  • If no (Neo)Forge or Minecraft dependency is declared, assume sideness server (7abd7c8)
  • api: bound the fallback-list refresh (733db7c)
  • api: halve startup requests and skip unchanged manifests (5f92b63)
  • api: hand out a fresh regex mod-list per read (9b00946)
  • api: make the fallback database-URI a URI the driver accepts (add8982)
  • api: measure a HasteBin candidate without materialising it (b5add6c)
  • api: never resolve the home directory to a place SPC cannot write (b470496)
  • api: probe writability with a name nothing else can hold (79c34df)
  • api: read a modpack archive once per inspection (cd75f24)
  • api: refresh the version manifests in the background, not during construction (211dc83)
  • api: resolve Java after installing it, and fail safe when it is unknown (5f4bce2)
  • api: route every outbound call through one timed opener (5625223)
  • api: route the HasteBin POST through the shared opener too (e1a593e)
  • api: sanitise a network timeout once per assignment (9ef4191)
  • api: stop a bad regex aborting the mod-list, and hoist the loop invariants (f77a5c6)
  • api: stop parallelMap leaking a thread per call, and make it parallel (ae18f56)
  • api: write the database-URI under the key Spring Boot 4 actually reads (f509eed)
  • app: bound the update check's requests (27f544b)
  • app: cache the autocomplete parse, and stop reinstalling the LAF per keystroke (a7b3ff9)
  • app: count the stats totals instead of scanning three collections (13467fc)
  • app: create the declared indexes after startup, not during it (93cee51)
  • app: create the indexes the web module declares (327e458)
  • app: embed the run-configuration mod lists, and migrate what is stored (918ca03)
  • app: key the installer-probe memo on a Triple instead of NUL-delimited text (bc6c78c)
  • app: look an upload's hash up by index instead of scanning every modpack (4f82e4b)
  • app: stop the check-timer re-probing the network and re-parsing the manifest (e4ec252)
  • app: tolerate duplicate hashes in the upload duplicate-check (1b287ab)
  • build: declare mockk explicitly in -app so it matches -api (e732079)
  • build: declare the Java compilations on dokka's HTML publication too (dbcb80c)
  • build: import Boot's BOM as a platform so the catalog wins (3ab1abe)
  • build: keep the install4j plugin off buildSrc's compile classpath (6969313)
  • build: replace the Gradle APIs 9.7 deprecates and 10 removes (8a795b4)
  • ci: drop the Qodana Cloud token the project cannot have (d4af07b)
  • ci: keep the Forgejo token out of release-generate's remote URL (20cd6ed)
  • ci: make the sibling-container steps work under docker-in-docker (d21caeb)
  • ci: pin semantic-release's plugin majors so a preset bump can't break the release (97f487e)
  • ci: rename the Forgejo credentials off the reserved FORGEJO_ prefix (710e8ea)
  • ci: scope the Forgejo credential to the checkout, not the runner (5039fd7)
  • ci: stop running jobs inside tool containers, and drop the inert permissions (5bc0434)
  • ci: use Forgejo's patched artifact actions, which do not refuse a non-GitHub host (8830248)
  • docs: repair the broken KDoc links and drop a redundant inner modifier (b5dec4d)
  • grinder: close every finding from audit iteration 16 (70a10fd)
  • grinder: don't bracket an already-bracketed IPv6 bind, and stop --help truncating (6d4a86c)
  • grinder: harden the installer, and record audit iteration 14 (f158699)
  • grinder: make the logged report URL openable for wildcard and IPv6 binds (43249a6)
  • grinder: pin SPC's home to the daemon's base before anything logs (d4eec4b)
  • modscanning: log a jar with no descriptor at debug, keep real failures loud (30bcdc6)
  • modscanning: select the Forge scanner from the whole Minecraft version (4dbf653)
  • modscanning: treat an absent dependencies block as no dependencies (46a8a7b)
  • updater: order pre-releases by channel, and pick the latest by version (f6df209)

VirusTotal