Skip to content

add getsentry/dotagents fails: plugin bundle symlink resolves outside the plugin directory #192

Description

@LRNZ09

Summary

dotagents add getsentry/dotagents fails on 3.1.0. This repo's own plugin bundle contains a symlink that escapes the plugin directory, which the containment check introduced in 3.1.0 rejects.

Repro

With CLI 3.1.0 (npx @sentry/dotagents --version → 3.1.0):

$ npx @sentry/dotagents --user add getsentry/dotagents --ref 3.1.0
Plugin bundle symlink resolves outside the plugin directory: skills/dotagents

The command aborts without writing agents.toml or agents.lock, which is the correct failure mode — but the source cannot be added at all.

Cause

At tag 3.1.0:

  • .claude-plugin/marketplace.json declares plugin dotagents with "source": "./plugins/dotagents".
  • plugins/dotagents/skills/dotagents is a symlink (mode 120000) whose target is ../../../skills/dotagents.

That target resolves to the repo root's skills/dotagents, i.e. outside the plugin directory plugins/dotagents/. #169 (hybrid plugin bundles) and #182 (contain managed paths within project root) added the check that rejects it.

This looks like a self-violation rather than an ambiguity: #113 states the intended rule as "Broken or escaping symlinks are rejected; contained relative symlinks survive staging and target copies verbatim." The repo's own bundle is in the rejected category.

Not a regression in the layout

The symlink predates the check. plugins/dotagents/skills/dotagents is present at 2.2.0 and 3.0.1 as well; only the validation is new in 3.1.0. So pinning an older ref does not help — the check runs in whichever CLI version npx resolves, independent of the ref being added.

Workaround

install is unaffected, because it resolves an existing [[skills]] declaration and never enters plugin discovery. Declaring the skill by hand in agents.toml and running install works:

[[skills]]
name = "dotagents"
source = "getsentry/dotagents"
ref = "3.1.0"
$ npx @sentry/dotagents --user install
Installed 46 skill(s): dotagents, ...
$ npx @sentry/dotagents --user doctor --fix
All checks passed.

This is awkward to recommend, since the guide otherwise steers users toward add over hand-editing config.

Possible fixes

  1. Restructure the bundle so plugins/dotagents/skills/dotagents is a real directory, or move the canonical skill inside the plugin and have the root skills/ entry point at it instead — reversing the direction of the symlink so it stays contained.
  2. Resolve a bundle symlink against the source repository root rather than the plugin directory when the source is a git checkout, keeping the containment check for paths that escape the repo.

Happy to send a PR for (1) if that's the preferred direction.

Environment

  • @sentry/dotagents 3.1.0 (via npx)
  • macOS (darwin 25.5.0)
  • Global/user scope (~/.agents)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions