fork-and-pr — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fork-and-pr (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Walk a contributor through the standard "fork + branch + commit + push + PR" flow against a GitHub repo they don't have write access to. The user knows what they want to change; this skill codifies the boring gh/git syntax around it so they don't have to remember it.
Trigger when the user wants to contribute upward to a repo they don't own. Common phrasings: "I want to make a PR to X", "contribute a fix to X", "fork and PR", "open a PR against the upstream X repo", or right after a git push fails with 403 on a clone of someone else's repo.
Skip when:
git push + gh pr create – no fork needed).gh itself (Resource protected by organization SAML enforcement). That's a one-time per-org token authorization at https://github.com/settings/tokens, not a per-PR step. Tell them to grant SSO on their gh CLI token and retry; don't try to drive that through this skill.Usually one or more of:
owner/name or full URL, e.g. SalesforceCommerceCloud/plugin_sitemap).If the upstream repo isn't named, ask. If the intent isn't named, ask before step 3 (branch naming) – not before steps 1–2.
The skill runs as a staged flow with a deliberate pause after workspace setup. The user makes their edits and commits before the publish steps resume.
Figure out the user's starting state. Run, in the directory the user is operating from:
git rev-parse --show-toplevel 2>/dev/null
git status --short 2>/dev/null
git remote -v 2>/dev/null
gh repo view <upstream> --json viewerPermission,parent 2>&1
gh api user --jq .login
gh repo view <user>/<repo> --json parent 2>/dev/nullUse the login printed by gh api user for <user> and the repository-name portion of <upstream> for <repo>.
Interpret:
git rev-parse and the user-fork lookup fail) → state A: no fork or clone yet.https://github.com/settings/tokens; don't try to fork through it.Keep the git status --short result for step 3. Do not stash, reset, or otherwise rewrite existing work to make the setup look clean.
For state A, run:
gh repo fork <upstream> --clone --remoteThis creates or reuses the fork, clones it, and configures the parent as upstream.
For state B, run this from inside the existing upstream clone:
gh repo fork --remoteOmitting the repository argument selects the current repository. gh renames the existing origin remote to upstream and adds the user's fork as the new origin; do not pass --clone inside an existing clone.
For state C, run:
gh repo clone <user>/<repo>When GitHub CLI clones a fork, it adds the parent repository as upstream automatically. Verify the remotes before considering a manual git remote add.
For state D, no-op.
After this step, git remote -v should show origin = user's fork, upstream = the target repo. Confirm before proceeding.
Suggest a branch name based on the user's stated intent. Conventions vary by upstream repo, but reasonable defaults:
fix/<short-slug> for bug fixesfeat/<short-slug> for featureschore/<short-slug> for maintenance/dependency/cleanupdocs/<short-slug> for docs-only changesIf the upstream repo has a CONTRIBUTING.md with a different convention, follow that instead. Run:
git status --short
default_branch="$(gh repo view <upstream> --json defaultBranchRef --jq '.defaultBranchRef.name')"
git fetch upstream "$default_branch"
git checkout -b <branch-name> "upstream/$default_branch"If git status --short reports changes, stop and ask the user how they want to preserve that work before creating a branch. Never stash or reset it silently. Starting from upstream/$default_branch avoids carrying stale fork commits or whatever branch happened to be checked out.
If the user is already on the intended topic branch, do not create a nested branch. Verify that the current upstream tip is an ancestor before continuing:
git merge-base --is-ancestor "upstream/$default_branch" HEADIf that check fails, stop and discuss creating a clean branch or rebasing; conflict resolution is outside this skill.
This is the handoff. Tell the user explicitly:
"Branch<name>is ready. Make your edits, commit them (git add <files>thengit commit), and tell me when you're done – I'll push and open the PR."
Then stop. Do not poll git status or proactively check on their progress; wait for them to come back with "done", "committed", "ready", or similar.
While paused, if the user asks code questions or wants help with the change itself, that's a different task – help them, but don't push or open the PR until they say they're done.
When the user confirms they've committed:
git push -u origin <branch-name>
gh pr create --repo <upstream> --web--web opens the PR creation page in the browser with the branch and base pre-filled. This is preferable to authoring title/body on the CLI for first-time contributions to a repo, because the upstream may have a PR template (.github/PULL_REQUEST_TEMPLATE.md) that only renders in the web UI.
If the user explicitly wants to skip the browser, drop --web and gh will prompt for title and body inline – or pass --title / --body directly if the user already knows what they want.
gh pr create. Confirm by checking gh repo view --json viewerPermission.gh auth status will show which one is active. The fork lands under the active account. If they want it under a different account, gh auth switch first.master, develop): resolve it with gh repo view in step 3 and let gh pr create auto-detect the PR base. Don't hardcode main anywhere.gh repo fork reuses the fork but doesn't sync its default branch. Step 3 deliberately creates the topic branch from the fetched upstream default, so syncing the fork's default branch is unnecessary.gh (gh auth login – one-time setup, not per-PR).gh tokens (per-org, browser-driven, one-time).gh printed and stop. Don't ask follow-ups.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.