Environment
@sentry/dotagents version 3.1.0
- macOS
- Project-scoped installation targeting Claude and Codex
- Command:
npx -y @sentry/dotagents@3.1.0 --project install
Steps to Reproduce
-
Configure plugins that ship both .claude-plugin/plugin.json and .codex-plugin/plugin.json, without a root plugin.json:
agents = ["claude", "codex"]
[[plugins]]
name = "posthog"
source = "PostHog/ai-plugin"
path = "."
targets = ["claude", "codex"]
[[plugins]]
name = "pstack"
source = "michael-denyer/pstack-claude"
path = "plugins/pstack"
targets = ["claude", "codex"]
-
Run:
npx -y @sentry/dotagents@3.1.0 --project install
-
Run the command again. The same warnings recur.
This also reproduces with a minimal local plugin containing only these two files:
source/
├── .claude-plugin/plugin.json
└── .codex-plugin/plugin.json
Each file can contain:
{
"name": "dual-native",
"version": "1.0.0"
}
Declare the local plugin with:
agents = ["claude", "codex"]
[[plugins]]
name = "dual-native"
source = "path:./source"
targets = ["claude", "codex"]
Expected Result
Dotagents recognizes both manifests as publisher-authored files belonging to the installed plugin, preserves their runtime-specific content, and emits no unmanaged-manifest warnings.
This should remain true after reinstalling or reloading installed state.
Actual Result
Every install emits:
warn: Claude plugin manifest exists and is not managed by dotagents: <repo>/.agents/plugins/posthog/.claude-plugin/plugin.json
warn: Claude plugin manifest exists and is not managed by dotagents: <repo>/.agents/plugins/pstack/.claude-plugin/plugin.json
The Claude manifests remain intact, but dotagents incorrectly treats files it copied from the plugin source as unrecognized files.
Source inspection suggests the following cause:
loadPluginInterfaces() checks native fallback manifests in Codex-first order.
- It returns after the first match and registers only that runtime in
authoredNativeInterfaces.
- Installation copies both native manifests, but
.dotagents-native-source and .dotagents-native-fallbacks record only codex.
writePluginManifests() encounters the Claude manifest without authored provenance or a managed-file marker, then warns and skips it.
A fix likely needs to discover and preserve all publisher-authored native interfaces. The installed-provenance validation also currently rejects multiple fallback runtimes when nativeSource is set, so that invariant would need updating.
Verified with a minimal reproduction across fresh installation, repeated installation, and installed-state reload.
Environment
@sentry/dotagentsversion3.1.0npx -y @sentry/dotagents@3.1.0 --project installSteps to Reproduce
Configure plugins that ship both
.claude-plugin/plugin.jsonand.codex-plugin/plugin.json, without a rootplugin.json:Run:
Run the command again. The same warnings recur.
This also reproduces with a minimal local plugin containing only these two files:
Each file can contain:
{ "name": "dual-native", "version": "1.0.0" }Declare the local plugin with:
Expected Result
Dotagents recognizes both manifests as publisher-authored files belonging to the installed plugin, preserves their runtime-specific content, and emits no unmanaged-manifest warnings.
This should remain true after reinstalling or reloading installed state.
Actual Result
Every install emits:
The Claude manifests remain intact, but dotagents incorrectly treats files it copied from the plugin source as unrecognized files.
Source inspection suggests the following cause:
loadPluginInterfaces()checks native fallback manifests in Codex-first order.authoredNativeInterfaces..dotagents-native-sourceand.dotagents-native-fallbacksrecord onlycodex.writePluginManifests()encounters the Claude manifest without authored provenance or a managed-file marker, then warns and skips it.A fix likely needs to discover and preserve all publisher-authored native interfaces. The installed-provenance validation also currently rejects multiple fallback runtimes when
nativeSourceis set, so that invariant would need updating.Verified with a minimal reproduction across fresh installation, repeated installation, and installed-state reload.