PR Merge
symfony/symfony
Merge a reviewed pull request the way the Symfony core team does: one --no-ff merge commit per PR, whose message archives the whole discussion, with the review gates checked first.
Principles for rigorously reviewing a Symfony UX pull request and making it merge-ready.
$ npx skills add symfony/ux --skill pr-review-merge-prep -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install symfony/ux pr-review-merge-prep --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .claude/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .claude/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prepType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add symfony/ux --skill pr-review-merge-prep -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install symfony/ux pr-review-merge-prep --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .agents/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .agents/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add symfony/ux --skill pr-review-merge-prep -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install symfony/ux pr-review-merge-prep --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .cursor/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .cursor/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/symfony/ux.git --path .agents/skills/pr-review-merge-prep--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add symfony/ux --skill pr-review-merge-prep -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install symfony/ux pr-review-merge-prep --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .gemini/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .gemini/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install symfony/ux pr-review-merge-prepInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add symfony/ux --skill pr-review-merge-prep -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .github/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .github/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add symfony/ux --skill pr-review-merge-prep -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install symfony/ux pr-review-merge-prep --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/pr-review-merge-prep .opencode/skills/pr-review-merge-prep && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pr-review-merge-prep" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/pr-review-merge-prep into .opencode/skills/pr-review-merge-prep/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review-merge-prep", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pr-review-merge-prepPrinciples for rigorously reviewing a Symfony UX pull request and making it merge-ready.
PR Review Merge Prep is an agent skill from symfony/ux. Principles for rigorously reviewing a Symfony UX pull request and making it merge-ready. Use when reviewing PRs (one or a batch), verifying a submitted fix, retargeting a PR to another branch, or amending a contributor's work before merge.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Pull requests. It works with Symfony. The repository describes itself as: Symfony UX initiative: a JavaScript ecosystem for Symfony. The licence is MIT.
Read from SKILL.md and the folder at commit 93cda70. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitpnpmcomposerghphpFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
symfony.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
PR Review Merge Prep loads about 4.6k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 2,959 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from symfony/ux at commit 93cda70, republished under its MIT licence (© symfony). 2,959 words, ~4,622 tokens.
.claude/skills/pr-review-merge-prep/SKILL.md (or your agent's skills folder).git checkout <base> -- <paths> writes the base version to the index as well, so restoring with git checkout -- <paths> reads back from that index and silently discards every fix made during review. Commit or amend first and restore with git checkout HEAD -- <paths>, or copy the files aside and put them back by hand. Confirm with git diff --stat before trusting the next test run.security-triage skill. Retarget a pull request opened against 2.x for anything else.Configuration class or configure() method that reads container parameters (kernel.debug), env vars, another extension's raw config or machine state (extension_loaded(), class_exists()) into node defaults, normalization or validation: the same tree must come out whatever the environment or the machine, because config:dump-reference and the generated config reference are built from it. Such a default belongs in the extension, behind a defaultNull() node whose info() names the fallback, or behind a static '%kernel.debug%' default that the extension resolves.composer.json and in assets/package.json (peerDependencies). A symbol added in the current release cannot be satisfied by the oldest version the constraint allows, so the call site needs an existence guard, or the test belongs in the package that owns the code. The lowest-dependency CI job is only the symptom: the same code is broken at runtime for anyone on that older version.CHANGELOG.md entry and its documentation in src/<Package>/doc/*.rst, in the same PR; a deprecation also needs its upgrade note. A plain bugfix carries no CHANGELOG entry: the CHANGELOG lists features, deprecations, backward-compatibility breaks and bugs big enough that someone upgrading needs to know. Check that an entry sits under the topmost, unreleased version heading of the package's CHANGELOG.md. Contributors routinely file it under a version that already shipped, because that was the branch they opened against..claude/worktrees/pr<number> (listed in .git/info/exclude, so git status stays clean). Create it detached, then run gh pr checkout <number> inside it: that creates a local branch tracking the contributor's fork, so the push the maintainer runs at the end goes to the right place. Never fetch the head with git fetch upstream pull/<number>/head:..., which leaves the branch with no push remote.pnpm install at the root, composer update in each touched package). Never link the main checkout's vendor/ or node_modules/ into a worktree: an installer that rewrites files in place propagates through the link and breaks every checkout at once.git worktree remove once its PR is merged or abandoned.Preserve the contributor's authorship and ship one commit. Squash the PR into a single commit authored by the contributor: amend into their commit, or rebuild it with git commit -C <their commit>, which keeps their author. Update the commit message to cover what was added; a message must always match its diff.
Authorship is two fields. Amending keeps the author and rewrites the committer, and the committer is what the forge shows next to the commit and what stays in public history. Never pass a placeholder identity to git commit or git rebase: the repository's configured identity is already the right one. Check with git log -1 --format='%an <%ae> / %cn <%ce>' before handing the branch over, because merged history cannot be fixed.
Fixes added during review follow the same TDD rule as the original bug: failing test first, then the fix.
Retargeting to another branch is a rewrite, not a copy: express the fix in the target branch's code shape and conventions (available APIs, minimum PHP, test style, docblock metadata or attributes, tool versions). Rebuild tests that depend on things the target branch lacks. When a fix lands on 2.x and 3.x needs a different shape, record the known merge-up resolution in the pull request description, under a Merge-up to 3.x: paragraph, so the merger does not have to rediscover it.
When the rework sits in local commits on top of the contributor's, squash before rebasing. Otherwise the rebase replays the original commit first and raises conflicts against content the rework already replaced.
A conflict-free rebase can still produce broken code: an import the source branch happened to have, a test runner that ignores newer test syntax, a dist/ built from the old sources. The test run decides, not the rebase. Rebuild dist/ after every rebase that touches assets/src/.
Rebase onto the current base tip (git fetch upstream && git rebase upstream/<base>) and confirm the parent commit equals it. Check again just before handing the branch over: active repositories move. Run rebases and merges non-interactively (GIT_EDITOR=true).
A clean local style run is necessary, not sufficient. fabbot can be a superset of the local tool, and it lints every file the PR touches, including lines the PR did not write, so pre-existing debt in a touched file becomes this PR's failure. Judge the local tool by its exit code: output formats vary, and a grep for its listing can report clean while the tool found issues.
Read the reports of static analysis and style tools as hints, not as verdicts. They match patterns, they do not know what the code means, and false positives are normal. Never add an annotation, a cast or any other contortion whose only purpose is to silence a tool, and never patch a line the pull request does not touch to make a check pass. Judge each report by what the code does at runtime, and say so when the right answer is to leave the check red.
Run scoped tests while iterating and the full suite of each touched package before calling it done; never run every package at once. PHP suites run per package: cd src/<Package> && composer update && php vendor/bin/phpunit, and the same from src/<Package>/src/Bridge/<Bridge> for a bridge. JS runs per package too: cd src/<Package>/assets && pnpm run test:unit (and pnpm run test:browser when the change affects browser behavior). After any change under assets/src/, run pnpm run build in that package and commit dist/; CI fails when dist/ does not match a fresh build. If an assertion depends on the installed dependency version, use feature detection instead of assuming one version.
Retarget before the push, never after. CI reads the base branch from the pull request event at push time, so pushing a branch rebased onto a new base while the PR still points at the old one makes every job diff against the wrong branch: a diff of thousands of files, style checks on code the PR never touched, and a wall of red that a small change cannot explain. Rerunning does not help, since the event is unchanged.
The maintainer pushes; never run git push and never merge the pull request. Hand the branch back as exactly two lines:
cd .claude/worktrees/pr<number>
git push --forceUpdate the PR's metadata to match what it has become: title and package prefix ([LiveComponent]), header table, description, labels and base. On a PR that sat, the header table can claim a feature the review turned into a fix, the description keeps wording the review already corrected, and the prefix can name the wrong package. Leave exactly one Status: label, and none the diff no longer justifies.
Editing the PR, posting a review and commenting are outward actions published under the maintainer's account. Show the text and ask before the first one, unless the maintainer already asked for it.
Write the description for someone who never saw the discussion: the problem in one paragraph, the fix in one paragraph, and a before/after table for a behavior change. Cut what the diff already shows. The documentation itself ships in the same PR, under src/<Package>/doc/.
Apply corrections instead of suggesting them. The branch is being rewritten anyway, so a review comment asking for a one-line change is a pointless round trip. This covers the contributor's own code comments and test names when they describe something the code does not do.
Routine merge prep needs no comment at all: a rebase, a changelog fix, a constraint bump and a style fix are all visible in the diff. Comment when the reader has to decide or react.
Put what changed during review in a new comment instead. Those notes matter to the people following the thread and stop mattering once it merges, while the description outlives it.
Keep CHANGELOG entries to one line each, naming the new public surface and nothing more. Add a new entry at the end of the version's list, or next to the entries it relates to. Reasoning, comparison tables and usage guidance belong in the documentation. A CHANGELOG entry that has to explain itself is a sign the documentation entry is missing.
Keep link definitions and their uses in sync when editing .rst docs: DOCtor-RST fails CI on a link definition nothing references.
Apply the house rules to inherited content too: when amending someone else's commit, remove what the rules forbid instead of keeping it. An attribution trailer already in the contributor's commit is theirs: leave it unless the maintainer asks to remove it. Scan the added diff lines for violations before handing the branch over.
Finish on GitHub: post review feedback as a real review with evidence, close replaced issues with a factual explanation, and correct wrong claims left in threads.
When closing on the merits, state the decision and the reason and stop. Do not invite a fresh pull request, since that reopens the same discussion under a new number. When closing a stale pull request nobody rejected, a short line welcoming a fresh take is the right tone instead.
@param description.test* methods follow their branch: no return type on 2.x, where fabbot rejects one; : void on 3.x, where php-cs-fixer's void_return rule adds it and fabbot's check is disabled.Co-Authored-By trailers, no credit to AI tools in what you write: code, commit messages, PR titles and bodies, review comments, issue comments.© symfony, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/pr-review-merge-prep of symfony/ux.
Open the folder on GitHubat commit 93cda70
PR Review Merge Prep next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| PR Review Merge Prep this skillsymfony/ux | 1.1k | — | ~4.6k | Automated safety check: Pass | MIT | |
| PR Mergesymfony/symfony | 31k | — | ~3.1k | Automated safety check: Pass | MIT | |
| PR Review Merge Prepsymfony/symfony | 31k | — | ~4.7k | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 297k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Check PRonyx-dot-app/onyx | 32k | 2 repos | ~2.3k | Automated safety check: Pass | MIT |
symfony/symfony
Merge a reviewed pull request the way the Symfony core team does: one --no-ff merge commit per PR, whose message archives the whole discussion, with the review gates checked first.
symfony/symfony
Principles for rigorously reviewing a pull request and making it merge-ready.
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
onyx-dot-app/onyx
Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.
OpenHands/OpenHands
For a non-trivial pull request, write a self-contained HTML design doc under the temporary .pr/ directory and link a visibility-appropriate preview in the PR description, so maintainers grasp the…
symfony/ux
Cascade-merge the maintained Symfony UX branches from oldest to newest (2.x - 3.x), resolve conflicts, run the affected packages' tests and prepare the push.
symfony/ux
Triage a security finding in a Symfony UX package into a disposition: a private CVE (coordinated disclosure through the Symfony security process), a public hardening PR (fix in the open, no CVE), or…
symfony/ux
Review a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening.
symfony/ux
Generate, modify, or review Symfony UX Toolkit kit recipes (shadcn, flowbite-4, bootstrap, common).
Works with
Categories
Principles for rigorously reviewing a Symfony UX pull request and making it merge-ready. PR Review Merge Prep is an agent skill from symfony/ux. Principles for rigorously reviewing a Symfony UX pull request and making it merge-ready.
PR Review Merge Prep fits situations like: reviewing PRs (one; verifying a submitted fix; retargeting a PR to another branch; amending a contributors work before merge.
Run `npx skills add symfony/ux --skill pr-review-merge-prep -a claude-code`. Or copy the skill folder (.agents/skills/pr-review-merge-prep in symfony/ux) into .claude/skills/pr-review-merge-prep in your project. Claude Code loads it when a task matches its description.
Run `npx skills add symfony/ux --skill pr-review-merge-prep -a codex`. Or copy the skill folder (.agents/skills/pr-review-merge-prep in symfony/ux) into .agents/skills/pr-review-merge-prep in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add symfony/ux --skill pr-review-merge-prep -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pr-review-merge-prep, .gemini/skills/pr-review-merge-prep, .github/skills/pr-review-merge-prep and .opencode/skills/pr-review-merge-prep in your project.
Going by SKILL.md and its folder, PR Review Merge Prep needs the command-line tools its instructions call (git, pnpm, composer, gh and php).
SKILL.md names 1 domain. As links in the text: symfony.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
PR Review Merge Prep is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with PR Review Merge Prep: PR Merge (symfony/symfony, 31k stars), PR Review Merge Prep (symfony/symfony, 31k stars), Finishing a Development Branch (obra/superpowers, 297k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
symfony (a GitHub organization) maintains it in symfony/ux, which has 1,080 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 11, 2026.
Source: symfony/ux on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.