Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
94a3b55
test: run the mcp/sdk leg on the 0.9.0 tag
naji247 Oct 20, 2026
d92b881
fix: read every tools/list page, so no listed tool falls back to the …
naji247 Oct 20, 2026
9aacc26
fix: rebuild the registries for a get_more_tools call like for any ot…
naji247 Oct 20, 2026
b200372
fix: keep one output-registry entry for a nameless tool listed again
naji247 Oct 20, 2026
6c39108
test: assert the exact rebuild lines and cover the page-2 mirror and …
naji247 Oct 20, 2026
456696b
test: pin that the merged output registry stays a list
naji247 Oct 20, 2026
39d0658
fix: give the six remaining bundle keys an info text
naji247 Oct 20, 2026
9eed466
fix: treat an empty exclude string as unset with one log line
naji247 Oct 20, 2026
6d53ad2
fix: say when agentcat:install creates .env
naji247 Oct 20, 2026
a16d8f7
fix: tell publishCustomEvent callers what to pass instead of a Statel…
naji247 Oct 20, 2026
c73cc79
fix: let AGENTCAT_ENABLED decide when agentcat.enabled holds an unkno…
naji247 Oct 20, 2026
c82469a
fix: name the written key and the fix in the exporter entry and heade…
naji247 Oct 20, 2026
0fd1b6a
test: keep the provider docblock with its data provider
naji247 Oct 20, 2026
793d9a1
fix: treat a blank exclude string like an empty one
naji247 Oct 20, 2026
e3f9e4e
refactor: build the header message through invalid()
naji247 Oct 20, 2026
0c12454
refactor: state the accepted bool words once in the bundle
naji247 Oct 20, 2026
74a864b
test: assert every bool key states the accepted words
naji247 Oct 20, 2026
926d775
test: assert the full info text of the two remaining bool keys
naji247 Oct 20, 2026
320e64f
fix: keep serving on hosts that disable process, signal, curl multi a…
naji247 Oct 20, 2026
9a1993d
fix: log how to get the signal drain where it cannot install
naji247 Oct 20, 2026
f14121d
fix: log a failure that repeats on every delivery pass once, with its…
naji247 Oct 20, 2026
c650afa
test: disable posix_kill as well as posix_getpid on the signal path
naji247 Oct 20, 2026
22f55b6
test: serve an MCP session through a PHP-FPM pool that disables share…
naji247 Oct 20, 2026
63d105a
fix: count a repeated failure of the transport's own send and drain a…
naji247 Oct 20, 2026
309a442
ci: run every PHPStan configuration, the lowest set, a package probe …
naji247 Oct 20, 2026
292bfbd
ci: type the package probe for PHPStan, close the probe's proxy and c…
naji247 Oct 20, 2026
6c9d0ff
test: fail on src/ diagnostics that framework handlers hide
naji247 Oct 20, 2026
bccead0
test: make the finished-transfer bound robust
naji247 Oct 20, 2026
184ca90
test: make the positive-wait bound robust
naji247 Oct 20, 2026
c143b19
test: guard src/ diagnostics from the first provider boot and harden …
naji247 Oct 20, 2026
1e5a39d
ci: add the nightly upstream, runtime and release checks with one iss…
naji247 Oct 20, 2026
ebadab1
test: refresh the OpenAPI snapshot with the agentcat:custom event type
naji247 Oct 20, 2026
403de74
test: name the images of the containers in every failing runtime test
naji247 Oct 20, 2026
1f99782
ci: use the Swoole 6.2 line for latest, add step timeouts and a pull …
naji247 Oct 20, 2026
d1629d0
build: require agentcat/api 0.0.4, which lists the agentcat:custom ev…
naji247 Oct 20, 2026
eabc53e
test: snapshot every member of the library classes AgentCat touches, …
naji247 Oct 20, 2026
71729ed
test: compare unsnapshotted releases with the newest lower snapshot, …
naji247 Oct 20, 2026
a2037a3
test: trace every acceptance criterion to a test or a stated gap
naji247 Oct 20, 2026
350491d
test: read the snapshot script's arguments from $_SERVER, which PHPSt…
naji247 Oct 20, 2026
9febb34
fix: track() on the server a tracked Builder built returns it as alre…
naji247 Oct 20, 2026
def0d43
test: prove that track() names an unreadable server info, and keep th…
naji247 Oct 20, 2026
4a75720
test: count only group attributes, name each overlap, make async inte…
naji247 Oct 20, 2026
8671314
test: run the TypeScript e2e scenarios on the PHP lanes
naji247 Oct 20, 2026
4333430
test: refuse unknown scenario headers and non-local collectors, and a…
naji247 Oct 20, 2026
c65b8bd
test: prove the bridges under NGINX Unit and the Symfony mcp:server S…
naji247 Oct 20, 2026
d2d6d25
test: assert JSON-RPC on every stdout line and run the Unit cases in …
naji247 Oct 20, 2026
4ae8572
docs: give the README the TypeScript README's branding, with PHP quic…
naji247 Oct 20, 2026
c392836
docs: lead the Symfony quickstart with the manual setup, tighten the …
naji247 Oct 20, 2026
b909c46
ci: write the member snapshot's error output to the nightly report too
naji247 Oct 20, 2026
c4a6464
test: read the fixture's line from the output buffer first, which sta…
naji247 Oct 20, 2026
37129d5
docs: add the changelog, contributing guide, Composer metadata and La…
naji247 Oct 20, 2026
c7f8651
docs: make every comment state its rule or its reason
naji247 Oct 20, 2026
19655d6
test: guard every committed file in any case, and spell criteria as t…
naji247 Oct 21, 2026
3cc444d
test: check the PHP samples of a docs checkout
naji247 Oct 21, 2026
2fe7533
test: declare the application classes of the docs samples instead of …
naji247 Oct 21, 2026
34aeb51
docs: say how to remove the files that a killed runtime run leaves in…
naji247 Oct 21, 2026
b5df78f
fix: report versions without the v of a tag name
naji247 Oct 21, 2026
faf66d4
docs: state what 1.0.0 ships and promise no response time
naji247 Oct 21, 2026
3a7fba1
fix: name a whitespace-only exclude a blank string in its warning
naji247 Oct 21, 2026
8a2f681
fix: list no second get_more_tools after a page with the customer's own
naji247 Oct 21, 2026
8b2b105
test: read the installed versions as strings before their first letter
naji247 Oct 21, 2026
496384f
fix: end a delivery that cannot sleep instead of spinning to its dead…
naji247 Oct 21, 2026
5b1434e
test: install the package probe's release legs with stable dependenci…
naji247 Oct 21, 2026
33f8ddd
test: make the snapshot tests' directories under the test HOME
naji247 Oct 21, 2026
54dd95b
ci: name the failing tests in the nightly issues and keep PHP's messa…
naji247 Oct 21, 2026
a930438
ci: give every CI job a timeout of about three times its run time
naji247 Oct 21, 2026
2539ee7
refactor: decide the get_more_tools of a page from the server's recor…
naji247 Oct 21, 2026
0364cfe
ci: ignore the PHP 8.6 deprecation inside opis/json-schema with a bas…
naji247 Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@
/docs export-ignore
/recipe export-ignore
/composer-dependency-analyser.php export-ignore
/phpstan.php85.neon export-ignore
/CONTRIBUTING.md export-ignore
/phpunit-baseline.xml export-ignore
20 changes: 20 additions & 0 deletions .github/nightly-issue.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Opens one issue per failing nightly job, or comments on the open one. A person closes it after the fix.
# Usage: nightly-issue.sh <job name> [report file]. The text of the report file, if it exists, goes into the issue or comment.
set -euo pipefail
job="$1"
title="Nightly: ${job} failed"
run_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
gh label create nightly --color B60205 --description "A scheduled upstream or release check failed" 2>/dev/null || true
number="$(gh issue list --label nightly --state open --limit 100 --json number,title --jq ".[] | select(.title == \"${title}\") | .number" | head -n 1)"
body="The nightly job \`${job}\` failed: ${run_url}"
report="${2:-}"
if [ -n "${report}" ] && [ -s "${report}" ]; then
# An issue body holds at most 65536 characters.
body+=$'\n\n'"$(head -c 60000 "${report}")"
fi
if [ -n "${number}" ]; then
gh issue comment "${number}" --body "${body}"
else
gh issue create --title "${title}" --label nightly --body "${body}"
fi
85 changes: 78 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

