DevelopmentFramework14 min readPublished August 10, 2026

One install command · 75+ agent targets · zero documented integrity checks

Agent Skills Just Became a Package Ecosystem

Vercel’s skill packs bundle agent skills from folders, zips and public or private GitHub repositories behind one unlisted URL, one install command and one update command. That is a package manager in everything but name — and the announcement documents no versioning scheme, no checksum, no signature and no provenance attestation. Nothing here has been compromised. This is the argument for hardening it before something is.

DA
Digital Applied Team
Senior strategists · Published Aug 10, 2026
PublishedAug 10, 2026
Read time14 min
SourcesVendor changelogs + CLI README
Agent runtimes targeted
75+
at the time of writing
Documented pack integrity checks
0
no checksum, signature or provenance
Direct-download cap
10MiB
extracted content capped at 25 MiB
Claude Code archive source
SHA-256
optional pinning, shipped 2.1.224

Vercel’s skill packs let you bundle agent skills from local folders, zips, and public or private GitHub repositories into a single unlisted URL, install them with one command, and refresh them with another. Strip the branding and that is the shape of a package manager: a distribution surface, an install command, an update command. Package managers acquire supply-chain problems. Nothing here has been compromised — this is an argument for borrowing the hardening now, before the ecosystem has to learn it expensively.

The feature landed on August 7, 2026 in Vercel’s changelog, and it is a genuinely useful piece of plumbing. Teams have been passing around skill directories by hand for months; a pack turns a standardised set into a link you can send to one person or to a whole engineering org. The problem is not the feature. The problem is that the announcement, read end to end, contains no versioning scheme, no checksum, no signature verification and no provenance attestation — the exact set of controls the JavaScript ecosystem spent years bolting on after it needed them.

This piece covers what a skill pack actually is, why the distribution shape matters more than the file format, what verifies a pack today, how far a single compromised source could fan out given how the CLI is designed to be used, what npm’s own hardening history suggests about sequencing, and the concrete mitigations available right now — including the one Anthropic already ships two products away.

Key takeaways
  1. 01
    Skill packs are a distribution layer, not a file format.A pack bundles skills from community sources, local folders and zips, or public and private GitHub repositories into one unlisted URL with its own install command and an update command attached. That combination is what makes it an ecosystem rather than a convention.
  2. 02
    The announcement documents no integrity controls at all.Read the changelog end to end and there is no versioning scheme, no checksum, no signature verification and no provenance attestation. That is an observation about the primary source, not an inference — and it is the spine of the risk argument here.
  3. 03
    Skills are instructions, not executables — the analogy is distributional.A SKILL.md file is markdown read by an agent, not a postinstall script. But skills ship alongside auxiliary scripts and reference files, and an agent with tool and shell access does what a skill tells it to. The risk arrives through the agent, not through the parser.
  4. 04
    The fan-out is the part that scales the blast radius.The CLI lists 75-plus agent runtimes at the time of writing, offers a wildcard target flag, defaults to symlinking one canonical copy into every surface, and ships an explicitly CI-friendly non-interactive mode. Convenience and blast radius are the same feature here.
  5. 05
    The mitigation shape already exists — it just is not here.Claude Code 2.1.224 added an archive plugin source that installs from a zip over HTTPS with optional SHA-256 pinning. Optional pinning is a weaker control than mandatory pinning, but it is infinitely stronger than no pinning option at all.

01What ShippedA pack is a bundle, a link, and an update command.

Vercel published skill packs on its changelog on August 7, 2026. The mechanics are short enough to state completely. You build a pack from community skills, your own local folders and zips, or public and private GitHub repositories. Every pack is unlisted and gets its own URL. You share that link with one person or a whole team. The recipient installs it with npx skills add pointed at the pack URL, and refreshes it later with npx skills update. Packs are built and browsed at skills.sh.

Underneath sits the npx skills CLI — the MIT-licensed vercel-labs/skills project — which does the resolving and installing. A skill in this world is a plain directory containing a SKILL.md file with YAML frontmatter carrying a required name and description. The CLI discovers those directories in standardised locations and walks catalogues up to three levels deep. If you have ever built one by hand, our walkthrough of building a skill from scratch covers what actually goes into the file and how to review it before it is shared.

Source 01
Local folders and zips
skills add <local path>

Build a pack directly from directories on your own machine, or from a zip. Whatever review happened before the folder existed is the only review there is.

You own the provenance
Source 02
Public GitHub repos
owner/repo · full URL · path inside a repo

