Skip to content

CLI应用示例

本页面展示了如何在 Node.js 命令行应用中使用 XAI-SDK,包括基础用法、高级功能和最佳实践。

📋 示例列表

基础 CLI 工具

一个简单的命令行工具,展示 XAI-SDK 的基本用法

高级 CLI 工具

功能完整的 AI 辅助开发工具,支持多种命令和配置

插件化 CLI

支持插件扩展的命令行工具,展示 SDK 的扩展能力

🚀 快速开始

安装依赖

bash
npm install xai-sdk @xai-sdk/file-tools @xai-sdk/openai-provider

环境配置

bash
# 设置 OpenAI API Key
export OPENAI_API_KEY="your-api-key-here"

📚 基础示例

简单的代码分析工具

创建一个基础的 CLI 工具来分析代码文件:

typescript
#!/usr/bin/env node
import { XAI_SDK } from 'xai-sdk';
import { FileToolsPlugin } from '@xai-sdk/file-tools';
import { OpenAIProviderPlugin } from '@xai-sdk/openai-provider';

async function main() {
  // 初始化 SDK
  const sdk = new XAI_SDK({ environment: 'node' });
  
  // 注册插件
  await sdk.registerPlugin(new FileToolsPlugin());
  await sdk.registerPlugin(new OpenAIProviderPlugin({
    apiKey: process.env.OPENAI_API_KEY
  }));
  
  await sdk.initialize();
  
  // 获取命令行参数
  const filePath = process.argv[2];
  if (!filePath) {
    console.error('请提供要分析的文件路径');
    process.exit(1);
  }
  
  try {
    // 读取文件内容
    const fileContent = await sdk.executeTool('read-file', {
      path: filePath
    });
    
    // 分析代码
    const analysis = await sdk.analyze(fileContent.content, {
      type: 'code-quality',
      includeMetrics: true
    });
    
    // 输出结果
    console.log('\n📊 代码分析结果:');
    console.log('================');
    console.log(`文件: ${filePath}`);
    console.log(`行数: ${analysis.metrics.lines}`);
    console.log(`复杂度: ${analysis.metrics.complexity}`);
    console.log(`质量评分: ${analysis.score}/100`);
    console.log('\n🔍 建议:');
    analysis.suggestions.forEach((suggestion, index) => {
      console.log(`${index + 1}. ${suggestion}`);
    });
    
  } catch (error) {
    console.error('分析失败:', error.message);
    process.exit(1);
  }
}

main().catch(console.error);

使用方法

bash
# 保存为 analyze.js
node analyze.js ./src/index.ts

🔧 高级示例

功能完整的 CLI 工具

使用 Commander.js 创建功能丰富的命令行工具:

typescript
import { Command } from 'commander';
import { XAI_SDK } from 'xai-sdk';
import chalk from 'chalk';
import ora from 'ora';

const program = new Command();
const sdk = new XAI_SDK({ environment: 'node' });

// 初始化 SDK
async function initSDK() {
  const spinner = ora('初始化 XAI-SDK...').start();
  try {
    await sdk.registerPlugin(new FileToolsPlugin());
    await sdk.registerPlugin(new OpenAIProviderPlugin({
      apiKey: process.env.OPENAI_API_KEY
    }));
    await sdk.initialize();
    spinner.succeed('SDK 初始化完成');
  } catch (error) {
    spinner.fail('SDK 初始化失败');
    throw error;
  }
}

program
  .name('xai-cli')
  .description('AI-powered development tool')
  .version('1.0.0')
  .hook('preAction', initSDK);

// 代码分析命令
program
  .command('analyze <file>')
  .description('分析代码文件')
  .option('-t, --type <type>', '分析类型 (quality|security|performance)', 'quality')
  .option('-f, --format <format>', '输出格式 (json|table|markdown)', 'table')
  .option('-o, --output <file>', '输出到文件')
  .action(async (file, options) => {
    const spinner = ora(`分析文件: ${file}`).start();
    
    try {
      const result = await sdk.analyze(file, {
        type: options.type,
        format: options.format
      });
      
      spinner.succeed('分析完成');
      
      if (options.output) {
        await sdk.executeTool('write-file', {
          path: options.output,
          content: JSON.stringify(result, null, 2)
        });
        console.log(chalk.green(`结果已保存到: ${options.output}`));
      } else {
        console.log('\n' + formatAnalysisResult(result, options.format));
      }
      
    } catch (error) {
      spinner.fail('分析失败');
      console.error(chalk.red(error.message));
      process.exit(1);
    }
  });

// 代码生成命令
program
  .command('generate <prompt>')
  .description('生成代码')
  .option('-l, --language <lang>', '编程语言', 'typescript')
  .option('-s, --style <style>', '代码风格 (functional|oop|minimal)', 'functional')
  .option('-o, --output <file>', '输出文件')
  .action(async (prompt, options) => {
    const spinner = ora('生成代码中...').start();
    
    try {
      const result = await sdk.generate(prompt, {
        language: options.language,
        style: options.style,
        includeComments: true,
        includeTests: true
      });
      
      spinner.succeed('代码生成完成');
      
      if (options.output) {
        await sdk.executeTool('write-file', {
          path: options.output,
          content: result.code
        });
        console.log(chalk.green(`代码已保存到: ${options.output}`));
      } else {
        console.log('\n' + chalk.cyan('生成的代码:'));
        console.log('```' + options.language);
        console.log(result.code);
        console.log('```');
      }
      
    } catch (error) {
      spinner.fail('生成失败');
      console.error(chalk.red(error.message));
      process.exit(1);
    }
  });

