Testland
Browse all skills & agents

dependabot-config

Reference for `.github/dependabot.yml` - GitHub-native dependency-update orchestrator. Required keys (`version: 2`, `updates[]` array) plus per-update fields (`package-ecosystem`, `directory` / `directories`, `schedule.interval`); common optional fields (`ignore`, `groups`, `allow`, `labels`, `milestone`, `open-pull-requests-limit`, `target-branch`, `vendor`, `versioning-strategy`, `assignees`, `commit-message`); auto-rebase + grouped-PR + security-only updates. Use when authoring or reviewing Dependabot configs in GitHub-hosted repos.

Install with skills.sh (any agent)

npx skills add testland/qa --skill dependabot-config
View source

dependabot-config

Overview

Per db-cfg (opens in new window), Dependabot opens PRs (or issues, for security-only updates) when a new version is available for a declared dependency, configured via .github/dependabot.yml at the repo root.

This is a reference skill - it defines the config surface; it doesn't run scans (that's snyk-test or osv-scanner). Dependabot complements SCA tools by automating the upgrade PR.

When to use

  • The repo is GitHub-hosted (Dependabot is GitHub-native).
  • Authoring a new .github/dependabot.yml.
  • Reviewing a .github/dependabot.yml PR for completeness + hygiene.
  • Migrating from manual update sweeps to automated orchestration.

For non-GitHub repos, see renovate-config.

Step 1 - Top-level structure

Per db-cfg (opens in new window):

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"

Required top-level keys:

KeyUse
versionAlways 2 (only supported version)
updatesArray of per-ecosystem update configurations

Step 2 - Per-update required fields

Per db-cfg (opens in new window):

FieldUse
package-ecosystemPackage manager: npm, bundler, cargo, composer, docker, github-actions, gitsubmodule, gomod, gradle, maven, mix, nuget, pip, pub, swift, terraform
directory (or directories)Manifest location relative to repo root
schedule.intervalFrequency: daily / weekly / monthly / quarterly / semiannually / yearly / cron (with cron expression)

directories (plural) supports an array for monorepos:

- package-ecosystem: "npm"
  directories:
    - "/services/api"
    - "/services/worker"
    - "/packages/shared"

Step 3 - Common optional fields

Per db-cfg (opens in new window):

ignore

"Ignore updates for dependencies with matching names, optionally using * to match zero or" more characters.

ignore:
  - dependency-name: "lodash"
    versions: [">=5.0.0"]    # don't update past v5
  - dependency-name: "*-internal-*"
    update-types: ["version-update:semver-major"]

groups

"Combines multiple dependency updates into single pull requests using pattern matching and dependency type filters."

groups:
  dev-deps:
    dependency-type: "development"
    update-types: ["minor", "patch"]
  production-deps:
    dependency-type: "production"
    exclude-patterns: ["express*", "fastify*"]

Grouped PRs reduce review noise - instead of 30 individual PRs for dev-deps, get one consolidated PR.

allow

"Restricts updates to explicitly listed dependencies only."

allow:
  - dependency-name: "react*"
  - dependency-type: "direct"

Use carefully - overly-narrow allow lists silently drop coverage of newly-added deps.

Other common fields

FieldUse
labelsCustom PR labels (overrides default dependencies)
milestoneNumeric milestone ID for created PRs
open-pull-requests-limitMax concurrent version PRs (default 5; security-only PRs not counted)
target-branchUpdate target branch (security PRs always go to default branch)
vendorMaintain vendored deps (Bundler, Go modules)
versioning-strategyauto / strict / increase-if-necessary / widen-ranges
assigneesGitHub usernames for assignment
commit-messageCustomize prefix + scope

Step 4 - Realistic multi-ecosystem example

One updates entry per ecosystem, each with its own schedule and labels (reuse the groups / ignore blocks from Step 3 as needed):

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
    open-pull-requests-limit: 10
    groups:
      dev-deps:
        dependency-type: "development"
    labels: ["dependencies", "javascript"]

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"

  - package-ecosystem: "docker"
    directory: "/Dockerfile"
    schedule:
      interval: "weekly"

Full config with per-ecosystem groups, ignore rules, assignees, and commit-message customization: references/dependabot-advanced.md.

Verify: after committing .github/dependabot.yml, open the repo's Dependabot view (Insights -> Dependency graph -> Dependabot) and confirm GitHub reports no dependabot.yml parse error and lists every configured package-ecosystem; if it flags a parse error, fix the reported key and re-push before relying on the config. Use the view's Check for updates control to force a run instead of waiting for the schedule.

Step 5 - Security updates (always-on)

