Publishing a package
Build an agent, plugin, skill pack, or adapter and share it through the DorkOS Marketplace.
Publishing a package
This page is for people building something to share, not just installing what's already there. If you want to browse and install packages instead, see Marketplace.
A DorkOS package is a folder with a manifest and some content: skills, hooks, commands, or an agent definition. You scaffold it with the CLI, validate it locally, then either keep it private or submit it to the public registry.
What you can publish
Every package is exactly one of four types:
- Agent - a reusable agent identity: a persona, suggested traits, and starter skills or tasks.
- Plugin - a Claude Code extension: slash commands, hooks, and DorkOS UI extensions (sidebar widgets, dashboard cards, and the like).
- Skill pack - a bundle of
SKILL.mdfiles that teach an agent how to do something, with no commands or hooks attached. - Adapter - a bridge to an external system, like a relay transport for a chat platform or a mesh discovery backend.
Pick the type based on what the package actually does. Defining an agent's identity means agent. Adding commands or UI means plugin. Just teaching a skill means skill-pack. Bridging an outside service means adapter.
Claude Code compatibility, honestly
DorkOS packages are built to be a superset of Claude Code plugins: the registry format and
validator are designed so a package that passes DorkOS validation also passes Claude Code's own
claude plugin validate. We haven't verified every Claude Code feature end to end inside DorkOS,
including every hook type and every MCP (the protocol that lets AI tools call external servers)
option. If your package leans on a specific Claude Code feature, test it in both DorkOS and plain
Claude Code before you publish.
Anatomy of a package
Every package needs a .dork/manifest.json. This is the file DorkOS reads to know what your package is and what it does.
// .dork/manifest.json
{
"schemaVersion": 1,
"name": "my-package", // kebab-case, must match the folder name
"version": "1.0.0", // semver: MAJOR.MINOR.PATCH
"type": "plugin", // "agent" | "plugin" | "skill-pack" | "adapter"
"description": "What it does, one to two sentences.",
"displayName": "My Package", // optional, shown instead of `name` in the UI
"author": "Your Name",
"license": "MIT",
"tags": ["review", "ci"],
"category": "code-quality",
"icon": "🔍",
}name, version, type, and description are required. Everything else is optional. A few fields worth knowing about:
| Field | What it's for |
|---|---|
repository | A URL to your source, shown as a link in the package detail sheet. |
homepage | A URL to docs or a project page, shown the same way. |
minDorkosVersion | The oldest DorkOS version your package needs, if it depends on a recent feature. |
layers | Which content categories the package contributes: skills, hooks, commands, and so on. Used to filter the browse grid. |
requires | Other packages this one depends on, as <type>:<name> (for example adapter:slack). |
featured | Set by the registry maintainers, not by you. Ignore it when authoring. |
Each type adds its own fields on top of the base manifest:
pluginaddsextensions: an array of extension IDs your package registers with the DorkOS extension API (for sidebar widgets, dashboard cards, and similar UI slots).agentaddsagentDefaults: an optionalpersonastring describing the agent, acapabilitieslist, andtraits(each scored 1 to 5):verbosity,autonomy,chaos,creativity,humor, andspice.adapteraddsadapterType, required: a short identifier for what it bridges to, like"discord"or"slack".skill-packadds nothing. The manifest is the whole story.
Packages of every type except agent also need a .claude-plugin/plugin.json, the manifest Claude Code itself reads:
// .claude-plugin/plugin.json
{
"name": "my-package",
"version": "1.0.0",
"description": "What it does."
}Keep the name, version, and description in sync with .dork/manifest.json. If your package also defines Claude Code commands, hooks, or MCP servers, add those fields following Claude Code's own plugin manifest format.
Any skills you write live in a directory-based SKILL.md file, with frontmatter naming the skill and describing what it does:
---
name: my-skill
description: One line describing what this skill does.
kind: skill
---
# My Skill
The instructions your agent follows when it uses this skill.Scaffolding a new package
The dorkos CLI can generate the starting files for you:
dorkos package init my-package --type pluginCreated package at: /path/to/my-package
Files written:
- .dork/manifest.json
- .claude-plugin/plugin.json
- README.md--type accepts agent, plugin, skill-pack, or adapter (defaults to plugin if you leave it out). A few more flags:
dorkos package init my-adapter \
--type adapter \
--parent-dir ./packages \
--description "Bridges DorkOS to Discord" \
--author "Your Name" \
--adapter-type discord--parent-dir chooses where the package folder is created (defaults to your current directory). --adapter-type only matters for adapter packages; it defaults to the package name if you skip it.
If you're chatting with an agent connected to DorkOS instead of using a terminal, it can scaffold a package for you into your personal marketplace (see below) using the same scaffolder under the hood. Either path produces the same files.
Validating locally
Before you go further, check that the manifest and any skills are well-formed:
dorkos package validatePackage: my-package@1.0.0 (plugin)
✓ Package is validIf something's wrong, you get one line per issue with a code you can look up, like MANIFEST_SCHEMA_INVALID or SKILL_INVALID. Warnings (for example, a package folder whose name doesn't match manifest.name) don't block you; errors do. Run it from inside the package folder, or pass a path:
dorkos package validate ./packages/my-packageTrying it out before you publish
Every DorkOS install has a personal marketplace at ~/.dork/personal-marketplace/, created automatically the first time the server starts. It's registered as a source named personal, so anything you drop into its packages/ folder (or scaffold there) is installable right away, without touching the public registry:
dorkos install my-package@personalThis is the fastest loop for iterating: scaffold, edit, validate, install, repeat. Nothing leaves your machine.
You can also register any git repo as your own private source, which is useful for sharing a package across a team before (or instead of) submitting it publicly:
# Add a source pointing at your repo
dorkos marketplace add https://github.com/your-team/marketplace --name your-team
# Confirm it shows up
dorkos marketplace list
# Install a package from it
dorkos install my-package@your-teamA source is just a git repo with a marketplace.json at its root, listing one or more packages. dorkos install <name>@<marketplace> looks up <name> in that specific source; leave off the @<marketplace> part and DorkOS searches every source you have enabled.
Publishing to the public registry
The official marketplace lives in the dork-labs/marketplace repo. Packages there are listed in two files that work together: marketplace.json (the Claude-Code-standard registry format) and a dorkos.json sidecar next to it (DorkOS-specific extras like type, layers, and icon, which Claude Code's schema doesn't allow inline).
Fork and add your package
Fork the repo, then add your package under plugins/<your-package-name>/.
Register it in both files
Add an entry to .claude-plugin/marketplace.json:
{
"name": "my-package",
"source": "./plugins/my-package", // must start with "./plugins/"
"description": "What it does",
"author": { "name": "Your Name" },
"license": "MIT",
}And a matching entry in .claude-plugin/dorkos.json:
{
"my-package": {
"type": "plugin",
"layers": ["skills", "extensions"],
"icon": "🔍",
},
}Validate the registry, not just your package
dorkos package validate ./plugins/my-package
dorkos marketplace validate ./.claude-plugin/marketplace.jsonThe second command checks the whole registry file: your entry's shape, that reserved names weren't used, and that the file still passes Claude Code's own strict schema. Exit code 2 means your entry works for DorkOS but would fail Claude Code's plugin validator, so move the offending field into the dorkos.json sidecar and try again.
Open a pull request
Open a PR against main with both files updated. Once it merges, your package is live: anyone with the dorkos-community source enabled (the default) can find and install it.
Testing end to end
Before you open that PR, run through the install as a stranger would:
- Point a clean DorkOS instance (or one where you've removed the package) at your fork:
dorkos marketplace add https://github.com/you/your-fork --name test. - Install it:
dorkos install my-package@test. - Confirm the permission preview shown before install matches what your package actually does. If it asks for less (or more) than expected, that's a manifest problem, not a DorkOS bug.
- Open a session and confirm your skills, commands, or hooks actually run.
- If you shipped a plugin with extensions, check that it shows up in the right sidebar or dashboard slot.
A package that only validates but was never actually installed and run is not a tested package. The validator checks shape; only a real install checks behavior.