tusktsk
Version:
TuskTsk - The Freedom Configuration Language. Query databases, use any syntax, never bow to any king!
377 lines (329 loc) • 10.4 kB
JavaScript
/**
* TuskLang CLI for JavaScript/Node.js
* ===================================
* Universal CLI implementation following the TuskLang CLI Command Specification
*
* "Strong. Secure. Scalable."
*/
const { Command } = require('commander');
const path = require('path');
const fs = require('fs').promises;
const TuskLang = require('../index.js');
const PeanutConfig = require('../peanut-config.js');
// Import command modules
const dbCommands = require('./commands/db.js');
const devCommands = require('./commands/dev.js');
const testCommands = require('./commands/test.js');
const serviceCommands = require('./commands/service.js');
const cacheCommands = require('./commands/cache.js');
const configCommands = require('./commands/config.js');
const aiCommands = require('./commands/ai.js');
const binaryCommands = require('./commands/binary.js');
const utilityCommands = require('./commands/utility.js');
const webCommands = require('./commands/web.js');
const peanutsCommands = require('./commands/peanuts.js');
const cssCommands = require('./commands/css.js');
const licenseCommands = require('./commands/license.js');
const securityCommands = require('./commands/security.js');
const dependencyCommands = require('./commands/dependency.js');
// CLI version
const VERSION = '2.1.0';
// Create CLI program
const program = new Command();
// Global options
program
.name('tsk')
.description('TuskLang CLI - The Freedom Configuration Language')
.version(VERSION)
.option('--verbose', 'Enable verbose output')
.option('--quiet, -q', 'Suppress non-error output')
.option('--config <path>', 'Use alternate config file')
.option('--json', 'Output in JSON format');
// Helper function for output formatting
function output(data, options = {}) {
if (options.json) {
console.log(JSON.stringify(data, null, 2));
} else {
if (typeof data === 'object') {
console.log(JSON.stringify(data, null, 2));
} else {
console.log(data);
}
}
}
// Helper function for status symbols
function status(success, message) {
const symbol = success ? '✅' : '❌';
return `${symbol} ${message}`;
}
// Helper function for warning
function warning(message) {
return `⚠️ ${message}`;
}
// Helper function for info
function info(message) {
return `📍 ${message}`;
}
// Helper function for loading
function loading(message) {
return `🔄 ${message}`;
}
// Global error handler
program.exitOverride();
process.on('uncaughtException', (err) => {
console.error('❌ Uncaught Exception:', err.message);
process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('❌ Unhandled Rejection at:', promise, 'reason:', reason);
process.exit(1);
});
// Database Commands
program
.command('db')
.description('Database operations')
.addCommand(dbCommands.status)
.addCommand(dbCommands.migrate)
.addCommand(dbCommands.console)
.addCommand(dbCommands.backup)
.addCommand(dbCommands.restore)
.addCommand(dbCommands.init);
// Development Commands
program
.command('serve')
.description('Start development server')
.argument('[port]', 'Port number', '8080')
.action(devCommands.serve);
program
.command('compile')
.description('Compile .tsk file')
.argument('<file>', 'TSK file to compile')
.action(devCommands.compile);
program
.command('optimize')
.description('Optimize .tsk file for production')
.argument('<file>', 'TSK file to optimize')
.action(devCommands.optimize);
// Testing Commands
program
.command('test')
.description('Run tests')
.argument('[suite]', 'Test suite to run', 'all')
.action(testCommands.run);
// Service Commands
program
.command('services')
.description('Service management')
.addCommand(serviceCommands.start)
.addCommand(serviceCommands.stop)
.addCommand(serviceCommands.restart)
.addCommand(serviceCommands.status);
// Cache Commands
program
.command('cache')
.description('Cache operations')
.addCommand(cacheCommands.clear)
.addCommand(cacheCommands.status)
.addCommand(cacheCommands.warm)
.addCommand(cacheCommands.memcached);
// Configuration Commands
program
.command('config')
.description('Configuration management')
.addCommand(configCommands.get)
.addCommand(configCommands.check)
.addCommand(configCommands.validate)
.addCommand(configCommands.compile)
.addCommand(configCommands.docs)
.addCommand(configCommands.clearCache)
.addCommand(configCommands.stats);
// Binary Commands
program
.command('binary')
.description('Binary performance operations')
.addCommand(binaryCommands.compile)
.addCommand(binaryCommands.execute)
.addCommand(binaryCommands.benchmark)
.addCommand(binaryCommands.optimize);
// AI Commands
program
.command('ai')
.description('AI operations')
.addCommand(aiCommands.claude)
.addCommand(aiCommands.chatgpt)
.addCommand(aiCommands.analyze)
.addCommand(aiCommands.optimize)
.addCommand(aiCommands.security);
// Web Commands
program
.command('web')
.description('TuskLang web server management')
.addCommand(webCommands.webStart)
.addCommand(webCommands.webStatus)
.addCommand(webCommands.webStop)
.addCommand(webCommands.webTest)
.addCommand(webCommands.webConfig)
.addCommand(webCommands.webLogs);
// Utility Commands
program
.command('parse')
.description('Parse TSK file')
.argument('<file>', 'TSK file to parse')
.action(utilityCommands.parse);
program
.command('validate')
.description('Validate TSK file syntax')
.argument('<file>', 'TSK file to validate')
.action(utilityCommands.validate);
program
.command('convert')
.description('Convert between formats')
.option('-i, --input <file>', 'Input file')
.option('-o, --output <file>', 'Output file')
.action(utilityCommands.convert);
program
.command('get')
.description('Get specific value by key path')
.argument('<file>', 'TSK file')
.argument('<key.path>', 'Key path')
.action(utilityCommands.get);
program
.command('set')
.description('Set value by key path')
.argument('<file>', 'TSK file')
.argument('<key.path>', 'Key path')
.argument('<value>', 'Value to set')
.action(utilityCommands.set);
// Peanuts Commands
program
.command('peanuts')
.description('Peanut configuration management')
.addCommand(peanutsCommands.compile)
.addCommand(peanutsCommands.autoCompile)
.addCommand(peanutsCommands.load);
// CSS Commands
program
.command('css')
.description('CSS processing and optimization')
.addCommand(cssCommands.expand)
.addCommand(cssCommands.map);
// License Commands
program
.command('license')
.description('License validation and management')
.addCommand(licenseCommands.check)
.addCommand(licenseCommands.activate)
.addCommand(licenseCommands.validate)
.addCommand(licenseCommands.info)
.addCommand(licenseCommands.transfer)
.addCommand(licenseCommands.revoke);
// Security Commands
program
.command('security')
.description('Security auditing and compliance')
.addCommand(securityCommands.login)
.addCommand(securityCommands.logout)
.addCommand(securityCommands.status)
.addCommand(securityCommands.scan)
.addCommand(securityCommands.encrypt)
.addCommand(securityCommands.decrypt)
.addCommand(securityCommands.audit)
.addCommand(securityCommands.hash);
// Dependency Commands
program
.command('dependency')
.description('Dependency management')
.addCommand(dependencyCommands.install)
.addCommand(dependencyCommands.list)
.addCommand(dependencyCommands.check);
// Interactive mode when no command provided
if (process.argv.length === 2) {
console.log(`🐘 TuskLang v${VERSION} - Interactive Mode`);
console.log('Type "help" for commands, "exit" to quit\n');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'tsk> '
});
rl.prompt();
rl.on('line', async (line) => {
const input = line.trim();
if (input === 'exit' || input === 'quit') {
rl.close();
return;
}
if (input === 'help') {
console.log('Available commands:');
console.log(' db status - Check database connection');
console.log(' config get <path> - Get configuration value');
console.log(' parse <file> - Parse TSK file');
console.log(' test all - Run all tests');
console.log(' peanuts compile - Compile peanut files');
console.log(' css expand - Expand CSS shorthand');
console.log(' license check - Check license status');
console.log(' security scan - Security vulnerability scan');
console.log(' dependency list - List dependency groups');
console.log(' exit - Exit interactive mode');
console.log('');
rl.prompt();
return;
}
if (input) {
try {
// Parse the command
const args = input.split(' ');
const command = args[0];
switch (command) {
case 'db':
if (args[1] === 'status') {
const result = await dbCommands.status.action();
console.log(result);
}
break;
case 'config':
if (args[1] === 'get' && args[2]) {
const result = await configCommands.get.action(args[2]);
console.log(result);
}
break;
case 'parse':
if (args[1]) {
const result = await utilityCommands.parse(args[1]);
console.log(result);
}
break;
case 'test':
if (args[1] === 'all') {
const result = await testCommands.run('all');
console.log(result);
}
break;
default:
console.log(`Unknown command: ${command}`);
console.log('Type "help" for available commands');
}
} catch (error) {
console.error('❌ Error:', error.message);
}
}
rl.prompt();
});
rl.on('close', () => {
console.log('Goodbye!');
process.exit(0);
});
} else {
// Parse command line arguments
program.parse();
}
module.exports = {
program,
output,
status,
warning,
info,
loading,
VERSION
};