Dependabot security updates are enabled separately in repo settings (Security → Code security and analysis → Dependabot security updates). Security PRs:

  • Always target the default branch (regardless of target-branch)
  • Don't count against open-pull-requests-limit
  • Trigger immediately on CVE disclosure (not on schedule)
  • Bypass ignore rules for the affected version (you can ignore the package generally, but Dependabot will still PR a security fix unless you explicitly ignore the CVE)

Step 6 - False-positive triage analogue

Dependabot doesn't produce findings to triage - it produces upgrade PRs. The "FP triage" analogue is suppressing unwanted update PRs:

MechanismUse
ignore.dependency-name + versions rangePin a dep to a major version (avoid breaking changes)
ignore.update-typesBlock all major-version PRs for a dep
Repo Settings → Security → Disable Dependabot for a specific packageCategorical disable (last resort)

Justification template (mandatory in dependabot.yml comments):

ignore:
  # Reason: react v19 + react-router v7 incompatibility blocks upgrade
  # Approved-by: alice@example.com
  # Re-review-date: 2026-09-15 (re-evaluate when react-router v8 ships)
  - dependency-name: "react"
    update-types: ["version-update:semver-major"]

Cadence: every quarter, audit ignore: entries; expired re-review dates removed.

Step 7 - Auto-merge integration

Dependabot creates PRs but doesn't auto-merge. For auto-merge, pair with GitHub Auto-merge or a workflow that reads dependabot/fetch-metadata and gates the merge to version-update:semver-patch only (after CI passes; patch-only is safer than minor / major). Full workflow: references/dependabot-advanced.md.

Anti-patterns

Anti-patternWhy it failsFix
interval: "daily" everywherePR storm overwhelms reviewersweekly for non-critical; daily only for security-sensitive deps
No groups: for dev depsEach dev-dep update is a separate PRGroup by dependency-type (Step 3)
ignore without expiration commentPermanent debtMandatory Re-review-date: (Step 6)
Skip security-only updates feature (or disable in Settings)Critical CVEs reach prodKeep enabled; never disable wholesale
Auto-merge minor/major automaticallyBreaking changes ship without reviewAuto-merge patch only (Step 7)

Limitations

  • GitHub-only - for GitLab / Bitbucket / non-GitHub, use renovate-config.
  • No support for non-language manifests (Helm Chart.yaml, pre-commit hook updates, etc.) without workarounds.
  • Grouped PRs introduce coupling - one breaking change blocks the whole group.
  • Per-CVE waivers (vs per-version-range) are not first-class; the ignore mechanism is dependency-centric.

References

  • db-cfg (opens in new window) - official configuration reference
  • references/dependabot-advanced.md - full multi-ecosystem config example + patch-only auto-merge workflow
  • docs.github.com/en/code-security/dependabot - full Dependabot docs
  • docs.github.com/en/code-security/dependabot/dependabot-security-updates - security updates feature
  • github.com/dependabot/fetch-metadata - auto-merge helper
  • snyk-test, osv-scanner, renovate-config, npm-pip-maven-audit - sister tools

Dependabot advanced config

View source (opens in new window)

Dependabot advanced config

Deep-dive material moved out of the SKILL.md spine: the full multi-ecosystem .github/dependabot.yml, and the patch-only auto-merge workflow. All keys are documented in the official configuration reference (docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file).

Full multi-ecosystem example

Every field here is optional except package-ecosystem, directory, and schedule.interval (see SKILL.md Step 2). This expands the consolidated Step 4 example with per-ecosystem groups, ignore, assignees, and commit-message customization.

version: 2
updates:
  # Application dependencies
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "06:00"
      timezone: "UTC"
    open-pull-requests-limit: 10
    groups:
      dev-deps:
        dependency-type: "development"
        update-types: ["minor", "patch"]
      production-minor-patch:
        dependency-type: "production"
        update-types: ["minor", "patch"]
    ignore:
      - dependency-name: "react"
        update-types: ["version-update:semver-major"]
    labels: ["dependencies", "javascript"]
    assignees: ["alice"]
    commit-message:
      prefix: "deps"
      include: "scope"

  # CI workflow updates
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"
    groups:
      gha:
        patterns: ["*"]
    labels: ["dependencies", "ci"]

  # Docker base image updates
  - package-ecosystem: "docker"
    directory: "/Dockerfile"
    schedule:
      interval: "weekly"
    labels: ["dependencies", "docker"]

Patch-only auto-merge workflow

Dependabot creates PRs but doesn't auto-merge. Pair it with a workflow that reads update metadata via dependabot/fetch-metadata and enables auto-merge only for version-update:semver-patch (auto-merge still waits for required CI to pass). Patch-only is safer than minor / major.

# .github/workflows/dependabot-automerge.yml
name: Dependabot auto-merge
on: pull_request

permissions:
  pull-requests: write
  contents: write

