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 应用中的强大功能。您可以根据具体需求调整和扩展这些示例。