Quick Start
The following example creates a minimal plugin containing a single Skill and installs it from a local directory.1. Create the plugin directory
2. Write the manifest
Declaring aplugin.json is recommended for every plugin so it has stable metadata; at minimum include name (see Manifest Fields below):
~/my-plugin/.qoder-plugin/plugin.json:
3. Add a Skill
~/my-plugin/skills/hello/SKILL.md:
4. Install
Plugin "my-plugin@local" installed successfully. Run /plugins reload to apply., restart the CLI or run /plugins reload in the TUI to start using the Skill.
Plugin Directory Layout
.qoder-plugin/plugin.json is the recommended location for the manifest. When omitted, the CLI still loads the directory by convention and uses the directory name as the plugin name. Convention directories are auto-discovered when present, otherwise ignored.
Agents shipped in
agents/ can also declare isolation: worktree, which is useful for implementation Subagents that should run in an isolated copy.
Manifest Fields
Onlyname is required in plugin.json; other fields are optional.
Advanced: the manifest can also explicitly declarecommands/agents/skills/hooks/outputStylesto override the default directory conventions or use inline content (note the manifest field uses camelCaseoutputStyles, while the convention directory remainsoutput-styles/). When not declared, the CLI auto-discovers via the conventions above.
Installation Scope
Plugins can be installed at three scopes:Commands
Plugin commands live under theqodercli plugins subcommand group, aliased as plugin.
Install: plugins install
Install a plugin from a local directory path:
After installation, restart the CLI or run
/plugins reload in the TUI to apply changes.
Uninstall: plugins uninstall
remove / rm.
Enable / Disable: plugins enable / plugins disable
Enable / disable is implemented by updating the
enabledPlugins field in the corresponding settings.json. Disabled plugins are not loaded in new sessions.
List: plugins list
Validate: plugins validate
Validate that a local plugin directory matches the conventions; useful during development:
validate does not fail in that case — but plugins install for a local plugin requires at least one recognizable component or resource (either a convention directory or a resource explicitly declared in the manifest).
Recommended: always declarename,version, etc. in.qoder-plugin/plugin.json. This is the recommended way to organize a Qoder plugin — without it, the plugin can only be identified by its directory name inplugins list,enabledPlugins, and other places, which is fragile across environments.
The enabledPlugins Setting
Enable / disable state is stored in the enabledPlugins field of settings.json:
true: enables the pluginfalse: explicitly disables the plugin
The configuration key must match the installed plugin ID exactly (locally installed plugins have IDs of the formPrefername@local). Runplugins listto see each plugin’s identifier.
plugins enable / plugins disable over hand-editing this field — the commands handle scope selection, dependency resolution, and other details for you.
Writing Plugin Hooks
A plugin may declare its own Hooks inhooks/hooks.json. The file uses a wrapped shape: a top-level object with a hooks field whose value matches the hooks field in settings.json:
Note this differs fromWhen executed, plugin Hooks receive two extra environment variables:settings.json:settings.jsonuses the barehooksfield, while a plugin’shooks/hooks.jsonrequires the extra{ "hooks": ... }wrapper.
See Hooks for more on writing Hooks.
Marketplace
A marketplace is a centralized distribution source for plugins. By adding a marketplace, you can browse and install published plugins without managing local directories manually.Add a Marketplace
Multiple source formats are supported:List Configured Marketplaces
Update a Marketplace
Refresh the plugin catalog from the source:Remove a Marketplace
Install Plugins from a Marketplace
Once a marketplace is added, install plugins by name:name@marketplace-name.