fix(cli): Fix internal imports, centralize IPC types and improve daemon entry/start behavior
This commit is contained in:
		@@ -1,5 +1,13 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
 | 
			
		||||
## 2025-08-28 - 3.1.1 - fix(cli)
 | 
			
		||||
Fix internal imports, centralize IPC types and improve daemon entry/start behavior
 | 
			
		||||
 | 
			
		||||
- Corrected import paths in CLI commands and utilities to use client/tspm.ipcclient and shared/common/utils.errorhandler
 | 
			
		||||
- Centralized process/IPC type definitions into ts/shared/protocol/ipc.types.ts and updated references across daemon and client code
 | 
			
		||||
- Refactored ts/daemon/index.ts to export startDaemon and only auto-start the daemon when the module is executed directly
 | 
			
		||||
- Adjusted ts/index.ts exports to expose client API, shared protocol types, and daemon start entrypoint
 | 
			
		||||
 | 
			
		||||
## 2025-08-28 - 3.1.0 - feat(daemon)
 | 
			
		||||
Reorganize and refactor core into client/daemon/shared modules; add IPC protocol and tests
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,6 @@
 | 
			
		||||
 */
 | 
			
		||||
export const commitinfo = {
 | 
			
		||||
  name: '@git.zone/tspm',
 | 
			
		||||
  version: '3.1.0',
 | 
			
		||||
  version: '3.1.1',
 | 
			
		||||
  description: 'a no fuzz process manager'
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import * as paths from '../../../paths.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { Logger } from '../../../utils.errorhandler.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import { Logger } from '../../../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { formatMemory } from '../../helpers/memory.js';
 | 
			
		||||
 | 
			
		||||
@@ -83,7 +83,7 @@ export function registerDaemonCommand(smartcli: plugins.smartcli.Smartcli) {
 | 
			
		||||
        case 'start-service':
 | 
			
		||||
          // This is called by systemd - start the daemon directly
 | 
			
		||||
          console.log('Starting TSPM daemon for systemd service...');
 | 
			
		||||
          const { startDaemon } = await import('../../../classes.daemon.js');
 | 
			
		||||
          const { startDaemon } = await import('../../../daemon/tspm.daemon.js');
 | 
			
		||||
          await startDaemon();
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import * as plugins from '../../plugins.js';
 | 
			
		||||
import * as paths from '../../paths.js';
 | 
			
		||||
import { tspmIpcClient } from '../../classes.ipcclient.js';
 | 
			
		||||
import { Logger } from '../../utils.errorhandler.js';
 | 
			
		||||
import { tspmIpcClient } from '../../client/tspm.ipcclient.js';
 | 
			
		||||
import { Logger } from '../../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type { CliArguments } from '../types.js';
 | 
			
		||||
import { pad } from '../helpers/formatting.js';
 | 
			
		||||
import { formatMemory } from '../helpers/memory.js';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
import { formatMemory } from '../../helpers/memory.js';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
import { getBool, getNumber } from '../../helpers/argv.js';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
 | 
			
		||||
import type { IProcessConfig } from '../../../classes.tspm.js';
 | 
			
		||||
import type { IProcessConfig } from '../../../shared/protocol/ipc.types.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
import { parseMemoryString, formatMemory } from '../../helpers/memory.js';
 | 
			
		||||
import { registerIpcCommand } from '../../registration/index.js';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { TspmServiceManager } from '../../../classes.servicemanager.js';
 | 
			
		||||
import { Logger } from '../../../utils.errorhandler.js';
 | 
			
		||||
import { TspmServiceManager } from '../../../client/tspm.servicemanager.js';
 | 
			
		||||
import { Logger } from '../../../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
 | 
			
		||||
export function registerDisableCommand(smartcli: plugins.smartcli.Smartcli) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import * as plugins from '../../../plugins.js';
 | 
			
		||||
import { TspmServiceManager } from '../../../classes.servicemanager.js';
 | 
			
		||||
import { Logger } from '../../../utils.errorhandler.js';
 | 
			
		||||
import { TspmServiceManager } from '../../../client/tspm.servicemanager.js';
 | 
			
		||||
import { Logger } from '../../../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type { CliArguments } from '../../types.js';
 | 
			
		||||
 | 
			
		||||
export function registerEnableCommand(smartcli: plugins.smartcli.Smartcli) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import { tspmIpcClient } from '../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../client/tspm.ipcclient.js';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Preflight the daemon if required. Uses getDaemonStatus() which is safe and cheap:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import { tspmIpcClient } from '../../classes.ipcclient.js';
 | 
			
		||||
import { tspmIpcClient } from '../../client/tspm.ipcclient.js';
 | 
			
		||||
 | 
			
		||||
// Helper function to run IPC commands with automatic disconnect
 | 
			
		||||
export async function runIpcCommand<T>(body: () => Promise<T>): Promise<T> {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,18 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
 | 
			
		||||
import { startDaemon } from './tspm.daemon.js';
 | 
			
		||||
/**
 | 
			
		||||
 * Daemon entry point - runs process management server
 | 
			
		||||
 * This should only be run directly by the CLI or as a systemd service
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Start the daemon
 | 
			
		||||
startDaemon().catch((error) => {
 | 
			
		||||
  console.error('Failed to start daemon:', error);
 | 
			
		||||
  process.exit(1);
 | 
			
		||||
});
 | 
			
		||||
export { startDaemon } from './tspm.daemon.js';
 | 
			
		||||
 | 
			
		||||
// When executed directly (not imported), start the daemon
 | 
			
		||||
if (import.meta.url === `file://${process.argv[1]}`) {
 | 
			
		||||
  import('./tspm.daemon.js').then(({ startDaemon }) => {
 | 
			
		||||
    startDaemon().catch((error) => {
 | 
			
		||||
      console.error('Failed to start daemon:', error);
 | 
			
		||||
      process.exit(1);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,7 @@
 | 
			
		||||
import * as plugins from '../plugins.js';
 | 
			
		||||
import { EventEmitter } from 'events';
 | 
			
		||||
import * as paths from '../paths.js';
 | 
			
		||||
import {
 | 
			
		||||
  ProcessMonitor,
 | 
			
		||||
  type IMonitorConfig,
 | 
			
		||||
} from './processmonitor.js';
 | 
			
		||||
import { type IProcessLog } from './processwrapper.js';
 | 
			
		||||
import { ProcessMonitor } from './processmonitor.js';
 | 
			
		||||
import { TspmConfig } from './tspm.config.js';
 | 
			
		||||
import {
 | 
			
		||||
  Logger,
 | 
			
		||||
@@ -14,23 +10,14 @@ import {
 | 
			
		||||
  ValidationError,
 | 
			
		||||
  handleError,
 | 
			
		||||
} from '../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type {
 | 
			
		||||
  IProcessConfig,
 | 
			
		||||
  IProcessInfo,
 | 
			
		||||
  IProcessLog,
 | 
			
		||||
  IMonitorConfig
 | 
			
		||||
} from '../shared/protocol/ipc.types.js';
 | 
			
		||||
 | 
			
		||||
export interface IProcessConfig extends IMonitorConfig {
 | 
			
		||||
  id: string; // Unique identifier for the process
 | 
			
		||||
  autorestart: boolean; // Whether to restart the process automatically on crash
 | 
			
		||||
  watch?: boolean; // Whether to watch for file changes and restart
 | 
			
		||||
  watchPaths?: string[]; // Paths to watch for changes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IProcessInfo {
 | 
			
		||||
  id: string;
 | 
			
		||||
  pid?: number;
 | 
			
		||||
  status: 'online' | 'stopped' | 'errored';
 | 
			
		||||
  memory: number;
 | 
			
		||||
  cpu?: number;
 | 
			
		||||
  uptime?: number;
 | 
			
		||||
  restarts: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class ProcessManager extends EventEmitter {
 | 
			
		||||
  public processes: Map<string, ProcessMonitor> = new Map();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,8 @@
 | 
			
		||||
import * as plugins from '../plugins.js';
 | 
			
		||||
import { EventEmitter } from 'events';
 | 
			
		||||
import { ProcessWrapper, type IProcessLog } from './processwrapper.js';
 | 
			
		||||
import { ProcessWrapper } from './processwrapper.js';
 | 
			
		||||
import { Logger, ProcessError, handleError } from '../shared/common/utils.errorhandler.js';
 | 
			
		||||
 | 
			
		||||
export interface IMonitorConfig {
 | 
			
		||||
  name?: string; // Optional name to identify the instance
 | 
			
		||||
  projectDir: string; // Directory where the command will run
 | 
			
		||||
  command: string; // Full command to run (e.g., "npm run xyz")
 | 
			
		||||
  args?: string[]; // Optional: arguments for the command
 | 
			
		||||
  memoryLimitBytes: number; // Maximum allowed memory (in bytes) for the process group
 | 
			
		||||
  monitorIntervalMs?: number; // Interval (in ms) at which memory is checked (default: 5000)
 | 
			
		||||
  env?: NodeJS.ProcessEnv; // Optional: custom environment variables
 | 
			
		||||
  logBufferSize?: number; // Optional: number of log lines to keep (default: 100)
 | 
			
		||||
}
 | 
			
		||||
import type { IMonitorConfig, IProcessLog } from '../shared/protocol/ipc.types.js';
 | 
			
		||||
 | 
			
		||||
export class ProcessMonitor extends EventEmitter {
 | 
			
		||||
  private processWrapper: ProcessWrapper | null = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import * as plugins from '../plugins.js';
 | 
			
		||||
import { EventEmitter } from 'events';
 | 
			
		||||
import { Logger, ProcessError, handleError } from '../shared/common/utils.errorhandler.js';
 | 
			
		||||
import type { IProcessLog } from '../shared/protocol/ipc.types.js';
 | 
			
		||||
 | 
			
		||||
export interface IProcessWrapperOptions {
 | 
			
		||||
  command: string;
 | 
			
		||||
@@ -11,14 +12,6 @@ export interface IProcessWrapperOptions {
 | 
			
		||||
  logBuffer?: number; // Number of log lines to keep in memory (default: 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IProcessLog {
 | 
			
		||||
  timestamp: Date;
 | 
			
		||||
  type: 'stdout' | 'stderr' | 'system';
 | 
			
		||||
  message: string;
 | 
			
		||||
  seq: number;
 | 
			
		||||
  runId: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class ProcessWrapper extends EventEmitter {
 | 
			
		||||
  private process: plugins.childProcess.ChildProcess | null = null;
 | 
			
		||||
  private options: IProcessWrapperOptions;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								ts/index.ts
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								ts/index.ts
									
									
									
									
									
								
							@@ -1,9 +1,11 @@
 | 
			
		||||
export * from './classes.tspm.js';
 | 
			
		||||
export * from './classes.processmonitor.js';
 | 
			
		||||
export * from './classes.daemon.js';
 | 
			
		||||
export * from './classes.ipcclient.js';
 | 
			
		||||
export * from './classes.servicemanager.js';
 | 
			
		||||
export * from './ipc.types.js';
 | 
			
		||||
// Client exports - for library consumers
 | 
			
		||||
export * from './client/index.js';
 | 
			
		||||
 | 
			
		||||
// Protocol types - shared between client and daemon
 | 
			
		||||
export * from './shared/protocol/ipc.types.js';
 | 
			
		||||
 | 
			
		||||
// Daemon exports - for direct daemon control
 | 
			
		||||
export { startDaemon } from './daemon/index.js';
 | 
			
		||||
 | 
			
		||||
import * as cli from './cli.js';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,39 @@
 | 
			
		||||
import type { IProcessConfig, IProcessInfo } from './classes.tspm.js';
 | 
			
		||||
import type { IProcessLog } from './classes.processwrapper.js';
 | 
			
		||||
// Process-related interfaces (used in IPC communication)
 | 
			
		||||
export interface IMonitorConfig {
 | 
			
		||||
  name?: string; // Optional name to identify the instance
 | 
			
		||||
  projectDir: string; // Directory where the command will run
 | 
			
		||||
  command: string; // Full command to run (e.g., "npm run xyz")
 | 
			
		||||
  args?: string[]; // Optional: arguments for the command
 | 
			
		||||
  memoryLimitBytes: number; // Maximum allowed memory (in bytes) for the process group
 | 
			
		||||
  monitorIntervalMs?: number; // Interval (in ms) at which memory is checked (default: 5000)
 | 
			
		||||
  env?: NodeJS.ProcessEnv; // Optional: custom environment variables
 | 
			
		||||
  logBufferSize?: number; // Optional: number of log lines to keep (default: 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IProcessConfig extends IMonitorConfig {
 | 
			
		||||
  id: string; // Unique identifier for the process
 | 
			
		||||
  autorestart: boolean; // Whether to restart the process automatically on crash
 | 
			
		||||
  watch?: boolean; // Whether to watch for file changes and restart
 | 
			
		||||
  watchPaths?: string[]; // Paths to watch for changes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IProcessInfo {
 | 
			
		||||
  id: string;
 | 
			
		||||
  pid?: number;
 | 
			
		||||
  status: 'online' | 'stopped' | 'errored';
 | 
			
		||||
  memory: number;
 | 
			
		||||
  cpu?: number;
 | 
			
		||||
  uptime?: number;
 | 
			
		||||
  restarts: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IProcessLog {
 | 
			
		||||
  timestamp: Date;
 | 
			
		||||
  type: 'stdout' | 'stderr' | 'system';
 | 
			
		||||
  message: string;
 | 
			
		||||
  seq: number;
 | 
			
		||||
  runId: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Base message types
 | 
			
		||||
export interface IpcRequest<T = any> {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user