@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.
- package/README.md +110 -399
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/install/cli.d.ts +1 -0
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +326 -86
- package/dist/install/cli.js.map +1 -1
- package/dist/install/install-helper.d.ts +15 -6
- package/dist/install/install-helper.d.ts.map +1 -1
- package/dist/install/install-helper.js +41 -22
- package/dist/install/install-helper.js.map +1 -1
- package/dist/install/json-utils.d.ts +4 -0
- package/dist/install/json-utils.d.ts.map +1 -0
- package/dist/install/json-utils.js +88 -0
- package/dist/install/json-utils.js.map +1 -0
- package/dist/install/migrate.d.ts.map +1 -1
- package/dist/install/migrate.js +57 -1
- package/dist/install/migrate.js.map +1 -1
- package/dist/install/platform.d.ts +21 -0
- package/dist/install/platform.d.ts.map +1 -0
- package/dist/install/platform.js +95 -0
- package/dist/install/platform.js.map +1 -0
- package/dist/install/setup-wizard.d.ts.map +1 -1
- package/dist/install/setup-wizard.js +118 -43
- package/dist/install/setup-wizard.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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":"
|
|
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"}
|
package/dist/install/migrate.js
CHANGED
|
@@ -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":"AAAA,OAAO,
|
|
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":"
|
|
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"}
|