Agent skill

Add Egress Allowlist Domain

by dependabot in dependabot/proxy

Triage a host that was blocked by the Dependabot proxy egress allowlist, add it to internal/handlers/egressallowlistdefaults.yaml with the correct matching form and regression tests, and open a pull…

MITAuto-check passedDevelopment

Install Add Egress Allowlist Domain

skills CLI
$ npx skills add dependabot/proxy --skill add-egress-allowlist-domain -a claude-code

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

GitHub CLI
$ gh skill install dependabot/proxy add-egress-allowlist-domain --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/dependabot/proxy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/add-egress-allowlist-domain .claude/skills/add-egress-allowlist-domain && 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
add-egress-allowlist-domain
GitHub stars
137
Token cost
~3.6k tokens
SKILL.md length
1,688 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Triage a host that was blocked by the Dependabot proxy egress allowlist, add it to internal/handlers/egressallowlistdefaults.yaml with the correct matching form and regression tests, and open a pull…

  • Works in 7 steps: Triage: does this host belong in the… → Confirm the host is safe to probe, and… → Choose the matching form → …
  • Someone reports a blocked domain
  • SKILL.md covers Step 1 — Triage: does this…, Step 2 — Confirm the host is…, Step 3 — Choose the matching… and Step 4 — Place the entry, plus 4 more sections
  • Calls curl, go and git; reaches cloudsmith.com

What it does

Add Egress Allowlist Domain is an agent skill from dependabot/proxy. Triage a host that was blocked by the Dependabot proxy egress allowlist, add it to internal/handlers/egressallowlistdefaults.yaml with the correct matching form and regression tests, and open a pull request. Use when someone reports a blocked domain, asks to allowlist a host, or pastes an egress 403 from a Dependabot update job.

Its SKILL.md is about 3.6k 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 Dependency management and Pull requests. The repository describes itself as: Dependabot's HTTP proxy to authenticate requests to package registries, git servers, and the GitHub API. The licence is MIT.

When your agent uses it

  • Someone reports a blocked domain
  • Asks to allowlist a host
  • Pastes an egress 403 from a Dependabot update job

Example prompts

  • “/add-egress-allowlist-domain”

Requirements

  • Docker

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Triage: does this host belong in the static allowlist?
  2. Confirm the host is safe to probe, and gather ownership evidence
  3. Choose the matching form
  4. Place the entry
  5. Add regression tests
  6. Build, test, format
  7. Open the pull request

What it can do on your machine

Read from SKILL.md and the folder at commit 20763b1. 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:

    • curl
    • go
    • git
    • openssl
    • gh

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

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • cloudsmith.com

    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

Add Egress Allowlist Domain loads about 3.6k tokens when it runs. Until then it costs about 90 tokens; SKILL.md has 1,688 words of instructions outside code blocks.

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

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 dependabot/proxy at commit 20763b1, republished under its MIT licence (© dependabot). 1,688 words, ~3,609 tokens.

