git-push-deploy-cli 0.1.0

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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -0
  3. package/dist/commands/deploy.d.ts +9 -0
  4. package/dist/commands/deploy.d.ts.map +1 -0
  5. package/dist/commands/deploy.js +10 -0
  6. package/dist/commands/deploy.js.map +1 -0
  7. package/dist/commands/init.d.ts +9 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +212 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/install.d.ts +10 -0
  12. package/dist/commands/install.d.ts.map +1 -0
  13. package/dist/commands/install.js +67 -0
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/logs.d.ts +10 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +42 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/release.d.ts +9 -0
  20. package/dist/commands/release.d.ts.map +1 -0
  21. package/dist/commands/release.js +32 -0
  22. package/dist/commands/release.js.map +1 -0
  23. package/dist/commands/stage.d.ts +5 -0
  24. package/dist/commands/stage.d.ts.map +1 -0
  25. package/dist/commands/stage.js +37 -0
  26. package/dist/commands/stage.js.map +1 -0
  27. package/dist/commands/status.d.ts +5 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +61 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/config/loader.d.ts +22 -0
  32. package/dist/config/loader.d.ts.map +1 -0
  33. package/dist/config/loader.js +66 -0
  34. package/dist/config/loader.js.map +1 -0
  35. package/dist/config/types.d.ts +42 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +10 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +52 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/utils/files.d.ts +25 -0
  44. package/dist/utils/files.d.ts.map +1 -0
  45. package/dist/utils/files.js +47 -0
  46. package/dist/utils/files.js.map +1 -0
  47. package/dist/utils/git.d.ts +33 -0
  48. package/dist/utils/git.d.ts.map +1 -0
  49. package/dist/utils/git.js +63 -0
  50. package/dist/utils/git.js.map +1 -0
  51. package/dist/utils/pm2.d.ts +39 -0
  52. package/dist/utils/pm2.d.ts.map +1 -0
  53. package/dist/utils/pm2.js +83 -0
  54. package/dist/utils/pm2.js.map +1 -0
  55. package/dist/utils/process-manager.d.ts +37 -0
  56. package/dist/utils/process-manager.d.ts.map +1 -0
  57. package/dist/utils/process-manager.js +17 -0
  58. package/dist/utils/process-manager.js.map +1 -0
  59. package/dist/utils/shell.d.ts +24 -0
  60. package/dist/utils/shell.d.ts.map +1 -0
  61. package/dist/utils/shell.js +51 -0
  62. package/dist/utils/shell.js.map +1 -0
  63. package/dist/utils/systemd.d.ts +34 -0
  64. package/dist/utils/systemd.d.ts.map +1 -0
  65. package/dist/utils/systemd.js +79 -0
  66. package/dist/utils/systemd.js.map +1 -0
  67. package/package.json +60 -0
  68. package/templates/post-receive.sh +55 -0
