jumbo-cli 3.7.2 → 3.8.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 (85) hide show
  1. package/dist/application/cli-metadata/update/CliPackageName.d.ts +2 -0
  2. package/dist/application/cli-metadata/update/CliPackageName.d.ts.map +1 -0
  3. package/dist/application/cli-metadata/update/CliPackageName.js +2 -0
  4. package/dist/application/cli-metadata/update/CliPackageName.js.map +1 -0
  5. package/dist/application/cli-metadata/update/CliPackageVersionLookupResult.d.ts +11 -0
  6. package/dist/application/cli-metadata/update/CliPackageVersionLookupResult.d.ts.map +1 -0
  7. package/dist/application/cli-metadata/update/CliPackageVersionLookupResult.js +2 -0
  8. package/dist/application/cli-metadata/update/CliPackageVersionLookupResult.js.map +1 -0
  9. package/dist/application/cli-metadata/update/CliUpdateCheckResult.d.ts +23 -0
  10. package/dist/application/cli-metadata/update/CliUpdateCheckResult.d.ts.map +1 -0
  11. package/dist/application/cli-metadata/update/CliUpdateCheckResult.js +2 -0
  12. package/dist/application/cli-metadata/update/CliUpdateCheckResult.js.map +1 -0
  13. package/dist/application/cli-metadata/update/CliUpdateController.d.ts +18 -0
  14. package/dist/application/cli-metadata/update/CliUpdateController.d.ts.map +1 -0
  15. package/dist/application/cli-metadata/update/CliUpdateController.js +118 -0
  16. package/dist/application/cli-metadata/update/CliUpdateController.js.map +1 -0
  17. package/dist/application/cli-metadata/update/CliUpdateFailureReason.d.ts +9 -0
  18. package/dist/application/cli-metadata/update/CliUpdateFailureReason.d.ts.map +1 -0
  19. package/dist/application/cli-metadata/update/CliUpdateFailureReason.js +8 -0
  20. package/dist/application/cli-metadata/update/CliUpdateFailureReason.js.map +1 -0
  21. package/dist/application/cli-metadata/update/CliUpgradeFeasibility.d.ts +11 -0
  22. package/dist/application/cli-metadata/update/CliUpgradeFeasibility.d.ts.map +1 -0
  23. package/dist/application/cli-metadata/update/CliUpgradeFeasibility.js +2 -0
  24. package/dist/application/cli-metadata/update/CliUpgradeFeasibility.js.map +1 -0
  25. package/dist/application/cli-metadata/update/CliUpgradeResult.d.ts +12 -0
  26. package/dist/application/cli-metadata/update/CliUpgradeResult.d.ts.map +1 -0
  27. package/dist/application/cli-metadata/update/CliUpgradeResult.js +2 -0
  28. package/dist/application/cli-metadata/update/CliUpgradeResult.js.map +1 -0
  29. package/dist/application/cli-metadata/update/CliVersionComparator.d.ts +6 -0
  30. package/dist/application/cli-metadata/update/CliVersionComparator.d.ts.map +1 -0
  31. package/dist/application/cli-metadata/update/CliVersionComparator.js +44 -0
  32. package/dist/application/cli-metadata/update/CliVersionComparator.js.map +1 -0
  33. package/dist/application/cli-metadata/update/CliVersionComparison.d.ts +7 -0
  34. package/dist/application/cli-metadata/update/CliVersionComparison.d.ts.map +1 -0
  35. package/dist/application/cli-metadata/update/CliVersionComparison.js +6 -0
  36. package/dist/application/cli-metadata/update/CliVersionComparison.js.map +1 -0
  37. package/dist/application/cli-metadata/update/ICliPackageUpgradeGateway.d.ts +7 -0
  38. package/dist/application/cli-metadata/update/ICliPackageUpgradeGateway.d.ts.map +1 -0
  39. package/dist/application/cli-metadata/update/ICliPackageUpgradeGateway.js +2 -0
  40. package/dist/application/cli-metadata/update/ICliPackageUpgradeGateway.js.map +1 -0
  41. package/dist/application/cli-metadata/update/ICliPackageVersionGateway.d.ts +5 -0
  42. package/dist/application/cli-metadata/update/ICliPackageVersionGateway.d.ts.map +1 -0
  43. package/dist/application/cli-metadata/update/ICliPackageVersionGateway.js +2 -0
  44. package/dist/application/cli-metadata/update/ICliPackageVersionGateway.js.map +1 -0
  45. package/dist/application/host/IApplicationContainer.d.ts +2 -0
  46. package/dist/application/host/IApplicationContainer.d.ts.map +1 -1
  47. package/dist/infrastructure/cli-metadata/update/CliUpdateTestMode.d.ts +5 -0
  48. package/dist/infrastructure/cli-metadata/update/CliUpdateTestMode.d.ts.map +1 -0
  49. package/dist/infrastructure/cli-metadata/update/CliUpdateTestMode.js +5 -0
  50. package/dist/infrastructure/cli-metadata/update/CliUpdateTestMode.js.map +1 -0
  51. package/dist/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.d.ts +42 -0
  52. package/dist/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.d.ts.map +1 -0
  53. package/dist/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.js +375 -0
  54. package/dist/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.js.map +1 -0
  55. package/dist/infrastructure/cli-metadata/update/NpmPackageVersionGateway.d.ts +17 -0
  56. package/dist/infrastructure/cli-metadata/update/NpmPackageVersionGateway.d.ts.map +1 -0
  57. package/dist/infrastructure/cli-metadata/update/NpmPackageVersionGateway.js +103 -0
  58. package/dist/infrastructure/cli-metadata/update/NpmPackageVersionGateway.js.map +1 -0
  59. package/dist/infrastructure/host/HostBuilder.d.ts.map +1 -1
  60. package/dist/infrastructure/host/HostBuilder.js +5 -0
  61. package/dist/infrastructure/host/HostBuilder.js.map +1 -1
  62. package/dist/infrastructure/local/LocalDatabaseRebuildService.d.ts +1 -0
  63. package/dist/infrastructure/local/LocalDatabaseRebuildService.d.ts.map +1 -1
  64. package/dist/infrastructure/local/LocalDatabaseRebuildService.js +42 -21
  65. package/dist/infrastructure/local/LocalDatabaseRebuildService.js.map +1 -1
  66. package/dist/presentation/cli/AppRunner.d.ts.map +1 -1
  67. package/dist/presentation/cli/AppRunner.js +1 -1
  68. package/dist/presentation/cli/AppRunner.js.map +1 -1
  69. package/dist/presentation/tui/application-shell/Footer.d.ts +2 -1
  70. package/dist/presentation/tui/application-shell/Footer.d.ts.map +1 -1
  71. package/dist/presentation/tui/application-shell/Footer.js +2 -2
  72. package/dist/presentation/tui/application-shell/Footer.js.map +1 -1
  73. package/dist/presentation/tui/application-shell/NotificationDrawer.d.ts +7 -1
  74. package/dist/presentation/tui/application-shell/NotificationDrawer.d.ts.map +1 -1
  75. package/dist/presentation/tui/application-shell/NotificationDrawer.js +10 -2
  76. package/dist/presentation/tui/application-shell/NotificationDrawer.js.map +1 -1
  77. package/dist/presentation/tui/application-shell/TuiApp.d.ts +3 -1
  78. package/dist/presentation/tui/application-shell/TuiApp.d.ts.map +1 -1
  79. package/dist/presentation/tui/application-shell/TuiApp.js +121 -5
  80. package/dist/presentation/tui/application-shell/TuiApp.js.map +1 -1
  81. package/dist/presentation/tui/application-shell/TuiApplicationLauncher.d.ts +3 -1
  82. package/dist/presentation/tui/application-shell/TuiApplicationLauncher.d.ts.map +1 -1
  83. package/dist/presentation/tui/application-shell/TuiApplicationLauncher.js +3 -2
  84. package/dist/presentation/tui/application-shell/TuiApplicationLauncher.js.map +1 -1
  85. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ import type { ILogger } from "../../../application/logging/ILogger.js";
