mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-01-23 18:07:34 +00:00
227 lines
7.7 KiB
JavaScript
Executable File
227 lines
7.7 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
/**
|
|
* Claude Code UI CLI
|
|
*
|
|
* Provides command-line utilities for managing Claude Code UI
|
|
*
|
|
* Commands:
|
|
* (no args) - Start the server (default)
|
|
* start - Start the server
|
|
* status - Show configuration and data locations
|
|
* help - Show help information
|
|
* version - Show version information
|
|
*/
|
|
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import os from 'os';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname } from 'path';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
// ANSI color codes for terminal output
|
|
const colors = {
|
|
reset: '\x1b[0m',
|
|
bright: '\x1b[1m',
|
|
dim: '\x1b[2m',
|
|
|
|
// Foreground colors
|
|
cyan: '\x1b[36m',
|
|
green: '\x1b[32m',
|
|
yellow: '\x1b[33m',
|
|
blue: '\x1b[34m',
|
|
magenta: '\x1b[35m',
|
|
white: '\x1b[37m',
|
|
gray: '\x1b[90m',
|
|
};
|
|
|
|
// Helper to colorize text
|
|
const c = {
|
|
info: (text) => `${colors.cyan}${text}${colors.reset}`,
|
|
ok: (text) => `${colors.green}${text}${colors.reset}`,
|
|
warn: (text) => `${colors.yellow}${text}${colors.reset}`,
|
|
error: (text) => `${colors.yellow}${text}${colors.reset}`,
|
|
tip: (text) => `${colors.blue}${text}${colors.reset}`,
|
|
bright: (text) => `${colors.bright}${text}${colors.reset}`,
|
|
dim: (text) => `${colors.dim}${text}${colors.reset}`,
|
|
};
|
|
|
|
// Load package.json for version info
|
|
const packageJsonPath = path.join(__dirname, '../package.json');
|
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
|
|
// Load environment variables from .env file if it exists
|
|
function loadEnvFile() {
|
|
try {
|
|
const envPath = path.join(__dirname, '../.env');
|
|
const envFile = fs.readFileSync(envPath, 'utf8');
|
|
envFile.split('\n').forEach(line => {
|
|
const trimmedLine = line.trim();
|
|
if (trimmedLine && !trimmedLine.startsWith('#')) {
|
|
const [key, ...valueParts] = trimmedLine.split('=');
|
|
if (key && valueParts.length > 0 && !process.env[key]) {
|
|
process.env[key] = valueParts.join('=').trim();
|
|
}
|
|
}
|
|
});
|
|
} catch (e) {
|
|
// .env file is optional
|
|
}
|
|
}
|
|
|
|
// Get the database path (same logic as db.js)
|
|
function getDatabasePath() {
|
|
loadEnvFile();
|
|
return process.env.DATABASE_PATH || path.join(__dirname, 'database', 'auth.db');
|
|
}
|
|
|
|
// Get the installation directory
|
|
function getInstallDir() {
|
|
return path.join(__dirname, '..');
|
|
}
|
|
|
|
// Show status command
|
|
function showStatus() {
|
|
console.log(`\n${c.bright('Claude Code UI - Status')}\n`);
|
|
console.log(c.dim('═'.repeat(60)));
|
|
|
|
// Version info
|
|
console.log(`\n${c.info('[INFO]')} Version: ${c.bright(packageJson.version)}`);
|
|
|
|
// Installation location
|
|
const installDir = getInstallDir();
|
|
console.log(`\n${c.info('[INFO]')} Installation Directory:`);
|
|
console.log(` ${c.dim(installDir)}`);
|
|
|
|
// Database location
|
|
const dbPath = getDatabasePath();
|
|
const dbExists = fs.existsSync(dbPath);
|
|
console.log(`\n${c.info('[INFO]')} Database Location:`);
|
|
console.log(` ${c.dim(dbPath)}`);
|
|
console.log(` Status: ${dbExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not created yet (will be created on first run)')}`);
|
|
|
|
if (dbExists) {
|
|
const stats = fs.statSync(dbPath);
|
|
console.log(` Size: ${c.dim((stats.size / 1024).toFixed(2) + ' KB')}`);
|
|
console.log(` Modified: ${c.dim(stats.mtime.toLocaleString())}`);
|
|
}
|
|
|
|
// Environment variables
|
|
console.log(`\n${c.info('[INFO]')} Configuration:`);
|
|
console.log(` PORT: ${c.bright(process.env.PORT || '3001')} ${c.dim(process.env.PORT ? '' : '(default)')}`);
|
|
console.log(` DATABASE_PATH: ${c.dim(process.env.DATABASE_PATH || '(using default location)')}`);
|
|
console.log(` CLAUDE_CLI_PATH: ${c.dim(process.env.CLAUDE_CLI_PATH || 'claude (default)')}`);
|
|
console.log(` CONTEXT_WINDOW: ${c.dim(process.env.CONTEXT_WINDOW || '160000 (default)')}`);
|
|
|
|
// Claude projects folder
|
|
const claudeProjectsPath = path.join(os.homedir(), '.claude', 'projects');
|
|
const projectsExists = fs.existsSync(claudeProjectsPath);
|
|
console.log(`\n${c.info('[INFO]')} Claude Projects Folder:`);
|
|
console.log(` ${c.dim(claudeProjectsPath)}`);
|
|
console.log(` Status: ${projectsExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not found')}`);
|
|
|
|
// Config file location
|
|
const envFilePath = path.join(__dirname, '../.env');
|
|
const envExists = fs.existsSync(envFilePath);
|
|
console.log(`\n${c.info('[INFO]')} Configuration File:`);
|
|
console.log(` ${c.dim(envFilePath)}`);
|
|
console.log(` Status: ${envExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not found (using defaults)')}`);
|
|
|
|
console.log('\n' + c.dim('═'.repeat(60)));
|
|
console.log(`\n${c.tip('[TIP]')} Hints:`);
|
|
console.log(` ${c.dim('>')} Set DATABASE_PATH env variable to use a custom database location`);
|
|
console.log(` ${c.dim('>')} Create .env file in installation directory for persistent config`);
|
|
console.log(` ${c.dim('>')} Run "claude-code-ui" or "cloudcli start" to start the server`);
|
|
console.log(` ${c.dim('>')} Access the UI at http://localhost:3001 (or custom PORT)\n`);
|
|
}
|
|
|
|
// Show help
|
|
function showHelp() {
|
|
console.log(`
|
|
╔═══════════════════════════════════════════════════════════════╗
|
|
║ Claude Code UI - Command Line Tool ║
|
|
╚═══════════════════════════════════════════════════════════════╝
|
|
|
|
Usage:
|
|
claude-code-ui [command]
|
|
cloudcli [command]
|
|
|
|
Commands:
|
|
start Start the Claude Code UI server (default)
|
|
status Show configuration and data locations
|
|
help Show this help information
|
|
version Show version information
|
|
|
|
Examples:
|
|
$ claude-code-ui # Start the server
|
|
$ cloudcli status # Show configuration
|
|
$ cloudcli help # Show help
|
|
|
|
Environment Variables:
|
|
PORT Set server port (default: 3001)
|
|
DATABASE_PATH Set custom database location
|
|
CLAUDE_CLI_PATH Set custom Claude CLI path
|
|
CONTEXT_WINDOW Set context window size (default: 160000)
|
|
|
|
Configuration:
|
|
Create a .env file in the installation directory to set
|
|
persistent environment variables. Use 'cloudcli status' to
|
|
see the installation directory path.
|
|
|
|
Documentation:
|
|
${packageJson.homepage || 'https://github.com/siteboon/claudecodeui'}
|
|
|
|
Report Issues:
|
|
${packageJson.bugs?.url || 'https://github.com/siteboon/claudecodeui/issues'}
|
|
`);
|
|
}
|
|
|
|
// Show version
|
|
function showVersion() {
|
|
console.log(`${packageJson.version}`);
|
|
}
|
|
|
|
// Start the server
|
|
async function startServer() {
|
|
// Import and run the server
|
|
await import('./index.js');
|
|
}
|
|
|
|
// Main CLI handler
|
|
async function main() {
|
|
const args = process.argv.slice(2);
|
|
const command = args[0] || 'start';
|
|
|
|
switch (command) {
|
|
case 'start':
|
|
await startServer();
|
|
break;
|
|
case 'status':
|
|
case 'info':
|
|
showStatus();
|
|
break;
|
|
case 'help':
|
|
case '-h':
|
|
case '--help':
|
|
showHelp();
|
|
break;
|
|
case 'version':
|
|
case '-v':
|
|
case '--version':
|
|
showVersion();
|
|
break;
|
|
default:
|
|
console.error(`\n❌ Unknown command: ${command}`);
|
|
console.log(' Run "cloudcli help" for usage information.\n');
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// Run the CLI
|
|
main().catch(error => {
|
|
console.error('\n❌ Error:', error.message);
|
|
process.exit(1);
|
|
});
|