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
- 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.
- 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)
Summary
dotagents add getsentry/dotagentsfails 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):The command aborts without writing
agents.tomloragents.lock, which is the correct failure mode — but the source cannot be added at all.Cause
At tag
3.1.0:.claude-plugin/marketplace.jsondeclares plugindotagentswith"source": "./plugins/dotagents".plugins/dotagents/skills/dotagentsis a symlink (mode120000) whose target is../../../skills/dotagents.That target resolves to the repo root's
skills/dotagents, i.e. outside the plugin directoryplugins/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/dotagentsis present at2.2.0and3.0.1as well; only the validation is new in 3.1.0. So pinning an olderrefdoes not help — the check runs in whichever CLI version npx resolves, independent of therefbeing added.Workaround
installis unaffected, because it resolves an existing[[skills]]declaration and never enters plugin discovery. Declaring the skill by hand inagents.tomland runninginstallworks:This is awkward to recommend, since the guide otherwise steers users toward
addover hand-editing config.Possible fixes
plugins/dotagents/skills/dotagentsis a real directory, or move the canonical skill inside the plugin and have the rootskills/entry point at it instead — reversing the direction of the symlink so it stays contained.Happy to send a PR for (1) if that's the preferred direction.
Environment
@sentry/dotagents3.1.0 (via npx)~/.agents)