Contributing a Plugin
Two ways in, matching the two tiers. Pick the one that fits.
Before you start
A plugin is a directory with a manifest plus asset folders:
my-plugin/
├── .atomcode-plugin/plugin.json # manifest (name, version, asset paths)
├── README.md # what it does, how to use
├── skills/<skill>/SKILL.md # a skill = frontmatter + markdown body
└── commands/<cmd>.md # a slash command = a prompt template
Currently AtomCode loads skills and commands from plugins. Hooks parse but aren't executed from plugins yet; agents and MCP servers are not loaded from plugins yet. The validator will warn if your plugin's only assets are types the engine can't load today — don't ship those as verified until the engine catches up.
Skills and commands follow the same format AtomCode uses everywhere
(Claude Code-compatible). A SKILL.md needs YAML frontmatter with at
least name and description; a command .md is a prompt template that
can use $ARGUMENTS, $1, ${CLAUDE_SKILL_DIR}, and !`shell`
preprocessing.
Path A — Verified (source lives here)
Best for small, general-purpose, audited plugins.
cp -r templates/plugin-template plugins/<your-plugin>- Edit the manifest, README, and assets.
- Add a catalog entry to
.atomcode-plugin/marketplace.json:{ "name": "<your-plugin>", "source": "plugins/<your-plugin>", "description": "One line.", "tier": "verified", "version": "0.1.0", "keywords": ["..."], "author": { "name": "you", "url": "https://..." } } python3 scripts/validate.py— must exit 0.- Open a PR. A code owner reviews
plugins/**; CI must be green.
By submitting verified, you agree your plugin is MIT-licensed like this repo, and that maintainers may edit or remove it.
Path B — Community (source stays in your repo)
Best when you want to keep ownership/release cadence in your own repo.
- Publish your plugin in your own git repository.
- Tag a release (or pick a commit) — you must pin it.
- Add a catalog entry pointing at it, with
tier:"community":({ "name": "<your-plugin>", "source": { "source": "github", "repo": "you/your-repo", "tag": "v1.0.0" }, "description": "One line.", "tier": "community", "version": "1.0.0", "keywords": ["..."], "author": { "name": "you", "url": "https://github.com/you" } }sourcealso accepts{"source":"url","url":"...","commit":"<sha>"}for non-GitHub hosts. Atagorcommitis required — bare branches are rejected.) python3 scripts/validate.py— must exit 0.- Open a PR. A maintainer reviews your pinned revision.
To ship a new version later, open a PR that bumps the tag/commit. We
re-review at the new pin. We will not advance your pin for you, and users
never auto-track your branch — see SECURITY.md.
Naming
name must match ^[a-zA-Z0-9._-]+$ and be unique in the catalog. Use a
clear, specific name (commit-craft, not tools).