# Each job's timeout-minutes is about three times its usual run time; GitHub's default is 6 hours.
jobs:
static:
name: Static analysis
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -33,13 +35,33 @@ jobs:
- run: composer normalize --dry-run
- run: vendor/bin/php-cs-fixer check --diff
- run: vendor/bin/rector process --dry-run
- run: vendor/bin/phpstan analyse --no-progress --error-format=github
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G --configuration=phpstan.php85.neon
- run: vendor/bin/composer-dependency-analyser
- run: composer audit

static-lowest:
name: Static analysis (lowest dependencies)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.5'
coverage: none
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: lowest
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --memory-limit=1G --configuration=phpstan.php85.neon

tests:
name: Tests (PHP ${{ matrix.php }}, ${{ matrix.deps }})
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
Expand All @@ -61,6 +83,7 @@ jobs:
tests-next:
name: Tests (PHP 8.6, experimental)
runs-on: ubuntu-latest
timeout-minutes: 15
continue-on-error: true
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -73,11 +96,15 @@ jobs:
- uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
dependency-versions: highest
- run: vendor/bin/phpunit
# ergebnis/composer-normalize caps PHP below 8.6.
composer-options: --ignore-platform-req=php+
# The baseline holds the deprecations that PHP 8.6 raises inside a dependency (opis/json-schema).
- run: vendor/bin/phpunit --use-baseline phpunit-baseline.xml

