Instead of maintaining a hardcoded list of store bridges in the
`store-bridges-integration` job, dynamically detect which bridges have
integration tests by scanning for the `#[Group('integration')]` attribute.
This way a new bridge with integration tests is automatically picked up
without needing to update the workflow file.
Validate that newly added LICENSE files have the correct first line
format: "Copyright (c) {YEAR}-present Fabien Potencier" where YEAR
is the current year. Existing and modified LICENSE files are not
affected by this check.
Also update the workflow to fetch the base branch so the script can
properly detect which LICENSE files are new.
This change improves backwards compatibility by allowing future
parameters to be added to the method signature. With variadic
parameters, no additional arguments can be added after the variadic
argument per PHP's BC policy.
This PR was squashed before being merged into the main branch.
Discussion
----------
[CI] Improvements
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | no
| Docs? | no
| Issues | --
| License | MIT
Extracted from
* #1298
Commits
-------
e14af589 [CI] Improvements
This PR was squashed before being merged into the main branch.
Discussion
----------
Add AI Mate component for MCP server integration
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| Docs? | yes
| Issues | -
| License | MIT
## Description
This PR introduces the **AI Mate component** (`symfony/ai-mate`), a standalone MCP server that enables AI assistants (Claude, GitHub Copilot, JetBrains AI, Cursor) to interact with PHP/Symfony applications through standardized tools.
### Key Features
**Core Server**
- Extension discovery system via `extra.ai-mate` in `composer.json`
- Automatic service registration with Symfony DI container
- Feature filtering to enable/disable specific tools per extension
- Built-in tools: `php-version`, `operating-system`, `php-extensions`
**Symfony Bridge** (`symfony/ai-mate-symfony`)
- `symfony-services` tool for container introspection
- Parses compiled container XML to expose service definitions
**Monolog Bridge** (`symfony/ai-mate-monolog`)
- Log search and analysis tools
- Supports both JSON and standard Monolog line formats
- Tools: `monolog-search`, `monolog-search-regex`, `monolog-context-search`, `monolog-tail`, `monolog-list-files`, `monolog-list-channels`, `monolog-by-level`
### Architecture
Unlike other Symfony AI components, Mate is **standalone** and does not integrate with the AI Bundle. It runs as an independent MCP server via stdio transport.
```
src/ai-mate/
├── src/
│ ├── Command/ # CLI commands (serve, init, discover, clear-cache)
│ ├── Container/ # DI container management
│ ├── Discovery/ # Extension discovery system
│ ├── Capability/ # Built-in MCP tools
│ ├── Service/ # Internal services
│ └── Bridge/
│ ├── Symfony/ # Container introspection
│ └── Monolog/ # Log analysis
├── tests/
├── resources/ # Template files for init command
└── bin/mate # Executable
```
### Usage Example
```bash
# Install
composer require symfony/ai-mate
# Initialize configuration
vendor/bin/mate init
# Discover extensions
vendor/bin/mate discover
# Start server (typically called by AI assistant)
vendor/bin/mate serve
```
**Creating custom tools:**
```php
// mate/MyTool.php
namespace App\Mate;
use Mcp\Capability\Attribute\McpTool;
class MyTool
{
#[McpTool(name: 'my_tool', description: 'My custom tool')]
public function execute(string $param): array
{
return ['result' => $param];
}
}
```
### Documentation
Comprehensive documentation added to `docs/components/mate.rst`:
- Quick start guide
- Configuration reference
- Bridge documentation with troubleshooting
- Integration guides for Claude Desktop, Claude Code, JetBrains AI
- Extension development guide"
Commits
-------
c151ab83 Add AI Mate component for MCP server integration
- Add validate-bridge-type.sh script to validate composer.json type field
- Update validation workflow to run type validation for all bridge types
- Fix message store bridges to use "symfony-ai-message-store" type
This PR was merged into the main branch.
Discussion
----------
[CI] Trigger validation on any bridge file change
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | no
| Docs? | no
| Issues | --
| License | MIT
Commits
-------
faeb290c [CI] Trigger validation on any bridge file change
The `include` directive in GitHub Actions matrix adds separate combinations
rather than multiplying with existing matrix values. This caused jobs to be
created with only php-version and dependency-version set, but no bridge
object, resulting in "Unable to find working directory at 'src/src/Bridge/'"
errors.
Fix by generating full include arrays in build-matrix.yaml with the bridge
info nested under a 'bridge' key. Each bridge now gets tested with:
- PHP 8.2 lowest
- PHP 8.2 highest
- PHP 8.5 highest
Integration tests now depend on all unit tests completing first via
the `needs` directive, ensuring they run as the final stage.
Execution order: unit tests → demo → examples
- Add root dependencies installation and package building to phpstan-package job
- Remove platform-only conditions from phpstan-bridge job
- Make vendor cleanup step work for all bridge types
This avoids the 256 jobs limit in GitHub Actions by separating the
bridge tests into two distinct job groups. Also makes CI output
collapsible using ::group:: syntax.
Dynamically generate matrix includes for both packages and bridges,
eliminating hardcoded entries and ensuring new bridges are automatically
tested with all PHP/Symfony version combinations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)