* adding skill invocation for plugin
* Address review: namespace allowlist, skill:injected, harness tagging
- Only accept skills under the plugin's own namespaces (vercel, vercel-plugin);
other-plugin:deploy, netlify:deploy, and bare slugs are dropped
- Emit skill:injected from the opt-in inject hooks via the same detached sender
- Persist the detected harness per session and attach plugin:agent_harness to
every skill event batch
- Fix normalizeDetectedAgentHarness for AI_AGENT-style names
(claude-code_<version>_agent was reporting as "other")
- Accept Cursor-shaped payloads (conversation_id) through compat normalizeInput
- Disable telemetry for the whole test suite via bunfig preload so hook tests
never phone home
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* adding plugin telemetry
* adding kimi and grok detection logic
* upticking version
* fixing headers
* adding harness calls
* fixing installing-id
* fixing detect agent logic to include more
* fixing await to not block other calls
* Add Vercel Services skill
* Prepare Services skill release; bump to 0.47.0
* Reframe Services skill around coupled-components use case
Lead with when Services is the right call (tightly coupled frontend +
backend in one project) and its concrete benefits: skew protection,
synced previews, atomic deploys and rollbacks, private bindings. The
separate-projects escape hatch is now about independent deploy cadence.
Drop framework pinning from examples, add /api namespace-split guidance
(SPA vs frameworks with their own API routes), prefix stripping via
service-scoped rewrite, SPA catch-all to /index.html, and a subdomain
section with the preview-environment caveat.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Make :path prefix capture optional so bare /api matches
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Warn against destination.path instead of teaching it
The proxy only reads destination.service when dispatching into a
service; the path field is compiled and validated but never consumed
at request time.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Spell out the private-by-default rule for services
No top-level rewrite means a service is unreachable from the public
internet and only accessible through bindings; adding a rewrite makes
it public regardless of bindings.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Drop frontend from the backend+vercel prompt signal group
Review feedback: the frontend term made the group miss backend-led
phrasings. The wider [backend, vercel] group can reach the threshold
with anyOf hits, which we accept for now.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Rework retrieval intents and examples
Intents: one line per job the skill teaches, anchored by domain
vocabulary (services, binding, rewrites, vercel.json) rather than
product-name prefixes, and covering the private-by-default, subdomain,
and prefix-stripping content added in this PR.
Examples: verbatim-style prompts carrying stack names (FastAPI, Vite,
Express, Go) and symptom phrasings, which is what the lowest-weight
retrieval field is for.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Remove 'frontend' option from skill manifest
Removed 'frontend' from the 'anyOf' array in skill manifest.
* Drop frontend from anyOf in skill source, not just the manifest
The manifest is generated from SKILL.md, so removing the term only
from generated/skill-manifest.json left the two out of sync and
failed the manifest check.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* [skills] Add cache-reason skill for per-request cache reason debugging
Adds a `cache-reason` skill that explains the per-request `cacheReason`
field (cold, collapsed, error, draft_mode, prerender_bypass, crawler,
stale_time, stale_tag, stale_error) — why a single request was a MISS,
STALE, or BYPASS. Complements `cdn-caching`, which covers aggregate hit
rate and ISR cost via `vercel metrics`.
Written for the public audience: all observation paths route through the
dashboard Logs "Reason" row and `vercel logs --json`. The internal-only
`x-vercel-cache-reason` response header (gated behind is_timing_header_visible)
is explicitly flagged as not user-visible, and the skill avoids the
not-yet-published /docs/caching/cache-status anchors.
- New: skills/cache-reason/SKILL.md (with promptSignals + retrieval block)
- vercel.md: graph reference in the caching section
- README.md: skills table row + count
- cdn-caching: mutual cross-link
- Regenerated skill-manifest.json, skill-catalog.md, build-from-skills.manifest.json
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Merge cache-reason guidance into cdn-caching instead of a new skill
Fold the per-request cacheReason content into the existing cdn-caching
skill (from #108) rather than shipping a separate cache-reason skill:
- cdn-caching: add the 9-value cacheReason table (cold, collapsed, error,
draft_mode, prerender_bypass, crawler, stale_time, stale_tag, stale_error)
refining the x-vercel-cache status, the MISS→BYPASS displayed-status rule,
and how to read cacheReason via `vercel logs --json` / the Logs "Reason"
row (with the internal-only x-vercel-cache-reason header caveat).
- Absorb cache-reason prompt signals + add a retrieval block so questions
like "why is my page stale" / "what does stale_tag mean" route here.
- Remove skills/cache-reason/ and revert its README/vercel.md wiring
(back to 30 skills).
- Regenerate manifest, catalog, build-from-skills manifest.
Verified: 899 tests pass; the real UserPromptSubmit hook injects cdn-caching
for the three cache-reason prompts and correctly ignores unrelated prompts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Tighten cdn-caching cacheReason merge (287→133 lines)
Condense the skill while keeping all 6 cache statuses and all 9 cache
reasons (3 MISS: cold/collapsed/error, 3 BYPASS: draft_mode/
prerender_bypass/crawler, 3 STALE: stale_time/stale_tag/stale_error).
Cut verbose prose, repeated metrics examples, and the FAQ; keep the two
reference tables, the core metrics/logs investigation commands, and the
cacheReason observation guidance. Add [cache, miss] prompt signal so
MISS questions trigger.
Verified: 899 tests pass; the real UserPromptSubmit hook injects
cdn-caching for MISS/STALE/BYPASS/hit-rate prompts and ignores unrelated
and generic-error prompts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Complete cacheReason retrieval entities (add error, collapsed, stale_time)
The retrieval.entities list included some cache reasons but omitted
`error` (and `collapsed`, `stale_time`), making it inconsistent with the
canonical 9-reason table. List all nine reason slugs, ordered to mirror
the table.
Low-risk: the "error" token was already in the lexical index via
stale_error, and injection is gated on exact score — verified generic
error prompts ("fix this null pointer error", etc.) still inject nothing,
while MISS/STALE/BYPASS/hit-rate prompts still route to cdn-caching.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Restore docs/caching/cdn-cache link dropped during trim
The cdn-cache docs URL was inadvertently removed while tightening the
docs list; it's the canonical CDN-cache reference for this skill. Restore
it alongside the caching overview, ISR, metrics, and logs links.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Redo cacheReason as a small additive change to cdn-caching
Prior commits had rewritten (gutted) the existing cdn-caching skill.
Restore the original #108 skill verbatim and add only what's needed:
- A 9-row cacheReason table under Key concepts (3 MISS: cold/collapsed/
error, 3 BYPASS: draft_mode/prerender_bypass/crawler, 3 STALE:
stale_time/stale_tag/stale_error), the MISS→BYPASS displayed-status
rule, and how to read cacheReason (vercel logs / Logs panel; the
x-vercel-cache-reason header is internal-only).
- Additive promptSignals + a retrieval block so cache-reason questions
route here.
Net diff vs the original: +47 / -2 lines. All existing metrics/ISR/BYPASS
runbook content preserved. 899 tests pass; routing verified via the real
UserPromptSubmit hook.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Make cacheReason prompt signals consistent across reasons
Previously only stale_tag was a phrase. Add the other distinctive reason
slugs so pasting any of them from a log triggers the skill:
stale_time, stale_error, draft_mode, prerender_bypass (+ existing
stale_tag). Add 'cold cache' and 'request collapsed' to anyOf for MISS
coverage.
Bare cold/collapsed/error are intentionally NOT phrases — as ordinary
English words they would false-match unrelated prose. Verified:
"cacheReason: stale_error" and "prerender_bypass" fire cdn-caching, while
"fix this null pointer error" / "handle the error case" inject nothing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* [skills] Route the cacheReason field name to cdn-caching
* [skills] Drop generic single-word cache-reason entities (cold, error, crawler) per review
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(marketplace): discover-first commerce routing + provisioning guidance
Make the model reliably reach for the Marketplace when an app needs an
external service, instead of hardcoding a provider from memory.
- knowledge-update (always-injected at session start): add a discover-first
directive — load the `marketplace` skill, then discover + provision a real
integration BEFORE planning/writing code/asking.
- marketplace SKILL.md: broaden the description (commerce/payments/etc. as the
catch-all for capabilities without a dedicated skill); restructure into
discover -> install -> build with an anti-mock/anti-punt rule; add a
Recommendations section keyed on the product-catalog test (commerce vs
payments), with no hardcoded providers (discover names them).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(marketplace): remove command that shadowed the skill; tighten routing
The `marketplace` skill and `/marketplace` command shared a name, so the
command shadowed the skill — Skill(vercel:marketplace) loaded the command's
runbook instead, and the skill's routing guidance never reached the model.
Remove the command (marketplace is skill-only, like the other capabilities)
so the skill loads, and tighten routing: discover-first flow, a preferred-
provider table (commerce -> Shopify, payments -> Stripe), and a slimmer
knowledge-update that points at the skill.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(release): patch-bump plugin manifests to 0.45.1
Backwards-compatible fix (marketplace skill routing); bump the version in
all three shipped manifests (.claude-plugin, .cursor-plugin, .plugin).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The ecosystem graph now lives at vercel.md (root). Remove the redundant
assets/ directory and update all references in the validator, tests, and
README.
Rules (.mdc files) aren't supported by Claude Code's plugin system — they
were silently ignored. Move the ecosystem knowledge graph and all three
convention sets (Next.js 16, AI SDK v6, Vercel platform) into CLAUDE.md
so they're always loaded into context.
Also updates repo references from anthropics/open-plugin to
vercel-labs/vercel-plugin.