Skip to main content

Extension Development

Build extensions for Ultra-Dex — CLI plugins, AI providers, integrations, and IDE extensions.

Extension Types

TypeLocationRuntime
CLI Pluginspackages/plugins/Node.js ESM
AI Providerssrc/services/ai-providers/Node.js ESM
Integrationsapps/cli/lib/integrations/Commander.js
VS Codepackages/extensions/vscode/VS Code API
JetBrainspackages/plugins/jetbrains/Kotlin
Neovimpackages/plugins/neovim/Lua
Cursorpackages/plugins/cursor/Cursor Rules

Creating a Plugin

1. Structure

packages/plugins/my-plugin/
├── manifest.json
├── index.js
└── README.md

2. Manifest

{
"name": "my-plugin",
"version": "1.0.0",
"description": "My Ultra-Dex plugin",
"main": "index.js",
"capabilities": ["custom-task"],
"requiredPermissions": ["file-read", "ai-chat"]
}

3. Implementation

export default class MyPlugin {
constructor(context) {
this.context = context;
}

async activate() { console.log('Plugin activated'); }

async execute(task) {
const provider = this.context.getProvider();
const result = await provider.chat([
{ role: 'user', content: task.prompt }
]);
return { output: result.content };
}

async deactivate() { console.log('Plugin deactivated'); }
}

Creating a Provider

See the Provider Spec for the full interface contract.

import { BaseProvider } from '../../src/services/ai-providers/base-provider.js';

export class MyProvider extends BaseProvider {
constructor(config = {}) {
super('myprovider', {
baseUrl: 'https://api.myprovider.com/v1',
defaultModel: 'my-model',
...config,
});
}

async chat(messages, options = {}) { /* implement */ }
async *stream(messages, options = {}) { /* implement */ }
async embed(input) { /* implement */ }
}