GitHub shorthand, a full GitHub URL, a direct path to a single skill inside a repository, a GitLab URL, or any git URL including SSH. The most convenient path is also the least controlled one.

Convenience default
Source 03
Private GitHub repos
existing git credentials

Private installs reuse your credential helper, then the GitHub CLI, then SSH. The README is explicit that the tool does not execute gh auth token or copy the stored GitHub CLI credential into the Node.js process.

Access control, not integrity
Source 04
Direct download URL
.zip · .tar · .tar.gz · .tgz · bare SKILL.md

A URL may point at a single valid SKILL.md or at an archive, and the URL does not need to include a file extension. Downloads are capped at 10 MiB, extracted content at 25 MiB, archives at 1,000 files by default.

Caps bound size, not intent

Those three default limits are worth reading as what they are. A 10 MiB download that may expand to 25 MiB is a two-and-a-half-times expansion allowance — a zip-bomb guard and a disk-exhaustion guard, both sensible. They are resource limits. None of them inspects a single byte of what arrives, and all three are overridable by environment variable, which the README frames as something you do when you trust the source. Trust, in that sentence, is doing all the work.

02The ShapeWhy the distribution model matters more than the file format.

Here is the distinction that keeps this argument honest. A SKILL.md file is markdown. It is instruction text an agent reads. It is not a postinstall script, it does not execute on install, and anyone claiming skill packs and npm packages are technically identical is overreaching in a way a technical reader will catch immediately.

The analogy is structural, not mechanical. What makes something a package ecosystem is not that its artefacts execute — it is that artefacts get authored by one party, distributed through a shared channel, installed by a second party who did not write them, and then updated in place by a command that fetches whatever the upstream has become since. Skill packs now have every one of those properties. The install command exists. The update command exists. The sharing surface exists and is deliberately frictionless. That is the ecosystem, and it arrived complete.

The reason the markdown-versus-code distinction does not rescue you is that agents have tools. Skills ship auxiliary scripts and reference files alongside the markdown, and an agent with shell access does what a skill instructs it to do. The execution boundary has not disappeared; it has moved from the package manager into the agent runtime, which is a place with far less mature tooling around it. That is also why the server-allowlisting and least-privilege guidance we wrote for MCP transfers almost unchanged to skill sources: in both cases you are deciding whose instructions your agent is permitted to obey.

"Build a pack from community skills, your own local folders and zips, or public and private GitHub repositories."— Vercel changelog, skill packs announcement, August 7, 2026

Read that sentence as a distribution statement rather than a feature statement and the shape is unmistakable. Four heterogeneous source types across the CLI, normalised into one installable unit, addressed by one URL. Every package manager that has ever mattered started with exactly that sentence.

03The GapWhat verifies a pack before it lands: nothing documented.

This is the observation the rest of the post rests on, so it is worth being precise about what is being claimed. The changelog post announcing skill packs makes no mention of a versioning scheme, signature verification, checksums or provenance attestation anywhere in its body. Searching the CLI README for the same terms returns nothing relevant either. That is a statement about the primary sources — an absence directly observed — not a claim that such controls are impossible, unplanned, or being withheld.

It is also not a claim of negligence. Vendors ship distribution before they ship verification all the time, because distribution is what users ask for and verification is what they ask for later. No source states why signing or provenance was not part of the initial release, and speculating about a roadmap would be inventing evidence the research does not contain. What can be said is narrower and more useful: as documented today, a skill pack is installed on the basis of the URL you were given and nothing else.

Read the absence carefully
The only documented control in the CLI that touches trust at all is a telemetry boundary — GitHub repository and skill identifiers are sent only for repositories that GitHub positively confirms are public, and telemetry is disableable via DISABLE_TELEMETRY=1 or DO_NOT_TRACK=1. That is a privacy control, and a good one. It is not a supply-chain control, and it should not be read as one.
Download cap
Per direct-download install
10MiB

The default ceiling on what the CLI will fetch from a direct URL. Overridable via SKILLS_DOWNLOAD_MAX_BYTES, which the README frames as something you raise when you trust the source.

Resource limit
Extraction cap
Extracted archive content
25MiB

Two and a half times the download ceiling — a sensible expansion allowance against zip bombs. It constrains how much lands on disk, not what that content instructs an agent to do.

Resource limit
Integrity checks
Documented for packs
0

No checksum, no signature verification, no provenance attestation and no lockfile appears in the changelog or the CLI README for packs, individual skills, or updates. Verified by direct text search of both primary sources.

The actual gap

