@sunpix/claude-code-web
Version:
A web-based interface for interacting with Claude Code CLI
75 lines (61 loc) ⢠2.21 kB
JavaScript
import { spawn } from 'child_process';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import { access, readFile } from 'fs/promises';
const __dirname = dirname(fileURLToPath(import.meta.url));
const projectRoot = join(__dirname, '..');
async function startServer() {
// Check if .output directory exists (production build)
const outputDir = join(projectRoot, '.output');
try {
await access(outputDir);
// Read and display version from package.json
const packagePath = join(projectRoot, 'package.json');
const packageJson = JSON.parse(await readFile(packagePath, 'utf8'));
console.log(`š Starting claude-code-web v${packageJson.version}`);
let host = process.env.HOST || '127.0.0.1';
let port = process.env.PORT || '3000';
let suffix = ''
// Show APP_BASE_URL if set
if (process.env.APP_BASE_URL) {
suffix = process.env.APP_BASE_URL
}
console.log(`š” Server: http://${host}:${port}${suffix}`);
console.log('š¦ Node version:', process.version);
// Start the production server
const server = spawn('node', [join(outputDir, 'server', 'index.mjs')], {
stdio: 'inherit',
cwd: projectRoot,
env: {
...process.env,
NODE_ENV: 'production',
NUXT_APP_BASE_URL: process.env.APP_BASE_URL,
PORT: process.env.PORT || '3000',
HOST: process.env.HOST || '0.0.0.0'
}
});
server.on('error', (err) => {
console.error('ā Failed to start server:', err);
process.exit(1);
});
server.on('exit', (code) => {
process.exit(code || 0);
});
// Increase max listeners to prevent warnings
process.setMaxListeners(20);
// Handle graceful shutdown (use once to prevent duplicate listeners)
process.once('SIGINT', () => {
console.log('\nš Shutting down Claude Code Web...');
server.kill('SIGINT');
});
process.once('SIGTERM', () => {
console.log('\nš Shutting down Claude Code Web...');
server.kill('SIGTERM');
});
} catch (error) {
console.error('ā Error starting server:', error)
process.exit(1);
}
}
startServer();