@newrelic/preflight 1.0.2 → 1.0.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.
@@ -22,22 +22,39 @@ const NR_HOOK_RE = /preflight-collector"?\s+(?:pre|post)-tool/;
22
22
  // ---------------------------------------------------------------------------
23
23
  // Generators
24
24
  // ---------------------------------------------------------------------------
25
- export function generateHookEntries(binPath) {
26
- // Quote the path so shells with sh -c don't split on spaces (e.g. /Users/John Doe/...).
27
- // Hook commands use preflight-collector (lightweight, <5ms budget).
28
- const bin = binPath
29
- ? `"${join(dirname(binPath), COLLECTOR_COMMAND).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
30
- : COLLECTOR_COMMAND;
25
+ export function generateHookEntries(binPath, options) {
26
+ let pre;
27
+ let post;
28
+ if (options?.platform === 'wsl-windows-cc') {
29
+ // Windows Claude Code runs hooks via wsl.exe — call the WSL binary through interop.
30
+ // Quote the path so cmd.exe doesn't split on spaces (e.g. /home/john doe/...).
31
+ const collectorPath = binPath ? join(dirname(binPath), COLLECTOR_COMMAND) : COLLECTOR_COMMAND;
32
+ const quotedPath = collectorPath.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
33
+ pre = `wsl.exe -e "${quotedPath}" pre-tool`;
34
+ post = `wsl.exe -e "${quotedPath}" post-tool`;
35
+ }
36
+ else {
37
+ // Quote the path so shells with sh -c don't split on spaces (e.g. /Users/John Doe/...).
38
+ // Hook commands use preflight-collector (lightweight, <5ms budget).
39
+ const bin = binPath
40
+ ? `"${join(dirname(binPath), COLLECTOR_COMMAND).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
41
+ : COLLECTOR_COMMAND;
42
+ pre = `${bin} pre-tool`;
43
+ post = `${bin} post-tool`;
44
+ }
31
45
  return {
32
- PreToolUse: [
33
- { matcher: HOOK_MATCHER, hooks: [{ type: 'command', command: `${bin} pre-tool` }] },
34
- ],
35
- PostToolUse: [
36
- { matcher: HOOK_MATCHER, hooks: [{ type: 'command', command: `${bin} post-tool` }] },
37
- ],
46
+ PreToolUse: [{ matcher: HOOK_MATCHER, hooks: [{ type: 'command', command: pre }] }],
47
+ PostToolUse: [{ matcher: HOOK_MATCHER, hooks: [{ type: 'command', command: post }] }],
38
48
  };
39
49
  }
