git-push-deploy-cli 0.1.1 → 0.2.1

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 (42) hide show
  1. package/README.md +72 -38
  2. package/dist/commands/deploy.d.ts +9 -2
  3. package/dist/commands/deploy.d.ts.map +1 -1
  4. package/dist/commands/deploy.js +26 -21
  5. package/dist/commands/deploy.js.map +1 -1
  6. package/dist/commands/init.d.ts +4 -3
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +128 -13
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/install.d.ts +21 -0
  11. package/dist/commands/install.d.ts.map +1 -0
  12. package/dist/commands/install.js +174 -0
  13. package/dist/commands/install.js.map +1 -0
  14. package/dist/commands/logs.d.ts.map +1 -1
  15. package/dist/commands/logs.js +5 -3
  16. package/dist/commands/logs.js.map +1 -1
  17. package/dist/commands/release.d.ts +2 -0
  18. package/dist/commands/release.d.ts.map +1 -1
  19. package/dist/commands/release.js +7 -5
  20. package/dist/commands/release.js.map +1 -1
  21. package/dist/commands/stage.d.ts +5 -0
  22. package/dist/commands/stage.d.ts.map +1 -1
  23. package/dist/commands/stage.js +58 -22
  24. package/dist/commands/stage.js.map +1 -1
  25. package/dist/commands/status.d.ts.map +1 -1
  26. package/dist/commands/status.js +5 -1
  27. package/dist/commands/status.js.map +1 -1
  28. package/dist/config/loader.d.ts +14 -0
  29. package/dist/config/loader.d.ts.map +1 -1
  30. package/dist/config/loader.js +18 -0
  31. package/dist/config/loader.js.map +1 -1
  32. package/dist/config/types.d.ts +47 -9
  33. package/dist/config/types.d.ts.map +1 -1
  34. package/dist/config/types.js +24 -1
  35. package/dist/config/types.js.map +1 -1
  36. package/dist/index.js +16 -9
  37. package/dist/index.js.map +1 -1
  38. package/dist/utils/shell.d.ts +1 -0
  39. package/dist/utils/shell.d.ts.map +1 -1
  40. package/dist/utils/shell.js +4 -3
  41. package/dist/utils/shell.js.map +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,174 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'child_process';
