@calltelemetry/cli 0.3.7 → 0.3.9

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 (119) hide show
  1. package/README.md +13 -1
  2. package/dist/commands/offline.d.ts.map +1 -1
  3. package/dist/commands/offline.js +78 -105
  4. package/dist/commands/offline.js.map +1 -1
  5. package/dist/commands/secrets.d.ts.map +1 -1
  6. package/dist/commands/secrets.js +12 -0
  7. package/dist/commands/secrets.js.map +1 -1
  8. package/dist/commands/self-update.d.ts +2 -3
  9. package/dist/commands/self-update.d.ts.map +1 -1
  10. package/dist/commands/self-update.js +4 -49
  11. package/dist/commands/self-update.js.map +1 -1
  12. package/dist/commands/update.d.ts.map +1 -1
  13. package/dist/commands/update.js +25 -87
  14. package/dist/commands/update.js.map +1 -1
  15. package/dist/commands/users.d.ts +3 -0
  16. package/dist/commands/users.d.ts.map +1 -0
  17. package/dist/commands/users.js +24 -0
  18. package/dist/commands/users.js.map +1 -0
  19. package/dist/index.js +6 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/lib/auto-update.d.ts +15 -5
  22. package/dist/lib/auto-update.d.ts.map +1 -1
  23. package/dist/lib/auto-update.js +61 -25
  24. package/dist/lib/auto-update.js.map +1 -1
  25. package/dist/lib/bundle.d.ts.map +1 -1
  26. package/dist/lib/bundle.js +2 -9
  27. package/dist/lib/bundle.js.map +1 -1
  28. package/dist/lib/offline-steps.d.ts +33 -0
  29. package/dist/lib/offline-steps.d.ts.map +1 -0
  30. package/dist/lib/offline-steps.js +350 -0
  31. package/dist/lib/offline-steps.js.map +1 -0
  32. package/dist/lib/secrets.d.ts +14 -0
  33. package/dist/lib/secrets.d.ts.map +1 -1
  34. package/dist/lib/secrets.js +32 -0
  35. package/dist/lib/secrets.js.map +1 -1
  36. package/dist/lib/update-steps.d.ts +17 -0
  37. package/dist/lib/update-steps.d.ts.map +1 -0
  38. package/dist/lib/update-steps.js +169 -0
  39. package/dist/lib/update-steps.js.map +1 -0
  40. package/dist/lib/users.d.ts +33 -0
  41. package/dist/lib/users.d.ts.map +1 -0
  42. package/dist/lib/users.js +67 -0
  43. package/dist/lib/users.js.map +1 -0
  44. package/dist/ui/components/AppShell.d.ts +3 -1
  45. package/dist/ui/components/AppShell.d.ts.map +1 -1
  46. package/dist/ui/components/AppShell.js +5 -2
  47. package/dist/ui/components/AppShell.js.map +1 -1
  48. package/dist/ui/components/MetricsFooter.d.ts +7 -0
  49. package/dist/ui/components/MetricsFooter.d.ts.map +1 -0
  50. package/dist/ui/components/MetricsFooter.js +36 -0
  51. package/dist/ui/components/MetricsFooter.js.map +1 -0
  52. package/dist/ui/components/index.d.ts +1 -0
  53. package/dist/ui/components/index.d.ts.map +1 -1
  54. package/dist/ui/components/index.js +1 -0
  55. package/dist/ui/components/index.js.map +1 -1
  56. package/dist/ui/context/MetricsContext.d.ts +7 -0
  57. package/dist/ui/context/MetricsContext.d.ts.map +1 -0
  58. package/dist/ui/context/MetricsContext.js +13 -0
  59. package/dist/ui/context/MetricsContext.js.map +1 -0
  60. package/dist/ui/views/CertsStatusView.d.ts.map +1 -1
  61. package/dist/ui/views/CertsStatusView.js +19 -10
  62. package/dist/ui/views/CertsStatusView.js.map +1 -1
  63. package/dist/ui/views/DbBackupView.d.ts.map +1 -1
  64. package/dist/ui/views/DbBackupView.js +4 -2
  65. package/dist/ui/views/DbBackupView.js.map +1 -1
  66. package/dist/ui/views/DbStatusView.d.ts.map +1 -1
  67. package/dist/ui/views/DbStatusView.js +3 -2
  68. package/dist/ui/views/DbStatusView.js.map +1 -1
  69. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -1
  70. package/dist/ui/views/DiagDatabaseView.js +39 -29
  71. package/dist/ui/views/DiagDatabaseView.js.map +1 -1
  72. package/dist/ui/views/DiagNetworkView.d.ts.map +1 -1
  73. package/dist/ui/views/DiagNetworkView.js +23 -14
  74. package/dist/ui/views/DiagNetworkView.js.map +1 -1
  75. package/dist/ui/views/DiagServiceView.d.ts.map +1 -1
  76. package/dist/ui/views/DiagServiceView.js +32 -20
  77. package/dist/ui/views/DiagServiceView.js.map +1 -1
  78. package/dist/ui/views/DockerStatusView.d.ts.map +1 -1
  79. package/dist/ui/views/DockerStatusView.js +5 -4
  80. package/dist/ui/views/DockerStatusView.js.map +1 -1
  81. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  82. package/dist/ui/views/MainMenu.js +61 -10
  83. package/dist/ui/views/MainMenu.js.map +1 -1
  84. package/dist/ui/views/MigrateRunView.js +1 -1
  85. package/dist/ui/views/MigrateRunView.js.map +1 -1
  86. package/dist/ui/views/MigrateWatchView.d.ts.map +1 -1
  87. package/dist/ui/views/MigrateWatchView.js +2 -2
  88. package/dist/ui/views/MigrateWatchView.js.map +1 -1
  89. package/dist/ui/views/OfflineApplyView.d.ts +6 -0
  90. package/dist/ui/views/OfflineApplyView.d.ts.map +1 -0
  91. package/dist/ui/views/OfflineApplyView.js +109 -0
  92. package/dist/ui/views/OfflineApplyView.js.map +1 -0
  93. package/dist/ui/views/OfflineDownloadView.d.ts +6 -0
  94. package/dist/ui/views/OfflineDownloadView.d.ts.map +1 -0
  95. package/dist/ui/views/OfflineDownloadView.js +67 -0
  96. package/dist/ui/views/OfflineDownloadView.js.map +1 -0
  97. package/dist/ui/views/OfflineFetchView.d.ts +6 -0
  98. package/dist/ui/views/OfflineFetchView.d.ts.map +1 -0
  99. package/dist/ui/views/OfflineFetchView.js +64 -0
  100. package/dist/ui/views/OfflineFetchView.js.map +1 -0
  101. package/dist/ui/views/OfflineInspectView.d.ts +6 -0
  102. package/dist/ui/views/OfflineInspectView.d.ts.map +1 -0
  103. package/dist/ui/views/OfflineInspectView.js +65 -0
  104. package/dist/ui/views/OfflineInspectView.js.map +1 -0
  105. package/dist/ui/views/OfflineListView.d.ts.map +1 -1
  106. package/dist/ui/views/OfflineListView.js +2 -6
  107. package/dist/ui/views/OfflineListView.js.map +1 -1
  108. package/dist/ui/views/SecretsResetPasswordView.d.ts +11 -0
  109. package/dist/ui/views/SecretsResetPasswordView.d.ts.map +1 -0
  110. package/dist/ui/views/SecretsResetPasswordView.js +205 -0
  111. package/dist/ui/views/SecretsResetPasswordView.js.map +1 -0
  112. package/dist/ui/views/UpdateView.d.ts.map +1 -1
  113. package/dist/ui/views/UpdateView.js +20 -145
  114. package/dist/ui/views/UpdateView.js.map +1 -1
  115. package/dist/ui/views/UserResetPasswordView.d.ts +10 -0
  116. package/dist/ui/views/UserResetPasswordView.d.ts.map +1 -0
  117. package/dist/ui/views/UserResetPasswordView.js +220 -0
  118. package/dist/ui/views/UserResetPasswordView.js.map +1 -0
  119. package/package.json +4 -3