One further honest gap: whether skills.sh performs any server-side scanning or vetting of submitted packs before listing or sharing them is not stated on any page we fetched. We are not going to assume it does, and we are not going to assume it does not. It is undocumented, which is itself a useful thing for a platform team to know when writing policy — you cannot cite a control you cannot point at.

04Blast RadiusThe fan-out is the feature — and the exposure.

Three design decisions in the CLI are individually reasonable and collectively define how far a bad source could travel. First, breadth: the tool targets 75-plus distinct agent runtimes at the time of writing, each with its own project-level and global skill-directory convention — Claude Code reads .claude/skills/ and ~/.claude/skills/, Codex reads .agents/skills/ and ~/.codex/skills/, Cursor reads .agents/skills/ and ~/.cursor/skills/, and so on down a long table. Those are trusted-instruction directories. A wildcard agent target writes into many of them in one command.

Second, linkage: the interactive installer offers Symlink as the default and recommended method, with Copy as the alternative. Symlink creates a canonical copy that every target agent links to, which is elegant — one source of truth, one place to update. It also means a single compromised source propagates to every agent surface it is linked into the moment someone runs an update.

Third, automation: skills add ships a non-interactive mode via --all or -y, explicitly marketed as CI/CD friendly. A pack can be pulled into an automated pipeline with no human review step, by design. That is not a flaw — it is what CI requires. It does mean the human checkpoint has to be somewhere else, and if you have not decided where, it is nowhere.

Install method
Symlink vs Copy

Symlink is the default and gives you one canonical copy every agent links to — genuinely the better ergonomics. Copy costs you disk and manual refreshes but removes the single point through which one update reaches every surface at once.

Copy for anything sensitive
Agent targeting
Wildcard vs named agents

Targeting every installed agent runtime in one command is convenient and makes the install unreviewable in practice. Naming the specific agents you intend to equip keeps the write set small enough that a diff is readable.

Name the agents explicitly
Source type
Pack URL vs pinned repo

A pack URL is the shareable artefact and resolves to whatever upstream currently is. Installing from a repository at a commit you chose gives you something you can diff, review and roll back — the pack URL gives you a link.

Pin the repo for production
Pipeline installs
Unattended vs gated

The non-interactive flag exists because CI needs it. The question is whether your pipeline installs whatever resolves today or fails the build when the resolved content differs from a checked-in manifest. Only one of those is a control.

Fail the build on drift

05Precedentnpm learned this expensively, and it learned it late.

The most useful thing about the JavaScript ecosystem’s supply-chain history is not the incidents — it is the sequencing. npm’s hardening was reactive rather than proactive at almost every step. The controls in npm 12 that block install scripts by default — an allowlist for postinstall, preinstall and install hooks, and a Git-dependency resolution default of none — shipped after the incidents that made them obviously necessary were already public, not before. The right lesson is not that npm was careless. It is that opt-in-by-default hardening is politically difficult to ship until something has gone wrong, and dramatically cheaper to ship before.

The same week skill packs launched, a self-propagating npm worm was reported to have targeted AI-tool configuration and credentials specifically — we covered that incident and its response in our piece on the npm package compromise, and the figures and mechanics belong there rather than here. The only thing worth carrying across is the timing: a distribution layer for agent instructions arrived in the same news cycle as a demonstration that attackers are now specifically interested in agent configuration.

One nuance matters and is easy to get wrong. npm’s provenance-attestation system — GitHub Actions plus OIDC signing, linking a published package to the build that produced it — exists and is generally available. It is a real control. The correct reading of the past week is not that provenance is broken or useless; it is that stolen or forged credentials can let a compromised release pass a signature check, which is an argument for defence in depth rather than a verdict on the mechanism. Provenance you have is worth a great deal more than provenance you do not, and skill packs currently have none documented at all.

The precedent to borrow, not the panic
npm’s trajectory ran distribution first, verification later — publish, resolve, trust; then lockfile integrity; then provenance attestation; then, in npm 12, install scripts blocked by default. The agent-skills ecosystem is standing at step one of that same sequence with the whole map already drawn. Adjacent ecosystems have their own version of this lesson: AI tooling that invents plausible package names created a whole attack class, which we covered in our slopsquatting defence guide.

06Install Surface MatrixWhat a pack lets you do versus what verifies it.

This table is ours. No single source lays these columns out side by side — the Vercel changelog and the CLI README describe the tool in isolation, and npm’s hardening is documented separately in our own prior reporting. Assembling them together, with an explicit “none documented” column where that is the honest answer, is the point. Where a cell says none documented, it means exactly that: we searched the primary sources and found no such control described. It does not assert that no control exists behind the scenes.