3
+ import { existsSync, writeFileSync, mkdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { getServiceConfig, findConfigFile } from '../config/loader.js';
6
+ /**
7
+ * Generate .env file content from config env object
8
+ */
9
+ function generateEnvContent(env) {
10
+ return Object.entries(env)
11
+ .map(([key, value]) => `${key}=${value}`)
12
+ .join('\n');
13
+ }
14
+ /**
15
+ * Execute shell command with logging
16
+ */
17
+ function exec(cmd, options = {}) {
18
+ if (!options.silent) {
19
+ console.log(chalk.gray(`$ ${cmd}`));
20
+ }
21
+ try {
22
+ execSync(cmd, {
23
+ cwd: options.cwd,
24
+ stdio: options.silent ? 'pipe' : 'inherit',
25
+ env: { ...process.env }
26
+ });
27
+ }
28
+ catch (error) {
29
+ throw new Error(`Command failed: ${cmd}`);
30
+ }
31
+ }
32
+ /**
33
+ * Execute command as a specific user via sudo
34
+ */
35
+ function execAsUser(cmd, user, options = {}) {
36
+ // Build environment exports
37
+ const envExports = options.env
38
+ ? Object.entries(options.env).map(([k, v]) => `export ${k}="${v}"`).join('; ') + '; '
39
+ : '';
40
+ const fullCmd = `sudo -u ${user} bash -c '${envExports}${cmd.replace(/'/g, "'\\''")}'`;
41
+ console.log(chalk.gray(`$ ${fullCmd}`));
42
+ try {
43
+ execSync(fullCmd, {
44
+ cwd: options.cwd,
45
+ stdio: 'inherit',
46
+ env: { ...process.env }
47
+ });
48
+ }
49
+ catch (error) {
50
+ throw new Error(`Command failed: ${fullCmd}`);
51
+ }
52
+ }
53
+ /**
54
+ * Install command - runs on server after git push (called by post-receive hook)
55
+ *
56
+ * Environment variables from hook:
57
+ * - GPD_TARGET_DIR: Where to install (e.g., /opt/kairox/staging/kairox-api)
58
+ * - GPD_GIT_DIR: Bare repo path (e.g., /git/sym/deploy-kairox/staging/kairox-api)
59
+ * - GPD_SERVICE: Service name (e.g., kairox-api-staging)
60
+ * - PM2_HOME: PM2 home directory (optional)
61
+ *
62
+ * Steps:
63
+ * 1. git checkout from bare repo to target dir
64
+ * 2. Generate .env file from config
65
+ * 3. npm install --omit=dev
66
+ * 4. PM2 restart
67
+ */
68
+ export async function installCommand(serviceName, options = {}) {
69
+ console.log(chalk.blue(`Installing ${serviceName}...`));
70
+ // Get paths from environment (set by hook) or use config
71
+ const targetDir = process.env.GPD_TARGET_DIR;
72
+ const gitDir = process.env.GPD_GIT_DIR;
73
+ if (!targetDir || !gitDir) {
74
+ throw new Error('GPD_TARGET_DIR and GPD_GIT_DIR must be set. This command should be run by the post-receive hook.');
75
+ }
76
+ // Find config - on server it should be at /etc/gpd/<service>.json or passed via -c
77
+ const configPath = options.configPath || findConfigFile();
78
+ if (!configPath) {
79
+ throw new Error('.git-deploy.json not found. Specify with -c option.');
80
+ }
81
+ const config = getServiceConfig(serviceName, configPath);
82
+ const { processName, pm2Home, pm2User, env } = config;
83
+ console.log(chalk.gray(` Target: ${targetDir}`));
84
+ console.log(chalk.gray(` Git dir: ${gitDir}`));
85
+ if (pm2User)
86
+ console.log(chalk.gray(` PM2 user: ${pm2User}`));
87
+ // Determine which user to run commands as
88
+ const runUser = pm2User || process.env.USER || 'root';
89
+ const userHome = pm2User ? `/home/${pm2User}` : process.env.HOME || '/root';
90
+ // Environment for npm/pm2 commands
91
+ const cmdEnv = {};
92
+ if (pm2Home)
93
+ cmdEnv.PM2_HOME = pm2Home;
94
+ if (pm2User) {
95
+ cmdEnv.HOME = `/opt/kairox`; // Use app directory as home for npm cache
96
+ }
97
+ // 1. Git checkout from bare repo to target dir
98
+ console.log(chalk.blue('Checking out files...'));
99
+ const checkoutCmd = `git --work-tree="${targetDir}" --git-dir="${gitDir}" checkout -f`;
100
+ if (pm2User) {
101
+ execAsUser(checkoutCmd, pm2User);
102
+ }
103
+ else {
104
+ exec(checkoutCmd);
105
+ }
106
+ // 2. Generate .env file from config
107
+ if (env && Object.keys(env).length > 0) {
108
+ console.log(chalk.blue('Generating .env file...'));
109
+ const envPath = join(targetDir, '.env');
110
+ const envContent = generateEnvContent(env);
111
+ writeFileSync(envPath, envContent + '\n');
112
+ console.log(chalk.gray(` Written to ${envPath}`));
113
+ // Fix ownership if running as different user
114
+ if (pm2User) {
115
+ exec(`sudo chown ${pm2User}:${pm2User} "${envPath}"`, { silent: true });
116
+ }
117
+ }
118
+ // 3. Create logs directory if needed
119
+ const logsDir = join(targetDir, 'logs');
120
+ if (!existsSync(logsDir)) {
121
+ mkdirSync(logsDir, { recursive: true });
122
+ if (pm2User) {
123
+ exec(`sudo chown ${pm2User}:${pm2User} "${logsDir}"`, { silent: true });
124
+ }
125
+ console.log(chalk.gray(` Created ${logsDir}`));
126
+ }
127
+ // 4. npm install
128
+ console.log(chalk.blue('Installing dependencies...'));
129
+ const npmCmd = `npm install --omit=dev --cache=/opt/kairox/.npm`;
130
+ if (pm2User) {
131
+ execAsUser(npmCmd, pm2User, { cwd: targetDir, env: cmdEnv });
132
+ }
133
+ else {
134
+ exec(npmCmd, { cwd: targetDir });
135
+ }
136
+ // 5. PM2 restart (or start if not running)
137
+ console.log(chalk.blue('Restarting PM2 process...'));
138
+ // Check if process exists and restart, otherwise start
139
+ const pm2RestartCmd = `pm2 describe ${processName} > /dev/null 2>&1 && pm2 restart ${processName} --update-env || pm2 start ecosystem.config.cjs --env ${config.environment || 'production'}`;
140
+ if (pm2User) {
141
+ execAsUser(pm2RestartCmd, pm2User, { cwd: targetDir, env: cmdEnv });
142
+ }
143
+ else {
144
+ let fullPm2Cmd = pm2RestartCmd;
145
+ if (pm2Home)
146
+ fullPm2Cmd = `PM2_HOME=${pm2Home} ${fullPm2Cmd}`;
147
+ exec(fullPm2Cmd, { cwd: targetDir });
148
+ }
149
+ // 6. PM2 save
150
+ console.log(chalk.blue('Saving PM2 state...'));
151
+ const pm2SaveCmd = 'pm2 save';
152
+ if (pm2User) {
153
+ execAsUser(pm2SaveCmd, pm2User, { env: cmdEnv });
154
+ }
155
+ else {
156
+ let fullSaveCmd = pm2SaveCmd;
157
+ if (pm2Home)
158
+ fullSaveCmd = `PM2_HOME=${pm2Home} ${fullSaveCmd}`;
159
+ exec(fullSaveCmd);
160
+ }
161
+ console.log(chalk.green(`✓ Installed ${serviceName}`));
162
+ // Show status
163
+ const pm2StatusCmd = 'pm2 status';
164
+ if (pm2User) {
165
+ execAsUser(pm2StatusCmd, pm2User, { env: cmdEnv });
166
+ }
167
+ else {
168
+ let fullStatusCmd = pm2StatusCmd;
169
+ if (pm2Home)
170
+ fullStatusCmd = `PM2_HOME=${pm2Home} ${fullStatusCmd}`;
171
+ exec(fullStatusCmd);
172
+ }
173
+ }
174
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAMvE;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAA8C;IACxE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,IAAI,CAAC,GAAW,EAAE,UAA8C,EAAE;IACzE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC1C,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY,EAAE,UAA0D,EAAE;IACzG,4BAA4B;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG;QAC5B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACrF,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,IAAI,aAAa,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,EAAE;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,UAA0B,EAAE;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,KAAK,CAAC,CAAC,CAAC;IAExD,yDAAyD;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAEvC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;IACtH,CAAC;IAED,mFAAmF;IACnF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC,CAAC;IAE/D,0CAA0C;IAC1C,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC;IAE5E,mCAAmC;IACnC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,OAAO;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,0CAA0C;IACzE,CAAC;IAED,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,oBAAoB,SAAS,gBAAgB,MAAM,eAAe,CAAC;IACvF,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,CAAC,CAAC;IACpB,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC3C,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC;QAEnD,6CAA6C;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,OAAO,IAAI,OAAO,KAAK,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,cAAc,OAAO,IAAI,OAAO,KAAK,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,iDAAiD,CAAC;IACjE,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAErD,uDAAuD;IACvD,MAAM,aAAa,GAAG,gBAAgB,WAAW,oCAAoC,WAAW,yDAAyD,MAAM,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;IAE9L,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,IAAI,UAAU,GAAG,aAAa,CAAC;QAC/B,IAAI,OAAO;YAAE,UAAU,GAAG,YAAY,OAAO,IAAI,UAAU,EAAE,CAAC;QAC9D,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC;IAC9B,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,IAAI,WAAW,GAAG,UAAU,CAAC;QAC7B,IAAI,OAAO;YAAE,WAAW,GAAG,YAAY,OAAO,IAAI,WAAW,EAAE,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC,CAAC;IAEvD,cAAc;IACd,MAAM,YAAY,GAAG,YAAY,CAAC;IAClC,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,IAAI,aAAa,GAAG,YAAY,CAAC;QACjC,IAAI,OAAO;YAAE,aAAa,GAAG,YAAY,OAAO,IAAI,aAAa,EAAE,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC/F"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC/F"}
@@ -6,15 +6,17 @@ import { getServiceConfig } from '../config/loader.js';
6
6
  */