// 项目扫描命令
program
  .command('scan [directory]')
  .description('扫描项目目录')
  .option('-r, --recursive', '递归扫描子目录')
  .option('--ignore <patterns>', '忽略的文件模式', 'node_modules,dist,.git')
  .action(async (directory = '.', options) => {
    const spinner = ora('扫描项目...').start();
    
    try {
      const result = await sdk.executeTool('scan-directory', {
        path: directory,
        recursive: options.recursive,
        ignore: options.ignore.split(',')
      });
      
      spinner.succeed(`扫描完成,发现 ${result.files.length} 个文件`);
      
      console.log('\n📁 项目结构:');
      result.files.forEach(file => {
        console.log(`  ${file.type === 'directory' ? '📁' : '📄'} ${file.path}`);
      });
      
    } catch (error) {
      spinner.fail('扫描失败');
      console.error(chalk.red(error.message));
      process.exit(1);
    }
  });

// 格式化分析结果
function formatAnalysisResult(result: any, format: string): string {
  switch (format) {
    case 'json':
      return JSON.stringify(result, null, 2);
    case 'markdown':
      return `# 分析结果\n\n**质量评分**: ${result.score}/100\n\n## 建议\n\n${result.suggestions.map((s, i) => `${i + 1}. ${s}`).join('\n')}`;
    default:
      return `质量评分: ${result.score}/100\n建议:\n${result.suggestions.map((s, i) => `  ${i + 1}. ${s}`).join('\n')}`;
  }
}

program.parse();

package.json 配置

json
{
  "name": "xai-cli-example",
  "version": "1.0.0",
  "bin": {
    "xai-cli": "./dist/cli.js"
  },
  "scripts": {
    "build": "tsc",
    "start": "node dist/cli.js"
  },
  "dependencies": {
    "xai-sdk": "^1.0.0",
    "@xai-sdk/file-tools": "^1.0.0",
    "@xai-sdk/openai-provider": "^1.0.0",
    "commander": "^9.0.0",
    "chalk": "^5.0.0",
    "ora": "^6.0.0"
  },
  "devDependencies": {
    "@types/node": "^18.0.0",
    "typescript": "^4.8.0"
  }
}

🔌 插件化示例

可扩展的 CLI 架构

typescript
import { XAI_SDK } from 'xai-sdk';
import { PluginManager } from './plugin-manager';

class ExtensibleCLI {
  private sdk: XAI_SDK;
  private pluginManager: PluginManager;
  
  constructor() {
    this.sdk = new XAI_SDK({ environment: 'node' });
    this.pluginManager = new PluginManager(this.sdk);
  }
  
  async initialize() {
    // 加载核心插件
    await this.pluginManager.loadPlugin('@xai-sdk/file-tools');
    await this.pluginManager.loadPlugin('@xai-sdk/openai-provider');
    
    // 加载用户插件
    await this.pluginManager.loadUserPlugins();
    
    await this.sdk.initialize();
  }
  
  async executeCommand(command: string, args: any[]) {
    const handler = this.pluginManager.getCommandHandler(command);
    if (handler) {
      return await handler.execute(args);
    }
    throw new Error(`未知命令: ${command}`);
  }
}

📖 最佳实践

1. 错误处理

typescript
try {
  const result = await sdk.analyze(file);
  console.log(result);
} catch (error) {
  if (error.code === 'FILE_NOT_FOUND') {
    console.error('文件不存在:', error.message);
  } else if (error.code === 'API_LIMIT_EXCEEDED') {
    console.error('API 调用次数超限,请稍后重试');
  } else {
    console.error('未知错误:', error.message);
  }
  process.exit(1);
}

2. 配置管理

typescript
import { readFileSync } from 'fs';
import { join } from 'path';

// 读取配置文件
function loadConfig() {
  const configPath = join(process.cwd(), '.xai-config.json');
  try {
    return JSON.parse(readFileSync(configPath, 'utf-8'));
  } catch {
    return {
      provider: 'openai',
      model: 'gpt-3.5-turbo',
      maxTokens: 2000
    };
  }
}

3. 进度显示

typescript
import ora from 'ora';
import { ProgressBar } from 'cli-progress';

// 使用 ora 显示加载状态
const spinner = ora('处理中...').start();
try {
  const result = await longRunningTask();
  spinner.succeed('处理完成');
} catch (error) {
  spinner.fail('处理失败');
}

// 使用进度条显示批量处理进度
const progressBar = new ProgressBar({
  format: '处理进度 [{bar}] {percentage}% | {value}/{total} 文件'
});

progressBar.start(files.length, 0);
for (let i = 0; i < files.length; i++) {
  await processFile(files[i]);
  progressBar.update(i + 1);
}
progressBar.stop();

🚀 部署和分发

1. 构建可执行文件

bash
# 使用 pkg 打包
npm install -g pkg
pkg package.json

2. 发布到 npm

bash
npm publish

3. 全局安装

bash
npm install -g your-cli-tool

📝 相关资源


💡 提示: 这些示例展示了 XAI-SDK 在 CLI 应用中的强大功能。您可以根据具体需求调整和扩展这些示例。

Released under the MIT License.