coverage:
name: Coverage
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand Down Expand Up @@ -132,9 +159,10 @@ jobs:
if: github.event_name != 'pull_request'
run: vendor/bin/infection --threads=max --logger-github

mcp-sdk-main:
name: mcp/sdk main (PHP 8.5)
mcp-sdk-0-9:
name: mcp/sdk 0.9.0 (PHP 8.5)
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -148,8 +176,8 @@ jobs:
dependency-versions: highest
- name: Remove symfony/mcp-bundle, which requires mcp/sdk ^0.8.1
run: composer remove --dev --no-update symfony/mcp-bundle
- name: Install mcp/sdk main at the commit this release was verified against
run: composer require --dev --no-interaction --update-with-all-dependencies "mcp/sdk:dev-main#82e19d114e95671e05e7df7909195f7ace03d90e as 0.9.0"
- name: Install the mcp/sdk 0.9.0 tag
run: composer require --dev --no-interaction --update-with-all-dependencies "mcp/sdk:0.9.0"
- run: vendor/bin/phpstan analyse --no-progress --error-format=github --configuration=phpstan.no-bundle.neon
- run: vendor/bin/phpunit --testsuite Contract,Integration,E2E

Expand Down Expand Up @@ -177,11 +205,54 @@ jobs:
env:
AGENTCAT_RUNTIME_TESTS: '1'

package:
name: Package probe (PHP 8.3, mcp/sdk ${{ matrix.mcp-sdk }})
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
mcp-sdk: ['0.8.1', '0.9.0']
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.3'
coverage: none
- name: Install the dist in a fresh project and track an mcp/sdk server
run: tests/bin/package-probe.sh "$MCP_SDK"
env:
MCP_SDK: ${{ matrix.mcp-sdk }}

bc:
name: Backward compatibility
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0
with:
php-version: '8.3'
extensions: bcmath
coverage: none
- name: Compare with the latest 1.x tag
run: |
base="$(git tag --list 'v1.*' --sort=-v:refname | head -n 1)"
if [ -z "$base" ]; then echo "No v1.* tag yet: nothing to compare against (D63)."; exit 0; fi
composer global require --no-interaction roave/backward-compatibility-check:8.19.0
"$(composer global config bin-dir --absolute)/roave-backward-compatibility-check" --from="$base" --format=github-actions --install-development-dependencies

all-green:
name: All green
if: always()
needs: [static, tests, coverage, mutation, mcp-sdk-main, runtime]
needs: [static, static-lowest, tests, coverage, mutation, mcp-sdk-0-9, runtime, package, bc]
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0
with:
Expand Down
Loading
Loading