@@ -0,0 +1,32 @@
1
+ import chalk from 'chalk';
2
+ import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
3
+ import { gitAddAll, gitCommit, gitPush, hasChanges, getCurrentBranch } from '../utils/git.js';
4
+ import { joinPath } from '../utils/files.js';
5
+ /**
6
+ * Release command - commit and push deploy repository
7
+ */
8
+ export async function releaseCommand(serviceName, options = {}) {
9
+ console.log(chalk.blue(`Releasing ${serviceName}...`));
10
+ const config = getServiceConfig(serviceName);
11
+ const workspaceRoot = getWorkspaceRoot();
12
+ const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
13
+ // Check for changes
14
+ if (!hasChanges(deployRepoPath)) {
15
+ console.log(chalk.yellow('No changes to release.'));
16
+ return;
17
+ }
18
+ // Commit
19
+ const message = options.message || `deploy: ${serviceName}`;
20
+ gitAddAll(deployRepoPath);
21
+ const committed = gitCommit(deployRepoPath, message);
22
+ if (!committed) {
23
+ console.log(chalk.yellow('No changes to commit.'));
24
+ return;
25
+ }
26
+ // Push
27
+ const branch = getCurrentBranch(deployRepoPath);
28
+ console.log(chalk.gray(` Pushing to origin/${branch}...`));
29
+ gitPush(deployRepoPath, 'origin', branch);
30
+ console.log(chalk.green(`✓ Released ${serviceName}`));
31
+ }
32
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,UAA0B,EAAE;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,KAAK,CAAC,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAElE,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,SAAS;IACT,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,WAAW,EAAE,CAAC;IAC5D,SAAS,CAAC,cAAc,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO;IACP,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,KAAK,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Stage command - copy build artifacts to deploy repository
3
+ */
4
+ export declare function stageCommand(serviceName: string): Promise<void>;
5
+ //# sourceMappingURL=stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE"}
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
3
+ import { DEFAULT_ARTIFACTS } from '../config/types.js';
4
+ import { ensureDir, removeDir, copy, exists, joinPath } from '../utils/files.js';
5
+ /**
6
+ * Stage command - copy build artifacts to deploy repository
7
+ */
8
+ export async function stageCommand(serviceName) {
9
+ console.log(chalk.blue(`Staging ${serviceName}...`));
10
+ const config = getServiceConfig(serviceName);
11
+ const workspaceRoot = getWorkspaceRoot();
12
+ const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
13
+ const artifacts = config.artifacts || DEFAULT_ARTIFACTS;
14
+ // Stage each package
15
+ for (const pkg of config.packages) {
16
+ const pkgPath = joinPath(workspaceRoot, pkg);
17
+ const destPath = joinPath(deployRepoPath, pkg);
18
+ if (!exists(pkgPath)) {
19
+ console.log(chalk.yellow(` Warning: Package ${pkg} not found at ${pkgPath}`));
20
+ continue;
21
+ }
22
+ // Remove old staged files
23
+ removeDir(destPath);
24
+ ensureDir(destPath);
25
+ // Copy artifacts
26
+ for (const artifact of artifacts) {
27
+ const srcArtifact = joinPath(pkgPath, artifact);
28
+ const destArtifact = joinPath(destPath, artifact);
29
+ if (exists(srcArtifact)) {
30
+ copy(srcArtifact, destArtifact);
31
+ console.log(chalk.gray(` ${pkg}/${artifact}`));
32
+ }
33
+ }
34
+ }
35
+ console.log(chalk.green(`✓ Staged ${config.packages.length} package(s) to ${config.deployRepo}`));
36
+ }
37
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC;IAExD,qBAAqB;IACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,GAAG,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpB,iBAAiB;QACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAElD,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,kBAAkB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACpG,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Status command - show all services and process manager status
3
+ */
4
+ export declare function statusCommand(): Promise<void>;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqDnD"}
@@ -0,0 +1,61 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig, listServices } from '../config/loader.js';
3
+ import { createProcessManager } from '../utils/process-manager.js';
4
+ import { commandExists } from '../utils/shell.js';
5
+ /**
6
+ * Status command - show all services and process manager status
7
+ */
8
+ export async function statusCommand() {
9
+ console.log(chalk.blue('Service Status'));
10
+ console.log('');
11
+ // List configured services
12
+ try {
13
+ const services = listServices();
14
+ const config = loadConfig();
15
+ console.log(chalk.white('Configured Services:'));
16
+ for (const name of services) {
17
+ const svc = config.services[name];
18
+ const pmType = svc.processManager || 'pm2';
19
+ console.log(chalk.gray(` ${name}`));
20
+ console.log(chalk.gray(` Process Manager: ${pmType}`));
21
+ console.log(chalk.gray(` Process Name: ${svc.processName}`));
22
+ console.log(chalk.gray(` Packages: ${svc.packages.join(', ')}`));
23
+ console.log(chalk.gray(` Target: ${svc.server.targetDir}`));
24
+ }
25
+ console.log('');
26
+ }
27
+ catch {
28
+ console.log(chalk.yellow('No .git-deploy.json found in current directory tree.'));
29
+ console.log('');
30
+ }
31
+ // Show PM2 status if available
32
+ if (commandExists('pm2')) {
33
+ console.log(chalk.white('PM2 Processes:'));
34
+ try {
35
+ const pm2 = createProcessManager('pm2');
36
+ const status = pm2.list();
37
+ console.log(status);
38
+ }
39
+ catch {
40
+ console.log(chalk.gray(' No PM2 processes running or PM2 not accessible.'));
41
+ }
42
+ }
43
+ // Show systemd status if available
44
+ if (commandExists('systemctl')) {
45
+ console.log(chalk.white('Systemd Services (running):'));
46
+ try {
47
+ const systemd = createProcessManager('systemd');
48
+ const status = systemd.list();
49
+ // Filter to show only relevant lines
50
+ const lines = status.split('\n').slice(0, 10);
51
+ console.log(chalk.gray(lines.join('\n')));
52
+ if (status.split('\n').length > 10) {
53
+ console.log(chalk.gray(' ... (use systemctl for full list)'));
54
+ }
55
+ }
56
+ catch {
57
+ console.log(chalk.gray(' Could not query systemd.'));
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DeployConfig, ServiceConfig } from './types.js';
2
+ /**
3
+ * Find config file by walking up directory tree
4
+ */
5
+ export declare function findConfigFile(startDir?: string): string | null;
6
+ /**
7
+ * Load and parse config file
8
+ */
9
+ export declare function loadConfig(configPath?: string): DeployConfig;
10
+ /**
11
+ * Get configuration for a specific service
12
+ */
13
+ export declare function getServiceConfig(serviceName: string, configPath?: string): ServiceConfig;
14
+ /**
15
+ * Get workspace root (directory containing .git-deploy.json)
16
+ */
17
+ export declare function getWorkspaceRoot(): string;
18
+ /**
19
+ * List all configured services
20
+ */
21
+ export declare function listServices(configPath?: string): string[];
22
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAY9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAgB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAUxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1D"}
@@ -0,0 +1,66 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ const CONFIG_FILENAME = '.git-deploy.json';
4
+ /**
5
+ * Find config file by walking up directory tree
6
+ */
7
+ export function findConfigFile(startDir = process.cwd()) {
8
+ let currentDir = startDir;
9
+ while (currentDir !== dirname(currentDir)) {
10
+ const configPath = join(currentDir, CONFIG_FILENAME);
11
+ if (existsSync(configPath)) {
12
+ return configPath;
13
+ }
14
+ currentDir = dirname(currentDir);
15
+ }
16
+ return null;
17
+ }
18
+ /**
19
+ * Load and parse config file
20
+ */
21
+ export function loadConfig(configPath) {
22
+ const path = configPath || findConfigFile();
23
+ if (!path) {
24
+ throw new Error(`Config file ${CONFIG_FILENAME} not found. Run from workspace root or specify path.`);
25
+ }
26
+ try {
27
+ const content = readFileSync(path, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof SyntaxError) {
32
+ throw new Error(`Invalid JSON in ${path}: ${error.message}`);
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ /**
38
+ * Get configuration for a specific service
39
+ */
40
+ export function getServiceConfig(serviceName, configPath) {
41
+ const config = loadConfig(configPath);
42
+ const serviceConfig = config.services[serviceName];
43
+ if (!serviceConfig) {
44
+ const available = Object.keys(config.services).join(', ');
45
+ throw new Error(`Service '${serviceName}' not found in config. Available: ${available}`);
46
+ }
47
+ return serviceConfig;
48
+ }
49
+ /**
50
+ * Get workspace root (directory containing .git-deploy.json)
51
+ */
52
+ export function getWorkspaceRoot() {
53
+ const configPath = findConfigFile();
54
+ if (!configPath) {
55
+ throw new Error(`Config file ${CONFIG_FILENAME} not found.`);
56
+ }
57
+ return dirname(configPath);
58
+ }
59
+ /**
60
+ * List all configured services
61
+ */
62
+ export function listServices(configPath) {
63
+ const config = loadConfig(configPath);
64
+ return Object.keys(config.services);
65
+ }
66
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC7D,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;IAE5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,eAAe,eAAe,sDAAsD,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,UAAmB;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEnD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,eAAe,eAAe,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAmB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ProcessManagerType } from '../utils/process-manager.js';
2
+ /**
3
+ * Service configuration for git-deploy
4
+ */
5
+ export interface ServiceConfig {
6
+ /** Packages to deploy (monorepo support) */
7
+ packages: string[];
8
+ /** Package with package.json for npm install */
9
+ mainPackage: string;
10
+ /** Path to local deploy repository (relative to workspace root) */
11
+ deployRepo: string;
12
+ /** Process manager type (default: 'pm2') */
13
+ processManager?: ProcessManagerType;
14
+ /** Process name (PM2 name or systemd service name) */
15
+ processName: string;
16
+ /** PM2 home directory (optional, only for PM2) */
17
+ pm2Home?: string;
18
+ /** Files/dirs to copy (default: dist, package.json, package-lock.json) */
19
+ artifacts?: string[];
20
+ /** Server-side configuration */
21
+ server: {
22
+ /** Where to install on server */
23
+ targetDir: string;
24
+ /** Path to bare git repo on server */
25
+ bareRepo: string;
26
+ /** Unix user for file ownership */
27
+ user?: string;
28
+ /** Unix group (default: deploy-<service>) */
29
+ group?: string;
30
+ };
31
+ }
32
+ /**
33
+ * Root configuration file (.git-deploy.json)
34
+ */
35
+ export interface DeployConfig {
36
+ services: Record<string, ServiceConfig>;
37
+ }
38
+ /**
39
+ * Default artifacts to copy if not specified
40
+ */
41
+ export declare const DEFAULT_ARTIFACTS: string[];
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAEpC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,gCAAgC;IAChC,MAAM,EAAE;QACN,iCAAiC;QACjC,SAAS,EAAE,MAAM,CAAC;QAElB,sCAAsC;QACtC,QAAQ,EAAE,MAAM,CAAC;QAEjB,mCAAmC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd,6CAA6C;QAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAK7B,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Default artifacts to copy if not specified
3
+ */
4
+ export const DEFAULT_ARTIFACTS = [
5
+ 'dist',
6
+ 'package.json',
7
+ 'package-lock.json',
8
+ 'ecosystem.config.cjs'
9
+ ];
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAkDA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,cAAc;IACd,mBAAmB;IACnB,sBAAsB;CACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { stageCommand } from './commands/stage.js';
4
+ import { releaseCommand } from './commands/release.js';
5
+ import { deployCommand } from './commands/deploy.js';
6
+ import { initCommand } from './commands/init.js';
7
+ import { installCommand } from './commands/install.js';
8
+ import { statusCommand } from './commands/status.js';
9
+ import { logsCommand } from './commands/logs.js';
10
+ const program = new Command();
11
+ program
12
+ .name('gpd')
13
+ .description('Git Push Deploy - CLI for git-based deployments with PM2/systemd support')
14
+ .version('0.1.0');
15
+ // Development commands
16
+ program
17
+ .command('stage <service>')
18
+ .description('Copy build artifacts to deploy repository')
19
+ .action(stageCommand);
20
+ program
21
+ .command('release <service>')
22
+ .description('Commit and push deploy repository')
23
+ .option('-m, --message <message>', 'Commit message')
24
+ .action(releaseCommand);
25
+ program
26
+ .command('deploy <service>')
27
+ .description('Stage and release in one step')
28
+ .option('-m, --message <message>', 'Commit message')
29
+ .action(deployCommand);
30
+ // Server commands
31
+ program
32
+ .command('init <service>')
33
+ .description('Initialize bare repo, hook, and permissions on server')
34
+ .option('--users <users>', 'Comma-separated list of users to add to group')
35
+ .action(initCommand);
36
+ program
37
+ .command('install <service>')
38
+ .description('Extract, npm install, pm2 restart (used by post-receive hook)')
39
+ .option('--ref <ref>', 'Git ref to deploy (branch or tag)', 'main')
40
+ .action(installCommand);
41
+ program
42
+ .command('status')
43
+ .description('Show all services and PM2 status')
44
+ .action(statusCommand);
45
+ program
46
+ .command('logs <service>')
47
+ .description('Show deployment logs')
48
+ .option('-n, --lines <lines>', 'Number of lines to show', '50')
49
+ .option('-f, --follow', 'Follow log output')
50
+ .action(logsCommand);
51
+ program.parse();
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,0EAA0E,CAAC;KACvF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;KACnD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;KACnD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,aAAa,EAAE,mCAAmC,EAAE,MAAM,CAAC;KAClE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC9D,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Ensure directory exists
3
+ */
4
+ export declare function ensureDir(path: string): void;
5
+ /**
6
+ * Remove directory recursively
7
+ */
8
+ export declare function removeDir(path: string): void;
9
+ /**
10
+ * Copy file or directory
11
+ */
12
+ export declare function copy(src: string, dest: string): void;
13
+ /**
14
+ * Check if path exists
15
+ */
16
+ export declare function exists(path: string): boolean;
17
+ /**
18
+ * List directory contents
19
+ */
20
+ export declare function listDir(path: string): string[];
21
+ /**
22
+ * Join paths
23
+ */
24
+ export declare function joinPath(...parts: string[]): string;
25
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,47 @@
1
+ import { existsSync, mkdirSync, rmSync, cpSync, readdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ /**
4
+ * Ensure directory exists
5
+ */
6
+ export function ensureDir(path) {
7
+ if (!existsSync(path)) {
8
+ mkdirSync(path, { recursive: true });
9
+ }
10
+ }
11
+ /**
12
+ * Remove directory recursively
13
+ */
14
+ export function removeDir(path) {
15
+ if (existsSync(path)) {
16
+ rmSync(path, { recursive: true, force: true });
17
+ }
18
+ }
19
+ /**
20
+ * Copy file or directory
21
+ */
22
+ export function copy(src, dest) {
23
+ ensureDir(dirname(dest));
24
+ cpSync(src, dest, { recursive: true });
25
+ }
26
+ /**
27
+ * Check if path exists
28
+ */
29
+ export function exists(path) {
30
+ return existsSync(path);
31
+ }
32
+ /**
33
+ * List directory contents
34
+ */
35
+ export function listDir(path) {
36
+ if (!existsSync(path)) {
37
+ return [];
38
+ }
39
+ return readdirSync(path);
40
+ }
41
+ /**
42
+ * Join paths
43
+ */
44
+ export function joinPath(...parts) {
45
+ return join(...parts);
46
+ }
47
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,IAAY;IAC5C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAe;IACzC,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Git archive from bare repo
3
+ */
4
+ export declare function gitArchive(bareRepo: string, ref: string, path: string, targetDir: string): void;
5
+ /**
6
+ * Git add all changes
7
+ */
8
+ export declare function gitAddAll(repoDir: string): void;
9
+ /**
10
+ * Git commit with message
11
+ */
12
+ export declare function gitCommit(repoDir: string, message: string): boolean;
13
+ /**
14
+ * Git push with tags
15
+ */
16
+ export declare function gitPush(repoDir: string, remote?: string, branch?: string): void;
17
+ /**
18
+ * Get current branch name
19
+ */
20
+ export declare function getCurrentBranch(repoDir: string): string;
21
+ /**
22
+ * Get latest tag
23
+ */
24
+ export declare function getLatestTag(repoDir: string): string | null;
25
+ /**
26
+ * Check if repo has uncommitted changes
27
+ */
28
+ export declare function hasChanges(repoDir: string): boolean;
29
+ /**
30
+ * Initialize bare repo
31
+ */
32
+ export declare function initBareRepo(path: string): void;
33
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE/F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQnE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,MAAM,GAAE,MAAe,GAAG,IAAI,CAEjG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,63 @@
1
+ import { exec, execOutput } from './shell.js';
2
+ /**
3
+ * Git archive from bare repo
4
+ */
5
+ export function gitArchive(bareRepo, ref, path, targetDir) {
6
+ exec(`git archive ${ref} ${path}/ | tar -x -C ${targetDir}`, { cwd: bareRepo });
7
+ }
8
+ /**
9
+ * Git add all changes
10
+ */
11
+ export function gitAddAll(repoDir) {
12
+ exec('git add -A', { cwd: repoDir, silent: true });
13
+ }
14
+ /**
15
+ * Git commit with message
16
+ */
17
+ export function gitCommit(repoDir, message) {
18
+ try {
19
+ exec(`git commit -m "${message}"`, { cwd: repoDir, silent: true });
20
+ return true;
21
+ }
22
+ catch {
23
+ // No changes to commit
24
+ return false;
25
+ }
26
+ }
27
+ /**
28
+ * Git push with tags
29
+ */
30
+ export function gitPush(repoDir, remote = 'origin', branch = 'main') {
31
+ exec(`git push ${remote} ${branch} --tags`, { cwd: repoDir });
32
+ }
33
+ /**
34
+ * Get current branch name
35
+ */
36
+ export function getCurrentBranch(repoDir) {
37
+ return execOutput('git rev-parse --abbrev-ref HEAD', repoDir);
38
+ }
39
+ /**
40
+ * Get latest tag
41
+ */
42
+ export function getLatestTag(repoDir) {
43
+ try {
44
+ return execOutput('git describe --tags --abbrev=0', repoDir);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Check if repo has uncommitted changes
52
+ */
53
+ export function hasChanges(repoDir) {
54
+ const status = execOutput('git status --porcelain', repoDir);
55
+ return status.length > 0;
56
+ }
57
+ /**
58
+ * Initialize bare repo
59
+ */
60
+ export function initBareRepo(path) {
61
+ exec(`git init --bare --shared=group ${path}`);
62
+ }
63
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW,EAAE,IAAY,EAAE,SAAiB;IACvF,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,iBAAiB,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,OAAe;IACxD,IAAI,CAAC;QACH,IAAI,CAAC,kBAAkB,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB,QAAQ,EAAE,SAAiB,MAAM;IACzF,IAAI,CAAC,YAAY,MAAM,IAAI,MAAM,SAAS,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,UAAU,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,MAAM,GAAG,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ProcessManager, ProcessManagerOptions } from './process-manager.js';
2
+ /**
3
+ * PM2 Process Manager implementation
4
+ */
5
+ export declare class PM2ProcessManager implements ProcessManager {
6
+ readonly name = "pm2";
7
+ private buildEnv;
8
+ restart(processName: string, options?: ProcessManagerOptions): void;
9
+ list(options?: ProcessManagerOptions): string;
10
+ save(options?: ProcessManagerOptions): void;
11
+ show(processName: string, options?: ProcessManagerOptions): string;
12
+ exists(processName: string, options?: ProcessManagerOptions): boolean;
13
+ asUser(user: string, command: string, options?: ProcessManagerOptions): void;
14
+ }
15
+ /**
16
+ * Restart PM2 process
17
+ */
18
+ export declare function pm2Restart(processName: string, pm2Home?: string): void;
19
+ /**
20
+ * Get PM2 process list
21
+ */
22
+ export declare function pm2List(pm2Home?: string): string;
23
+ /**
24
+ * Save PM2 process list
25
+ */
26
+ export declare function pm2Save(pm2Home?: string): void;
27
+ /**
28
+ * Get PM2 process info
29
+ */
30
+ export declare function pm2Show(processName: string, pm2Home?: string): string;
31
+ /**
32
+ * Check if PM2 process exists
33
+ */
34
+ export declare function pm2ProcessExists(processName: string, pm2Home?: string): boolean;
35
+ /**
36
+ * Run PM2 command as specific user (for server-side)
37
+ */
38
+ export declare function pm2AsUser(user: string, command: string, pm2Home?: string): void;
39
+ //# sourceMappingURL=pm2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../src/utils/pm2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,IAAI,SAAS;IAEtB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAKnE,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAK7C,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAK3C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAKlE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO;IASrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;CAI7E;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG/E"}