
Dotagents
- 12 installs
- 8.7k repo stars
- Updated August 4, 2026
- getsentry/sentry-javascript
dotagents installs and syncs agent skills from agents.toml.
About
The dotagents skill documents @sentry/dotagents managing agents.toml dependencies installed into .agents/skills with symlinks for Claude, Cursor, Codex, and other agents. Commands include init, install, add with GitHub shorthand or pinned refs, remove, update, sync repairing symlinks, list, and mcp server declarations. Sources support GitHub HTTPS SSH, git remotes, and path local specs. Wildcards install all skills with exclude lists. Trust sections restrict sources. Hooks write tool-event configs. Use npx @sentry/dotagents when CLI not globally installed. --user flag targets ~/.agents scope. Manages agents.toml and agents.lock skill dependencies. Installs skills into .agents/skills with symlinks. add supports GitHub shorthand, pins, and path sources. sync repairs symlinks and adopts orphan skills. Hooks and trust configuration for agent tooling. Synced .agents/skills with lockfile and agent symlinks. User runs dotagents add, sync, install, or init workflows.
- Manages agents.toml and agents.lock skill dependencies.
- Installs skills into .agents/skills with symlinks.
- add supports GitHub shorthand, pins, and path sources.
- sync repairs symlinks and adopts orphan skills.
- Hooks and trust configuration for agent tooling.
Dotagents by the numbers
- 12 all-time installs (skills.sh)
- Ranked #1,453 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
dotagents capabilities & compatibility
- Capabilities
- quick start commands table · source formats table · key concepts symlinks and wildcards
- Works with
- github · sentry
- Use cases
- orchestration · planning
What dotagents says it does
dotagents sync
npx skills add https://github.com/getsentry/sentry-javascript --skill dotagentsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 8.7k |
| Last updated | August 4, 2026 |
| Repository | getsentry/sentry-javascript ↗ |
How do I add skills with dotagents?
Manage agent skill dependencies with dotagents via agents.toml, sync, and multi-agent symlinks.
Who is it for?
Teams standardizing skills across Claude, Cursor, and Codex.
Skip if: Skip for single manual skill copy without manifest.
When should I use this skill?
User runs dotagents add, sync, install, or init workflows.
What you get
Synced .agents/skills with lockfile and agent symlinks.
Files
Manage agent skill dependencies declared in agents.toml. dotagents resolves, installs, and symlinks skills so multiple agent tools (Claude Code, Cursor, Codex, VS Code, OpenCode) discover them from .agents/skills/.
Running dotagents
If dotagents is not available as a direct command, use npx @sentry/dotagents instead. For example: npx @sentry/dotagents sync. All commands and flags work the same way.
References
Read the relevant reference when the task requires deeper detail:
| Document | Read When |
|---|---|
| references/cli-reference.md | Full command options, flags, examples |
| references/configuration.md | Editing agents.toml, source formats, trust, MCP, hooks, wildcards, scopes |
| references/config-schema.md | Exact field names, types, and defaults |
Quick Start
# Initialize a new project (interactive TUI)
dotagents init
# Add a skill from GitHub
dotagents add getsentry/skills find-bugs
# Add multiple skills at once
dotagents add getsentry/skills find-bugs code-review commit
# Add all skills from a repo
dotagents add getsentry/skills --all
# Add a pinned skill
dotagents add getsentry/warden@v1.0.0
# Install all dependencies from agents.toml
dotagents install
# List installed skills
dotagents listCommands
| Command | Description |
|---|---|
dotagents init | Initialize agents.toml and .agents/ directory |
dotagents install | Install all skills from agents.toml |
dotagents add <specifier> | Add a skill dependency |
dotagents remove <name> | Remove a skill |
dotagents update [name] | Update skills to latest versions |
dotagents sync | Reconcile state (adopt orphans, repair symlinks, verify integrity) |
dotagents list | Show installed skills and their status |
dotagents mcp | Add, remove, or list MCP server declarations |
All commands accept --user to operate on user scope (~/.agents/) instead of the current project.
For full options and flags, read references/cli-reference.md.
Source Formats
| Format | Example | Description |
|---|---|---|
| GitHub shorthand | getsentry/skills | Owner/repo (resolves to GitHub HTTPS) |
| GitHub pinned | getsentry/warden@v1.0.0 | With tag, branch, or commit |
| GitHub SSH | git@github.com:owner/repo.git | SSH clone URL |
| GitHub HTTPS | https://github.com/owner/repo | Full HTTPS URL |
| Git URL | git:https://git.corp.dev/team/skills | Any non-GitHub git remote |
| Local path | path:./my-skills/custom | Relative to project root |
Key Concepts
- `.agents/skills/` is the canonical home for all installed skills
- `agents.toml` declares dependencies; `agents.lock` pins exact commits and integrity hashes
- Symlinks:
.claude/skills/,.cursor/skills/point to.agents/skills/ - Wildcards:
name = "*"installs all skills from a source, with optionalexcludelist - Trust: Optional
[trust]section restricts which sources are allowed - Hooks:
[[hooks]]declarations write tool-event hooks to each agent's config - Gitignore: When
gitignore = true, managed skills are gitignored; custom in-place skills are tracked - User scope:
--userflag manages skills in~/.agents/shared across all projects
CLI Reference
Usage
dotagents [--user] <command> [options]Global Flags
| Flag | Description |
|---|---|
--user | Operate on user scope (~/.agents/) instead of current project |
--help, -h | Show help |
--version, -V | Show version |
Commands
init
Initialize a new project with agents.toml and .agents/ directory. Automatically includes the dotagents skill from getsentry/dotagents for CLI guidance, and attempts to install it.
dotagents init
dotagents init --agents claude,cursor
dotagents init --force
dotagents --user init| Flag | Description |
|---|---|
--agents <list> | Comma-separated agent targets (claude, cursor, codex, vscode, opencode) |
--force | Overwrite existing agents.toml |
Interactive mode (when TTY is available):
1. Select agents (multiselect) 2. Manage .gitignore for installed skills? 3. Trust policy: allow all sources or restrict to trusted 4. If restricted: enter trusted GitHub orgs/repos (comma-separated)
install
Install all skill dependencies declared in agents.toml.
dotagents install
dotagents install --frozen
dotagents install --force| Flag | Description |
|---|---|
--frozen | Fail if lockfile is missing or out of sync; do not modify lockfile |
--force | Ignore locked commits and resolve all skills to latest refs |
Workflow:
1. Load config and lockfile 2. Expand wildcard entries (discover all skills from source) 3. Validate trust for each skill source 4. Resolve skills (use locked commits when available) 5. Copy skills into .agents/skills/<name>/ 6. Write/update lockfile with integrity hashes 7. Generate .agents/.gitignore (if gitignore = true) 8. Create/verify agent symlinks 9. Write MCP and hook configs
add <specifier> [skill...]
Add one or more skill dependencies and install them.
dotagents add getsentry/skills # Interactive selection if multiple skills
dotagents add getsentry/skills find-bugs # Add by positional name
dotagents add getsentry/skills find-bugs code-review # Add multiple skills at once
dotagents add getsentry/skills --name find-bugs # Add by --name flag
dotagents add getsentry/skills --skill find-bugs # --skill is an alias for --name
dotagents add getsentry/skills --all # Add all as wildcard
dotagents add getsentry/warden@v1.0.0 # Pinned ref (inline)
dotagents add getsentry/skills --ref v2.0.0 # Pinned ref (flag)
dotagents add git:https://git.corp.dev/team/skills # Non-GitHub git URL
dotagents add path:./my-skills/custom # Local path| Flag | Description |
|---|---|
--name <name> | Specify which skill to add (repeatable; alias: --skill) |
--skill <name> | Alias for --name (repeatable) |
--ref <ref> | Pin to a specific tag, branch, or commit |
--all | Add all skills from the source as a wildcard entry (name = "*") |
Specifier formats:
owner/repo-- GitHub shorthandowner/repo@ref-- GitHub with pinned refhttps://github.com/owner/repo-- GitHub HTTPS URLgit@github.com:owner/repo.git-- GitHub SSH URLgit:https://...-- Non-GitHub git URLpath:../relative-- Local filesystem path
When a repo contains multiple skills, dotagents auto-discovers them. If only one skill is found, it's added automatically. If multiple are found and no names are given, an interactive picker is shown (TTY) or skills are listed (non-TTY).
When adding multiple skills, already-existing entries are skipped with a warning. An error is only raised if all specified skills already exist.
--all and --name/positional args are mutually exclusive.
remove <name>
Remove a skill dependency.
dotagents remove find-bugsRemoves from agents.toml, deletes .agents/skills/<name>/, updates lockfile, and regenerates .gitignore.
For skills sourced from a wildcard entry (name = "*"), interactively prompts whether to add the skill to the wildcard's exclude list. If declined, the removal is cancelled.
update [name]
Update skills to their latest versions.
dotagents update # Update all
dotagents update find-bugs # Update oneSkips skills pinned to immutable commits (40-char SHAs). For wildcard entries, re-discovers all skills in the source -- adds new ones, removes deleted ones. Prints changelog showing old and new commits.
sync
Reconcile project state: adopt orphans, verify integrity, repair symlinks and configs.
dotagents syncActions performed:
1. Adopt orphaned skills (installed but not declared in config) 2. Regenerate .agents/.gitignore 3. Check for missing skills 4. Verify integrity hashes 5. Repair agent symlinks 6. Verify/repair MCP configs 7. Verify/repair hook configs
Reports issues as warnings (modified skills, missing MCP/hook configs) or errors (missing skills).
list
Show installed skills and their status.
dotagents list
dotagents list --json| Flag | Description |
|---|---|
--json | Output as JSON |
Status indicators:
✓ok -- installed, integrity matches~modified -- locally modified since install✗missing -- in config but not installed?unlocked -- installed but not in lockfile
Skills from wildcard entries are marked with a wildcard indicator.
mcp
Manage MCP (Model Context Protocol) server declarations in agents.toml.
mcp add <name>
Add an MCP server declaration.
dotagents mcp add github --command npx --args -y --args @modelcontextprotocol/server-github --env GITHUB_TOKEN
dotagents mcp add remote-api --url https://mcp.example.com/sse --header "Authorization:Bearer token"| Flag | Description |
|---|---|
--command <cmd> | Command to run (stdio transport) |
--args <arg> | Command arguments (repeatable) |
--url <url> | HTTP endpoint URL (HTTP transport) |
--header <Key:Value> | HTTP headers (repeatable) |
--env <VAR> | Environment variable names to pass through (repeatable) |
Either --command or --url is required (mutually exclusive).
mcp remove <name>
Remove an MCP server declaration.
dotagents mcp remove githubmcp list
Show declared MCP servers.
dotagents mcp list
dotagents mcp list --json| Flag | Description |
|---|---|
--json | Output as JSON |
agents.toml Configuration Schema
Top-Level Structure
version = 1 # Required, must be 1
gitignore = true # Optional, default true
agents = ["claude", "cursor"] # Optional, agent targets
[project] # Optional
[trust] # Optional
[[skills]] # Optional, array of skill entries
[[mcp]] # Optional, array of MCP servers
[[hooks]] # Optional, array of hook declarationsTop-Level Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
version | integer | Yes | -- | Schema version, must be 1 |
gitignore | boolean | No | true | Generate .agents/.gitignore for managed skills. |
agents | string[] | No | [] | Agent targets: claude, cursor, codex, vscode, opencode |
Project Section
[project]
name = "my-project" # Optional, display nameSymlinks Section
[symlinks]
targets = [".claude", ".cursor"] # Legacy: explicit symlink targetsWhen agents is set, symlink targets are derived automatically. The [symlinks] section is for backward compatibility.
Skills Section
Regular Skills
[[skills]]
name = "find-bugs" # Required, unique skill identifier
source = "getsentry/skills" # Required, skill source
ref = "v1.0.0" # Optional, pin to tag/branch/commit
path = "tools/my-skill" # Optional, subdirectory within repo| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique identifier. Pattern: ^[a-zA-Z0-9][a-zA-Z0-9._-]*$ |
source | string | Yes | owner/repo, owner/repo@ref, git:url, or path:relative |
ref | string | No | Tag, branch, or commit SHA to pin |
path | string | No | Subdirectory containing the skill within the source repo |
Wildcard Skills
[[skills]]
name = "*" # Wildcard: install all skills from source
source = "getsentry/skills" # Required
ref = "v1.0.0" # Optional
exclude = ["deprecated-skill"] # Optional, skills to skip| Field | Type | Required | Description |
|---|---|---|---|
name | literal "*" | Yes | Wildcard marker |
source | string | Yes | Same formats as regular skills |
ref | string | No | Tag, branch, or commit SHA to pin |
exclude | string[] | No | Skill names to skip. Default: [] |
Trust Section
[trust]
allow_all = true # Allow any source
# OR restrict to specific sources:
[trust]
github_orgs = ["getsentry"] # GitHub org names
github_repos = ["ext-org/repo"] # Exact owner/repo pairs
git_domains = ["git.corp.example.com"] # Git URL domains| Field | Type | Description |
|---|---|---|
allow_all | boolean | Allow all sources (overrides other fields) |
github_orgs | string[] | Allowed GitHub organizations |
github_repos | string[] | Allowed exact owner/repo pairs |
git_domains | string[] | Allowed domains for git: URLs |
No [trust] section = allow all sources (backward compatible).
MCP Section
Stdio Transport
[[mcp]]
name = "github" # Required, unique server name
command = "npx" # Required for stdio
args = ["-y", "@modelcontextprotocol/server-github"] # Optional
env = ["GITHUB_TOKEN"] # Optional, env vars to pass throughHTTP Transport
[[mcp]]
name = "remote-api" # Required, unique server name
url = "https://mcp.example.com/sse" # Required for HTTP| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique server identifier |
command | string | Stdio only | Command to execute |
args | string[] | No | Command arguments |
env | string[] | No | Environment variable names to pass through |
url | string | HTTP only | Server URL |
headers | table | No | HTTP headers |
Hooks Section
[[hooks]]
event = "PreToolUse" # Required
matcher = "Bash" # Optional, tool name filter
command = "my-lint-check" # Required| Field | Type | Required | Description |
|---|---|---|---|
event | string | Yes | PreToolUse, PostToolUse, UserPromptSubmit, Stop |
matcher | string | No | Tool name to match (omit for all tools) |
command | string | Yes | Shell command to execute |
Lockfile (agents.lock)
Auto-generated. Do not edit manually.
version = 1
[skills.find-bugs]
source = "getsentry/skills"
resolved_url = "https://github.com/getsentry/skills.git"
resolved_path = "plugins/sentry-skills/skills/find-bugs"
resolved_ref = "v1.0.0"
commit = "c8881564e75eff4faaecc82d1c3f13356851b6e7"
integrity = "sha256-FWmCLdOj+x+XffiEg7Bx19drylVypeKz8me9OA757js="| Field | Type | Description |
|---|---|---|
source | string | Original source from agents.toml |
resolved_url | string | Resolved git URL |
resolved_path | string | Subdirectory within repo |
resolved_ref | string | Ref that was resolved (omitted for default branch) |
commit | string | Full 40-char SHA of resolved commit |
integrity | string | sha256- prefixed base64 content hash |
Local path skills have source and integrity only (no commit).
Environment Variables
| Variable | Purpose |
|---|---|
DOTAGENTS_STATE_DIR | Override cache location (default: ~/.local/dotagents) |
DOTAGENTS_HOME | Override user-scope location (default: ~/.agents) |
Configuration (agents.toml)
See config-schema.md for the complete schema reference.
Minimal Example
version = 1
agents = ["claude"]
[[skills]]
name = "find-bugs"
source = "getsentry/skills"Skills
Each skill requires name and source. Optionally pin with ref or specify a subdirectory with path.
[[skills]]
name = "find-bugs"
source = "getsentry/skills"
ref = "v1.0.0"
path = "plugins/sentry-skills/skills/find-bugs"Source formats:
| Format | Example | Resolves to |
|---|---|---|
| GitHub shorthand | getsentry/skills | https://github.com/getsentry/skills.git |
| GitHub pinned | getsentry/skills@v1.0.0 | Same, checked out at v1.0.0 |
| GitHub HTTPS | https://github.com/owner/repo | URL used directly |
| GitHub SSH | git@github.com:owner/repo.git | SSH clone |
| Git URL | git:https://git.corp.dev/team/skills | Any non-GitHub git remote |
| Local | path:./my-skills/custom | Relative to project root |
Skill name rules: Must start with alphanumeric, contain only [a-zA-Z0-9._-].
Wildcard Skills
Add all skills from a source with a single entry:
[[skills]]
name = "*"
source = "getsentry/skills"
exclude = ["deprecated-skill"]During install and update, dotagents discovers all skills in the source and installs each one (except those in exclude). Each skill gets its own lockfile entry. Use dotagents add <source> --all to create a wildcard entry from the CLI.
Trust
Restrict which sources are allowed. Without a [trust] section, all sources are allowed.
# Allow all sources explicitly
[trust]
allow_all = true# Restrict to specific GitHub orgs and repos
[trust]
github_orgs = ["getsentry"]
github_repos = ["external-org/specific-repo"]
git_domains = ["git.corp.example.com"]- GitHub sources match against
github_orgs(by owner) orgithub_repos(exact owner/repo) - Git URL sources match against
git_domains - Local
path:sources are always allowed - A source passes if it matches any rule (org OR repo OR domain)
Trust is validated before any network operations in add and install.
MCP Servers
Declare MCP servers that get written to each agent's config.
# Stdio transport
[[mcp]]
name = "github"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
env = ["GITHUB_TOKEN"]
# HTTP transport
[[mcp]]
name = "remote-api"
url = "https://mcp.example.com/sse"
headers = { Authorization = "Bearer token" }MCP configs are written per-agent in the appropriate format:
- Claude:
.mcp.json(JSON) - Cursor:
.cursor/mcp.json(JSON) - Codex:
.codex/config.toml(TOML, shared with other Codex config) - VS Code:
.vscode/mcp.json(JSON) - OpenCode:
opencode.json(JSON, shared)
Hooks
Declare hooks for agent tool events.
[[hooks]]
event = "PreToolUse"
matcher = "Bash"
command = "my-lint-check"Supported events: PreToolUse, PostToolUse, UserPromptSubmit, Stop
Hook configs are written per-agent:
- Claude:
.claude/settings.json(merged into existing file) - Cursor:
.cursor/hooks.json(dedicated file, events mapped to Cursor equivalents) - VS Code:
.claude/settings.json(same file as Claude) - Codex/OpenCode: not supported (warnings emitted during install/sync)
Cursor event mapping:
PreToolUse->beforeShellExecution+beforeMCPExecutionPostToolUse->afterFileEditUserPromptSubmit->beforeSubmitPromptStop->stop
Agents
The agents array controls which agent tools get symlinks and configs.
agents = ["claude", "cursor", "codex", "vscode", "opencode"]Each agent gets:
- A
<agent-dir>/skills/symlink pointing to.agents/skills/(Claude, Cursor) - Or native discovery from
.agents/skills/(Codex, VS Code, OpenCode) - MCP server configs in the agent's config file
- Hook configs (where supported)
Scopes
Project Scope (default)
Operates on the current project. Requires agents.toml at the project root.
User Scope (--user)
Operates on ~/.agents/ for skills shared across all projects. Override with DOTAGENTS_HOME.
dotagents --user init
dotagents --user add getsentry/skills --allUser-scope symlinks go to ~/.claude/skills/ and ~/.cursor/skills/.
When no agents.toml exists and you're not inside a git repo, dotagents falls back to user scope automatically.
Gitignore
When gitignore = true (schema default), dotagents generates .agents/.gitignore listing managed (remote) skills. In-place skills (path:.agents/skills/...) are never gitignored since they must be tracked in git.
When gitignore = false, no gitignore is created -- skills are checked into the repository. Anyone cloning gets skills without running install.
Caching
- Cache location:
~/.local/dotagents/(override withDOTAGENTS_STATE_DIR) - Unpinned repos: cached with 24-hour TTL
- Pinned refs (40-char SHA): cached immutably, never re-fetched
- Use
dotagents install --forceto bypass cache
Troubleshooting
Skills not installing:
- Check
agents.tomlsyntax withdotagents list - Verify source is accessible (
git clonethe URL manually) - Check trust config if using restricted mode
Symlinks broken:
- Run
dotagents syncto repair
Integrity mismatch:
- Skill was modified locally -- run
dotagents install --forceto restore - Or run
dotagents syncto detect and report issues
Related skills
FAQ
What does dotagents do?
dotagents installs and syncs agent skills from agents.toml.
When should I use dotagents?
User runs dotagents add, sync, install, or init workflows.
Is this skill safe to install?
Review the Security Audits panel on this page before installing in production.