voyageai-cli
Version:
CLI for Voyage AI embeddings, reranking, and MongoDB Atlas Vector Search
163 lines (149 loc) • 5.84 kB
JavaScript
;
require('dotenv').config({ path: '.env.local', override: true, quiet: true });
require('dotenv').config({ quiet: true });
const { program } = require('commander');
const pc = require('picocolors');
const { registerEmbed } = require('./commands/embed');
const { registerRerank } = require('./commands/rerank');
const { registerStore } = require('./commands/store');
const { registerSearch } = require('./commands/search');
const { registerIndex } = require('./commands/index');
const { registerModels } = require('./commands/models');
const { registerPing } = require('./commands/ping');
const { registerConfig } = require('./commands/config');
const { registerDemo } = require('./commands/demo');
const { registerExplain } = require('./commands/explain');
const { registerSimilarity } = require('./commands/similarity');
const { registerIngest } = require('./commands/ingest');
const { registerCompletions } = require('./commands/completions');
const { registerPlayground } = require('./commands/playground');
const { registerBenchmark } = require('./commands/benchmark');
const { registerEstimate } = require('./commands/estimate');
const { registerOptimize } = require('./commands/optimize');
const { registerInit } = require('./commands/init');
const { registerChunk } = require('./commands/chunk');
const { registerQuery } = require('./commands/query');
const { registerPipeline } = require('./commands/pipeline');
const { registerEval } = require('./commands/eval');
const { registerGenerate } = require('./commands/generate');
const { registerScaffold } = require('./commands/scaffold');
const { register: registerPurge } = require('./commands/purge');
const { register: registerRefresh } = require('./commands/refresh');
const { registerApp } = require('./commands/app');
const { registerAbout } = require('./commands/about');
const { register: registerDoctor } = require('./commands/doctor');
const { register: registerQuickstart } = require('./commands/quickstart');
const { register: registerReset } = require('./commands/reset');
const { registerBug } = require('./commands/bug');
const { registerChat } = require('./commands/chat');
const { registerMcpServer } = require('./commands/mcp-server');
const { registerNano } = require('./commands/nano');
const { registerTelemetry } = require('./commands/telemetry');
const { registerWorkflow } = require('./commands/workflow');
const { registerIndexWorkspace } = require('./commands/index-workspace');
const { registerExport } = require('./commands/export');
const { registerImport } = require('./commands/import');
const { registerCodeSearch } = require('./commands/code-search');
const { showBanner, showQuickStart, getVersion } = require('./lib/banner');
const { moments } = require('./lib/robot-moments');
const version = getVersion();
program
.name('vai')
.description('Voyage AI embeddings, reranking, and Atlas Vector Search CLI')
.version(`vai/${version} (community tool — not an official MongoDB or Voyage AI product)`, '-V, --version', 'output the version number');
registerEmbed(program);
registerRerank(program);
registerStore(program);
registerSearch(program);
registerIndex(program);
registerModels(program);
registerPing(program);
registerConfig(program);
registerDemo(program);
registerExplain(program);
registerSimilarity(program);
registerIngest(program);
registerCompletions(program);
registerPlayground(program);
registerBenchmark(program);
registerEstimate(program);
registerOptimize(program);
registerInit(program);
registerChunk(program);
registerQuery(program);
registerPipeline(program);
registerEval(program);
registerGenerate(program);
registerScaffold(program);
registerPurge(program);
registerRefresh(program);
registerApp(program);
registerAbout(program);
registerDoctor(program);
registerQuickstart(program);
registerReset(program);
registerBug(program);
registerChat(program);
registerMcpServer(program);
registerNano(program);
registerTelemetry(program);
registerWorkflow(program);
registerIndexWorkspace(program);
registerExport(program);
registerImport(program);
registerCodeSearch(program);
// Show robot header before help output in TTY mode (skip when banner already shown)
let bannerShown = false;
program.addHelpText('beforeAll', () => {
if (!bannerShown && moments.isInteractive()) {
moments.help(version);
}
return '';
});
// Append disclaimer to all help output
program.addHelpText('after', `
${pc.dim('Community tool — not an official MongoDB or Voyage AI product.')}
${pc.dim('Docs: https://docs.vaicli.com/')}
`);
// Anonymous telemetry (fire-and-forget, non-blocking)
const telemetry = require('./lib/telemetry');
// If no args (just `vai`), show welcome wizard (first run) or banner + help
if (process.argv.length <= 2) {
const { shouldShowWelcome, runWelcome } = require('./lib/welcome');
const showWelcome = shouldShowWelcome();
telemetry.ensureNoticeShown({ surface: 'cli' });
if (showWelcome) {
runWelcome()
.then((completed) => {
if (!completed) {
// User cancelled: fall back to normal quick start
bannerShown = true;
showQuickStart();
program.outputHelp();
}
process.exit(0);
})
.catch(() => {
// Wizard error: fall back gracefully
bannerShown = true;
showBanner();
showQuickStart();
program.outputHelp();
process.exit(0);
});
} else {
bannerShown = true;
showBanner();
showQuickStart();
program.outputHelp();
process.exit(0);
}
}
telemetry.ensureNoticeShown({ surface: 'cli' });
// Track command usage after parsing
program.hook('preAction', (thisCommand) => {
const cmd = thisCommand.args?.[0] || thisCommand.name();
telemetry.send('cli_command', { command: cmd });
});
program.parse();