hostfn 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/__tests__/core/backup.test.d.ts +2 -0
  2. package/dist/__tests__/core/backup.test.d.ts.map +1 -0
  3. package/dist/__tests__/core/backup.test.js +108 -0
  4. package/dist/__tests__/core/backup.test.js.map +1 -0
  5. package/dist/__tests__/core/health.test.d.ts +2 -0
  6. package/dist/__tests__/core/health.test.d.ts.map +1 -0
  7. package/dist/__tests__/core/health.test.js +97 -0
  8. package/dist/__tests__/core/health.test.js.map +1 -0
  9. package/dist/__tests__/core/lock.test.d.ts +2 -0
  10. package/dist/__tests__/core/lock.test.d.ts.map +1 -0
  11. package/dist/__tests__/core/lock.test.js +136 -0
  12. package/dist/__tests__/core/lock.test.js.map +1 -0
  13. package/dist/__tests__/core/nginx-multi-domain.test.d.ts +2 -0
  14. package/dist/__tests__/core/nginx-multi-domain.test.d.ts.map +1 -0
  15. package/dist/__tests__/core/nginx-multi-domain.test.js +158 -0
  16. package/dist/__tests__/core/nginx-multi-domain.test.js.map +1 -0
  17. package/dist/__tests__/runtimes/pm2.test.d.ts +2 -0
  18. package/dist/__tests__/runtimes/pm2.test.d.ts.map +1 -0
  19. package/dist/__tests__/runtimes/pm2.test.js +111 -0
  20. package/dist/__tests__/runtimes/pm2.test.js.map +1 -0
  21. package/dist/__tests__/utils/validation.test.d.ts +2 -0
  22. package/dist/__tests__/utils/validation.test.d.ts.map +1 -0
  23. package/dist/__tests__/utils/validation.test.js +136 -0
  24. package/dist/__tests__/utils/validation.test.js.map +1 -0
  25. package/dist/commands/deploy.d.ts +11 -0
  26. package/dist/commands/deploy.d.ts.map +1 -0
  27. package/dist/commands/deploy.js +636 -0
  28. package/dist/commands/deploy.js.map +1 -0
  29. package/dist/commands/env.d.ts +21 -0
  30. package/dist/commands/env.d.ts.map +1 -0
  31. package/dist/commands/env.js +317 -0
  32. package/dist/commands/env.js.map +1 -0
  33. package/dist/commands/expose.d.ts +6 -0
  34. package/dist/commands/expose.d.ts.map +1 -0
  35. package/dist/commands/expose.js +379 -0
  36. package/dist/commands/expose.js.map +1 -0
  37. package/dist/commands/init.d.ts +2 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +175 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/logs.d.ts +10 -0
  42. package/dist/commands/logs.d.ts.map +1 -0
  43. package/dist/commands/logs.js +75 -0
  44. package/dist/commands/logs.js.map +1 -0
  45. package/dist/commands/rollback.d.ts +6 -0
  46. package/dist/commands/rollback.d.ts.map +1 -0
  47. package/dist/commands/rollback.js +113 -0
  48. package/dist/commands/rollback.js.map +1 -0
  49. package/dist/commands/server/info.d.ts +2 -0
  50. package/dist/commands/server/info.d.ts.map +1 -0
  51. package/dist/commands/server/info.js +104 -0
  52. package/dist/commands/server/info.js.map +1 -0
  53. package/dist/commands/server/setup.d.ts +11 -0
  54. package/dist/commands/server/setup.d.ts.map +1 -0
  55. package/dist/commands/server/setup.js +161 -0
  56. package/dist/commands/server/setup.js.map +1 -0
  57. package/dist/commands/status.d.ts +6 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +120 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/config/loader.d.ts +21 -0
  62. package/dist/config/loader.d.ts.map +1 -0
  63. package/dist/config/loader.js +54 -0
  64. package/dist/config/loader.js.map +1 -0
  65. package/dist/config/schema.d.ts +323 -0
  66. package/dist/config/schema.d.ts.map +1 -0
  67. package/dist/config/schema.js +108 -0
  68. package/dist/config/schema.js.map +1 -0
  69. package/dist/core/backup.d.ts +34 -0
  70. package/dist/core/backup.d.ts.map +1 -0
  71. package/dist/core/backup.js +95 -0
  72. package/dist/core/backup.js.map +1 -0
  73. package/dist/core/health.d.ts +31 -0
  74. package/dist/core/health.d.ts.map +1 -0
  75. package/dist/core/health.js +78 -0
  76. package/dist/core/health.js.map +1 -0
  77. package/dist/core/local.d.ts +19 -0
  78. package/dist/core/local.d.ts.map +1 -0
  79. package/dist/core/local.js +50 -0
  80. package/dist/core/local.js.map +1 -0
  81. package/dist/core/lock.d.ts +28 -0
  82. package/dist/core/lock.d.ts.map +1 -0
  83. package/dist/core/lock.js +89 -0
  84. package/dist/core/lock.js.map +1 -0
  85. package/dist/core/nginx.d.ts +43 -0
  86. package/dist/core/nginx.d.ts.map +1 -0
  87. package/dist/core/nginx.js +131 -0
  88. package/dist/core/nginx.js.map +1 -0
  89. package/dist/core/ssh.d.ts +79 -0
  90. package/dist/core/ssh.d.ts.map +1 -0
  91. package/dist/core/ssh.js +264 -0
  92. package/dist/core/ssh.js.map +1 -0
  93. package/dist/core/sync.d.ts +25 -0
  94. package/dist/core/sync.d.ts.map +1 -0
  95. package/dist/core/sync.js +117 -0
  96. package/dist/core/sync.js.map +1 -0
  97. package/dist/core/workspace.d.ts +13 -0
  98. package/dist/core/workspace.d.ts.map +1 -0
  99. package/dist/core/workspace.js +141 -0
  100. package/dist/core/workspace.js.map +1 -0
  101. package/dist/index.d.ts +3 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +232 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/runtimes/base.d.ts +115 -0
  106. package/dist/runtimes/base.d.ts.map +1 -0
  107. package/dist/runtimes/base.js +16 -0
  108. package/dist/runtimes/base.js.map +1 -0
  109. package/dist/runtimes/nodejs/detector.d.ts +47 -0
  110. package/dist/runtimes/nodejs/detector.d.ts.map +1 -0
  111. package/dist/runtimes/nodejs/detector.js +143 -0
  112. package/dist/runtimes/nodejs/detector.js.map +1 -0
  113. package/dist/runtimes/nodejs/index.d.ts +14 -0
  114. package/dist/runtimes/nodejs/index.d.ts.map +1 -0
  115. package/dist/runtimes/nodejs/index.js +213 -0
  116. package/dist/runtimes/nodejs/index.js.map +1 -0
  117. package/dist/runtimes/nodejs/pm2.d.ts +17 -0
  118. package/dist/runtimes/nodejs/pm2.d.ts.map +1 -0
  119. package/dist/runtimes/nodejs/pm2.js +60 -0
  120. package/dist/runtimes/nodejs/pm2.js.map +1 -0
  121. package/dist/runtimes/registry.d.ts +34 -0
  122. package/dist/runtimes/registry.d.ts.map +1 -0
  123. package/dist/runtimes/registry.js +58 -0
  124. package/dist/runtimes/registry.js.map +1 -0
  125. package/dist/utils/logger.d.ts +47 -0
  126. package/dist/utils/logger.d.ts.map +1 -0
  127. package/dist/utils/logger.js +76 -0
  128. package/dist/utils/logger.js.map +1 -0
  129. package/dist/utils/validation.d.ts +32 -0
  130. package/dist/utils/validation.d.ts.map +1 -0
  131. package/dist/utils/validation.js +125 -0
  132. package/dist/utils/validation.js.map +1 -0
  133. package/package.json +33 -16
  134. package/LICENSE +0 -21
  135. package/README.md +0 -1136
  136. package/_conduct/specs/1.v0.spec.md +0 -1041
  137. package/examples/express-api/package.json +0 -22
  138. package/examples/express-api/src/index.ts +0 -16
  139. package/examples/express-api/tsconfig.json +0 -11
  140. package/examples/github-actions-deploy.yml +0 -40
  141. package/examples/monorepo-config.json +0 -76
  142. package/examples/monorepo-multi-server-config.json +0 -74
  143. package/packages/cli/package.json +0 -40
  144. package/turbo.json +0 -24
  145. /package/{packages/cli/src → src}/__tests__/core/backup.test.ts +0 -0
  146. /package/{packages/cli/src → src}/__tests__/core/health.test.ts +0 -0
  147. /package/{packages/cli/src → src}/__tests__/core/lock.test.ts +0 -0
  148. /package/{packages/cli/src → src}/__tests__/core/nginx-multi-domain.test.ts +0 -0
  149. /package/{packages/cli/src → src}/__tests__/runtimes/pm2.test.ts +0 -0
  150. /package/{packages/cli/src → src}/__tests__/utils/validation.test.ts +0 -0
  151. /package/{packages/cli/src → src}/commands/deploy.ts +0 -0
  152. /package/{packages/cli/src → src}/commands/env.ts +0 -0
  153. /package/{packages/cli/src → src}/commands/expose.ts +0 -0
  154. /package/{packages/cli/src → src}/commands/init.ts +0 -0
  155. /package/{packages/cli/src → src}/commands/logs.ts +0 -0
  156. /package/{packages/cli/src → src}/commands/rollback.ts +0 -0
  157. /package/{packages/cli/src → src}/commands/server/info.ts +0 -0
  158. /package/{packages/cli/src → src}/commands/server/setup.ts +0 -0
  159. /package/{packages/cli/src → src}/commands/status.ts +0 -0
  160. /package/{packages/cli/src → src}/config/loader.ts +0 -0
  161. /package/{packages/cli/src → src}/config/schema.ts +0 -0
  162. /package/{packages/cli/src → src}/core/backup.ts +0 -0
  163. /package/{packages/cli/src → src}/core/health.ts +0 -0
  164. /package/{packages/cli/src → src}/core/local.ts +0 -0
  165. /package/{packages/cli/src → src}/core/lock.ts +0 -0
  166. /package/{packages/cli/src → src}/core/nginx.ts +0 -0
  167. /package/{packages/cli/src → src}/core/ssh.ts +0 -0
  168. /package/{packages/cli/src → src}/core/sync.ts +0 -0
  169. /package/{packages/cli/src → src}/core/workspace.ts +0 -0
  170. /package/{packages/cli/src → src}/index.ts +0 -0
  171. /package/{packages/cli/src → src}/runtimes/base.ts +0 -0
  172. /package/{packages/cli/src → src}/runtimes/nodejs/detector.ts +0 -0
  173. /package/{packages/cli/src → src}/runtimes/nodejs/index.ts +0 -0
  174. /package/{packages/cli/src → src}/runtimes/nodejs/pm2.ts +0 -0
  175. /package/{packages/cli/src → src}/runtimes/registry.ts +0 -0
  176. /package/{packages/cli/src → src}/utils/logger.ts +0 -0
  177. /package/{packages/cli/src → src}/utils/validation.ts +0 -0
  178. /package/{packages/cli/tsconfig.json → tsconfig.json} +0 -0
  179. /package/{packages/cli/vitest.config.ts → vitest.config.ts} +0 -0
