Skip to content
Open
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
39f2ef4
feat(plugins): Add universal plugin support
dcramer Jun 30, 2026
d0386f5
feat(plugins): Add universal plugin support
dcramer Jun 30, 2026
31658d0
fix(plugins): Keep marketplace metadata out of manifests
dcramer Jun 12, 2026
05da4c1
fix(plugins): Tighten plugin sync diagnostics
dcramer Jun 12, 2026
eaa6646
fix(plugins): Separate canonical marketplaces
dcramer Jun 30, 2026
3c1e617
fix(plugins): Generate Claude-native plugin manifests
dcramer Jun 30, 2026
d5873a8
fix(plugins): Generate Codex marketplace catalogs
dcramer Jun 30, 2026
4b1420a
docs(qa): Document runtime gateway QA
dcramer Jun 30, 2026
0f24c97
docs(qa): Document OpenCode runtime proof
dcramer Jun 13, 2026
26e00b8
fix(plugins): Generate Cursor plugin manifests
dcramer Jun 13, 2026
cbed6b9
fix(plugins): Tighten runtime plugin projections
dcramer Jun 30, 2026
22cbc28
docs(qa): Clarify OpenCode plugin proof
dcramer Jun 13, 2026
f51b252
test(plugins): Cover same-project plugin detection
dcramer Jun 15, 2026
691e1eb
ref(dotagents): Split agent runtime concerns
dcramer Jun 30, 2026
af170f5
fix(dotagents): Address plugin review feedback
dcramer Jun 16, 2026
1da2f0d
fix(dotagents): Omit Claude plugin agents
dcramer Jun 30, 2026
9e1fff0
fix(dotagents): Project plugin components for OpenCode and Pi
dcramer Jun 30, 2026
7bc2ed1
fix(dotagents): Preserve plugin skill gitignore boundaries
dcramer Jun 16, 2026
8b62f87
fix(dotagents): Constrain plugin projection paths
dcramer Jun 16, 2026
2b376da
fix(dotagents): Cover plugin path boundary cases
dcramer Jun 16, 2026
f35c72b
fix(dotagents): Preserve same-project plugin gitignore state
dcramer Jun 16, 2026
862f13c
fix(dotagents): Guard plugin install destinations
dcramer Jun 29, 2026
379d679
fix(dotagents): Address plugin support review feedback
dcramer Jun 30, 2026
d63f2a4
fix(dotagents): Harden plugin install recovery
dcramer Jun 30, 2026
0173137
fix(dotagents): Remove shared skill and plugin names
dcramer Jun 30, 2026
0d3b587
fix(dotagents): Clean up unlocked plugin removals
dcramer Jun 30, 2026
51dddf6
test(dotagents): Thin plugin QA coverage
dcramer Jun 30, 2026
3cbbbcd
fix(dotagents): Emit relative plugin marketplace paths
dcramer Jul 7, 2026
27aec99
fix(dotagents): Resolve nested plugin marketplace paths
dcramer Jul 7, 2026
a3918cf
fix(dotagents): Keep extension marketplace paths strict
dcramer Jul 7, 2026
f97cc67
fix(dotagents): Skip unsupported plugin marketplace sources
dcramer Jul 7, 2026
3d25295
test(dotagents): Cover matching unsupported marketplace entries
dcramer Jul 7, 2026
3601245
fix(dotagents): Report concurrent plugin doctor errors
dcramer Jul 7, 2026
095e354
fix(dotagents): Preserve plugin backup on failed rollback
dcramer Jul 7, 2026
b61ec32
test(dotagents): Cover missing plugin source roots
dcramer Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ docs/.astro/
agents.lock
.agents/.gitignore

# Local QA credentials
.env.qa.local

# openspec local install artifacts (per-machine, not project source)
openspec/
.agents/skills/openspec-*/
Expand Down
35 changes: 25 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# dotagents

Shared tooling for coding agents. Declare skills, MCP servers, hooks, and subagents in `agents.toml` — dotagents wires them into every agent tool on your team.
Shared tooling for coding agents. Declare skills, MCP servers, hooks, subagents, and plugins in `agents.toml` — dotagents wires them into every agent tool on your team.

## Why dotagents?

**One source of truth.** Skills live in `.agents/skills/` and symlink into `.claude/skills/` or wherever your tools expect them. Cursor shares Claude-compatible skills. No copy-pasting between directories.

**One command to install.** `agents.toml` is committed, managed skills and canonical installed subagents under `.agents/` are gitignored. Collaborators run `dotagents install` to fetch or refresh local agent state.
**One command to install.** `agents.toml` is committed, managed skills, canonical installed subagents, and managed plugin bundles under `.agents/` are gitignored. Collaborators run `dotagents install` to fetch or refresh local agent state.

**Shareable.** Skills are directories with a `SKILL.md`. Host them in any git repo, discover them automatically, install with one command.

**Multi-agent.** Configure Claude, Cursor, Codex, VS Code, and OpenCode from a single `agents.toml` -- skills, MCP servers, hooks, and subagents where supported. Pi reads `.agents/skills/` directly.
**Multi-agent.** Configure Claude, Cursor, Codex, Grok, VS Code, and OpenCode from a single `agents.toml` -- skills, MCP servers, hooks, subagents, and plugins where supported. Pi reads `.agents/skills/` directly.

## Quick Start