package/README.md CHANGED
@@ -83,10 +83,22 @@ ct migrate watch --interval 5 # Poll migration progress
83
83
  ct secrets # Show secrets status (default)
84
84
  ct secrets setup # Interactive configuration wizard
85
85
  ct secrets reset # Revert to defaults
86
+ ct secrets reset-password # Reset service password (PostgreSQL/Minio)
87
+ ct secrets reset-password --service postgres --env-only
86
88
  ```
87
89
 
88
90
  Manages credentials for PostgreSQL, NATS, and Minio. Values load with three-tier priority: defaults, `.env` file, then environment variables. The `.env` file is written with `0600` permissions and a Docker Compose overlay is generated automatically.
89
91
 
92
+ ### Users
93
+
94
+ ```bash
95
+ ct users reset-password # Reset a user account password (interactive)
96
+ ct users reset-password --org 1 # Pre-select organization
97
+ ct users reset-password --org 1 --user 1 # Pre-select org and user
98
+ ```
99
+
100
+ Queries the running application via RPC to list organizations and users, then resets the selected user's password. Useful for admin account recovery when locked out of the web UI.
101
+
90
102
  ### Config
91
103
 
92
104
  ```bash
@@ -152,7 +164,7 @@ ct offline list # List images in current compose file
152
164
 