40
- export function generateMcpServerEntry(binPath) {
50
+ export function generateMcpServerEntry(binPath, options) {
51
+ if (options?.platform === 'wsl-windows-cc') {
52
+ // Windows Claude Code launches MCP servers as Windows processes — use wsl.exe interop.
53
+ const serverPath = binPath ? join(dirname(binPath), MCP_SERVER_COMMAND) : MCP_SERVER_COMMAND;
54
+ return {
55
+ [MCP_SERVER_KEY]: { command: 'wsl.exe', args: ['-e', serverPath, '--stdio'] },
56
+ };
57
+ }
41
58
  // MCP server uses the main preflight binary.
42
59
  const command = binPath ? join(dirname(binPath), MCP_SERVER_COMMAND) : MCP_SERVER_COMMAND;
43
60
  return {
@@ -50,15 +67,17 @@ export function generateNrConfig(licenseKey, accountId) {
50
67
  // ---------------------------------------------------------------------------
51
68
  // Settings path detection
52
69
  // ---------------------------------------------------------------------------
53
- export function detectSettingsPath(scope) {
70
+ export function detectSettingsPath(scope, windowsHome) {
54
71
  if (scope === 'user') {
55
- return resolve(homedir(), '.claude', 'settings.json');
72
+ const base = windowsHome ?? homedir();
73
+ return resolve(base, '.claude', 'settings.json');
56
74
  }
57
75
  return resolve(process.cwd(), '.claude', 'settings.json');
58
76
  }
59
- export function detectMcpConfigPath(scope) {
77
+ export function detectMcpConfigPath(scope, windowsHome) {
60
78
  if (scope === 'user') {
61
- return resolve(homedir(), '.mcp.json');
79
+ const base = windowsHome ?? homedir();
80
+ return resolve(base, '.mcp.json');
62
81
  }
63
82
  return resolve(process.cwd(), '.mcp.json');
64
83
  }
@@ -109,13 +128,13 @@ const McpConfigSchema = z
109
128
  // ---------------------------------------------------------------------------
110
129
  // mergeSettings
111
130
  // ---------------------------------------------------------------------------
112
- export function mergeSettings(existing, binPath) {
131
+ export function mergeSettings(existing, binPath, options) {
113
132
  const parsed = SettingsSchema.safeParse(existing);
114
133
  if (!parsed.success) {
115
134
  throw new Error(`Existing settings file has unexpected shape — fix manually before running install.\n${parsed.error.message}`);
116
135
  }
117
136
  const result = { ...existing };
118
- const hookEntries = generateHookEntries(binPath);
137
+ const hookEntries = generateHookEntries(binPath, options);
119
138
  // --- Hooks ---
120
139
  const hooks = typeof result.hooks === 'object' && result.hooks !== null
121
140
  ? { ...result.hooks }
@@ -143,7 +162,7 @@ export function mergeSettings(existing, binPath) {
143
162
  // ---------------------------------------------------------------------------
144
163
  // mergeMcpConfig — operates on ~/.mcp.json (separate from settings.json)
145
164
  // ---------------------------------------------------------------------------
146
- export function mergeMcpConfig(existing, binPath) {
165
+ export function mergeMcpConfig(existing, binPath, options) {
147
166
  const parsed = McpConfigSchema.safeParse(existing);
148
167
  if (!parsed.success) {
149
168
  throw new Error(`Existing MCP config file has unexpected shape — fix manually before running install.\n${parsed.error.message}`);
@@ -160,7 +179,7 @@ export function mergeMcpConfig(existing, binPath) {
160
179
  if (binPath !== null && binPath !== undefined) {
161
180
  // Resolved path available: merge new command/args into existing entry,
162
181
  // preserving any user-added fields (env, timeout, etc.).
163
- const newEntry = generateMcpServerEntry(binPath);
182
+ const newEntry = generateMcpServerEntry(binPath, options);
164
183
  const existingEntry = typeof mcpServers[MCP_SERVER_KEY] === 'object' && mcpServers[MCP_SERVER_KEY] !== null
165
184
  ? mcpServers[MCP_SERVER_KEY]
166
185
  : {};
@@ -169,7 +188,7 @@ export function mergeMcpConfig(existing, binPath) {
169
188
  else if (!(MCP_SERVER_KEY in mcpServers)) {
170
189
  // No path resolved: only add if absent so a working absolute-path entry
171
190
  // is not downgraded to a bare name.
172
- mcpServers[MCP_SERVER_KEY] = generateMcpServerEntry(null)[MCP_SERVER_KEY];
191
+ mcpServers[MCP_SERVER_KEY] = generateMcpServerEntry(null, options)[MCP_SERVER_KEY];
173
192
  }
174
193
  result.mcpServers = mcpServers;
175
194
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"install-helper.js","sourceRoot":"","sources":["../../src/install/install-helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-helper.js","sourceRoot":"","sources":["../../src/install/install-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function readJsonFile(path: string): Record<string, unknown>;
2
+ export declare function readJsonFileStrict(path: string): Record<string, unknown>;
3
+ export declare function writeJsonFile(path: string, data: Record<string, unknown>, additionalAllowedBase?: string): void;
4
+ //# sourceMappingURL=json-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-utils.d.ts","sourceRoot":"","sources":["../../src/install/json-utils.ts"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMlE;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAcxE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,qBAAqB,CAAC,EAAE,MAAM,GAC7B,IAAI,CAsDN"}
@@ -0,0 +1,88 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync, unlinkSync, realpathSync, } from 'node:fs';
2
+ import { basename, dirname, resolve, sep } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ export function readJsonFile(path) {
5
+ try {
6
+ return JSON.parse(readFileSync(path, 'utf-8'));
7
+ }
8
+ catch {
9
+ return {};
10
+ }
11
+ }
12
+ // Like readJsonFile but throws on IO errors (EBUSY, EPERM, etc.) and on
13
+ // malformed or non-object JSON rather than returning {}. Returns {} only for
14
+ // ENOENT (file absent). Use when the file is known to exist and its contents
15
+ // must be preserved.
16
+ export function readJsonFileStrict(path) {
17
+ try {
18
+ const val = JSON.parse(readFileSync(path, 'utf-8'));
19
+ if (val !== null && typeof val === 'object' && !Array.isArray(val)) {
20
+ return val;
21
+ }
22
+ throw new SyntaxError(`Expected a JSON object but got ${Array.isArray(val) ? 'array' : typeof val}`);
23
+ }
24
+ catch (err) {
25
+ if (err instanceof SyntaxError)
26
+ throw err;
27
+ if (err.code === 'ENOENT')
28
+ return {};
29
+ throw err;
30
+ }
31
+ }
32
+ export function writeJsonFile(path, data, additionalAllowedBase) {
33
+ const dir = dirname(path);
34
+ if (!existsSync(dir)) {
35
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
36
+ }
37
+ // Symlink guard: verify both the resolved parent directory AND the resolved
38
+ // target file path are under HOME, cwd, or an explicitly allowed base (e.g.
39
+ // the Windows home path under /mnt/c/... when writing from WSL).
40
+ const resolvedDir = realpathSync(dir);
41
+ const resolvedPath = existsSync(path) ? realpathSync(path) : resolve(resolvedDir, basename(path));
42
+ const home = homedir();
43
+ const cwd = process.cwd();
44
+ // Resolve additionalAllowedBase so symlinked storage directories (e.g. ~/.newrelic-preflight
45
+ // → /data/shared/preflight) are correctly matched against the resolved target path.
46
+ const resolvedAllowedBase = additionalAllowedBase !== undefined
47
+ ? (() => {
48
+ try {
49
+ return realpathSync(additionalAllowedBase);
50
+ }
51
+ catch (err) {
52
+ // ENOENT: path doesn't exist yet (created by mkdirSync above on first write).
53
+ // All other errors (EACCES, EPERM) propagate — a permission failure here
54
+ // means the resolved base is unknown, which would defeat the symlink guard.
55
+ if (err.code === 'ENOENT')
56
+ return additionalAllowedBase;
57
+ throw err;
58
+ }
59
+ })()
60
+ : undefined;
61
+ const check = (p) => p === home ||
62
+ p.startsWith(home + sep) ||
63
+ p === cwd ||
64
+ p.startsWith(cwd + sep) ||
65
+ (resolvedAllowedBase !== undefined &&
66
+ (p === resolvedAllowedBase || p.startsWith(resolvedAllowedBase + sep)));
67
+ if (!check(resolvedDir) || !check(resolvedPath)) {
68
+ throw new Error(`Refusing to write outside HOME or project root: ${resolvedPath}`);
69
+ }
70
+ const tmp = path + '.tmp';
71
+ try {
72
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
73
+ renameSync(tmp, path);
74
+ }
75
+ catch (err) {
76
+ // Best-effort cleanup of the temp file — suppress secondary errors so the
77
+ // original write/rename error is what propagates to the caller.
78
+ try {
79
+ if (existsSync(tmp))
80
+ unlinkSync(tmp);
81
+ }
82
+ catch {
83
+ /* best-effort */
84
+ }
85
+ throw err;
86
+ }
87
+ }
88
+ //# sourceMappingURL=json-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/install/json-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,UAAQ,GAAG,IAAI,CAgG5D"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"AAkFA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,UAAQ,GAAG,IAAI,CAkG5D"}
@@ -1,7 +1,62 @@
1
- import { existsSync, renameSync, cpSync, rmSync, readSync, openSync, closeSync } from 'node:fs';
1
+ import { existsSync, renameSync, cpSync, rmSync, readSync, openSync, closeSync, readFileSync, unlinkSync, } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { resolve } from 'node:path';
4
4
  import { DEFAULT_STORAGE_PATH } from '../config.js';
5
+ import { readJsonFileStrict, writeJsonFile } from './json-utils.js';
6
+ function migrateWslMarker() {
7
+ const markerPath = resolve(DEFAULT_STORAGE_PATH, '.wsl-mode');
8
+ if (!existsSync(markerPath))
9
+ return;
10
+ try {
11
+ const raw = readFileSync(markerPath, 'utf8').trim();
12
+ const platform = raw === 'windows' ? 'wsl-windows-cc' : raw === 'linux' ? 'wsl-linux-cc' : null;
13
+ if (platform !== null) {
14
+ const configPath = resolve(DEFAULT_STORAGE_PATH, 'config.json');
15
+ // Use strict read: if config.json is malformed or unreadable (EBUSY, EPERM),
16
+ // throw so the outer catch skips the write and leaves credentials intact.
17
+ // ENOENT (file absent) still returns {} — safe to write a fresh config.
18
+ const existing = readJsonFileStrict(configPath);
19
+ // Skip the write if config.json already has a WSL platformTarget set by a
20
+ // ≥1.0.4 install on this machine — that value reflects a deliberate WSL
21
+ // mode choice and must not be overwritten by a stale marker.
22
+ // 'native' is intentionally excluded: it can arrive via cross-machine
23
+ // config copy (e.g. macOS → WSL) and must not suppress a real WSL marker.
24
+ // Typed constants: TypeScript will error here if these drift from PlatformTarget.
25
+ const wslWindowsCc = 'wsl-windows-cc';
26
+ const wslLinuxCc = 'wsl-linux-cc';
27
+ const alreadyMigrated = existing.platformTarget === wslWindowsCc || existing.platformTarget === wslLinuxCc;
28
+ if (!alreadyMigrated) {
29
+ // Pass DEFAULT_STORAGE_PATH as the allowed base so the symlink guard accepts
30
+ // writes when the storage directory is symlinked outside HOME.
31
+ writeJsonFile(configPath, { ...existing, platformTarget: platform }, DEFAULT_STORAGE_PATH);
32
+ }
33
+ // Delete marker after the rename is committed (or skipped). Wrapped in its own
34
+ // catch so a failure here (e.g. WSL1 DrvFs read-only file attribute on .wsl-mode)
35
+ // is handled inline rather than propagating to the outer catch — which would
36
+ // exit the function without deleting the marker on the current call, but would
37
+ // not cause re-migration loops because config.json is already correct.
38
+ try {
39
+ unlinkSync(markerPath);
40
+ }
41
+ catch {
42
+ /* re-migration on next startup is idempotent */
43
+ }
44
+ }
45
+ else {
46
+ // Unrecognized marker content — cannot migrate, but deleting it prevents this
47
+ // function from re-running on every startup (existsSync would fire each time).
48
+ try {
49
+ unlinkSync(markerPath);
50
+ }
51
+ catch {
52
+ /* WSL1 DrvFs read-only attribute — re-run on next startup is harmless */
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Non-fatal: next install falls back to filesystem detection.
58
+ }
59
+ }
5
60
  function promptYesNo(question) {
6
61
  process.stderr.write(question);
7
62
  // Open /dev/tty directly — Node.js sets fd 0 to O_NONBLOCK on TTY startup,
@@ -27,6 +82,7 @@ function promptYesNo(question) {
27
82
  * (server startup, update) print a notice instead.
28
83
  */
29
84
  export function migrateStoragePath(interactive = false) {
85
+ migrateWslMarker();
30
86
  const oldPath = resolve(homedir(), '.nr-ai-observe');
31
87
  const newPath = DEFAULT_STORAGE_PATH;
32
88
  if (!existsSync(oldPath))
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/install/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Platform detection utilities for install scripts.
3
+ *
4
+ * These functions detect the runtime environment (native Linux, WSL, macOS,
5
+ * Windows) and resolve cross-environment paths needed to configure
6
+ * Windows-hosted tools (like Claude Code for Windows) from within a WSL shell.
7
+ */
8
+ /**
9
+ * Returns true when the current process is running inside a WSL
10
+ * (Windows Subsystem for Linux) environment.
11
+ */
12
+ export declare function isWsl(): boolean;
13
+ /**
14
+ * When running inside WSL, attempts to resolve the Windows user home directory
15
+ * as a WSL-accessible path (e.g. `/mnt/c/Users/alice`).
16
+ *
17
+ * Returns null if not in WSL, Windows home cannot be determined, or the result
18
+ * cannot be expressed as a valid `/mnt/<drive>/...` path.
19
+ */
20
+ export declare function resolveWindowsHome(): string | null;
21
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/install/platform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;GAGG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAU/B;AAwBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAqClD"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Platform detection utilities for install scripts.
3
+ *
4
+ * These functions detect the runtime environment (native Linux, WSL, macOS,
5
+ * Windows) and resolve cross-environment paths needed to configure
6
+ * Windows-hosted tools (like Claude Code for Windows) from within a WSL shell.
7
+ */
8
+ import { readFileSync } from 'node:fs';
9
+ import { execFileSync } from 'node:child_process';
10
+ /**
11
+ * Returns true when the current process is running inside a WSL
12
+ * (Windows Subsystem for Linux) environment.
13
+ */
14
+ export function isWsl() {
15
+ // WSL_DISTRO_NAME is always set in WSL (e.g. "Ubuntu", "Debian").
16
+ if (process.env.WSL_DISTRO_NAME)
17
+ return true;
18
+ // Fallback: /proc/version contains "microsoft" on WSL 1 and 2.
19
+ try {
20
+ const version = readFileSync('/proc/version', 'utf-8');
21
+ return /microsoft/i.test(version);
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /**
28
+ * Converts a Windows-style path (e.g. `C:\Users\alice`) to its WSL mount
29
+ * equivalent (e.g. `/mnt/c/Users/alice`).
30
+ *
31
+ * Returns null if the input doesn't match a Windows absolute path.
32
+ */
33
+ function parseWindowsPath(winPath) {
34
+ // Matches "C:\Users\alice" or "C:/Users/alice": drive letter, colon, then
35
+ // a mandatory path separator (backslash or forward slash), then the rest.
36
+ // The separator is consumed so the rest never starts with a slash.
37
+ const match = winPath.match(/^([A-Za-z]):[/\\](.+)/);
38
+ if (!match)
39
+ return null;
40
+ const drive = match[1].toLowerCase();
41
+ // Normalise the rest: convert backslashes, strip any leading or trailing slashes.
42
+ // A leading slash can appear when the drive separator in the input is doubled
43
+ // (e.g. HOMEDRIVE='C:\' + HOMEPATH='\Users\alice' → 'C:\\Users\alice' → match[2]
44
+ // starts with '\'), which would otherwise produce '/mnt/c//Users/alice' and break
45
+ // the raw-string startsWith check in the writeJsonFile symlink guard.
46
+ const rest = match[2].replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/+$/, '');
47
+ return `/mnt/${drive}/${rest}`;
48
+ }
49
+ /**
50
+ * When running inside WSL, attempts to resolve the Windows user home directory
51
+ * as a WSL-accessible path (e.g. `/mnt/c/Users/alice`).
52
+ *
53
+ * Returns null if not in WSL, Windows home cannot be determined, or the result
54
+ * cannot be expressed as a valid `/mnt/<drive>/...` path.
55
+ */
56
+ export function resolveWindowsHome() {
57
+ // USERPROFILE is passed through from Windows by default in WSL
58
+ // (e.g. C:\Users\alice).
59
+ const userProfile = process.env.USERPROFILE?.trim();
60
+ if (userProfile) {
61
+ const wslPath = parseWindowsPath(userProfile);
62
+ if (wslPath)
63
+ return wslPath;
64
+ }
65
+ // HOMEDRIVE + HOMEPATH is an older but reliable fallback (e.g. C: + \Users\alice).
66
+ // Insert a separator when HOMEPATH lacks a leading backslash (non-standard but possible)
67
+ // so C: + Users\alice becomes C:\Users\alice rather than the unparseable C:Users\alice.
68
+ const homeDrive = process.env.HOMEDRIVE?.trim();
69
+ const homePath = process.env.HOMEPATH?.trim();
70
+ if (homeDrive && homePath) {
71
+ const sep = homePath.startsWith('/') || homePath.startsWith('\\') ? '' : '\\';
72
+ const wslPath = parseWindowsPath(homeDrive + sep + homePath);
73
+ if (wslPath)
74
+ return wslPath;
75
+ }
76
+ // Last resort: ask cmd.exe (requires WSL interop to be enabled).
77
+ // Pass the full command as one string after /c so cmd.exe expands %USERPROFILE%
78
+ // as part of its own command-line processing (splitting into tokens first would
79
+ // deliver it as a literal argument to echo and suppress expansion).
80
+ try {
81
+ const raw = execFileSync('cmd.exe', ['/c', 'echo %USERPROFILE%'], {
82
+ encoding: 'utf-8',
83
+ stdio: 'pipe',
84
+ timeout: 1000,
85
+ }).trim();
86
+ const wslPath = parseWindowsPath(raw);
87
+ if (wslPath)
88
+ return wslPath;
89
+ }
90
+ catch {
91
+ // WSL interop disabled or cmd.exe not available — fall through.
92
+ }
93
+ return null;
94
+ }
95
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/install/platform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,KAAK;IACnB,kEAAkE;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC7C,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,0EAA0E;IAC1E,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,kFAAkF;IAClF,8EAA8E;IAC9E,iFAAiF;IACjF,kFAAkF;IAClF,sEAAsE;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,+DAA+D;IAC/D,yBAAyB;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAED,mFAAmF;IACnF,yFAAyF;IACzF,wFAAwF;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC;QAC7D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAED,iEAAiE;IACjE,gFAAgF;IAChF,gFAAgF;IAChF,oEAAoE;IACpE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE;YAChE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../../src/install/setup-wizard.ts"],"names":[],"mappings":"AAuBA,UAAU,YAAY;IACpB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAwBD,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,4BAA4B,GACjC,2BAA2B,CA6B7B;AA2CD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE;IACN,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAWD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAocpD"}
1
+ {"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../../src/install/setup-wizard.ts"],"names":[],"mappings":"AAqBA,UAAU,YAAY;IACpB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAkBD,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,4BAA4B,GACjC,2BAA2B,CA6B7B;AA2CD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE;IACN,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAWD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmhBpD"}