vercel-plugin
Comprehensive Vercel ecosystem plugin — relational knowledge graph, skills for every major product, specialized agents, and Vercel conventions. Turns any AI agent into a Vercel expert.
by vercelTypeScript
Meet the team
See all 44 on GitHub →Commit activity
Last 12 weeks · 162 commits
Community health
2 of 6 standards met
Recent PRs & issues
why The OpenAI plugin needs to be generated from the current upstream source, while retaining its submission adaptations. The published skills also do not explain when to use the new live deployment card or how its connection can differ from the Vercel connector. what changed Add to generate the plugin directory and submission ZIP from this repository. This is internal submission tooling; the main README stays unchanged. holds the manifest, display metadata, one shared branding image, package readme, and content adaptations. Runtime skills and workflow references come from the normal source tree. The build excludes unsupported skills, hooks, app manifests, and authoring files. It derives the version from , regenerates workflow references from the adapted skills, and produces a deterministic ZIP. Conflicting adaptations fail the build while preserving the last successful artifact. CI builds and uploads the ZIP after tests pass. Sync the latest upstream, including OpenCode support and the rename. OpenAI-only deployment, CLI, and knowledge guidance now routes visual requests to , explains its current inputs, card refreshes and expandable build logs, and keeps data analysis and runtime logs on their dedicated tools. It explains availability, separate provider authentication, and truthful fallback behavior. Normal client skills and hooks are unchanged by these adaptations. how it was tested Generated-file check, full build, typecheck, skill validation, and all 1,083 tests passed locally. Packaging tests verify widget retrieval metadata, generated guidance, and unchanged source skills, as well as ZIP extraction, deterministic output, source updates, conflict handling, and new-skill metadata checks. Generated 33 skills and 201 files with valid relative Markdown links. OpenAI submission adaptations are retained; unused images are excluded. Read the current and deployment-test Codex chats and checked the live tool schema. A live call on the sandbox project returned its READY deployment, URL, and commit. This confirms the tool response; native card rendering was not verified in this run. The ZIP has not been submitted or published to OpenAI. GitHub CI passed; downloaded the updated artifact and verified its ZIP bytes exactly match the local build. Update (@molebox) Merged and fixed the review findings. Metadata for new skills: added for and , which are now on main and were breaking . The build ignores entries for skills that don't exist yet, so (#336) and (#326) are pre-added, and a test pins that behaviour. With both PRs merged in, the build produced 37 skills and the patch applied. Tests: removed the hard-coded counts (33 skills, 201 files). The expected skill list now comes from the skill directories on disk, and every runtime file must be in the ZIP. New tests check that overlong or -truncated descriptions fail the build. : regenerated against current main. Only the knowledge-update hunk was broken. The patched text uses only and . Codex limits: must be 25–64 characters (openai/codex and skill-creator validation). Every description is rewritten to be complete and within range, and the build now fails rather than truncating. "Edge Functions" is removed from vercel-functions. Display names fixed ("Chat SDK", "Vercel CLI", "Deployments & CI/CD", "AI SDK", "Workflow SDK"). : emptied. All six entries were already deleted from main (#282, #291). Manifest: author and developer changed to "Vercel" (matching and ), and the keyword removed. is kept. OpenAI now recommends a root with the Agent Plugins and treats as a compatibility fallback, which is worth deciding before submission. : added a Quick Reference entry and an "OpenAI Package" section covering per-skill metadata and how to refresh . Verified: the Vercel MCP tool names and parameters match the docs. Kept as the bypass cookie name, based on agent-browser's protected-deployments skill and . Not verified:** the cookie's flag (needs a live bypass secret), and whether OpenAI accepts the ZIP. Checks: (35 skills, 206 files), , , and (1125 pass).
Problem Claude Code caps a hook's plain stdout at 10,000 characters. Over the cap, it saves the output to a file in the session directory and replaces it with the file path and a preview of up to the first 2,000 characters. From the hooks reference, "Output size limits": "Claude Code doesn't ask Claude to read the file, so keep anything Claude must always see within the cap." prints and the knowledge-update skill body as one SessionStart output. On main that output is 10,425 characters in a Vercel project and 10,830 in an empty directory. The preview ends at the last line break before 2,000 characters, so in every activated session Claude sees the session context and the first 1,249 of the knowledge update's 9,852 characters. Everything after the "Vercel is a full compute platform" bullet is missing from context, including: the "Integrations on Vercel" section, which describes as the load-bearing contract every activated session gets the Next.js section that points agents at in empty directories, the "Greenfield execution mode" block, which is appended last (the profiler's one-line greenfield hint still arrives) The hook runs on , , and , so the same happens after every compaction. Reproduction Output size, with the hook run the way hooks.json runs it ( is a checkout of main or an installed 0.53.0 or later): In an empty directory (no ) the same command prints . What Claude receives: I ran Claude Code 2.1.300 in print mode with this repo loaded through (with removed so no MCP connection is attempted), an isolated , and pointed at a local server that records the Messages API request. The first user message of the recorded request contains: "Integrations on Vercel", "hardcode a provider SDK" and do not appear anywhere in the request. In the empty-directory run, "Greenfield execution mode" does not appear either. With the same setup and the 0.50.0 hook (8,009 characters), the whole output is in the request. Root cause The output grew past the cap as content was added; no single change is at fault. Hook output size per release, measured with the command above: #282 added the Next.js section and took the empty-directory case over the cap, #290 took the Vercel-project case over, and #307 added another 417 characters. The existing tests check that the content is in the hook's stdout, which it is, so the size never failed a check. Fix runs a second time with . That invocation prints only the knowledge update (9,852 characters). The existing invocation prints the session context (570 characters, or 976 with the greenfield guidance). Claude Code measures each hook's stdout on its own, "even when several hooks run for the same event" (same docs section), so both arrive in full. A flag on the same script keeps the activation rules in one place; both invocations use them unchanged. now puts the greenfield guidance before the knowledge update. OpenCode joins all parts into one context string, so with this order its context still equals the two Claude Code outputs joined in hooks.json order, which is what asserts. is rebuilt with , and CLAUDE.md lists the new registration. Trade-offs The knowledge update alone is 9,852 characters, 148 under the cap. The new test fails any change that pushes a single output over 10,000 characters, so a later sync that grows the section past the cap will need a trim or a further split. That is intended: past the cap the content is dropped without an error anywhere. Two open PRs edit the knowledge update. With #322 merged into this branch it is 9,908 characters and the tests pass. With draft #333 it is 10,425 characters and the new test fails, so that change would need a trim. One more process at session start. It runs in parallel with the other SessionStart hooks and took 45 to 120 ms per run on this machine. Claude Code adds the two outputs as separate SessionStart reminders, and their order is not fixed: in my empty-directory run the knowledge update came first. The two sections do not refer to each other. Cursor gets two values from this hook instead of one. The session-start profiler already returns to Cursor whenever it has a message (for example when the Vercel CLI is missing), so more than one SessionStart hook supplying it is not new. I did not test in Cursor. Not taken: trimming to fit one hook is a content decision for its owners, and the docs sync updates that file. Replacing the injection with a pointer to the skill would change the always-on behavior the tests describe. Testing New test runs every inject-claude-md invocation registered in hooks.json, for a Vercel project and an empty directory. It checks that each output is at most 10,000 characters and that together they contain the session context, and, for the empty directory, the greenfield guidance. On main it fails with block. Environment Linux Mint 22.3 (kernel 7.0.0-38-generic), Node 20.20.2, Claude Code 2.1.300, Bun 1.4.3 for the test suite. Plugin at main d874dac (0.54.1). Update (@molebox) Merged . After the merge, the knowledge-update output was 10,191 characters, back over the cap (main added more content), and this PR's test failed. I replaced the fixed two-way split with a structural one so it keeps working as content grows: One ordered list, packed into parts: the hook builds the full session-start context in order (session context, greenfield guidance, knowledge update) and packs it into parts of at most 9,000 characters. runs it as and , still two processes. Where it splits: the knowledge update splits before headings. A section too long on its own splits between top-level bullets or paragraphs, never inside a code fence. Later parts repeat the title with "(continued)", because Claude Code runs matching hooks in parallel and may deliver outputs in any order. Nothing is ever cut. If content outgrows the registered parts, the last part prints the rest and warns on stderr. That pushes it over 9,000, so the tests fail and tell you to add another entry. OpenCode builds its context from the same parts, so it still equals the Claude Code outputs joined in order. Unit of measure:** JS string length, which is what Claude Code checks ( in the 2.1.220 binary). Sizes on the merged tree: Tests run the real built hook as invokes it. They check the size limit, that every section appears exactly once, ordering, and greenfield placement, plus growth, overflow and oversized-block scenarios. and are updated. Checks: , , and (1124 pass). Separate pre-existing bug, not fixed here: the hook exits silently when started through a symlinked path (e.g. → ).
Recent fixes
I'm a PM at Prisma. Prisma's Marketplace listing is Prisma Postgres (), but three skills call it "Prisma", which reads as Prisma ORM, and one points Prisma ORM users at Neon only. Summary : the Marketplace Postgres list said "Prisma", which reads as the ORM. Now "Prisma Postgres", the product name on the listing. chainTo message for : said "Neon Postgres integration with Prisma". That import only means the app uses Prisma ORM, which runs on any Postgres, so the message now names the Marketplace Postgres providers (Neon, Supabase, AWS Aurora, Nile, Prisma Postgres). Pattern and are unchanged. chainTo message for storage packages: the list said "Prisma"; now "Prisma Postgres". Pattern unchanged. "Prisma ORM (Marketplace Native)" section: renamed to "Prisma Postgres (Marketplace Native)". Dropped the claim that pooling comes from Prisma Accelerate: Prisma Postgres pools with PgBouncer on every plan, and Accelerate retires on 2026-12-01 (docs). The example now uses the the integration sets, with , since any Postgres client works (Prisma Postgres on Vercel). The decision-matrix row "Type-safe ORM with migrations " is about the ORM and stays as is. Validation (typecheck + suite): 1079 pass, 0 fail. : all checks passed. and : no drift. : clean. No line overlap with the open PRs that touch these files: #330 (Turso section only), #344 (, hunks above the provider list), #333, #325 and #319 (, hunks below the chainTo message). Update (@molebox) Merged and revised the Prisma Postgres section so it matches Prisma's own Vercel guide (https://www.prisma.io/docs/guides/postgres/vercel), Prisma's connection-pooling docs, and Vercel's Fluid compute pooling guide. Environment variables: the integration sets , and . All three hold the direct connection string (), not the pooled one, so "built-in connection pooling" via was removed. The section explains the direct-connection caps (10 on Free and Starter, 5 reserved) and how to add the pooled string () yourself under a new name (example: ). It also says to keep for migrations, and notes that can still hold an Accelerate URL on older databases. Pool setup: replaced with Vercel's documented pattern: a module-scope plus from (https://vercel.com/kb/guide/connection-pooling-with-functions). Type-checked against , and . Provider order: restored the original order (Neon, Supabase, AWS/Aurora, Nile, Prisma Postgres) and kept the product-name correction ("Prisma Postgres", per the "Prisma Postgres for Vercel" listing). Checks: , , and (1119 pass). FYI @gregory-boch-prisma: the node-postgres snippet on the Prisma Marketplace listing still uses with , which contradicts Prisma's own guide. Update (@gregory-boch-prisma, 2026-10-20): signed commits The branch is now a single commit signed by GitHub (9d245ac), on at 0db4408. The changed lines match the approved head 7c1a446 exactly, and @molebox is credited as co-author. Re-run on the new head: 1268 pass, 0 fail; and both clean. Thanks for the pooled-string fix, and for the heads-up on the node-postgres snippet on our listing. 🤖 Generated with Claude Code
Adds a new skill, Offloading work to a Vercel Sandbox (). It's about using the CLI as remote workers for heavy builds, full test suites and many parallel (agent) tasks, so they don't load the local machine. It complements , which covers running untrusted code through the SDK. The content comes from a multi-week performance program in which a dozen coding agents shared one laptop and offloaded builds and sharded test suites to Vercel Sandboxes. It is written to be project-agnostic: when to offload and what to keep local a base snapshot built once (pinned toolchain, pre-built baseline tree, helper scripts) one sandbox per task: naming, sizing (2 GB per vCPU and the OOM risk), lifetime vs timeouts, tags pushing source as a tarball of git-known files while keeping and build artifacts running commands: quoting pitfalls (zsh globs and modifiers), script files, detached long jobs with an exit-status file getting results back as small files sharding suites; separating pre-existing failures from new ones against an untouched baseline auth, a small wrapper script plus a for agents, cost and cleanup, and designing for restarts Also adds the required node to the ecosystem graph in . passes. The CLI flags were checked against from Vercel CLI 62.1.0. Update (@molebox) Merged and fixed the review findings against the Sandbox CLI source ( , the that bundles), the wrapper in , and the Sandbox pricing and persistence docs. Lifetime and cleanup: sandboxes are persistent by default. Task sandboxes are now created with , and cleanup uses . only ends a session, and a stopped sandbox's name stays taken. The orphan sweep uses , because shows only running sandboxes by default. Plan limits: added a table (Hobby 4 vCPU / 45 min, Pro 8 / 24 h, Enterprise 32 / 24 h, 2 GB per vCPU, must be 1 or even). Examples use Pro sizes and say so. is described as the session length. The OOM advice respects the vCPU cap. always exits 0, even when the remote command fails. The wrapper hands off to the Sandbox CLI and returns 0 (confirmed against 64.5.0). The wrapper now returns the real remote status. prints its ID only to stderr (spinner), so wrote an empty file. The skill now reads stderr. needs a file path destination. A missing source exits 0, so checks that the file arrived. Auth and scope: the order is , , , then the login session, with OIDC only as a fallback. doesn't read . Wrapper script: now a complete POSIX script ( defined inside), and it refuses to push from outside a git repo. All shell blocks pass // and shellcheck. Companion files: README row, counts set to 37 (assumes #336 merges first), and . The test covers prompt routing (with negatives), the split with vercel-sandbox (/ added to its ), shell parsing, plan-limit and persistence checks, and the script run against a stub . Checks: , , and (1157 pass). I didn't create real sandboxes; behaviour was verified from source, docs and stubs.
Problem / Intent Agents have no guidance for setting up OpenTelemetry on Vercel. They guess where goes, miss incoming trace context, and misread output. Spans then land in the wrong trace, or nobody checks them. Approach A new skill focused on instrumentation setup. has a setup workflow with the Next.js registration snippet, an investigation workflow, and notes on how the CLI behaves in agent (non-interactive) mode. Short references cover framework setup (Next.js, SvelteKit, any other framework), custom spans, context propagation, sampling, capture, search, inspection, performance, and troubleshooting. Search guidance matches the JSON Lines output of Vercel CLI 64. The performance-optimizer agent includes the investigation workflow. and chain to the skill on and . Agents followed the skill on fresh Next.js 16.4 and SvelteKit 3 apps deployed to Vercel previews. Setup worked on the first deploy, and custom spans nested under the request in the same trace. Update (@molebox) Merged and fixed the review findings. Every claim was re-checked against source: the shipped package (the public main has no yet), 2.1.3, Next.js and SvelteKit source. Skill counts set to 36 (, README heading and file tree). Overlap with #335: prompts now route to vercel-tracing. vercel-cli drops the phrase and group, and its description points trace and OpenTelemetry work here. It keeps #335's general debugging wording (errors, 5xx, timeouts) and the to vercel-tracing. False positives: and matched unrelated prompts ("approach this slowly", "takes a few seconds"). They're tightened, and the new negative tests failed before this fix. Request IDs: in JSON output can carry a region prefix (). The CLI strips it only in the table column. The jq examples in and now handle it. CLI version: the agent refusal arrived in 64.0.2, not 64.0 (diffed npm tarballs 64.0.1 vs 64.0.2). Non-interactive mode: the description now matches the CLI's actual condition (, or an agent with no TTY on stdin). @vercel/otel: by default trace context also goes to the incoming request's host, so "a custom domain" became "any other domain". Built-in outbound spans: "times and " became "outbound HTTP requests", which is what the docs say. Checks: , , , and (1228 pass). Docs drift found along the way, for the docs team: says Next.js 13.4+ extracts incoming trace context (source: 14.0.1), and the always-on/session tracing pages still show .
Repository: vercel/vercel-plugin. Description: Comprehensive Vercel ecosystem plugin — relational knowledge graph, skills for every major product, specialized agents, and Vercel conventions. Turns any AI agent into a Vercel expert. Stars: 311, Forks: 69. Primary language: TypeScript. Languages: TypeScript (78.2%), JavaScript (18.5%), Go Template (3.3%). Homepage: https://vercel.com/docs/agent-resources/vercel-plugin Open PRs: 4, open issues: 57. Last activity: 2h ago. Community health: 50%. Top contributors: johnlindquist, Melkeydev, molebox, vercel-gh-bot-4[bot], vercel-gh-bot-3[bot], vercel-gh-bot-2[bot], vercel-gh-bot-5[bot], gustavovalverde, mknichel, roboeve[bot] and others.