From c0c414f5a8f86e4939fc64079e21182ecea715af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 3 Oct 2026 06:22:49 +0500 Subject: [PATCH 1/3] fix(report): open GitHub reports with the system URL opener (#8) --- Cargo.lock | 445 +++++++++++++++++++++++++++++++++++++++++++ src-tauri/Cargo.toml | 1 + src-tauri/src/lib.rs | 3 +- src/lib/report.ts | 2 +- 4 files changed, 448 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 630c791..08179ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,137 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "atk" version = "0.18.2" @@ -163,6 +294,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "brotli" version = "9.0.0" @@ -392,6 +536,7 @@ dependencies = [ "tauri", "tauri-build", "tauri-plugin-dialog", + "tauri-plugin-opener", "tauri-plugin-process", "tauri-plugin-updater", "tracing", @@ -407,6 +552,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -872,6 +1026,33 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -899,6 +1080,26 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.5.0" @@ -1063,6 +1264,19 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.34" @@ -1417,6 +1631,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + [[package]] name = "hex" version = "0.4.3" @@ -1731,6 +1951,25 @@ version = "2.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "itoa" version = "1.0.18" @@ -2446,6 +2685,17 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "open" +version = "5.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + [[package]] name = "openssl" version = "0.10.81" @@ -2495,6 +2745,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "osakit" version = "0.3.1" @@ -2534,6 +2794,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2622,6 +2888,17 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -2677,6 +2954,20 @@ dependencies = [ "miniz_oxide 0.8.9", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "portable-atomic" version = "1.15.0" @@ -3451,6 +3742,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -3946,6 +4247,28 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-opener" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39404b2572927e0d3ed30a7ca226037f7508d22e79c96ee6ef0d42b6a4b3345" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.21", + "url", + "windows", + "zbus", +] + [[package]] name = "tauri-plugin-process" version = "2.4.0" @@ -4476,6 +4799,17 @@ version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + [[package]] name = "unicode-ident" version = "1.0.26" @@ -5343,6 +5677,76 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.6", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + [[package]] name = "zerofrom" version = "0.1.8" @@ -5483,3 +5887,44 @@ dependencies = [ "cc", "pkg-config", ] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.6", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.6", + "winnow 1.0.4", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index fbba606..c837810 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,6 +16,7 @@ tauri = { version = "2", features = [] } tauri-plugin-dialog = "2" tauri-plugin-updater = "2" tauri-plugin-process = "2" +tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" coa-core = { path = "../crates/coa-core" } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ac98b30..f38cfa4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1123,8 +1123,7 @@ fn open_link(url: String) -> std::result::Result<(), UiError> { if !(issue || catalog || ALLOWED.iter().any(|p| url.starts_with(p))) || !chars_ok || url.len() > 12_000 { return Err(Error::Invalid("That link is not allowed.".into()).into()); } - // explorer.exe opens the address in the default browser without going through a shell. - std::process::Command::new("explorer.exe").arg(&url).spawn().map_err(|e| Error::Invalid(e.to_string()))?; + tauri_plugin_opener::open_url(&url, None::<&str>).map_err(|e| Error::Invalid(e.to_string()))?; Ok(()) } diff --git a/src/lib/report.ts b/src/lib/report.ts index ae3020e..aca699f 100644 --- a/src/lib/report.ts +++ b/src/lib/report.ts @@ -60,4 +60,4 @@ export function issueUrl(title: string, body: string): string { } /** Links longer than this are not reliable in every browser; the full text is then copied to the clipboard instead. */ -export const MAX_LINK = 6500; +export const MAX_LINK = 2000; From 50b48e8af536695e1bd04fc88b09f3939668e359 Mon Sep 17 00:00:00 2001 From: Corfirean Date: Sat, 3 Oct 2026 07:05:07 +0500 Subject: [PATCH 2/3] Changelog fragments (changelog.d) and the shared rules for people and AIs Rules and format: https://github.com/Corfirean/coa-server-build/blob/main/changelog/GUIDE.md Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/changelog.yml | 14 +++++++++ AGENTS.md | 31 +++++++++++++++++++ CLAUDE.md | 1 + GEMINI.md | 1 + ...ons-tab-with-transmog-vanity-riding-and.md | 6 ++++ ...-bots-are-recognised-from-their-default.md | 6 ++++ ...delete-an-account-from-the-players-page.md | 7 +++++ ...-a-server-suggests-the-right-folder-whe.md | 6 ++++ ...age-with-cards-status-badges-and-per-mo.md | 7 +++++ ...problem-collects-more-and-ignores-repea.md | 6 ++++ ...ttings-in-one-panel-with-search-tabs-an.md | 6 ++++ ...e-check-says-you-are-up-to-date-instead.md | 6 ++++ ...servers-get-the-module-config-files-the.md | 7 +++++ ...003-modules-marked-soon-stay-greyed-out.md | 6 ++++ ...page-is-hidden-when-the-module-is-not-o.md | 6 ++++ ...the-game-client-shows-a-progress-bar-on.md | 7 +++++ changelog.d/README.md | 7 +++++ 17 files changed, 130 insertions(+) create mode 100644 .github/workflows/changelog.yml create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 GEMINI.md create mode 100644 changelog.d/20261002-collections-tab-with-transmog-vanity-riding-and.md create mode 100644 changelog.d/20261002-companion-bots-are-recognised-from-their-default.md create mode 100644 changelog.d/20261002-delete-an-account-from-the-players-page.md create mode 100644 changelog.d/20261002-importing-a-server-suggests-the-right-folder-whe.md create mode 100644 changelog.d/20261002-modules-page-with-cards-status-badges-and-per-mo.md create mode 100644 changelog.d/20261002-report-a-problem-collects-more-and-ignores-repea.md create mode 100644 changelog.d/20261002-server-settings-in-one-panel-with-search-tabs-an.md create mode 100644 changelog.d/20261002-the-update-check-says-you-are-up-to-date-instead.md create mode 100644 changelog.d/20261003-imported-servers-get-the-module-config-files-the.md create mode 100644 changelog.d/20261003-modules-marked-soon-stay-greyed-out.md create mode 100644 changelog.d/20261003-the-bots-page-is-hidden-when-the-module-is-not-o.md create mode 100644 changelog.d/20261003-updating-the-game-client-shows-a-progress-bar-on.md create mode 100644 changelog.d/README.md diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 0000000..2b31708 --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,14 @@ +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/**'] + pull_request: + paths: ['changelog.d/**'] + +permissions: + contents: read + +jobs: + check: + uses: Corfirean/coa-server-build/.github/workflows/changelog-check.yml@main diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..443d4ec --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,31 @@ +# AGENTS.md + + +## 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 +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). + +File name: `YYYYMMDD-short-slug.md` (today's date). Content: + +``` +--- +area: bots # server | bots | scaling | modules | manager | addon | client | renderer +type: fixed # added | changed | fixed | removed | known-issue +audience: players # players | admins (admins = people who run a server or use the Manager) +title: Bots no longer take Realm First achievements +--- +Optional: one short paragraph in plain English for the reader (at most 300 characters). +``` + +- English only. The title says what changed **for the reader**, not how (at most 90 characters, starts with a capital, + no full stop). No code names, file names or commit language in the title. +- One file per change. Never edit or delete files that are already released; never write version numbers (the release + step adds them). +- Check your file: `python changelog.py check --dir changelog.d` (download the script from + https://raw.githubusercontent.com/Corfirean/coa-server-build/main/changelog/changelog.py ), or create it with + `python changelog.py new --area bots --type fixed --audience players --title "..."`. +- Full guide with examples: https://github.com/Corfirean/coa-server-build/blob/main/changelog/GUIDE.md + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/GEMINI.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/changelog.d/20261002-collections-tab-with-transmog-vanity-riding-and.md b/changelog.d/20261002-collections-tab-with-transmog-vanity-riding-and.md new file mode 100644 index 0000000..813e4d7 --- /dev/null +++ b/changelog.d/20261002-collections-tab-with-transmog-vanity-riding-and.md @@ -0,0 +1,6 @@ +--- +area: manager +type: added +audience: admins +title: Collections tab with transmog, vanity, riding and companion switches +--- diff --git a/changelog.d/20261002-companion-bots-are-recognised-from-their-default.md b/changelog.d/20261002-companion-bots-are-recognised-from-their-default.md new file mode 100644 index 0000000..ec57206 --- /dev/null +++ b/changelog.d/20261002-companion-bots-are-recognised-from-their-default.md @@ -0,0 +1,6 @@ +--- +area: manager +type: fixed +audience: admins +title: Companion bots are recognised from their default config file +--- diff --git a/changelog.d/20261002-delete-an-account-from-the-players-page.md b/changelog.d/20261002-delete-an-account-from-the-players-page.md new file mode 100644 index 0000000..640a3d7 --- /dev/null +++ b/changelog.d/20261002-delete-an-account-from-the-players-page.md @@ -0,0 +1,7 @@ +--- +area: manager +type: added +audience: admins +title: Delete an account from the Players page +--- +You type the account name to confirm; online and system accounts are refused. diff --git a/changelog.d/20261002-importing-a-server-suggests-the-right-folder-whe.md b/changelog.d/20261002-importing-a-server-suggests-the-right-folder-whe.md new file mode 100644 index 0000000..197177e --- /dev/null +++ b/changelog.d/20261002-importing-a-server-suggests-the-right-folder-whe.md @@ -0,0 +1,6 @@ +--- +area: manager +type: changed +audience: admins +title: Importing a server suggests the right folder when you pick the wrong one +--- diff --git a/changelog.d/20261002-modules-page-with-cards-status-badges-and-per-mo.md b/changelog.d/20261002-modules-page-with-cards-status-badges-and-per-mo.md new file mode 100644 index 0000000..1083346 --- /dev/null +++ b/changelog.d/20261002-modules-page-with-cards-status-badges-and-per-mo.md @@ -0,0 +1,7 @@ +--- +area: manager +type: added +audience: admins +title: Modules page with cards, status badges and per-module settings +--- +Switch the companion bots and NPC Enchanter on and off; a module's settings open under its card. diff --git a/changelog.d/20261002-report-a-problem-collects-more-and-ignores-repea.md b/changelog.d/20261002-report-a-problem-collects-more-and-ignores-repea.md new file mode 100644 index 0000000..2560ef5 --- /dev/null +++ b/changelog.d/20261002-report-a-problem-collects-more-and-ignores-repea.md @@ -0,0 +1,6 @@ +--- +area: manager +type: changed +audience: admins +title: Report a problem collects more and ignores repeated config warnings +--- diff --git a/changelog.d/20261002-server-settings-in-one-panel-with-search-tabs-an.md b/changelog.d/20261002-server-settings-in-one-panel-with-search-tabs-an.md new file mode 100644 index 0000000..ac02d37 --- /dev/null +++ b/changelog.d/20261002-server-settings-in-one-panel-with-search-tabs-an.md @@ -0,0 +1,6 @@ +--- +area: manager +type: changed +audience: admins +title: Server settings in one panel with search, tabs and a single Save bar +--- diff --git a/changelog.d/20261002-the-update-check-says-you-are-up-to-date-instead.md b/changelog.d/20261002-the-update-check-says-you-are-up-to-date-instead.md new file mode 100644 index 0000000..167f4b8 --- /dev/null +++ b/changelog.d/20261002-the-update-check-says-you-are-up-to-date-instead.md @@ -0,0 +1,6 @@ +--- +area: manager +type: fixed +audience: admins +title: The update check says you are up to date instead of offering the same version +--- diff --git a/changelog.d/20261003-imported-servers-get-the-module-config-files-the.md b/changelog.d/20261003-imported-servers-get-the-module-config-files-the.md new file mode 100644 index 0000000..0efdac8 --- /dev/null +++ b/changelog.d/20261003-imported-servers-get-the-module-config-files-the.md @@ -0,0 +1,7 @@ +--- +area: manager +type: fixed +audience: admins +title: Imported servers get the module config files they lack +--- +They are created at start and after an update; existing files are never changed. diff --git a/changelog.d/20261003-modules-marked-soon-stay-greyed-out.md b/changelog.d/20261003-modules-marked-soon-stay-greyed-out.md new file mode 100644 index 0000000..0ad10f9 --- /dev/null +++ b/changelog.d/20261003-modules-marked-soon-stay-greyed-out.md @@ -0,0 +1,6 @@ +--- +area: manager +type: fixed +audience: admins +title: Modules marked Soon stay greyed out +--- diff --git a/changelog.d/20261003-the-bots-page-is-hidden-when-the-module-is-not-o.md b/changelog.d/20261003-the-bots-page-is-hidden-when-the-module-is-not-o.md new file mode 100644 index 0000000..8ac2d45 --- /dev/null +++ b/changelog.d/20261003-the-bots-page-is-hidden-when-the-module-is-not-o.md @@ -0,0 +1,6 @@ +--- +area: manager +type: fixed +audience: admins +title: The Bots page is hidden when the module is not on the server +--- diff --git a/changelog.d/20261003-updating-the-game-client-shows-a-progress-bar-on.md b/changelog.d/20261003-updating-the-game-client-shows-a-progress-bar-on.md new file mode 100644 index 0000000..471ae6f --- /dev/null +++ b/changelog.d/20261003-updating-the-game-client-shows-a-progress-bar-on.md @@ -0,0 +1,7 @@ +--- +area: manager +type: changed +audience: admins +title: Updating the game client shows a progress bar on its button +--- +No window covers the app while the client updates. diff --git a/changelog.d/README.md b/changelog.d/README.md new file mode 100644 index 0000000..babfeac --- /dev/null +++ b/changelog.d/README.md @@ -0,0 +1,7 @@ +# 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, +in https://github.com/Corfirean/coa-server-build/blob/main/changelog/GUIDE.md + +This README is ignored by the collector. From e7113f3ceba771721dbdeb88886f163195532a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 3 Oct 2026 07:24:21 +0500 Subject: [PATCH 3/3] Test the content-scaling master switch against the bundled catalog --- crates/coa-core/src/modules.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/coa-core/src/modules.rs b/crates/coa-core/src/modules.rs index 9e9f76b..e4b1845 100644 --- a/crates/coa-core/src/modules.rs +++ b/crates/coa-core/src/modules.rs @@ -306,6 +306,25 @@ mod tests { assert!(!list_in(&test_catalog(), &root).into_iter().find(|m| m.id == "spellbook").unwrap().installed, "no configuration of that module on this server"); } + #[test] + fn the_content_scaling_switch_persists_the_master_flag_and_preserves_other_settings() { + let d = tempfile::tempdir().unwrap(); + let (root, meta) = server(d.path()); + let e = entry_in(&catalog(), "content-scaling").unwrap(); + assert_eq!(e.enable_key, "CoAContentScaling.Enable"); + let defaults = "CoAContentScaling.Enable = 1\nCoAContentScaling.ScaleItems = 1\nCoAContentScaling.GroupScaling.Enable = 1\n"; + fs::write(dir(&root).join(format!("{}.dist", e.conf)), defaults).unwrap(); + set_enabled(&root, &meta, &e.id, false).unwrap(); + let active = read(&dir(&root).join(&e.conf)).unwrap(); + assert_eq!(active.get("CoAContentScaling.Enable"), Some("0")); + assert_eq!(active.get("CoAContentScaling.ScaleItems"), Some("1")); + assert_eq!(active.get("CoAContentScaling.GroupScaling.Enable"), Some("1")); + assert!(!list(&root).into_iter().find(|m| m.id == e.id).unwrap().enabled); + set_enabled(&root, &meta, &e.id, true).unwrap(); + assert_eq!(read(&dir(&root).join(&e.conf)).unwrap().get("CoAContentScaling.Enable"), Some("1")); + assert!(list(&root).into_iter().find(|m| m.id == e.id).unwrap().enabled); + } + #[test] fn switching_a_module_creates_its_file_saves_the_old_one_and_changes_only_that_line() { let d = tempfile::tempdir().unwrap();