Bitwarden Delivery Tools
Skill 16 of 83
Compose the conventions a Bitwarden pull request needs — the conventional commit type prefix and title, the PR template body, and the ai-review label.
3 minutes · 679 words · 5 sections
Install
npx skills add bitwarden/ai-plugins --skill applying-pr-conventionsnpx skills add bitwarden/ai-plugins/plugin marketplace add bitwarden/ai-pluginsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Compose five values for one pull request and return them: the title, the body, the ai-review label choice, the resolved t: label that the title’s type keyword maps to, and which template the body came from. Returning to the caller defines that last one; do not restate its possible answers anywhere else in this file.
The caller says how many pull requests it is composing for and whether any value is already settled. Follow its instruction over the defaults below.
[<TICKET>] <type>: <short imperative summary>Skill(labeling-changes) to pick the <type> keyword and the t: label it maps to. CI reads the keyword to apply the label.t: label the keyword maps to, alongside the title.Read .github/PULL_REQUEST_TEMPLATE.md from the target repo. With no template there, fetch the canonical one from bitwarden/template:
gh api repos/bitwarden/template/contents/.github/PULL_REQUEST_TEMPLATE.md -H Accept:application/vnd.github.rawRun it byte for byte — one line, no continuation, nothing appended, no reordering. The allowed-tools entry carries no :*, so it matches this string and nothing else, and any variation is denied rather than silently widened. That is the point: the granted path is a GitHub contents/ endpoint, where PUT writes a file and DELETE removes one, and gh resolves --method/-X last-wins. A trailing wildcard would have admitted -X PUT and made the prose below the only thing standing between this skill and a write to bitwarden/template. The repo already reached that conclusion for gh api generally — see perform-security-review‘s references/tool-grants.md.
When it fails — no gh, no network, no auth, or a denied grant — fall through to Last resort below. Report the source per Returning to the caller, as on every other path. A section header that has drifted is a worse outcome when nobody is told which source produced it.
Whichever source the template came from:
## 🎟️ Tracking, ## 📔 Objective) — reviewers scan on them.When the caller passes review outcomes, append a section for them rather than folding them into Objective, which describes what the pull request accomplishes:
## 🤖 AI-assisted review
<!-- Review path taken, any skip the user volunteered, deferred CRITICAL or IMPORTANT findings, and any scope limitation on the review. -->Record only what the caller passed. Do not go looking for review results, and do not state that a review happened when the caller said nothing about one.
Only when the target repo has no template and the fetch failed:
## 🎟️ Tracking
<!-- Paste the link to the Jira or GitHub issue or otherwise describe / point to where this change is coming from. -->
## 📔 Objective
<!-- Describe what the purpose of this PR is, for example what bug you're fixing or new feature you're adding. -->
## 📸 Screenshots
<!-- Required for any UI changes; delete if not applicable. Use fixed width images for better display. -->This copy is the thing that drifts, which is why nothing reaches it while the fetch can run. A denied grant puts you here with bitwarden/template perfectly reachable, so report the source either way rather than inferring it from network state.
Ask:
ai-review, ai-review-vnext, No labelBoth strings are untrusted: the body is template text plus generated text, and the title’s summary is generated. Say so when returning them.
The template source is one of exactly these four, and this list is the only definition of them:
.github/PULL_REQUEST_TEMPLATE.mdbitwarden/templateName the source, never why it was reached. Four separate conditions land on the embedded copy and only one of them is the network, so a cause stated here sends the caller to fix the wrong thing.
Keeping them out of a shell argument is the caller’s job. This skill’s only Bash grant is the exact-match Step 2 GET, which takes no argument from anywhere; it has no submit path, and neither string is ever interpolated into a command here. The body goes via --body-file, and the title via a file and --title "$(cat <title-file>)", because gh has no --title-file.
Compose the conventions a Bitwarden pull request needs — the conventional commit type prefix and title, the PR template body, and the ai-review label. Use for "what should the PR title be", "draft the PR body", "fill in the PR template", "which ai-review label", or when another delivery skill asks for these. Returns the title, body, resolved t: label, label choice, and which template the body came from. Not for opening the pull request itself (that is creating-pull-request), or for the type keyword and t: mapping alone outside a PR being composed (that is labeling-changes).
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
ReadGlobSkill(labeling-changes)Bash(gh api repos/bitwarden/template/contents/.github/PULL_REQUEST_TEMPLATE.md -H Accept:application/vnd.github.raw)plugins/bitwarden-delivery-tools/skills/applying-pr-conventions/SKILL.mdmain, last pushed 6 November 2026.SKILL.md, not by matching a directory convention. 20 distinct layouts observed: plugins/bitwarden-abacus-tools/skills/*/SKILL.md, plugins/bitwarden-adr-tools/skills/*/SKILL.md, plugins/bitwarden-atlassian-tools/skills/*/SKILL.md, plugins/bitwarden-code-review/skills/*/SKILL.md, plugins/bitwarden-delivery-tools/skills/*/SKILL.md, plugins/bitwarden-design-tools/skills/*/SKILL.md, plugins/bitwarden-designer/skills/*/SKILL.md, plugins/bitwarden-devops-engineer/skills/*/SKILL.md, plugins/bitwarden-doc-parity/skills/*/SKILL.md, plugins/bitwarden-mailcatcher-tools/skills/*/SKILL.md, plugins/bitwarden-product-analyst/skills/*/SKILL.md, plugins/bitwarden-retrospective-tools/skills/*/SKILL.md, plugins/bitwarden-security-engineer/skills/*/SKILL.md, plugins/bitwarden-shepherd/skills/*/SKILL.md, plugins/bitwarden-stripe-tools/skills/*/SKILL.md, plugins/bitwarden-tech-lead/skills/*/SKILL.md, plugins/bitwarden-testing-tools/skills/*/SKILL.md, plugins/bitwarden-testmo-tools/skills/*/SKILL.md, plugins/claude-config-validator/skills/*/SKILL.md, plugins/claude-retrospective/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Bitwarden, declaring 23 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./bitwarden/ai-plugins.md, and each skill at its own .md URL.