Expand All @@ -31,9 +31,9 @@ npx @sentry/dotagents add getsentry/skills find-bugs code-review commit
npx @sentry/dotagents add getsentry/skills --all
```

This creates an `agents.toml` at your project root and an `agents.lock` tracking installed skills and subagents.
This creates an `agents.toml` at your project root and an `agents.lock` tracking installed skills, subagents, and plugins.

After cloning a project that already has `agents.toml`, run `install` to fetch skills and subagents. Run it again to refresh managed local state:
After cloning a project that already has `agents.toml`, run `install` to fetch skills, subagents, and plugins. Run it again to refresh managed local state:

```bash
npx @sentry/dotagents install
Expand All @@ -45,9 +45,9 @@ npx @sentry/dotagents install
|---------|-------------|
| `init` | Create `agents.toml` and `.agents/skills/` |
| `add <source> [skills...]` | Add skill dependencies |
| `remove <name\|source> [-y]` | Remove a skill or all skills from a source |
| `remove <name\|source> [-y]` | Remove a skill, plugin, or all dependencies from a source |
| `install` | Install all dependencies from `agents.toml` |
| `list` | Show installed skills and their status |
| `list` | Show declared skills, plugins, and their status |
| `sync` | Reconcile state offline: adopt local skills, prune stale managed ones, repair configs |
| `mcp` | Manage MCP server declarations |
| `trust` | Manage trusted sources |
Expand Down Expand Up @@ -92,14 +92,15 @@ Shorthand (`owner/repo`) resolves to GitHub by default. Set `defaultRepositorySo
The `agents` field tells dotagents which tools to configure:

```toml
agents = ["claude", "cursor", "codex", "opencode"]
agents = ["claude", "cursor", "codex", "grok", "opencode", "pi"]
```

| Agent | Config Dir | MCP Config | Hooks | Subagents |
|-------|-----------|------------|-------|-----------|
| `claude` | `.claude` | `.mcp.json` | `.claude/settings.json` | `.claude/agents/*.md` |
| `cursor` | `.cursor` | `.cursor/mcp.json` | `.cursor/hooks.json` | `.cursor/agents/*.md` |
| `codex` | `.codex` | `.codex/config.toml` | -- | `.codex/agents/*.toml` |
| `grok` | `.grok` | -- | -- | -- |
| `vscode` | `.vscode` | `.vscode/mcp.json` | `.claude/settings.json` | -- |
| `opencode` | `.opencode` | `opencode.json` | -- | `.opencode/agents/*.md` |

Expand Down Expand Up @@ -127,11 +128,25 @@ Review the current diff and return findings with file references.

dotagents can also import native runtime subagent files from `.claude/agents/`, `.cursor/agents/`, `.codex/agents/*.toml`, and `.opencode/agents/`. Input and matching-runtime output use the same native format: Markdown with YAML frontmatter for Claude, Cursor, and OpenCode; TOML for Codex. Claude and Codex identify agents by `name`, Cursor can derive `name` from the filename when omitted, and OpenCode uses the filename as the agent name. Multiple portable matches for the same subagent are rejected as ambiguous, while matching native runtime artifacts are merged. When the source format matches a target runtime, dotagents reuses the native source content for that runtime and only adds its managed-file marker. Other runtimes are generated from the portable `name`, `description`, and instructions. Subagent declarations intentionally cover only dependency source and runtime targets, not universal model/tool/permission behavior.

[Pi](https://github.com/badlogic/pi-mono) reads `.agents/skills/` natively and needs no configuration.
Plugins are declared with `[[plugins]]` entries. dotagents installs canonical bundles into `.agents/plugins/<name>/` and generates runtime plugin outputs such as `.claude-plugin/marketplace.json`, `.agents/plugins/<name>/.claude-plugin/plugin.json`, `.cursor-plugin/marketplace.json`, `.agents/plugins/<name>/.cursor-plugin/plugin.json`, `.agents/plugins/marketplace.json`, `.agents/plugins/<name>/.codex-plugin/plugin.json`, `.grok/plugins/<name>/`, `.opencode/skills/<skill>/`, `.opencode/agents/<agent>.md`, and Pi skill links under `.agents/skills/<skill>/` where supported:

```toml
[[plugins]]
name = "review-tools"
source = "getsentry/agent-plugins"
path = "plugins/review-tools"
targets = ["claude", "cursor", "codex", "grok", "opencode", "pi"]
```

The canonical plugin format is `.agents/plugins/marketplace.json` plus `.agents/plugins/<name>/plugin.json`, using a Codex-compatible marketplace baseline. Known input fields are validated, component paths must be relative filesystem paths, unknown manifest extension fields are preserved in installed bundles, marketplace extension fields are accepted but not projected, `targets` are limited to configured agents, and generated outputs are deterministic. dotagents rejects plugin sources that resolve to the same project's `.agents/plugins/<name>/` install destination, so same-repo plugins are never installed onto themselves. Existing plugin install destinations are overwritten only when `agents.lock` proves they are managed by dotagents.

Plugin declarations are project-scope only for now. `dotagents --user install` rejects `[[plugins]]` entries because user-scope runtime plugin projections are not generated yet.

[Pi](https://github.com/badlogic/pi-mono) reads `.agents/skills/` natively. Normal skills need no Pi-specific configuration; plugin bundles can target `pi` when their `skills/` components should be exposed there.

## Documentation

For the full guide -- including MCP servers, hooks, subagents, trust policies, wildcard skills, user scope, and CI setup -- see the [documentation site](https://dotagents.sentry.dev).
For the full guide -- including MCP servers, hooks, subagents, plugins, trust policies, wildcard skills, user scope, and CI setup -- see the [documentation site](https://dotagents.sentry.dev).

## Contributing

Expand Down
Loading
Loading