From 5bf8e4ca92d8a78f51037b95a35771f4c86da0d6 Mon Sep 17 00:00:00 2001 From: Miroslav Drbal Date: Sat, 28 Mar 2026 17:23:14 +0100 Subject: [PATCH] fix: wire classifyInstallTarget into handleInstall Route marketplace install targets (name@marketplace) to MarketplaceManager.installPlugin() instead of npm install. classifyInstallTarget() was implemented but never called from the install handler. --- packages/coding-agent/src/cli/plugin-cli.ts | 32 ++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/coding-agent/src/cli/plugin-cli.ts b/packages/coding-agent/src/cli/plugin-cli.ts index 049c21682..97029b2a8 100644 --- a/packages/coding-agent/src/cli/plugin-cli.ts +++ b/packages/coding-agent/src/cli/plugin-cli.ts @@ -121,7 +121,9 @@ export function parsePluginArgs(args: string[]): PluginCommandArgs | undefined { return result; } -export { classifyInstallTarget } from "./classify-install-target.js"; +import { classifyInstallTarget } from "./classify-install-target"; + +export { classifyInstallTarget } from "./classify-install-target"; // ============================================================================= // Command Handlers @@ -320,13 +322,35 @@ async function handleInstall( console.error(chalk.red(`Usage: ${APP_NAME} plugin install [features] ...`)); console.error(chalk.dim("Examples:")); console.error(chalk.dim(` ${APP_NAME} plugin install @oh-my-pi/exa`)); - console.error(chalk.dim(` ${APP_NAME} plugin install @oh-my-pi/exa[search,websets]`)); - console.error(chalk.dim(` ${APP_NAME} plugin install @oh-my-pi/exa[*] # all features`)); - console.error(chalk.dim(` ${APP_NAME} plugin install @oh-my-pi/exa[] # no optional features`)); + console.error(chalk.dim(` ${APP_NAME} plugin install name@marketplace`)); process.exit(1); } + // Build known marketplace set for classification + const mktMgr = makeMarketplaceManager(); + const knownMarketplaces = new Set((await mktMgr.listMarketplaces()).map(m => m.name)); + for (const spec of packages) { + const target = classifyInstallTarget(spec, knownMarketplaces); + + if (target.type === "marketplace") { + try { + const entry = await mktMgr.installPlugin(target.name, target.marketplace, { + force: flags.force, + }); + console.log( + chalk.green( + `${theme.status.success} Installed ${target.name} from ${target.marketplace} (${entry.version})`, + ), + ); + } catch (err) { + console.error(chalk.red(`${theme.status.error} Failed to install ${spec}: ${err}`)); + process.exit(1); + } + continue; + } + + // npm path try { const result = await manager.install(spec, { force: flags.force, dryRun: flags.dryRun });