aico-claude-code
Version:
Claude Code CLI 的网页用户界面
200 lines (169 loc) • 5.9 kB
JavaScript
/**
* CLI commands and utilities for Claude Code UI
*
* Provides additional CLI commands beyond basic server startup
*/
import { spawn } from 'child_process';
import { readFileSync, existsSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/**
* Check system requirements
*/
export function checkRequirements() {
const nodeVersion = process.version;
const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
console.log('🔍 Checking system requirements...');
console.log(` Node.js version: ${nodeVersion}`);
if (majorVersion < 18) {
console.error('❌ Node.js 18+ is required');
return false;
}
console.log('✅ Node.js version is compatible');
// Check if required files exist
const requiredFiles = [
join(__dirname, '../server/index.js'),
join(__dirname, '../package.json')
];
for (const file of requiredFiles) {
if (!existsSync(file)) {
console.error(`❌ Missing required file: ${file}`);
return false;
}
}
console.log('✅ All required files are present');
return true;
}
/**
* Build the application for production
*/
export function buildApplication() {
console.log('🏗️ Building Claude Code UI...');
return new Promise((resolve, reject) => {
const buildProcess = spawn('npm', ['run', 'build'], {
stdio: 'inherit',
cwd: dirname(__dirname)
});
buildProcess.on('close', (code) => {
if (code === 0) {
console.log('✅ Build completed successfully');
resolve();
} else {
console.error('❌ Build failed');
reject(new Error(`Build process exited with code ${code}`));
}
});
buildProcess.on('error', (error) => {
console.error('❌ Failed to start build:', error.message);
reject(error);
});
});
}
/**
* Initialize a new configuration file
*/
export async function initConfig(configPath) {
const defaultConfig = {
port: 3000,
vitePort: 3001,
host: '127.0.0.1',
debug: false,
openBrowser: true,
logLevel: 'info'
};
const configJson = JSON.stringify(defaultConfig, null, 2);
try {
const fs = await import('fs');
fs.writeFileSync(configPath, configJson);
console.log(`✅ Configuration file created: ${configPath}`);
console.log('📝 You can now customize the settings in this file');
} catch (error) {
console.error(`❌ Failed to create config file: ${error.message}`);
}
}
/**
* Show system information
*/
export function showSystemInfo() {
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
console.log('📊 Claude Code UI System Information');
console.log('====================================');
console.log(`Version: ${packageJson.version}`);
console.log(`Node.js: ${process.version}`);
console.log(`Platform: ${process.platform}`);
console.log(`Architecture: ${process.arch}`);
console.log(`Working directory: ${process.cwd()}`);
console.log(`CLI location: ${__dirname}`);
console.log(`Server location: ${join(__dirname, '../server/index.js')}`);
console.log(`Frontend build: ${existsSync(join(__dirname, '../dist')) ? 'Available' : 'Not built'}`);
}
/**
* Validate configuration
*/
export function validateConfig(config) {
const errors = [];
if (config.port && (config.port < 1 || config.port > 65535)) {
errors.push('Invalid port number (must be 1-65535)');
}
if (config.vitePort && (config.vitePort < 1 || config.vitePort > 65535)) {
errors.push('Invalid Vite port number (must be 1-65535)');
}
if (config.logLevel && !['error', 'warn', 'info', 'debug'].includes(config.logLevel)) {
errors.push('Invalid log level (must be error, warn, info, or debug)');
}
if (errors.length > 0) {
console.error('❌ Configuration validation failed:');
errors.forEach(error => console.error(` - ${error}`));
return false;
}
console.log('✅ Configuration is valid');
return true;
}
/**
* Show help for CLI commands
*/
export function showExtendedHelp() {
console.log(`
Claude Code UI - Extended Help
==============================
Usage: claude-ui [options]
Options:
-p, --port <port> Backend server port (default: 3000)
--vite-port <port> Frontend development server port (default: 3001)
--host <host> Host address to bind to (default: 127.0.0.1)
--claude-path <path> Path to claude executable
-d, --debug Enable debug mode
--no-browser Do not open browser automatically
--dev Run in development mode (with hot reload)
--prod Run in production mode (built version)
--config <path> Path to configuration file
--log-level <level> Set log level (error, warn, info, debug)
Commands:
claude-ui --help Show this help message
claude-ui --version Show version information
claude-ui --info Show system information
claude-ui build Build the application for production
claude-ui check Check system requirements
claude-ui init Initialize a new configuration file
Examples:
claude-ui --port 8080 --dev
claude-ui --prod --no-browser
claude-ui --config ./my-config.json
claude-ui build
claude-ui check
Configuration:
The application can be configured via:
1. Command line arguments
2. Environment variables (PORT, VITE_PORT, HOST, DEBUG)
3. Configuration file (JSON format)
4. .env file in the project root
Environment Variables:
PORT Backend server port (default: 3000)
VITE_PORT Frontend development server port (default: 3001)
HOST Host address to bind to (default: 127.0.0.1)
DEBUG Enable debug mode (true/false/1)
OPENAI_API_KEY OpenAI API key for transcription features
`);
}