2
+ import type { ITelemetryClient } from "../../../application/telemetry/ITelemetryClient.js";
3
+ import type { CliUpgradeFeasibility } from "../../../application/cli-metadata/update/CliUpgradeFeasibility.js";
4
+ import type { CliUpgradeResult } from "../../../application/cli-metadata/update/CliUpgradeResult.js";
5
+ import type { ICliPackageUpgradeGateway } from "../../../application/cli-metadata/update/ICliPackageUpgradeGateway.js";
6
+ type TestUpgradeResult = "success" | "failure";
7
+ export declare class NpmPackageUpgradeGateway implements ICliPackageUpgradeGateway {
8
+ private readonly packageEntryPointPath;
9
+ private readonly telemetryClient?;
10
+ private readonly logger?;
11
+ private readonly npmCliPath;
12
+ private readonly selfUpgradeTestModeEnabled;
13
+ private readonly testUpgradeResult;
14
+ private readonly testUpgradeDelayMs;
15
+ constructor(packageEntryPointPath?: string, telemetryClient?: Pick<ITelemetryClient, "track"> | undefined, logger?: Pick<ILogger, "warn" | "info"> | undefined, npmCliPath?: string | null, selfUpgradeTestModeEnabled?: boolean, testUpgradeResult?: TestUpgradeResult, testUpgradeDelayMs?: number);
16
+ evaluate(): Promise<CliUpgradeFeasibility>;
17
+ upgrade(targetVersion: string): Promise<CliUpgradeResult>;
18
+ private getGlobalNodeModulesRoot;
19
+ private findPackageRoots;
20
+ private findPackageRootFromCandidate;
21
+ private resolvePackageEntryPointPaths;
22
+ private resolveNpmShimTargetPath;
23
+ private isInsideDirectory;
24
+ private isSourceCheckout;
25
+ private unavailable;
26
+ private feasibleResult;
27
+ private trackFeasibility;
28
+ private trackUpgrade;
29
+ private runNpm;
30
+ private resolveNpmInvocation;
31
+ private normalizeExecFileResult;
32
+ private decorateNpmError;
33
+ private describeError;
34
+ private describePathState;
35
+ private tail;
36
+ private delay;
37
+ private static parseTestUpgradeResult;
38
+ private static parseTestUpgradeDelayMs;
39
+ private static findNpmCliPath;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=NpmPackageUpgradeGateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmPackageUpgradeGateway.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AAE3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mEAAmE,CAAC;AAC/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAErG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uEAAuE,CAAC;AA8BvH,KAAK,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/C,qBAAa,wBAAyB,YAAW,yBAAyB;IAEtE,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAE3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAXlB,qBAAqB,GAAE,MAA8B,EACrD,eAAe,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,YAAA,EACjD,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,YAAA,EACvC,UAAU,GAAE,MAAM,GAAG,IACK,EAC1B,0BAA0B,GAAE,OACE,EAC9B,iBAAiB,GAAE,iBAGjC,EACc,kBAAkB,GAAE,MAGlC;IAGC,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAwD1C,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAkEjD,wBAAwB;IAKtC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,4BAA4B;IAgCpC,OAAO,CAAC,6BAA6B;IA2BrC,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;YAkBN,MAAM;IAmBpB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,aAAa;IAqDrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,IAAI;YAIE,KAAK;IAQnB,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAMrC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,OAAO,CAAC,MAAM,CAAC,cAAc;CAU9B"}
@@ -0,0 +1,375 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { CliPackageName } from "../../../application/cli-metadata/update/CliPackageName.js";
6
+ import { CliUpdateFailureReason } from "../../../application/cli-metadata/update/CliUpdateFailureReason.js";
7
+ import { CLI_UPDATE_TEST_MODE_ENV, CLI_UPDATE_TEST_UPGRADE_DELAY_MS_ENV, CLI_UPDATE_TEST_UPGRADE_RESULT_ENV, } from "./CliUpdateTestMode.js";
8
+ const execFileAsync = promisify(execFile);
9
+ const NPM_UPGRADE_TIMEOUT_MS = 120000;
10
+ const NPM_FEASIBILITY_LOOKUP_COMPLETED_EVENT = "npm_upgrade_feasibility_lookup_completed";
11
+ const NPM_PACKAGE_UPGRADE_COMPLETED_EVENT = "npm_package_upgrade_completed";
12
+ const MANUAL_UPDATE_GUIDANCE = `Run npm install -g ${CliPackageName}@latest`;
13
+ const NPM_COMMAND = "npm";
14
+ const NPM_CLI_PATH_SEGMENTS = [
15
+ "node_modules",
16
+ "npm",
17
+ "bin",
18
+ "npm-cli.js",
19
+ ];
20
+ const NPM_ROOT_OPERATION = "npm-root-global";
21
+ const NPM_INSTALL_OPERATION = "npm-install-global";
22
+ const NPM_STDIO_TAIL_LENGTH = 500;
23
+ export class NpmPackageUpgradeGateway {
24
+ constructor(packageEntryPointPath = process.argv[1] ?? "", telemetryClient, logger, npmCliPath = NpmPackageUpgradeGateway.findNpmCliPath(), selfUpgradeTestModeEnabled = process.env[CLI_UPDATE_TEST_MODE_ENV] === "1", testUpgradeResult = NpmPackageUpgradeGateway.parseTestUpgradeResult(process.env[CLI_UPDATE_TEST_UPGRADE_RESULT_ENV]), testUpgradeDelayMs = NpmPackageUpgradeGateway.parseTestUpgradeDelayMs(process.env[CLI_UPDATE_TEST_UPGRADE_DELAY_MS_ENV])) {
25
+ this.packageEntryPointPath = packageEntryPointPath;
26
+ this.telemetryClient = telemetryClient;
27
+ this.logger = logger;
28
+ this.npmCliPath = npmCliPath;
29
+ this.selfUpgradeTestModeEnabled = selfUpgradeTestModeEnabled;
30
+ this.testUpgradeResult = testUpgradeResult;
31
+ this.testUpgradeDelayMs = testUpgradeDelayMs;
32
+ }
33
+ async evaluate() {
34
+ const startedAt = Date.now();
35
+ const context = {
36
+ entryPointState: this.describePathState(this.packageEntryPointPath),
37
+ npmInvocationMode: this.resolveNpmInvocation([]).mode,
38
+ };
39
+ try {
40
+ if (this.selfUpgradeTestModeEnabled) {
41
+ const result = this.feasibleResult();
42
+ this.logger?.info("npm upgrade feasibility test mode enabled", {
43
+ env: CLI_UPDATE_TEST_MODE_ENV,
44
+ });
45
+ this.trackFeasibility(startedAt, result);
46
+ return result;
47
+ }
48
+ const candidatePaths = this.resolvePackageEntryPointPaths(this.packageEntryPointPath);
49
+ const packageRoots = this.findPackageRoots(candidatePaths);
50
+ context.candidatePathCount = candidatePaths.length;
51
+ context.packageRootCount = packageRoots.length;
52
+ const globalRoot = await this.getGlobalNodeModulesRoot();
53
+ context.globalRootResolved = true;
54
+ const safePackageRoot = packageRoots.find((packageRoot) => this.isInsideDirectory(packageRoot, globalRoot) &&
55
+ !this.isSourceCheckout(packageRoot));
56
+ context.safePackageRootFound = safePackageRoot !== undefined;
57
+ if (safePackageRoot === undefined) {
58
+ this.logger?.warn("npm upgrade feasibility unavailable", {
59
+ ...context,
60
+ reason: CliUpdateFailureReason.SelfUpgradeUnavailable,
61
+ });
62
+ return this.unavailable(startedAt, "PackageInstallSourceUnsupported");
63
+ }
64
+ const result = this.feasibleResult();
65
+ this.trackFeasibility(startedAt, result);
66
+ return result;
67
+ }
68
+ catch (error) {
69
+ const diagnostic = this.describeError(error);
70
+ this.logger?.warn("npm upgrade feasibility lookup failed", {
71
+ ...context,
72
+ ...diagnostic,
73
+ });
74
+ return this.unavailable(startedAt, diagnostic.errorType);
75
+ }
76
+ }
77
+ async upgrade(targetVersion) {
78
+ const startedAt = Date.now();
79
+ try {
80
+ if (this.selfUpgradeTestModeEnabled) {
81
+ await this.delay(this.testUpgradeDelayMs);
82
+ if (this.testUpgradeResult === "failure") {
83
+ const result = {
84
+ ok: false,
85
+ reason: CliUpdateFailureReason.UpgradeFailed,
86
+ guidance: MANUAL_UPDATE_GUIDANCE,
87
+ errorType: "TestModeUpgradeFailure",
88
+ message: "Upgrade test mode simulated failure.",
89
+ };
90
+ this.trackUpgrade(startedAt, targetVersion, result);
91
+ this.logger?.warn("npm package upgrade test mode failed", {
92
+ env: CLI_UPDATE_TEST_UPGRADE_RESULT_ENV,
93
+ targetVersion,
94
+ });
95
+ return result;
96
+ }
97
+ const result = {
98
+ ok: true,
99
+ message: "Upgrade test mode completed. Restart Jumbo to continue testing.",
100
+ };
101
+ this.trackUpgrade(startedAt, targetVersion, result);
102
+ this.logger?.info("npm package upgrade test mode completed", {
103
+ env: CLI_UPDATE_TEST_MODE_ENV,
104
+ targetVersion,
105
+ });
106
+ return result;
107
+ }
108
+ await this.runNpm(["install", "-g", `${CliPackageName}@${targetVersion}`], NPM_UPGRADE_TIMEOUT_MS, NPM_INSTALL_OPERATION);
109
+ const result = {
110
+ ok: true,
111
+ message: "Upgrade completed. Restart Jumbo to use the new version.",
112
+ };
113
+ this.trackUpgrade(startedAt, targetVersion, result);
114
+ this.logger?.info("npm package upgrade completed", { targetVersion });
115
+ return result;
116
+ }
117
+ catch (error) {
118
+ const diagnostic = this.describeError(error);
119
+ const result = {
120
+ ok: false,
121
+ reason: CliUpdateFailureReason.UpgradeFailed,
122
+ guidance: MANUAL_UPDATE_GUIDANCE,
123
+ errorType: diagnostic.errorType,
124
+ message: diagnostic.errorMessage,
125
+ };
126
+ this.trackUpgrade(startedAt, targetVersion, result);
127
+ this.logger?.warn("npm package upgrade failed", {
128
+ targetVersion,
129
+ ...diagnostic,
130
+ });
131
+ return result;
132
+ }
133
+ }
134
+ async getGlobalNodeModulesRoot() {
135
+ const result = await this.runNpm(["root", "-g"], 5000, NPM_ROOT_OPERATION);
136
+ return path.resolve(result.stdout.trim());
137
+ }
138
+ findPackageRoots(candidatePaths) {
139
+ const packageRoots = [];
140
+ for (const candidatePath of candidatePaths) {
141
+ const packageRoot = this.findPackageRootFromCandidate(candidatePath);
142
+ if (packageRoot !== null) {
143
+ packageRoots.push(packageRoot);
144
+ }
145
+ }
146
+ return [...new Set(packageRoots)];
147
+ }
148
+ findPackageRootFromCandidate(candidatePath) {
149
+ if (!fs.existsSync(candidatePath)) {
150
+ return null;
151
+ }
152
+ let current = fs.statSync(candidatePath).isDirectory()
153
+ ? path.resolve(candidatePath)
154
+ : path.dirname(path.resolve(candidatePath));
155
+ while (true) {
156
+ const packageJsonPath = path.join(current, "package.json");
157
+ if (fs.existsSync(packageJsonPath)) {
158
+ try {
159
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
160
+ if (packageJson.name === CliPackageName) {
161
+ return current;
162
+ }
163
+ }
164
+ catch {
165
+ return null;
166
+ }
167
+ }
168
+ const parent = path.dirname(current);
169
+ if (parent === current) {
170
+ return null;
171
+ }
172
+ current = parent;
173
+ }
174
+ }
175
+ resolvePackageEntryPointPaths(startPath) {
176
+ if (startPath.length === 0) {
177
+ return [];
178
+ }
179
+ const absoluteStartPath = path.resolve(startPath);
180
+ const candidatePaths = [absoluteStartPath];
181
+ try {
182
+ const realPath = fs.realpathSync(absoluteStartPath);
183
+ if (realPath !== absoluteStartPath) {
184
+ candidatePaths.push(realPath);
185
+ }
186
+ }
187
+ catch {
188
+ return candidatePaths;
189
+ }
190
+ for (const candidatePath of [...candidatePaths]) {
191
+ const shimTargetPath = this.resolveNpmShimTargetPath(candidatePath);
192
+ if (shimTargetPath !== null) {
193
+ candidatePaths.push(shimTargetPath);
194
+ }
195
+ }
196
+ return [...new Set(candidatePaths)];
197
+ }
198
+ resolveNpmShimTargetPath(shimPath) {
199
+ if (!fs.existsSync(shimPath) || fs.statSync(shimPath).isDirectory()) {
200
+ return null;
201
+ }
202
+ const shimContent = fs.readFileSync(shimPath, "utf-8");
203
+ const packagePathPattern = new RegExp(String.raw `(?<target>[^"'\r\n]*node_modules[\\/]${CliPackageName}[\\/]dist[\\/]cli\.js)`, "i");
204
+ const match = shimContent.match(packagePathPattern);
205
+ const target = match?.groups?.target;
206
+ if (target === undefined) {
207
+ return null;
208
+ }
209
+ const normalizedTarget = target
210
+ .replace(/%~dp0%?[\\/]?/gi, "")
211
+ .replace(/\$basedir[\\/]?/gi, "")
212
+ .replace(/[\\/]/g, path.sep);
213
+ return path.resolve(path.dirname(shimPath), normalizedTarget);
214
+ }
215
+ isInsideDirectory(childPath, parentPath) {
216
+ const relativePath = path.relative(parentPath, childPath);
217
+ return (relativePath.length === 0 ||
218
+ (!relativePath.startsWith("..") && !path.isAbsolute(relativePath)));
219
+ }
220
+ isSourceCheckout(packageRoot) {
221
+ return fs.existsSync(path.join(packageRoot, ".git"));
222
+ }
223
+ unavailable(startedAt, errorType) {
224
+ const result = {
225
+ feasible: false,
226
+ reason: CliUpdateFailureReason.SelfUpgradeUnavailable,
227
+ guidance: MANUAL_UPDATE_GUIDANCE,
228
+ };
229
+ this.trackFeasibility(startedAt, result, errorType);
230
+ return result;
231
+ }
232
+ feasibleResult() {
233
+ return {
234
+ feasible: true,
235
+ command: NPM_COMMAND,
236
+ args: ["install", "-g", `${CliPackageName}@latest`],
237
+ };
238
+ }
239
+ trackFeasibility(startedAt, result, errorType) {
240
+ this.telemetryClient?.track(NPM_FEASIBILITY_LOOKUP_COMPLETED_EVENT, {
241
+ feasible: result.feasible,
242
+ durationMs: Date.now() - startedAt,
243
+ ...(result.feasible ? {} : { reason: result.reason }),
244
+ ...(errorType ? { errorType } : {}),
245
+ });
246
+ }
247
+ trackUpgrade(startedAt, targetVersion, result) {
248
+ this.telemetryClient?.track(NPM_PACKAGE_UPGRADE_COMPLETED_EVENT, {
249
+ targetVersion,
250
+ success: result.ok,
251
+ durationMs: Date.now() - startedAt,
252
+ ...(result.ok
253
+ ? {}
254
+ : {
255
+ reason: result.reason,
256
+ errorType: result.errorType,
257
+ }),
258
+ });
259
+ }
260
+ async runNpm(args, timeout, operation) {
261
+ const invocation = this.resolveNpmInvocation(args);
262
+ try {
263
+ const result = (await execFileAsync(invocation.command, [...invocation.args], { timeout }));
264
+ return this.normalizeExecFileResult(result);
265
+ }
266
+ catch (error) {
267
+ throw this.decorateNpmError(error, operation, invocation);
268
+ }
269
+ }
270
+ resolveNpmInvocation(args) {
271
+ if (this.npmCliPath !== null) {
272
+ return {
273
+ command: process.execPath,
274
+ args: [this.npmCliPath, ...args],
275
+ mode: "node-npm-cli",
276
+ };
277
+ }
278
+ return {
279
+ command: NPM_COMMAND,
280
+ args,
281
+ mode: "path-npm",
282
+ };
283
+ }
284
+ normalizeExecFileResult(result) {
285
+ if (typeof result === "string") {
286
+ return { stdout: result, stderr: "" };
287
+ }
288
+ const output = result;
289
+ return {
290
+ stdout: typeof output.stdout === "string" ? output.stdout : "",
291
+ stderr: typeof output.stderr === "string" ? output.stderr : "",
292
+ };
293
+ }
294
+ decorateNpmError(error, operation, invocation) {
295
+ const decorated = error instanceof Error ? error : new Error(String(error));
296
+ const details = decorated;
297
+ details.operation = operation;
298
+ details.npmInvocationMode = invocation.mode;
299
+ details.npmCommandBasename = path.basename(invocation.command);
300
+ return decorated;
301
+ }
302
+ describeError(error) {
303
+ const shapedError = error;
304
+ return {
305
+ errorType: typeof shapedError.name === "string" && shapedError.name.length > 0
306
+ ? shapedError.name
307
+ : "UnknownError",
308
+ errorMessage: typeof shapedError.message === "string"
309
+ ? shapedError.message
310
+ : String(error),
311
+ ...(typeof shapedError.code === "string"
312
+ ? { errorCode: shapedError.code }
313
+ : {}),
314
+ ...(typeof shapedError.exitCode === "number"
315
+ ? { exitCode: shapedError.exitCode }
316
+ : {}),
317
+ ...(typeof shapedError.signal === "string"
318
+ ? { signal: shapedError.signal }
319
+ : {}),
320
+ ...(typeof shapedError.operation === "string"
321
+ ? { operation: shapedError.operation }
322
+ : {}),
323
+ ...(typeof shapedError.npmInvocationMode === "string"
324
+ ? { npmInvocationMode: shapedError.npmInvocationMode }
325
+ : {}),
326
+ ...(typeof shapedError.npmCommandBasename === "string"
327
+ ? { npmCommand: shapedError.npmCommandBasename }
328
+ : {}),
329
+ ...(typeof shapedError.stdout === "string" && shapedError.stdout.length > 0
330
+ ? { stdoutTail: this.tail(shapedError.stdout) }
331
+ : {}),
332
+ ...(typeof shapedError.stderr === "string" && shapedError.stderr.length > 0
333
+ ? { stderrTail: this.tail(shapedError.stderr) }
334
+ : {}),
335
+ };
336
+ }
337
+ describePathState(targetPath) {
338
+ if (targetPath.length === 0) {
339
+ return "empty";
340
+ }
341
+ if (!fs.existsSync(targetPath)) {
342
+ return "missing";
343
+ }
344
+ return fs.statSync(targetPath).isDirectory() ? "directory" : "file";
345
+ }
346
+ tail(value) {
347
+ return value.slice(-NPM_STDIO_TAIL_LENGTH);
348
+ }
349
+ async delay(delayMs) {
350
+ if (delayMs <= 0) {
351
+ return;
352
+ }
353
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
354
+ }
355
+ static parseTestUpgradeResult(value) {
356
+ return value === "failure" ? "failure" : "success";
357
+ }
358
+ static parseTestUpgradeDelayMs(value) {
359
+ if (value === undefined) {
360
+ return 0;
361
+ }
362
+ const parsedValue = Number.parseInt(value, 10);
363
+ return Number.isFinite(parsedValue) && parsedValue > 0 ? parsedValue : 0;
364
+ }
365
+ static findNpmCliPath() {
366
+ for (const searchPath of (process.env.PATH ?? "").split(path.delimiter)) {
367
+ const candidatePath = path.join(searchPath, ...NPM_CLI_PATH_SEGMENTS);
368
+ if (fs.existsSync(candidatePath)) {
369
+ return candidatePath;
370
+ }
371
+ }
372
+ return null;
373
+ }
374
+ }
375
+ //# sourceMappingURL=NpmPackageUpgradeGateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmPackageUpgradeGateway.js","sourceRoot":"","sources":["../../../../src/infrastructure/cli-metadata/update/NpmPackageUpgradeGateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ILogger } from "../../../application/logging/ILogger.js";
2
+ import type { ITelemetryClient } from "../../../application/telemetry/ITelemetryClient.js";
3
+ import type { CliPackageVersionLookupResult } from "../../../application/cli-metadata/update/CliPackageVersionLookupResult.js";
4
+ import type { ICliPackageVersionGateway } from "../../../application/cli-metadata/update/ICliPackageVersionGateway.js";
5
+ export declare class NpmPackageVersionGateway implements ICliPackageVersionGateway {
6
+ private readonly telemetryClient?;
7
+ private readonly logger?;
8
+ private readonly fetchImplementation;
9
+ private readonly testLatestVersion;
10
+ constructor(telemetryClient?: Pick<ITelemetryClient, "track"> | undefined, logger?: Pick<ILogger, "warn" | "info"> | undefined, fetchImplementation?: typeof fetch, testLatestVersion?: string | null);
11
+ getLatestVersion(packageName: string): Promise<CliPackageVersionLookupResult>;
12
+ private fail;
13
+ private track;
14
+ private resolveErrorType;
15
+ private resolveErrorMessage;
16
+ }
17
+ //# sourceMappingURL=NpmPackageVersionGateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmPackageVersionGateway.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/cli-metadata/update/NpmPackageVersionGateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAE/H,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uEAAuE,CAAC;AAUvH,qBAAa,wBAAyB,YAAW,yBAAyB;IAEtE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAHjB,eAAe,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,YAAA,EACjD,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,YAAA,EACvC,mBAAmB,GAAE,OAAO,KAAa,EACzC,iBAAiB,GAAE,MAAM,GAAG,IACK;IAG9C,gBAAgB,CACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,6BAA6B,CAAC;IAsEzC,OAAO,CAAC,IAAI;IAsBZ,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,mBAAmB;CAY5B"}
@@ -0,0 +1,103 @@
1
+ import { CliUpdateFailureReason } from "../../../application/cli-metadata/update/CliUpdateFailureReason.js";
2
+ import { CLI_UPDATE_TEST_VERSION_ENV, } from "./CliUpdateTestMode.js";
3
+ const NPM_REGISTRY_BASE_URL = "https://registry.npmjs.org";
4
+ const NPM_REGISTRY_TIMEOUT_MS = 3000;
5
+ const NPM_LATEST_VERSION_LOOKUP_COMPLETED_EVENT = "npm_latest_version_lookup_completed";
6
+ export class NpmPackageVersionGateway {
7
+ constructor(telemetryClient, logger, fetchImplementation = fetch, testLatestVersion = process.env[CLI_UPDATE_TEST_VERSION_ENV] ?? null) {
8
+ this.telemetryClient = telemetryClient;
9
+ this.logger = logger;
10
+ this.fetchImplementation = fetchImplementation;
11
+ this.testLatestVersion = testLatestVersion;
12
+ }
13
+ async getLatestVersion(packageName) {
14
+ const startedAt = Date.now();
15
+ if (this.testLatestVersion !== null) {
16
+ const result = {
17
+ ok: true,
18
+ version: this.testLatestVersion,
19
+ };
20
+ this.track(packageName, startedAt, true);
21
+ this.logger?.info("npm latest version override enabled", {
22
+ packageName,
23
+ env: CLI_UPDATE_TEST_VERSION_ENV,
24
+ version: this.testLatestVersion,
25
+ });
26
+ return result;
27
+ }
28
+ const controller = new AbortController();
29
+ const timeout = setTimeout(() => {
30
+ controller.abort();
31
+ }, NPM_REGISTRY_TIMEOUT_MS);
32
+ try {
33
+ const response = await this.fetchImplementation(`${NPM_REGISTRY_BASE_URL}/${encodeURIComponent(packageName)}/latest`, { signal: controller.signal });
34
+ if (!response.ok) {
35
+ return this.fail(packageName, startedAt, CliUpdateFailureReason.RegistryError, "RegistryHttpError", `npm registry returned ${response.status}`);
36
+ }
37
+ const payload = (await response.json());
38
+ if (typeof payload.version !== "string") {
39
+ return this.fail(packageName, startedAt, CliUpdateFailureReason.VersionParseFailure, "RegistryPayloadError", "npm registry latest payload did not contain a string version");
40
+ }
41
+ const result = {
42
+ ok: true,
43
+ version: payload.version,
44
+ };
45
+ this.track(packageName, startedAt, true);
46
+ return result;
47
+ }
48
+ catch (error) {
49
+ const errorType = this.resolveErrorType(error);
50
+ const message = this.resolveErrorMessage(error);
51
+ const reason = errorType === "AbortError"
52
+ ? CliUpdateFailureReason.Offline
53
+ : CliUpdateFailureReason.RegistryError;
54
+ return this.fail(packageName, startedAt, reason, errorType, message);
55
+ }
56
+ finally {
57
+ clearTimeout(timeout);
58
+ }
59
+ }
60
+ fail(packageName, startedAt, reason, errorType, message) {
61
+ this.track(packageName, startedAt, false, reason, errorType);
62
+ this.logger?.warn("npm latest version lookup failed", {
63
+ packageName,
64
+ reason,
65
+ errorType,
66
+ });
67
+ return {
68
+ ok: false,
69
+ reason,
70
+ errorType,
71
+ message,
72
+ };
73
+ }
74
+ track(packageName, startedAt, success, reason, errorType) {
75
+ this.telemetryClient?.track(NPM_LATEST_VERSION_LOOKUP_COMPLETED_EVENT, {
76
+ packageName,
77
+ success,
78
+ durationMs: Date.now() - startedAt,
79
+ ...(reason ? { reason } : {}),
80
+ ...(errorType ? { errorType } : {}),
81
+ });
82
+ }
83
+ resolveErrorType(error) {
84
+ if (typeof error === "object" &&
85
+ error !== null &&
86
+ "name" in error &&
87
+ typeof error.name === "string" &&
88
+ error.name.length > 0) {
89
+ return error.name;
90
+ }
91
+ return "UnknownError";
92
+ }
93
+ resolveErrorMessage(error) {
94
+ if (typeof error === "object" &&
95
+ error !== null &&
96
+ "message" in error &&
97
+ typeof error.message === "string") {
98
+ return error.message;
99
+ }
100
+ return String(error);
101
+ }
102
+ }
103
+ //# sourceMappingURL=NpmPackageVersionGateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmPackageVersionGateway.js","sourceRoot":"","sources":["../../../../src/infrastructure/cli-metadata/update/NpmPackageVersionGateway.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HostBuilder.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/host/HostBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AASxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAijBnF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAE1B;gBAGZ,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,gBAAgB,KAAK,IAAI;IAOvE;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,qBAAqB,CAAC;CAsrD9C"}
1
+ {"version":3,"file":"HostBuilder.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/host/HostBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AASxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAojBnF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAE1B;gBAGZ,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,gBAAgB,KAAK,IAAI;IAOvE;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,qBAAqB,CAAC;CA6rD9C"}
@@ -276,6 +276,9 @@ import { SqliteAudiencePainContextReader } from "../context/audience-pains/query
276
276
  import { SqliteValuePropositionContextReader } from "../context/value-propositions/query/SqliteValuePropositionContextReader.js";
277
277
  // CLI Version Reader
278
278
  import { CliVersionReader } from "../cli-metadata/query/CliVersionReader.js";
279
+ import { CliUpdateController } from "../../application/cli-metadata/update/CliUpdateController.js";
280
+ import { NpmPackageUpgradeGateway } from "../cli-metadata/update/NpmPackageUpgradeGateway.js";
281
+ import { NpmPackageVersionGateway } from "../cli-metadata/update/NpmPackageVersionGateway.js";
279
282
  // Brownfield Status Reader
280
283
  import { SqliteBrownfieldStatusReader } from "../context/sessions/start/SqliteBrownfieldStatusReader.js";
281
284
  // Settings Infrastructure
@@ -595,6 +598,7 @@ export class HostBuilder {
595
598
  ? new PostHogTelemetryClient(telemetryStatus.anonymousId)
596
599
  : new NoOpTelemetryClient();
597
600
  this.registerTelemetryClient?.(telemetryClient);
601
+ const cliUpdateController = new CliUpdateController(new NpmPackageVersionGateway(telemetryClient, logger), new NpmPackageUpgradeGateway(process.argv[1] ?? "", telemetryClient, logger), telemetryClient, logger);
598
602
  // Create worker identity components
599
603
  const hostSessionKeyResolver = new HostSessionKeyResolver();
600
604
  const workerIdentifiedEventStore = new FsWorkerIdentifiedEventStore(this.rootDir, logger);
@@ -1267,6 +1271,7 @@ export class HostBuilder {
1267
1271
  migrateDependenciesCommandHandler,
1268
1272
  // CLI Version
1269
1273
  cliVersionReader,
1274
+ cliUpdateController,
1270
1275
  // Work Category - Session Event Stores - decomposed by use case
1271
1276
  sessionStartedEventStore,
1272
1277
  sessionEndedEventStore,