mirror of
https://github.com/Mudlet/Mudlet
synced 2026-08-13 18:26:27 -04:00
534 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c8b74af46d
|
fix: undoing the game's line wrapping no longer merges list entries (#9836)
#### Brief overview of PR changes/additions - A line opening with a list marker - `[1364]`, `(3)`, `2.`, `3)` or a bullet - is now treated as a new line rather than the continuation of the one above it, so help indexes, shop stock and menus survive the option being on. - Only markers that word wrap could not itself produce at the start of a continuation count. A spaced dash and a parenthesised number over 3 digits are deliberately excluded, since both open genuine wrapped prose. - 3 new functional tests, including negative controls proving ordinary prose still rejoins. #### Motivation for adding to Mudlet With "undo the game's word wrapping" enabled at 78 columns, a help index came out with entries glued together - each entry is a sentence that can end right at the wrap column, so nothing but its marker distinguished it from a wrapped paragraph. #### Other info (issues closed, discussion etc) Also raises the Windows Lua test step to the 3 minute budget Linux and macOS already have - it was left at 2 and timed out on a slow runner while the specs were still running. Folded in here rather than split out, by request. Follow-up to #9455, which added the option. The check reads the continuation only, so the last entry of a list can still absorb a full-width prose line that follows it - left alone deliberately, as requiring a marker on both lines would stop the first entry of a list detaching from a header above it. **Test case:** enable Settings -> Display -> "undo the game's own word wrapping" at 78, then on a game with a numbered help index (e.g. `help viking`) confirm each `[NNN]` entry stays on its own line. `ctest -R UndoServerWrapTest` covers it - 15/15 pass. Assisted-by: Claude:claude-opus-5 Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> --------- Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> |
||
|
|
6705cadd11
|
Infra: Add CMake presets for every platform, and one home for AI assistant skills (#9742)
#### Brief overview of PR changes/additions - Adds `CMakePresets.json` with configure, build and test presets for macOS, Linux and Windows, including sanitizer and static-analysis variants. Each is gated on the host system, so a listing only offers what the current machine can build. - Consolidates the AI assistant skills into `.agents/skills/`, which Claude Code, GitHub Copilot and Cursor all read, replacing two copies that had drifted into contradicting each other. - Corrects the build documentation: the Windows toolchain is CLANG64 rather than MinGW64, and the previous "no need to specify number of jobs" advice holds only for Ninja. #### Motivation for adding to Mudlet The instructions presented platform-specific build advice as though it were universal, so following them on the wrong platform produced either an unbounded parallel build or a toolchain the setup scripts refuse to run. #### Other info (issues closed, discussion etc) `windows-debug` has been exercised on Windows: `CI/setup-windows-sdk.sh` in an MSYS2 CLANG64 shell, then configure and build both to completion against Qt 6.11.1 and Clang 22.1.7. `cmake --list-presets` correctly offered only `windows-debug` there. Note that `windows-debug` is a Debug configuration, whereas `CI/build-mudlet-for-windows.sh` builds Release, so the two are not equivalent. `.claude/skills` is a symlink to `.agents/skills`, following the existing pattern used by `CLAUDE.md`, `AGENTS.md` and `.cursorrules`. On Windows checkouts without `core.symlinks` it lands as a plain file, in which case Copilot and Cursor still read `.agents/skills` directly. **Test case:** `cmake --preset macos-debug && cmake --build --preset macos-debug`, then `ctest --preset macos-debug`. `cmake --list-presets` should offer only the current platform's presets, and a variant such as `macos-debug-nosan` should build into `build-macos-debug-nosan/` while leaving `build/` untouched. --------- Signed-off-by: Michael Conley <sousesider@gmail.com> |
||
|
|
3c64303e65
|
Infrastructure: busted specs for the last uncovered UI functions (#9775)
#### Brief overview of PR changes/additions - 134 new busted specs in `UI_spec.lua` for 24 UI functions that had no coverage anywhere: label movies, console buffer sizing, main window size, saved window layout, the application/profile style sheets, toolbar buttons, command line actions, `setPopup` and `createLabel` into a user window. - Effects are read back for real, not just return values: movies through `getProfileStats().gifs`, buffer limits through observed line trimming, `setAppStyleSheet` through the `sysAppStyleSheetChange` it raises, toolbars through `isActive()`, and the user window label by hiding its parent. No binary fixture is committed - the movie specs assemble a three-frame GIF89a at run time. - The button specs install a tiny action package for the block, because Lua cannot make a push-down button and cannot remove a `tempButton` again; everything created is taken away in teardown, including the two layout files that live outside the profile. #### Motivation for adding to Mudlet Last of the busted-reachable UI rows in the Lua API test-coverage program. Nine functions turned out to have no reachable readback at all and are marked `pending()` with the reason rather than given a spec that cannot fail. #### Other info (issues closed, discussion etc) Bugs found while writing these, all left unspecced and marked `pending()` instead: - `Host::setMovie` hands the `QMovie` to the gif tracker before reading the file, so a refused `setMovie` still counts one in `getProfileStats()`, and over a working movie it leaves the label driving a dead one. - `createLabel` puts the label in the main window and answers `true` when the parent window name is not a window. - `showToolBar`/`hideToolBar` only answer to a package's name, never a packaged toolbar's own name, and move every toolbar in the package at once; an unmatched name is a silent no-op. - `setPopup` takes a `luaL_ref` per function command before its size check and window lookup, so both error paths strand registry references. - `clearCmdLineSuggestions` gates on `n == 1` where `addCmdLineSuggestion` gates on `n > 1`, so a second argument silently retargets the main command line. - `setConsoleBufferSize` never floors the batch deletion size, so `0` stops the buffer shrinking at all. Pre-existing and untouched here: on a reused profile the suite's second run fails `getMainWindowSize returns a positive width and height` - it reproduces identically on development. **Test case:** full busted suite green on a fresh profile (2534 successes, 141 pending, +2.7s in `UI_spec`), and twice on one reused profile with the same single pre-existing failure development has; 35 of the 134 new specs (26%) verified to fail when the underlying C++ is locally broken, and the new `MUDLET_TEST_REQUIRE_WINDOW_RESIZE` gate proven to fail rather than skip when a resize stops working. Assisted-by: Claude:claude-opus-5 |
||
|
|
8901b59d84
|
infrastructure: keep QTest's output visible when ctest runs on Windows (#9751)
#### Brief overview of PR changes/additions - Appends `QT_ASSUME_STDERR_HAS_CONSOLE=1` to the `ENVIRONMENT` test property of every registered test - 95 of 95 confirmed with `ctest --show-only=json-v1` - leaving each test's existing `ASAN_OPTIONS`, `QT_QPA_PLATFORM` and `ENVIRONMENT_MODIFICATION` untouched. - One `cmake_language(DEFER CALL)` per directory that registers tests, rather than the variable copy-pasted into a dozen strings, so a test added later cannot miss it wherever in the file it lands. - Drops the 8 `QT_FORCE_STDERR_LOGGING` entries from the four workflows. `shouldLogToStderr()` is `forceStderrLogging() || stderrHasConsoleAttached()`, so the test property now covers what CI was setting by hand, and every one of those steps runs nothing but `ctest`. #### Motivation for adding to Mudlet Qt on Windows diverts QTest's output to `OutputDebugString` unless it believes stderr has a console attached, and an MSYS2 shell gives it none, so a failing test reported an exit code with no `FAIL!` lines, no compared values and no totals. Setting it as a test property fixes local runs and CI from one place instead of two. #### Other info (issues closed, discussion etc) **Test case:** full Linux `ctest` suite 95/95 pass; `ctest --show-only=json-v1` shows all 95 tests carrying the variable with no other property changed; `ctest -V` shows it in the test process environment. The Windows behaviour itself is not reproducible on Linux - it rests on the reporter's 219 vs 12233 byte A/B and on `QPlainTestLogger::outputMessage`, which only calls `OutputDebugStringA` when `!QtPrivate::shouldLogToStderr()`. Closes #9747 Assisted-by: Claude:claude-opus-5 |
||
|
|
72023317ed
|
infrastructure: fix Windows CI losing the per-user luarocks tree (#9752)
#### Brief overview of PR changes/additions - Windows CI no longer pipes `luarocks path --lr-path/--lr-cpath` through `cygpath -u`; the raw Windows-form output is exported instead. - Same 4-line block fixed in all 5 places: `CI/build-mudlet-for-windows.sh` and both Windows workflows (QTest + Lua tests steps in each). - Added a short note at each site saying why cygpath must not be reintroduced. #### Motivation for adding to Mudlet `cygpath -u` does not know `;` delimits a list, so it rewrites only the leading entry into a POSIX path the native Windows Lua cannot open - which is exactly the per-user rock tree, so CI silently ran without those rocks. #### Other info (issues closed, discussion etc) Fixes #9750 Verified functionally in a real MSYS2 CLANG64 shell on a Windows 11 VM, with a canary module installed into `$HOME/.luarocks-CLANG64`: Raw luarocks output: ``` C:\msys64\home\Bob\.luarocks-CLANG64\share\lua\5.1\?.lua;C:\msys64\home\Bob\...\?\init.lua;C:\msys64\clang64\share\lua\5.1\?.lua;... ``` After `cygpath -u` (what CI did): ``` /home/Bob/.luarocks-CLANG64/share/lua/5.1/?.lua;C:/msys64/home/Bob/... ``` Only element 1 is genuinely converted, and `C:\home` does not exist on the guest. Running the native `/clang64/bin/lua5.1`: | `LUA_PATH` value | `require 'zzcanary'` | | --- | --- | | raw luarocks output | `true canary-ok` | | `cygpath -u` output | fails: `no file '/home/Bob/.luarocks-CLANG64/share/lua/5.1/zzcanary.lua'` | | `cygpath -u -p` output | worse: `:`-separated, Lua reads the whole list as one filename | `LUA_CPATH` behaves the same (the per-user `.dll` is unreachable after `cygpath -u`, found before it). Also confirmed MSYS2 does not auto-convert these variables when spawning a native child, so nothing was masking the defect. `CI/setup-windows-sdk.sh` already prints the raw form as the recommended Qt Creator environment, so CI now matches its own setup advice. Separately, #9749 (the functional tests never receiving `LUA_PATH`/`LUA_CPATH` at all) is a different root cause and is not addressed here. **Test case:** Windows CI green; the QTest and Lua test steps log `LUA_PATH`/`LUA_CPATH` in `C:\...;C:\...` form and busted/lfs/rex_pcre2 load from the per-user tree. Assisted-by: Claude:claude-opus-5 Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> |
||
|
|
ff6bd8755a
|
Infrastructure: Bump lukka/get-cmake from 4.4.0 to 4.4.2 (#9729)
Bumps [lukka/get-cmake](https://github.com/lukka/get-cmake) from 4.4.0 to 4.4.2. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/lukka/get-cmake/releases">lukka/get-cmake's releases</a>.</em></p> <blockquote> <h2>CMake v4.4.2</h2> <p>The <code>get-cmake</code> action downloads and caches CMake and Ninja on your workflows. Versions can be specified using <a href="https://docs.npmjs.com/about-semantic-versioning">semantic versioning ranges</a> using <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L13"><code>cmakeVersion</code></a> and <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L16"><code>ninjaVersion</code></a> inputs.</p> <p>Changes:</p> <ul> <li><code>latest</code> is now using CMake version <code>v4.4.2</code>, use this one-liner e.g.: <code>uses: lukka/get-cmake@latest</code></li> </ul> <p>Enjoy!</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
964a3aeb7e
|
infra: tidy up how CI installs Lua (#9734)
#### Brief overview of PR changes/additions - lua.org is reachable again, so the mirror-fallback pre-build step from #9732 is removed. - In its place, `gh-actions-lua`'s build cache is turned on (it was explicitly off since 2022 with no recorded reason): every run restores `.lua/` from the actions cache, so lua.org is only contacted when the cache is cold. - The `lua:5.1.5:linux:x64` cache entry already exists in the repo and is touched daily by other workflows; the macOS entries get created on this PR's own run and the nightly scheduled builds keep all platforms warm from then on. #### Motivation for adding to Mudlet The 35-line shell workaround duplicated the action's build logic in two files and leaned on undocumented action behaviour. The cache achieves nearly the same outage protection using the action as designed - the one remaining exposure is lua.org being down at the same time as a cache eviction (7 days unused). #### Other info (issues closed, discussion etc) Test case: this PR's own CI runs the modified workflow - macOS legs build Lua once from lua.org and save the cache, the Linux leg restores the existing daily-used cache entry. Assisted-by: Claude:claude-fable-5 |
||
|
|
3e36ed4721
|
Infrastructure: Bump github/codeql-action from 4.37.3 to 4.37.6 (#9730)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.3 to 4.37.6. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action's releases</a>.</em></p> <blockquote> <h2>v4.37.6</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <h2>v4.37.5</h2> <ul> <li>Fixed a bug where a network error while streaming the download of the CodeQL bundle could terminate the <code>init</code> Action instead of falling back to downloading the bundle before extracting it. <a href="https://redirect.github.com/github/codeql-action/pull/4061">#4061</a></li> </ul> <h2>v4.37.4</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's changelog</a>.</em></p> <blockquote> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <h2>4.37.5 - 03 Aug 2026</h2> <ul> <li>Fixed a bug where a network error while streaming the download of the CodeQL bundle could terminate the <code>init</code> Action instead of falling back to downloading the bundle before extracting it. <a href="https://redirect.github.com/github/codeql-action/pull/4061">#4061</a></li> </ul> <h2>4.37.4 - 29 Jul 2026</h2> <ul> <li>This version of the CodeQL Action adds support for the <code>tools</code> input for the <code>codeql-action/init</code> step to be specified using a <code>github-codeql-tools</code> <a href="https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization">repository property</a>. This feature will gradually be rolled out following the release of this version. Once rolled out, this allows for the CodeQL CLI version that is used in GitHub-managed workflows, such as Default Setup, to be set to a custom value. For example, customers who run into issues with rate limits when a new CodeQL CLI version is released can set the value to <code>toolcache</code> to always use the CodeQL CLI version that is available in the runner toolcache. For Advanced Setup workflows, the value provided for <code>tools</code> in the workflow definition always takes precedence unless the value of the repository property starts with <code>!</code>. <a href="https://redirect.github.com/github/codeql-action/pull/4037">#4037</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.2">2.26.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4051">#4051</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
0618512c2f
|
Fix macOS builds sometimes failing their tests for no reason (#9733)
#### Brief overview of PR changes/additions - The macOS Lua test step's 1-minute timeout now fires mid-suite on a slow Intel runner: the suite takes 43-60s there (31s on arm64), so a slow run gets killed while tests are still finishing and the job reads as a failure. - The timed-out runs were not hung: in the 2026-08-07 failure, `mudlet::closeEvent` arrived 0.6 seconds before the 60-second cutoff, with every spec already passed. - Raise the step timeout to 3 minutes, matching the Linux leg, in both paired build workflows. #### Motivation for adding to Mudlet Three required-check failures on 2026-08-07 (two on development pushes, one on a PR) were this timeout, not real breakage. All previous "macOS timed out" theories pointed at a shutdown hang; the step logs' timestamps show there is none. #### Other info (issues closed, discussion etc) Test case: timestamp analysis of passing vs timed-out runs of `(macOS) Run Lua tests` (jobs 93008145745 and 92999008773) - the failed run's shutdown began 59.6s into a 60s budget. No timeout existed before 2026-08-07 because the suite only recently grew past a minute on the slower runners. Assisted-by: Claude:claude-fable-5 |
||
|
|
24b9128076
|
fix: unbreak development - cloneExportDocument was renamed to takeExportDocument (#9732)
#### Brief overview of PR changes/additions - Every CI job on development has been red since |
||
|
|
71f736297b
|
infrastructure: reject a release tag that does not match APP_VERSION (#9701)
#### Brief overview of PR changes/additions - Adds `CI/check-release-tag.sh`: APP_VERSION must be three-component, and a release tag must be exactly `Mudlet-<APP_VERSION>`. - Wires it into the tag-build validation (`CI/validate_deployment.sh`, `CI/validate-deployment-for-windows.sh`) so a bad tag fails minutes after the push, before an asset exists, and into `create-github-release.yml` as the last gate before anything is published. The PTB path gets the version-shape half, which nothing checks on `development` today. - Covers it with `test/ci/release-tag-version-test.sh`, registered as `ReleaseTagVersionTest`. #### Motivation for adding to Mudlet Tagging `Mudlet-5.0` instead of `Mudlet-5.0.0` would strand the entire 4.22.0 user base with no error anywhere, and it is the one version mistake CI does not currently catch. The updater takes the version it offers from the tag, not the binary: `Release::Release()` strips the `Mudlet-` prefix (`src/updater/Release.cpp:49`) and `SemVer::getRegExp()` needs three components (`src/updater/SemVer.cpp:111`), so `"5.0"` is invalid, `Release::operator<` (`src/updater/Release.cpp:96`) reports the release as not newer, and `Feed::getUpdates()` returns nothing. The update check goes on logging `0 update(s) available` - the same line as a week with no release. The asymmetry is what makes it dangerous. A stale APP_VERSION with a correct tag fails loudly, because `CI/prepare-release-assets.sh:62` rejects assets by tag prefix. A short tag with a correct APP_VERSION passes everything, because `Mudlet-5.0.0-linux-x64.AppImage.tar` genuinely does start with `Mudlet-5.0`. **Why the build scripts and not only the workflow:** `create-github-release.yml` is `workflow_run`-triggered, so it cannot fail before the assets are built - by the time it runs, the full matrix has already finished. The validate scripts run at the start of every tag build on all three platforms and already parse APP_VERSION, so that is where the fast failure belongs. The workflow keeps a copy because it always runs from the default branch, so it still guards a tag placed on a commit that predates this change. APP_VERSION is deliberately left at 4.22.0 - bumping it is a release decision, not a QA fix. This guard is what catches a mismatch when the bump happens. #### Other info (issues closed, discussion etc) From the 5.0 release QA sweep, finding C1, "A two-component release tag silently disables auto-update for every existing user". Pre-existing mechanism, no single commit introduced it. Three claims from an earlier draft did not survive checking and were corrected: `src/sparkleupdater.mm` installs no `versionComparatorForUpdater:`, so Sparkle's default component-wise comparator would still offer `5.0` over `4.22.0` (macOS breaks on the opposite mismatch instead); the update check does log, it is just indistinguishable from having nothing to offer; and SemVer does accept a prerelease component, so rejecting `Mudlet-5.0.0-rc1` follows from APP_VERSION being unable to carry a suffix, not from the updater. No video - a CI guard is not visually observable. The shell output below is the evidence instead. **Test case:** `ctest -R ReleaseTagVersionTest`, and the guard run directly: ``` $ CI/check-release-tag.sh 5.0.0 Mudlet-5.0.0 Release tag 'Mudlet-5.0.0' matches APP_VERSION '5.0.0'. exit=0 $ CI/check-release-tag.sh 5.0.0 Mudlet-5.0 error: release tag 'Mudlet-5.0' does not match APP_VERSION '5.0.0'. The tag has to be exactly 'Mudlet-5.0.0'. Publishing under a mismatched tag breaks auto-update, without saying so. [...] exit=1 ``` Replayed over every release tag since 4.18.5, each against the APP_VERSION at that tag - all accepted, so the guard blocks nothing Mudlet has actually shipped. Executing the real `Determine release type` step under GitHub's shell flags fails on `Mudlet-5.0` + `5.0.0` and on a PTB with APP_VERSION `5.0`, and passes on `Mudlet-5.0.0` + `5.0.0` and on a normal PTB. The updater trace was confirmed by compiling `Release.cpp` + `SemVer.cpp` and comparing: tag `Mudlet-5.0.0` gives `(4.22.0 < release) = true`, tag `Mudlet-5.0` gives `false`. Assisted-by: Claude:claude-opus-5 |
||
|
|
c2d3561c0b
|
infrastructure: assign milestones with the built-in token, not a PAT (#9696)
#### Brief overview of PR changes/additions - The add-milestone check now fails on every PR: the Mudlet org forbids fine-grained PATs with a lifetime over 366 days, so every API call made with `GH_PAT_UPDATE_PULL_REQUESTS` returns HTTP 403. The old workflow swallowed this with unchecked `curl -s`; the strict error handling from #9679 (infrastructure: fix milestone assignment, unbreak the key sequence tests) surfaced it - first failure 25 minutes after that merge. - Switches the "Assign PR to milestone" step to the built-in `GITHUB_TOKEN`, which already works in this workflow (the milestone-resolving step uses it and succeeded in the failing runs). `pull_request_target` runs in the base repository, so it has write access with `issues: write` / `pull-requests: write` granted. - Removes the dependency on the `GH_PAT_UPDATE_PULL_REQUESTS` secret entirely, so no PAT needs re-minting and no future expiry can break this again. Note: because this runs on `pull_request_target`, the default-branch copy of the workflow executes - the fix only takes effect after merge, so the add-milestone check on this PR itself will still fail. #### Test case The failing run's own log shows `GITHUB_TOKEN` succeeding at the milestone-read step while the PAT step 403s, confirming the built-in token works where the PAT does not. Assisted-by: Claude:claude-fable-5 |
||
|
|
a099a20aee
|
infrastructure: fix milestone assignment, unbreak the key sequence tests (#9679)
#### Brief overview of PR changes/additions - `add-milestone` resolves the milestone by exact title first and then by version prefix, so `5.0.0` finds `5.0.0 next release` again, and fails loudly instead of assigning nothing. 191 PRs merged since 4.22.0 have no milestone. - `TKeySequenceEditTest`'s two focus traversal cases no longer fail under a bare Xvfb: ctest pins the offscreen platform on X11, and a direct run without a window manager skips with a message instead of burning the activation timeout twice. #### Motivation for adding to Mudlet Both were failing silently. The milestone step matched a title that no longer exists and exited 0; and the traversal tests were the one red mark in an otherwise green local suite, which everybody had to re-derive as environmental. The milestone lookup is now a script under `.github/scripts/`, covered by a new `MilestoneResolutionTest` that runs it against a stubbed `gh`. Re-introducing the original bug makes that test fail. Worth knowing: `add-milestone` on this PR still assigned nothing, because `pull_request_target` runs the copy of the workflow that is on the base branch. It takes effect for pull requests opened after this merges. #### Other info (issues closed, discussion etc) - Closes #9671 - CI: add-milestone silently assigns nothing - metadata says "4.23.0" but the milestone is titled "4.23.0 next release" - Closes #9575 - TKeySequenceEditTest: two traversal tests fail under bare Xvfb (no window manager) Test case: `ctest -R 'MilestoneResolutionTest|TKeySequenceEditTest'`, plus `xvfb-run --auto-servernum ctest -R TKeySequenceEditTest` for the case #9575 is about. Assisted-by: Claude:claude-opus-5 |
||
|
|
e91b8596fd
|
infrastructure: MMCP effect specs against a scripted chat peer (#9629)
#### Brief overview of PR changes/additions - Adds `CI/mmcp-peer.py`, a scripted MMCP chat peer: it accepts the call `mmcp.call()` places, completes the MudMaster handshake, records every protocol command Mudlet sends and sends chat traffic back when a spec asks it to. Its ports are ephemeral and reach Mudlet through `MUDLET_TEST_MMCP_DIR`, so parallel CI jobs and worktrees cannot collide on MMCP's default 4050. - Adds 45 MMCP effect specs to `Networking_spec.lua` covering 18 of the 25 `mmcp.*` entry points, in both directions: the bytes Mudlet puts on the wire (chat, personal chat, emote, group, side channel, snoop, ping, name change, per-peer flags) and what it does with what arrives (`sysMMCPChatMessage`, `sysMMCPSideChannelMessage`, `sysMMCPIncomingSnoopMessage`, snoop permission gating, connection lists it is asked to dial, commands split across reads or batched into one, ignore, rename, disconnect). - Starts the peer in the Linux/macOS Lua test steps of both build workflows, mirroring the HTTP fixture immediately above it, with a `MUDLET_TEST_REQUIRE_MMCP_PEER` gate so a fixture that fails to start fails CI instead of quietly pending. #### Motivation for adding to Mudlet The `mmcp.*` family had no effect coverage at all: its behaviour only exists once a peer is on the other end of a socket, so the existing specs could only check the offline nil+message contracts. Nothing would have caught a change to what Mudlet actually sends, or to how it handles what it is sent. **Test case:** 1890 successes / 0 failures / 1 pending with the peer (green twice), 1846 / 0 / 45 pending without it; 11 sabotages of the MMCP C++ (chat payloads, group field width, flag order, ping reply, side channel separator and regex, snoop request, unchanged-name short circuit, partial-command buffering) failed 14 specs and nothing else. #### Other info (issues closed, discussion etc) The other 7 entry points cannot be reached at all: `mmcp.accept`, `mmcp.deny`, `setDoNotDisturb`, `startServer`, `stopServer`, `request` and `peek` have their registration into the Lua `mmcp` table commented out in `TLuaInterpreter.cpp`. Without `startServer` Mudlet cannot listen either, so no incoming call can be staged. That is left as a pending spec rather than worked around - worth a look on its own, since Mudlet's pending-call message tells the user to run `mmcp.accept(id)`, which today does not exist. The peer holds one call at a time, so effects that need two connected peers (`setPrivate`'s filtering, `serve`'s forwarding, a non-empty peek list) are still uncovered. Windows runs the Lua suite but starts fixtures inside the test shell rather than in a step of their own, so the block pends there by design. Assisted-by: Claude:claude-opus-5 |
||
|
|
8dd99e4db6
|
Fix: Sounds going silent when a file fails to load (#9612)
#### Brief overview of PR changes/additions Follow-up hardening on top of #9569. Two ways a media player could end up silent while still holding its source, plus the crash and the test gaps found chasing them. **A track that fails to load.** Nothing in `TMedia` listened for `QMediaPlayer::errorOccurred`. A player that was already stopped when its source failed reports no playback state change — and that signal is what ends a playback, releases the source and raises `sysMediaFinished`. The track fell silent holding a file nothing would ever release. The error is now acted on. **A track stopped while it is still loading.** Qt already considers an unstarted player stopped, so `stop()` draws no state change out of one mid-load, with the same result. This is not a narrow race: on an asynchronous backend the Linux and Windows runners hit it every time. `stopMedia()` now ends such a playback itself instead of waiting for a report that is never coming. Around those: - The deferred source release is a single function shared by the stop, error and teardown paths. Whether the player's own state gets a say differs between them, so callers pass a `PlaybackEnd`: a stop needs it, because a restart may be in flight and a player loading its next source looks identical to a stopped one; a failure must *not* have it, because a backend can report `PlayingState` for media it has just failed to load. - Re-sourcing a player goes through `claimSource()`, `continuePlaying()` and `releaseSource()`, so the generation bump that tells a pending release the track has moved on cannot be forgotten at a call site. A missed bump is what let an earlier revision of #9569 clear the source of a track that had just been restarted. - `stopMedia()` empties the playlist, so an explicit stop cannot leave a loop armed to restart itself from the `EndOfMedia` handler. - `setupVideo()` failing now releases the source it claimed, and hides the video widget only under the same `mediaWidget`/`mediaClose` guards the deferred release uses — previously it could hide a label belonging to an earlier clip. - `src/dlgTriggerEditor.cpp` is here for one guard: `runScheduledCleanReset()` repopulates itself from a `Host` that a profile teardown has already destroyed. Unrelated to media, but it crashed the media tests once they started running. Behaviour worth knowing about when reviewing: - `sysMediaFinished` now fires for a failed load and for a stop issued mid-load, where nothing fired before. It is suppressed when the source has already been released, where it would only have carried an empty file name and path. - `purgeMediaCache()` returns `false` when the directory could not be fully removed, instead of always returning `true`. - The closing closed caption is suppressed between the passes of a looping track, and printed by `stopAllMediaPlayers()`, which releases synchronously. - `TMedia` gains three read-only diagnostics used by the tests — `playersHoldingSource()`, `mediaPlayerCount()` and `playersInPlayingState()`. A deferred release is otherwise unobservable: `playingMedia()` has already dropped the player, the caption needs captions enabled, and the video signal needs a widget. Tests: new slots for a finite `loops=N` track, an explicit stop, an unplayable source and a reused player. `probeBackend()` measures what the backend can demonstrate — whether it starts playback at all, decodes to `EndOfMedia`, orders `EndOfMedia` against `StoppedState`, starts synchronously, and reports an undecodable file — and each test skips on the capabilities it needs, printing what was measured. `QT_MEDIA_BACKEND` is pinned to whatever `main.cpp` ships per platform, since `QTEST_MAIN` does not run `main.cpp` and the tests were otherwise exercising Qt's default backend rather than the one users get. #### Motivation for adding to Mudlet Both silent-failure cases are real and user-visible. A game sending a filename Qt cannot decode, or a file gone from the media cache, would kill the sound and leak the player's source while reporting nothing; and `stopMusic()` shortly after `playMusic()` would leak the source every time on Windows and Linux. A script chaining tracks off `sysMediaFinished` waited forever in both cases. They share a root cause with #9566: the deferred release could not tell what the player was doing when its turn came around. The `claimSource()`/`continuePlaying()`/`releaseSource()` encapsulation is the durable part — it turns "remember to bump the counter" from a convention into something the API does for you. The test work matters as much as the fixes. The #9566 regression guard was skipping on every CI job, so it was protecting nothing; both bugs above were caught only once it actually ran. #### Other info (issues closed, discussion etc) Follow-up to #9569 / #9566. No issue number of its own. Testing notes: the full functional suite passes — 66/66 on Linux, and the media suite is green on the Ubuntu, Windows and both macOS jobs. Backends differ in what they can demonstrate, so some media tests skip by design. Under the environment ctest uses, six of the seven skip on macOS: the `darwin` backend starts playback synchronously and delivers `EndOfMedia` before `StoppedState`, so it can stage neither the claim race nor the #9566 ordering, and it does not decode under `QT_QPA_PLATFORM=offscreen`. Those paths run on the Ubuntu and Windows FFmpeg builds, which is where both bugs in this PR were caught. Every skip prints what the backend could not demonstrate and why, so an inert guard is visible rather than silent. --------- Signed-off-by: Michael Conley <sousesider@gmail.com> |
||
|
|
936e91d65c
|
infrastructure: Discord effect specs against a fake Discord IPC server (#9631)
#### Brief overview of PR changes/additions - `CI/discord-ipc-fixture.py`: a fake Discord IPC server that completes the genuine discord-rpc handshake, reports a logged-in user, and appends every frame Mudlet's copy of libdiscord-rpc sends to a JSON-lines capture file. It is the Python counterpart of `DiscordIpcServerStub` (#9475). - Both ubuntu workflows start the fixture before the Lua tests and put the bundled discord-rpc library on the load path, so ~20 Lua functions CI could never reach are exercised there for the first time. macOS is left alone: its test leg runs the unpackaged bundle, which has no `libdiscord-rpc.dylib` in it (only the installer copies one in), so the specs pend there as they do on Windows. #### Motivation for adding to Mudlet Discord rich presence was the largest block of Lua functions with no effect coverage at all - CI could not even load the library, so every one of them was only ever checked for the message it returns when denied. With a fake Discord client on the other end of the socket, the payloads themselves become assertable. #### Other info (issues closed, discussion etc) Two defects turned up while writing these and are left as `pending` specs rather than frozen in, each with a follow-up: the six Discord getters hand the stored text to `lua_pushfstring()` as its format string (`getDiscordDetail()` on `"Level %d Mage"` returns a garbage number, and a `%s` would dereference a pointer that was never passed - the text can come from the server over GMCP, so it is remotely reachable), fixed in the stacked #9660; and `localDiscordPresence` truncates at 127 bytes with no regard for UTF-8, putting an invalid frame on the wire, filed as #9634. Loading the library in CI makes Networking_spec.lua's 22 Discord availability-contract rows pend by their own design ("on a machine where Discord is live these pend"); that denial path stays covered by `TDiscordModeTest`. Moving those rows into `Discord_spec.lua`, where the fixture can arrange both states, is a deliberate follow-up and not done here. The Linux Lua step's `timeout-minutes` goes 1 -> 3 because these specs wait out real discord-rpc reconnects. **Test case:** full suite green twice with the fixture (1848 passed / 0 failed / 41 pending, 43 of those new) and once without it (1829 / 0 / 60, every Discord spec pending cleanly, no failures); leak detection clean under the CI leg's ASan settings; sabotaging six behaviours in `discord.cpp`/`TLuaInterpreterDiscord.cpp` failed 9 of the 41 active specs directly (22%), all reverted afterwards. Assisted-by: Claude:claude-opus-5 |
||
|
|
f7da6ca3da
|
improve: ship every default package as an mpackage (#9626)
#### Brief overview of PR changes/additions - Every package Mudlet preinstalls now lives in `src/packages/<name>/`, holding its `config.lua`, `.xml` and the `.mpackage` built from them - previously they were scattered across `src/` and `src/mudlet-lua/lua/`, and four had no metadata at all. - The game loaders (Carrion Fields, Icesus, MorgenGrauen, Medievia) and the two `mudlet.org` dev packages shipped as bare xml, so the Package Manager showed them with no version, author or description. They are packaged now, keeping their existing package names so nothing renames on upgrade. - New `DefaultPackagesTest` walks the preinstall table for seven games, checks every queued path is really compiled in, and installs all 15 archives. #### Motivation for adding to Mudlet An mpackage carries Mudlet's metadata and a bare xml cannot. Keeping each package's sources next to its archive also makes the Lua reviewable in diffs, which a committed zip on its own is not. #### Other info Stacked on #9624, whose check now covers all 15 packages. The IRE mapper stays an xml because upstream publishes it that way and `update-3rdparty.yml` overwrites it weekly. Package repository PR Mudlet/mudlet-package-repository#746 updates the sync paths and must merge right after this. #### Test case `ctest` 66/67 locally (`TKeySequenceEditTest` is the known headless flake - passes under openbox); `DefaultPackagesTest` 28/28; `python3 CI/check-mpackage-sync.py --base-ref origin/development` clean. Assisted-by: Claude:claude-opus-5 --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> |
||
|
|
0b2e2548b2
|
infra: check mpackage archives match their sources (#9624)
#### Brief overview of PR changes/additions - Mudlet installs the `.mpackage` archive, not the loose `config.lua`/`.xml` next to it, so editing a source without re-zipping silently does nothing. `CI/check-mpackage-sync.py` compares every archive member against its sibling source file. - Packages the [package repository](https://github.com/Mudlet/mudlet-package-repository) syncs weekly need a version bump for `mpkg` to offer the update, so a content change that keeps the old version number is now an error too. - Enforced for base-ui, generic-mapper and gui-drop; `echo`, `run-lua-code` and `deleteOldProfiles` have loose `.xml` copies that already drifted from their archives, so those report as warnings rather than blocking this PR. #### Test case `python3 CI/check-mpackage-sync.py --base-ref origin/development` passes on development; it fails as intended when the base-ui `.xml` is edited without rebuilding the archive, and when the rebuilt archive keeps version `1.0.0`. Assisted-by: Claude:claude-opus-5 |
||
|
|
7bb4d14e8b
|
infrastructure: cut PR CI matrix in half and fix build flakes (#9618)
#### Brief overview of PR changes/additions - Drop the two compile-only Ubuntu builds (`ubuntu (x86_64)`, `ubuntu / clang`) from PR CI. Neither produces an artifact, and across the last 200 PRs neither was ever the sole failing job. Both still run on every push to development and nightly. - Build on the `xcb-util-cursor` mirror fallback already on development: keep its sha256 check, add a third mirror, per-mirror retries, and cache the built result so the network is not touched at all after the first run. - Fix the macOS bundle copy race: globbing directories alongside their contents made CMake emit a `copy_directory` rule that raced the per-file bundling rules under Ninja. - Skip the duplicate functional `ctest` run, and skip builds entirely for docs-only PRs. #### Motivation for adding to Mudlet PR builds were queueing for hours - macOS p90 queue was 148 minutes and 22% of commits took over 2h end to end - because 6 jobs per commit saturated the ~30-slot concurrency ceiling. #### Other info (issues closed, discussion etc) PR CI drops from 6 jobs to 4, roughly halving runner time per commit. All four outputs are unchanged: 64-bit Linux, Intel macOS, ARM macOS, 64-bit Windows. `ubuntu / clang` has already been removed from the required status checks on development; the other four required checks are still produced by this matrix. Docs-only skipping is deliberately implemented as a `changes` job plus a job-level `if:` rather than workflow-level `paths-ignore`, because a skipped workflow leaves required checks pending forever. It costs a ~20s hop before builds start on every PR. **Test case:** CI on this PR shows 4 build jobs instead of 6 (`ubuntu / gcc / lua tests + leak detection`, both macOS, `windows64`) with no `Run QTest` step on any of them - confirm they go green and the macOS jobs still upload artifacts to make.mudlet.org. For the docs-only path, push a commit touching only a `.md` file and confirm the build jobs report skipped and the PR stays mergeable. --------- Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> Co-authored-by: Vadim Peretokin <vadi2@users.noreply.github.com> |
||
|
|
9634c394b8
|
fix: Windows auto-update failing on a release binary with no checksum (#9617)
#### Brief overview of PR changes/additions - Never publish a release binary without a matching `SHA256SUMS.txt` entry: merge over the already-published file instead of overwriting it, set aside assets belonging to a different build than the release tag, and gate the upload on every binary having an entry that matches its bytes. - Say which check failed in the updater - missing checksums, undownloadable checksums, no entry for this platform, unreadable checksum file - instead of one message for all of them. - Add `UpdaterChecksumTest` and `ReleaseChecksumsTest`; both fail if the fix is reverted. #### Motivation for adding to Mudlet Windows auto-update failed with "Could not verify the integrity of the download", so PTB users could not update at all. `create-github-release.yml` runs once per platform build workflow and uploads with `--clobber`, so the 2026-08-02 run regenerated `SHA256SUMS.txt` from its own subset of sidecars and overwrote the complete file while the earlier `.exe` stayed published. The updater was right to refuse it. #### Other info (issues closed, discussion etc) Test case: `ctest -R 'UpdaterChecksumTest|ReleaseChecksumsTest'`. Verified on a Windows 11 VM against a scratch release reproducing the exact layout: before, the Download Error dialog; after replacing only `SHA256SUMS.txt` with what the new script produces, the installer downloaded, verified and staged. `requireChecksums` is unchanged - nothing accepts an unverified download that did not before. Not fixed here: PTBs ship Windows-only when the scheduled Linux/macOS build is still queued, which is why the 2026-08-03 PTB has one asset. Assisted-by: Claude:claude-opus-5 |
||
|
|
7ca3198bd7 |
infrastructure: keep the HTTP fixtures byte-exact, harden the Windows step
Windows CI checks out with core.autocrlf on, which turned the fixture's newline into CRLF and made three specs see 32 bytes where they expect 31. Also stop the server with a signal msys2 can deliver to a native process, print its log either way, cap the health check and declare the Python the fixture server needs. Assisted-by: Claude:claude-opus-5 |
||
|
|
74bd6748e8 |
infrastructure: run the HTTP fixture server on Windows CI
The 17 HTTP effect specs pended on Windows: only the Linux and macOS jobs start CI/http-fixture-server.py. Start it in the same msys2 shell that runs the tests, since a backgrounded process is not guaranteed to survive into the next step, and require the fixture (and the mock TTS engine) so a missing one fails the job instead of skipping the specs. Assisted-by: Claude:claude-opus-5 |
||
|
|
d762957bba |
infrastructure: fix Windows media path assert, spare the media cache
sysMediaStarted carries QUrl::path(), which prefixes a drive-lettered Windows path with a slash, so the path assertion failed on windows64. Normalise it before comparing. purgeMediaCache() empties the whole profile media directory, so the purge spec now moves anything that is not its own fixture aside and puts it back. Record what CI answered about macOS: its runners start no player, so the media gate stays off there. Assisted-by: Claude:claude-opus-5 |
||
|
|
77056411f9 |
infrastructure: download, HTTP, media and TTS effect tests
Adds effect specs for downloadFile and the HTTP verbs against the local fixture server, for media playback via a generated WAV, and for the TTS family driven by Qt's mock engine. The download and HTTP smoke specs move out of Miscallaneous_spec into Networking_spec, where they are superseded by the effect specs. The fixture server grows an /echo endpoint that answers any verb and reports back the method, headers and body it received, so postHTTP, putHTTP, deleteHTTP and customHTTP can be checked against what actually went on the wire, and it sets a header and a cookie on every response so the response table each event carries can be checked too. CI gains MUDLET_TEST_REQUIRE_HTTP_FIXTURE and MUDLET_TEST_REQUIRE_MEDIA so a fixture server or media backend that stops reaching the specs fails the run rather than quietly skipping the coverage. Assisted-by: Claude:claude-opus-4-8 |
||
|
|
dfdcb137f5
|
Infrastructure: bump github/codeql-action from 4 to 4.37.3 (#9565)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4 to 4.37.3. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action's releases</a>.</em></p> <blockquote> <h2>v4.37.3</h2> <p>No user facing changes.</p> <h2>v4.37.2</h2> <ul> <li>The new address format for the <code>config-file</code> input that was introduced in CodeQL Action 4.37.0 is now enabled by default. In addition to the format described there, the <code>remote=</code> prefix can now be used to explicitly indicate that the input refers to a remote file. All previous input formats continue to be accepted as well. <a href="https://redirect.github.com/github/codeql-action/pull/4023">#4023</a></li> <li>The CodeQL Action can now make use of <a href="https://docs.github.com/en/code-security/how-tos/secure-at-scale/configure-organization-security/manage-usage-and-access/giving-org-access-private-registries">configured private registries</a> in Default Setup to retrieve CodeQL configuration files from remote repositories that require authentication. This will allow customers to store their CodeQL configuration in a single repository that can then be referenced by Default Setup workflows in other repositories. We expect to roll this and other, related changes out to everyone in July. <a href="https://redirect.github.com/github/codeql-action/pull/4007">#4007</a></li> </ul> <h2>v4.37.1</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.20.6 and earlier. These versions of CodeQL were discontinued on 1 July 2026 alongside GitHub Enterprise Server 3.16, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3956">#3956</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.1">2.26.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4019">#4019</a></li> </ul> <h2>v4.37.0</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.0">2.26.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3995">#3995</a></li> <li>In addition to the existing input format, the <code>config-file</code> input for the <code>codeql-action/init</code> step will soon support a new <code>[owner/]repo[@ref][:path]</code> format. All components except the repository name are optional. If omitted, <code>owner</code> defaults to the same owner as the repository the analysis is running for, <code>ref</code> to <code>main</code>, and <code>path</code> to <code>.github/codeql-action.yaml</code>. Support for this format ships in this version of the CodeQL Action, but will only be enabled over the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/3973">#3973</a></li> </ul> <h2>v4.36.3</h2> <p>No user facing changes.</p> <h2>v4.36.2</h2> <ul> <li>Cache CodeQL CLI version information across Actions steps. <a href="https://redirect.github.com/github/codeql-action/pull/3943">#3943</a></li> <li>Reduce requests while waiting for analysis processing by using exponential backoff when polling SARIF processing status. <a href="https://redirect.github.com/github/codeql-action/pull/3937">#3937</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.6">2.25.6</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3948">#3948</a></li> </ul> <h2>v4.36.1</h2> <p>No user facing changes.</p> <h2>v4.36.0</h2> <ul> <li><em>Breaking change</em>: Bump the minimum required CodeQL bundle version to 2.19.4. <a href="https://redirect.github.com/github/codeql-action/pull/3894">#3894</a></li> <li>Add support for SHA-256 Git object IDs. <a href="https://redirect.github.com/github/codeql-action/pull/3893">#3893</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.5">2.25.5</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3926">#3926</a></li> </ul> <h2>v4.35.5</h2> <ul> <li>We have improved how the JavaScript bundles for the CodeQL Action are generated to avoid duplication across bundles and reduce the size of the repository by around 70%. This should have no effect on the runtime behaviour of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3899">#3899</a></li> <li>For performance and accuracy reasons, <a href="https://redirect.github.com/github/roadmap/issues/1158">improved incremental analysis</a> will now only be enabled on a pull request when diff-informed analysis is also enabled for that run. If diff-informed analysis is unavailable (for example, because the PR diff ranges could not be computed), the action will fall back to a full analysis. <a href="https://redirect.github.com/github/codeql-action/pull/3791">#3791</a></li> <li>If multiple inputs are provided for the GitHub-internal <code>analysis-kinds</code> input, only <code>code-scanning</code> will be enabled. The <code>analysis-kinds</code> input is experimental, for GitHub-internal use only, and may change without notice at any time. <a href="https://redirect.github.com/github/codeql-action/pull/3892">#3892</a></li> <li>Added an experimental change which, when running a Code Scanning analysis for a PR with <a href="https://redirect.github.com/github/roadmap/issues/1158">improved incremental analysis</a> enabled, prefers CodeQL CLI versions that have a cached overlay-base database for the configured languages. This speeds up analysis for a repository when there is not yet a cached overlay-base database for the latest CLI version. We expect to roll this change out to everyone in May. <a href="https://redirect.github.com/github/codeql-action/pull/3880">#3880</a></li> </ul> <h2>v4.35.4</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.4">2.25.4</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3881">#3881</a></li> </ul> <h2>v4.35.3</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.19.3 and earlier. These versions of CodeQL were discontinued on 9 April 2026 alongside GitHub Enterprise Server 3.15, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3837">#3837</a></li> <li>Configurations for private registries that use Cloudsmith or GCP OIDC are now accepted. <a href="https://redirect.github.com/github/codeql-action/pull/3850">#3850</a></li> <li>Best-effort connection tests for private registries now use <code>GET</code> requests instead of <code>HEAD</code> for better compatibility with various registry implementations. For NuGet feeds, the test is now always performed against the service index. <a href="https://redirect.github.com/github/codeql-action/pull/3853">#3853</a></li> <li>Fixed a bug where two diagnostics produced within the same millisecond could overwrite each other on disk, causing one of them to be lost. <a href="https://redirect.github.com/github/codeql-action/pull/3852">#3852</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.25.3">2.25.3</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3865">#3865</a></li> </ul> <h2>v4.35.2</h2> <ul> <li>The undocumented TRAP cache cleanup feature that could be enabled using the <code>CODEQL_ACTION_CLEANUP_TRAP_CACHES</code> environment variable is deprecated and will be removed in May 2026. If you are affected by this, we recommend disabling TRAP caching by passing the <code>trap-caching: false</code> input to the <code>init</code> Action. <a href="https://redirect.github.com/github/codeql-action/pull/3795">#3795</a></li> <li>The Git version 2.36.0 requirement for improved incremental analysis now only applies to repositories that contain submodules. <a href="https://redirect.github.com/github/codeql-action/pull/3789">#3789</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's changelog</a>.</em></p> <blockquote> <h2>4.37.3 - 22 Jul 2026</h2> <p>No user facing changes.</p> <h2>4.37.2 - 21 Jul 2026</h2> <ul> <li>The new address format for the <code>config-file</code> input that was introduced in CodeQL Action 4.37.0 is now enabled by default. In addition to the format described there, the <code>remote=</code> prefix can now be used to explicitly indicate that the input refers to a remote file. All previous input formats continue to be accepted as well. <a href="https://redirect.github.com/github/codeql-action/pull/4023">#4023</a></li> <li>The CodeQL Action can now make use of <a href="https://docs.github.com/en/code-security/how-tos/secure-at-scale/configure-organization-security/manage-usage-and-access/giving-org-access-private-registries">configured private registries</a> in Default Setup to retrieve CodeQL configuration files from remote repositories that require authentication. This will allow customers to store their CodeQL configuration in a single repository that can then be referenced by Default Setup workflows in other repositories. We expect to roll this and other, related changes out to everyone in July. <a href="https://redirect.github.com/github/codeql-action/pull/4007">#4007</a></li> </ul> <h2>4.37.1 - 16 Jul 2026</h2> <ul> <li><em>Upcoming breaking change</em>: Add a deprecation warning for customers using CodeQL version 2.20.6 and earlier. These versions of CodeQL were discontinued on 1 July 2026 alongside GitHub Enterprise Server 3.16, and will be unsupported by the next minor release of the CodeQL Action. <a href="https://redirect.github.com/github/codeql-action/pull/3956">#3956</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.1">2.26.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4019">#4019</a></li> </ul> <h2>4.37.0 - 08 Jul 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.0">2.26.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/3995">#3995</a></li> <li>In addition to the existing input format, the <code>config-file</code> input for the <code>codeql-action/init</code> step will soon support a new <code>[owner/]repo[@ref][:path]</code> format. All components except the repository name are optional. If omitted, <code>owner</code> defaults to the same owner as the repository the analysis is running for, <code>ref</code> to <code>main</code>, and <code>path</code> to <code>.github/codeql-action.yaml</code>. Support for this format ships in this version of the CodeQL Action, but will only be enabled over the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/3973">#3973</a></li> </ul> <h2>4.36.3 - 01 Jul 2026</h2> <p>No user facing changes.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
d901e5c935
|
infrastructure: mock TTS engine and local HTTP server for tests (#9529)
#### Brief overview of PR changes/additions - Test mode selects Qt's mock text-to-speech engine, making TTS functions testable headlessly - CI busted runs get a local fixture HTTP server for download/HTTP specs - Smoke specs in Miscallaneous_spec.lua that skip cleanly when mock/server are absent #### Motivation for adding to Mudlet Unlocks TTS and HTTP Lua API coverage in CI with no real speech engine or network egress. #### Other info (issues closed, discussion etc) Part of the Lua API test-coverage program (Wave 0). No behavior change outside MUDLET_TEST_MODE. **Test case:** run the busted suite with the env vars from the workflow - TTS and HTTP smoke specs pass (or skip with a message when infra is absent). Awaiting build/test by a maintainer; squash-merge with: Assisted-by: Claude:claude-opus-4-8 (Signed-off-by to be added at squash after testing) |
||
|
|
0d769fbe84
|
infrastructure: survive xorg.freedesktop.org certificate expiry in CI (#9554)
#### Brief overview of PR changes/additions - The "(Linux) Build xcb-util-cursor" step now tries the canonical xorg.freedesktop.org first, then falls back to xcb.freedesktop.org/dist (valid cert, byte-identical tarball) - New sha256 integrity check (verified against the xorg-announce release email) makes any mirror trustworthy and hard-fails corrupt downloads #### Motivation for adding to Mudlet xorg.freedesktop.org's TLS cert expired 2026-07-28 11:20 UTC (verified via openssl: notAfter=Jul 28 11:20:31 2026), deterministically failing all three Ubuntu CI jobs on every PR since - reruns cannot clear it, and www/ftp.x.org 301-redirect back to the broken vhost. #### Other info (issues closed, discussion etc) Verified across 4 PRs' job logs (identical wget exit 5 = SSL failure) and reproduced standalone. Canonical-first ordering self-heals once upstream renews. Open PRs will need a merge-up after this lands. **Test case:** the exact step body run locally under bash -e: canonical fails fast, fallback downloads, checksum passes, tarball extracts (~1.5s); corrupting the file fails the checksum; all-mirrors-down exits 1 with a clear marker. Awaiting build/test by a maintainer; squash-merge with: Assisted-by: Claude:claude-fable-5 (Signed-off-by to be added at squash after testing) |
||
|
|
8483c3860e
|
infrastructure: memory leaks found during CI tests now fail the build (#9481)
#### Brief overview of PR changes/additions - Leak detection in the Lua-test CI job has been report-only since #8316 (`LSAN_OPTIONS` `exitcode=0`); flip to `exitcode=1` in both `build-mudlet.yml` and `build-mudlet-pr.yml` so any newly introduced leak fails the job - Add two narrow suppressions for OpenSSL 3 provider init noise (`OSSL_PROVIDER_try_load`, `OSSL_DECODER_do_all_provided`) so the check stays green when CI's Qt is bumped (these show up from Qt 6.12's `qtlsbackend_openssl`) #### Motivation for adding to Mudlet New memory leaks should break tests instead of scrolling past unnoticed - CI is currently leak-clean, so enforcement can be switched on at no cost. #### Other info (issues closed, discussion etc) Supersedes and closes #8366 - the leak fixes it bundled have since landed separately (remaining `TArea` one is in #9464), leaving only this exit-code flip outstanding. Verified end-to-end against the actual PTB binary from run 29674747600: a deliberately injected 1337-byte leak fails the busted suite with the configured exit code, and the current clean suite passes with `exitcode=1`. Note #8366 only patched `build-mudlet.yml`; this also covers `build-mudlet-pr.yml`, which PR builds actually use. One quirk: when LSan fails a run it exits without flushing stdout, so the busted summary won't print on leak-failing runs - the leak report on stderr is what to read. **Test case:** CI on this PR - the "ubuntu / gcc / lua tests + leak detection" job must pass with the new `exitcode=1` setting. Assisted-by: Claude:claude-fable-5 Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> Signed-off-by: Vadim Peretokin <vadim.peretokin@mudlet.org> |
||
|
|
4e550ea02a
|
Infrastructure: Bump actions/setup-node from 6 to 7 (#9457)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-node/releases">actions/setup-node's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <h3>Enhancements:</h3> <ul> <li>Add cache-primary-key and cache-matched-key as outputs by <a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1577">actions/setup-node#1577</a></li> <li>Migrate to ESM and upgrade dependencies by <a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1574">actions/setup-node#1574</a></li> </ul> <h3>Bug fixes:</h3> <ul> <li>Remove dummy NODE_AUTH_TOKEN export by <a href="https://github.com/gowridurgad"><code>@gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1558">actions/setup-node#1558</a></li> <li>Only use <code>mirrorToken</code> in <code>getManifest</code> if it's provided by <a href="https://github.com/deiga"><code>@deiga</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1548">actions/setup-node#1548</a></li> </ul> <h3>Documentation updates:</h3> <ul> <li>Add documentation for publishing to npm with Trusted Publisher (OIDC) by <a href="https://github.com/chiranjib-swain"><code>@chiranjib-swain</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1536">actions/setup-node#1536</a></li> <li>docs: Update restore-only cache documentation by <a href="https://github.com/priya-kinthali"><code>@priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1550">actions/setup-node#1550</a></li> <li>docs: Update caching recommendations to mitigate cache poisoning risks by <a href="https://github.com/chiranjib-swain"><code>@chiranjib-swain</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1567">actions/setup-node#1567</a></li> </ul> <h3>Dependency update:</h3> <ul> <li>Upgrade <code>@actions/cache</code> to 5.1.0, log cache write denied by <a href="https://github.com/jasongin"><code>@jasongin</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1569">actions/setup-node#1569</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/chiranjib-swain"><code>@chiranjib-swain</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1536">actions/setup-node#1536</a></li> <li><a href="https://github.com/deiga"><code>@deiga</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1548">actions/setup-node#1548</a></li> <li><a href="https://github.com/jasongin"><code>@jasongin</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1569">actions/setup-node#1569</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v6...v7.0.0">https://github.com/actions/setup-node/compare/v6...v7.0.0</a></p> <h2>v6.5.0</h2> <h2>What's Changed</h2> <ul> <li>Update <code>@actions/cache</code> to 5.1.0 and add security overrides for undici and fast-xml-parser by <a href="https://github.com/HarithaVattikuti"><code>@HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1579">actions/setup-node#1579</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v6.4.0...v6.5.0">https://github.com/actions/setup-node/compare/v6.4.0...v6.5.0</a></p> <h2>v6.4.0</h2> <h2>What's Changed</h2> <h3>Dependency updates:</h3> <ul> <li>Upgrade <a href="https://github.com/actions"><code>@actions</code></a> dependencies by <a href="https://github.com/Copilot"><code>@Copilot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li> <li>Update Node.js versions in versions.yml and bump package to v6.4.0 by <a href="https://github.com/priya-kinthali"><code>@priya-kinthali</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1533">actions/setup-node#1533</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Copilot"><code>@Copilot</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1525">actions/setup-node#1525</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v6...v6.4.0">https://github.com/actions/setup-node/compare/v6...v6.4.0</a></p> <h2>v6.3.0</h2> <h2>What's Changed</h2> <h3>Enhancements:</h3> <ul> <li>Support parsing <code>devEngines</code> field by <a href="https://github.com/susnux"><code>@susnux</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1283">actions/setup-node#1283</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
c7ffb1d228
|
Infrastructure: Bump lukka/get-cmake from 4.3.4 to 4.4.0 (#9456)
Bumps [lukka/get-cmake](https://github.com/lukka/get-cmake) from 4.3.4 to 4.4.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/lukka/get-cmake/releases">lukka/get-cmake's releases</a>.</em></p> <blockquote> <h2>CMake v4.4.0</h2> <p>The <code>get-cmake</code> action downloads and caches CMake and Ninja on your workflows. Versions can be specified using <a href="https://docs.npmjs.com/about-semantic-versioning">semantic versioning ranges</a> using <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L13"><code>cmakeVersion</code></a> and <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L16"><code>ninjaVersion</code></a> inputs.</p> <p>Changes:</p> <ul> <li><code>latest</code> is now using CMake version <code>v4.4.0</code>, use this one-liner e.g.: <code>uses: lukka/get-cmake@latest</code></li> </ul> <p>Enjoy!</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
3abae79443
|
infrastructure: merge release-4.22 back into development (#9386)
#### Brief overview of PR changes/additions - Version bump to 4.22.0 (development shows 4.22.0-dev, next PTBs identify as 4.22.0-ptb) - Windows installer signing fix: tag builds now export ARTIFACT_NAME/ARTIFACT_WINPATHORFILE so the SignPath installer chain runs on releases (it silently skipped on every SignPath-era release before 4.22.0), PTB-only artifact/gha_queue steps guarded off tags, and the signed installer is re-uploaded over the unsigned one on make.mudlet.org - next-milestone bumped to 4.23.0 #### Motivation for adding to Mudlet Standard post-release merge-back per the release checklist; propagates the release pipeline fixes validated by the 4.22.0 release (both SignPath requests fired and the shipped installer is signed - verified against SHA256SUMS). #### Other info (issues closed, discussion etc) Squash-merge like #9384. Keep the release-4.22 branch for potential hotfixes until the next release. **Test case:** validated live by the Mudlet-4.22.0 release: all jobs green, "(Windows) Sign installer with SignPath" and the re-upload step both succeeded, and the published installer's sha256 matches the signed artifact on mudlet.org and in SHA256SUMS.txt. --------- Signed-off-by: Vadim Peretokin <vperetokin@hey.com> |
||
|
|
1be06884b1
|
infrastructure: don't run DangerJS on release PRs (#9375)
#### Brief overview of PR changes/additions - Skip the DangerJS job when a PR's base is `main` (i.e. release PRs). #### Motivation for adding to Mudlet The open release PR (development -> main) has `development` as its head, so every dev push re-ran DangerJS and stamped a failing/pending `Danger` required status onto each dev commit. Contributor PRs (base `development`) are unaffected. **Test case:** Push to `development` -> danger job is skipped, no `Danger` status posted. Open a normal PR -> danger runs as before. |
||
|
|
344eff7204
|
Infrastructure: Bump actions/checkout from 6 to 7 (#9348)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <ul> <li>block checking out fork pr for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> <li>getting ready for checkout v7 release by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2464">actions/checkout#2464</a></li> <li>update error wording by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2467">actions/checkout#2467</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0</a></p> <h2>v6.0.3</h2> <h2>What's Changed</h2> <ul> <li>Update changelog by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2357">actions/checkout#2357</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>Update changelog for v6.0.3 by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2446">actions/checkout#2446</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/yaananth"><code>@yaananth</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6...v6.0.3">https://github.com/actions/checkout/compare/v6...v6.0.3</a></p> <h2>v6.0.2</h2> <h2>What's Changed</h2> <ul> <li>Add orchestration_id to git user-agent when ACTIONS_ORCHESTRATION_ID is set by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2355">actions/checkout#2355</a></li> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.1...v6.0.2">https://github.com/actions/checkout/compare/v6.0.1...v6.0.2</a></p> <h2>v6.0.1</h2> <h2>What's Changed</h2> <ul> <li>Update all references from v5 and v4 to v6 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2314">actions/checkout#2314</a></li> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> <li>Clarify v6 README by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2328">actions/checkout#2328</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6...v6.0.1">https://github.com/actions/checkout/compare/v6...v6.0.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>v7.0.0</h2> <ul> <li>Block checking out fork PR for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> </ul> <h2>v6.0.3</h2> <ul> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <h2>v6.0.2</h2> <ul> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <h2>v6.0.1</h2> <ul> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> </ul> <h2>v6.0.0</h2> <ul> <li>Persist creds to a separate file by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li> <li>Update README to include Node.js 24 support details and requirements by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li> </ul> <h2>v5.0.1</h2> <ul> <li>Port v6 cleanup to v5 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li> </ul> <h2>v5.0.0</h2> <ul> <li>Update actions checkout to use node 24 by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li> </ul> <h2>v4.3.1</h2> <ul> <li>Port v6 cleanup to v4 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li> </ul> <h2>v4.3.0</h2> <ul> <li>docs: update README.md by <a href="https://github.com/motss"><code>@motss</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li> <li>Add internal repos for checking out multiple repositories by <a href="https://github.com/mouismail"><code>@mouismail</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li> <li>Documentation update - add recommended permissions to Readme by <a href="https://github.com/benwells"><code>@benwells</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li> <li>Adjust positioning of user email note and permissions heading by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li> <li>Update README.md by <a href="https://github.com/nebuk89"><code>@nebuk89</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li> <li>Update CODEOWNERS for actions by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li> <li>Update package dependencies by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li> </ul> <h2>v4.2.2</h2> <ul> <li><code>url-helper.ts</code> now leverages well-known environment variables by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li> <li>Expand unit test coverage for <code>isGhes</code> by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li> </ul> <h2>v4.2.1</h2> <ul> <li>Check out other refs/* by commit if provided, fall back to ref by <a href="https://github.com/orhantoy"><code>@orhantoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
91912a5015
|
Infrastructure: Bump lukka/get-cmake from 4.3.2 to 4.3.4 (#9347)
Bumps [lukka/get-cmake](https://github.com/lukka/get-cmake) from 4.3.2 to 4.3.4. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/lukka/get-cmake/releases">lukka/get-cmake's releases</a>.</em></p> <blockquote> <h2>CMake v4.3.3</h2> <p>The <code>get-cmake</code> action downloads and caches CMake and Ninja on your workflows. Versions can be specified using <a href="https://docs.npmjs.com/about-semantic-versioning">semantic versioning ranges</a> using <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L13"><code>cmakeVersion</code></a> and <a href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L16"><code>ninjaVersion</code></a> inputs.</p> <p>Changes:</p> <ul> <li><code>latest</code> is now using CMake version <code>v4.3.3</code>, use this one-liner e.g.: <code>uses: lukka/get-cmake@latest</code></li> </ul> <p>Enjoy!</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
cfadde6b08
|
Infrastructure: Bump actions/cache from 5 to 6 (#9363)
Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/releases">actions/cache's releases</a>.</em></p> <blockquote> <h2>v6.0.0</h2> <h2>What's Changed</h2> <ul> <li>Update packages, migrate to ESM by <a href="https://github.com/Samirat"><code>@Samirat</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1760">actions/cache#1760</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v6.0.0">https://github.com/actions/cache/compare/v5...v6.0.0</a></p> <h2>v5.0.5</h2> <h2>What's Changed</h2> <ul> <li>Update ts-http-runtime dependency by <a href="https://github.com/yacaovsnc"><code>@yacaovsnc</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1747">actions/cache#1747</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v5.0.5">https://github.com/actions/cache/compare/v5...v5.0.5</a></p> <h2>v5.0.4</h2> <h2>What's Changed</h2> <ul> <li>Add release instructions and update maintainer docs by <a href="https://github.com/Link"><code>@Link</code></a>- in <a href="https://redirect.github.com/actions/cache/pull/1696">actions/cache#1696</a></li> <li>Potential fix for code scanning alert no. 52: Workflow does not contain permissions by <a href="https://github.com/Link"><code>@Link</code></a>- in <a href="https://redirect.github.com/actions/cache/pull/1697">actions/cache#1697</a></li> <li>Fix workflow permissions and cleanup workflow names / formatting by <a href="https://github.com/Link"><code>@Link</code></a>- in <a href="https://redirect.github.com/actions/cache/pull/1699">actions/cache#1699</a></li> <li>docs: Update examples to use the latest version by <a href="https://github.com/XZTDean"><code>@XZTDean</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1690">actions/cache#1690</a></li> <li>Fix proxy integration tests by <a href="https://github.com/Link"><code>@Link</code></a>- in <a href="https://redirect.github.com/actions/cache/pull/1701">actions/cache#1701</a></li> <li>Fix cache key in examples.md for bun.lock by <a href="https://github.com/RyPeck"><code>@RyPeck</code></a> in <a href="https://redirect.github.com/actions/cache/pull/1722">actions/cache#1722</a></li> <li>Update dependencies & patch security vulnerabilities by <a href="https://github.com/Link"><code>@Link</code></a>- in <a href="https://redirect.github.com/actions/cache/pull/1738">actions/cache#1738</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/XZTDean"><code>@XZTDean</code></a> made their first contribution in <a href="https://redirect.github.com/actions/cache/pull/1690">actions/cache#1690</a></li> <li><a href="https://github.com/RyPeck"><code>@RyPeck</code></a> made their first contribution in <a href="https://redirect.github.com/actions/cache/pull/1722">actions/cache#1722</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v5.0.4">https://github.com/actions/cache/compare/v5...v5.0.4</a></p> <h2>v5.0.3</h2> <h2>What's Changed</h2> <ul> <li>Bump <code>@actions/cache</code> to v5.0.5 (Resolves: <a href="https://github.com/actions/cache/security/dependabot/33">https://github.com/actions/cache/security/dependabot/33</a>)</li> <li>Bump <code>@actions/core</code> to v2.0.3</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/cache/compare/v5...v5.0.3">https://github.com/actions/cache/compare/v5...v5.0.3</a></p> <h2>v.5.0.2</h2> <h1>v5.0.2</h1> <h2>What's Changed</h2> <p>When creating cache entries, 429s returned from the cache service will not be retried.</p> <h2>v5.0.1</h2> <blockquote> <p>[!IMPORTANT] <strong><code>actions/cache@v5</code> runs on the Node.js 24 runtime and requires a minimum Actions Runner version of <code>2.327.1</code>.</strong></p> </blockquote> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/cache/blob/main/RELEASES.md">actions/cache's changelog</a>.</em></p> <blockquote> <h1>Releases</h1> <h2>How to prepare a release</h2> <blockquote> <p>[!NOTE] Relevant for maintainers with write access only.</p> </blockquote> <ol> <li>Switch to a new branch from <code>main</code>.</li> <li>Run <code>npm test</code> to ensure all tests are passing.</li> <li>Update the version in <a href="https://github.com/actions/cache/blob/main/package.json"><code>https://github.com/actions/cache/blob/main/package.json</code></a>.</li> <li>Run <code>npm run build</code> to update the compiled files.</li> <li>Update this <a href="https://github.com/actions/cache/blob/main/RELEASES.md"><code>https://github.com/actions/cache/blob/main/RELEASES.md</code></a> with the new version and changes in the <code>## Changelog</code> section.</li> <li>Run <code>licensed cache</code> to update the license report.</li> <li>Run <code>licensed status</code> and resolve any warnings by updating the <a href="https://github.com/actions/cache/blob/main/.licensed.yml"><code>https://github.com/actions/cache/blob/main/.licensed.yml</code></a> file with the exceptions.</li> <li>Commit your changes and push your branch upstream.</li> <li>Open a pull request against <code>main</code> and get it reviewed and merged.</li> <li>Draft a new release <a href="https://github.com/actions/cache/releases">https://github.com/actions/cache/releases</a> use the same version number used in <code>package.json</code> <ol> <li>Create a new tag with the version number.</li> <li>Auto generate release notes and update them to match the changes you made in <code>RELEASES.md</code>.</li> <li>Toggle the set as the latest release option.</li> <li>Publish the release.</li> </ol> </li> <li>Navigate to <a href="https://github.com/actions/cache/actions/workflows/release-new-action-version.yml">https://github.com/actions/cache/actions/workflows/release-new-action-version.yml</a> <ol> <li>There should be a workflow run queued with the same version number.</li> <li>Approve the run to publish the new version and update the major tags for this action.</li> </ol> </li> </ol> <h2>Changelog</h2> <h3>6.1.0</h3> <ul> <li>Bump <code>@actions/cache</code> to v6.1.0 to pick up <a href="https://redirect.github.com/actions/toolkit/pull/2435">actions/toolkit#2435 Handle cache write error due to read-only token</a></li> <li>Switch redundant "Cache save failed" warning to debug log in save-only</li> </ul> <h3>6.0.0</h3> <ul> <li>Updated <code>@actions/cache</code> to ^6.0.1, <code>@actions/core</code> to ^3.0.1, <code>@actions/exec</code> to ^3.0.0, <code>@actions/io</code> to ^3.0.2</li> <li>Migrated to ESM module system</li> <li>Upgraded Jest to v30 and test infrastructure to be ESM compatible</li> </ul> <h3>5.0.4</h3> <ul> <li>Bump <code>minimatch</code> to v3.1.5 (fixes ReDoS via globstar patterns)</li> <li>Bump <code>undici</code> to v6.24.1 (WebSocket decompression bomb protection, header validation fixes)</li> <li>Bump <code>fast-xml-parser</code> to v5.5.6</li> </ul> <h3>5.0.3</h3> <ul> <li>Bump <code>@actions/cache</code> to v5.0.5 (Resolves: <a href="https://github.com/actions/cache/security/dependabot/33">https://github.com/actions/cache/security/dependabot/33</a>)</li> <li>Bump <code>@actions/core</code> to v2.0.3</li> </ul> <h3>5.0.2</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
c8a78bf396
|
infrastructure: bump next-milestone to 4.22.0 (#9325)
4.21.0 is released, so new PRs should be assigned to the 4.22.0 milestone. Routine post-release metadata bump. Assisted-by: Claude:claude-opus-4-8 Co-authored-by: Vadim Peretokin <vadi2@users.noreply.github.com> |
||
|
|
a08395bacb
|
infrastructure: fix translation and 3rdparty update workflows (#9310)
#### Brief overview of PR changes/additions - Drop stale `3rdparty/dblsqd/dblsqd` lupdate paths from the translation and en_US plural workflows (dblsqd is now vendored into `src/updater/`, scanned via `./src/`) - Remove the dead `dblsqd` submodule entry from the `update-3rdparty` matrix - `git fetch` the target branch before checkout in the `submodule-branch` step so the `lcf` update works from a detached submodule checkout #### Motivation for adding to Mudlet The weekly translation and 3rdparty update automations were failing because they still referenced dblsqd as a submodule; this unblocks them ahead of the 4.21.0 release. #### Other info (issues closed, discussion etc) Surfaced while running the release checklist for 4.21.0. **Test case:** Trigger the "Update texts for translators", "Update plural american english translations", and "Update 3rdparty sources" workflows via workflow_dispatch on this branch - all jobs (including lcf) complete without the previous `3rdparty/dblsqd` / pathspec errors. Signed-off-by: Vadim Peretokin <vperetokin@hey.com> |
||
|
|
e2f59dca0b
|
infrastructure: fix PTB's from being built again when no new commits happened (#9309)
<!-- Keep the title short & concise so anyone non-technical can
understand it,
the title appears in PTB changelogs -->
#### Brief overview of PR changes/additions
The duplicate-PTB check ran 'gh release list' with no GH_TOKEN and
swallowed the auth error via 2>/dev/null, so it always fell through and
built a duplicate PTB even when no new commits had landed.
#### Motivation for adding to Mudlet
Don't rebuild PTBs when no new commits hav elanded.
#### Other info (issues closed, discussion etc)
---------
Co-authored-by: Vadim Peretokin <vadi2@users.noreply.github.com>
|
||
|
|
3d12e4ad82
|
Infrastructure: Bump lukka/get-cmake from 4.3.1 to 4.3.2 (#9221)
Bumps [lukka/get-cmake](https://github.com/lukka/get-cmake) from 4.3.1
to 4.3.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lukka/get-cmake/releases">lukka/get-cmake's
releases</a>.</em></p>
<blockquote>
<h2>CMake v4.3.2</h2>
<p>The <code>get-cmake</code> action downloads and caches CMake and
Ninja on your workflows. Versions can be specified using <a
href="https://docs.npmjs.com/about-semantic-versioning">semantic
versioning ranges</a> using <a
href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L13"><code>cmakeVersion</code></a>
and <a
href="https://github.com/lukka/get-cmake/blob/latest/action.yml#L16"><code>ninjaVersion</code></a>
inputs.</p>
<p>Changes:</p>
<ul>
<li><code>latest</code> is now using CMake version <code>v4.3.2</code>,
use this one-liner e.g.:
<code>uses: lukka/get-cmake@latest</code></li>
</ul>
<p>Enjoy!</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="
|
||
|
|
748e124d65
|
Infrastructure: Bump leafo/gh-actions-lua from 12 to 13 (#9222)
Bumps [leafo/gh-actions-lua](https://github.com/leafo/gh-actions-lua) from 12 to 13. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/leafo/gh-actions-lua/releases">leafo/gh-actions-lua's releases</a>.</em></p> <blockquote> <h2>v13</h2> <h2>What's new in v13</h2> <h3>Lua 5.5 support</h3> <ul> <li>New <code>5.5</code> version alias pointing to Lua 5.5.0 (released 2025-12-15)</li> <li>Default <code>luaVersion</code> is now <code>5.5</code> (previously <code>5.4</code>)</li> </ul> <h3>ESM migration</h3> <p><code>main.js</code> has been converted to ES modules to match the latest <code>@actions/*</code> toolkit packages, which went ESM-only in their most recent majors. No user-facing behavior change — same action API, same inputs.</p> <h3>Dependency upgrades</h3> <table> <thead> <tr> <th>Package</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td><code>@actions/core</code></td> <td>1.11.1</td> <td>3.0.1</td> </tr> <tr> <td><code>@actions/cache</code></td> <td>4.1.0</td> <td>6.0.0</td> </tr> <tr> <td><code>@actions/exec</code></td> <td>1.1.1</td> <td>3.0.0</td> </tr> <tr> <td><code>@actions/io</code></td> <td>1.1.3</td> <td>3.0.2</td> </tr> <tr> <td><code>@actions/tool-cache</code></td> <td>2.0.2</td> <td>4.0.0</td> </tr> </tbody> </table> <h3>Release tarballs refreshed</h3> <ul> <li><strong>New</strong>: <code>5.5.0.tar.gz</code></li> <li><code>5.3.6.tar.gz</code> replaces <code>5.3.5.tar.gz</code></li> <li><code>5.4.8.tar.gz</code> replaces <code>5.4.1.tar.gz</code></li> </ul> <h3>README / example updates</h3> <p>The example snippets now use:</p> <ul> <li><code>actions/checkout@v6</code> (was <code>@master</code> / <code>@v4</code>) — silences the Node.js 20 deprecation warning</li> <li><code>step-security/msvc-dev-cmd@v1</code> in place of <code>ilammy/msvc-dev-cmd@v1</code> — same input surface, runs on Node.js 24, actively maintained</li> </ul> <p><strong>Full changelog</strong>: <a href="https://github.com/leafo/gh-actions-lua/compare/v12...v13">https://github.com/leafo/gh-actions-lua/compare/v12...v13</a></p> <h2>v13.0.0</h2> <h2>What's new in v13</h2> <h3>Lua 5.5 support</h3> <ul> <li>New <code>5.5</code> version alias pointing to Lua 5.5.0 (released 2025-12-15)</li> <li>Default <code>luaVersion</code> is now <code>5.5</code> (previously <code>5.4</code>)</li> </ul> <h3>ESM migration</h3> <p><code>main.js</code> has been converted to ES modules to match the latest <code>@actions/*</code> toolkit packages, which went ESM-only in their most recent majors. No user-facing behavior change — same action API, same inputs.</p> <h3>Dependency upgrades</h3> <table> <thead> <tr> <th>Package</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td><code>@actions/core</code></td> <td>1.11.1</td> <td>3.0.1</td> </tr> <tr> <td><code>@actions/cache</code></td> <td>4.1.0</td> <td>6.0.0</td> </tr> <tr> <td><code>@actions/exec</code></td> <td>1.1.1</td> <td>3.0.0</td> </tr> <tr> <td><code>@actions/io</code></td> <td>1.1.3</td> <td>3.0.2</td> </tr> <tr> <td><code>@actions/tool-cache</code></td> <td>2.0.2</td> <td>4.0.0</td> </tr> </tbody> </table> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
9d674e6e7c
|
add lpeg parsing library (#9212)
Completes the addition of the
[lpeg](https://www.inf.puc-rio.br/~roberto/lpeg/) parsing library to
mudlet on all targets.
It had previously been [partially
added](
|
||
|
|
0eb93656b2
|
Infrastructure: Bump carlosperate/download-file-action from 2.0.2 to 2.0.3 (#9203)
Bumps [carlosperate/download-file-action](https://github.com/carlosperate/download-file-action) from 2.0.2 to 2.0.3. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/carlosperate/download-file-action/releases">carlosperate/download-file-action's releases</a>.</em></p> <blockquote> <h2>v2.0.3</h2> <h2>What's Changed</h2> <ul> <li>Updated Action to node v24 to remove warnings (<a href="https://redirect.github.com/carlosperate/download-file-action/issues/45">#45</a> thanks <a href="https://github.com/pzhlkj6612"><code>@pzhlkj6612</code></a>!)</li> <li>Fixed issue detecting file type of files without extensions.</li> <li>Updated dependencies (<a href="https://redirect.github.com/carlosperate/download-file-action/issues/29">#29</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/39">#39</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/42">#42</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/43">#43</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/44">#44</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/41">#41</a> <a href="https://redirect.github.com/carlosperate/download-file-action/issues/45">#45</a>)</li> <li>Improved tests</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/carlosperate/download-file-action/compare/v2.0.2...v2.0.3">https://github.com/carlosperate/download-file-action/compare/v2.0.2...v2.0.3</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
fbc61aace4
|
infrastructure: fix partial PTB releases not triggering when push build exists at same SHA (#9192)
#### Brief overview of PR changes/additions Add `event` filter to the workflow run query in `create-github-release.yml` so scheduled PTB builds only match other scheduled builds, not push builds at the same SHA #### Motivation for adding to Mudlet When a push build and a scheduled build exist at the same commit, the release workflow could find the push build (which has no release metadata) instead of the failed scheduled build, silently skipping the release and preventing the partial-PTB logic from #9163 from ever kicking in. #### Other info (issues closed, discussion etc) On 2026-04-15 no PTB was created despite only macOS failing a flaky test - the Windows and Linux builds succeeded but no release was made because the platform check matched a push build from #9191 instead of the failed scheduled build. **Test case:** Next scheduled PTB build where one platform fails should still create a partial release with the successful platforms' assets. Co-authored-by: Vadim Peretokin <vadi2@users.noreply.github.com> |
||
|
|
5ec6aa71ab
|
Infrastructure: fix Windows SHA256 missing from PTB releases (#9191)
<!-- Keep the title short & concise so anyone non-technical can
understand it,
the title appears in PTB changelogs -->
#### Brief overview of PR changes/additions
fix Windows SHA256 missing from PTB releases
#### Motivation for adding to Mudlet
necessary for updates' download to have validated integrity
#### Other info (issues closed, discussion etc)
download-artifact@v8 doesn't create a subdirectory when only one
artifact matches the pattern. The Windows build produces a single
release-asset-* artifact, so its files end up flat in assets/ instead of
assets/release-asset-Windows-X64/. The glob assets/*/*.sha256 missed it.
Use find instead, matching the pattern already used elsewhere in the
workflow.
|
||
|
|
e83a08a5b9
|
infrastructure: allow partial PTB releases when not all platforms succeed (#9163)
#### Brief overview of PR changes/additions Release workflow no longer blocks PTB creation when one platform build fails - proceeds with available assets and updates when remaining platforms complete. #### Motivation for adding to Mudlet PTB releases were missing Windows builds because the gate required all platforms to succeed, contradicting the asset verification which already tolerates partial PTBs. #### Other info (issues closed, discussion etc) None **Test case:** Trigger a PTB where one platform fails; verify the release is created with available assets and updated when the remaining platform succeeds. |
||
|
|
289a86b9aa
|
infrastructure: migrate undo/redo tests to QTest framework (#8867)
#### Brief overview of PR changes/additions Consolidates the procedural undo/redo test suite into QTest framework so all C++ tests use a single test runner integrated with ctest/CI (-1373 lines net). #### Motivation for adding to Mudlet Standardizes all C++ tests on QTest framework for consistency. #### Other info (issues closed, discussion etc) None **Test case:** Run `ctest -R dlgTriggerEditorUndoRedoTest --output-on-failure` from build directory - all 14 test categories should pass. --------- Co-authored-by: Vadim Peretokin <vadi2@users.noreply.github.com> Co-authored-by: Zooka <136661366+ZookaOnGit@users.noreply.github.com> |
||
|
|
a167029f81
|
fix: changelog rendering in PTB update dialog (#9182)
#### Brief overview of PR changes/additions Fix the in-app PTB changelog dialog which was showing garbled text (random commit hashes, file paths, broken formatting) by converting unsupported `<details>` HTML to plain markdown and fixing several changelog generation bugs. #### Motivation for adding to Mudlet The PTB changelog was unreadable for users - Qt's markdown renderer can't handle `<details>/<summary>` HTML tags, causing backtick content to leak out as random strings. Additionally, the markdown changelog builder was incorrectly HTML-escaping text, and empty changelog sections appeared when consecutive PTBs had no changes. #### Other info (issues closed, discussion etc) |
||
|
|
4728bf9c07
|
infrastructure: stop deleting and recreating GitHub releases on every build (#9176)
#### Brief overview of PR changes/additions Both build workflows (Linux/macOS and Windows) independently trigger the release workflow, causing the same release to be deleted and recreated twice per commit. Now the workflow checks if the release already exists and uploads assets to it instead of destroying and recreating it. #### Motivation for adding to Mudlet Eliminates notification spam to repository watchers. #### Other info (issues closed, discussion etc) N/A **Test case:** Wait for the next nightly PTB build and verify only one "New release published" notification appears in the activity feed instead of two delete/create cycles. <img width="1556" height="1570" alt="Screenshot from 2026-04-10 18-04-03" src="https://github.com/user-attachments/assets/eea90d57-f56a-45c4-b678-7b5b9499edfe" /> |
||
|
|
994d138d62
|
Infrastructure: Bump actions/download-artifact from 4 to 8 (#9179)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/download-artifact/releases">actions/download-artifact's releases</a>.</em></p> <blockquote> <h2>v8.0.0</h2> <h2>v8 - What's new</h2> <blockquote> <p>[!IMPORTANT] actions/download-artifact@v8 has been migrated to an ESM module. This should be transparent to the caller but forks might need to make significant changes.</p> </blockquote> <blockquote> <p>[!IMPORTANT] Hash mismatches will now error by default. Users can override this behavior with a setting change (see below).</p> </blockquote> <h3>Direct downloads</h3> <p>To support direct uploads in <code>actions/upload-artifact</code>, the action will no longer attempt to unzip all downloaded files. Instead, the action checks the <code>Content-Type</code> header ahead of unzipping and skips non-zipped files. Callers wishing to download a zipped file as-is can also set the new <code>skip-decompress</code> parameter to <code>true</code>.</p> <h3>Enforced checks (breaking)</h3> <p>A previous release introduced digest checks on the download. If a download hash didn't match the expected hash from the server, the action would log a warning. Callers can now configure the behavior on mismatch with the <code>digest-mismatch</code> parameter. To be secure by default, we are now defaulting the behavior to <code>error</code> which will fail the workflow run.</p> <h3>ESM</h3> <p>To support new versions of the @actions/* packages, we've upgraded the package to ESM.</p> <h2>What's Changed</h2> <ul> <li>Don't attempt to un-zip non-zipped downloads by <a href="https://github.com/danwkennedy"><code>@danwkennedy</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/460">actions/download-artifact#460</a></li> <li>Add a setting to specify what to do on hash mismatch and default it to <code>error</code> by <a href="https://github.com/danwkennedy"><code>@danwkennedy</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/461">actions/download-artifact#461</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/download-artifact/compare/v7...v8.0.0">https://github.com/actions/download-artifact/compare/v7...v8.0.0</a></p> <h2>v7.0.0</h2> <h2>v7 - What's new</h2> <blockquote> <p>[!IMPORTANT] actions/download-artifact@v7 now runs on Node.js 24 (<code>runs.using: node24</code>) and requires a minimum Actions Runner version of 2.327.1. If you are using self-hosted runners, ensure they are updated before upgrading.</p> </blockquote> <h3>Node.js 24</h3> <p>This release updates the runtime to Node.js 24. v6 had preliminary support for Node 24, however this action was by default still running on Node.js 20. Now this action by default will run on Node.js 24.</p> <h2>What's Changed</h2> <ul> <li>Update GHES guidance to include reference to Node 20 version by <a href="https://github.com/patrikpolyak"><code>@patrikpolyak</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/440">actions/download-artifact#440</a></li> <li>Download Artifact Node24 support by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/415">actions/download-artifact#415</a></li> <li>fix: update <code>@actions/artifact</code> to fix Node.js 24 punycode deprecation by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/451">actions/download-artifact#451</a></li> <li>prepare release v7.0.0 for Node.js 24 support by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/download-artifact/pull/452">actions/download-artifact#452</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/patrikpolyak"><code>@patrikpolyak</code></a> made their first contribution in <a href="https://redirect.github.com/actions/download-artifact/pull/440">actions/download-artifact#440</a></li> <li><a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> made their first contribution in <a href="https://redirect.github.com/actions/download-artifact/pull/415">actions/download-artifact#415</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/download-artifact/compare/v6.0.0...v7.0.0">https://github.com/actions/download-artifact/compare/v6.0.0...v7.0.0</a></p> <h2>v6.0.0</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
91e7405519
|
Infrastructure: Bump actions/github-script from 7 to 9 (#9181)
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/github-script/releases">actions/github-script's releases</a>.</em></p> <blockquote> <h2>v9.0.0</h2> <p><strong>New features:</strong></p> <ul> <li><strong><code>getOctokit</code> factory function</strong> — Available directly in the script context. Create additional authenticated Octokit clients with different tokens for multi-token workflows, GitHub App tokens, and cross-org access. See <a href="https://github.com/actions/github-script#creating-additional-clients-with-getoctokit">Creating additional clients with <code>getOctokit</code></a> for details and examples.</li> <li><strong>Orchestration ID in user-agent</strong> — The <code>ACTIONS_ORCHESTRATION_ID</code> environment variable is automatically appended to the user-agent string for request tracing.</li> </ul> <p><strong>Breaking changes:</strong></p> <ul> <li><strong><code>require('@actions/github')</code> no longer works in scripts.</strong> The upgrade to <code>@actions/github</code> v9 (ESM-only) means <code>require('@actions/github')</code> will fail at runtime. If you previously used patterns like <code>const { getOctokit } = require('@actions/github')</code> to create secondary clients, use the new injected <code>getOctokit</code> function instead — it's available directly in the script context with no imports needed.</li> <li><code>getOctokit</code> is now an injected function parameter. Scripts that declare <code>const getOctokit = ...</code> or <code>let getOctokit = ...</code> will get a <code>SyntaxError</code> because JavaScript does not allow <code>const</code>/<code>let</code> redeclaration of function parameters. Use the injected <code>getOctokit</code> directly, or use <code>var getOctokit = ...</code> if you need to redeclare it.</li> <li>If your script accesses other <code>@actions/github</code> internals beyond the standard <code>github</code>/<code>octokit</code> client, you may need to update those references for v9 compatibility.</li> </ul> <h2>What's Changed</h2> <ul> <li>Add ACTIONS_ORCHESTRATION_ID to user-agent string by <a href="https://github.com/Copilot"><code>@Copilot</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li> <li>ci: use deployment: false for integration test environments by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/712">actions/github-script#712</a></li> <li>feat!: add getOctokit to script context, upgrade <code>@actions/github</code> v9, <code>@octokit/core</code> v7, and related packages by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/700">actions/github-script#700</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Copilot"><code>@Copilot</code></a> made their first contribution in <a href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/github-script/compare/v8.0.0...v9.0.0">https://github.com/actions/github-script/compare/v8.0.0...v9.0.0</a></p> <h2>v8.0.0</h2> <h2>What's Changed</h2> <ul> <li>Update Node.js version support to 24.x by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li> <li>README for updating actions/github-script from v7 to v8 by <a href="https://github.com/sneha-krip"><code>@sneha-krip</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li> </ul> <h2>⚠️ Minimum Compatible Runner Version</h2> <p><strong>v2.327.1</strong><br /> <a href="https://github.com/actions/runner/releases/tag/v2.327.1">Release Notes</a></p> <p>Make sure your runner is updated to this version or newer to use this release.</p> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> made their first contribution in <a href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li> <li><a href="https://github.com/sneha-krip"><code>@sneha-krip</code></a> made their first contribution in <a href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/github-script/compare/v7.1.0...v8.0.0">https://github.com/actions/github-script/compare/v7.1.0...v8.0.0</a></p> <h2>v7.1.0</h2> <h2>What's Changed</h2> <ul> <li>Upgrade husky to v9 by <a href="https://github.com/benelan"><code>@benelan</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li> <li>Add workflow file for publishing releases to immutable action package by <a href="https://github.com/Jcambass"><code>@Jcambass</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li> <li>Upgrade IA Publish by <a href="https://github.com/Jcambass"><code>@Jcambass</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/486">actions/github-script#486</a></li> <li>Fix workflow status badges by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/497">actions/github-script#497</a></li> <li>Update usage of <code>actions/upload-artifact</code> by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/512">actions/github-script#512</a></li> <li>Clear up package name confusion by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/514">actions/github-script#514</a></li> <li>Update dependencies with <code>npm audit fix</code> by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/515">actions/github-script#515</a></li> <li>Specify that the used script is JavaScript by <a href="https://github.com/timotk"><code>@timotk</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li> <li>chore: Add Dependabot for NPM and Actions by <a href="https://github.com/nschonni"><code>@nschonni</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/472">actions/github-script#472</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |