
Finish Line
FreeStreamline merging blocked React Router PRs.
Free · Opens the source repo
What Finish Line does
Finish Line is a specialized tool designed for maintainers of the remix-run/react-router repository to effectively manage and resolve blocked pull requests (PRs) from community contributors. This skill automates the process of triaging PRs by checking for common merge blockers such as unsigned Contributor License Agreements (CLAs), missing change files, or documentation. By invoking the skill with a PR number or URL, users can quickly assess the state of a PR and determine the next steps needed to bring it to completion, all while respecting contributor ownership and repository conventions.
The skill begins by inspecting the local git state and fetching the latest main branch to ensure that the PR is evaluated against the most current codebase. It gathers essential PR context using GitHub CLI commands, which provide detailed insights into the PR's status, author, and any existing comments or checks. This information is crucial for identifying the specific blockers that may be preventing the PR from being merged.
Depending on the identified issues, Finish Line offers two primary workflows: the Unsigned CLA Replacement workflow and the Contributor-Branch workflow. The Unsigned CLA Replacement workflow is triggered when the contributor has not signed the CLA, allowing maintainers to recreate the PR with their own commits while preserving the original intent of the contribution. Conversely, the Contributor-Branch workflow is utilized when minor changes are needed, such as adding documentation or a change file, allowing maintainers to push these updates directly to the contributor's branch.
This skill is particularly beneficial for repository maintainers who frequently deal with community contributions and want to streamline the process of merging PRs. It helps maintain the integrity of the codebase while ensuring that contributors are recognized for their work, thus fostering a collaborative development environment.
When to use it
Use Finish Line when you encounter blocked PRs in the `remix-run/react-router` repository and need to resolve merge blockers efficiently.
When not to use it
This skill is not suitable for repositories outside of `remix-run/react-router` or for PRs that do not have clear merge blockers.
What you can build with it
Resolving an Unsigned CLA
When a contributor submits a PR without signing the CLA, use Finish Line to recreate the PR under a maintainer branch, ensuring compliance while preserving the original intent.
Adding Missing Documentation
If a PR is blocked due to missing documentation, invoke Finish Line to check out the contributor's branch and add the necessary documentation without altering the original code.
Handling Multiple Merge Blockers
When a PR has several issues preventing it from being merged, use Finish Line to triage and address each blocker systematically, streamlining the resolution process.
How to install Finish Line
View source1. Install with the skills CLI
npx skills add remix-run/react-router/finish-line --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by remix-runFinish Line
Overview
Finish blocked community PRs in remix-run/react-router while respecting contributor ownership, CLA constraints, and the repo's PR packaging conventions.
Treat the PR number or URL in $ARGUMENTS as the target PR. If no target is provided, ask for it before doing anything.
Triage
- Inspect local state with
git status --short --branch. If unrelated dirty files exist, do not overwrite or stage them. - Fetch current main before making branch decisions:
git fetch origin main
- Gather PR context:
gh pr view <pr> --repo remix-run/react-router --json number,title,body,state,isDraft,author,baseRefName,headRefName,headRepository,headRepositoryOwner,maintainerCanModify,mergeStateStatus,reviewDecision,labels,files,commits,statusCheckRollup,url
gh pr checks <pr> --repo remix-run/react-router
gh pr diff <pr> --repo remix-run/react-router --stat
gh pr view <pr> --repo remix-run/react-router --comments
- Identify merge blockers. In particular:
- If a CLA check or comment shows the author has not signed the CLA, use the unsigned-CLA replacement workflow.
- If the PR only needs repo-maintainer additions such as a change file or docs, use the contributor-branch workflow.
- If the blocker is unclear, summarize the evidence and ask the user which path to take.
- Evaluate test coverage before deciding the finish-line changes:
- Inspect the PR diff, changed files, existing nearby tests, review comments, and failed checks for test expectations.
- If the PR changes runtime behavior, build/plugin behavior, routing semantics, generated types, RSC behavior, docs rendering, or any bug/feature surface that can regress, add or preserve a focused test unless equivalent coverage already exists.
- If tests are already included, verify they exercise the changed behavior and cover the affected React Router mode(s): Declarative, Data, Framework, RSC Data, and/or RSC Framework.
- If tests are not needed because the change is documentation-only, packaging-only, a change file, or otherwise not executable behavior, note that rationale in the final report.
- If a useful test is required but too large or risky for the finish-line scope, stop and ask the user before broadening the PR.
Unsigned CLA Replacement
Use this path when the PR author's CLA is not signed. Do not merge, cherry-pick, rebase, or push the contributor's commits. Use the PR diff as the behavior/content reference and recreate the final file changes in maintainer-authored commits from current origin/main.
- Save the original PR title, body, labels, changed-file list, and diff for reference.
- Create a fresh branch from current main:
git checkout -B brophdawg11/finish-line-pr-<pr-number> origin/main
- Recreate the same resulting changes on the fresh branch. Keep the implementation as close as possible to the original PR unless main has moved and a tiny adaptation is required.
- Add any missing finish-line work, such as tests, a change file, or docs, if those are also required.
- Run focused validation that matches the touched area. Prefer the narrowest meaningful test/build command.
- Commit the recreated changes with a concise imperative subject.
- Before pushing/opening the replacement PR, read
.agents/skills/create-pr/SKILL.mdand follow its current branch, PR body, and label guidance unless this skill gives a more specific instruction for replacement PRs. - Push the maintainer branch and open a replacement PR against
main.- Reuse the original title unless it is misleading.
- Use a similar description, but make it clear this is a agent/maintainer-authored replacement.
- Include the old PR number in the description (
#<pr-number>). - Default to a ready PR when validation passed and the original PR was otherwise mergeable; use a draft PR if validation is incomplete or the original PR was draft.
- Apply the relevant labels from the original PR plus any package/feature labels required by
.agents/skills/create-pr/SKILL.md.
- Comment on the original PR and close it after the replacement PR exists:
Thanks for the PR! We can't merge this without the CLA being signed, so we're going to re-implement this work in #<new-pr-number> to keep this moving.
Then run:
gh pr comment <old-pr-number> --repo remix-run/react-router --body-file <comment-file>
gh pr close <old-pr-number> --repo remix-run/react-router
Contributor-Branch Workflow
Use this path when the contributor's CLA is signed and the missing work is small maintainer follow-up, such as a change file or docs.
- Check out the PR branch:
gh pr checkout <pr-number> --repo remix-run/react-router
- Confirm the branch and local state:
git status --short --branch
git branch --show-current
- Make only the missing finish-line changes, including focused tests when the coverage evaluation requires them. Do not refactor the contributor's work unless it is necessary to unblock mergeability and the user agrees.
- Validate the exact content with the user before pushing:
- For a change file, show the package path, file name, change type, and full markdown contents.
- For docs, show the affected files and the relevant prose/API snippets.
- For tests, show the test file path, the behavior covered, and the mode(s) covered.
- Ask explicitly for approval to commit and push back to the PR branch.
- After approval, run focused validation when appropriate, commit the maintainer follow-up, and push to the PR branch. If
git pushfails because the contributor branch cannot be modified, stop and report the failure instead of opening a replacement PR unless the user approves that pivot.
Change Files
Create change files under the affected package:
packages/<package>/.changes/<type>.<unique-meaningful-name>.md
Use patch, minor, major, or unstable for <type>. For bug fixes and narrow behavior fixes, default to patch. Keep the content concise:
Brief description of the user-facing change
If the PR spans multiple packages, prefer the package with the direct user-facing API or runtime behavior. Ask the user when the package or change type is not obvious.
Documentation
Do not add documentation by default for ordinary bug fixes. Add docs when the PR changes a documented API, introduces new behavior users need to discover, changes examples, or the user/reviewer explicitly requested docs.
Follow repo docs rules:
- Edit source docs or JSDoc, not generated
docs/api/output. - Include mode context when adding docs for React Router behavior: Declarative, Data, Framework, RSC Data, or RSC Framework.
- For API docs generated from JSDoc, edit
packages/react-router/lib/comments and note thatpnpm run docsmay be required.
Final Report
Report the path taken and the current PR state:
- Original PR number and blocker.
- Whether changes were pushed to the contributor branch or a replacement PR was opened.
- Branch, commit hash, and PR URL when applicable.
- Any old-PR comment/close action taken.
- Validation performed or skipped.
- Test coverage decision: added, already present, or intentionally omitted with rationale.
Frequently asked questions about Finish Line
Similar skills
Quality Playbook Generator
Run comprehensive quality audits on any codebase.
PR Draft Summary
Automate PR summary generation for openai-agents-python.
Final Release Review
Streamline your release candidate audits with ease.
Unit Test Vue Pinia
Efficiently write and review unit tests for Vue 3 applications.
Slang Shader Expert
Optimize and integrate Slang shaders with ease.
Telemetry Standards
Ensure consistent event tracking in Supabase Studio.