Download SKILL.mdSave it as .claude/skills/add-egress-allowlist-domain/SKILL.md (or your agent's skills folder).
name
add-egress-allowlist-domain
description
Triage a host that was blocked by the Dependabot proxy egress allowlist, add it to internal/handlers/egress_allowlist_defaults.yaml with the correct matching form and regression tests, and open a pull request. Use when someone reports a blocked domain, asks to allowlist a host, or pastes an egress 403 from a Dependabot update job.
user-invocable
true

Add a domain to the egress allowlist

Use this skill when someone says something like "repo.example.org is blocked", "please allowlist foo.bar.com", or pastes a Dependabot job log showing an egress block.

Do not skip to editing YAML. Most of this skill's value is step 1: a large fraction of reported hosts must not go into the static defaults at all. Adding them there is a security regression, not a fix.

Step 1 — Triage: does this host belong in the static allowlist?

The static defaults are applied as a union to every Dependabot job in the world. Anything added here is reachable by every tenant. Classify the host before touching anything.

Ask the requester for the host, the package ecosystem, and — if they have it — the job log line or what the host serves.

CategoryExamplesAction
Public, provider-controlled package infrastructurepublic registry, mirror, CDN, checksum/CRL endpoint, public VCS forgeAdd to the YAML. Continue to step 2.
Private, internal, or org-specific registryartifacts.acme-corp.internal, acme.jfrog.io, a self-hosted Nexus/ArtifactoryDo not add. Tell the user to declare it under registries: in their dependabot.yml. Those hosts are allowlisted per-job automatically by internal/handlers/egress_dynamic_hosts.go. Stop here.
Shared multi-tenant host where the tenant is in the URL pathdl.cloudsmith.io, generic object-store download hostsDo not add to the static sections. The handler authorizes the hostname only — it never constrains path or method — so allowing the host grants every tenant's content to every job. If the host is the download target a configured registry redirects to, add it under registry_redirect_derivations: instead, where it is allowed only for jobs holding that registry's credential. Otherwise explain this and stop.
User-uploadable file hostingdownloads.sourceforge.net, arbitrary release-file mirrorsDo not add without explicit maintainer sign-off. Flag it and ask.
Documentation, changelog, or homepage hostproject docs sites, blog domainsUsually don't add. These fail gracefully — dependabot-core's metadata finder treats a non-200 as "no metadata", so the only loss is a missing changelog link in the PR body. Say so and ask whether it's worth it.

If the host is private or multi-tenant, the correct outcome of this skill is a clear explanation and no code change. That is a success, not a failure.

This step is the gate. Only a host you have classified as public, provider-controlled infrastructure proceeds to step 2. Step 2 does not revisit this decision — it cannot (see the warning there) — so a misclassification here is never caught later.

Signals that a host is a private or tenant-specific registry

These are not proof, but each should send you back to the table above:

  • A wildcard certificate whose parent domain is a known multi-tenant provider — CN=*.jfrog.io, CN=*.cloudsmith.io, CN=*.fury.io, CN=*.myget.org. This shows the provider owns the domain; it says nothing about the tenant being public. Note the inverse is not a signal: *.julialang.org and *.huaweicloud.com are wildcards on genuinely public infrastructure, so judge the parent domain, not the wildcard.
  • A redirect to a registry vendor's marketing site — package-manager.aa.com and dl.cloudsmith.io both 302 to https://cloudsmith.com/. A private tenant fronted by a hosted registry commonly advertises its backing vendor this way.
  • An organisation name in the host that matches the requester rather than an ecosystem (artifactory.<company>.com, npm.<company>.com, <company>.jfrog.io).
  • A credentialed response — 401/403 on a real artifact path means the host expects authentication, which is what registries: is for.

Step 2 — Confirm the host is safe to probe, and gather ownership evidence

A passing verify_host does NOT authorise an addition. It answers "is it safe for me to send a request here?" — not "is this host public infrastructure?". Most private registries pass it: package-manager.aa.com, dl.cloudsmith.io and centraluhg.jfrog.io all resolve to public IPs and serve valid certificates. A private registry that is properly internet-facing is indistinguishable from public infrastructure at this layer. Step 1 is what decides; this step only keeps the probe itself safe and collects evidence for the PR.

Never add a host on the strength of a report alone.

A reported hostname is untrusted input. Validate it as a bare DNS hostname before it reaches any command, require every resolved address to be public, and walk redirects one hop at a time — curl -L will happily follow a public host to loopback, RFC1918, link-local, or metadata endpoints.

bash
verify_host() {
  local host="$1" ip ips
  # Reject anything that is not a bare DNS hostname, before it reaches a command.
  if ! printf '%s' "$host" | grep -qE '^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$'; then
    echo "REJECT: not a bare DNS hostname"; return 1
  fi
  # Every resolved address must be public.
  ips=$(dig +short "$host" A; dig +short "$host" AAAA)
  ips=$(printf '%s\n' "$ips" | grep -E '^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9a-fA-F:]+)$')
  [ -z "$ips" ] && { echo "REJECT: does not resolve"; return 1; }
  for ip in $ips; do
    case "$ip" in
      10.*|127.*|0.*|169.254.*|192.168.*|::1|fc*|fd*|fe80*) echo "REJECT: non-public $ip"; return 1;;
      172.1[6-9].*|172.2[0-9].*|172.3[01].*) echo "REJECT: non-public $ip"; return 1;;
      100.6[4-9].*|100.[7-9][0-9].*|100.1[01][0-9].*|100.12[0-7].*) echo "REJECT: CGNAT $ip"; return 1;;
    esac
  done
  echo "OK: $host -> $(printf '%s' "$ips" | tr '\n' ' ')"
  # One hop at a time. Re-run verify_host on any next_hop before following it.
  curl -sS -o /dev/null --max-time 15 --proto '=https' --max-redirs 0 \
       -w '    status=%{http_code} next_hop=%{redirect_url}\n' "https://$host/<real/artifact/path>" || true
  # Ownership evidence, not just reachability.
  echo | openssl s_client -connect "$host:443" -servername "$host" 2>/dev/null \
    | openssl x509 -noout -subject -issuer 2>/dev/null | sed 's/^/    /'
}