@@ -0,0 +1,75 @@
1
+ import ora from 'ora';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { Logger } from '../utils/logger.js';
5
+ import { ConfigLoader } from '../config/loader.js';
6
+ import { createSSHConnection } from '../core/ssh.js';
7
+ import { RuntimeRegistry } from '../runtimes/registry.js';
8
+ export async function logsCommand(environment, options) {
9
+ Logger.header(`Logs - ${environment}`);
10
+ // Load configuration
11
+ const config = ConfigLoader.load();
12
+ const envConfig = config.environments[environment];
13
+ if (!envConfig) {
14
+ throw new Error(`Environment '${environment}' not found`);
15
+ }
16
+ // Handle multi-service logs
17
+ if (config.services && Object.keys(config.services).length > 0) {
18
+ if (!options.service) {
19
+ throw new Error('Multi-service deployment detected. Please specify --service <name>\n' +
20
+ `Available services: ${Object.keys(config.services).join(', ')}`);
21
+ }
22
+ if (!config.services[options.service]) {
23
+ throw new Error(`Service '${options.service}' not found\n` +
24
+ `Available: ${Object.keys(config.services).join(', ')}`);
25
+ }
26
+ const serviceConfig = config.services[options.service];
27
+ const serviceServer = serviceConfig.server || envConfig.server;
28
+ const serviceName = `${config.name}-${options.service}-${environment}`;
29
+ await fetchLogs(serviceName, serviceServer, config.runtime, options);
30
+ return;
31
+ }
32
+ const serviceName = `${config.name}-${environment}`;
33
+ await fetchLogs(serviceName, envConfig.server, config.runtime, options);
34
+ }
35
+ async function fetchLogs(serviceName, server, runtime, options) {
36
+ const adapter = RuntimeRegistry.get(runtime);
37
+ const pm2 = adapter.getProcessManager();
38
+ const spinner = ora('Connecting to server...').start();
39
+ let ssh = null;
40
+ try {
41
+ ssh = await createSSHConnection(server);
42
+ spinner.succeed('Connected');
43
+ Logger.br();
44
+ // Generate logs command
45
+ let logsCmd = pm2.generateLogsCommand(serviceName, parseInt(options.lines));
46
+ // Add error filtering if requested
47
+ if (options.errors) {
48
+ logsCmd = `${logsCmd} 2>&1 | grep -E "(error|Error|ERROR|fail|Fail|FAIL|exception|Exception)"`;
49
+ }
50
+ // Execute logs command
51
+ const result = await ssh.exec(logsCmd, { streaming: !options.output });
52
+ if (result.exitCode !== 0) {
53
+ throw new Error(result.stderr || 'Failed to fetch logs');
54
+ }
55
+ // Save to file if requested
56
+ if (options.output) {
57
+ const outputPath = path.resolve(process.cwd(), options.output);
58
+ fs.writeFileSync(outputPath, result.stdout);
59
+ Logger.success(`Logs saved to: ${outputPath}`);
60
+ Logger.kv('Lines', result.stdout.split('\n').length.toString());
61
+ Logger.kv('Size', `${(result.stdout.length / 1024).toFixed(2)} KB`);
62
+ }
63
+ }
64
+ catch (error) {
65
+ spinner.fail('Failed to get logs');
66
+ Logger.error(error instanceof Error ? error.message : String(error));
67
+ process.exit(1);
68
+ }
69
+ finally {
70
+ if (ssh) {
71
+ ssh.disconnect();
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface RollbackOptions {
2
+ to?: string;
3
+ }
4
+ export declare function rollbackCommand(environment: string, options: RollbackOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAQA,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAgIf"}
@@ -0,0 +1,113 @@
1
+ import ora from 'ora';
2
+ import inquirer from 'inquirer';
3
+ import { Logger } from '../utils/logger.js';
4
+ import { ConfigLoader } from '../config/loader.js';
5
+ import { createSSHConnection } from '../core/ssh.js';
6
+ import { BackupManager } from '../core/backup.js';
7
+ import { RuntimeRegistry } from '../runtimes/registry.js';
8
+ export async function rollbackCommand(environment, options) {
9
+ Logger.header(`Rollback - ${environment}`);
10
+ // Load configuration
11
+ const config = ConfigLoader.load();
12
+ const envConfig = config.environments[environment];
13
+ if (!envConfig) {
14
+ throw new Error(`Environment '${environment}' not found`);
15
+ }
16
+ const remoteDir = `/var/www/${config.name}-${environment}`;
17
+ const serviceName = `${config.name}-${environment}`;
18
+ const spinner = ora('Connecting to server...').start();
19
+ let ssh = null;
20
+ try {
21
+ ssh = await createSSHConnection(envConfig.server);
22
+ spinner.succeed('Connected');
23
+ Logger.br();
24
+ const backupManager = new BackupManager(ssh, remoteDir);
25
+ // List available backups
26
+ const listSpinner = ora('Fetching available backups...').start();
27
+ const backups = await backupManager.list();
28
+ listSpinner.succeed(`Found ${backups.length} backup(s)`);
29
+ if (backups.length === 0) {
30
+ Logger.warn('No backups available');
31
+ return;
32
+ }
33
+ Logger.br();
34
+ let backupToRestore;
35
+ if (options.to) {
36
+ // Use specified backup
37
+ if (!backups.includes(options.to)) {
38
+ throw new Error(`Backup not found: ${options.to}`);
39
+ }
40
+ backupToRestore = options.to;
41
+ }
42
+ else {
43
+ // Interactive selection
44
+ Logger.section('Available Backups');
45
+ backups.slice(0, 10).forEach((backup, idx) => {
46
+ Logger.log(` ${idx + 1}. ${backup}`);
47
+ });
48
+ Logger.br();
49
+ const { selectedBackup } = await inquirer.prompt([
50
+ {
51
+ type: 'list',
52
+ name: 'selectedBackup',
53
+ message: 'Select backup to restore:',
54
+ choices: backups.slice(0, 10).map((b, idx) => ({
55
+ name: `${idx + 1}. ${b}${idx === 0 ? ' (latest)' : ''}`,
56
+ value: b,
57
+ })),
58
+ },
59
+ ]);
60
+ backupToRestore = selectedBackup;
61
+ }
62
+ // Confirm rollback
63
+ Logger.br();
64
+ Logger.warn(`This will rollback to: ${backupToRestore}`);
65
+ const { confirm } = await inquirer.prompt([
66
+ {
67
+ type: 'confirm',
68
+ name: 'confirm',
69
+ message: 'Are you sure you want to rollback?',
70
+ default: false,
71
+ },
72
+ ]);
73
+ if (!confirm) {
74
+ Logger.info('Rollback cancelled');
75
+ return;
76
+ }
77
+ Logger.br();
78
+ // Perform rollback
79
+ const rollbackSpinner = ora('Restoring backup...').start();
80
+ await backupManager.restore(backupToRestore);
81
+ rollbackSpinner.succeed('Backup restored');
82
+ // Reload PM2
83
+ const adapter = RuntimeRegistry.get(config.runtime);
84
+ const pm2 = adapter.getProcessManager();
85
+ const reloadSpinner = ora('Reloading service...').start();
86
+ const reloadResult = await ssh.exec(pm2.generateReloadCommand(serviceName), { cwd: remoteDir });
87
+ if (reloadResult.exitCode !== 0) {
88
+ reloadSpinner.fail('Service reload failed');
89
+ throw new Error(`PM2 reload failed: ${reloadResult.stderr}`);
90
+ }
91
+ reloadSpinner.succeed('Service reloaded');
92
+ Logger.br();
93
+ Logger.success('Rollback completed successfully!');
94
+ Logger.br();
95
+ Logger.kv('Restored backup', backupToRestore);
96
+ Logger.kv('Service', serviceName);
97
+ Logger.br();
98
+ Logger.info('Check status:');
99
+ Logger.command(`hostfn status ${environment}`);
100
+ Logger.br();
101
+ }
102
+ catch (error) {
103
+ spinner.fail('Rollback failed');
104
+ Logger.error(error instanceof Error ? error.message : String(error));
105
+ process.exit(1);
106
+ }
107
+ finally {
108
+ if (ssh) {
109
+ ssh.disconnect();
110
+ }
111
+ }
112
+ }
113
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function serverInfoCommand(host: string): Promise<void>;
2
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/commands/server/info.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHnE"}
@@ -0,0 +1,104 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { Logger } from '../../utils/logger.js';
4
+ import { createSSHConnection } from '../../core/ssh.js';
5
+ export async function serverInfoCommand(host) {
6
+ Logger.header('Server Information');
7
+ Logger.kv('Host', host);
8
+ Logger.br();
9
+ const spinner = ora('Connecting to server...').start();
10
+ try {
11
+ const ssh = await createSSHConnection(host);
12
+ spinner.succeed('Connected');
13
+ Logger.br();
14
+ // Get system information
15
+ const infoSpinner = ora('Gathering system information...').start();
16
+ const [osInfo, nodeVersion, pm2Version, nginxStatus, diskSpace, memoryInfo, pm2List,] = await Promise.all([
17
+ ssh.exec('cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d \'"\''),
18
+ ssh.exec('source ~/.nvm/nvm.sh && node --version 2>/dev/null || echo "not installed"'),
19
+ ssh.exec('pm2 --version 2>/dev/null || echo "not installed"'),
20
+ ssh.exec('systemctl is-active nginx 2>/dev/null || echo "not running"'),
21
+ ssh.exec('df -h / | tail -1'),
22
+ ssh.exec('free -h'),
23
+ ssh.exec('pm2 jlist 2>/dev/null || echo "[]"'),
24
+ ]);
25
+ infoSpinner.succeed('Information gathered');
26
+ Logger.br();
27
+ // Display OS information
28
+ Logger.section('System');
29
+ Logger.kv('OS', osInfo.stdout.trim() || 'Unknown');
30
+ // Display disk space
31
+ const diskParts = diskSpace.stdout.trim().split(/\s+/);
32
+ if (diskParts.length >= 5) {
33
+ Logger.kv('Disk', `${diskParts[2]} used / ${diskParts[1]} total (${diskParts[4]} used)`);
34
+ }
35
+ // Display memory
36
+ const memLines = memoryInfo.stdout.trim().split('\n');
37
+ if (memLines.length >= 2) {
38
+ const memParts = memLines[1].split(/\s+/);
39
+ if (memParts.length >= 3) {
40
+ Logger.kv('Memory', `${memParts[2]} used / ${memParts[1]} total`);
41
+ }
42
+ }
43
+ Logger.br();
44
+ // Display runtime information
45
+ Logger.section('Runtime');
46
+ const node = nodeVersion.stdout.trim();
47
+ Logger.kv('Node.js', node === 'not installed' ? chalk.red(node) : chalk.green(node));
48
+ const pm2 = pm2Version.stdout.trim();
49
+ Logger.kv('PM2', pm2 === 'not installed' ? chalk.red(pm2) : chalk.green(pm2));
50
+ const nginx = nginxStatus.stdout.trim();
51
+ Logger.kv('Nginx', nginx === 'active' ? chalk.green(nginx) : chalk.yellow(nginx));
52
+ Logger.br();
53
+ // Display running services
54
+ Logger.section('Services');
55
+ try {
56
+ const services = JSON.parse(pm2List.stdout || '[]');
57
+ if (services.length === 0) {
58
+ Logger.info('No PM2 services running');
59
+ }
60
+ else {
61
+ for (const service of services) {
62
+ const status = service.pm2_env?.status || 'unknown';
63
+ const memory = service.monit?.memory
64
+ ? `${Math.round(service.monit.memory / 1024 / 1024)}MB`
65
+ : 'N/A';
66
+ const cpu = service.monit?.cpu !== undefined
67
+ ? `${service.monit.cpu}%`
68
+ : 'N/A';
69
+ const uptime = service.pm2_env?.pm_uptime
70
+ ? formatUptime(Date.now() - service.pm2_env.pm_uptime)
71
+ : 'N/A';
72
+ const statusColor = status === 'online' ? chalk.green : chalk.red;
73
+ Logger.log(` ${chalk.bold(service.name)}`);
74
+ Logger.log(` Status: ${statusColor(status)}`);
75
+ Logger.log(` Memory: ${memory} CPU: ${cpu} Uptime: ${uptime}`);
76
+ Logger.br();
77
+ }
78
+ }
79
+ }
80
+ catch {
81
+ Logger.warn('Could not parse PM2 service list');
82
+ }
83
+ ssh.disconnect();
84
+ }
85
+ catch (error) {
86
+ spinner.fail('Failed to get server information');
87
+ Logger.error(error instanceof Error ? error.message : String(error));
88
+ process.exit(1);
89
+ }
90
+ }
91
+ function formatUptime(ms) {
92
+ const seconds = Math.floor(ms / 1000);
93
+ const minutes = Math.floor(seconds / 60);
94
+ const hours = Math.floor(minutes / 60);
95
+ const days = Math.floor(hours / 24);
96
+ if (days > 0)
97
+ return `${days}d ${hours % 24}h`;
98
+ if (hours > 0)
99
+ return `${hours}h ${minutes % 60}m`;
100
+ if (minutes > 0)
101
+ return `${minutes}m`;
102
+ return `${seconds}s`;
103
+ }
104
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/server/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface SetupOptions {
2
+ env: string;
3
+ nodeVersion: string;
4
+ port: string;
5
+ redis: boolean;
6
+ password?: string;
7
+ execute?: boolean;
8
+ }
9
+ export declare function serverSetupCommand(host: string, options: SetupOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/server/setup.ts"],"names":[],"mappings":"AAWA,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAgLf"}
@@ -0,0 +1,161 @@
1
+ import { writeFileSync } from 'fs';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ import ora from 'ora';
5
+ import inquirer from 'inquirer';
6
+ import { Logger } from '../../utils/logger.js';
7
+ import { ConfigLoader } from '../../config/loader.js';
8
+ import { RuntimeRegistry } from '../../runtimes/registry.js';
9
+ import { createSSHConnection } from '../../core/ssh.js';
10
+ import { validateSSHConnection, validatePort, validateNodeVersion } from '../../utils/validation.js';
11
+ export async function serverSetupCommand(host, options) {
12
+ Logger.header('Server Setup');
13
+ // Validate inputs
14
+ if (!validateSSHConnection(host)) {
15
+ process.exit(1);
16
+ }
17
+ if (!validatePort(parseInt(options.port))) {
18
+ process.exit(1);
19
+ }
20
+ if (!validateNodeVersion(options.nodeVersion)) {
21
+ process.exit(1);
22
+ }
23
+ Logger.kv('Host', host);
24
+ Logger.kv('Environment', options.env);
25
+ Logger.kv('Port', options.port);
26
+ Logger.kv('Redis', options.redis ? 'Yes' : 'No');
27
+ Logger.br();
28
+ // Load config to detect runtime (or use default Node.js)
29
+ let runtime = 'nodejs';
30
+ try {
31
+ if (ConfigLoader.exists()) {
32
+ const config = ConfigLoader.load();
33
+ runtime = config.runtime;
34
+ }
35
+ }
36
+ catch {
37
+ // If no config, assume Node.js
38
+ Logger.warn('No config found, assuming Node.js runtime');
39
+ }
40
+ // Get runtime adapter
41
+ const adapter = RuntimeRegistry.get(runtime);
42
+ // Generate setup script
43
+ const spinner = ora('Generating setup script...').start();
44
+ const setupScript = adapter.generateSetupScript(options.nodeVersion, {
45
+ port: parseInt(options.port),
46
+ environment: options.env,
47
+ installRedis: options.redis,
48
+ });
49
+ // Write script to temp file
50
+ const scriptPath = join(tmpdir(), 'hostfn-setup.sh');
51
+ writeFileSync(scriptPath, setupScript, { mode: 0o755 });
52
+ spinner.succeed('Setup script generated');
53
+ Logger.br();
54
+ // Ask if user wants to execute now
55
+ const { executeNow } = await inquirer.prompt([
56
+ {
57
+ type: 'confirm',
58
+ name: 'executeNow',
59
+ message: 'Execute setup on server now?',
60
+ default: true,
61
+ },
62
+ ]);
63
+ if (!executeNow) {
64
+ Logger.br();
65
+ Logger.info('Setup script saved at: ' + scriptPath);
66
+ Logger.br();
67
+ Logger.info('Run manually with:');
68
+ Logger.command(`scp ${scriptPath} ${host}:~/hostfn-setup.sh`);
69
+ Logger.command(`ssh ${host} 'bash ~/hostfn-setup.sh'`);
70
+ return;
71
+ }
72
+ Logger.br();
73
+ Logger.section('Executing Setup on Server');
74
+ Logger.br();
75
+ const connectSpinner = ora('Connecting to server...').start();
76
+ try {
77
+ // Connect to server
78
+ const ssh = await createSSHConnection(host, {
79
+ password: options.password,
80
+ });
81
+ connectSpinner.succeed('Connected to server');
82
+ // Upload setup script
83
+ const uploadSpinner = ora('Uploading setup script...').start();
84
+ await ssh.uploadFile(scriptPath, '/tmp/hostfn-setup.sh');
85
+ uploadSpinner.succeed('Setup script uploaded');
86
+ // Make script executable
87
+ await ssh.exec('chmod +x /tmp/hostfn-setup.sh');
88
+ // Execute setup script with streaming output
89
+ Logger.br();
90
+ Logger.info('Executing setup (this may take several minutes)...');
91
+ Logger.br();
92
+ const result = await ssh.exec('bash /tmp/hostfn-setup.sh', {
93
+ streaming: true,
94
+ skipNvmSetup: true, // Setup script installs nvm, so skip the nvm check
95
+ });
96
+ Logger.br();
97
+ if (result.exitCode === 0) {
98
+ Logger.success('Server setup completed successfully!');
99
+ Logger.br();
100
+ Logger.info('Your server is ready for deployments.');
101
+ Logger.br();
102
+ Logger.info('Next steps:');
103
+ Logger.br();
104
+ Logger.info('1. Set environment variables (if needed):');
105
+ Logger.command(`hostfn env push ${options.env} .env`);
106
+ Logger.info(' Or set individual variables:');
107
+ Logger.command(`hostfn env set ${options.env} KEY value`);
108
+ Logger.br();
109
+ Logger.info('2. Deploy your application:');
110
+ Logger.command(`hostfn deploy ${options.env}`);
111
+ }
112
+ else {
113
+ Logger.error('Setup failed with exit code: ' + result.exitCode);
114
+ Logger.br();
115
+ // Try to download the log file from the server
116
+ try {
117
+ const localLogPath = join(tmpdir(), `hostfn-setup-error-${Date.now()}.log`);
118
+ await ssh.downloadFile('/tmp/hostfn-setup.log', localLogPath);
119
+ Logger.info('Setup log downloaded to: ' + localLogPath);
120
+ Logger.br();
121
+ // Read and display the last 50 lines of the log
122
+ const logContent = require('fs').readFileSync(localLogPath, 'utf-8');
123
+ const lines = logContent.split('\n');
124
+ const relevantLines = lines.slice(-50).join('\n');
125
+ Logger.error('Last 50 lines of setup log:');
126
+ Logger.log(relevantLines);
127
+ }
128
+ catch (logError) {
129
+ Logger.warn('Could not download setup log from server');
130
+ if (result.stderr) {
131
+ Logger.br();
132
+ Logger.error('Stderr output:');
133
+ Logger.log(result.stderr);
134
+ }
135
+ if (result.stdout) {
136
+ Logger.br();
137
+ Logger.error('Stdout output (last 1000 chars):');
138
+ Logger.log(result.stdout.slice(-1000));
139
+ }
140
+ }
141
+ Logger.br();
142
+ Logger.info('To inspect the full log on the server, run:');
143
+ Logger.command(`ssh ${host} 'cat /tmp/hostfn-setup.log'`);
144
+ process.exit(1);
145
+ }
146
+ // Cleanup
147
+ await ssh.exec('rm /tmp/hostfn-setup.sh').catch(() => { });
148
+ ssh.disconnect();
149
+ }
150
+ catch (error) {
151
+ connectSpinner.fail('Setup failed');
152
+ Logger.error(error instanceof Error ? error.message : String(error));
153
+ Logger.br();
154
+ Logger.info('Setup script saved at: ' + scriptPath);
155
+ Logger.info('You can try running it manually:');
156
+ Logger.command(`scp ${scriptPath} ${host}:~/hostfn-setup.sh`);
157
+ Logger.command(`ssh ${host} 'bash ~/hostfn-setup.sh'`);
158
+ process.exit(1);
159
+ }
160
+ }
161
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/server/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface StatusOptions {
2
+ service?: string;
3
+ }
4
+ export declare function statusCommand(environment: string, options?: StatusOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuDf"}