Skill-pack install surfaces mapped against what the skills CLI does today, what verifies the content before it lands, the closest npm-ecosystem precedent, and the concrete mitigation available at the time of writing.
Install surfaceWhat the CLI does todayWhat verifies it firstClosest npm precedentMitigation available now
Getting a pack onto one machine
Local folder or zipPacks can be built from your own local folders and zips; the CLI also accepts a local path directly.Only whatever review produced the folder. Nothing in the tool.File-path and linked dependencies — never verified by the registry.Treat the pack as exactly as reviewed as the person who assembled it, and record who that was.
Public GitHub repoAccepts owner/repo shorthand, a full GitHub URL, a path to a single skill inside a repo, a GitLab URL, or any git URL.None documented — no checksum, signature or provenance field appears in the README or the changelog.Pre-provenance npm: publish, resolve, trust the name.Pin the repository and the commit yourself; read the diff before every refresh rather than after.
Private GitHub repoReuses existing Git credentials — credential helper, then GitHub CLI, then SSH; the README states it does not execute gh auth token or copy the stored credential into the Node.js process.Repository access control, which is authorisation rather than integrity.Private registries — who may fetch, not what was fetched.Keep the repo access-controlled and still review the content. A private source is not a reviewed source.
Direct download URLA URL may point at a single valid SKILL.md or a zip/tar/tar.gz/tgz archive, and need not carry a file extension. Capped at 10 MiB downloaded, 25 MiB extracted, 1,000 files.Size and file-count limits only. They bound the blast radius; they do not inspect the contents.Tarball fetch before lockfile integrity hashes were the norm.Claude Code’s archive plugin source is the shape to ask for: a zip over HTTPS with optional SHA-256 pinning.
Getting a pack everywhere at once
Update to latestnpx skills update refreshes a pack to its latest version in one command.None documented, and no published versioning scheme or lockfile to diff a new version against.Installing without a lockfile — npm 12 now blocks install scripts by default.Update deliberately and on a schedule, with a diff. Never as a reflex immediately before a build.
Fan-out to many agentsWrites into the skill directory of every targeted runtime; the CLI lists 75-plus of them at the time of writing, and Symlink is the default install method.None. The fan-out is a convenience feature, not a trust boundary.A single lifecycle hook reaching every project on a developer machine.Install per named agent rather than by wildcard, and choose Copy over Symlink where one source updating every surface is unacceptable.
Non-interactive CI install--all / -y skips the prompts and is explicitly documented as CI/CD friendly.Whatever the pipeline enforces. The tool contributes nothing here by design.Unattended installs in CI, where nobody reads the output.Pin the exact source, install against a checked-in manifest, and fail the build on any unexpected change.

Read down the third column and the pattern is the one that matters: every genuine control in that column is something you brought, not something the ecosystem supplied. Access control, review discipline, pipeline gates. Those are all real, and they are all the kind of control that degrades quietly the moment a team gets busy. The controls that survive busy teams are the ones enforced by tooling, which is precisely what is missing today.

07What To Do TodayFour controls you can apply this week.

None of this requires waiting for a vendor. The point of naming the gap precisely is that the compensating controls are ordinary engineering practice.

Control 01
Pin what you can
repo + commit, not a floating link

Install from a repository at a commit you chose rather than from a pack URL that resolves to whatever upstream is now. You lose the one-link convenience and gain something you can diff and roll back.

Zero cost, immediate
Control 02
Review on the way in
read the skill, not just the name

A skill is instruction text. Reading it is genuinely feasible, unlike auditing a transitive dependency tree. Make a named person responsible for reading any pack before it reaches a shared surface.

The cheapest audit you will ever run
Control 03
Least privilege at the agent
narrow the tools, not just the source

The execution boundary lives in the agent runtime now. Constrain what tools and shell access the agent has, and the worst case for a bad instruction shrinks accordingly, whatever the source turns out to be.

Defence in depth
Control 04
Ask for provenance
checksum · signature · attestation

The mitigation shape already exists two products away. Claude Code 2.1.224 added an archive plugin source that installs from a zip over HTTPS with optional SHA-256 pinning. Vendor feedback is how optional becomes default.

The ask that changes the ecosystem
The mitigation shape, verbatim
Claude Code’s changelog entry for 2.1.224, dated August 7, 2026, reads: “Added archive plugin source: install plugins from a zip over HTTPS without git or npm, with optional SHA-256 pinning.” Note the word optional — opt-in pinning is a weaker control than mandatory pinning, and it is still categorically stronger than having no pinning option at all. That is the shape skill packs could adopt tomorrow without redesigning anything.

