@calltelemetry/cli 0.3.2 → 0.3.4
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.
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/bundle.d.ts +1 -0
- package/dist/lib/bundle.d.ts.map +1 -1
- package/dist/lib/bundle.js +46 -19
- package/dist/lib/bundle.js.map +1 -1
- package/dist/lib/certs.js +3 -3
- package/dist/lib/certs.js.map +1 -1
- package/dist/lib/compose.d.ts.map +1 -1
- package/dist/lib/compose.js +17 -9
- package/dist/lib/compose.js.map +1 -1
- package/dist/lib/exec.d.ts +31 -0
- package/dist/lib/exec.d.ts.map +1 -0
- package/dist/lib/exec.js +63 -0
- package/dist/lib/exec.js.map +1 -0
- package/dist/lib/log.d.ts +23 -0
- package/dist/lib/log.d.ts.map +1 -0
- package/dist/lib/log.js +52 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/system.d.ts +20 -0
- package/dist/lib/system.d.ts.map +1 -1
- package/dist/lib/system.js +52 -4
- package/dist/lib/system.js.map +1 -1
- package/dist/lib/update.d.ts +1 -1
- package/dist/lib/update.d.ts.map +1 -1
- package/dist/lib/update.js +14 -5
- package/dist/lib/update.js.map +1 -1
- package/dist/ui/components/AppShell.d.ts +4 -1
- package/dist/ui/components/AppShell.d.ts.map +1 -1
- package/dist/ui/components/AppShell.js +4 -3
- package/dist/ui/components/AppShell.js.map +1 -1
- package/dist/ui/components/LogLevelBadge.d.ts +7 -0
- package/dist/ui/components/LogLevelBadge.d.ts.map +1 -0
- package/dist/ui/components/LogLevelBadge.js +14 -0
- package/dist/ui/components/LogLevelBadge.js.map +1 -0
- package/dist/ui/components/MeterBar.d.ts +15 -0
- package/dist/ui/components/MeterBar.d.ts.map +1 -0
- package/dist/ui/components/MeterBar.js +17 -0
- package/dist/ui/components/MeterBar.js.map +1 -0
- package/dist/ui/components/StepList.d.ts +9 -1
- package/dist/ui/components/StepList.d.ts.map +1 -1
- package/dist/ui/components/StepList.js +6 -2
- package/dist/ui/components/StepList.js.map +1 -1
- package/dist/ui/components/index.d.ts +2 -0
- package/dist/ui/components/index.d.ts.map +1 -1
- package/dist/ui/components/index.js +2 -0
- package/dist/ui/components/index.js.map +1 -1
- package/dist/ui/hooks/index.d.ts +2 -1
- package/dist/ui/hooks/index.d.ts.map +1 -1
- package/dist/ui/hooks/index.js +1 -0
- package/dist/ui/hooks/index.js.map +1 -1
- package/dist/ui/hooks/useLogLevel.d.ts +12 -0
- package/dist/ui/hooks/useLogLevel.d.ts.map +1 -0
- package/dist/ui/hooks/useLogLevel.js +19 -0
- package/dist/ui/hooks/useLogLevel.js.map +1 -0
- package/dist/ui/hooks/useStepRunner.d.ts +14 -1
- package/dist/ui/hooks/useStepRunner.d.ts.map +1 -1
- package/dist/ui/hooks/useStepRunner.js +24 -2
- package/dist/ui/hooks/useStepRunner.js.map +1 -1
- package/dist/ui/views/MainMenu.d.ts.map +1 -1
- package/dist/ui/views/MainMenu.js +22 -10
- package/dist/ui/views/MainMenu.js.map +1 -1
- package/dist/ui/views/ServicesView.d.ts.map +1 -1
- package/dist/ui/views/ServicesView.js +8 -10
- package/dist/ui/views/ServicesView.js.map +1 -1
- package/dist/ui/views/StatusView.d.ts.map +1 -1
- package/dist/ui/views/StatusView.js +17 -15
- package/dist/ui/views/StatusView.js.map +1 -1
- package/dist/ui/views/UpdateView.d.ts.map +1 -1
- package/dist/ui/views/UpdateView.js +70 -18
- package/dist/ui/views/UpdateView.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const VERSION = '0.3.
|
|
2
|
+
const VERSION = '0.3.4';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import { registerStatusCommand } from './commands/status.js';
|
|
5
5
|
import { registerUpdateCommand } from './commands/update.js';
|
|
@@ -14,12 +14,17 @@ import { registerSecretsCommand } from './commands/secrets.js';
|
|
|
14
14
|
import { registerServicesCommand } from './commands/services.js';
|
|
15
15
|
import { registerSelfUpdateCommand } from './commands/self-update.js';
|
|
16
16
|
import { LOGO } from './lib/brand.js';
|
|
17
|
+
import { setVerbose } from './lib/log.js';
|
|
17
18
|
const program = new Command();
|
|
18
19
|
program
|
|
19
20
|
.name('ct')
|
|
20
21
|
.description('CallTelemetry appliance management CLI')
|
|
21
22
|
.version(VERSION)
|
|
22
|
-
.
|
|
23
|
+
.option('-v, --verbose', 'Enable verbose/debug output')
|
|
24
|
+
.hook('preAction', (thisCmd) => {
|
|
25
|
+
// Enable verbose logging if flag is set
|
|
26
|
+
if (thisCmd.opts().verbose)
|
|
27
|
+
setVerbose(true);
|
|
23
28
|
// Only show logo for direct CLI invocations, not TUI
|
|
24
29
|
console.log(`\n${LOGO}\n\nhttps://calltelemetry.com`);
|
|
25
30
|
console.log();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;KACtD,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;IAC7B,wCAAwC;IACxC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,+BAA+B,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAEnC,+DAA+D;AAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3C,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,2EAA2E;IAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAE5D,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CACvC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC5B,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,CAAC,OAAe,EAAE,EAAE;gBAChC,OAAO,EAAE,CAAC;gBACV,wDAAwD;gBACxD,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC,CACH,CAAC;QAEF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
package/dist/lib/bundle.d.ts
CHANGED
package/dist/lib/bundle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"AAUA,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,QAAQ,GAAG,QAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBhE;AAgBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHlG;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1E;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBlF;AAED,sFAAsF;AACtF,wBAAsB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9E,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE,CAAC,CAkBD"}
|
package/dist/lib/bundle.js
CHANGED
|
@@ -4,20 +4,23 @@ import { mkdir, rename, rm, copyFile, chmod } from 'node:fs/promises';
|
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { getPaths } from './paths.js';
|
|
6
6
|
import { compareVersions } from '../utils/version.js';
|
|
7
|
+
import { exec, execRetry, ExecError } from './exec.js';
|
|
8
|
+
import { debug } from './log.js';
|
|
7
9
|
import * as out from '../utils/output.js';
|
|
8
10
|
export async function fetchLatestVersion(channel = 'stable') {
|
|
9
11
|
const { gcsBaseUrl } = getPaths();
|
|
10
12
|
const file = channel === 'stable' ? 'latest-stable.txt' : 'latest.txt';
|
|
11
13
|
const url = `${gcsBaseUrl}/${file}`;
|
|
12
14
|
try {
|
|
13
|
-
const
|
|
14
|
-
const version = stdout.trim();
|
|
15
|
+
const result = await execRetry('curl', ['-sfL', url], { retries: 2, retryDelay: 2000 });
|
|
16
|
+
const version = String(result.stdout ?? '').trim();
|
|
15
17
|
if (!version)
|
|
16
18
|
throw new Error('Empty response');
|
|
17
19
|
return version;
|
|
18
20
|
}
|
|
19
|
-
catch {
|
|
20
|
-
|
|
21
|
+
catch (err) {
|
|
22
|
+
const context = err instanceof ExecError ? `\n${err.stderr || `curl exit ${err.exitCode}`}` : '';
|
|
23
|
+
throw new Error(`Failed to fetch latest ${channel} version from ${url}${context}\n` +
|
|
21
24
|
(channel === 'stable'
|
|
22
25
|
? "No stable release available yet. Use 'ct update --latest' for pre-release."
|
|
23
26
|
: "Specify a version manually: ct update <version>"));
|
|
@@ -30,8 +33,8 @@ export async function fetchLatestVersion(channel = 'stable') {
|
|
|
30
33
|
export async function fetchAvailableVersions() {
|
|
31
34
|
const url = 'https://storage.googleapis.com/storage/v1/b/ct_releases/o?prefix=releases/&delimiter=/&maxResults=1000';
|
|
32
35
|
try {
|
|
33
|
-
const
|
|
34
|
-
const data = JSON.parse(stdout);
|
|
36
|
+
const result = await execRetry('curl', ['-sf', url], { retries: 2, retryDelay: 2000 });
|
|
37
|
+
const data = JSON.parse(String(result.stdout ?? ''));
|
|
35
38
|
const prefixes = data.prefixes ?? [];
|
|
36
39
|
const versions = prefixes
|
|
37
40
|
.map(p => p.replace(/^releases\//, '').replace(/\/$/, ''))
|
|
@@ -39,8 +42,9 @@ export async function fetchAvailableVersions() {
|
|
|
39
42
|
versions.sort((a, b) => compareVersions(b, a)); // descending
|
|
40
43
|
return versions;
|
|
41
44
|
}
|
|
42
|
-
catch {
|
|
43
|
-
|
|
45
|
+
catch (err) {
|
|
46
|
+
const context = err instanceof ExecError ? `: ${err.stderr || `curl exit ${err.exitCode}`}` : '';
|
|
47
|
+
throw new Error(`Failed to fetch available versions from GCS${context}`);
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
/** Copy a file, falling back to sudo cp if destination is owned by root */
|
|
@@ -50,7 +54,8 @@ async function safeCopy(src, dest) {
|
|
|
50
54
|
}
|
|
51
55
|
catch (err) {
|
|
52
56
|
if (err?.code === 'EACCES') {
|
|
53
|
-
|
|
57
|
+
debug(`Permission denied copying ${src} → ${dest}, using sudo`);
|
|
58
|
+
await exec('sudo', ['cp', src, dest]);
|
|
54
59
|
}
|
|
55
60
|
else {
|
|
56
61
|
throw err;
|
|
@@ -65,18 +70,22 @@ export async function downloadBundle(version, options) {
|
|
|
65
70
|
const quiet = options?.quiet ?? false;
|
|
66
71
|
if (!quiet)
|
|
67
72
|
console.log(`Downloading config bundle for version ${version}...`);
|
|
73
|
+
debug(`Bundle URL: ${bundleUrl}`);
|
|
68
74
|
try {
|
|
69
75
|
const curlArgs = quiet
|
|
70
76
|
? ['-fsSL', bundleUrl, '-o', bundleName]
|
|
71
77
|
: ['-fL', '--progress-bar', bundleUrl, '-o', bundleName];
|
|
72
|
-
await
|
|
78
|
+
await execRetry('curl', curlArgs, {
|
|
73
79
|
cwd: installDir,
|
|
74
80
|
stdout: quiet ? 'pipe' : 'inherit',
|
|
75
81
|
stderr: quiet ? 'pipe' : 'inherit',
|
|
82
|
+
retries: 2,
|
|
83
|
+
retryDelay: 3000,
|
|
76
84
|
});
|
|
77
85
|
}
|
|
78
|
-
catch {
|
|
79
|
-
|
|
86
|
+
catch (err) {
|
|
87
|
+
const context = err instanceof ExecError ? `\n${err.stderr || `curl exit ${err.exitCode}`}` : '';
|
|
88
|
+
throw new Error(`Failed to download bundle from GCS${context}\n` +
|
|
80
89
|
`URL: ${bundleUrl}\n\n` +
|
|
81
90
|
`Check available releases at: https://github.com/calltelemetry/calltelemetry/releases`);
|
|
82
91
|
}
|
|
@@ -85,8 +94,9 @@ export async function downloadBundle(version, options) {
|
|
|
85
94
|
// Extract
|
|
86
95
|
if (!quiet)
|
|
87
96
|
console.log('Extracting config files...');
|
|
97
|
+
debug(`Extracting to ${extractDir}`);
|
|
88
98
|
await mkdir(extractDir, { recursive: true });
|
|
89
|
-
await
|
|
99
|
+
await exec('tar', ['-xzf', bundleName, '-C', extractDir, '--strip-components=1'], {
|
|
90
100
|
cwd: installDir,
|
|
91
101
|
});
|
|
92
102
|
const extractedCompose = join(extractDir, 'docker-compose.yml');
|
|
@@ -99,6 +109,7 @@ export async function downloadBundle(version, options) {
|
|
|
99
109
|
await rename(extractedCompose, tempFile);
|
|
100
110
|
if (!quiet)
|
|
101
111
|
out.ok('docker-compose.yml');
|
|
112
|
+
debug('Extracted docker-compose.yml → temp-docker-compose.yml');
|
|
102
113
|
// Update cli.sh if present
|
|
103
114
|
const extractedCli = join(extractDir, 'cli.sh');
|
|
104
115
|
if (existsSync(extractedCli)) {
|
|
@@ -107,6 +118,7 @@ export async function downloadBundle(version, options) {
|
|
|
107
118
|
await chmod(cliDest, 0o755);
|
|
108
119
|
if (!quiet)
|
|
109
120
|
out.ok('cli.sh');
|
|
121
|
+
debug('Extracted cli.sh');
|
|
110
122
|
}
|
|
111
123
|
// Prometheus – destination may be owned by root (Docker volume mount)
|
|
112
124
|
const extractedProm = join(extractDir, 'prometheus', 'prometheus.yml');
|
|
@@ -116,6 +128,7 @@ export async function downloadBundle(version, options) {
|
|
|
116
128
|
await safeCopy(extractedProm, join(promDir, 'prometheus.yml'));
|
|
117
129
|
if (!quiet)
|
|
118
130
|
out.ok('prometheus/prometheus.yml');
|
|
131
|
+
debug('Extracted prometheus.yml');
|
|
119
132
|
}
|
|
120
133
|
// Grafana
|
|
121
134
|
const extractedGrafana = join(extractDir, 'grafana');
|
|
@@ -130,11 +143,18 @@ export async function downloadBundle(version, options) {
|
|
|
130
143
|
await execa('cp', ['-r', join(extractedGrafana, sub), grafanaDir]);
|
|
131
144
|
}
|
|
132
145
|
catch {
|
|
133
|
-
|
|
146
|
+
debug(`cp -r grafana/${sub} failed, trying sudo`);
|
|
147
|
+
try {
|
|
148
|
+
await exec('sudo', ['cp', '-r', join(extractedGrafana, sub), grafanaDir]);
|
|
149
|
+
}
|
|
150
|
+
catch (sudoErr) {
|
|
151
|
+
debug(`sudo cp grafana/${sub} also failed: ${sudoErr.message}`);
|
|
152
|
+
}
|
|
134
153
|
}
|
|
135
154
|
}
|
|
136
155
|
if (!quiet)
|
|
137
156
|
out.ok('grafana configs');
|
|
157
|
+
debug('Extracted grafana configs');
|
|
138
158
|
}
|
|
139
159
|
// Nats
|
|
140
160
|
const extractedNats = join(extractDir, 'nats.conf');
|
|
@@ -142,6 +162,7 @@ export async function downloadBundle(version, options) {
|
|
|
142
162
|
await safeCopy(extractedNats, join(installDir, 'nats.conf'));
|
|
143
163
|
if (!quiet)
|
|
144
164
|
out.ok('nats.conf');
|
|
165
|
+
debug('Extracted nats.conf');
|
|
145
166
|
}
|
|
146
167
|
// Caddyfile
|
|
147
168
|
const extractedCaddy = join(extractDir, 'Caddyfile');
|
|
@@ -149,6 +170,7 @@ export async function downloadBundle(version, options) {
|
|
|
149
170
|
await safeCopy(extractedCaddy, join(installDir, 'Caddyfile'));
|
|
150
171
|
if (!quiet)
|
|
151
172
|
out.ok('Caddyfile');
|
|
173
|
+
debug('Extracted Caddyfile');
|
|
152
174
|
}
|
|
153
175
|
// Cleanup
|
|
154
176
|
await rm(join(installDir, bundleName), { force: true });
|
|
@@ -179,8 +201,9 @@ export async function checkImageAvailability(composeFile) {
|
|
|
179
201
|
await execa('docker', ['manifest', 'inspect', image]);
|
|
180
202
|
console.log('✓ Available');
|
|
181
203
|
}
|
|
182
|
-
catch {
|
|
183
|
-
|
|
204
|
+
catch (err) {
|
|
205
|
+
const reason = err.stderr?.toString().trim() || 'unknown error';
|
|
206
|
+
console.log(`✗ Not available (${reason})`);
|
|
184
207
|
allAvailable = false;
|
|
185
208
|
}
|
|
186
209
|
}
|
|
@@ -192,11 +215,15 @@ export async function checkImageAvailabilityQuiet(composeFile) {
|
|
|
192
215
|
const results = [];
|
|
193
216
|
for (const image of images) {
|
|
194
217
|
try {
|
|
195
|
-
await
|
|
218
|
+
await exec('docker', ['manifest', 'inspect', image]);
|
|
196
219
|
results.push({ image, available: true });
|
|
197
220
|
}
|
|
198
|
-
catch {
|
|
199
|
-
|
|
221
|
+
catch (err) {
|
|
222
|
+
const error = err instanceof ExecError
|
|
223
|
+
? (err.stderr || `exit ${err.exitCode}`)
|
|
224
|
+
: (err.message || 'unknown');
|
|
225
|
+
debug(`Image check failed for ${image}: ${error}`);
|
|
226
|
+
results.push({ image, available: false, error });
|
|
200
227
|
}
|
|
201
228
|
}
|
|
202
229
|
return { available: results.every(r => r.available), results };
|
package/dist/lib/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA+B,QAAQ;IAC9E,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/lib/bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/certs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { exec } from './exec.js';
|
|
4
4
|
import { getPaths } from './paths.js';
|
|
5
5
|
import { mkdirSafe } from './fs.js';
|
|
6
6
|
export async function generateSelfSignedCerts() {
|
|
@@ -11,7 +11,7 @@ export async function generateSelfSignedCerts() {
|
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
await mkdirSafe(certsDir);
|
|
14
|
-
await
|
|
14
|
+
await exec('openssl', [
|
|
15
15
|
'req', '-x509', '-nodes', '-days', '365',
|
|
16
16
|
'-newkey', 'rsa:2048',
|
|
17
17
|
'-keyout', keyFile,
|
|
@@ -22,7 +22,7 @@ export async function generateSelfSignedCerts() {
|
|
|
22
22
|
export async function resetCerts() {
|
|
23
23
|
const { certsDir } = getPaths();
|
|
24
24
|
if (existsSync(certsDir)) {
|
|
25
|
-
await
|
|
25
|
+
await exec('sudo', ['rm', '-rf', certsDir]);
|
|
26
26
|
}
|
|
27
27
|
await generateSelfSignedCerts();
|
|
28
28
|
}
|
package/dist/lib/certs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/lib/certs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/lib/certs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,IAAI,CAAC,SAAS,EAAE;QACpB,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;QACxC,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,sCAAsC;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEhC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,uBAAuB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"AAiDA,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAIjE,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAuBpE;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;IAmBzF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;;;;IAkBA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;IAkBnG;AAED,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAO7C;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;;;;IAEhF"}
|
package/dist/lib/compose.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { execa } from 'execa';
|
|
3
|
+
import { exec } from './exec.js';
|
|
4
|
+
import { debug } from './log.js';
|
|
3
5
|
import { getPaths } from './paths.js';
|
|
4
6
|
const MIN_API_VERSION = '1.44';
|
|
5
7
|
function compareVersions(a, b) {
|
|
@@ -15,28 +17,31 @@ function compareVersions(a, b) {
|
|
|
15
17
|
}
|
|
16
18
|
async function getDockerApiVersion() {
|
|
17
19
|
try {
|
|
18
|
-
const
|
|
19
|
-
return stdout.trim();
|
|
20
|
+
const result = await exec('docker', ['version', '--format', '{{.Client.APIVersion}}']);
|
|
21
|
+
return String(result.stdout ?? '').trim();
|
|
20
22
|
}
|
|
21
|
-
catch {
|
|
22
|
-
|
|
23
|
+
catch (err) {
|
|
24
|
+
debug(`Docker API version check failed: ${err.message}`);
|
|
25
|
+
return null;
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
async function hasDockerComposePlugin() {
|
|
26
29
|
try {
|
|
27
|
-
await
|
|
30
|
+
await exec('docker', ['compose', 'version']);
|
|
28
31
|
return true;
|
|
29
32
|
}
|
|
30
|
-
catch {
|
|
33
|
+
catch (err) {
|
|
34
|
+
debug(`docker compose plugin not available: ${err.message}`);
|
|
31
35
|
return false;
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
async function hasStandaloneCompose() {
|
|
35
39
|
try {
|
|
36
|
-
await
|
|
40
|
+
await exec('docker-compose', ['version']);
|
|
37
41
|
return true;
|
|
38
42
|
}
|
|
39
|
-
catch {
|
|
43
|
+
catch (err) {
|
|
44
|
+
debug(`docker-compose standalone not available: ${err.message}`);
|
|
40
45
|
return false;
|
|
41
46
|
}
|
|
42
47
|
}
|
|
@@ -45,13 +50,16 @@ export async function detectComposeCommand() {
|
|
|
45
50
|
if (cachedCmd)
|
|
46
51
|
return cachedCmd;
|
|
47
52
|
const apiVersion = await getDockerApiVersion();
|
|
48
|
-
const apiOk = compareVersions(apiVersion, MIN_API_VERSION) >= 0;
|
|
53
|
+
const apiOk = apiVersion !== null && compareVersions(apiVersion, MIN_API_VERSION) >= 0;
|
|
54
|
+
debug(`Docker API version: ${apiVersion ?? 'unavailable'}, meets min ${MIN_API_VERSION}: ${apiOk}`);
|
|
49
55
|
if (await hasDockerComposePlugin() && apiOk) {
|
|
50
56
|
cachedCmd = 'docker compose';
|
|
57
|
+
debug(`Using compose command: ${cachedCmd}`);
|
|
51
58
|
return cachedCmd;
|
|
52
59
|
}
|
|
53
60
|
if (await hasStandaloneCompose()) {
|
|
54
61
|
cachedCmd = 'docker-compose';
|
|
62
|
+
debug(`Using compose command: ${cachedCmd}`);
|
|
55
63
|
return cachedCmd;
|
|
56
64
|
}
|
|
57
65
|
throw new Error('Neither "docker compose" nor "docker-compose" is available.\n' +
|
package/dist/lib/compose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,MAAM,
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/lib/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin wrapper around execa that captures stderr, exit codes, and commands
|
|
3
|
+
* in a structured ExecError. Also provides retry with exponential backoff.
|
|
4
|
+
*/
|
|
5
|
+
import { type Options } from 'execa';
|
|
6
|
+
/** Structured error that preserves the command, exit code, and stderr. */
|
|
7
|
+
export declare class ExecError extends Error {
|
|
8
|
+
command: string;
|
|
9
|
+
exitCode: number | undefined;
|
|
10
|
+
stderr: string;
|
|
11
|
+
constructor(opts: {
|
|
12
|
+
command: string;
|
|
13
|
+
exitCode?: number;
|
|
14
|
+
stderr: string;
|
|
15
|
+
message: string;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute a command, logging it in verbose mode and wrapping failures
|
|
20
|
+
* in ExecError with full context.
|
|
21
|
+
*/
|
|
22
|
+
export declare function exec(cmd: string, args: string[], options?: Options): Promise<import("execa").Result<Options>>;
|
|
23
|
+
/**
|
|
24
|
+
* Execute a command with automatic retry and exponential backoff.
|
|
25
|
+
* Useful for network operations (curl, docker pull) that may fail transiently.
|
|
26
|
+
*/
|
|
27
|
+
export declare function execRetry(cmd: string, args: string[], options?: Options & {
|
|
28
|
+
retries?: number;
|
|
29
|
+
retryDelay?: number;
|
|
30
|
+
}): Promise<import("execa").Result<Options>>;
|
|
31
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AAG5C,0EAA0E;AAC1E,qBAAa,SAAU,SAAQ,KAAK;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAO1F;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,4CAexE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,4CAmB9D"}
|
package/dist/lib/exec.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin wrapper around execa that captures stderr, exit codes, and commands
|
|
3
|
+
* in a structured ExecError. Also provides retry with exponential backoff.
|
|
4
|
+
*/
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
import { debug, trace } from './log.js';
|
|
7
|
+
/** Structured error that preserves the command, exit code, and stderr. */
|
|
8
|
+
export class ExecError extends Error {
|
|
9
|
+
command;
|
|
10
|
+
exitCode;
|
|
11
|
+
stderr;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
super(opts.message);
|
|
14
|
+
this.name = 'ExecError';
|
|
15
|
+
this.command = opts.command;
|
|
16
|
+
this.exitCode = opts.exitCode;
|
|
17
|
+
this.stderr = opts.stderr;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Execute a command, logging it in verbose mode and wrapping failures
|
|
22
|
+
* in ExecError with full context.
|
|
23
|
+
*/
|
|
24
|
+
export async function exec(cmd, args, options) {
|
|
25
|
+
trace(cmd, args);
|
|
26
|
+
try {
|
|
27
|
+
return await execa(cmd, args, options);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const stderr = err.stderr?.toString().trim() ?? '';
|
|
31
|
+
const exitCode = err.exitCode;
|
|
32
|
+
const cmdStr = `${cmd} ${args.join(' ')}`;
|
|
33
|
+
throw new ExecError({
|
|
34
|
+
command: cmdStr,
|
|
35
|
+
exitCode,
|
|
36
|
+
stderr,
|
|
37
|
+
message: stderr || err.message || `Command failed: ${cmdStr}`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Execute a command with automatic retry and exponential backoff.
|
|
43
|
+
* Useful for network operations (curl, docker pull) that may fail transiently.
|
|
44
|
+
*/
|
|
45
|
+
export async function execRetry(cmd, args, options) {
|
|
46
|
+
const { retries = 2, retryDelay = 3000, ...execOpts } = options ?? {};
|
|
47
|
+
let lastErr;
|
|
48
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
49
|
+
try {
|
|
50
|
+
return await exec(cmd, args, execOpts);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
lastErr = err;
|
|
54
|
+
if (attempt < retries) {
|
|
55
|
+
const delay = retryDelay * (attempt + 1);
|
|
56
|
+
debug(`Retry ${attempt + 1}/${retries} in ${delay}ms: ${cmd} ${args.join(' ')}`);
|
|
57
|
+
await new Promise(r => setTimeout(r, delay));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw lastErr;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAgB,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAExC,0EAA0E;AAC1E,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,OAAO,CAAS;IAChB,QAAQ,CAAqB;IAC7B,MAAM,CAAS;IAEf,YAAY,IAA6E;QACvF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,IAAc,EAAE,OAAiB;IACvE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA8B,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC;YAClB,OAAO,EAAE,MAAM;YACf,QAAQ;YACR,MAAM;YACN,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,mBAAmB,MAAM,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,IAAc,EACd,OAA6D;IAE7D,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACtE,IAAI,OAA0B,CAAC;IAE/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,GAAG,GAAG,CAAC;YACd,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBACzC,KAAK,CAAC,SAAS,OAAO,GAAG,CAAC,IAAI,OAAO,OAAO,KAAK,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAQ,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility with three levels: normal, verbose, debug.
|
|
3
|
+
*
|
|
4
|
+
* All output uses console.error so it doesn't interfere with piped stdout.
|
|
5
|
+
* In TUI mode the level can be cycled at runtime via the `d` key.
|
|
6
|
+
*/
|
|
7
|
+
export type LogLevel = 'normal' | 'verbose' | 'debug';
|
|
8
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
9
|
+
export declare function getLogLevel(): LogLevel;
|
|
10
|
+
/** Cycle to the next log level. Returns the new level. */
|
|
11
|
+
export declare function cycleLogLevel(): LogLevel;
|
|
12
|
+
/** Subscribe to level changes. Returns an unsubscribe function. */
|
|
13
|
+
export declare function onLogLevelChange(fn: (level: LogLevel) => void): () => void;
|
|
14
|
+
/** Backward-compatible setter — `true` maps to 'verbose'. */
|
|
15
|
+
export declare function setVerbose(v: boolean): void;
|
|
16
|
+
export declare function isVerbose(): boolean;
|
|
17
|
+
/** Log a debug message (visible at verbose or debug level). */
|
|
18
|
+
export declare function debug(msg: string): void;
|
|
19
|
+
/** Log the command being executed (visible only at debug level). */
|
|
20
|
+
export declare function trace(cmd: string, args: string[]): void;
|
|
21
|
+
/** Log a warning — always shown regardless of level. */
|
|
22
|
+
export declare function warnLog(msg: string): void;
|
|
23
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAStD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAGjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,IAAI,QAAQ,CAKxC;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAG1E;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAE3C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,+DAA+D;AAC/D,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,oEAAoE;AACpE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAEvD;AAED,wDAAwD;AACxD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC"}
|
package/dist/lib/log.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility with three levels: normal, verbose, debug.
|
|
3
|
+
*
|
|
4
|
+
* All output uses console.error so it doesn't interfere with piped stdout.
|
|
5
|
+
* In TUI mode the level can be cycled at runtime via the `d` key.
|
|
6
|
+
*/
|
|
7
|
+
const LOG_LEVELS = ['normal', 'verbose', 'debug'];
|
|
8
|
+
let currentLevel = 'normal';
|
|
9
|
+
/** Listeners notified when the level changes (used by the TUI hook). */
|
|
10
|
+
const listeners = new Set();
|
|
11
|
+
export function setLogLevel(level) {
|
|
12
|
+
currentLevel = level;
|
|
13
|
+
for (const fn of listeners)
|
|
14
|
+
fn(level);
|
|
15
|
+
}
|
|
16
|
+
export function getLogLevel() {
|
|
17
|
+
return currentLevel;
|
|
18
|
+
}
|
|
19
|
+
/** Cycle to the next log level. Returns the new level. */
|
|
20
|
+
export function cycleLogLevel() {
|
|
21
|
+
const idx = LOG_LEVELS.indexOf(currentLevel);
|
|
22
|
+
const next = LOG_LEVELS[(idx + 1) % LOG_LEVELS.length];
|
|
23
|
+
setLogLevel(next);
|
|
24
|
+
return next;
|
|
25
|
+
}
|
|
26
|
+
/** Subscribe to level changes. Returns an unsubscribe function. */
|
|
27
|
+
export function onLogLevelChange(fn) {
|
|
28
|
+
listeners.add(fn);
|
|
29
|
+
return () => { listeners.delete(fn); };
|
|
30
|
+
}
|
|
31
|
+
/** Backward-compatible setter — `true` maps to 'verbose'. */
|
|
32
|
+
export function setVerbose(v) {
|
|
33
|
+
setLogLevel(v ? 'verbose' : 'normal');
|
|
34
|
+
}
|
|
35
|
+
export function isVerbose() {
|
|
36
|
+
return currentLevel !== 'normal';
|
|
37
|
+
}
|
|
38
|
+
/** Log a debug message (visible at verbose or debug level). */
|
|
39
|
+
export function debug(msg) {
|
|
40
|
+
if (currentLevel !== 'normal')
|
|
41
|
+
console.error(`[debug] ${msg}`);
|
|
42
|
+
}
|
|
43
|
+
/** Log the command being executed (visible only at debug level). */
|
|
44
|
+
export function trace(cmd, args) {
|
|
45
|
+
if (currentLevel === 'debug')
|
|
46
|
+
console.error(`[exec] ${cmd} ${args.join(' ')}`);
|
|
47
|
+
}
|
|
48
|
+
/** Log a warning — always shown regardless of level. */
|
|
49
|
+
export function warnLog(msg) {
|
|
50
|
+
console.error(`[warn] ${msg}`);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,UAAU,GAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAE9D,IAAI,YAAY,GAAa,QAAQ,CAAC;AAEtC,wEAAwE;AACxE,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEvD,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,EAAE,IAAI,SAAS;QAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAE,CAAC;IACxD,WAAW,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,EAA6B;IAC5D,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,YAAY,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,KAAK,CAAC,GAAW,EAAE,IAAc;IAC/C,IAAI,YAAY,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC"}
|