| name | marketplace-dev |
| description | Develop, validate, and publish DorkOS marketplace packages โ agents, plugins, skill-packs, and adapters. Use when creating marketplace items, working in the dork-labs/marketplace repo, or helping users build packages for the personal marketplace. |
Marketplace Package Development
Build packages that work for both DorkOS and Claude Code. Every package must pass dorkos package validate before submission.
When to Use
| Signal | Example | Action |
|---|
| Creating a new marketplace item | "create a code-review agent for the marketplace" | Scaffold with dorkos package init, fill manifest, write skills |
| Working in the marketplace repo | Any work in dork-labs/marketplace | Follow same-repo monorepo conventions (ADR-0237) |
| Building a personal package | "I want to make a skill pack for my workflow" | Scaffold in ~/.dork/personal-marketplace/packages/ |
| Fixing validation errors | dorkos package validate fails | Diagnose using issue codes below |
| Adding to the registry | "publish this to the marketplace" | Add entries to marketplace.json + dorkos.json sidecar |
Package Types
There are exactly 5 types. Choose based on what the package delivers:
| Type | What It Is | Has .claude-plugin/plugin.json? | Key Directories |
|---|
agent | Reusable agent definition with persona, skills, tasks | No | .claude/skills/, .dork/tasks/ |
plugin | Claude Code extension with commands, hooks, UI | Yes | skills/, hooks/, commands/ |
skill-pack | Bundle of SKILL.md files providing reusable expertise | Yes | skills/ |
adapter | Integration bridge (relay transport, mesh discovery) | Yes | .dork/adapters/ |
shape | A "place" composing packages, agents, schedules, and chrome | Yes | extensions/ |
Decision rule: If it defines an agent identity (persona, traits) โ agent. If it adds UI slots or commands โ plugin. If it's just skills โ skill-pack. If it bridges an external service โ adapter. If it composes existing packages, agents, schedules, and workspace chrome into a switchable place โ shape.
Scaffolding
dorkos package init <name> [--type agent|plugin|skill-pack|adapter|shape] \
[--parent-dir <path>] [--description <text>] [--author <text>] [--adapter-type <id>]
--type defaults to plugin
--parent-dir defaults to cwd
--adapter-type only meaningful for adapters; defaults to package name
What Gets Created
All types:
.dork/manifest.json โ DorkOS package manifest (schemaVersion 1, version 0.0.1, MIT)
README.md
plugin/skill-pack/adapter/shape additionally:
.claude-plugin/plugin.json โ CC-compatible manifest stub
Type-specific directories:
| Type | Directories Created | Manifest layers |
|---|
plugin | skills/, hooks/, commands/ | ['skills', 'extensions'] |
skill-pack | skills/ | ['skills'] |
adapter | .dork/adapters/ | ['adapters'] |
agent | .claude/skills/, .dork/tasks/ | ['skills', 'tasks', 'agents'] |
shape | extensions/ | ['extensions', 'agents', 'tasks'] |
Manifest Reference
.dork/manifest.json (Required for all types)
{
"schemaVersion": 1,
"name": "my-package",
"version": "1.0.0",
"type": "plugin",
"description": "What it does",
"displayName": "My Package",
"author": "Dork Labs",
"license": "MIT",
"tags": ["review", "ci"],
"category": "code-quality",
"icon": "๐",
"layers": ["skills"],
"requires": ["adapter:slack"],
"featured": false,
}
Layer enum: skills, tasks, commands, hooks, extensions, adapters, mcp-servers, lsp-servers, agents
Requires format: <type>:<name>[@<version>] โ e.g., adapter:slack@^1.0.0, plugin:linear-integration
Type-Specific Fields
Agent โ adds agentDefaults:
{
"type": "agent",
"agentDefaults": {
"persona": "A security-focused code reviewer",
"capabilities": ["code-review", "security"],
"traits": {
"tone": 3,
"autonomy": 4,
"caution": 5,
"communication": 2,
"creativity": 2,
},
},
}
Plugin โ adds extensions:
{
"type": "plugin",
"extensions": ["my-sidebar-widget"],
}
Adapter โ adds adapterType (required):
{
"type": "adapter",
"adapterType": "discord",
}
Skill-pack โ no additional fields.
.claude-plugin/plugin.json (Required for plugin, skill-pack, adapter, shape)
{
"name": "my-package",
"version": "1.0.0",
"description": "What it does"
}
Keep this minimal and in sync with .dork/manifest.json. Real CC plugins may also declare commands, agents, hooks, mcpServers, lspServers here.
SKILL.md Files
Skills live in directory-based format: <skill-name>/SKILL.md
---
name: example-skill
description: An example skill for this package.
kind: skill
---
# Example Skill
Content here.
Frontmatter fields:
name โ kebab-case, matches directory name
description โ one-line human-readable description
kind โ skill | task | command (marketplace authors SHOULD include explicitly)
- For tasks:
cron field for scheduling
Skill directories scanned by validator (in order):
skills/, tasks/, commands/, .claude/skills/, .claude/commands/, .dork/tasks/
Validation
dorkos package validate [path]
Pipeline (in order, stops early on errors)
| Step | Check | Error Code | Severity |
|---|
| 1 | .dork/manifest.json exists (or .claude-plugin/plugin.json for CC fallback) | MANIFEST_MISSING | Error (early return) |
| 2 | JSON parses | MANIFEST_INVALID_JSON | Error (early return) |
| 3 | Passes Zod schema | MANIFEST_SCHEMA_INVALID | Error (early return) |
| 4 | .claude-plugin/plugin.json exists (when type requires it) | CLAUDE_PLUGIN_MISSING | Error |
| 5 | All SKILL.md files valid | SKILL_INVALID | Error (per skill) |
| 6 | Directory name matches manifest.name | NAME_DIRECTORY_MISMATCH | Warning |
Exit codes: 0 = pass (warnings OK), 1 = errors found
Common Validation Fixes
| Error Code | Typical Cause | Fix |
|---|
MANIFEST_MISSING | No .dork/ directory | Run dorkos package init or create manually |
MANIFEST_SCHEMA_INVALID | Bad name (uppercase), bad version (not semver), missing type | Fix the specific field โ name must be kebab-case, version must be X.Y.Z |
CLAUDE_PLUGIN_MISSING | Plugin/skill-pack/adapter/shape missing CC manifest | Create .claude-plugin/plugin.json with name, version, description |
SKILL_INVALID | SKILL.md missing frontmatter or invalid fields | Add --- frontmatter block with name, description, kind |
NAME_DIRECTORY_MISMATCH | Directory named differently than manifest.name | Rename directory or update manifest.name (warning only) |
Registry Format (Official Marketplace)
The official marketplace at dork-labs/marketplace uses a same-repo monorepo pattern (ADR-0237). Two registry files work together:
.claude-plugin/marketplace.json (CC-standard)
{
"name": "dorkos",
"owner": { "name": "Dork Labs", "email": "hello@dorkos.ai" },
"metadata": {
"description": "Official marketplace for DorkOS",
"version": "0.1.0",
"pluginRoot": "./plugins",
},
"plugins": [
{
"name": "my-package",
"source": "./plugins/my-package",
"description": "What it does",
"author": { "name": "Author Name" },
"license": "MIT",
"category": "code-quality",
"tags": ["review", "ci"],
"keywords": ["code-review"],
},
],
}
Critical: Source paths MUST start with "./plugins/<name>" โ the pluginRoot field is ignored when source starts with ./.
.claude-plugin/dorkos.json (DorkOS sidecar โ ADR-0236)
{
"$schema": "https://dorkos.ai/schemas/dorkos-marketplace.schema.json",
"schemaVersion": 1,
"plugins": {
"my-package": {
"type": "agent",
"layers": ["agents", "tasks"],
"icon": "๐",
"featured": true,
"pricing": { "model": "free" },
},
},
}
Why separate files? CC enforces additionalProperties: false on plugin entries. Any inline DorkOS field is rejected. The sidecar is the only safe extension mechanism.
Drift rules:
- Plugin in marketplace.json but not dorkos.json โ defaults to
type: 'plugin' (not an error)
- Plugin in dorkos.json but not marketplace.json โ orphan, silently dropped (logged as warning)
- dorkos.json missing entirely โ all entries get default type (not an error)
Source Path Forms (for community packages in separate repos)
| Form | Example |
|---|
| Relative path | "./plugins/code-reviewer" |
| GitHub | { "source": "github", "repo": "owner/repo", "ref": "main" } |
| URL | { "source": "url", "url": "https://gitlab.com/foo/bar.git" } |
| Git subdirectory | { "source": "git-subdir", "url": "https://...", "path": "packages/plugin-a" } |
| npm | { "source": "npm", "package": "@scope/name", "version": "^1.0.0" } (not yet supported) |
Submission Flow (Official Marketplace)
- Scaffold:
dorkos package init <name> --type <type> --parent-dir ./plugins
- Author: Fill
.dork/manifest.json, write skills/hooks/commands, write README
- Validate locally:
dorkos package validate ./plugins/<name> โ must exit 0
- Add registry entry: Add to
.claude-plugin/marketplace.json plugins array with "source": "./plugins/<name>"
- Add sidecar entry: Add to
.claude-plugin/dorkos.json plugins object with type, layers, icon, pricing
- Validate registry:
dorkos marketplace validate .claude-plugin/marketplace.json
- Open PR against
main of dork-labs/marketplace
Registry Validation Checks
The marketplace validator performs 6 checks:
- Fetch/read marketplace.json and dorkos.json
- DorkOS schema validation (passthrough โ any CC-valid marketplace accepted)
- Sidecar schema validation (strict when present)
- CC compatibility check (ported CC validator)
- Plugin sources reachable (probes each plugin's
.claude-plugin/plugin.json)
- Reserved-name check (marketplace name not in reserved list)
Exit codes: 0 = pass, 1 = schema/validation error, 2 = CC validator fails or sources unreachable
Personal Marketplace (Local Development)
For iterating before official submission:
- Location:
~/.dork/personal-marketplace/
- Auto-bootstrapped on server boot with
marketplace.json, README.md, packages/ subdirectory
- Registered as
file:// source named personal
- Create via MCP:
marketplace_create_package tool scaffolds directly into personal marketplace
Workflow: Scaffold in personal marketplace โ iterate โ validate โ move to official repo for submission.
Extension API (Plugin Type Only)
Plugins can register UI extensions. Available slots:
| Slot | Purpose |
|---|
sidebar.footer | Footer area of left sidebar |
dashboard.sections | Dashboard widget grid |
command-palette.items | Command palette entries |
dialog | Modal dialog slots |
settings.tabs | Settings dialog tabs |
right-panel | Shell-level right panel (inspector) tabs |
The sidebar.tabs and header.actions slots were removed when the web cockpit
retired the sidebar tab strip. For a contextual side panel use right-panel;
for a dashboard card use dashboard.sections.
Extensions receive an ExtensionAPI object with methods for:
registerComponent(slot, id, component, options?) โ place React component in a slot
registerCommand(id, label, callback, options?) โ add command palette item
registerDialog(id, component) โ register modal dialog
registerSettingsTab(id, label, component) โ add settings tab
getState() / subscribe(selector, callback) โ read and watch host state (cwd, activeSession, agent)
loadData<T>() / saveData<T>(data) โ scoped persistent storage
notify(message, options?) โ show toast notifications
navigate(path) โ client-side navigation
executeCommand(command) โ execute UI commands
openCanvas(content) โ open canvas with content
Declare extension IDs in the manifest: "extensions": ["my-extension-id"]
Anti-Patterns
| Don't | Do Instead |
|---|
| Put DorkOS fields in marketplace.json plugin entries | Use dorkos.json sidecar |
Use "source": "code-reviewer" (relative to pluginRoot) | Use "source": "./plugins/code-reviewer" (explicit path) |
Skip .claude-plugin/plugin.json for non-agent types | Always create it โ validation will fail without it |
| Use uppercase or underscores in package names | Use kebab-case: my-cool-plugin |
| Leave SKILL.md without frontmatter | Always include name, description, kind in --- block |
Set version to non-semver strings | Use X.Y.Z format (e.g., 0.1.0, 1.0.0) |
| Forget to add both registry entries | Always update both marketplace.json AND dorkos.json |
Canonical Examples
Minimal Agent Package
my-agent/
โโโ .dork/
โ โโโ manifest.json โ type: "agent", agentDefaults: { persona: "..." }
โโโ .claude/
โ โโโ skills/
โ โโโ my-skill/
โ โโโ SKILL.md
โโโ .dork/
โ โโโ tasks/
โโโ README.md
Minimal Plugin Package
my-plugin/
โโโ .dork/
โ โโโ manifest.json โ type: "plugin", extensions: ["my-widget"]
โโโ .claude-plugin/
โ โโโ plugin.json
โโโ skills/
โ โโโ helper-skill/
โ โโโ SKILL.md
โโโ hooks/
โโโ commands/
โโโ README.md
Minimal Skill-Pack
my-skills/
โโโ .dork/
โ โโโ manifest.json โ type: "skill-pack"
โโโ .claude-plugin/
โ โโโ plugin.json
โโโ skills/
โ โโโ skill-one/
โ โ โโโ SKILL.md
โ โโโ skill-two/
โ โโโ SKILL.md
โโโ README.md
Minimal Adapter
my-adapter/
โโโ .dork/
โ โโโ manifest.json โ type: "adapter", adapterType: "discord"
โโโ .claude-plugin/
โ โโโ plugin.json
โโโ .dork/
โ โโโ adapters/
โโโ README.md