The governance layer is where this becomes an organisational question rather than a personal one. Platform teams already know how to constrain what an agent may connect to — GitHub’s enterprise managed settings now support MCP server allowlists for Copilot, which is the same instinct applied to a different edge of the same problem. Skill sources deserve the same treatment: an approved list, a named owner, and a review step before anything reaches a shared directory. The portable-skills standard now emerging across harnesses makes that easier and more urgent at the same time — portability means one reviewed artefact travels everywhere, and so does one unreviewed one.

08What To WatchThe next twelve months of this ecosystem.

Skill packs did not arrive alone. They shipped inside a dense week of agent-infrastructure releases from the same vendor — per-agent sandbox isolation, an AI gateway and sandbox pairing for hosted agents, public read-only container registry repositories, audit log drains to third-party SIEM destinations. Read together, that is a platform building the operational surface agents need in production. Distribution is simply the piece that arrived without its verification half attached.

The forward projection worth making is about sequence rather than catastrophe. Ecosystems of this shape tend to add controls in a predictable order: first a canonical identifier, then a version string, then a lockfile or manifest, then integrity hashes, then signed provenance, and finally defaults that fail closed. Skill packs are at the identifier stage. If the pattern holds, the versioning scheme and a manifest arrive next, because those are what make the update command safe rather than merely convenient. The interesting question is not whether those land — it is whether they land before or after the first incident, and that is partly determined by how loudly the teams adopting this ask for them now.

For agencies and platform teams the practical read is that agent skills have crossed from a personal productivity artefact into a distributed dependency, and dependencies need owners. If you are standardising agent tooling across an engineering org, the policy work — approved sources, review ownership, pinning discipline, agent-level privilege limits — is the same work you would do for any other dependency class, and it is much cheaper to write while the surface area is still small. That policy design is a standard part of our AI and digital transformation engagements, usually alongside the tooling rollout rather than after it.

09ConclusionBorrow the lesson before you need it.

The shape of agent skills, August 2026

Skill packs are a good feature that arrived without its verification half.

Vercel shipped something teams genuinely wanted. Bundling skills from folders, zips and private repositories into one shareable, updatable install is the right ergonomic answer to a real problem, and the CLI underneath it is thoughtful — credential handling that avoids copying tokens into the process, resource caps that bound what an install can drop on disk, telemetry that is both narrow and disableable. None of the criticism here is that the tool is careless.

The criticism is structural. As documented at the time of writing, what verifies a pack before it lands in your agent’s trusted-instruction directory is whatever you brought yourself. No checksum, no signature, no attestation, no lockfile — and a default install method that fans one canonical copy into every agent surface at once. That combination is not an incident. It is a standing invitation to one, and the JavaScript ecosystem has already paid for the map.

The genuinely encouraging part is how ordinary the fixes are. Pin to a commit. Read the skill. Narrow what the agent may do. Ask the vendor for the pinning option that a neighbouring product already ships. None of that requires alarm, a freeze, or a policy memo — it requires deciding, once, that instructions your agent obeys are a dependency, and then treating them like one.

Govern your agent tooling before it governs you

Instructions your agents obey are a dependency. Treat them like one.

We help engineering and marketing teams standardise agent tooling without inheriting an unowned dependency surface — approved skill sources, pinning discipline, agent-level privilege limits, and the review process that keeps them working when everyone gets busy.

Free consultationExpert guidanceTailored solutions
What we work on

Agent governance engagements

  • Approved-source policy for agent skills and MCP servers
  • Pinning and review workflow for shared skill packs
  • Least-privilege configuration across agent runtimes
  • CI gating so pipeline installs fail closed on drift
  • Rollout and enablement across engineering teams
FAQ · Skill packs and supply-chain risk

The questions teams ask before rolling out.

A skill pack bundles multiple agent skills into one shareable unit. Vercel announced the feature on August 7, 2026: you build a pack from community skills, your own local folders and zips, or public and private GitHub repositories. Every pack is unlisted and gets its own URL, which you can share with a single person or an entire team to standardise skills across projects. The recipient installs it with npx skills add pointed at the pack URL and refreshes it later with npx skills update. Packs are created and browsed at skills.sh. Underneath, the MIT-licensed vercel-labs/skills CLI resolves and installs the content into whichever agent runtimes you target.
Related dispatches

Continue exploring agent infrastructure.