verify_host '<host>'

Reachability alone is not sufficient evidence — it proves the host answers, not that the claimed provider controls it, and certainly not that it is public. Require authoritative corroboration: a TLS certificate whose subject/issuer belongs to the provider, an entry in a provider-published list such as api.github.com/meta, or the provider's own documentation. Check the certificate against the private-registry signals in step 1 before treating it as supporting evidence. A host that merely responds is not yet a candidate.

Probe a real artifact path, not /. Root probes mislead: data.nuget.org/ 404s and packages.atlassian.com/ 401s, while both serve packages correctly on their real paths.

If it redirects, re-run verify_host on the target before following it — the redirect target may be the host that actually needs allowlisting, and it is often a different one.

Step 3 — Choose the matching form

Read the comment block at the top of internal/handlers/egress_allowlist_defaults.yaml before choosing. Three forms exist:

  • Exact (storage.googleapis.com) — matches only that host. This is the default. Prefer it.
  • Leading dot (.github.com) — matches the domain and all subdomains.
  • Glob (*, ?, [...], via path.Match; * spans dots). Values starting with * or [ must be quoted or YAML misreads them as an alias or flow sequence.

The rule for the non-exact forms: every label the pattern matches must be entirely provider-controlled and never user-creatable. If any matched label is attacker-choosable — a storage-account name, a bucket, an AWS account id, a user's pages subdomain — the form is unsafe, including infix globs. When in doubt, use the exact form.

Show full SKILL.md (758 more words)Show less

Step 4 — Place the entry

First, confirm it isn't already allowed:

bash
grep -n '<host>' internal/handlers/egress_allowlist_defaults.yaml
go test ./internal/handlers/ -run TestEgressDefaults_NoRedundantEntries -count=1

grep catches an exact repeat. It does not catch a host already covered by a leading-dot or glob entry — foo.github.com is redundant because .github.com exists — so also scan the file's leading-dot and * entries for one that would match. If the host is already allowed, the correct outcome is no code change; report where it is covered and stop.

Then choose the section:

  • github_infra_domains — GitHub/Dependabot infrastructure only. Don't add third-party hosts here.
  • shared_registry_domains — hosts genuinely used by more than one ecosystem.
  • ecosystem_default_domains.<ecosystem> — the normal case.
  • registry_redirect_derivations — not a static section: the host is allowed only for jobs whose credentials name the matching registry. Use it when a configured registry redirects downloads to a provider-owned storage host that step 1 ruled out of the static sections. Entries are credential_host (exact, or leading dot for any subdomain) plus derived (exact hosts only; globs are rejected at startup).

Add the host to exactly one section. Every static section is applied to every job, so listing it twice is redundant, not safer.

Keep entries in the existing grouping and ordering of that section, and add a brief comment saying what the host serves when it isn't self-evident.

Watch the YAML anchors. Several ecosystems are aliases and must not be edited separately:

  • npm_and_yarn: &npm_registries → bun: *npm_registries
  • pip: &python_registries → uv: *python_registries
  • maven: &jvm_registries → gradle: *jvm_registries
  • docker: &docker_registries → docker_compose, devcontainers

If the target is an alias member (e.g. bun), add the entry to the anchor definition instead. TestEgressDefaults_AliasedEcosystemsStayInSync enforces this.

Step 5 — Add regression tests

Edit internal/handlers/egress_allowlist_test.go. Both are required.

  1. Positive probe — a realistic URL for the new host, added to the appropriate existing test (e.g. TestEgressAllowlist_NewExactDomainsAllowed or TestEgressAllowlist_PublicRegistriesAllowed):

    go
    assert.Nil(t, egressResult(t, h, "https://<host>/<realistic/path>"), "new exact host allowed: <host>")
  2. Negative child probe — for every exact entry added, append https://evil.<host>/payload to childProbes in TestEgressAllowlist_NewEntriesDoNotWidenBeyondExactHosts.

    This matters: a sibling probe (attacker.example.com against entry foo.example.com) does not catch someone later widening the entry to a leading dot. Only a child probe does. Add a sibling probe as well when you also want to pin the parent namespace closed.

Verify the negative probe actually bites by mutating your new entry to its leading-dot form and confirming the test fails, then revert.

Step 6 — Build, test, format

bash
go build ./... && go test ./internal/handlers/ -run TestEgress -count=1 && gofmt -l internal/handlers/

gofmt -l must print nothing. Then run the full suite as CONTRIBUTING.md requires:

bash
script/test    # Docker, -race -count=2

If script/test can't run in the current environment, say so explicitly and leave the "complete test suite" checklist box in the PR unticked. Do not tick a box you did not verify.

Step 7 — Open the pull request

Confirm with the user before pushing. Then:

bash
git checkout -b <user>/allowlist-<short-host-slug>
git add internal/handlers/egress_allowlist_defaults.yaml internal/handlers/egress_allowlist_test.go
git commit
gh pr create --template .github/pull_request_template.md

--template opens the repository template for completion. Do not use --fill: it takes the title and body from commit data and skips template selection entirely, producing a PR that omits the required sections.

If you lack write access to dependabot/proxy, push to a fork and use gh pr create --repo dependabot/proxy --template .github/pull_request_template.md.

Complete every section of the template. The description should state what the host serves, which ecosystem needs it, the authoritative evidence that it is public provider-controlled infrastructure, and why the chosen matching form is safe. Only tick checklist boxes you actually verified.

Guardrails

  • Never add a host you could not reach in step 2, or for which you have no authoritative provider evidence. Reachability alone is not evidence of ownership.
  • Never treat a passing verify_host as permission to add a host. It checks probe safety, not whether the host is public — private registries pass it routinely. Step 1 is the gate.
  • Never interpolate a reported hostname into a command before validating it as a bare DNS hostname, and never follow redirects with curl -L during verification — validate each hop's address is public first.
  • Never add a private, internal, or customer-tenant host to the static defaults — route it to registries: in dependabot.yml.
  • Never widen an existing exact entry to a leading-dot or glob form as a shortcut for a subdomain report. Add the specific subdomain.
  • Never add a host that is already allowed. Before editing, check for an exact repeat and for an existing leading-dot or glob entry that already covers it — a redundant entry changes nothing, implies the namespace is not already open, and makes deleting one copy look sufficient when it is not. TestEgressDefaults_NoRedundantEntries enforces this; run it before opening a PR.
  • Never commit unrelated changes, and never commit scratch or triage files to the repo root.
  • Treat a reported hostname as untrusted input: quote it in shell variables rather than interpolating it into the middle of a command.

© dependabot, MIT. 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 .github/skills/add-egress-allowlist-domain of dependabot/proxy.

Open the folder on GitHubat commit 20763b1

Compare with similar skills

Add Egress Allowlist Domain 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.

Add Egress Allowlist Domain compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Egress Allowlist Domain this skilldependabot/proxy137—~3.6kAutomated safety check: PassMIT
Renovate Actions PR Reviewbacknotprop/plannotator9.3k—~640Automated safety check: PassApache-2.0
Bump CLI Compatibility Manifestdatabricks/cli404—~1.3kAutomated safety check: NotesCustom licence
Dependabot PR Reviewkernitus/BukkitOldCombatMechanics225—~882Automated safety check: PassMPL-2.0
Apply Renovate PRssivaprasadreddy/sivalabs-agent-skills188—~3kAutomated safety check: PassMIT
Oldest PR Mergeitgalaxy/webfont310—~2.8kAutomated safety check: NotesMIT

Similar skills

  • Renovate Actions PR Review

    backnotprop/plannotator

    Reviews Renovate pull requests that bump GitHub Actions by checking pinned SHAs against upstream tags, scanning changelogs and confirming workflows stay compatible.

    9.3k GitHub stars~640 tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Updates the Databricks CLI's cli-compat.json with new AppKit and Agent Skills versions and opens a pull request for the change.

    404 GitHub stars~1.3k tokensUpdated yesterday
    DevelopmentAuto-check: notes
  • Dependabot PR Review

    kernitus/BukkitOldCombatMechanics

    A skill your agent uses for Dependabot PRs, dependency bumps, Gradle or Maven dependency updates, GitHub Actions updates, dependency changelog/licence/release-note review, JVM/classfile checks, and…

    225 GitHub stars~882 tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • Apply Renovate PRs

    sivaprasadreddy/sivalabs-agent-skills

    Apply the changes from all open Renovate bot pull requests of a GitHub repository into the local working tree.

    188 GitHub stars~3k tokensUpdated 6 days ago
    DevelopmentAuto-check passed
  • Oldest PR Merge

    itgalaxy/webfont

    Process the oldest open pull request end-to-end: analyze the diff, add missing tests on that PR branch, resolve review comments (including Copilot) in a loop, fix test regressions, update…

    310 GitHub stars~2.8k tokensUpdated 5 days ago
    DevelopmentAuto-check: notes
  • Dependabot Merge

    caarlos0/dotfiles

    Review and merge open dependency pull requests from Dependabot, Renovate and similar bots across the goreleaser organization and the caarlos0 user.

    220 GitHub stars~5k tokensUpdated 2 days ago
    DevelopmentAuto-check passed

Categories

Questions about Add Egress Allowlist Domain

What does Add Egress Allowlist Domain do?

Triage a host that was blocked by the Dependabot proxy egress allowlist, add it to internal/handlers/egressallowlistdefaults.yaml with the correct matching form and regression tests, and open a pull…. Add Egress Allowlist Domain is an agent skill from dependabot/proxy.yaml with the correct matching form and regression tests, and open a pull request.

When should I use Add Egress Allowlist Domain?

Add Egress Allowlist Domain fits situations like: someone reports a blocked domain; asks to allowlist a host; pastes an egress 403 from a Dependabot update job.

How do I install Add Egress Allowlist Domain in Claude Code?

Run `npx skills add dependabot/proxy --skill add-egress-allowlist-domain -a claude-code`. Or copy the skill folder (.github/skills/add-egress-allowlist-domain in dependabot/proxy) into .claude/skills/add-egress-allowlist-domain in your project. Claude Code loads it when a task matches its description.

How do I install Add Egress Allowlist Domain in Codex?

Run `npx skills add dependabot/proxy --skill add-egress-allowlist-domain -a codex`. Or copy the skill folder (.github/skills/add-egress-allowlist-domain in dependabot/proxy) into .agents/skills/add-egress-allowlist-domain in your project. Codex loads it when a task matches its description.

Can I use Add Egress Allowlist Domain 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 dependabot/proxy --skill add-egress-allowlist-domain -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-egress-allowlist-domain, .gemini/skills/add-egress-allowlist-domain, .github/skills/add-egress-allowlist-domain and .opencode/skills/add-egress-allowlist-domain in your project.

What does Add Egress Allowlist Domain need to run?

Going by SKILL.md and its folder, Add Egress Allowlist Domain needs the command-line tools its instructions call (curl, go, git, openssl and gh). Our summary lists: Docker.

Does Add Egress Allowlist Domain access the network?

SKILL.md names 1 domain. In commands or code: cloudsmith.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Add Egress Allowlist Domain 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 Add Egress Allowlist Domain use?

Add Egress Allowlist Domain is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Add Egress Allowlist Domain use?

About 3.6k tokens (SKILL.md is roughly 14k 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 Add Egress Allowlist Domain?

Skills that share tags, products or a category with Add Egress Allowlist Domain: Renovate Actions PR Review (backnotprop/plannotator, 9.3k stars), Bump CLI Compatibility Manifest (databricks/cli, 404 stars), Dependabot PR Review (kernitus/BukkitOldCombatMechanics, 225 stars) and Apply Renovate PRs (sivaprasadreddy/sivalabs-agent-skills, 188 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Add Egress Allowlist Domain?

dependabot (a GitHub organization) maintains it in dependabot/proxy, which has 137 GitHub stars. The repository was last updated on October 7, 2026.

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