Skip to content

skills/<name>/upstream/SKILL.md causes duplicate skill registration in Claude Code #77

@nicksonnenberg

Description

@nicksonnenberg

Problem

The plugin ships a duplicate upstream/SKILL.md inside 10 of the customized skill directories:

skills/ai-sdk/SKILL.md
skills/ai-sdk/upstream/SKILL.md  <- duplicate
skills/chat-sdk/SKILL.md
skills/chat-sdk/upstream/SKILL.md  <- duplicate
... (8 more: next-cache-components, next-forge, next-upgrade, nextjs,
       react-best-practices, vercel-cli, vercel-sandbox, workflow)

Claude Code's harness scans recursively for SKILL.md and registers both files as the same skill name. Second-pass registration drops the description from the available-skills list, so the model can no longer auto-route to the skill via keyword triggers — only explicit invocation via the Skill tool works.

Repro

  1. cd ~/.claude/plugins/cache/claude-plugins-official/vercel/0.42.1/skills
  2. find . -name SKILL.md | awk -F/ '{print $(NF-1)}' | sort | uniq -c | sort -rn | awk '$1>1' → shows upstream 10x
  3. Check Claude Code's available-skills list — vercel:ai-sdk, vercel:chat-sdk, etc. show no description.

Suggested fix

Either:

  • Move upstream/ outside skills/ (e.g., vendor/upstream/<name>/SKILL.md or docs/upstream-source/<name>.md), or
  • Rename the upstream copy from SKILL.md to UPSTREAM.md so the harness skip-scan is not triggered, or
  • Add a .claudeignore-equivalent if Claude Code supports one.

Workaround

Local SessionStart hook prunes upstream/ dirs in cache after each session start (until plugin update).

cc @vercel

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions