131 lines
5.2 KiB
TypeScript
131 lines
5.2 KiB
TypeScript
import * as plugins from './plugins.js';
|
|
import { tspmIpcClient } from '../client/tspm.ipcclient.js';
|
|
import * as paths from '../paths.js';
|
|
import { Logger, LogLevel } from '../shared/common/utils.errorhandler.js';
|
|
import { TspmServiceManager } from '../client/tspm.servicemanager.js';
|
|
|
|
// Import command registration functions
|
|
import { registerDefaultCommand } from './commands/default.js';
|
|
import { registerStartCommand } from './commands/process/start.js';
|
|
import { registerAddCommand } from './commands/process/add.js';
|
|
import { registerStopCommand } from './commands/process/stop.js';
|
|
import { registerRestartCommand } from './commands/process/restart.js';
|
|
import { registerDeleteCommand } from './commands/process/delete.js';
|
|
import { registerSearchCommand } from './commands/process/search.js';
|
|
import { registerListCommand } from './commands/process/list.js';
|
|
import { registerDescribeCommand } from './commands/process/describe.js';
|
|
import { registerLogsCommand } from './commands/process/logs.js';
|
|
import { registerEditCommand } from './commands/process/edit.js';
|
|
import { registerStartAllCommand } from './commands/batch/start-all.js';
|
|
import { registerStopAllCommand } from './commands/batch/stop-all.js';
|
|
import { registerRestartAllCommand } from './commands/batch/restart-all.js';
|
|
import { registerDaemonCommand } from './commands/daemon/index.js';
|
|
import { registerEnableCommand } from './commands/service/enable.js';
|
|
import { registerDisableCommand } from './commands/service/disable.js';
|
|
import { registerResetCommand } from './commands/reset.js';
|
|
|
|
// Export types for external use
|
|
export type { CliArguments } from './types.js';
|
|
|
|
/**
|
|
* Main CLI entry point
|
|
*/
|
|
export const run = async (): Promise<void> => {
|
|
const cliLogger = new Logger('CLI');
|
|
const tspmProjectinfo = new plugins.projectinfo.ProjectInfo(paths.packageDir);
|
|
|
|
// Check if debug mode is enabled
|
|
const debugMode = process.env.TSPM_DEBUG === 'true';
|
|
if (debugMode) {
|
|
cliLogger.setLevel(LogLevel.DEBUG);
|
|
cliLogger.debug('Debug mode enabled');
|
|
}
|
|
|
|
const smartcliInstance = new plugins.smartcli.Smartcli();
|
|
// Intercept -v/--version to show CLI and daemon versions
|
|
const args = process.argv.slice(2);
|
|
if (args.includes('-v') || args.includes('--version')) {
|
|
const cliVersion = tspmProjectinfo.npm.version;
|
|
console.log(`tspm CLI: ${cliVersion}`);
|
|
const status = await tspmIpcClient.getDaemonStatus();
|
|
if (status) {
|
|
console.log(
|
|
`Daemon: running v${status.version || 'unknown'} (pid ${status.pid})`,
|
|
);
|
|
// If versions mismatch, offer to refresh the systemd service
|
|
if (status.version && status.version !== cliVersion) {
|
|
console.log('\nVersion mismatch detected:');
|
|
console.log(` CLI: v${cliVersion}`);
|
|
console.log(` Daemon: v${status.version}`);
|
|
console.log(
|
|
'\nThis can happen after upgrading tspm. The systemd service may still point to an older version.\n' +
|
|
'You can refresh the service (equivalent to "tspm disable" then "tspm enable").',
|
|
);
|
|
|
|
// Ask the user for confirmation
|
|
const confirm = await plugins.smartinteract.SmartInteract.getCliConfirmation(
|
|
'Refresh the systemd service now?',
|
|
true,
|
|
);
|
|
if (confirm) {
|
|
try {
|
|
const sm = new TspmServiceManager();
|
|
console.log('Refreshing TSPM system service...');
|
|
await sm.disableService();
|
|
await sm.enableService();
|
|
console.log('✓ Service refreshed. Daemon restarted via systemd.');
|
|
} catch (err: any) {
|
|
console.error(
|
|
'Failed to refresh service automatically. You can try manually:\n tspm disable && tspm enable',
|
|
);
|
|
console.error(err?.message || String(err));
|
|
}
|
|
} else {
|
|
console.log('Skipped service refresh.');
|
|
}
|
|
}
|
|
} else {
|
|
console.log('Daemon: not running');
|
|
}
|
|
// Ensure we disconnect any IPC client connection used for status
|
|
try { await tspmIpcClient.disconnect(); } catch {}
|
|
return; // do not start parser
|
|
}
|
|
// Keep Smartcli version info for help output but not used for -v now
|
|
smartcliInstance.addVersion(tspmProjectinfo.npm.version);
|
|
|
|
// Register all commands
|
|
// Default command (help + list)
|
|
registerDefaultCommand(smartcliInstance);
|
|
|
|
// Process commands
|
|
registerAddCommand(smartcliInstance);
|
|
registerStartCommand(smartcliInstance);
|
|
registerStopCommand(smartcliInstance);
|
|
registerRestartCommand(smartcliInstance);
|
|
registerDeleteCommand(smartcliInstance);
|
|
registerListCommand(smartcliInstance);
|
|
registerDescribeCommand(smartcliInstance);
|
|
registerLogsCommand(smartcliInstance);
|
|
registerEditCommand(smartcliInstance);
|
|
registerSearchCommand(smartcliInstance);
|
|
|
|
// Batch commands
|
|
registerStartAllCommand(smartcliInstance);
|
|
registerStopAllCommand(smartcliInstance);
|
|
registerRestartAllCommand(smartcliInstance);
|
|
|
|
// Daemon commands
|
|
registerDaemonCommand(smartcliInstance);
|
|
|
|
// Service commands
|
|
registerEnableCommand(smartcliInstance);
|
|
registerDisableCommand(smartcliInstance);
|
|
|
|
// Maintenance commands
|
|
registerResetCommand(smartcliInstance);
|
|
|
|
// Start parsing commands
|
|
smartcliInstance.startParse();
|
|
};
|