Skip to main content

Plugin Categories & Capabilities

Every plugin in the Ever Works platform declares a category and one or more capabilities. The category determines how the platform classifies and displays the plugin, while capabilities define the interfaces the plugin implements and the operations it can perform.

Plugin Categories

Categories are defined as a single source of truth in @ever-works/plugin via the PLUGIN_CATEGORIES constant:

const PLUGIN_CATEGORIES = [
'git-provider',
'deployment',
'screenshot',
'search',
'content-extractor',
'data-source',
'ai-provider',
'pipeline',
'form',
'integration',
'utility',
'theme'
] as const;

type PluginCategory = (typeof PLUGIN_CATEGORIES)[number];

Each plugin declares exactly one category. The category is set on the plugin class and included in the plugin manifest.

Category Overview

CategoryDescriptionExample Plugins
ai-providerProvides AI model access for content generationOpenAI, Anthropic, Google, Groq, Ollama, Mistral, OpenRouter, Perplexity, Vercel AI Gateway
searchWeb search for discovering work itemsExa, Tavily, SerpAPI, Brave
content-extractorExtracts structured content from URLsJina, Firecrawl, Local Content Extractor, Notion Extractor, PDF Extractor
screenshotCaptures website screenshotsScreenshotOne, Urlbox, Scrapfly
git-providerGit hosting API operations and local gitGitHub
deploymentDeploys generated works to hosting platformsVercel
data-sourceImports items from external data APIsApify, Bright Data, Scrapfly, Valyu
pipelineDefines the generation workflowStandard Pipeline (15 steps), Agent Pipeline (5 steps), Claude Code
formProvides custom form fields for the generator UI(used by pipeline plugins via IFormSchemaProvider)
integrationThird-party service integrations(extensible)
utilityGeneral-purpose utilitiesComparison Generator
themeVisual theme customization(extensible)

Plugin Capabilities

Capabilities are the functional interfaces a plugin implements. A plugin can declare multiple capabilities. For example, the Exa plugin declares both search and content-extractor capabilities.

Capability Constants

const PLUGIN_CAPABILITIES = {
AI_PROVIDER: 'ai-provider',
SEARCH: 'search',
SCREENSHOT: 'screenshot',
CONTENT_EXTRACTOR: 'content-extractor',
DATA_SOURCE: 'data-source',
PIPELINE: 'pipeline',
PIPELINE_MODIFIER: 'pipeline-modifier',
FORM_SCHEMA_PROVIDER: 'form-schema-provider',
DEPLOYMENT: 'deployment',
GIT_PROVIDER: 'git-provider',
OAUTH: 'oauth'
} as const;

Capability Interfaces

Each capability maps to a TypeScript interface that the plugin must implement:

CapabilityInterfaceRequired Methods
ai-providerIAiProviderPlugincreateChatCompletion(), listModels(), getModel(), isAvailable(), getCapabilities()
searchISearchPluginsearch(), isAvailable()
content-extractorIContentExtractorPluginextract(), isAvailable()
screenshotIScreenshotPlugincapture(), isAvailable()
data-sourceIDataSourcePluginquery(), isAvailable()
pipelineIPipelinePlugingetStepDefinitions(), execute()
pipeline-modifierIPipelineModifierPluginexecute(), targetPipelines
git-providerIGitProviderPlugingetAuth(), getCloneUrl(), createRepository(), getRepository(), createPullRequest(), mergePullRequest() + IGitOperations
deploymentIDeploymentPlugindeploy(), getDeploymentStatus()
oauthIOAuthPlugingetOAuthConfig(), exchangeCode(), getUser()
form-schema-providerIFormSchemaProvidergetFormFields(), getFormGroups()

Type Guards

The plugin system provides type guard functions for each capability:

import {
isAiProviderPlugin,
isSearchPlugin,
isContentExtractorPlugin,
isScreenshotPlugin,
isDataSourcePlugin,
isPipelinePlugin,
isPipelineModifierPlugin,
isGitProviderPlugin,
isDeploymentPlugin
} from '@ever-works/plugin';

// Usage in facade or platform code
if (isSearchPlugin(plugin)) {
const results = await plugin.search({ query: 'example' });
}

Selectable Provider Categories

Certain capabilities are selectable in the generator form UI. These are defined by SELECTABLE_PROVIDER_CATEGORIES:

const SELECTABLE_PROVIDER_CATEGORIES = {
search: { capability: 'search', uiKey: 'search', selectableInForm: true },
screenshot: { capability: 'screenshot', uiKey: 'screenshot', selectableInForm: true },
ai: { capability: 'ai-provider', uiKey: 'ai', selectableInForm: true },
contentExtractor: { capability: 'content-extractor', uiKey: 'contentExtractor', selectableInForm: true },
pipeline: { capability: 'pipeline', uiKey: 'pipeline', selectableInForm: true }
} as const;

When a user creates a work, they can select which plugin to use for each selectable category. Plugins that declare defaultForCapabilities in their manifest are pre-selected.

Plugin Visibility

Each plugin can set a visibility level in its manifest:

VisibilityBehavior
publicShown to all users in all plugin lists (default)
hiddenNever shown in the plugin UI; used for internal infrastructure plugins
user-onlyShown in user plugin settings but not in work plugin lists

Supplementary Plugins

Plugins with supplementary: true in their manifest are excluded from manual provider selection dropdowns. They still declare their capability and auto-activate through URL-based routing in the facade layer. This is used for narrow-scope extractors like the Notion Extractor (activates only for notion.so URLs) and the PDF Extractor (activates only for .pdf URLs).

Multi-Capability Plugins

A single plugin can implement multiple capabilities. This is common for search and content extraction:

PluginCapabilities
Exasearch, content-extractor
Tavilysearch, content-extractor
Firecrawlsearch, content-extractor
Bright Datasearch, content-extractor
Scrapflyscreenshot, content-extractor
GitHubgit-provider, oauth
Standard Pipelinepipeline, form-schema-provider
Agent Pipelinepipeline, form-schema-provider

When a plugin provides multiple capabilities, the manifest's defaultForCapabilities array specifies which capabilities it should be the default provider for:

// A plugin with multiple capabilities, default for only one
{
capabilities: ['search', 'content-extractor'],
defaultForCapabilities: ['search']
}

Configuration Modes

Every plugin declares a configurationMode that determines how its settings are managed:

ModeDescription
admin-onlyOnly platform admins can configure the plugin
user-requiredEach user must provide their own credentials (e.g., API keys)
hybridAdmins set global defaults; users can override with their own values

Most AI provider plugins use user-required since users provide their own API keys. Infrastructure plugins like GitHub use hybrid with admin-level OAuth app credentials and user-level tokens.