153
165
  When run without arguments on a TTY, `ct` launches an interactive menu built with [Ink](https://github.com/vadimdemedes/ink). Navigate with arrow keys, select with Enter, quit with `q`.
154
166
 
155
- Categories: Status, Update, Database, Migrate, Secrets, Config, Docker, Diagnostics, JTAPI, Offline.
167
+ Categories: Status, Update, Services, Users, Database, Migrate, Secrets, Config, Docker, Diagnostics, JTAPI, Offline.
156
168
 
157
169
  ## Development
158
170
 
@@ -1 +1 @@
1
- {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../src/commands/offline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAoLtD"}
1
+ {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../src/commands/offline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAiJtD"}
@@ -1,11 +1,8 @@
1
1
  import { render } from 'ink';
2
2
  import React from 'react';
3
- import { execa } from 'execa';
4
- import { existsSync, readFileSync } from 'node:fs';
5
- import { copyFile, mkdir, rm } from 'node:fs/promises';
6
- import { join } from 'node:path';
7
- import { composeUp } from '../lib/compose.js';
8
- import { getPaths } from '../lib/paths.js';
3
+ import { existsSync } from 'node:fs';
4
+ import { runStepsCli } from '../lib/update-steps.js';
5
+ import { fetchSteps, downloadSteps, applySteps, inspectBundle, validateBundle, } from '../lib/offline-steps.js';
9
6
  import * as out from '../utils/output.js';
10
7
  import { OfflineListView } from '../ui/views/OfflineListView.js';
11
8
  export function registerOfflineCommand(program) {
@@ -15,97 +12,43 @@ export function registerOfflineCommand(program) {
15
12
  offline.command('fetch <version>')
16
13
  .description('Download pre-built config bundle from cloud (fast, no Docker images)')
17
14
  .action(async (version) => {
18
- const { gcsBundleBaseUrl } = getPaths();
19
- const bundleFile = `calltelemetry-bundle-${version}.tar.gz`;
20
- const bundleUrl = `${gcsBundleBaseUrl}/${version}/${bundleFile}`;
21
15
  out.header('Fetching Pre-built Bundle');
22
16
  console.log(`Version: ${version}`);
23
17
  console.log();
24
18
  try {
25
- await execa('curl', ['-fL', '--progress-bar', bundleUrl, '-o', bundleFile], {
26
- stdout: 'inherit',
27
- stderr: 'inherit',
28
- });
19
+ await runStepsCli(fetchSteps(version));
29
20
  }
30
21
  catch {
31
- out.errorBox('Failed to download bundle', [
22
+ out.errorBox('Fetch failed', [
32
23
  `Version ${version} may not exist.`,
33
24
  'Check: https://github.com/calltelemetry/calltelemetry/releases',
34
25
  ]);
35
- return;
36
- }
37
- // Verify checksum if available
38
- const checksumUrl = `${bundleUrl}.sha256`;
39
- try {
40
- await execa('curl', ['-sfL', checksumUrl, '-o', `${bundleFile}.sha256`]);
41
- await execa('sha256sum', ['-c', `${bundleFile}.sha256`]);
42
- out.ok('Checksum verified');
43
- await rm(`${bundleFile}.sha256`, { force: true });
44
- }
45
- catch {
46
- out.info('Checksum verification skipped');
26
+ process.exit(1);
47
27
  }
28
+ console.log();
48
29
  out.successBox('Bundle Downloaded');
49
- console.log(`File: ${bundleFile}`);
30
+ console.log(`File: calltelemetry-bundle-${version}.tar.gz`);
50
31
  console.log();
51
- console.log(`To apply: ct offline apply ${bundleFile}`);
32
+ console.log(`To apply: ct offline apply calltelemetry-bundle-${version}.tar.gz`);
52
33
  });
53
34
  offline.command('download <version>')
54
35
  .description('Build full offline bundle with Docker images (slow)')
55
36
  .action(async (version) => {
56
- const { gcsBundleBaseUrl } = getPaths();
57
- const configBundle = `calltelemetry-bundle-${version}.tar.gz`;
58
- const bundleDir = `calltelemetry-offline-${version}`;
59
- const bundleName = `calltelemetry-offline-${version}.tar.gz`;
60
37
  out.header('Creating Offline Bundle (with Docker Images)');
61
38
  console.log(`Version: ${version}`);
62
39
  console.log();
63
- // Download config bundle
64
- console.log('Step 1: Downloading config bundle...');
65
- const bundleUrl = `${gcsBundleBaseUrl}/${version}/${configBundle}`;
66
40
  try {
67
- await execa('curl', ['-fL', '--progress-bar', bundleUrl, '-o', configBundle], {
68
- stdout: 'inherit', stderr: 'inherit',
69
- });
41
+ await runStepsCli(downloadSteps(version));
70
42
  }
71
43
  catch {
72
- out.fail(`Failed to download config bundle for version ${version}`);
73
- return;
74
- }
75
- // Extract
76
- console.log('Step 2: Extracting config bundle...');
77
- await rm(bundleDir, { recursive: true, force: true });
78
- await mkdir(bundleDir, { recursive: true });
79
- await execa('tar', ['-xzf', configBundle, '-C', bundleDir, '--strip-components=1']);
80
- await rm(configBundle, { force: true });
81
- // Pull images
82
- console.log('Step 3: Pulling Docker images...');
83
- const composePath = join(bundleDir, 'docker-compose.yml');
84
- if (!existsSync(composePath)) {
85
- out.fail('docker-compose.yml not found in bundle');
86
- await rm(bundleDir, { recursive: true, force: true });
87
- return;
88
- }
89
- const content = readFileSync(composePath, 'utf-8');
90
- const images = [];
91
- for (const line of content.split('\n')) {
92
- const match = line.match(/image:\s*["']?([^"'\s]+)/);
93
- if (match)
94
- images.push(match[1]);
95
- }
96
- for (const img of images) {
97
- console.log(` Pulling: ${img}`);
98
- await execa('docker', ['pull', img]).catch(() => out.warn(`Failed to pull ${img}`));
44
+ out.errorBox('Download failed', [
45
+ `Failed to build offline bundle for version ${version}.`,
46
+ 'Check network connectivity and Docker status.',
47
+ ]);
48
+ process.exit(1);
99
49
  }
100
- // Save images
101
- console.log('Step 4: Saving Docker images...');
102
- await execa('docker', ['save', ...images, '-o', join(bundleDir, 'images.tar')], {
103
- stdout: 'inherit',
104
- });
105
- // Create final bundle
106
- console.log('Step 5: Creating final bundle archive...');
107
- await execa('tar', ['-czf', bundleName, bundleDir]);
108
- await rm(bundleDir, { recursive: true, force: true });
50
+ const bundleName = `calltelemetry-offline-${version}.tar.gz`;
51
+ console.log();
109
52
  out.successBox('Offline Bundle Created');
110
53
  console.log(`File: ${bundleName}`);
111
54
  console.log();
@@ -117,49 +60,79 @@ export function registerOfflineCommand(program) {
117
60
  .action(async (bundle) => {
118
61
  if (!existsSync(bundle)) {
119
62
  out.fail(`Bundle file not found: ${bundle}`);
120
- return;
63
+ process.exit(1);
121
64
  }
122
- const { installDir, backupDir } = getPaths();
123
65
  out.header('Applying Offline Bundle');
124
66
  console.log(`Bundle: ${bundle}`);
125
- console.log();
126
- const extractDir = `offline-extract-${process.pid}`;
127
- await mkdir(extractDir, { recursive: true });
128
- console.log('Extracting bundle...');
129
- await execa('tar', ['-xzf', bundle, '-C', extractDir, '--strip-components=1']);
130
- // Load Docker images
131
- const imagesFile = join(extractDir, 'images.tar');
132
- if (existsSync(imagesFile)) {
133
- console.log('Loading Docker images...');
134
- await execa('docker', ['load', '-i', imagesFile], { stdout: 'inherit' });
135
- }
136
- // Install configs
137
- console.log('Installing configuration files...');
138
- await mkdir(backupDir, { recursive: true });
139
- const configFiles = ['docker-compose.yml', 'Caddyfile', 'cli.sh', 'nats.conf'];
140
- for (const file of configFiles) {
141
- const src = join(extractDir, file);
142
- if (existsSync(src)) {
143
- const dest = join(installDir, file);
144
- if (existsSync(dest)) {
145
- await copyFile(dest, join(backupDir, `${file}.backup`));
146
- }
147
- await copyFile(src, dest);
148
- console.log(` - ${file}`);
149
- }
67
+ // Pre-apply validation & summary
68
+ const validation = await validateBundle(bundle);
69
+ if (!validation.valid) {
70
+ out.fail(validation.error);
71
+ process.exit(1);
150
72
  }
151
- await rm(extractDir, { recursive: true, force: true });
73
+ const info = await inspectBundle(bundle);
74
+ console.log(`Size: ${info.sizeLabel}`);
75
+ if (info.version)
76
+ console.log(`Version: ${info.version}`);
77
+ console.log(`Configs: ${info.configFiles.join(', ') || 'none'}`);
78
+ console.log(`Images: ${info.hasImages ? `${info.imageNames.length} bundled` : 'none (config-only)'}`);
152
79
  console.log();
153
- console.log('Restarting services...');
154
80
  try {
155
- await execa('systemctl', ['restart', 'docker-compose-app.service']);
81
+ await runStepsCli(applySteps(bundle));
156
82
  }
157
83
  catch {
158
- await composeUp(['-d']);
84
+ out.errorBox('Apply failed', [
85
+ 'Your previous version is still running.',
86
+ 'Check logs with: docker compose logs --tail 50',
87
+ ]);
88
+ process.exit(1);
159
89
  }
90
+ console.log();
160
91
  out.successBox('Offline Bundle Applied');
161
92
  console.log('Check status with: ct status');
162
93
  });
94
+ offline.command('inspect <bundle>')
95
+ .description('Inspect contents of an offline bundle without applying')
96
+ .action(async (bundle) => {
97
+ if (!existsSync(bundle)) {
98
+ out.fail(`Bundle file not found: ${bundle}`);
99
+ process.exit(1);
100
+ }
101
+ const validation = await validateBundle(bundle);
102
+ if (!validation.valid) {
103
+ out.fail(validation.error);
104
+ process.exit(1);
105
+ }
106
+ const info = await inspectBundle(bundle);
107
+ out.header('Bundle Contents');
108
+ console.log(`File: ${bundle}`);
109
+ console.log(`Size: ${info.sizeLabel}`);
110
+ if (info.version)
111
+ console.log(`Version: ${info.version}`);
112
+ console.log();
113
+ console.log('Configuration files:');
114
+ if (info.configFiles.length > 0) {
115
+ for (const f of info.configFiles) {
116
+ console.log(` - ${f}`);
117
+ }
118
+ }
119
+ else {
120
+ console.log(' (none found)');
121
+ }
122
+ console.log();
123
+ console.log('Docker images:');
124
+ if (info.hasImages && info.imageNames.length > 0) {
125
+ for (const img of info.imageNames) {
126
+ console.log(` - ${img}`);
127
+ }
128
+ }
129
+ else if (info.hasImages) {
130
+ console.log(' images.tar present (could not parse image names)');
131
+ }
132
+ else {
133
+ console.log(' (none — config-only bundle)');
134
+ }
135
+ });
163
136
  offline.command('list')
164
137
  .description('List images in current docker-compose.yml')
165
138
  .action(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/commands/offline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAW,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAExD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;SAC/B,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,wBAAwB,OAAO,SAAS,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,gBAAgB,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAEjE,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE;gBAC1E,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,QAAQ,CAAC,2BAA2B,EAAE;gBACxC,WAAW,OAAO,iBAAiB;gBACnC,gEAAgE;aACjE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,MAAM,WAAW,GAAG,GAAG,SAAS,SAAS,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC;YACzE,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC;YACzD,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC,GAAG,UAAU,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,CAAC;QAED,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;SAClC,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,wBAAwB,OAAO,SAAS,CAAC;QAC9D,MAAM,SAAS,GAAG,yBAAyB,OAAO,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,yBAAyB,OAAO,SAAS,CAAC;QAE7D,GAAG,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,yBAAyB;QACzB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,GAAG,gBAAgB,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE;gBAC5E,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;QACpF,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAExC,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE;YAC9E,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,sBAAsB;QACtB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC9B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,CAAC;QAE7C,GAAG,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,UAAU,GAAG,mBAAmB,OAAO,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAE/E,qBAAqB;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,WAAW,GAAG,CAAC,oBAAoB,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SACpB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC;QACvE,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"offline.js","sourceRoot":"","sources":["../../src/commands/offline.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QA8CtD"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QA4DtD"}
@@ -3,6 +3,7 @@ import { render } from 'ink';
3
3
  import React from 'react';
4
4
  import { SecretsStatusView } from '../ui/views/SecretsStatusView.js';
5
5
  import { SecretsSetupView } from '../ui/views/SecretsSetupView.js';
6
+ import { SecretsResetPasswordView } from '../ui/views/SecretsResetPasswordView.js';
6
7
  import { getEnvFilePath } from '../lib/secrets.js';
7
8
  import { getPaths } from '../lib/paths.js';
8
9
  import { removeSafe } from '../lib/fs.js';
@@ -46,6 +47,17 @@ export function registerSecretsCommand(program) {
46
47
  out.ok('Secrets reset to defaults');
47
48
  console.log("Restart services to apply: ct update");
48
49
  });
50
+ secrets.command('reset-password')
51
+ .description('Reset a service password (PostgreSQL or Minio)')
52
+ .option('--env-only', 'Only update .env file (do not change service password)')
53
+ .option('--service <name>', 'Service to reset: postgres or minio')
54
+ .action(async (opts) => {
55
+ const { waitUntilExit } = render(React.createElement(SecretsResetPasswordView, {
56
+ envOnly: opts.envOnly,
57
+ service: opts.service,
58
+ }));
59
+ await waitUntilExit();
60
+ });
49
61
  // Default: show status
50
62
  secrets.action(async () => {
51
63
  const { waitUntilExit } = render(React.createElement(SecretsStatusView));
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAE5D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACrB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxE,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACrB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,EAAE,kBAAkB,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAErD,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,IAAI,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC3C,IAAI,aAAa;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,kBAAkB,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,CAAC,MAAM,OAAO,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,SAAS;YAAE,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,aAAa;YAAE,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACzE,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import { Command } from 'commander';
2
2
  /**
3
- * Update the CLI itself via npm.
4
- * Can be called standalone or as a pre-step during `ct update`.
3
+ * Registered as `ct self-update`. Delegates to the shared updateCli()
4
+ * with interactive (non-silent) output.
5
5
  */
6
- export declare function selfUpdate(): Promise<void>;
7
6
  export declare function registerSelfUpdateCommand(program: Command): void;
8
7
  //# sourceMappingURL=self-update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA4ChD;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,QAOzD"}
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,QAOzD"}
@@ -1,59 +1,14 @@
1
- import { execa } from 'execa';
2
- import * as out from '../utils/output.js';
1
+ import { updateCli } from '../lib/auto-update.js';
3
2
  /**
4
- * Update the CLI itself via npm.
5
- * Can be called standalone or as a pre-step during `ct update`.
3
+ * Registered as `ct self-update`. Delegates to the shared updateCli()
4
+ * with interactive (non-silent) output.
6
5
  */
7
- export async function selfUpdate() {
8
- console.log('Checking for CLI updates...');
9
- try {
10
- const { stdout: installed } = await execa('npm', ['ls', '-g', '@calltelemetry/cli', '--json']);
11
- const local = JSON.parse(installed)?.dependencies?.['@calltelemetry/cli']?.version;
12
- const { stdout: registryJson } = await execa('npm', ['view', '@calltelemetry/cli', 'version', '--json']);
13
- const latest = JSON.parse(registryJson);
14
- if (local && local === latest) {
15
- out.ok(`CLI is up to date (v${local})`);
16
- return;
17
- }
18
- console.log(`Updating CLI: ${local ?? 'unknown'} → ${latest}...`);
19
- }
20
- catch {
21
- // Can't determine versions — just run the install
22
- console.log('Installing latest CLI...');
23
- }
24
- // Try user-level install first, fallback to sudo
25
- try {
26
- await execa('npm', ['install', '-g', '@calltelemetry/cli'], {
27
- stdout: 'inherit',
28
- stderr: 'inherit',
29
- });
30
- out.ok('CLI updated successfully');
31
- }
32
- catch (err) {
33
- const isPermission = err.stderr?.toString().includes('EACCES') || err.exitCode === 243;
34
- if (!isPermission) {
35
- out.warn('CLI self-update failed. You can update manually: npm install -g @calltelemetry/cli');
36
- return;
37
- }
38
- // Permission denied — retry with sudo
39
- try {
40
- await execa('sudo', ['npm', 'install', '-g', '@calltelemetry/cli'], {
41
- stdout: 'inherit',
42
- stderr: 'inherit',
43
- });
44
- out.ok('CLI updated successfully');
45
- }
46
- catch {
47
- out.warn('CLI self-update failed. You can update manually: sudo npm install -g @calltelemetry/cli');
48
- }
49
- }
50
- }
51
6
  export function registerSelfUpdateCommand(program) {
52
7
  program
53
8
  .command('self-update')
54
9
  .description('Update the ct CLI tool to the latest version')
55
10
  .action(async () => {
56
- await selfUpdate();
11
+ await updateCli(program.version() ?? '0.0.0');
57
12
  });
58
13
  }
59
14
  //# sourceMappingURL=self-update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAEnF,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAExC,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC9B,GAAG,CAAC,EAAE,CAAC,uBAAuB,KAAK,GAAG,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI,SAAS,MAAM,MAAM,KAAK,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;YAC1D,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC;QACvF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QACD,sCAAsC;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;gBAClE,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAwNrD"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAkJrD"}
@@ -1,15 +1,13 @@
1
1
  import { execa } from 'execa';
2
2
  import { existsSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import { compose, composeUp } from '../lib/compose.js';
4
+ import { composeUp } from '../lib/compose.js';
5
5
  import { getPaths } from '../lib/paths.js';
6
- import { fetchLatestVersion, downloadBundle, checkImageAvailability, extractImages } from '../lib/bundle.js';
7
- import { checkRam, checkDiskSpace, getDockerVersion } from '../lib/system.js';
8
- import { generateSelfSignedCerts } from '../lib/certs.js';
9
- import { isVersionGte } from '../utils/version.js';
6
+ import { fetchLatestVersion } from '../lib/bundle.js';
7
+ import { getDockerVersion } from '../lib/system.js';
8
+ import { getCurrentVersion } from '../lib/update.js';
10
9
  import { confirm } from '../utils/prompt.js';
11
- import { selfUpdate } from './self-update.js';
12
- import { getCurrentVersion, backupCompose, applyAndRestart, postgresVersionGuard, dockerCleanup, applyIpv6IfEnabled } from '../lib/update.js';
10
+ import { preflightSteps, executeSteps, runStepsCli } from '../lib/update-steps.js';
13
11
  import * as out from '../utils/output.js';
14
12
  export function registerUpdateCommand(program) {
15
13
  program
@@ -21,11 +19,6 @@ export function registerUpdateCommand(program) {
21
19
  .option('--no-cleanup', 'Skip Docker cleanup after update')
22
20
  .option('--ipv6', 'Enable IPv6 support')
23
21
  .action(async (versionArg, opts) => {
24
- const { installDir, composeFile } = getPaths();
25
- // Self-update CLI first
26
- await selfUpdate();
27
- console.log();
28
- await generateSelfSignedCerts();
29
22
  // Resolve version
30
23
  let version = versionArg;
31
24
  if (!version && opts.latest) {
@@ -42,35 +35,18 @@ export function registerUpdateCommand(program) {
42
35
  console.log(`Current version: ${currentVersion}`);
43
36
  console.log(`Target version: ${version}`);
44
37
  console.log();
45
- // RAM check for >= 0.8.4
46
- if (isVersionGte(version, '0.8.4') && !opts.forceUpgrade) {
47
- console.log(`Checking RAM requirements for version ${version}...`);
48
- const ram = await checkRam();
49
- if (!ram.ok) {
50
- out.errorBox('Insufficient RAM', [
51
- `Version 0.8.4+ requires 8GB RAM (detected: ${ram.totalMb}MB)`,
52
- `Use --force-upgrade to proceed anyway.`,
53
- ]);
54
- process.exit(1);
55
- }
56
- out.ok('RAM requirement met');
57
- console.log();
58
- }
59
- // Disk check
38
+ // Preflight checks (shared with TUI)
60
39
  if (!opts.forceUpgrade) {
61
- console.log('Checking disk space...');
62
- const disk = await checkDiskSpace();
63
- if (!disk.ok) {
64
- out.errorBox('Insufficient disk space', [
65
- `Available: ${disk.freePercent}% free (need 10% minimum)`,
66
- `Use --force-upgrade to proceed anyway.`,
67
- ]);
40
+ try {
41
+ await runStepsCli(preflightSteps(version));
42
+ console.log();
43
+ }
44
+ catch {
45
+ out.fail('Pre-flight checks failed. Use --force-upgrade to proceed anyway.');
68
46
  process.exit(1);
69
47
  }
70
- out.ok('Sufficient disk space available');
71
- console.log();
72
48
  }
73
- // Docker version check
49
+ // Docker version upgrade (CLI-only: auto-upgrades via dnf)
74
50
  console.log('Checking Docker version...');
75
51
  const dockerVer = await getDockerVersion();
76
52
  if (dockerVer === null) {
@@ -90,7 +66,7 @@ export function registerUpdateCommand(program) {
90
66
  else {
91
67
  out.ok(`Docker version ${dockerVer} is supported`);
92
68
  }
93
- // Ensure Node.js 20.x is installed
69
+ // Ensure Node.js 20.x (CLI-only: auto-installs via dnf)
94
70
  console.log();
95
71
  console.log('Ensuring Node.js 20.x is installed...');
96
72
  try {
@@ -113,40 +89,10 @@ export function registerUpdateCommand(program) {
113
89
  await execa('sudo', ['dnf', 'install', '-y', 'nodejs'], { stdout: 'inherit', stderr: 'inherit' });
114
90
  out.ok('Node.js 20.x installed');
115
91
  }
116
- catch (installErr) {
92
+ catch {
117
93
  out.warn('Could not install Node.js automatically. Please install Node.js 20+ manually.');
118
94
  }
119
95
  }
120
- // Backup current compose
121
- const backupName = await backupCompose();
122
- if (backupName !== 'no existing file') {
123
- console.log('Existing docker-compose.yml backed up.');
124
- }
125
- // Download bundle
126
- console.log();
127
- await downloadBundle(version);
128
- console.log();
129
- // Check image availability
130
- const tempFile = join(installDir, 'temp-docker-compose.yml');
131
- if (!opts.forceUpgrade) {
132
- if (!await checkImageAvailability(tempFile)) {
133
- out.errorBox('Cannot proceed with upgrade', [
134
- 'Some images are not available.',
135
- 'Use --force-upgrade to proceed anyway.',
136
- ]);
137
- process.exit(1);
138
- }
139
- }
140
- // Pull images
141
- console.log('Pulling Docker images...');
142
- await compose(['-f', tempFile, 'pull']);
143
- out.ok('All images pulled successfully');
144
- // Show versions
145
- console.log();
146
- console.log('Image versions to be deployed:');
147
- const images = await extractImages(tempFile);
148
- for (const img of images)
149
- console.log(` - ${img}`);
150
96
  console.log();
151
97
  console.log(`Upgrading from ${currentVersion} to ${version}`);
152
98
  // Interactive abort
@@ -156,26 +102,18 @@ export function registerUpdateCommand(program) {
156
102
  return;
157
103
  }
158
104
  }
159
- // PostgreSQL version guard
160
- const pinnedPg = await postgresVersionGuard();
161
- if (pinnedPg) {
162
- console.log();
163
- out.warn(`PostgreSQL version guard: Your database is on PostgreSQL ${pinnedPg}`);
164
- console.log(' Auto-pinning for safety. To upgrade later: ct postgres upgrade 17');
165
- }
166
- // Apply and restart
167
- await applyAndRestart();
168
- console.log('New docker-compose.yml applied. Services restarting.');
169
- // Re-apply IPv6 if preference is enabled
170
- const appliedIpv6 = await applyIpv6IfEnabled();
171
- if (appliedIpv6) {
172
- console.log('IPv6 dual-stack re-applied per preferences.');
105
+ // Run shared execute pipeline (certs, backup, download, pull, PG guard, apply, IPv6, cleanup)
106
+ let steps = executeSteps(version);
107
+ // Apply CLI-specific flags
108
+ if (opts.forceUpgrade) {
109
+ steps = steps.filter(s => s.label !== 'Check image availability');
173
110
  }
174
- // Cleanup
175
- if (opts.cleanup !== false) {
176
- console.log('Cleaning up unused Docker resources...');
177
- await dockerCleanup();
111
+ if (opts.cleanup === false) {
112
+ steps = steps.filter(s => s.label !== 'Cleanup unused resources');
178
113
  }
114
+ console.log();
115
+ await runStepsCli(steps);
116
+ console.log();
179
117
  out.successBox('Update complete!');
180
118
  });
181
119
  program