Repository navigation
ci: discover MCP library releases on Packagist and test each minor - #9
Merged
Merged
Conversation
…agist CI tested fixed versions of the MCP libraries: the lowest and highest of each require-dev range, plus mcp/sdk 0.9.0 pinned. A caret range on 0.x stops at the next minor, so a new mcp/sdk 0.9.1 or 0.10, symfony/mcp-bundle 0.15 or laravel/mcp 2.0 never ran, although composer.json lets a customer install it. Like the TypeScript SDK's mcp-compatibility.yml, a discover job now reads Packagist on every pull request and every night. It picks the newest patch of each minor release of mcp/sdk, laravel/mcp and symfony/mcp-bundle, from the lowest version that require-dev allows. The released jobs run PHPStan and the adapter suites against each of them, and the package probe runs on each mcp/sdk release. In the nightly, a failing release opens an issue. - tests/Support/ReleaseDiscovery.php selects the releases, and tests/bin/released-versions.php prints them for the matrix. - tests/bin/require-library.sh installs one version of a library. The local tests/bin/mcp-sdk-leg.sh uses it too. - tests/Support/HttpGet.php holds the GET that branding-drift.php had inline. - WorkflowsTest makes sure that All green needs every gating CI job, that the released jobs take the discovered releases, and that every nightly job opens its issue when it fails. - The released jobs replace the mcp/sdk 0.9.0 job.
The package probe ran on PHP 8.3 with every discovered mcp/sdk release. A release that needs PHP 8.4 cannot install there, so every pull request would fail without an AgentCat defect. ReleaseDiscovery now expands Packagist's minified rows, reads each release's PHP requirement with composer/semver, and gives each row the lowest PHP that CI tests and the release allows. - The nightly also runs the package probe on each discovered mcp/sdk release. - A nightly issue names the minor release, so a failure that lasts across its patches stays in one issue. The issue shows the end of the install, PHPStan and PHPUnit output, or the message of released-versions.php. - released-versions.php tries a failed GET twice more, and exits 1 for an unreadable composer.json as its header says. - The discover steps make sure that the output is a JSON list that is not empty before the matrix reads it. - require-library.sh requires the version without an update, then runs a full update, so every root package can move. - composer/semver is a dev dependency now; it came only through orchestra.
kashishhora
approved these changes
Oct 22, 2026
Base automatically changed from
feat/plan-f-release
to
feat/plan-a-foundation
October 22, 2026 23:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CI now finds new releases of the MCP libraries by itself, the way the TypeScript SDK's
mcp-compatibility.ymldoes with npm.Before this change, CI tested fixed points only: the lowest and the highest version of each
require-devrange, plusmcp/sdk0.9.0, pinned. On 0.x versions, a caret range such as^0.8.1allows only 0.8.x. As a result, a newmcp/sdk0.9.1 or 0.10, asymfony/mcp-bundle0.15 or alaravel/mcp2.0 never ran on a pull request.composer.jsonstill lets a customer install all of them.What changes
ci.ymlandnightly.yml): reads Packagist on every pull request and every night. It picks the newest patch of each minor release ofmcp/sdk,laravel/mcpandsymfony/mcp-bundle, starting at the lowest version thatrequire-devallows. Today it finds mcp/sdk 0.8.1 and 0.9.0, laravel/mcp 1.0.2 and 1.1.1, and symfony/mcp-bundle 0.13.0 and 0.14.1.mcp/sdk 0.9.0 (PHP 8.5)job, andAll greenneeds them.mcp/sdkrelease, not on a fixed list. Each probe runs on the lowest PHP that CI tests and that release allows (8.3 today). A future release that drops PHP 8.3 then moves to 8.4, and pull requests stay green.nightlyissue per minor release, so a release published between pull requests reaches a person within a day. The issue shows why the release failed: the end of the install, PHPStan and PHPUnit output.tests/bin/released-versions.phpprints the releases for the job matrix. It tries a failed GET twice more, and the discover step makes sure that the result is a JSON list that is not empty.tests/bin/require-library.shinstalls one version of a library, then runs a full update so every root package can move. The localtests/bin/mcp-sdk-leg.shuses it too.composer/semveris now a dev dependency. It reads each release's PHP requirement; before, it came only through orchestra.tests/Support/HttpGet.phpholds the GET thatbranding-drift.phphad inline.ReleaseDiscoveryTestcovers the release selection: Packagist's minified rows, pre-releases, a new patch, minor or major, a floor inside a minor, 0.10 sorting after 0.9, and the PHP choice for each release.WorkflowsTestmakes sure thatAll greenneeds every gating CI job, that the release jobs and probes take the discovered releases, that the discovery knows the PHP versions of thetestsjob, and that every nightly job opens its issue when it fails.Test plan
composer check: 3521 tests pass, and so do PHPStan (both configurations), Rector, php-cs-fixer and the dependency analyserphpstan.neon.distandphpstan.php85.neonrequire-library.shandmcp-sdk-leg.shWorkflowsTestfails on the old workflows and passes on the new onesnightly.ymlchanged: every job passes