Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
bitwarden avatar

Bitwarden Workflow Linter Rules

  • 45 installs
  • 129 repo stars
  • Updated August 4, 2026
  • bitwarden/ai-plugins

Bitwarden Workflow Linter Rules is a Claude skill documenting all 10 bwwl linter rules and their fixes for GitHub Actions workflow files.

About

This skill is a reference for all 10 Bitwarden workflow linter (bwwl) rules for GitHub Actions workflows. It splits rules into seven mechanical ones that can be applied automatically (like name_capitalized, permissions_exist, pinned_job_runner, step_pinned) and three judgment rules requiring user input. Each rule includes its trigger and fix procedure. A developer uses it to audit and fix CI workflow files against Bitwarden's linting standards.

  • All 10 Bitwarden workflow linter (bwwl) rules with triggers and fixes
  • Splits mechanical auto-fix rules from judgment rules needing user input
  • Covers action pinning to 40-char SHAs and runner pinning

Bitwarden Workflow Linter Rules by the numbers

  • 45 all-time installs (skills.sh)
  • Ranked #772 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

bitwarden-workflow-linter-rules capabilities & compatibility

Capabilities
ci cd · workflow lint
Works with
github
Use cases
ci cd · devops
From the docs

What bitwarden-workflow-linter-rules says it does

Covers all 10 linter rules split into
SKILL.md
npx skills add https://github.com/bitwarden/ai-plugins --skill bitwarden-workflow-linter-rules

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs45
repo stars129
Last updatedAugust 4, 2026
Repositorybitwarden/ai-plugins

What it does

Look up and fix Bitwarden workflow linter rules for GitHub Actions workflow files.

Who is it for?

Auditing and fixing GitHub Actions workflow files against Bitwarden's linter rules.

Skip if: General CI pipeline design beyond the linter rules themselves.

When should I use this skill?

You need the definition or fix for a Bitwarden workflow linter rule such as step_pinned or permissions_exist.

What you get

Workflow files are linted against all 10 bwwl rules with mechanical fixes applied and judgment rules escalated to the user.

  • Linted and fixed GitHub Actions workflow files

By the numbers

  • 10 linter rules total
  • 7 mechanical rules and 3 judgment rules
  • External actions pinned to 40-character SHA

Files

SKILL.mdMarkdownGitHub ↗

Mechanical Rules — apply automatically

`name_capitalized`

  • Trigger: A workflow-level or job-level name: value does not start with a capital letter.
  • Fix: Capitalize the first character of the name value. Do not change anything else.

`permissions_exist`

  • Trigger: A workflow or job is missing an explicit permissions: key.
  • Fix: Add permissions: {} at the workflow level if all jobs are missing it, or at the individual job level if only some jobs are missing it. Prefer job-level permissions.

`pinned_job_runner`

  • Trigger: A job's runs-on: uses an unpinned label.
  • Fix: Replace with the current pinned equivalent:
  • ubuntu-latestubuntu-24.04
  • windows-latestwindows-2022
  • macos-latestmacos-14

`step_pinned`

Bitwarden enforces two distinct pinning requirements depending on who owns the action. Steps with no uses: field and local actions (starting with ./) are skipped entirely.

  • Trigger (internal actions): A uses: reference starting with bitwarden/ is not pinned to @main. Exception: references of the form bitwarden/sm-action[/path]@<any-ref> are compliant at any ref and never trigger this rule.
  • Trigger (external actions): A uses: reference not starting with bitwarden/ is not pinned to a full 40-character commit SHA, or is missing an inline version comment.
  • Fix (internal actions):
  • Change the ref to @main (e.g., bitwarden/gh-actions/azure-login@v1bitwarden/gh-actions/azure-login@main)
  • Do not resolve a SHA — @main is the required and compliant state.
  • Fix (external actions):

1. Resolve the correct commit SHA via the GitHub API: gh api repos/{owner}/{repo}/commits/{ref} --jq '.sha' 2. Show the SHA and a verification link (https://github.com/{owner}/{repo}/commit/{sha}) to the user before applying. 3. Wait for the user to confirm the SHA. If they provide a different SHA, use that instead. 4. Replace the uses: value with {action}@{sha} and add a comment with the original tag: # {original-ref}

  • Example: uses: actions/checkout@v4uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

`underscore_outputs`

  • Trigger: A multi-word output name in a $GITHUB_OUTPUT write or outputs: block uses hyphens or camelCase instead of underscores.
  • Fix: Rename the output key to use underscores. Update all references to that output within the same file.

`job_environment_prefix`

  • Trigger: An environment variable name at the job level does not follow SCREAMING_SNAKE_CASE.
  • Fix: Rename to SCREAMING_SNAKE_CASE and update all usages within the job.

`check_pr_target`

  • Trigger: A workflow using pull_request_target has jobs not restricted to the default branch.
  • Fix: Add a condition to the affected jobs: if: github.ref == 'refs/heads/<default-branch>'. Determine the repo's default branch rather than assuming main. If the job already has an if: condition, combine with && (e.g., if: <existing-condition> && github.ref == 'refs/heads/<default-branch>').

Judgment Rules — pause and ask the user

`name_exists`

  • Trigger: A workflow or job is missing a name: key entirely.
  • Fix: Ask the user what name to use, then add a name: key at the correct level with a capitalized value.

`step_approved`

  • Trigger: A step's uses: references an action not on the Bitwarden approved actions list.
  • Options to present to the user:

1. Add to approved list — if the action is legitimate and has been reviewed and approved, add it to bitwarden/workflow-linter's approved actions config. 2. Replace — swap with an approved alternative that provides the same functionality. 3. Remove — delete the step if it is not essential.

  • Do not make this change automatically. Show the unapproved action name, ask which option the user wants, then act.

`run_actionlint` (complex findings)

  • Trigger: actionlint reports an error that is not a simple formatting issue (e.g., type mismatches in expressions, invalid context references, shell script errors).
  • Action: Show the finding verbatim, suggest a fix based on actionlint's message, and ask the user to confirm before applying.
  • Simple actionlint findings (e.g., shellcheck style warnings with a clear single-line fix) may be applied automatically.

Related skills

FAQ

How many linter rules are there?

10 rules, split into 7 mechanical rules and 3 judgment rules requiring user input.

How does step_pinned handle external actions?

External actions must be pinned to a full 40-character commit SHA with an inline version comment.

DevOps & CI/CDdeployinfra

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.