7
7
  export async function logsCommand(serviceName, options = {}) {
8
8
  const config = getServiceConfig(serviceName);
9
- const { host } = config.server;
9
+ const { host, sshOptions } = config.server;
10
10
  const { processName, pm2Home } = config;
11
11
  const lines = options.lines || '50';
12
12
  const pm2Env = pm2Home ? `PM2_HOME=${pm2Home}` : '';
13
13
  console.log(chalk.blue(`Logs for ${serviceName} from ${host}...`));
14
14
  console.log('');
15
+ // Build SSH args with options
16
+ const sshBaseArgs = sshOptions ? sshOptions.split(' ') : [];
15
17
  if (options.follow) {
16
18
  // Use spawn for follow mode with SSH
17
- const sshArgs = [host, `${pm2Env} pm2 logs ${processName} --lines ${lines}`];
19
+ const sshArgs = [...sshBaseArgs, host, `${pm2Env} pm2 logs ${processName} --lines ${lines}`];
18
20
  const ssh = spawn('ssh', sshArgs, {
19
21
  stdio: 'inherit'
20
22
  });
@@ -24,7 +26,7 @@ export async function logsCommand(serviceName, options = {}) {
24
26
  }
25
27
  else {
26
28
  // Non-follow mode: get last N lines
27
- const sshArgs = [host, `${pm2Env} pm2 logs ${processName} --lines ${lines} --nostream`];
29
+ const sshArgs = [...sshBaseArgs, host, `${pm2Env} pm2 logs ${processName} --lines ${lines} --nostream`];
28
30
  const ssh = spawn('ssh', sshArgs, {
29
31
  stdio: 'inherit'
30
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAOvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,UAAuB,EAAE;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,qCAAqC;QACrC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,aAAa,WAAW,YAAY,KAAK,EAAE,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;YAChC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,oCAAoC;QACpC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,aAAa,WAAW,YAAY,KAAK,aAAa,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;YAChC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAOvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,UAAuB,EAAE;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,qCAAqC;QACrC,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,aAAa,WAAW,YAAY,KAAK,EAAE,CAAC,CAAC;QAC7F,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;YAChC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,oCAAoC;QACpC,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,aAAa,WAAW,YAAY,KAAK,aAAa,CAAC,CAAC;QACxG,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;YAChC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -3,6 +3,8 @@ interface ReleaseOptions {
3
3
  }
4
4
  /**
5
5
  * Release command - commit and push deploy repository
6
+ *
7
+ * Pushes to the bare repo on the server, which triggers the post-receive hook.
6
8
  */
7
9
  export declare function releaseCommand(serviceName: string, options?: ReleaseOptions): Promise<void>;
8
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrG"}
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BrG"}
@@ -1,29 +1,31 @@
1
1
  import chalk from 'chalk';
2
- import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
2
+ import { getServiceConfig, getWorkspaceRoot, getDeployRepoPath } from '../config/loader.js';
3
3
  import { gitAddAll, gitCommit, gitPush, hasChanges, getCurrentBranch } from '../utils/git.js';
4
- import { joinPath } from '../utils/files.js';
5
4
  /**
6
5
  * Release command - commit and push deploy repository
6
+ *
7
+ * Pushes to the bare repo on the server, which triggers the post-receive hook.
7
8
  */
8
9
  export async function releaseCommand(serviceName, options = {}) {
9
10
  console.log(chalk.blue(`Releasing ${serviceName}...`));
10
11
  const config = getServiceConfig(serviceName);
11
12
  const workspaceRoot = getWorkspaceRoot();
12
- const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
13
+ const deployRepoPath = getDeployRepoPath(config, workspaceRoot);
13
14
  // Check for changes
14
15
  if (!hasChanges(deployRepoPath)) {
15
16
  console.log(chalk.yellow('No changes to release.'));
16
17
  return;
17
18
  }
18
19
  // Commit
19
- const message = options.message || `deploy: ${serviceName}`;
20
+ const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19);
21
+ const message = options.message || `deploy: ${serviceName} @ ${timestamp}`;
20
22
  gitAddAll(deployRepoPath);
21
23
  const committed = gitCommit(deployRepoPath, message);
22
24
  if (!committed) {
23
25
  console.log(chalk.yellow('No changes to commit.'));
24
26
  return;
25
27
  }
26
- // Push
28
+ // Push (this triggers the post-receive hook on the server)
27
29
  const branch = getCurrentBranch(deployRepoPath);
28
30
  console.log(chalk.gray(` Pushing to origin/${branch}...`));
29
31
  gitPush(deployRepoPath, 'origin', branch);
@@ -1 +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"}
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,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAM9F;;;;GAIG;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,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEhE,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,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,WAAW,MAAM,SAAS,EAAE,CAAC;IAC3E,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,2DAA2D;IAC3D,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"}
@@ -1,5 +1,10 @@
1
1
  /**
2
2
  * Stage command - copy build artifacts to deploy repository
3
+ *
4
+ * New architecture:
5
+ * - sourceDir: where the project is (e.g., kairox-api-node)
6
+ * - deployRepo: relative to sourceDir (e.g., deploy/staging)
7
+ * - artifacts: copied from sourceDir to deployRepo
3
8
  */
4
9
  export declare function stageCommand(serviceName: string): Promise<void>;
5
10
  //# sourceMappingURL=stage.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"AAmCA;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrE"}
@@ -1,37 +1,73 @@
1
1
  import chalk from 'chalk';
2
- import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
3
- import { DEFAULT_ARTIFACTS } from '../config/types.js';
2
+ import { execSync } from 'child_process';
3
+ import { getServiceConfig, getWorkspaceRoot, getSourceDir, getDeployRepoPath } from '../config/loader.js';
4
+ import { DEFAULT_ARTIFACTS, parseSshPort, buildSshUrl } from '../config/types.js';
4
5
  import { ensureDir, removeDir, copy, exists, joinPath } from '../utils/files.js';
6
+ /**
7
+ * Initialize deploy repo if it doesn't exist (lazy init)
8
+ * Creates git repo and adds remote pointing to server bare repo
9
+ */
10
+ function initDeployRepoIfNeeded(deployRepoPath, host, bareRepo, sshOptions) {
11
+ if (exists(joinPath(deployRepoPath, '.git'))) {
12
+ return false; // Already initialized
13
+ }
14
+ console.log(chalk.blue(' Initializing deploy repository...'));
15
+ ensureDir(deployRepoPath);
16
+ // git init
17
+ execSync('git init', { cwd: deployRepoPath, stdio: 'pipe' });
18
+ // Add remote with SSH URL
19
+ const port = parseSshPort(sshOptions);
20
+ const sshUrl = buildSshUrl(host, bareRepo, port);
21
+ execSync(`git remote add origin ${sshUrl}`, { cwd: deployRepoPath, stdio: 'pipe' });
22
+ console.log(chalk.gray(` Remote: ${sshUrl}`));
23
+ return true;
24
+ }
5
25
  /**
6
26
  * Stage command - copy build artifacts to deploy repository
27
+ *
28
+ * New architecture:
29
+ * - sourceDir: where the project is (e.g., kairox-api-node)
30
+ * - deployRepo: relative to sourceDir (e.g., deploy/staging)
31
+ * - artifacts: copied from sourceDir to deployRepo
7
32
  */
8
33
  export async function stageCommand(serviceName) {
9
34
  console.log(chalk.blue(`Staging ${serviceName}...`));
10
35
  const config = getServiceConfig(serviceName);
11
36
  const workspaceRoot = getWorkspaceRoot();
12
- const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
37
+ const sourceDir = getSourceDir(config, workspaceRoot);
38
+ const deployRepoPath = getDeployRepoPath(config, workspaceRoot);
13
39
  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;
40
+ // Validate source directory exists
41
+ if (!exists(sourceDir)) {
42
+ throw new Error(`Source directory not found: ${sourceDir}`);
43
+ }
44
+ console.log(chalk.gray(` Source: ${config.sourceDir}`));
45
+ console.log(chalk.gray(` Deploy: ${config.sourceDir}/${config.deployRepo}`));
46
+ // Lazy init deploy repo
47
+ const { host, bareRepo, sshOptions } = config.server;
48
+ const wasInitialized = initDeployRepoIfNeeded(deployRepoPath, host, bareRepo, sshOptions);
49
+ if (wasInitialized) {
50
+ console.log(chalk.green(' ✓ Deploy repo initialized'));
51
+ }
52
+ // Copy artifacts from sourceDir to deployRepo
53
+ let copiedCount = 0;
54
+ for (const artifact of artifacts) {
55
+ const srcPath = joinPath(sourceDir, artifact);
56
+ const destPath = joinPath(deployRepoPath, artifact);
57
+ if (exists(srcPath)) {
58
+ // Remove old artifact first (clean copy)
59
+ removeDir(destPath);
60
+ copy(srcPath, destPath);
61
+ console.log(chalk.gray(` ${artifact}`));
62
+ copiedCount++;
21
63
  }
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
- }
64
+ else {
65
+ console.log(chalk.yellow(` Warning: ${artifact} not found in ${config.sourceDir}`));
33
66
  }
34
67
  }
35
- console.log(chalk.green(`✓ Staged ${config.packages.length} package(s) to ${config.deployRepo}`));
68
+ if (copiedCount === 0) {
69
+ throw new Error('No artifacts were copied. Check your artifacts config and build output.');
70
+ }
71
+ console.log(chalk.green(`✓ Staged ${copiedCount} artifact(s) to ${config.sourceDir}/${config.deployRepo}`));
36
72
  }
37
73
  //# sourceMappingURL=stage.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BnD"}
@@ -16,8 +16,12 @@ export async function statusCommand() {
16
16
  console.log(chalk.gray(` ${name}`));
17
17
  console.log(chalk.gray(` Host: ${svc.server.host}`));
18
18
  console.log(chalk.gray(` Process: ${svc.processName}`));
19
- console.log(chalk.gray(` Packages: ${svc.packages.join(', ')}`));
19
+ console.log(chalk.gray(` Source: ${svc.sourceDir}`));
20
+ console.log(chalk.gray(` Deploy: ${svc.sourceDir}/${svc.deployRepo}`));
20
21
  console.log(chalk.gray(` Target: ${svc.server.targetDir}`));
22
+ if (svc.environment) {
23
+ console.log(chalk.gray(` Environment: ${svc.environment}`));
24
+ }
21
25
  }
22
26
  console.log('');
23
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -15,6 +15,20 @@ export declare function getServiceConfig(serviceName: string, configPath?: strin
15
15
  * Get workspace root (directory containing .git-deploy.json)
16
16
  */
17
17
  export declare function getWorkspaceRoot(): string;
18
+ /**
19
+ * Get absolute path to source directory
20
+ * @param config Service configuration
21
+ * @param workspaceRoot Workspace root path
22
+ * @returns Absolute path to sourceDir (e.g., /workspace/kairox-api-node)
23
+ */
24
+ export declare function getSourceDir(config: ServiceConfig, workspaceRoot: string): string;
25
+ /**
26
+ * Get absolute path to deploy repository
27
+ * @param config Service configuration
28
+ * @param workspaceRoot Workspace root path
29
+ * @returns Absolute path to deployRepo (e.g., /workspace/kairox-api-node/deploy/staging)
30
+ */
31
+ export declare function getDeployRepoPath(config: ServiceConfig, workspaceRoot: string): string;
18
32
  /**
19
33
  * List all configured services
20
34
  */
@@ -1 +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"}
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;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1D"}
@@ -56,6 +56,24 @@ export function getWorkspaceRoot() {
56
56
  }
57
57
  return dirname(configPath);
58
58
  }
59
+ /**
60
+ * Get absolute path to source directory
61
+ * @param config Service configuration
62
+ * @param workspaceRoot Workspace root path
63
+ * @returns Absolute path to sourceDir (e.g., /workspace/kairox-api-node)
64
+ */
65
+ export function getSourceDir(config, workspaceRoot) {
66
+ return join(workspaceRoot, config.sourceDir);
67
+ }
68
+ /**
69
+ * Get absolute path to deploy repository
70
+ * @param config Service configuration
71
+ * @param workspaceRoot Workspace root path
72
+ * @returns Absolute path to deployRepo (e.g., /workspace/kairox-api-node/deploy/staging)
73
+ */
74
+ export function getDeployRepoPath(config, workspaceRoot) {
75
+ return join(workspaceRoot, config.sourceDir, config.deployRepo);
76
+ }
59
77
  /**
60
78
  * List all configured services
61
79
  */
@@ -1 +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"}
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;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,aAAqB;IACvE,OAAO,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB,EAAE,aAAqB;IAC5E,OAAO,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AAClE,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"}
@@ -2,42 +2,80 @@
2
2
  * Process manager type
3
3
  */
4
4
  export type ProcessManagerType = 'pm2' | 'systemd';
5
+ /**
6
+ * Environment type for deployment
7
+ */
8
+ export type EnvironmentType = 'production' | 'staging' | 'development';
5
9
  /**
6
10
  * Service configuration for git-deploy
11
+ *
12
+ * New architecture: deploy/ folder inside source project
13
+ * Example:
14
+ * sourceDir: "kairox-api-node"
15
+ * deployRepo: "deploy/staging" (relative to sourceDir)
16
+ * → Full path: workspace/kairox-api-node/deploy/staging
7
17
  */
8
18
  export interface ServiceConfig {
9
- /** Packages to deploy (monorepo support) */
10
- packages: string[];
11
- /** Package with package.json for npm install */
12
- mainPackage: string;
13
- /** Path to local deploy repository (relative to workspace root) */
19
+ /** Source directory containing the project (relative to workspace root) */
20
+ sourceDir: string;
21
+ /** Path to deploy repository (relative to sourceDir) */
14
22
  deployRepo: string;
23
+ /** Files/dirs to copy to deploy repo */
24
+ artifacts: string[];
15
25
  /** Process manager type (default: 'pm2') */
16
26
  processManager?: ProcessManagerType;
17
27
  /** Process name (PM2 name or systemd service name) */
18
28
  processName: string;
19
- /** PM2 home directory (optional, only for PM2) */
29
+ /** PM2 home directory on server */
20
30
  pm2Home?: string;
21
- /** Files/dirs to copy (default: dist, package.json, package-lock.json) */
22
- artifacts?: string[];
31
+ /** User to run PM2 commands as (via sudo -u) */
32
+ pm2User?: string;
33
+ /** Environment type (production, staging, development) */
34
+ environment?: EnvironmentType;
35
+ /** Environment variables to write to .env file on server */
36
+ env?: Record<string, string | number | boolean>;
23
37
  /** Server-side configuration */
24
38
  server: {
25
39
  /** SSH host (user@hostname) */
26
40
  host: string;
27
- /** Where to install on server (clone of bare repo) */
41
+ /** Additional SSH options (e.g., "-p 6771 -4") */
42
+ sshOptions?: string;
43
+ /** Where to install on server (target directory) */
28
44
  targetDir: string;
29
45
  /** Path to bare git repo on server */
30
46
  bareRepo: string;
47
+ /** Unix group for shared access (created if not exists) */
48
+ group?: string;
31
49
  };
50
+ /** @deprecated Use sourceDir instead */
51
+ packages?: string[];
52
+ /** @deprecated Use sourceDir instead */
53
+ mainPackage?: string;
32
54
  }
33
55
  /**
34
56
  * Root configuration file (.git-deploy.json)
35
57
  */
36
58
  export interface DeployConfig {
59
+ /** Port ranges for different environments (informational) */
60
+ portRanges?: Record<string, Record<string, number>>;
37
61
  services: Record<string, ServiceConfig>;
38
62
  }
39
63
  /**
40
64
  * Default artifacts to copy if not specified
41
65
  */
42
66
  export declare const DEFAULT_ARTIFACTS: string[];
67
+ /**
68
+ * Parse SSH options to extract port
69
+ * @param sshOptions e.g. "-p 6771 -4"
70
+ * @returns port number or undefined
71
+ */
72
+ export declare function parseSshPort(sshOptions?: string): number | undefined;
73
+ /**
74
+ * Build SSH URL for git remote
75
+ * @param host e.g. "aschulz@symbio-raspi5"
76
+ * @param bareRepo e.g. "/git/sym/deploy-kairox/staging/kairox-api"
77
+ * @param port e.g. 6771
78
+ * @returns e.g. "ssh://aschulz@symbio-raspi5:6771/git/sym/deploy-kairox/staging/kairox-api"
79
+ */
80
+ export declare function buildSshUrl(host: string, bareRepo: string, port?: number): string;
43
81
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnD;;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,+BAA+B;QAC/B,IAAI,EAAE,MAAM,CAAC;QAEb,sDAAsD;QACtD,SAAS,EAAE,MAAM,CAAC;QAElB,sCAAsC;QACtC,QAAQ,EAAE,MAAM,CAAC;KAClB,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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAElB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IAEnB,wCAAwC;IACxC,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAEpC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAEhD,gCAAgC;IAChC,MAAM,EAAE;QACN,+BAA+B;QAC/B,IAAI,EAAE,MAAM,CAAC;QAEb,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB,oDAAoD;QACpD,SAAS,EAAE,MAAM,CAAC;QAElB,sCAAsC;QACtC,QAAQ,EAAE,MAAM,CAAC;QAEjB,2DAA2D;QAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAI7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIpE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjF"}