@juspay/neurolink 7.34.0 → 7.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,539 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * NeuroLink Setup Command - Main Provider Setup Wizard
4
+ *
5
+ * Provides a beautiful welcome experience for new users and guided
6
+ * provider selection, while delegating to existing setup commands.
7
+ */
8
+ import inquirer from "inquirer";
9
+ import chalk from "chalk";
10
+ import ora from "ora";
11
+ import { logger } from "../../lib/utils/logger.js";
12
+ import { NeuroLink } from "../../lib/neurolink.js";
13
+ // Import existing setup handlers
14
+ import { handleOpenAISetup } from "./setup-openai.js";
15
+ import { handleGoogleAISetup } from "./setup-google-ai.js";
16
+ import { handleAnthropicSetup } from "./setup-anthropic.js";
17
+ import { handleAzureSetup } from "./setup-azure.js";
18
+ import { handleBedrockSetup } from "./setup-bedrock.js";
19
+ import { handleGCPSetup } from "./setup-gcp.js";
20
+ import { handleHuggingFaceSetup } from "./setup-huggingface.js";
21
+ import { handleMistralSetup } from "./setup-mistral.js";
22
+ // Provider information database
23
+ const PROVIDERS = [
24
+ {
25
+ id: "google-ai",
26
+ name: "Google AI Studio",
27
+ emoji: "🟡",
28
+ description: "Fast setup, free tier, latest models",
29
+ setupTime: "2 min",
30
+ cost: "Free tier",
31
+ bestFor: "General tasks",
32
+ models: "Gemini 2.5 Pro, Gemini 2.5 Flash",
33
+ strengths: "Latest technology, multimodal, generous free tier",
34
+ pricing: "Free tier → $7 per 1M tokens",
35
+ setupCommand: "neurolink setup --provider google-ai",
36
+ },
37
+ {
38
+ id: "openai",
39
+ name: "OpenAI",
40
+ emoji: "🔵",
41
+ description: "Industry standard, reliable",
42
+ setupTime: "2 min",
43
+ cost: "Pay-per-use",
44
+ bestFor: "Code & reasoning",
45
+ models: "GPT-4o, GPT-4o-mini, GPT-4-turbo",
46
+ strengths: "Industry standard, proven reliability, fast",
47
+ pricing: "$2.50-$10 per 1M tokens",
48
+ setupCommand: "neurolink setup --provider openai",
49
+ },
50
+ {
51
+ id: "anthropic",
52
+ name: "Anthropic Claude",
53
+ emoji: "🟣",
54
+ description: "Best for analysis and safety",
55
+ setupTime: "3 min",
56
+ cost: "Pay-per-use",
57
+ bestFor: "Analysis & chat",
58
+ models: "Claude 3.5 Sonnet, Claude 3 Haiku",
59
+ strengths: "Safety-focused, excellent analysis, long context",
60
+ pricing: "$3-$15 per 1M tokens",
61
+ setupCommand: "neurolink setup --provider anthropic",
62
+ },
63
+ {
64
+ id: "azure",
65
+ name: "Azure OpenAI",
66
+ emoji: "🔷",
67
+ description: "Enterprise features and compliance",
68
+ setupTime: "5 min",
69
+ cost: "Enterprise",
70
+ bestFor: "Business use",
71
+ models: "GPT-4, GPT-3.5, Embeddings",
72
+ strengths: "Enterprise compliance, SLA, data residency",
73
+ pricing: "Azure pricing model",
74
+ setupCommand: "neurolink setup --provider azure",
75
+ },
76
+ {
77
+ id: "bedrock",
78
+ name: "AWS Bedrock",
79
+ emoji: "🟠",
80
+ description: "Integrated with AWS ecosystem",
81
+ setupTime: "10 min",
82
+ cost: "AWS pricing",
83
+ bestFor: "Cloud native",
84
+ models: "Claude, Llama, Titan, Command",
85
+ strengths: "AWS integration, multiple model access, enterprise",
86
+ pricing: "AWS Bedrock pricing",
87
+ setupCommand: "neurolink setup --provider bedrock",
88
+ },
89
+ {
90
+ id: "vertex",
91
+ name: "Google Cloud",
92
+ emoji: "🔴",
93
+ description: "Advanced GCP integration",
94
+ setupTime: "10 min",
95
+ cost: "GCP pricing",
96
+ bestFor: "Advanced ML",
97
+ models: "Gemini, PaLM, Codey",
98
+ strengths: "Advanced ML pipelines, GCP integration",
99
+ pricing: "Google Cloud pricing",
100
+ setupCommand: "neurolink setup --provider vertex",
101
+ },
102
+ {
103
+ id: "huggingface",
104
+ name: "Hugging Face",
105
+ emoji: "🤗",
106
+ description: "Open source models",
107
+ setupTime: "3 min",
108
+ cost: "Free tier",
109
+ bestFor: "Open source",
110
+ models: "Llama, Mistral, CodeLlama, FLAN-T5",
111
+ strengths: "Open source, community models, free tier",
112
+ pricing: "Free tier available",
113
+ setupCommand: "neurolink setup --provider huggingface",
114
+ },
115
+ {
116
+ id: "mistral",
117
+ name: "Mistral",
118
+ emoji: "🌟",
119
+ description: "European, privacy-focused",
120
+ setupTime: "2 min",
121
+ cost: "Free tier",
122
+ bestFor: "European privacy",
123
+ models: "Mistral 7B, Mixtral 8x7B, Mistral Large",
124
+ strengths: "European privacy, efficient models, free tier",
125
+ pricing: "Free tier → €7 per 1M tokens",
126
+ setupCommand: "neurolink setup --provider mistral",
127
+ },
128
+ ];
129
+ /**
130
+ * Main setup command handler
131
+ */
132
+ export async function handleSetup(argv) {
133
+ try {
134
+ // Handle specific flags
135
+ if (argv.list) {
136
+ return await showProviderList();
137
+ }
138
+ if (argv.status) {
139
+ return await showProviderStatus();
140
+ }
141
+ if (argv.provider && argv.provider !== "auto") {
142
+ return await delegateToProviderSetup(argv.provider);
143
+ }
144
+ // Main setup wizard
145
+ await showWelcomeScreen();
146
+ await runSetupWizard();
147
+ }
148
+ catch (error) {
149
+ logger.error(chalk.red("❌ Setup failed:"));
150
+ logger.error(chalk.red(error instanceof Error ? error.message : "Unknown error"));
151
+ process.exit(1);
152
+ }
153
+ }
154
+ /**
155
+ * Show the welcome screen
156
+ */
157
+ async function showWelcomeScreen() {
158
+ // Clear screen for better presentation
159
+ process.stdout.write("\x1B[2J\x1B[0f");
160
+ logger.always(chalk.blue("╭─────────────────────────────────────────────────────────────╮"));
161
+ logger.always(chalk.blue("│ │"));
162
+ logger.always(chalk.blue("│ ") +
163
+ chalk.bold.white("🧠 Welcome to NeuroLink - Enterprise AI Platform") +
164
+ chalk.blue(" │"));
165
+ logger.always(chalk.blue("│ │"));
166
+ logger.always(chalk.blue("│ ") +
167
+ chalk.gray("Universal interface for 8+ AI providers") +
168
+ chalk.blue(" │"));
169
+ logger.always(chalk.blue("│ ") +
170
+ chalk.gray("• Generate text, code, and creative content") +
171
+ chalk.blue(" │"));
172
+ logger.always(chalk.blue("│ ") +
173
+ chalk.gray("• Stream responses in real-time") +
174
+ chalk.blue(" │"));
175
+ logger.always(chalk.blue("│ ") +
176
+ chalk.gray("• Built-in analytics and evaluation") +
177
+ chalk.blue(" │"));
178
+ logger.always(chalk.blue("│ ") +
179
+ chalk.gray("• Enterprise-grade tool integration") +
180
+ chalk.blue(" │"));
181
+ logger.always(chalk.blue("│ │"));
182
+ logger.always(chalk.blue("╰─────────────────────────────────────────────────────────────╯"));
183
+ logger.always("");
184
+ }
185
+ /**
186
+ * Run the main setup wizard
187
+ */
188
+ async function runSetupWizard() {
189
+ const spinner = ora("🔍 Scanning for existing configurations...").start();
190
+ // Check existing provider configurations
191
+ const configuredProviders = await checkExistingConfigurations();
192
+ spinner.stop();
193
+ // Show current status
194
+ await displayCurrentStatus(configuredProviders);
195
+ // Show provider comparison table
196
+ await displayProviderComparison();
197
+ // Main menu
198
+ const { action } = await inquirer.prompt([
199
+ {
200
+ type: "list",
201
+ name: "action",
202
+ message: "What would you like to do?",
203
+ choices: [
204
+ {
205
+ name: "🚀 Set up a new AI provider",
206
+ value: "setup",
207
+ },
208
+ {
209
+ name: "📖 Learn more about providers",
210
+ value: "learn",
211
+ },
212
+ {
213
+ name: "📊 Check provider status",
214
+ value: "status",
215
+ },
216
+ {
217
+ name: "❌ Exit",
218
+ value: "exit",
219
+ },
220
+ ],
221
+ },
222
+ ]);
223
+ switch (action) {
224
+ case "setup":
225
+ await runProviderSelection();
226
+ break;
227
+ case "learn":
228
+ await showProviderList();
229
+ break;
230
+ case "status":
231
+ await showProviderStatus();
232
+ break;
233
+ case "exit":
234
+ logger.always(chalk.blue("👋 Come back anytime with 'neurolink setup'"));
235
+ break;
236
+ }
237
+ }
238
+ /**
239
+ * Check which providers are already configured
240
+ */
241
+ async function checkExistingConfigurations() {
242
+ const configured = [];
243
+ // Check for environment variables that indicate configured providers
244
+ if (process.env.GOOGLE_AI_API_KEY ||
245
+ process.env.GOOGLE_GENERATIVE_AI_API_KEY) {
246
+ configured.push("google-ai");
247
+ }
248
+ if (process.env.OPENAI_API_KEY) {
249
+ configured.push("openai");
250
+ }
251
+ if (process.env.ANTHROPIC_API_KEY) {
252
+ configured.push("anthropic");
253
+ }
254
+ if (process.env.AZURE_OPENAI_API_KEY && process.env.AZURE_OPENAI_ENDPOINT) {
255
+ configured.push("azure");
256
+ }
257
+ if (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) {
258
+ configured.push("bedrock");
259
+ }
260
+ if (process.env.GOOGLE_APPLICATION_CREDENTIALS ||
261
+ process.env.GOOGLE_SERVICE_ACCOUNT_KEY) {
262
+ configured.push("vertex");
263
+ }
264
+ if (process.env.HUGGINGFACE_API_KEY ||
265
+ process.env.HUGGINGFACE_API_TOKEN ||
266
+ process.env.HF_TOKEN ||
267
+ process.env.HF_API_TOKEN) {
268
+ configured.push("huggingface");
269
+ }
270
+ if (process.env.MISTRAL_API_KEY) {
271
+ configured.push("mistral");
272
+ }
273
+ return configured;
274
+ }
275
+ /**
276
+ * Display current configuration status
277
+ */
278
+ async function displayCurrentStatus(configuredProviders) {
279
+ logger.always("Current Status:");
280
+ if (configuredProviders.length === 0) {
281
+ logger.always(chalk.red("❌ No AI providers configured yet"));
282
+ }
283
+ else {
284
+ logger.always(chalk.green(`✅ ${configuredProviders.length} provider(s) configured:`));
285
+ configuredProviders.forEach((id) => {
286
+ const provider = PROVIDERS.find((p) => p.id === id);
287
+ if (provider) {
288
+ logger.always(` ${provider.emoji} ${provider.name}`);
289
+ }
290
+ });
291
+ }
292
+ logger.always("");
293
+ }
294
+ /**
295
+ * Display provider comparison table
296
+ */
297
+ async function displayProviderComparison() {
298
+ logger.always("Available Providers:");
299
+ logger.always("");
300
+ // Create a simple table
301
+ logger.always("┌─────────────────┬──────────────┬─────────────┬─────────────────┐");
302
+ logger.always("│ Provider │ Setup Time │ Cost │ Best For │");
303
+ logger.always("├─────────────────┼──────────────┼─────────────┼─────────────────┤");
304
+ PROVIDERS.forEach((provider) => {
305
+ const name = `${provider.emoji} ${provider.name}`.padEnd(15);
306
+ const setupTime = provider.setupTime.padEnd(12);
307
+ const cost = provider.cost.padEnd(11);
308
+ const bestFor = provider.bestFor.padEnd(15);
309
+ logger.always(`│ ${name} │ ${setupTime} │ ${cost} │ ${bestFor} │`);
310
+ });
311
+ logger.always("└─────────────────┴──────────────┴─────────────┴─────────────────┘");
312
+ logger.always("");
313
+ logger.always(chalk.yellow("💡 Recommendation: Start with Google AI (free) or OpenAI (industry standard)"));
314
+ logger.always("");
315
+ }
316
+ /**
317
+ * Run provider selection
318
+ */
319
+ async function runProviderSelection() {
320
+ logger.always(chalk.blue("🎯 Perfect! Let's get you connected."));
321
+ logger.always("");
322
+ const choices = PROVIDERS.map((provider) => ({
323
+ name: `${provider.emoji} ${provider.name.padEnd(18)} - ${provider.description}`,
324
+ value: provider.id,
325
+ }));
326
+ // Add a non-selectable separator row
327
+ choices.push(new inquirer.Separator("─".repeat(60)));
328
+ choices.push({
329
+ name: chalk.yellow("💡 New to AI? Google AI Studio is perfect for getting started!"),
330
+ value: "tip",
331
+ });
332
+ const { selectedProvider } = await inquirer.prompt([
333
+ {
334
+ type: "list",
335
+ name: "selectedProvider",
336
+ message: "Which AI provider would you like to configure?",
337
+ choices,
338
+ pageSize: 12,
339
+ },
340
+ ]);
341
+ if (selectedProvider !== "tip") {
342
+ logger.always("");
343
+ logger.always(chalk.blue("🔄 Launching provider setup..."));
344
+ logger.always("");
345
+ await delegateToProviderSetup(selectedProvider);
346
+ }
347
+ }
348
+ /**
349
+ * Delegate to existing provider setup commands
350
+ */
351
+ async function delegateToProviderSetup(providerId) {
352
+ const setupArgs = {
353
+ nonInteractive: false,
354
+ "non-interactive": false,
355
+ check: false,
356
+ _: [],
357
+ $0: "neurolink",
358
+ };
359
+ switch (providerId) {
360
+ case "google-ai":
361
+ await handleGoogleAISetup(setupArgs);
362
+ break;
363
+ case "openai":
364
+ await handleOpenAISetup(setupArgs);
365
+ break;
366
+ case "anthropic":
367
+ await handleAnthropicSetup(setupArgs);
368
+ break;
369
+ case "azure":
370
+ await handleAzureSetup(setupArgs);
371
+ break;
372
+ case "bedrock":
373
+ await handleBedrockSetup(setupArgs);
374
+ break;
375
+ case "vertex":
376
+ await handleGCPSetup(setupArgs);
377
+ break;
378
+ case "huggingface":
379
+ await handleHuggingFaceSetup(setupArgs);
380
+ break;
381
+ case "mistral":
382
+ await handleMistralSetup(setupArgs);
383
+ break;
384
+ default:
385
+ throw new Error(`Unknown provider: ${providerId}`);
386
+ }
387
+ // After successful setup, show completion message
388
+ await showSetupCompletion(providerId);
389
+ }
390
+ /**
391
+ * Show setup completion message
392
+ */
393
+ async function showSetupCompletion(providerId) {
394
+ const provider = PROVIDERS.find((p) => p.id === providerId);
395
+ if (!provider) {
396
+ return;
397
+ }
398
+ logger.always("");
399
+ logger.always(chalk.green("🎉 Welcome to NeuroLink! Your provider is ready."));
400
+ logger.always("");
401
+ logger.always("Next steps:");
402
+ logger.always(chalk.cyan(`• Test: neurolink generate "Hello world!" --provider ${providerId}`));
403
+ logger.always(chalk.cyan("• Status: neurolink provider status"));
404
+ logger.always(chalk.cyan("• Help: neurolink --help"));
405
+ logger.always("");
406
+ logger.always(chalk.blue("Happy generating! 🚀"));
407
+ }
408
+ /**
409
+ * Show detailed provider information
410
+ */
411
+ async function showProviderList() {
412
+ logger.always(chalk.blue("📚 NeuroLink Supported AI Providers"));
413
+ logger.always("");
414
+ for (const provider of PROVIDERS) {
415
+ logger.always(`╭─────────────────────────────────────────────────────────────╮`);
416
+ logger.always(`│ ${provider.emoji} ${provider.name.padEnd(25)}│`);
417
+ logger.always(`├─────────────────────────────────────────────────────────────┤`);
418
+ logger.always(`│ Setup: ${provider.setupCommand.padEnd(48)}│`);
419
+ logger.always(`│ Models: ${provider.models.padEnd(47)}│`);
420
+ logger.always(`│ Strengths: ${provider.strengths.padEnd(43)}│`);
421
+ logger.always(`│ Best for: ${provider.bestFor.padEnd(44)}│`);
422
+ logger.always(`│ Pricing: ${provider.pricing.padEnd(45)}│`);
423
+ logger.always(`│ Setup time: ${provider.setupTime.padEnd(42)}│`);
424
+ logger.always(`╰─────────────────────────────────────────────────────────────╯`);
425
+ logger.always("");
426
+ }
427
+ logger.always(chalk.blue("🎯 Quick Start Recommendations:"));
428
+ logger.always("");
429
+ logger.always(chalk.yellow("🆓 Free Tier Starter Pack:"));
430
+ logger.always("• neurolink setup --provider google-ai");
431
+ logger.always("• neurolink setup --provider huggingface");
432
+ logger.always("");
433
+ logger.always(chalk.yellow("💼 Professional Setup:"));
434
+ logger.always("• neurolink setup --provider openai");
435
+ logger.always("• neurolink setup --provider anthropic");
436
+ logger.always("");
437
+ logger.always(chalk.yellow("🏢 Enterprise Ready:"));
438
+ logger.always("• neurolink setup --provider azure");
439
+ logger.always("• neurolink setup --provider bedrock");
440
+ logger.always("");
441
+ const { action } = await inquirer.prompt([
442
+ {
443
+ type: "list",
444
+ name: "action",
445
+ message: "Ready to set up a provider?",
446
+ choices: [
447
+ { name: "Yes, show me the setup wizard", value: "wizard" },
448
+ { name: "No, I'll set up providers manually later", value: "exit" },
449
+ ],
450
+ },
451
+ ]);
452
+ if (action === "wizard") {
453
+ await runProviderSelection();
454
+ }
455
+ }
456
+ /**
457
+ * Show provider status with detailed information
458
+ */
459
+ async function showProviderStatus() {
460
+ const spinner = ora("🔍 Checking all AI provider configurations...").start();
461
+ try {
462
+ // Get provider status using NeuroLink SDK
463
+ const sdk = new NeuroLink();
464
+ const results = await sdk.getProviderStatus({ quiet: true });
465
+ spinner.stop();
466
+ logger.always("");
467
+ logger.always("╭─────────────────────────────────────────────────────────────╮");
468
+ logger.always("│ NeuroLink Provider Status │");
469
+ logger.always("╰─────────────────────────────────────────────────────────────╯");
470
+ logger.always("");
471
+ const working = results.filter((r) => r.status === "working");
472
+ const _configured = results.filter((r) => r.configured);
473
+ const available = PROVIDERS.filter((p) => !results.some((r) => r.provider === p.id && r.configured));
474
+ if (working.length > 0) {
475
+ logger.always("✅ Working Providers:");
476
+ logger.always("┌─────────────────┬─────────────┬─────────────┬─────────────────┐");
477
+ logger.always("│ Provider │ Status │ Model │ Last Tested │");
478
+ logger.always("├─────────────────┼─────────────┼─────────────┼─────────────────┤");
479
+ working.forEach((result) => {
480
+ const provider = PROVIDERS.find((p) => p.id === result.provider);
481
+ const emoji = provider?.emoji || "⚪";
482
+ const name = `${emoji} ${provider?.name || result.provider}`.padEnd(15);
483
+ const status = "✅ Working".padEnd(11);
484
+ const model = (result.model || "default").padEnd(11);
485
+ const tested = result.responseTime ? "Just now" : "Unknown";
486
+ logger.always(`│ ${name} │ ${status} │ ${model} │ ${tested.padEnd(15)} │`);
487
+ });
488
+ logger.always("└─────────────────┴─────────────┴─────────────┴─────────────────┘");
489
+ logger.always("");
490
+ }
491
+ if (available.length > 0) {
492
+ logger.always("⚪ Available for Setup:");
493
+ logger.always("┌─────────────────┬──────────────┬─────────────┬─────────────────┐");
494
+ logger.always("│ Provider │ Setup Time │ Cost Model │ Specialty │");
495
+ logger.always("├─────────────────┼──────────────┼─────────────┼─────────────────┤");
496
+ available.forEach((provider) => {
497
+ const name = `${provider.emoji} ${provider.name}`.padEnd(15);
498
+ const setupTime = provider.setupTime.padEnd(12);
499
+ const cost = provider.cost.padEnd(11);
500
+ const specialty = provider.bestFor.padEnd(15);
501
+ logger.always(`│ ${name} │ ${setupTime} │ ${cost} │ ${specialty} │`);
502
+ });
503
+ logger.always("└─────────────────┴──────────────┴─────────────┴─────────────────┘");
504
+ logger.always("");
505
+ }
506
+ // Summary and recommendations
507
+ logger.always(chalk.blue(`🎯 You have ${working.length} provider(s) working!`));
508
+ logger.always("");
509
+ if (available.length > 0) {
510
+ logger.always(chalk.yellow("💡 Suggestions:"));
511
+ if (!working.some((p) => p.provider === "anthropic")) {
512
+ logger.always("• Add Anthropic for better analysis: neurolink setup --provider anthropic");
513
+ }
514
+ if (!working.some((p) => p.provider === "huggingface")) {
515
+ logger.always("• Try Hugging Face for free open source models: neurolink setup --provider huggingface");
516
+ }
517
+ logger.always("• Check performance: neurolink provider status");
518
+ logger.always("");
519
+ }
520
+ const { setupAnother } = await inquirer.prompt([
521
+ {
522
+ type: "confirm",
523
+ name: "setupAnother",
524
+ message: "Would you like to set up another provider now?",
525
+ default: false,
526
+ },
527
+ ]);
528
+ if (setupAnother) {
529
+ await runProviderSelection();
530
+ }
531
+ else {
532
+ logger.always(chalk.blue("👍 All set! Use 'neurolink setup' anytime to add more providers."));
533
+ }
534
+ }
535
+ catch (error) {
536
+ spinner.fail("Failed to check provider status");
537
+ logger.error(chalk.red("Error checking provider status:"), error);
538
+ }
539
+ }
@@ -62,6 +62,10 @@ export declare class CLICommandFactory {
62
62
  * Create Ollama commands
63
63
  */
64
64
  static createOllamaCommands(): CommandModule;
65
+ /**
66
+ * Create setup command
67
+ */
68
+ static createSetupCommand(): CommandModule;
65
69
  /**
66
70
  * Create SageMaker commands
67
71
  */
@@ -14,6 +14,7 @@ import ora from "ora";
14
14
  import chalk from "chalk";
15
15
  import { logger } from "../../lib/utils/logger.js";
16
16
  import fs from "fs";
17
+ import { handleSetup } from "../commands/setup.js";
17
18
  // Use specific command interfaces from cli.ts instead of universal interface
18
19
  /**
19
20
  * CLI Command Factory for generate commands
@@ -602,6 +603,46 @@ export class CLICommandFactory {
602
603
  static createOllamaCommands() {
603
604
  return OllamaCommandFactory.createOllamaCommands();
604
605
  }
606
+ /**
607
+ * Create setup command
608
+ */
609
+ static createSetupCommand() {
610
+ return {
611
+ command: ["setup [provider]", "s [provider]"],
612
+ describe: "Interactive AI provider setup wizard",
613
+ builder: (yargs) => {
614
+ return this.buildOptions(yargs
615
+ .positional("provider", {
616
+ type: "string",
617
+ description: "Specific provider to set up",
618
+ choices: [
619
+ "google-ai",
620
+ "openai",
621
+ "anthropic",
622
+ "azure",
623
+ "bedrock",
624
+ "vertex",
625
+ "huggingface",
626
+ "mistral",
627
+ ],
628
+ })
629
+ .option("list", {
630
+ type: "boolean",
631
+ description: "List all available providers",
632
+ alias: "l",
633
+ })
634
+ .option("status", {
635
+ type: "boolean",
636
+ description: "Show provider configuration status",
637
+ })
638
+ .example("$0 setup", "Interactive setup wizard")
639
+ .example("$0 setup --provider openai", "Setup specific provider")
640
+ .example("$0 setup --list", "List all providers")
641
+ .example("$0 setup --status", "Check provider status"));
642
+ },
643
+ handler: async (argv) => await handleSetup(argv),
644
+ };
645
+ }
605
646
  /**
606
647
  * Create SageMaker commands
607
648
  */
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Setup Command Factory for NeuroLink
3
+ * Consolidates all provider setup commands into a unified interface
4
+ */
5
+ import type { CommandModule } from "yargs";
6
+ /**
7
+ * Setup Command Factory
8
+ */
9
+ export declare class SetupCommandFactory {
10
+ /**
11
+ * Create the main setup command with all provider subcommands
12
+ */
13
+ static createSetupCommands(): CommandModule;
14
+ /**
15
+ * Build common options for provider setup commands
16
+ */
17
+ private static buildProviderOptions;
18
+ }