Restore all published Manager changelogs and keep release notes synchronized

This commit is contained in:
Дмитрий committed 2026-10-20 06:34:11 +05:00
1 parent 4a88f696a0
commit 1f5ff0a198
9 files changed
+1424 -27

No files matched your search

+41 -8
View File
@@ -1,14 +1,47 @@
name: changelog
# Checks the changelog.d/ fragment files with the shared rules (https://github.com/Corfirean/coa-server-build/blob/main/changelog/GUIDE.md).
on:
push:
paths: ['changelog.d/**']
branches: [master]
paths: [tools/sync_history.py, changelog/history.json, .github/workflows/changelog.yml]
pull_request:
paths: ['changelog.d/**']
paths: [tools/sync_history.py, tools/test_sync_history.py, changelog/history.json, .github/workflows/changelog.yml]
release:
types: [published, released]
workflow_run:
workflows: [release]
types: [completed]
workflow_dispatch:
permissions:
contents: read
contents: write
concurrency:
group: component-changelog
cancel-in-progress: false
jobs:
check:
uses: Corfirean/coa-server-build/.github/workflows/changelog-check.yml@main
test:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- run: python3 -m unittest discover -s tools -p test_sync_history.py
sync:
needs: test
if: github.event_name != 'pull_request' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.event.repository.default_branch }}
fetch-depth: 0
- name: Synchronize this component from published immutable sources
run: python3 tools/sync_history.py --sync-release-notes
- name: Commit updated history
run: |
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add CHANGELOG.md changelog/history.json
if git diff --cached --quiet; then exit 0; fi
git commit -m 'Update published Manager changelog'
git push origin HEAD:"${{ github.event.repository.default_branch }}"
+1 -2
View File
@@ -3,8 +3,7 @@
<!-- changelog:start (managed by coa-server-build/changelog/changelog.py sync-instructions) -->
## Changelog (shared by all CoA repositories)
Every CoA project (server fork, bots, Content Scaling, Manager, renderer) feeds **one** changelog that is posted to the
community. When you finish a change that a **player** or a **server owner** would notice (a new feature, a changed
Every CoA project (server fork, bots, Content Scaling, Manager, renderer) uses the same fragment format. **Manager and server release histories are separate**; each repository publishes only its own shipped component changes. When you finish a change that a **player** or a **server owner** would notice (a new feature, a changed
behaviour, a fix for something people ran into, a removed feature, a known issue), add **one small file to
`changelog.d/` in the same commit**. Do not add one for internal work (refactors, tests, CI, documentation).
+290 -15
View File
@@ -1,25 +1,300 @@
# CoA Server Manager changelog
Manager releases only. Updating the Manager does not update the server.
[Server changelog](https://github.com/Corfirean/coa-server-build/blob/main/CHANGELOG.md)
Dates follow GitHub publication (UTC); legacy records retain their archived dates. Newest releases first.
## 0.6.22 — 2026-10-19
- Updated Custom Races client patches to 1.8.
- Included the updated race appearance and cursor addons.
- Existing client files are preserved when installing or removing race patches.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.22) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.21...v0.6.22)
## 0.6.21 — 2026-10-16
- Server updates apply migrations once after saving a recovery point.
- Older server versions update directly without installing intermediate packages.
- Update validation recognizes an already stopped server.
- Recorded core SQL stays applied after old history tables are cleaned up.
- Switching realms no longer repeats shared account database updates.
- Update offers distinguish version support from database validation.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.21) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.19...v0.6.21)
## 0.6.19 — 2026-10-16
- Update checks no longer download a server archive to compare its launcher.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.19) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.18...v0.6.19)
## 0.6.18 — 2026-10-16
- Older servers find a tested intermediate update instead of being blocked.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.18) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.17...v0.6.18)
## 0.6.17 — 2026-10-15
- Already running MySQL is recognized before startup readiness checks.
- New servers install the current stable build directly.
- Install the matching client patches for Grummle.
- Failed repairs restore the previous server after final verification errors.
- Failed server updates show an error on the Overview screen.
- Private update checks show preparation stages and stop failure details.
- Repair recovery copies preserve all bundled database objects and accounts.
- Server checks report interrupted SQUID database imports.
- Shutdown remains available when startup templates or database records are damaged.
- Successful server repairs no longer block later server actions.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.17) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.16...v0.6.17)
## 0.6.16 — 2026-10-13
- Linux Docker servers follow Settings, sharing and backups (experimental).
- Local hosts can connect while sharing a server online.
- Custom race client installation follows the current upstream release.
- Docker friend mode requests a restart when remote client support changes.
- Module cards show installed server revisions and the client race patch version.
- Server updates accept long Windows paths inside the private test server.
- Diagnostics record blocked startup requests and maintenance owner information.
- Client race patches can be repaired and removed while preserving original files.
- Checking an already installed server update no longer reports incompatibility.
- Failed server startup shows service errors even when the launcher reported ready.
- Starting the server waits for update checks and identifies ongoing maintenance.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.16) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.15...v0.6.16)
## 0.6.15 — 2026-10-11
- Large server updates no longer repeatedly rewrite the recovery journal.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.15) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.14...v0.6.15)
## 0.6.14 — 2026-10-11
- Fixed server update checks failing with long Windows paths.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.14) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.13...v0.6.14)
## 0.6.13 — 2026-10-11
- Failed server startup after an update automatically restores the previous version.
- Windows update recovery preserves database procedures triggers and views.
- Custom races bot setting synchronizes Playerbots excluded race lists.
- Blocked updates identify database objects that prevent automatic recovery.
- Updates can follow signed channels that select a complete server release.
- Server updates check startup privately before allowing players to connect.
- Updates repair missing database defaults from the verified release schema.
- Server updates no longer replay module installation scripts on existing databases.
- Windows server updates are tested on a private copy before changing your installation.
- Server updates can require a tested combination of platform and installed version.
- Failed database checks keep a complete report after rollback.
- Players can install custom race patches when connecting to a friend.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.13) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.12...v0.6.13)
## 0.6.12 — 2026-10-10
- Background world servers no longer stop because the local console is closed.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.12) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.11...v0.6.12)
## 0.6.11 — 2026-10-10
- Server and Bots settings open without a blank window.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.11) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.10...v0.6.11)
## 0.6.10 — 2026-10-10
- Custom race client patches update to the latest races and appearances.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.10) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.9...v0.6.10)
## 0.6.9 — 2026-10-10
- Custom races can be enabled and their client patches installed from Modules.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.9) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.8...v0.6.9)
## 0.6.8 — 2026-10-10
- Linux: install from the install screen, play with Wine or Proton (experimental).
- A failing database update is no longer reported as "database not running.
- Unsaved settings are protected and crashed servers can restart automatically.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.8) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.7...v0.6.8)
## 0.6.7 — 2026-10-08
- Choose where backups are stored, for example on another drive.
- Bot settings with a fixed list of values show a drop-down.
- The bot dashboard loads completely and can be opened in the browser.
- Accounts of the SQUID bots are hidden from the Accounts list.
- A Dashboard tab shows what the SQUID bots are doing.
- A stopped server stays stopped after an update, unless you ask it to start.
- Checking for updates no longer fails with "Something went wrong" after a crash.
- Server updates no longer stop with "has a different checksum" on the Wildcard repair.
- A world server started from the coa-bots folder is recognised.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.7) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.6...v0.6.7)
## 0.6.6 — 2026-10-07
- Install a server from a package on Linux, running in Docker (experimental).
- The Auction House Bot card no longer asks for a character GUID.
- Choose and remember the local network address friends use to connect.
- The NPC Enchanter card explains how to place and remove the NPC.
- Diagnostic files with database checks stay readable after secrets are removed.
- One button collects all diagnostics, including crashes and Windows crash records.
- Problem reports go to the right project.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.6) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.5...v0.6.6)
## 0.6.5 — 2026-10-06
- Imported SquidBots servers warn before replacing their original binary.
- SquidBots settings follow the options shipped by the module.
- SquidBots shows its bundled release and includes it in problem reports.
- Server updates accept verified published migration variants without rerunning them.
- Server updates replace older launchers adapted by the Manager for Wildcard.
- Older server packages cannot replace a newer installation.
- Checking again no longer offers an already installed launcher update.
- Large SQUID database imports have more time to finish on first startup.
- Update history conflicts are detected before server files change.
- Pending database updates remain visible when the server version matches.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.5) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.4...v0.6.5)
## 0.6.4 — 2026-10-05
- Start your installed server or client without downloading an available update.
- Finish a server update that was blocked by a startup failure.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.4) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.3...v0.6.4)
## 0.6.3 — 2026-10-04
- Configure partial dungeon parties and open-world life steal in module settings.
- Download and update the game client without installing a server.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.3) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.2...v0.6.3)
## 0.6.2 — 2026-10-04
- Choose which item types the auction bot sells.
- Module settings now offer translated controls and an enemy damage slider.
- Failed server updates restore databases and files together.
- Configure SQUID Playerbots and prevent conflicting bot systems.
- Server packages must include a complete database schema check.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.2) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.1...v0.6.2)
## 0.6.1 — 2026-10-04
- PLAY launches only the client with the selected realmlist; starting the local server remains a separate action.
- Server multipliers accept decimals typed with a dot or comma. Talent and rested experience descriptions now explain their actual behavior.
- Added database and file checks, and Repair with backups and signed package verification. Unresolved schema damage is reported instead of guessed repairs.
- Fixed character database rebuilds retaining migration history that could skip required SQL. Applied migration hash changes are now rejected.
- Added optional simultaneous CoA and Wildcard worlds on Windows, with separate processes, ports and status indicators.
- Server multipliers now accept decimals typed with a dot or comma.
- Play launches only the game client without starting your local server.
- Check database structure and repair server files with a safety backup.
- Start CoA and Wildcard together from Settings.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.1) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.6.0...v0.6.1)
## 0.6.0 — 2026-10-03
- Added Simplified Chinese for the interface and all server and bot settings.
- The closed game client now follows the selected CoA or Wildcard realm. Play checks the saved realm before launching; existing settings are preserved and backed up.
- Fixed GitHub reports opening Windows Explorer instead of the default browser. Long reports use the clipboard fallback.
- Fixed configuration snapshots created in the same millisecond overwriting each other during restore.
- Added experimental Linux startup: persistent state uses the XDG data folder, Tailscale detection supports Linux, and a Wayland rendering workaround respects existing user settings.
- Added experimental start, stop and status controls for manually prepared Docker servers, with private database networking and a remote console bound to localhost.
- Linux extraction restores executable permissions for ELF binaries and scripts, and paths retain case-sensitive filesystem semantics.
- The game client follows the realm selected in the Manager.
- Configuration snapshots no longer overwrite each other.
- Experimental Linux startup and Docker server controls.
- Problem reports open in the default browser.
- Simplified Chinese is available in the Manager.
### Availability
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.0) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.5.0...v0.6.0)
This release ships the Windows installer and signed updater assets. Linux support is a development preview, not a one-click installation flow. Docker installation/database setup, SQL operations and backups, updates, Wildcard realm profiles, and Wine/Proton client launching remain unfinished. Servers must be prepared manually and use Linux binaries built with the packaged configuration layout.
## 0.5.0 — 2026-10-03
Server shutdown and starting-zone scaling issues require separate server releases and are not fixed by updating the Manager alone.
- Imported servers get the module config files they lack.
- Modules marked Soon stay greyed out.
- The Bots page is hidden when the module is not on the server.
- Updating the game client shows a progress bar on its button.
- Switch between CoA and Wildcard while keeping separate characters and module settings.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.5.0) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.4.0...v0.5.0)
## 0.4.0 — 2026-10-02
- Added module cards with switches and settings.
- Added searchable server settings and appearance and collection controls.
- Added account deletion with confirmation.
- Fixed update checks offering an already installed version.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.4.0) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.3.1...v0.4.0)
## 0.3.1 — 2026-10-01
- Added named realmlists and a switcher beside Play.
- Added account management and a prefilled GitHub problem-report form.
- Server updates continue when leaving the settings page.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.1) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.3.0...v0.3.1)
## 0.3.0 — 2026-10-01
- Download and update the game client through the Manager while preserving custom files.
- Server updates are checked automatically and offered on Overview.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.0) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.2.0...v0.3.0)
## 0.2.0 — 2026-10-01
- Added companion creation progress and controls to stop creation, take bots offline or remove them.
- Choose how many bots log in when the server starts.
- Added a control to log out a chosen number of bots and reduce server load.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.2.0) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.6...v0.2.0)
## 0.1.6 — 2026-09-30
- Overview shows world speed.
- Improved companion setup, including requests made while the server is stopped.
- Expanded translated settings and connection guides.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.6) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.4...v0.1.6)
## 0.1.4 — 2026-09-30
- Sharing settings are reapplied before server startup.
- Added a restart shortcut after enabling play with friends.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.4) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.3...v0.1.4)
## 0.1.3 — 2026-09-30
- The interface scales with the window.
- Each friend connection mode shows the realmlist line to use.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.3) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.2...v0.1.3)
## 0.1.2 — 2026-09-30
- Manager updates download in the background and install when the app closes.
- Missing module configuration files are created from the supplied defaults.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.2) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.1...v0.1.2)
## 0.1.1 — 2026-09-30
- Added translations throughout setup, server updates, backups, diagnostics and settings.
- Added clearer errors when server packages are unavailable or a server cannot be reached.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.1) · [Source changes](https://github.com/Corfirean/coa-server-manager/compare/v0.1.0...v0.1.1)
## 0.1.0 — 2026-09-30
- Initial Windows release: install or import a server and manage startup from one app.
- Configure server and bot settings, manage accounts, create backups and restore saved data.
- Launch the game client, set up sharing with friends and collect diagnostics.
[Release](https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.0)
+5
View File
@@ -57,6 +57,11 @@ Download the installer from the [Releases](https://github.com/Corfirean/coa-serv
and run it. You need about 10 GB of free disk space for the server. The game client (about 43 GB) is separate: point the
Manager at the one you have, or let it download one for you.
## Changelog
[Manager release history](CHANGELOG.md) · [Server release history](https://github.com/Corfirean/coa-server-build/blob/main/CHANGELOG.md).
Manager and server updates have separate version histories.
## Status
Phases 0–10 of the plan in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) are done: foundation, import, start/stop,
+1 -2
View File
@@ -1,7 +1,6 @@
# changelog.d
One small Markdown file per change that a player or a server owner would notice. They are collected from every CoA
repository when a release is made. The rules and the file format are in `AGENTS.md` (section "Changelog") and, in full,
One small Markdown file per change that a player or a server owner would notice. Server and Manager releases collect only their own shipped changes from immutable sources; their public histories are separate. The rules and the file format are in `AGENTS.md` (section "Changelog") and, in full,
in https://github.com/Corfirean/coa-server-build/blob/main/changelog/GUIDE.md
This README is ignored by the collector.
@@ -0,0 +1,200 @@
[
{
"tag": "v0.6.22",
"date": "2026-10-19T07:49:11Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.22",
"body": "## Manager\r\n- Updated Custom Races client patches to 1.8, including Drakkin, Drakonid and updated racial abilities\r\n- Added updated race appearances and cursor addons\r\n- Existing client files are preserved when installing or removing race patches\r\n\r\nPrepared from commit 65df6604846d5492e40a6b08a797199478666e24. Installer and updater signature were verified before publication.\r\n"
},
{
"tag": "v0.6.21",
"date": "2026-10-16T12:11:35Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.21",
"body": "## Manager\n- Older server versions update directly to the latest signed package without installing intermediate releases.\n- The published source-version list records release test coverage; a missing entry no longer blocks an older installation by itself.\n- Apply only missing database migrations, preserving recorded AzerothCore history and sharing account migration history between Solo and Wildcard.\n- Save one complete recovery point, apply SQL once and check the database schema, startup, account and character identities. Restore files and databases on failure.\n- Keep unknown imported versions, interrupted migrations, changed SQL checksums, downgrades and incompatible packages blocked.\n- Remove the nested per-update server rehearsal and recursive intermediate-package lookup.\n\nInstalling this Manager does not update your server automatically. Unknown third-party repacks still require a verified starting state; this release does not guess which unrecorded SQL was applied manually.\r\n\nValidation: 11 package-based scenarios passed against Server 0.261015.58, including the earliest base and a repeated current-version check. A separate direct 800006 -> 58 upgrade on an isolated copy preserved all 133 account and 3123 character identities. No client login or gameplay acceptance was performed.\n\r\n"
},
{
"tag": "v0.6.19",
"date": "2026-10-16T02:37:16Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.19",
"body": "## Manager\n- Update checks no longer download a full server package just to verify the launcher\n- Concurrent update checks wait briefly for the current check instead of immediately reporting another operation\n- Update rehearsals check the combined space required for program files and databases before creating the private copy\n\nIncludes the signed intermediate upgrade path from v0.6.18 for older server installations.\n\nThis release updates the Manager only. Existing server files and databases are not changed by installing it.\r\n"
},
{
"tag": "v0.6.18",
"date": "2026-10-16T00:33:21Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.18",
"body": "## CoA Server Manager 0.6.18\n\n- Fixed update checks blocking older server versions when a tested intermediate release is available\n- Manager now offers the required intermediate update automatically and explains how to continue to the latest stable version\n- Intermediate packages must match the signatures and manifest hashes recorded in the target release's compatibility matrix\n- Unsupported source errors now identify the installed version, target version and directly supported versions\n\nFor servers on **0.261011.800006**, Manager offers **0.261013.54** first. After it completes, check for updates again to install **0.261015.58**. Clear any manually entered Advanced package source to use automatic selection.\n\nThe server package and stable channel have not changed. Existing data follows the normal backup and verified update process.\n"
},
{
"tag": "v0.6.17",
"date": "2026-10-15T16:51:52Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.17",
"body": "## CoA Server Manager 0.6.17 / Server 0.261015.58\n\n### Manager\n\n- New servers now install the current stable build directly, without installing 2.0 first\n- Fixed completed repairs leaving the server stuck in a maintenance state\n- Servers can now stop even when startup templates or MySQL process records are damaged\n- Repair now preserves database accounts, views, procedures and triggers, with improved rollback after failures\n- Interrupted SQUID database imports are now reported by Check and Repair\n- Update errors remain visible on Overview, with technical details and a copy button\n- Improved update preparation progress and diagnostics for shutdown failures and port conflicts\n- Updated Custom Races client patches to 1.7 while preserving existing race assets\n\n### Server\n\n- Integrated 34 CoA upstream commits\n- Updated Custom Races to 1.7, adding playable Grummle and their racial abilities\n- Updated SQUID Playerbots to 2.3.1\n- Added complete installation packages for the current server release\n- Improved shutdown recovery and startup configuration errors\n\n### Content scaling\n\n- Creature health settings are now respected while Content Scaling is enabled\n"
},
{
"tag": "v0.6.16",
"date": "2026-10-13T12:39:15Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.16",
"body": "**Manager** (for server owners)\n- Added: Linux Docker servers follow Settings, sharing and backups (experimental). Experimental. Settings the Docker backend fixes are hidden, friends sharing and logs work, the game data folder can be changed, and the realm no longer shows offline after a start.\n- Added: Updates can follow signed channels that select a complete server release. The Manager checks the channel signature and downloads every package part from the same release. Existing installations continue using the previous download source until the new channel is published.\n- Added: Windows server updates are tested on a private copy before changing your installation. The Manager tests migrations and server startup using your databases and configurations. A failed rehearsal leaves the installed server unchanged and preserves a diagnostic report.\n- Added: Server updates can require a tested combination of platform and installed version. Signed release metadata identifies core and module revisions, supported starting versions and database contracts. Incompatible packages are rejected before shutdown; changed schema contracts and incompatible databases block installation before migration.\n- Added: Module cards show installed server revisions and the client race patch version. Module revisions come from the currently installed release metadata. The race card shows the client patch version separately; missing version metadata is reported honestly instead of showing a download version as installed.\n- Changed: Failed server startup after an update automatically restores the previous version. The Manager restores server files and databases, then checks the recovered server. If recovery cannot be confirmed, it preserves the recovery point and blocks further startup until the problem is resolved.\n\n----- next message -----\n\n**Manager** (for server owners) (cont.)\n- Fixed: Windows update recovery preserves database procedures triggers and views. A verified copy of stopped MySQL restores all databases and accounts together. Interrupted restoration can be retried, and the replaced database directory is retained.\n- Fixed: Custom races bot setting synchronizes Playerbots excluded race lists. The \"Bots can be custom races\" setting now configures AiPlayerbot.ExcludedBotRaces in playerbots.conf. Off excludes all added races (recommended), while on allows stable added races (experimental).\n- Fixed: Blocked updates identify database objects that prevent automatic recovery. Diagnostics include the complete list of unsupported database objects across the recovery point, helping resolve update failures without removing user data.\n- Fixed: Server updates check startup privately before allowing players to connect. Startup checks use temporary local ports. Original settings are restored before opening the server, and interrupted checks retain a recovery journal.\n- Fixed: Local hosts can connect while sharing a server online. The Manager no longer replaces the realm's local address with its public address when Friends mode is enabled.\n- Fixed: Updates repair missing database defaults from the verified release schema. Only missing literal defaults are restored when column properties match. Existing rows, custom defaults, types and nullability are preserved; unresolved incompatibilities still block the update.\n- Fixed: Server updates no longer replay module installation scripts on existing databases. Update packages contain incremental SQL only. Module table initialization and seed scripts remain available when preparing a clean installation, preventing existing content from being reset during updates.\n\n----- next message -----\n\n**Manager** (for server owners) (cont.)\n- Fixed: Failed database checks keep a complete report after rollback. Schema errors show readable default values and save every detected difference for troubleshooting, including after the server is restored.\n- Fixed: Large server updates no longer repeatedly rewrite the recovery journal. Updates containing rebuilt navigation data now prepare all recovery copies before replacing files. Interrupted updates remain recoverable without rewriting the full journal for every file.\n- Fixed: Normalize rehearsal server roots to prevent Windows path prefix errors. Server update rehearsals now canonicalize the installation root before collecting files, resolving a \"prefix not found\" error during rehearsal preparation on Windows.\n- Fixed: SQUID imports character tables first and reports slow database imports. SQUID prepares character tables before its large travel data. Startup shows each base import and identifies a failed import without starting the world server or replaying an incomplete migration.\n- Fixed: Docker friend mode requests a restart when remote client support changes. Enabling remote CoA clients now requests a world restart even when the game ports were already open. Repeating the same unchanged setting does not request another Line truncated
},
{
"tag": "v0.6.15",
"date": "2026-10-11T23:10:59Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.15",
"body": "## Fixes\n\n- Large server updates, including rebuilt maps, vmaps and mmaps, no longer rewrite the complete recovery journal for every file.\n- All recovery copies are prepared before replacing any server file. Interrupted updates still restore the previous files and remove newly created files only when their content matches the update.\n\nValidated by Windows and Linux CI, the full Manager test suite, and a regression covering power loss during file replacement and incomplete recovery-copy preparation.\n\nUpdate the Manager before installing the navigation refresh. Portable Characters and Portable Session Bridge are not included."
},
{
"tag": "v0.6.14",
"date": "2026-10-11T21:14:34Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.14",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.13",
"date": "2026-10-11T14:03:44Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.13",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.12",
"date": "2026-10-10T03:10:14Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.12",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.11",
"date": "2026-10-10T03:05:20Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.11",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.10",
"date": "2026-10-10T02:07:18Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.10",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.9",
"date": "2026-10-10T01:50:51Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.9",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.8",
"date": "2026-10-10T01:05:56Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.8",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.7",
"date": "2026-10-08T04:59:31Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.7",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.6",
"date": "2026-10-07T05:47:46Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.6",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.5",
"date": "2026-10-06T06:17:21Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.5",
"body": "# CoA Server Manager 0.6.5 / Server 0.261006.1\n\nUpdate CoA Server Manager to 0.6.5 first, then update the server. This server package requires Manager 0.6.5.\n\n## Server updates and recovery\n\n- Recognize known, signed historical migration checksums without rewriting migration history or replaying applied SQL.\n- Check migration history and SQL files before replacing server files. Interrupted or failed migrations still require recovery.\n- Preserve damaged update records and protect recovery points belonging to unfinished updates. Check saved copies before restoring them.\n- Refresh saved update status after update and recovery attempts, including failures.\n- Recognize launcher adjustments made by the Manager, including older Wildcard launchers. Custom edits still require a choice.\n- Stop offering an already installed launcher update after checking again.\n- Reject older server packages. Use the update's recovery point to undo an update.\n- Restore missing Wildcard card and specialization-cache tables through a new corrective migration, preserving existing tables and data.\n- Fix launcher integration imports when using the server's isolated Python runtime.\n\n## SQUID Playerbots\n\n- Include SQUID Playerbots v1.8.1 together with the matching core, launcher and Manager integration.\n- Provide translated bot settings, release information and controls for the active bot system. Prevent conflicting bot systems from starting together.\n- Include the SQUID database in recovery points when installed.\n- Keep servers with SQUID disabled independent of its database startup hooks.\n- Detect unfinished initial database imports instead of treating partially imported tables as complete.\n- Allow more time for large SQL imports and initial bot creation. The Manager startup deadline is up to 45 minutes when SQUID is enabled; ordinary startup deadlines are unchanged.\n- Preserve historical SQL files and migration history. Only new migrations are applied.\n- Require an explicit keep-or-replace decision when updating imported server binaries protected by their original launcher or updater.\n\n## Local candidate validation\n\nThe signed final package passed an update and startup of both CoA and Wildcard on a marked disposable installation. Selected account, character and inventory fields were preserved, historical migrations were skipped, and a repeated update check was clean. Fresh SQUID database import and repeated startup were checked using the same native binaries and SQL as the final package.\n"
},
{
"tag": "v0.6.4",
"date": "2026-10-05T09:22:40Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.4",
"body": "Fixes server updates that failed to start with the repack's bundled Python runtime.\n\nIf an update is waiting for recovery, open Settings → Server updates and choose **Retry server startup**. Successful validation finishes the already applied update without replaying database migrations. Rollback remains available if validation fails.\n\n**Start without updating** and **Play without updating** let you use the installed server or client when a newer version is available. Interrupted server updates still require recovery.\n\n[Shared changelog](https://github.com/Corfirean/coa-server-build/blob/main/CHANGELOG.md)\n"
},
{
"tag": "v0.6.3",
"date": "2026-10-04T22:41:10Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.3",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.6.2",
"date": "2026-10-04T21:54:32Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.2",
"body": "## Manager 0.6.2\n\n- Server Update and Repair now back up databases before changes and recover databases, files and version metadata together after a failed update.\n- Database checks detect missing Wildcard tables even when migration history says the SQL ran. New server packages include the expected full database schema.\n- Interrupted or failed SQL is not blindly replayed; unresolved recovery is reported before another update or server start.\n- Checks cover race/class starting data and existing character visibility.\n- Adds the bot and module settings included in the reviewed dependency, including SQUID settings and translated controls.\n- Includes the latest Docker database-access changes.\n\nInstall/update Manager first, then update the server package. Run Settings → Check files and database if an existing installation reports database problems. Already lost database rows require a backup; restoring table structure cannot recreate them.\n\nValidation: 233 core tests passed locally after merging current master; workspace check and frontend build passed. Release package verification used disposable MySQL and a signed server package.\r\n\n\nShared release changelog: https://github.com/Corfirean/coa-server-build/blob/main/CHANGELOG.md\n\r\n"
},
{
"tag": "v0.6.1",
"date": "2026-10-04T10:58:56Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.1",
"body": "## Changes\n\n- PLAY launches only the game client with the selected realmlist. Use START SERVER separately for your local server.\n- Decimal server multipliers can be typed with either a dot or a comma.\n- Talent settings explain that the standard AzerothCore multiplier does not affect CoA talent points; rested experience settings describe accumulation correctly.\n- Added file/database checks and Repair with backups, verified official packages and reports of unresolved schema damage.\n- Fixed stale character migration history after rebuilding a character database and reject changed hashes of already applied migrations.\n- Added optional simultaneous CoA and Wildcard worlds on Windows, with separate processes, ports, logs and status indicators.\n\n## Notes\n\nRepair requires a stopped server and matching currently published packages. It preserves player data and settings; unsupported schema repairs are reported for corrective migrations.\n\nSimultaneous worlds require a compatible Wildcard server build. Existing Linux/Docker support remains experimental; simultaneous worlds are Windows-only.\n\nDownload the Windows installer below, or let an existing Manager installation update automatically. Server packages are updated separately.\r\n"
},
{
"tag": "v0.6.0",
"date": "2026-10-03T18:06:31Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.0",
"body": "# CoA Server Manager changelog\r\n\r\n## 0.6.0 — 2026-10-03\r\n\r\n- Added Simplified Chinese for the interface and all server and bot settings.\r\n- The closed game client now follows the selected CoA or Wildcard realm. Play checks the saved realm before launching; existing settings are preserved and backed up.\r\n- Fixed GitHub reports opening Windows Explorer instead of the default browser. Long reports use the clipboard fallback.\r\n- Fixed configuration snapshots created in the same millisecond overwriting each other during restore.\r\n- Added experimental Linux startup: persistent state uses the XDG data folder, Tailscale detection supports Linux, and a Wayland rendering workaround respects existing user settings.\r\n- Added experimental start, stop and status controls for manually prepared Docker servers, with private database networking and a remote console bound to localhost.\r\n- Linux extraction restores executable permissions for ELF binaries and scripts, and paths retain case-sensitive filesystem semantics.\r\n\r\n### Availability\r\n\r\nThis release ships the Windows installer and signed updater assets. Linux support is a development preview, not a one-click installation flow. Docker installation/database setup, SQL operations and backups, updates, Wildcard realm profiles, and Wine/Proton client launching remain unfinished. Servers must be prepared manually and use Linux binaries built with the packaged configuration layout.\r\n\r\nServer shutdown and starting-zone scaling issues require separate server releases and are not fixed by updating the Manager alone.\r\n"
},
{
"tag": "v0.5.0",
"date": "2026-10-03T06:26:08Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.5.0",
"body": "## CoA and Wildcard realm profiles\n\nChoose CoA or Wildcard on Overview. The first Wildcard switch creates a separate world and empty character database; accounts are shared. Only one world runs at a time. Switching a running server saves characters and restarts it, and returning to CoA restores its module settings.\n\n- Requires a server build and database migrations with Wildcard support. Existing destination databases or realm ID 2 are preserved and block automatic creation.\n- CoA companion bots are unavailable on Wildcard. Content Scaling and other optional modules remain experimental there.\n- Backups cover both realms; restores identify their realm. Server migrations update both realms and shared auth once.\n- Configuration switches support recovery after interruption.\n\nValidation: 178 Rust tests, frontend build and translation checks, native isolated-fixture creation/start/switch, full backup, restore and migration checks. Final real-clock Wildcard gameplay verification: four scenarios passed with zero failures and zero isolated reruns (first login, level rolls, skill-card rolls, stats). Module gameplay compatibility beyond those scenarios remains unverified.\n\nDownload the Windows installer below. Existing Manager installations receive the signed update automatically. [Details and demo](https://github.com/Corfirean/coa-server-manager/blob/v0.5.0/docs/WILDCARD.md).\r\n\r\n"
},
{
"tag": "v0.4.0",
"date": "2026-10-02T16:51:50Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.4.0",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.3.1",
"date": "2026-10-01T11:44:28Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.1",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.3.0",
"date": "2026-10-01T03:13:59Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.0",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.2.0",
"date": "2026-10-01T00:58:01Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.2.0",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.6",
"date": "2026-09-30T18:16:06Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.6",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.4",
"date": "2026-09-30T15:04:30Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.4",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.3",
"date": "2026-09-30T14:55:17Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.3",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.2",
"date": "2026-09-30T11:06:53Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.2",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.1",
"date": "2026-09-30T07:40:42Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.1",
"body": "See the assets to download the installer. Existing installations update themselves."
},
{
"tag": "v0.1.0",
"date": "2026-09-30T07:03:22Z",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.0",
"body": "See the assets to download the installer. Existing installations update themselves."
}
]
+576
View File
@@ -0,0 +1,576 @@
{
"schema": 1,
"component": "manager",
"repository": "Corfirean/coa-server-manager",
"consumedFragments": [
"Corfirean/coa-server-manager:20261002-collections-tab-with-transmog-vanity-riding-and.md",
"Corfirean/coa-server-manager:20261002-companion-bots-are-recognised-from-their-default.md",
"Corfirean/coa-server-manager:20261002-delete-an-account-from-the-players-page.md",
"Corfirean/coa-server-manager:20261002-importing-a-server-suggests-the-right-folder-whe.md",
"Corfirean/coa-server-manager:20261002-modules-page-with-cards-status-badges-and-per-mo.md",
"Corfirean/coa-server-manager:20261002-report-a-problem-collects-more-and-ignores-repea.md",
"Corfirean/coa-server-manager:20261002-server-settings-in-one-panel-with-search-tabs-an.md",
"Corfirean/coa-server-manager:20261002-the-update-check-says-you-are-up-to-date-instead.md",
"Corfirean/coa-server-manager:20261003-client-realm-sync.md",
"Corfirean/coa-server-manager:20261003-config-snapshot-restore.md",
"Corfirean/coa-server-manager:20261003-imported-servers-get-the-module-config-files-the.md",
"Corfirean/coa-server-manager:20261003-linux-preview.md",
"Corfirean/coa-server-manager:20261003-modules-marked-soon-stay-greyed-out.md",
"Corfirean/coa-server-manager:20261003-report-browser.md",
"Corfirean/coa-server-manager:20261003-simplified-chinese.md",
"Corfirean/coa-server-manager:20261003-the-bots-page-is-hidden-when-the-module-is-not-o.md",
"Corfirean/coa-server-manager:20261003-updating-the-game-client-shows-a-progress-bar-on.md",
"Corfirean/coa-server-manager:20261003-wildcard-realm-profiles.md",
"Corfirean/coa-server-manager:20261004-auction-item-types.md",
"Corfirean/coa-server-manager:20261004-fractional-settings.md",
"Corfirean/coa-server-manager:20261004-independent-client-launch.md",
"Corfirean/coa-server-manager:20261004-module-settings.md",
"Corfirean/coa-server-manager:20261004-recover-server-updates.md",
"Corfirean/coa-server-manager:20261004-repair-and-database-validation.md",
"Corfirean/coa-server-manager:20261004-scaling-lfg-leech-settings.md",
"Corfirean/coa-server-manager:20261004-simultaneous-realms.md",
"Corfirean/coa-server-manager:20261004-squid-playerbots.md",
"Corfirean/coa-server-manager:20261005-connect-without-server.md",
"Corfirean/coa-server-manager:20261005-imported-squid-warning.md",
"Corfirean/coa-server-manager:20261005-launch-without-updating.md",
"Corfirean/coa-server-manager:20261005-linux-docker-server-installer.md",
"Corfirean/coa-server-manager:20261005-linux-docker-server-settings.md",
"Corfirean/coa-server-manager:20261005-linux-install-screen-and-client.md",
"Corfirean/coa-server-manager:20261005-retry-update-startup.md",
"Corfirean/coa-server-manager:20261005-squid-release-metadata.md",
"Corfirean/coa-server-manager:20261005-squid-version-reports.md",
"Corfirean/coa-server-manager:20261005-update-history-hotfix.md",
"Corfirean/coa-server-manager:20261005-update-legacy-realm-launcher.md",
"Corfirean/coa-server-manager:20261005-validate-release-database.md",
"Corfirean/coa-server-manager:20261006-ah-bot-needs-no-character-guid.md",
"Corfirean/coa-server-manager:20261006-lan-address-selector.md",
"Corfirean/coa-server-manager:20261006-npc-enchanter-placement-hint.md",
"Corfirean/coa-server-manager:20261006-prevent-server-downgrades.md",
"Corfirean/coa-server-manager:20261006-recognize-managed-launcher.md",
"Corfirean/coa-server-manager:20261006-squid-first-start-timeout.md",
"Corfirean/coa-server-manager:20261006-update-preflight-and-recovery-guards.md",
"Corfirean/coa-server-manager:20261006-update-sql-and-status-guards.md",
"Corfirean/coa-server-manager:20261007-diagnostics-valid-json.md",
"Corfirean/coa-server-manager:20261007-one-click-diagnostics.md",
"Corfirean/coa-server-manager:20261007-report-routing.md",
"Corfirean/coa-server-manager:20261008-backup-folder-and-bot-choices.md",
"Corfirean/coa-server-manager:20261008-bot-settings-drop-down.md",
"Corfirean/coa-server-manager:20261008-dashboard-delivery.md",
"Corfirean/coa-server-manager:20261008-database-error-not-misread.md",
"Corfirean/coa-server-manager:20261008-hide-squid-bot-accounts.md",
"Corfirean/coa-server-manager:20261008-squid-dashboard-tab.md",
"Corfirean/coa-server-manager:20261008-start-after-update-options.md",
"Corfirean/coa-server-manager:20261008-update-check-survives-damaged-state.md",
"Corfirean/coa-server-manager:20261008-wildcard-repair-checksum.md",
"Corfirean/coa-server-manager:20261008-world-server-from-coa-bots-folder.md",
"Corfirean/coa-server-manager:20261010-automatic-update-recovery.md",
"Corfirean/coa-server-manager:20261010-complete-mysql-update-recovery.md",
"Corfirean/coa-server-manager:20261010-custom-races-bot-exclusions.md",
"Corfirean/coa-server-manager:20261010-custom-races-update.md",
"Corfirean/coa-server-manager:20261010-custom-races.md",
"Corfirean/coa-server-manager:20261010-database-recovery-diagnostics.md",
"Corfirean/coa-server-manager:20261010-headless-world-startup.md",
"Corfirean/coa-server-manager:20261010-immutable-update-channels.md",
"Corfirean/coa-server-manager:20261010-isolated-update-validation.md",
"Corfirean/coa-server-manager:20261010-local-host-while-sharing.md",
"Corfirean/coa-server-manager:20261010-missing-database-defaults.md",
"Corfirean/coa-server-manager:20261010-module-base-update-replay.md",
"Corfirean/coa-server-manager:20261010-private-database-update-rehearsal.md",
"Corfirean/coa-server-manager:20261010-release-compatibility.md",
"Corfirean/coa-server-manager:20261010-schema-validation-report.md",
"Corfirean/coa-server-manager:20261010-settings-blank-window.md",
"Corfirean/coa-server-manager:20261010-unsaved-changes-and-crash-recovery.md",
"Corfirean/coa-server-manager:20261011-player-race-patches.md",
"Corfirean/coa-server-manager:20261012-bulk-navigation-update.md",
"Corfirean/coa-server-manager:20261012-rehearsal-path-normalization.md",
"Corfirean/coa-server-manager:20261013-custom-races-client-update.md",
"Corfirean/coa-server-manager:20261013-docker-remote-client-restart.md",
"Corfirean/coa-server-manager:20261013-installed-module-versions.md",
"Corfirean/coa-server-manager:20261013-long-rehearsal-paths.md",
"Corfirean/coa-server-manager:20261013-maintenance-diagnostic-export.md",
"Corfirean/coa-server-manager:20261013-preserve-client-patches.md",
"Corfirean/coa-server-manager:20261013-recheck-installed-release.md",
"Corfirean/coa-server-manager:20261013-startup-error-details.md",
"Corfirean/coa-server-manager:20261013-stock-bot-races.md",
"Corfirean/coa-server-manager:20261013-update-check-start-contention.md",
"Corfirean/coa-server-manager:20261013-upstream-bot-race-preset.md",
"Corfirean/coa-server-manager:20261014-already-running-mysql-is-recognized-before-start.md",
"Corfirean/coa-server-manager:20261014-current-clean-install.md",
"Corfirean/coa-server-manager:20261014-custom-races-grummle-client.md",
"Corfirean/coa-server-manager:20261014-failed-repairs-restore-the-previous-server-after.md",
"Corfirean/coa-server-manager:20261014-overview-update-errors.md",
"Corfirean/coa-server-manager:20261014-private-update-checks-show-preparation-stages-an.md",
"Corfirean/coa-server-manager:20261014-repair-recovery-copies-preserve-all-bundled-data.md",
"Corfirean/coa-server-manager:20261014-server-checks-report-interrupted-squid-database.md",
"Corfirean/coa-server-manager:20261014-shutdown-remains-available-when-startup-template.md",
"Corfirean/coa-server-manager:20261014-successful-server-repairs-no-longer-block-later.md",
"Corfirean/coa-server-manager:20261016-consistent-update-migrations.md",
"Corfirean/coa-server-manager:20261016-direct-database-upgrades.md",
"Corfirean/coa-server-manager:20261016-idempotent-validation-stop.md",
"Corfirean/coa-server-manager:20261016-intermediate-updates.md",
"Corfirean/coa-server-manager:20261016-lightweight-update-checks.md",
"Corfirean/coa-server-manager:20261016-preserve-core-migration-history.md",
"Corfirean/coa-server-manager:20261016-shared-auth-migration-history.md",
"Corfirean/coa-server-manager:20261016-update-compatibility-wording.md",
"Corfirean/coa-server-manager:20261018-custom-races-client.md"
],
"releases": [
{
"tag": "v0.1.0",
"version": "0.1.0",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.0",
"commit": "0a9be3d80030f8549a2925e176ab0ee829603c44",
"notes": [
"Initial Windows release: install or import a server and manage startup from one app",
"Configure server and bot settings, manage accounts, create backups and restore saved data",
"Launch the game client, set up sharing with friends and collect diagnostics"
]
},
{
"tag": "v0.1.1",
"version": "0.1.1",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.1",
"commit": "f620f87432e5affb84bdc14ca0bb0f5a8bb5c534",
"notes": [
"Added translations throughout setup, server updates, backups, diagnostics and settings",
"Added clearer errors when server packages are unavailable or a server cannot be reached"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.0...v0.1.1"
},
{
"tag": "v0.1.2",
"version": "0.1.2",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.2",
"commit": "0e1016e93c457c8aeea3ba31416be66a201a19ef",
"notes": [
"Manager updates download in the background and install when the app closes",
"Missing module configuration files are created from the supplied defaults"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.1...v0.1.2"
},
{
"tag": "v0.1.3",
"version": "0.1.3",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.3",
"commit": "4eda03ab6355a6cf280865bca91ce8d2fc6167e7",
"notes": [
"The interface scales with the window",
"Each friend connection mode shows the realmlist line to use"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.2...v0.1.3"
},
{
"tag": "v0.1.4",
"version": "0.1.4",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.4",
"commit": "db16d95558910d4cdc97edbce97ec78aaf535a83",
"notes": [
"Sharing settings are reapplied before server startup",
"Added a restart shortcut after enabling play with friends"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.3...v0.1.4"
},
{
"tag": "v0.1.6",
"version": "0.1.6",
"date": "2026-09-30",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.1.6",
"commit": "f7d29b09efd54ab3a0f830d4d6891013038398e4",
"notes": [
"Overview shows world speed",
"Improved companion setup, including requests made while the server is stopped",
"Expanded translated settings and connection guides"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.4...v0.1.6"
},
{
"tag": "v0.2.0",
"version": "0.2.0",
"date": "2026-10-01",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.2.0",
"commit": "0940e9cf28759a9489d53dbd28882d6b46cb0076",
"notes": [
"Added companion creation progress and controls to stop creation, take bots offline or remove them",
"Choose how many bots log in when the server starts",
"Added a control to log out a chosen number of bots and reduce server load"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.1.6...v0.2.0"
},
{
"tag": "v0.3.0",
"version": "0.3.0",
"date": "2026-10-01",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.0",
"commit": "c8f6d61b98ceb0920ba605467eb73b1364d24404",
"notes": [
"Download and update the game client through the Manager while preserving custom files",
"Server updates are checked automatically and offered on Overview"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.2.0...v0.3.0"
},
{
"tag": "v0.3.1",
"version": "0.3.1",
"date": "2026-10-01",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.3.1",
"commit": "d01e401f3ce5c5f9a7daeb721815e2cf5fe1d694",
"notes": [
"Added named realmlists and a switcher beside Play",
"Added account management and a prefilled GitHub problem-report form",
"Server updates continue when leaving the settings page"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.3.0...v0.3.1"
},
{
"tag": "v0.4.0",
"version": "0.4.0",
"date": "2026-10-02",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.4.0",
"commit": "53aa117ec2e2f4c0572a74829c41e99d5a4eedb6",
"notes": [
"Added module cards with switches and settings",
"Added searchable server settings and appearance and collection controls",
"Added account deletion with confirmation",
"Fixed update checks offering an already installed version"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.3.1...v0.4.0"
},
{
"tag": "v0.5.0",
"version": "0.5.0",
"date": "2026-10-03",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.5.0",
"commit": "1bcef5f8c2e85b28eb466e720002d2fbf2b67161",
"notes": [
"Imported servers get the module config files they lack",
"Modules marked Soon stay greyed out",
"The Bots page is hidden when the module is not on the server",
"Updating the game client shows a progress bar on its button",
"Switch between CoA and Wildcard while keeping separate characters and module settings"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.4.0...v0.5.0"
},
{
"tag": "v0.6.0",
"version": "0.6.0",
"date": "2026-10-03",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.0",
"commit": "162bfd1e04ca4faa205b5c38432f56b07066c6be",
"notes": [
"The game client follows the realm selected in the Manager",
"Configuration snapshots no longer overwrite each other",
"Experimental Linux startup and Docker server controls",
"Problem reports open in the default browser",
"Simplified Chinese is available in the Manager"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.5.0...v0.6.0"
},
{
"tag": "v0.6.1",
"version": "0.6.1",
"date": "2026-10-04",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.1",
"commit": "2e3fb24e1af5c3ee9a787c345cbcce973739fe69",
"notes": [
"Server multipliers now accept decimals typed with a dot or comma",
"Play launches only the game client without starting your local server",
"Check database structure and repair server files with a safety backup",
"Start CoA and Wildcard together from Settings"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.0...v0.6.1"
},
{
"tag": "v0.6.2",
"version": "0.6.2",
"date": "2026-10-04",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.2",
"commit": "b90b377fc308210abdf7fc63ea2f2ac1eac29f4a",
"notes": [
"Choose which item types the auction bot sells",
"Module settings now offer translated controls and an enemy damage slider",
"Failed server updates restore databases and files together",
"Configure SQUID Playerbots and prevent conflicting bot systems",
"Server packages must include a complete database schema check"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.1...v0.6.2"
},
{
"tag": "v0.6.3",
"version": "0.6.3",
"date": "2026-10-04",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.3",
"commit": "07ec22798f2b81f33e470837ece7fec693ac24bb",
"notes": [
"Configure partial dungeon parties and open-world life steal in module settings",
"Download and update the game client without installing a server"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.2...v0.6.3"
},
{
"tag": "v0.6.4",
"version": "0.6.4",
"date": "2026-10-05",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.4",
"commit": "6c771fae20ac59870f5990a6495f8cd035caab65",
"notes": [
"Start your installed server or client without downloading an available update",
"Finish a server update that was blocked by a startup failure"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.3...v0.6.4"
},
{
"tag": "v0.6.5",
"version": "0.6.5",
"date": "2026-10-06",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.5",
"commit": "277ebba847912e113657bcef4ed53e4e4e708161",
"notes": [
"Imported SquidBots servers warn before replacing their original binary",
"SquidBots settings follow the options shipped by the module",
"SquidBots shows its bundled release and includes it in problem reports",
"Server updates accept verified published migration variants without rerunning them",
"Server updates replace older launchers adapted by the Manager for Wildcard",
"Older server packages cannot replace a newer installation",
"Checking again no longer offers an already installed launcher update",
"Large SQUID database imports have more time to finish on first startup",
"Update history conflicts are detected before server files change",
"Pending database updates remain visible when the server version matches"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.4...v0.6.5"
},
{
"tag": "v0.6.6",
"version": "0.6.6",
"date": "2026-10-07",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.6",
"commit": "fac6ce469a77c134437484a78e91e7811df8a389",
"notes": [
"Install a server from a package on Linux, running in Docker (experimental)",
"The Auction House Bot card no longer asks for a character GUID",
"Choose and remember the local network address friends use to connect",
"The NPC Enchanter card explains how to place and remove the NPC",
"Diagnostic files with database checks stay readable after secrets are removed",
"One button collects all diagnostics, including crashes and Windows crash records",
"Problem reports go to the right project"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.5...v0.6.6"
},
{
"tag": "v0.6.7",
"version": "0.6.7",
"date": "2026-10-08",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.7",
"commit": "7540527d3035660f1c45ea66497e0412cc65249c",
"notes": [
"Choose where backups are stored, for example on another drive",
"Bot settings with a fixed list of values show a drop-down",
"The bot dashboard loads completely and can be opened in the browser",
"Accounts of the SQUID bots are hidden from the Accounts list",
"A Dashboard tab shows what the SQUID bots are doing",
"A stopped server stays stopped after an update, unless you ask it to start",
"Checking for updates no longer fails with \"Something went wrong\" after a crash",
"Server updates no longer stop with \"has a different checksum\" on the Wildcard repair",
"A world server started from the coa-bots folder is recognised"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.6...v0.6.7"
},
{
"tag": "v0.6.8",
"version": "0.6.8",
"date": "2026-10-10",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.8",
"commit": "ee59708fbfcdb5f4e30c62f2e4aa952f82604cac",
"notes": [
"Linux: install from the install screen, play with Wine or Proton (experimental)",
"A failing database update is no longer reported as \"database not running",
"Unsaved settings are protected and crashed servers can restart automatically"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.7...v0.6.8"
},
{
"tag": "v0.6.9",
"version": "0.6.9",
"date": "2026-10-10",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.9",
"commit": "374a3f9c2322f30900f7f8a0549a643c8a511567",
"notes": [
"Custom races can be enabled and their client patches installed from Modules"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.8...v0.6.9"
},
{
"tag": "v0.6.10",
"version": "0.6.10",
"date": "2026-10-10",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.10",
"commit": "b0951dbee7516334d8ae3baa1c7bf7635f6cb202",
"notes": [
"Custom race client patches update to the latest races and appearances"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.9...v0.6.10"
},
{
"tag": "v0.6.11",
"version": "0.6.11",
"date": "2026-10-10",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.11",
"commit": "376f1dbb469ece197aa1caf68b3e5fdd73e3b277",
"notes": [
"Server and Bots settings open without a blank window"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.10...v0.6.11"
},
{
"tag": "v0.6.12",
"version": "0.6.12",
"date": "2026-10-10",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.12",
"commit": "94d4ade1c73c6a64018dc182fe3a3ba87607d7a2",
"notes": [
"Background world servers no longer stop because the local console is closed"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.11...v0.6.12"
},
{
"tag": "v0.6.13",
"version": "0.6.13",
"date": "2026-10-11",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.13",
"commit": "ed7bf7262bc43de109f17a2812bc41c34d99c51d",
"notes": [
"Failed server startup after an update automatically restores the previous version",
"Windows update recovery preserves database procedures triggers and views",
"Custom races bot setting synchronizes Playerbots excluded race lists",
"Blocked updates identify database objects that prevent automatic recovery",
"Updates can follow signed channels that select a complete server release",
"Server updates check startup privately before allowing players to connect",
"Updates repair missing database defaults from the verified release schema",
"Server updates no longer replay module installation scripts on existing databases",
"Windows server updates are tested on a private copy before changing your installation",
"Server updates can require a tested combination of platform and installed version",
"Failed database checks keep a complete report after rollback",
"Players can install custom race patches when connecting to a friend"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.12...v0.6.13"
},
{
"tag": "v0.6.14",
"version": "0.6.14",
"date": "2026-10-11",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.14",
"commit": "58c976a388215bea8bbf232503810c6519a33562",
"notes": [
"Fixed server update checks failing with long Windows paths"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.13...v0.6.14"
},
{
"tag": "v0.6.15",
"version": "0.6.15",
"date": "2026-10-11",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.15",
"commit": "d86a1676fed98f9e4556617a603959e42bc401c8",
"notes": [
"Large server updates no longer repeatedly rewrite the recovery journal"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.14...v0.6.15"
},
{
"tag": "v0.6.16",
"version": "0.6.16",
"date": "2026-10-13",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.16",
"commit": "b45e2502ece1a5578555d7d5dfe36a95b374a58e",
"notes": [
"Linux Docker servers follow Settings, sharing and backups (experimental)",
"Local hosts can connect while sharing a server online",
"Custom race client installation follows the current upstream release",
"Docker friend mode requests a restart when remote client support changes",
"Module cards show installed server revisions and the client race patch version",
"Server updates accept long Windows paths inside the private test server",
"Diagnostics record blocked startup requests and maintenance owner information",
"Client race patches can be repaired and removed while preserving original files",
"Checking an already installed server update no longer reports incompatibility",
"Failed server startup shows service errors even when the launcher reported ready",
"Starting the server waits for update checks and identifies ongoing maintenance"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.15...v0.6.16"
},
{
"tag": "v0.6.17",
"version": "0.6.17",
"date": "2026-10-15",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.17",
"commit": "dc323df681ca77fb15ce4284da0feadfe83e0c7e",
"notes": [
"Already running MySQL is recognized before startup readiness checks",
"New servers install the current stable build directly",
"Install the matching client patches for Grummle",
"Failed repairs restore the previous server after final verification errors",
"Failed server updates show an error on the Overview screen",
"Private update checks show preparation stages and stop failure details",
"Repair recovery copies preserve all bundled database objects and accounts",
"Server checks report interrupted SQUID database imports",
"Shutdown remains available when startup templates or database records are damaged",
"Successful server repairs no longer block later server actions"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.16...v0.6.17"
},
{
"tag": "v0.6.18",
"version": "0.6.18",
"date": "2026-10-16",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.18",
"commit": "16396407ad63c1b596dc4fd7e2672ef87cf23f56",
"notes": [
"Older servers find a tested intermediate update instead of being blocked"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.17...v0.6.18"
},
{
"tag": "v0.6.19",
"version": "0.6.19",
"date": "2026-10-16",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.19",
"commit": "cda7875a9a2061d4b576912cc6943220ff6fddba",
"notes": [
"Update checks no longer download a server archive to compare its launcher"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.18...v0.6.19"
},
{
"tag": "v0.6.21",
"version": "0.6.21",
"date": "2026-10-16",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.21",
"commit": "e3fbb2e4b6dbe40fa00264abcd12b4cfd9702305",
"notes": [
"Server updates apply migrations once after saving a recovery point",
"Older server versions update directly without installing intermediate packages",
"Update validation recognizes an already stopped server",
"Recorded core SQL stays applied after old history tables are cleaned up",
"Switching realms no longer repeats shared account database updates",
"Update offers distinguish version support from database validation"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.19...v0.6.21"
},
{
"tag": "v0.6.22",
"version": "0.6.22",
"date": "2026-10-19",
"url": "https://github.com/Corfirean/coa-server-manager/releases/tag/v0.6.22",
"commit": "65df6604846d5492e40a6b08a797199478666e24",
"notes": [
"Updated Custom Races client patches to 1.8",
"Included the updated race appearance and cursor addons",
"Existing client files are preserved when installing or removing race patches"
],
"compare": "https://github.com/Corfirean/coa-server-manager/compare/v0.6.21...v0.6.22"
}
]
}
+222
View File
@@ -0,0 +1,222 @@
"""Maintain a component's own published history, using immutable release sources.
The same dependency-free script is vendored as tools/sync_history.py in Manager.
Historical corrections live in the reviewed history JSON, not in moving branches.
"""
import argparse
import base64
from concurrent.futures import ThreadPoolExecutor
import json
from pathlib import Path
import re
import subprocess
import tempfile
SERVER_AREAS = {'server', 'bots', 'scaling', 'modules', 'addon', 'client'}
MANAGER_AREAS = {'manager', 'client'}
def gh(*args):
return subprocess.check_output(['gh', *args], encoding='utf-8')
def api(path):
return json.loads(gh('api', path))
def version_key(version):
if not re.fullmatch(r'\d+(?:\.\d+)+', version):
raise ValueError('Invalid published version: ' + version)
return tuple(map(int, version.split('.')))
def eligible(release, component):
pattern = r'v(\d+(?:\.\d+)+)' if component == 'manager' else r'server-(\d+(?:\.\d+)+)'
return not release['draft'] and not release['prerelease'] and re.fullmatch(pattern, release['tag_name'])
def published(repo, component):
pages = json.loads(gh('api', '--paginate', '--slurp', f'repos/{repo}/releases?per_page=100'))
return sorted([r for page in pages for r in page if eligible(r, component)],
key=lambda r: version_key(r['tag_name'].removeprefix('server-').removeprefix('v')))
def fragment_note(text, areas):
sections = text.strip().split('---', 2)
if len(sections) != 3 or sections[0]:
raise ValueError('Invalid release fragment')
fields = dict(line.split(':', 1) for line in sections[1].splitlines() if ':' in line)
fields = {k.strip(): v.strip().strip('"\'') for k, v in fields.items()}
if fields.get('area') not in areas:
return None
if not fields.get('title'):
raise ValueError('Release fragment has no title')
if re.search(r'\b(compilation|compiler|cache|manual builds|repository owners|packaging time)\b', fields['title'], re.I):
return None
# Keep public notes player-facing. Technical refs remain in the source fragment.
title = fields['title'].rstrip('.')
return title
def remote_fragments(repo, sha, seen, areas):
if not re.fullmatch(r'[0-9a-f]{40}', sha):
raise ValueError('Changelog collection requires an immutable source SHA')
listing = api(f'repos/{repo}/contents/changelog.d?ref={sha}')
files = [f for f in listing if re.fullmatch(r'\d{8}-[a-z0-9-]+\.md', f['name'])]
new = [f for f in files if repo + ':' + f['name'] not in seen]
def read(item):
blob = api(f'repos/{repo}/git/blobs/{item["sha"]}')
return fragment_note(base64.b64decode(blob['content']).decode('utf-8'), areas)
with ThreadPoolExecutor(max_workers=6) as pool:
notes = [note for note in pool.map(read, new) if note]
return notes, [repo + ':' + f['name'] for f in files]
def collect_manager(root, tag, seen):
sha = subprocess.check_output(['git', '-C', str(root), 'rev-parse', tag + '^{commit}'], encoding='utf8', newline='\n').strip()
paths = subprocess.check_output(['git', '-C', str(root), 'ls-tree', '-r', '--name-only', sha, 'changelog.d'], encoding='utf8', newline='\n').splitlines()
paths = [p for p in paths if re.fullmatch(r'changelog.d/\d{8}-[a-z0-9-]+\.md', p)]
repo = 'Corfirean/coa-server-manager'
notes = []
for path in paths:
if repo + ':' + Path(path).name not in seen:
text = subprocess.check_output(['git', '-C', str(root), 'show', f'{sha}:{path}'], encoding='utf8', newline='\n')
note = fragment_note(text, MANAGER_AREAS)
if note:
notes.append(note)
return notes, [repo + ':' + Path(p).name for p in paths], {'commit': sha}
def collect_server(repo, tag, seen, previous):
with tempfile.TemporaryDirectory() as folder:
subprocess.run(['gh', 'release', 'download', tag, '--repo', repo, '--pattern', 'release-lock.json', '--dir', folder], check=True)
lock = json.loads((Path(folder) / 'release-lock.json').read_text(encoding='utf-8-sig'))
notes, ids = [], []
for role in ('core', 'bots', 'scaling', 'build'):
item = lock['components'].get(role)
if not item:
raise ValueError('Release lock has no ' + role + ' source')
if item['repository'] == 'Corfirean/coa-server-manager':
raise ValueError('A Manager source cannot supply server release notes')
entries, found = remote_fragments(item['repository'], item['sha'], seen, SERVER_AREAS)
notes.extend(entries)
ids.extend(found)
old = previous.get('components', {})
# Imported updates are explicitly updates, never attributed as our authored fixes.
for role, label in [('races', 'Custom Races'), ('squid', 'SQUID Playerbots')]:
item = lock['components'].get(role)
if item and item['sha'] != old.get(role, {}).get('sha'):
ref = item.get('ref', '')
version = re.sub(r'^(coa-custom-|v)', '', ref)
if version and not re.fullmatch(r'[0-9a-f]{40}|main|master', version):
notes.append(f'Updated {label} to {version}')
if lock['components'].get('upstream', {}).get('sha') != old.get('upstream', {}).get('sha'):
notes.append('Updated the reviewed CoA upstream snapshot')
return list(dict.fromkeys(notes)), ids, {'snapshot': lock['snapshot'], 'components': lock['components']}
def notes_md(record):
lines = [f'## {record["version"]} — {record["date"]}', '']
lines.extend('- ' + note.rstrip('.') + '.' for note in record['notes'])
label = 'Archived release record' if record.get('legacy') else 'Release'
lines += ['', f'[{label}]({record["url"]})']
if record.get('compare'):
lines[-1] += f' · [Source changes]({record["compare"]})'
return '\n'.join(lines) + '\n'
def render(history):
component = history['component']
title = 'CoA Server Manager' if component == 'manager' else 'CoA Server'
other = ('[Server changelog](https://github.com/Corfirean/coa-server-build/blob/main/CHANGELOG.md)' if component == 'manager'
else '[Manager changelog](https://github.com/Corfirean/coa-server-manager/blob/master/CHANGELOG.md)')
lines = [f'# {title} changelog', '',
('Manager releases only. Updating the Manager does not update the server.' if component == 'manager'
else 'Server packages, companions and server modules only. Manager releases have their own changelog.'),
'', other, '', 'Dates follow GitHub publication (UTC); legacy records retain their archived dates. Newest releases first.', '']
for record in sorted(history['releases'], key=lambda r: (r['date'], version_key(r['version'])), reverse=True):
lines.append(notes_md(record))
return '\n'.join(lines).rstrip() + '\n'
def validate_history(history):
expected = {'server': 'Corfirean/coa-server-build', 'manager': 'Corfirean/coa-server-manager'}
component = history.get('component')
if history.get('schema') != 1 or history.get('repository') != expected.get(component):
raise ValueError('History must belong to exactly one known component repository')
versions, tags = set(), set()
for record in history['releases']:
version_key(record['version'])
if record['version'] in versions or record['tag'] in tags:
raise ValueError('Duplicate release in component history')
versions.add(record['version']); tags.add(record['tag'])
prefix = 'v' if component == 'manager' else 'server-'
if not record.get('legacy') and record['tag'] != prefix + record['version']:
raise ValueError('Release tag belongs to a different component/version')
if not record.get('notes') or not all(isinstance(n, str) and n.strip() for n in record['notes']):
raise ValueError('Release notes must contain confirmed changes')
if component == 'server' and any(i.startswith('Corfirean/coa-server-manager:') for i in history.get('consumedFragments', [])):
raise ValueError('Server history cannot consume Manager fragments')
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--root', type=Path, default=Path.cwd())
parser.add_argument('--history', default='changelog/history.json')
parser.add_argument('--sync-release-notes', action='store_true')
parser.add_argument('--render-only', action='store_true')
args = parser.parse_args()
path = args.root / args.history
history = json.loads(path.read_text(encoding='utf8'))
validate_history(history)
component, repo = history['component'], history['repository']
if component not in ('server', 'manager'):
raise ValueError('History must belong to one component')
existing = {r['tag'] for r in history['releases']}
seen = set(history.get('consumedFragments', []))
releases = [] if args.render_only else published(repo, component)
previous = sorted(history['releases'], key=lambda r: (r['date'], version_key(r['version'])))[-1] if existing else {}
for release in releases:
tag = release['tag_name']
if tag in existing:
continue
version = tag.removeprefix('server-').removeprefix('v')
if previous and version_key(version) <= version_key(previous['version']):
raise ValueError('Historical backfill requires a reviewed history correction: ' + tag)
if component == 'manager':
notes, ids, source = collect_manager(args.root, tag, seen)
else:
notes, ids, source = collect_server(repo, tag, seen, previous)
if not notes:
notes = ['Detailed player-facing notes were not recorded; see the source changes for this release']
record = {'tag': tag, 'version': tag.removeprefix('server-').removeprefix('v'),
'date': release['published_at'][:10], 'url': release['html_url'], 'notes': notes, **source}
if previous.get('tag'):
record['compare'] = f'https://github.com/{repo}/compare/{previous["tag"]}...{tag}'
history['releases'].append(record)
seen.update(ids)
previous = record
history['consumedFragments'] = sorted(seen)
validate_history(history)
# Keep a separately reviewed history as the source of truth for historical corrections.
path.write_text(json.dumps(history, indent=2, ensure_ascii=False) + '\n', encoding='utf8', newline='\n')
(args.root / 'CHANGELOG.md').write_text(render(history), encoding='utf8', newline='\n')
if args.sync_release_notes:
actual = {r['tag_name']: r for r in (releases or published(repo, component))}
for record in history['releases']:
release = actual.get(record['tag'])
if not release:
continue # Never create a missing historical release or touch a prerelease.
body = notes_md(record)
if (release.get('body') or '').strip() != body.strip():
with tempfile.TemporaryDirectory() as folder:
note_file = Path(folder) / 'notes.md'
note_file.write_text(body, encoding='utf8', newline='\n')
subprocess.run(['gh', 'release', 'edit', record['tag'], '--repo', repo, '--notes-file', str(note_file)], check=True)
print(f'{component}: {len(history["releases"])} releases; component changelog synchronized')
if __name__ == '__main__':
main()
+88
View File
@@ -0,0 +1,88 @@
import copy
import json
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest
from unittest.mock import patch
import sync_history as sync
class ComponentHistoryTests(unittest.TestCase):
def history(self):
return {'schema': 1, 'component': 'manager', 'repository': 'Corfirean/coa-server-manager',
'consumedFragments': [], 'releases': [{'version': '0.6.22', 'tag': 'v0.6.22',
'date': '2026-10-19', 'url': 'https://example.test/release', 'notes': ['Existing client files are preserved']}]}
def test_manager_history_cannot_be_used_as_server_history(self):
history = self.history()
history['component'] = 'server'
with self.assertRaises(ValueError): sync.validate_history(history)
def test_duplicate_release_and_wrong_tag_are_rejected(self):
history = self.history()
history['releases'].append(copy.deepcopy(history['releases'][0]))
with self.assertRaises(ValueError): sync.validate_history(history)
history['releases'].pop()
history['releases'][0]['tag'] = 'server-0.6.22'
with self.assertRaises(ValueError): sync.validate_history(history)
def test_unpublished_and_prerelease_tags_never_enter_history(self):
release = {'tag_name': 'v0.7.0', 'draft': True, 'prerelease': False}
self.assertFalse(sync.eligible(release, 'manager'))
release.update(draft=False, prerelease=True)
self.assertFalse(sync.eligible(release, 'manager'))
release.update(prerelease=False)
self.assertTrue(sync.eligible(release, 'manager'))
self.assertFalse(sync.eligible(release, 'server'))
self.assertFalse(sync.eligible(dict(release, tag_name='stable'), 'server'))
def test_fragment_classification_preserves_source_boundaries(self):
text = '---\narea: manager\ntitle: Updates recover safely\n---\nYour files are preserved.'
self.assertIsNone(sync.fragment_note(text, sync.SERVER_AREAS))
self.assertIn('Updates recover safely', sync.fragment_note(text, sync.MANAGER_AREAS))
def test_remote_collection_uses_frozen_sha_and_reads_only_new_fragments(self):
with patch.object(sync, 'api', return_value=[{'name': '20261019-a.md', 'sha': 'b' * 40}]) as api:
notes, ids = sync.remote_fragments('owner/repo', 'a' * 40, {'owner/repo:20261019-a.md'}, sync.SERVER_AREAS)
self.assertEqual(notes, [])
self.assertEqual(len(ids), 1)
api.assert_called_once_with('repos/owner/repo/contents/changelog.d?ref=' + 'a' * 40)
with self.assertRaises(ValueError): sync.remote_fragments('owner/repo', 'main', set(), sync.SERVER_AREAS)
def test_render_is_component_scoped_and_stable(self):
text = sync.render(self.history())
self.assertIn('# CoA Server Manager changelog', text)
self.assertEqual(text.count('## 0.6.22'), 1)
self.assertNotIn('## 0.7.0', text)
self.assertEqual(text, sync.render(self.history()))
def test_render_only_does_not_contact_github_or_change_published_history(self):
with tempfile.TemporaryDirectory() as folder:
root = Path(folder); (root / 'changelog').mkdir()
path = root / 'changelog/history.json'
path.write_text(json.dumps(self.history()), encoding='utf8')
with patch.object(sys, 'argv', ['sync', '--root', str(root), '--render-only']), patch.object(sync, 'gh', side_effect=AssertionError('No network')):
sync.main()
first = (root / 'CHANGELOG.md').read_bytes()
sync.main()
self.assertEqual(first, (root / 'CHANGELOG.md').read_bytes())
self.assertEqual(len(json.loads(path.read_text())['releases']), 1)
def test_repeated_sync_adds_a_published_version_only_once(self):
with tempfile.TemporaryDirectory() as folder:
root = Path(folder); (root / 'changelog').mkdir()
path = root / 'changelog/history.json'
path.write_text(json.dumps(self.history()), encoding='utf8')
release = {'tag_name': 'v0.6.23', 'published_at': '2026-10-20T12:00:00Z', 'html_url': 'https://example.test/new'}
with patch.object(sys, 'argv', ['sync', '--root', str(root)]), patch.object(sync, 'published', return_value=[release]), patch.object(sync, 'collect_manager', return_value=(['Update checks recover safely'], ['own:fragment.md'], {'commit': 'a' * 40})) as collect:
sync.main(); sync.main()
self.assertEqual(collect.call_count, 1)
history = json.loads(path.read_text())
self.assertEqual(len(history['releases']), 2)
self.assertEqual(history['releases'][0]['notes'], self.history()['releases'][0]['notes'])
self.assertEqual(history['consumedFragments'], ['own:fragment.md'])
if __name__ == '__main__': unittest.main()