Agent skill

Pull Request

by werf in werf/werf

Generates Pull Request titles and descriptions according to werf conventions.

Apache-2.0Auto-check passedDevelopment

Install Pull Request

skills CLI
$ npx skills add werf/werf --skill pull-request -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install werf/werf pull-request --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/werf/werf.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/pull-request .claude/skills/pull-request && rm -rf skills-src

Use ~/.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/

Facts

Skill name
pull-request
GitHub stars
4.7k
Token cost
~2.9k tokens
SKILL.md length
1,582 words
Files
1
Skills in repo
7
Repo updated
First seen
Licence
Apache-2.0

At a glance

Generates Pull Request titles and descriptions according to werf conventions.

  • Tasks that involve Pull requests
  • SKILL.md covers Defaults, Title, Description and Self-check against the diff, plus 2 more sections
  • Calls gh and git
  • Tasks that involve CI/CD

What it does

Pull Request is an agent skill from werf/werf. Generates Pull Request titles and descriptions according to werf conventions. Use when creating or updating a PR.

Its SKILL.md is about 2.9k 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 and CI/CD. It works with Docker. The repository describes itself as: A solution for implementing efficient and consistent software delivery to Kubernetes facilitating best practices. The licence is Apache-2.0.

When your agent uses it

  • Tasks that involve Pull requests
  • Tasks that involve CI/CD

Example prompts

  • “Use the pull-request skill to generate Pull Request titles and descriptions according to werf conventions”
  • “/pull-request”

What it can do on your machine

Read from SKILL.md and the folder at commit fa73c7a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • gh
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Pull Request loads about 2.9k tokens when it runs. Until then it costs about 32 tokens; SKILL.md has 1,582 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~32
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from werf/werf at commit fa73c7a, republished under its Apache-2.0 licence (© werf). 1,582 words, ~2,908 tokens.

