From 5a06d997b53c679038614b6caa2d5f1a3e2a2777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=96=A4=20ShadowNine=20=F0=9F=92=9B?= Date: Sun, 11 Oct 2026 14:36:42 +0200 Subject: [PATCH 1/2] Prepare 2.0.0-beta.3 prerelease --- Directory.Build.props | 2 +- docs/beta3-release-notes.md | 21 +++++++++++++ .../packages.lock.json | 12 ++++---- .../CheatEngine.Mcp.Plugin/packages.lock.json | 12 ++++---- .../packages.lock.json | 6 ++-- .../packages.lock.json | 2 +- .../CheatEngine.Mcp.Tests/packages.lock.json | 30 +++++++++---------- 7 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 docs/beta3-release-notes.md diff --git a/Directory.Build.props b/Directory.Build.props index ec38d94..49e5141 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -20,7 +20,7 @@ $(WarningsNotAsErrors);NU1900;NU1901;NU1902;NU1905 x64 - 2.0.0-beta.2 + 2.0.0-beta.3 CheatEngineNet CheatEngineNet https://github.com/CheatEngineNet/CheatEngine.Mcp diff --git a/docs/beta3-release-notes.md b/docs/beta3-release-notes.md new file mode 100644 index 0000000..d407664 --- /dev/null +++ b/docs/beta3-release-notes.md @@ -0,0 +1,21 @@ +# CheatEngine.Mcp 2.0.0-beta.3 + +This Windows x64 prerelease adds the MCP roadmap work since beta.2. Download `CheatEngine.Mcp-2.0.0-beta.3-win-x64.zip` and verify it with `SHA256SUMS.txt`. The ZIP contains the single Cheat Engine plugin DLL, the matching gateway executable, installation instructions, and licenses. + +## Changes since beta.2 + +- Added bounded pointer access analysis and pointer-chain validation, plus an explicit C# compile-and-export tool. Compilation does not inject the result. +- Added prepared module, region, thread, symbol, and breakpoint navigation resources. Call the corresponding explicit enumeration tool first; stale or target-mismatched snapshots are refused. Full CE enumeration can still block regardless of result limits. +- Bounded structure lookup and element paging, fixed thread-list ownership, and retained failed pointer-search cleanup reservations. +- Improved effect metadata, unavailable-field handling, error correlation, packaged catalog checks, and Debug/Release portable CI coverage. +- Removed the prerelease exports resource URI; call `module_list_exports` explicitly. Clients should handle omitted unavailable fields and prepare navigation snapshots before reading them. + +## Support and known limits + +The plugin runs in Cheat Engine 7.7 x64 and needs the x64 .NET 10, ASP.NET Core 10, and Windows Desktop 10 runtimes. The x64 gateway is self-contained. The four optional execution capabilities remain enabled by default; configure their exposure for your own setup. See the [support matrix](https://github.com/CheatEngineNet/CheatEngine.Mcp/blob/main/docs/qualification/v2.0.0/support-matrix.md) for details. + +Portable tests, package checks, and the gateway smoke test do not establish live Cheat Engine qualification. An intermittent native Lua dispatch corruption and an empty Settings plugin-list failure remain unresolved. The new standalone navigation/Settings Lua cases and the broader live lifecycle, performance, install/upgrade, and rollback checks have not run on this release candidate. This prerelease is not the stable v2.0.0 sign-off; [qualification status](https://github.com/CheatEngineNet/CheatEngine.Mcp/blob/main/docs/qualification/v2.0.0/release-signoff.md) records the remaining work. + +## Upgrade and rollback + +Keep a backup of the existing matching plugin and gateway, your configuration, and CE settings. Disable the plugin, close Cheat Engine and the gateway, then install both beta.3 files from this ZIP in a new folder. Replace only this plugin's old CE entry if its path changed, point your MCP client at the new gateway, and discover a fresh `instanceId` with `instance_list`. Do not mix beta.2 and beta.3 files. To roll back, close both processes and restore the previous matching pair and registration. The [recovery guide](https://github.com/CheatEngineNet/CheatEngine.Mcp/blob/main/srcs/CheatEngine.Mcp.Resources/Knowledge/Documents/connection-troubleshooting.md#several-instances-updates-and-removal) covers locked files and partial upgrades. diff --git a/srcs/CheatEngine.Mcp.Gateway/packages.lock.json b/srcs/CheatEngine.Mcp.Gateway/packages.lock.json index 12acdda..79cde4e 100644 --- a/srcs/CheatEngine.Mcp.Gateway/packages.lock.json +++ b/srcs/CheatEngine.Mcp.Gateway/packages.lock.json @@ -69,28 +69,28 @@ "cheatengine.mcp.hosting": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", "ModelContextProtocol.AspNetCore": "[2.2.0, )" } }, "cheatengine.mcp.prompts": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Resources": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.resources": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.tools": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )" } }, "CheatEngine.Client": { diff --git a/srcs/CheatEngine.Mcp.Plugin/packages.lock.json b/srcs/CheatEngine.Mcp.Plugin/packages.lock.json index 1026838..3a1d921 100644 --- a/srcs/CheatEngine.Mcp.Plugin/packages.lock.json +++ b/srcs/CheatEngine.Mcp.Plugin/packages.lock.json @@ -109,28 +109,28 @@ "cheatengine.mcp.hosting": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", "ModelContextProtocol.AspNetCore": "[2.2.0, )" } }, "cheatengine.mcp.prompts": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Resources": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.resources": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.tools": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )" } }, "Microsoft.Extensions.AI.Abstractions": { diff --git a/srcs/CheatEngine.Mcp.Prompts/packages.lock.json b/srcs/CheatEngine.Mcp.Prompts/packages.lock.json index 02b0810..0daca87 100644 --- a/srcs/CheatEngine.Mcp.Prompts/packages.lock.json +++ b/srcs/CheatEngine.Mcp.Prompts/packages.lock.json @@ -169,14 +169,14 @@ "cheatengine.mcp.resources": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.tools": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )" } }, "CheatEngine.Client": { diff --git a/srcs/CheatEngine.Mcp.Resources/packages.lock.json b/srcs/CheatEngine.Mcp.Resources/packages.lock.json index 04554fb..7955de0 100644 --- a/srcs/CheatEngine.Mcp.Resources/packages.lock.json +++ b/srcs/CheatEngine.Mcp.Resources/packages.lock.json @@ -169,7 +169,7 @@ "cheatengine.mcp.tools": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )" } }, "CheatEngine.Client": { diff --git a/tests/CheatEngine.Mcp.Tests/packages.lock.json b/tests/CheatEngine.Mcp.Tests/packages.lock.json index 7a0916e..96d5dc0 100644 --- a/tests/CheatEngine.Mcp.Tests/packages.lock.json +++ b/tests/CheatEngine.Mcp.Tests/packages.lock.json @@ -334,11 +334,11 @@ "type": "Project", "dependencies": { "CheatEngine.Client": "[1.0.0, )", - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Hosting": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Prompts": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Resources": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )", + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Hosting": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Prompts": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )", "CheatEngine.SDK": "[2.0.0, )", "ModelContextProtocol.AspNetCore": "[2.2.0, )" } @@ -353,37 +353,37 @@ "cheatengine.mcp.gateway": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Hosting": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Prompts": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Resources": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Hosting": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Prompts": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.hosting": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", "ModelContextProtocol.AspNetCore": "[2.2.0, )" } }, "cheatengine.mcp.prompts": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Resources": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.resources": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )", - "CheatEngine.Mcp.Tools": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )", + "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )" } }, "cheatengine.mcp.tools": { "type": "Project", "dependencies": { - "CheatEngine.Mcp.Core": "[2.0.0-beta.2, )" + "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )" } }, "CheatEngine.Client": { From 197e22755391a11573e62327e4601b466d8b0f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=96=A4=20ShadowNine=20=F0=9F=92=9B?= Date: Sun, 11 Oct 2026 14:38:29 +0200 Subject: [PATCH 2/2] Handle successful MCP smoke responses without error fields --- eng/Publish.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/eng/Publish.ps1 b/eng/Publish.ps1 index 4513195..bc0daa5 100644 --- a/eng/Publish.ps1 +++ b/eng/Publish.ps1 @@ -30,7 +30,10 @@ function Invoke-GatewayNativeAotSmoke([string] $gateway) { try { $message = $line | ConvertFrom-Json -ErrorAction Stop } catch { throw "Gateway stdout was not JSON-RPC: $line" } if ($message.id -ne $id) { throw "Expected MCP response $id, got: $line" } - if ($null -ne $message.error) { throw "MCP response $id was an error: $line" } + $errorProperty = $message.PSObject.Properties['error'] + if ($null -ne $errorProperty -and $null -ne $errorProperty.Value) { + throw "MCP response $id was an error: $line" + } return $message }