jobs:
  dependabot:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - uses: dependabot/fetch-metadata@v2
        id: meta
      - if: steps.meta.outputs.update-type == 'version-update:semver-patch'
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Related skills

bundle-audit-ruby

Use when a Ruby project has a Gemfile.lock and needs CVE/GHSA scanning or a CI SCA gate. Installs and runs bundler-audit against a Ruby Gemfile.lock, updating the ruby-advisory-db corpus, scanning for vulnerable gem versions and insecure sources, suppressing false positives via .bundler-audit.yml, and gating CI on non-zero exit. Ruby-only SCA scanner: for other ecosystems use npm-pip-maven-audit (multi-ecosystem dispatcher), snyk-test, or osv-scanner; cargo-audit-rust is the Rust analog; once findings exist, reachability-analyzer downranks unreachable gems - not this.

cargo-audit-rust

Configures and runs cargo-audit against the RustSec Advisory Database for Rust projects; covers `cargo audit` (vulnerability scan), `cargo audit fix` (automated dependency updates), `--deny unmaintained|unsound|yanked|warnings` exit-code control, `audit.toml` per-advisory suppression with mandatory `expires` + `reason`, SARIF output for GitHub Code Scanning upload, and `rustsec/audit-check` GitHub Actions integration. Use when the codebase has a Cargo.lock and needs Rust-specific SCA beyond what the multi-ecosystem npm-pip-maven-audit wrapper provides.

cve-exploitability-triage

Ranks known CVE findings by real-world exploitability instead of severity alone: enriches each CVE with its EPSS probability (the chance exploitation activity is observed in the next 30 days) and CISA KEV membership (confirmed exploited in the wild), applies OpenVEX status assertions to set aside vulnerabilities the product is not affected by, applies a reachability heuristic for vulnerable code that is never called, and assigns every finding to one of four buckets (Fix-Now, Fix-This-Sprint, Fix-Backlog, Accept-Risk) using documented EPSS thresholds. Treats a CISA KEV listing as non-waivable under any justification. Use when a dependency, container image, or SBOM vulnerability scan has produced more CVEs than the team can fix in the available window and someone has to decide which ones get fixed first and which can wait.

npm-pip-maven-audit

Configures and runs native package-manager audit commands across ecosystems - `npm audit --audit-level=high` (npm), `yarn npm audit` (Yarn 2+), `pnpm audit` (pnpm), `pip-audit` (Python via PyPA), `mvn dependency:check` (Maven via OWASP Dependency-Check plugin), `cargo audit` (Rust), `bundle audit` (Ruby Bundler); fastest no-install-required SCA option. Use when the team wants fast, no-extra-tooling SCA in CI as a first line of defense, or pairs with snyk/osv-scanner for layered coverage.

osv-scanner

Configures and runs Google OSV-Scanner - open-source SCA against the OSV.dev vulnerability database; supports `osv-scanner scan -r ./` recursive scan + per-lockfile scan via `-L package-lock.json`; SBOM input (CycloneDX / SPDX) for non-standard package managers; `--format json|sarif|markdown|vertical|html` output; suppressions via `osv-scanner.toml` config. Use when the team needs OSS-native SCA without commercial-license overhead, or wants a second-opinion DB pair with Snyk's commercial DB.

reachability-analyzer

Runs dead-dependency analysis across JS, Python, and Rust projects using ecosystem-native static tools (`depcheck`/`knip` for JS, `vulture` for Python, `cargo-machete` for Rust), then cross-references the unused-dependency list against SCA findings to downrank vulns in code that is never loaded. Use when SCA output (from `osv-scanner`, `snyk-test`, or `npm-pip-maven-audit`) is too noisy to triage and the team needs to separate unreachable CVEs from exploitable ones before sprint planning; sibling cve-exploitability-triage ranks by EPSS/KEV exploitation signal, not code reachability.

renovate-config

Reference for `renovate.json` - Mend Renovate dependency-update orchestrator (multi-platform: GitHub / GitLab / Bitbucket / Azure DevOps / Gitea); top-level keys (`extends` for preset references, `schedule`, `prConcurrentLimit`, `vulnerabilityAlerts`); `packageRules[]` array with `matchPackageNames` / `matchUpdateTypes` / `automerge` matching; `ignoreDeps`, `addLabels`, `automergeSchedule`. Use when authoring or reviewing Renovate configs in any repo platform Renovate supports.

snyk-test

Configures and runs Snyk, a commercial multi-mode scanner: snyk test for SCA (dependency scanning), snyk code test for SAST (code security scanning), snyk container test for container images, snyk iac test for IaC (infrastructure-as-code), snyk monitor for continuous new-vuln alerts; policy file .snyk for ignore + patch. Use when the team has a Snyk license and needs SCA (dependency scanning) or continuous vuln monitoring; for open-source scanning without a Snyk license, prefer osv-scanner.