anomalyco / anomalyco/opencode

duplicate skill name WARN on every workspace: symlink ~/.claude/skills → ~/.agents/skills is not inode-deduped; nested remotion-best-practices SKILL.md collides

Open
#46,327 3 comments 0 reactions 1 assignee View on GitHub

@neriousy is already working on this.

Since Aug 31, 2026.

Dominant language
TypeScript
Stars
209k
Forks
27.5k
Avg merge
7h 2m
Merged PRs (30d)
384

Description

Description

OpenCode 1.18.25 (Desktop, macOS) logs WARN duplicate skill name on every workspace boot, not once per process. Two distinct collisions:

  1. Same skill, two roots, often the same inode. ~/.claude/skills/<name> is a symlink to ~/.agents/skills/<name> (standard Claude + Codex layout). Discovery still treats them as two skills and warns. followSymlinks: true plus no realpath/inode check.

    Example from this machine (already a symlink):

    WARN duplicate skill name name=codex-security-scan
      existing=/Users/…/.claude/skills/codex-security-scan/SKILL.md
      duplicate=/Users/…/.agents/skills/codex-security-scan/SKILL.md
    
  2. Recursive glob inside a skill package. ~/.agents/skills/remotion-best-practices/{remotion-create,remotion-markup,…}/SKILL.md has the same frontmatter name as the sibling top-level ~/.agents/skills/remotion-create/SKILL.md. {skill,skills}/**/SKILL.md indexes both.

This is not the TUI-vs-Desktop which winner bug (#35153) and not only the non-deterministic last-writer (#32202). The user-visible failure here is a warning flood (once per open workspace) and a prompt-cache miss risk from unstable <location> bytes. Related closed: #29950.

OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 is an undocumented workaround for (1) only. It is env-only (not in opencode.json schema). It does not fix (2). There is no config key to skip Claude roots while keeping ~/.agents/skills.

Plugins

oh-my-openagent@latest (warnings are service=skill / OpenCode core, not the plugin)

OpenCode version

Desktop 1.18.25; CLI 1.18.10

Steps to reproduce
  1. Install the same skill in both Claude and Agents roots as a symlink:
    mkdir -p ~/.agents/skills/example
    echo $'---\nname: example\ndescription: demo\n---\n' > ~/.agents/skills/example/SKILL.md
    ln -s ~/.agents/skills/example ~/.claude/skills/example
    
  2. Also copy a nested package layout:
    mkdir -p ~/.agents/skills/pkg/example
    cp ~/.agents/skills/example/SKILL.md ~/.agents/skills/pkg/example/SKILL.md
    
  3. Start OpenCode Desktop (or opencode) from any project.
  4. Open more than one recent workspace.
Expected
  • Same inode / symlink pair: index once, no WARN.
  • Nested **/SKILL.md under another skill directory: do not register as a second skill of the same name, or warn once with a stable winner by documented precedence.
  • A opencode.json flag equivalent to OPENCODE_DISABLE_CLAUDE_CODE_SKILLS.
Actual
  • WARN for every colliding name, repeated for every workspace instance.
  • Winner is last writer (see #32202).
  • Desktop has no config-file way to opt out of ~/.claude/skills without also dropping ~/.agents/skills (OPENCODE_DISABLE_EXTERNAL_SKILLS=1).
Operating System

macOS

Terminal

OpenCode Desktop

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.