Download SKILL.mdSave it as .claude/skills/pull-request/SKILL.md (or your agent's skills folder).
name
pull-request
description
Generates Pull Request titles and descriptions according to werf conventions. Use when creating or updating a PR.

Pull Request Conventions

The description is the spec of the change: a reviewer who never opens the diff must be able to say what werf does differently after it, where it bites, and what was actually proven. The diff is the evidence, not the source.

Everything only true during the review — what you ran, where to look, what to do after the merge — goes in a comment. werf squashes, so the description becomes the commit body and outlives the review by years, while a comment never can: the kernel's --- line, with GitHub doing the cutting. The (#NNNN) in the subject keeps the comment reachable from git log.

Defaults

  • Create PRs as draft (gh pr create --draft) and leave them draft. Only the user marks a PR ready.
  • Post the review-time part as the first comment (gh pr comment), never in the description. Nothing to say — skip it; a comment holding only a mutation line is still required.
  • When a push changes what the PR does, its evidence or its follow-up work, update the title, the description and that comment in the same step.

Title

<type>(<scope>): <subject>, ≤ 72 characters, mirroring the header of the main commit. Types, scopes and subject rules come from git-conventions and CONTRIBUTING.md#conventions, including the rule that a feat/fix subject names the user-visible outcome, not the mechanism. Nested scopes comma-separated from the broadest: fix(build, stapel, import): …. For a dependency bump the title states werf's outcome, never the upstream changelog subject.

Description

## Summary

<What werf does differently now, at most 3 sentences. For a `fix`: the observed wrong behavior,
plus a pasteable repro (command / werf.yaml / Dockerfile) when it reproduces from a clean
checkout, otherwise the precondition it needs — a race, a pre-existing host state. Never a
fabricated repro. For a `feat`: what the user can now do and the workflow that needed it.>

## What

- <One falsifiable behavior claim per line, with the condition that triggers it: "under umask 001
  the service script is mode 0755", never "handles umask correctly".>
- <Every user-visible surface added or changed, with its default: flag, annotation, env var,
  werf.yaml field, log or error text, exit code.>
- <BREAKING: a claim that breaks an existing setup names who it breaks and the way out — "every
  host without netavark fails at backend init; CONTAINERS_CONF_OVERRIDE cannot bring CNI back".>
- <VERIFIED: a check CI cannot repeat — hand-run, host-level, offline, against a cluster — named
  on the claim it settles. Anything CI does is not worth the line.>
- <UNVERIFIED: a claim nothing stands behind says so, and says what would settle it.>
- <What deliberately does NOT change, where a reader would expect it to.>

## Why

<The root cause, and what leaving it alone costs. Then the rejected alternative, when there is one
someone would argue for — "a repo-wide marker instead of a per-project one" is an alternative,
"buildah exposes no typed error" is the diff. Never a reworded Summary or claim list.>
  • Summary and Why are the pair that collides, because for a fix the symptom and its cause are neighbours in one chain: what is visible from outside goes in Summary, why the code did that and what leaving it costs goes in Why. When the symptom cannot be named without its mechanism — a stale cache entry, a missing host binary — name it in Summary anyway.
  • Every risk is a claim; Review focus is for where to look, not for what breaks.
  • Breaking claims go first, in a ### Breaking group, or lead their line with BREAKING: when there is only one. VERIFIED: and UNVERIFIED: stay inside the claim they qualify and are never grouped — a claim that both breaks and is unproven is the one a group would tear in half. Capitals, never bold or emoji — git log shows both literally, and only a word greps.
  • A change breaking in the conventional-commits sense also needs the BREAKING CHANGE: footer, which release-please turns into a major version bump. Never add it on your own — propose it, the bump is the user's call.
  • A claim is one short line and the list is one level deep. A qualifier that will not fit — the way out, the mechanism a claim's safety rests on, UNVERIFIED: — becomes the next line of the same group. Group by user workflow or surface, never by file, under ### headings once What passes eight claims.
  • Behavior is what is observable from outside: a command's output, an exit code, a file's mode, a resource in the cluster, a rebuild that no longer happens. Function names, refactored call paths and file lists belong to the diff. Debug output emitted incidentally is not a surface; when diagnostic output is the deliverable it is — then name the switch that turns it on, the lines it adds and where they appear, and the invariant that nothing is emitted or measured without it.
  • With no user-visible behavior at all, What states the invariant: what must not change, and what a reviewer checks it against. For a build or packaging change that is a developer-visible contract — build tags, embedded assets, task targets. For a speed change it is the work that no longer happens plus the workload the numbers came from; a wall-clock figure alone is not a claim.
  • Length follows the behavior surface, never the diff. A What that will not fit is a PR that should be split, not a description to trim.
  • These heading names, verbatim. A section with nothing to say is omitted, never renamed or padded. For one obvious change — nothing a reader would observe, and nothing a BREAKING:, VERIFIED: or UNVERIFIED: marker would qualify — drop the headings: one to three sentences, a marker leading the sentence it qualifies. A typo or a wording fix qualifies; a change to a published artifact, to what a pipeline emits, or to an instruction an agent follows does not, and a change needing BREAKING: never does.
  • A bump of werf/nelm, werf/kubedog or werf/common-go claims every user-visible change between the old pin and the new one, read from the commit range and never from the target's release notes — a pseudo-version pin sits mid-release, so the range crosses commits those notes never mention. One gh api repos/<owner>/<repo>/compare/<old>...<new> answers it in a second; a bump is trivial only after that range comes back with no user-visible change, and then the sentences name the range and say so.
  • An edit under .agents/skills, AGENTS.md or CODESTYLE.md is trivial only when it cannot change what an agent produces: a typo, a broken link, reflowed text. A changed, added or removed instruction takes the full form, and What states the delta in the artifact the agent generates.
  • A bot-generated description — release-please, dependabot, renovate — is the artifact and is regenerated on every push. Never rewrite it; what a human has to add goes in the comment.
  • When the behavior surface already has a versioned home in this repo — a migration guide, a reference page — What names that document and adds only what is not in it, unless this PR is the change to that document — then What states what changes for whoever follows it and names the file as the authority for the rest, because an index of the edits is not a spec. Check the document really covers the claims before delegating to it; a guide that lags the branch turns the delegation into a false statement.
  • The description is self-contained: someone with no access to the issue, the discussion or the diff must be able to follow it. Link the issue and summarize what a claim rests on, no more.
  • The only code block worth its space is a repro the reader can paste, never a transcript of output that repro already produces. An error message users will search for is quoted inline, in the claim that says when they see it.
  • English. No speculation, no "this PR improves the codebase".
  • Fixes/Closes keywords live in the description — GitHub does not auto-close from a comment. A reference to werf/nelm, werf/kubedog or werf/common-go does not auto-close at all: link it, and put closing it by hand in the comment's Follow-up. When a known commit introduced the bug, pin it: Fixes: <12+ chars of sha> ("the commit subject").
  • Sensitive details are governed by git-conventions and apply here unchanged, plus: a public project may be named as the workload that motivated a change, a customer may not.
Show full SKILL.md (438 more words)Show less

Self-check against the diff

Before handing the PR over to the user, map it both ways:

  • every behavior-changing hunk lands on a claim in What, and a supporting hunk (test, doc, error wrapping, refactor) lands on the claim it serves — an unmapped hunk is scope creep or a missing claim;
  • every claim lands on code — a claim with nothing behind it is unfinished work. For a documentation change this map runs against the existing code that makes each claim true.

A branch too large to walk hunk by hunk is mapped commit by commit, and the comment says so.

The comment

## Verification

- <manual or hand-run check CI cannot make, and the environment it needed>
- Mutation: <what was broken in the code> → <test that failed>.
- Not run: <check that would have covered a claim, and why it could not run>

## Review focus

- <where to look: an area that deserves care, a large generated diff>

## Follow-up

- [ ] <action outside this diff, naming where it happens (`owner/repo`, a file, a command)>
- [ ] BLOCKER: <the same, but it has to land before this PR is merged>
  • These heading names, verbatim. A block with nothing to say is left out, and a comment with nothing in any block is not posted. The comment never stands in for a missing description: a fact that belongs in What means What has to be written.
  • Verification is the mechanics: the command, the environment, what it showed. The attestation itself — that a check CI cannot repeat was made — rides on the claim as VERIFIED:, and this block is where it is spelled out; never the same sentence twice. Only the delta over CI. CI builds and runs the whole suite, so task build/task test:unit are noise unless a scoped local run is itself the point. Which claims are unproven belongs to the claims, never written twice.
  • A new or changed test needs its mutation named. When the mutation was not run, say so and name the one to try (test-the-tests).
  • A Not run: line names the check and what stopped it; the claim itself says it is unproven. If the line would only restate the claim, drop it. It earns its place only when the missing check leaves a claim unverified.
  • Review focus never speculates — "probably fine because …" is not a risk, drop the line. A safety property the author could not establish stays here as a question — "confirm a cached git stage cannot resurrect content after a force-push" — because as a claim it asserts the very safety nobody checked.
  • Follow-up: checkboxes, one action per line, everything this diff cannot contain — after the merge, or before it with a leading BLOCKER: for a dependency that has to land first. Mark what must not be skipped; when a release note is the only mitigation for a breaking change, say so on the line. No speculative and no already-done items. Public repositories only: a private harness or any path under ~ is never a line in the PR.

Output

When generating only the title (e.g. for gh pr edit --title), output ONLY the title, with no additional text, quotes, or formatting.

© werf, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/pull-request of werf/werf.

Open the folder on GitHubat commit fa73c7a

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders. This page covers the copy in werf/werf, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Pull Request 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.

Pull Request compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pull Request this skillwerf/werf4.7k—~2.9kAutomated safety check: PassApache-2.0
Verifygocronx-team/gocron808—~529Automated safety check: PassMIT
PR Reviewkimdre/doco-cd1.7k—~311Automated safety check: PassApache-2.0
CI Adhoc Testnubjs/nub4.4k—~1.7kAutomated safety check: PassMIT
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Babysit PR To Pass CIsgl-project/sglang37k2 repos~3kAutomated safety check: PassApache-2.0

Similar skills

  • Verify

    gocronx-team/gocron

    Reproduce the complete gocron CI pipeline locally and report every result.

    808 GitHub stars~529 tokensUpdated 5 days ago
    DevelopmentAuto-check passed
  • PR Review

    kimdre/doco-cd

    Review pull request diffs for correctness and regressions, and provide actionable feedback when asked to review a PR.

    1.7k GitHub stars~311 tokensUpdated today
    DevOps & CloudAuto-check passed
  • CI Adhoc Test

    nubjs/nub

    Run ad-hoc / exploratory tests on a real OS or platform via CI when the behavior CANNOT be reproduced on the local host or in Docker — macOS Seatbelt / sandbox-exec / codesigning, Windows cmd.exe /…

    4.4k GitHub stars~1.7k tokensUpdated today
    DevOps & CloudAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Babysit PR To Pass CI

    sgl-project/sglang

    Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.

    37k GitHub starsUsed in 2 repos~3k tokens
    DevelopmentAuto-check passed
  • CI Act Run

    chewiebug/GCViewer

    Run the full build-and-deploy.yaml workflow locally via act + Docker.

    4.6k GitHub stars~2.4k tokensUpdated 3 mo ago
    DevelopmentAuto-check: notes

More from werf/werf

  • werf conventions for branch names and commit messages. An agent skill from werf/werf.

    4.7k GitHub stars~1.3k tokensUpdated yesterday
    Auto-check passed
  • Review

    werf/werf

    Code review of a pull request, branch, or diff. An agent skill from werf/werf.

    4.7k GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • Independent challenge pass for a non-trivial or high-risk change.

    4.7k GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • How to treat conclusions inherited from an earlier session — handover notes, prepared comments, verdict files, plans.

    4.7k GitHub stars~669 tokensUpdated yesterday
    Auto-check passed
  • Session Retro

    werf/werf

    Analyze the current session for harness-worthy lessons — repeated corrections, discovered conventions, skill bugs — and turn them into concrete repo changes: docs, skills, task targets, linter…

    4.7k GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Verify a test actually falsifies the behavior it claims to cover, via real mutation.

    4.7k GitHub stars~1k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Pull Request

What does Pull Request do?

Generates Pull Request titles and descriptions according to werf conventions. Pull Request is an agent skill from werf/werf. Generates Pull Request titles and descriptions according to werf conventions.

When should I use Pull Request?

Pull Request fits situations like: tasks that involve Pull requests; tasks that involve CI/CD.

How do I install Pull Request in Claude Code?

Run `npx skills add werf/werf --skill pull-request -a claude-code`. Or copy the skill folder (.agents/skills/pull-request in werf/werf) into .claude/skills/pull-request in your project. Claude Code loads it when a task matches its description.

How do I install Pull Request in Codex?

Run `npx skills add werf/werf --skill pull-request -a codex`. Or copy the skill folder (.agents/skills/pull-request in werf/werf) into .agents/skills/pull-request in your project. Codex loads it when a task matches its description.

Can I use Pull Request in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add werf/werf --skill pull-request -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pull-request, .gemini/skills/pull-request, .github/skills/pull-request and .opencode/skills/pull-request in your project.

What does Pull Request need to run?

Going by SKILL.md and its folder, Pull Request needs the command-line tools its instructions call (gh and git).

Does Pull Request access the network?

SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Pull Request safe to install?

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.

What licence does Pull Request use?

Pull Request is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Pull Request use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Pull Request?

Skills that share tags, products or a category with Pull Request: Verify (gocronx-team/gocron, 808 stars), PR Review (kimdre/doco-cd, 1.7k stars), CI Adhoc Test (nubjs/nub, 4.4k 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.

Who maintains Pull Request?

werf (a GitHub organization) maintains it in werf/werf, which has 4,728 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 6, 2026.

Source: werf/werf on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.