Thank you for considering contributing to Symfony Reprise!
Symfony Reprise is an open source, community-driven project, and we are happy to receive contributions from the community.
Tip
It's a good idea to read Symfony's Contribution Guide first.
If you find a bug, have a feature request, or need help, please open an issue.
Please provide as much information as possible, and remember to follow our Code of Conduct to keep the project welcoming for everyone.
To contribute to Symfony Reprise, you need to fork the symfony/reprise repository on GitHub.
# With GitHub CLI https://cli.github.com/
$ gh repo clone <USERNAME>/reprise reprise
# Using SSH
$ git clone git@github.com:<USERNAME>/reprise.git reprise
$ cd reprise
$ git remote add upstream git@github.com:symfony/reprise.git- PHP 8.4 or higher
- Composer
- Node.js 22 or higher
- pnpm 11.10 or higher
$ composer install
$ pnpm installImportant
This repository has a dual structure: a PHP Symfony bundle (symfony/reprise) at the root, and an npm package (@symfony/reprise) in assets/, managed together as a pnpm workspace. Most changes touch only one side, but some (like adding a new option) touch both.
The PHP source lives in src/, tests in tests/. The bundle follows Symfony's PHP coding standards and the Backward Compatibility promise.
# Run the test suite
$ vendor/bin/phpunit
# Run static analysis
$ vendor/bin/phpstan analyse
# Fix coding standards
$ vendor/bin/php-cs-fixer fixThe actual bundler plugin (the unplugin for Vite and Rsbuild) lives in assets/, written in TypeScript and built with tsdown. These commands run from the repository root:
# Build the plugin
$ pnpm build
# Watch and rebuild on change
$ pnpm dev
# Run the test suite
$ pnpm test
# Lint
$ pnpm lint
# Format (use `pnpm fmt:check` to only check, without writing)
$ pnpm fmtFor manual end-to-end verification against a real Symfony backend, use the playground/ app (a full Symfony 7 project that imports the plugin directly from assets/):
$ npm -C playground run vite:dev
$ npm -C playground run vite:build
$ npm -C playground run rsbuild:dev
$ npm -C playground run rsbuild:buildCommit messages follow the same [<Scope>] <Short description> convention used across Symfony UX and WebpackEncoreBundle, not Conventional Commits. The scope is PascalCase, the description is imperative mood with a capitalized first word and no trailing period. Combine scopes as [A][B] when a change spans several areas.
[Stimulus] Emit forward-slash local controller paths
[Docs] Frame Stimulus usage as the Encore experience
[CI] Cancel superseded runs with a concurrency group
To reset your local main to match upstream:
$ git checkout main && \
git fetch upstream && \
git reset --hard upstream/main && \
git push origin mainTo rebase a feature branch on top of upstream/main:
$ git checkout my-feature-branch && \
git rebase upstream/main && \
git push -u origin my-feature-branch