agent-orchestrator/packages/cli/src/lib/plugins.ts

74 lines
2.4 KiB
TypeScript

import type { Agent, OrchestratorConfig, PluginRegistry, SCM } from "@aoagents/ao-core";
import claudeCodePlugin from "@aoagents/ao-plugin-agent-claude-code";
import codexPlugin from "@aoagents/ao-plugin-agent-codex";
import aiderPlugin from "@aoagents/ao-plugin-agent-aider";
import cursorPlugin from "@aoagents/ao-plugin-agent-cursor";
import opencodePlugin from "@aoagents/ao-plugin-agent-opencode";
import githubSCMPlugin from "@aoagents/ao-plugin-scm-github";
const agentPlugins: Record<string, { create(): Agent }> = {
"claude-code": claudeCodePlugin,
codex: codexPlugin,
aider: aiderPlugin,
cursor: cursorPlugin,
opencode: opencodePlugin,
};
const scmPlugins: Record<string, { create(): SCM }> = {
github: githubSCMPlugin,
};
/**
* Resolve the Agent plugin for a project (or fall back to the config default).
* Direct import — no dynamic loading needed since the CLI depends on all agent plugins.
*/
export function getAgent(config: OrchestratorConfig, projectId?: string): Agent {
const agentName =
(projectId ? config.projects[projectId]?.agent : undefined) || config.defaults.agent;
return getAgentByName(agentName);
}
/** Get an agent by name directly (for fallback/no-config scenarios). */
export function getAgentByName(name: string): Agent {
const plugin = agentPlugins[name];
if (!plugin) {
throw new Error(`Unknown agent plugin: ${name}`);
}
return plugin.create();
}
/** Get an agent by name from the shared registry. */
export function getAgentByNameFromRegistry(registry: PluginRegistry, name: string): Agent {
const plugin = registry.get<Agent>("agent", name);
if (!plugin) {
throw new Error(`Unknown agent plugin: ${name}`);
}
return plugin;
}
/**
* Resolve the SCM plugin for a project (or fall back to "github").
*/
export function getSCM(config: OrchestratorConfig, projectId: string): SCM {
const scmName = config.projects[projectId]?.scm?.plugin || "github";
const plugin = scmPlugins[scmName];
if (!plugin) {
throw new Error(`Unknown SCM plugin: ${scmName}`);
}
return plugin.create();
}
/** Resolve the SCM plugin for a project from the shared registry. */
export function getSCMFromRegistry(
registry: PluginRegistry,
config: OrchestratorConfig,
projectId: string,
): SCM {
const scmName = config.projects[projectId]?.scm?.plugin || "github";
const plugin = registry.get<SCM>("scm", scmName);
if (!plugin) {
throw new Error(`Unknown SCM plugin: ${scmName}`);
}
return plugin;
}