Skip to content

Plugin System

The plugin system allows extending Octipus’s capabilities by dropping plugins into the extensions/ directory. Each plugin provides tools that are automatically registered and available to agents.

extensions/
my-plugin/
plugin.json # Manifest (required)
index.ts # Entry file (required)
{
"name": "my-plugin",
"version": "1.0.0",
"description": "Does something useful",
"author": "Your Name",
"main": "index.ts",
"tools": [
{
"name": "my_tool",
"description": "Does a specific thing",
"parameters": {
"input": { "type": "string", "description": "The input", "required": true }
}
}
]
}
export default {
name: 'my-plugin',
async initialize(context) {
context.logger.info('Plugin loaded');
},
tools: {
async my_tool(args) {
return { result: `Processed: ${args.input}` };
},
},
async shutdown() {},
};
  1. At startup, the loader scans extensions/ for directories with plugin.json
  2. Manifests are validated (name, version, description, main, tools)
  3. Entry files are dynamically imported
  4. initialize() is called with a logger context
  5. Each plugin is wrapped as a BaseTool and registered with the tool registry
  6. Plugin tools become available to agents as plugin-<name>__<tool_name>
MethodPathDescription
GET/api/pluginsList all loaded plugins
GET/api/plugins/:namePlugin details
POST/api/plugins/:name/reloadHot-reload from disk

Skills can be exported and imported for sharing between instances:

MethodPathDescription
GET/api/skills/exportExport skills as JSON or markdown
GET/api/skills/:id/exportExport single skill
POST/api/skills/importImport skills with conflict handling

Markdown format uses YAML frontmatter for metadata and structured sections for principles, best practices, and anti-patterns.