From ae21a8df854773b58693280bbc150b1b55e70b38 Mon Sep 17 00:00:00 2001 From: Lidang-Jiang Date: Sat, 28 Mar 2026 11:28:12 +0800 Subject: [PATCH] fix(scripts): add os.homedir() fallback for Windows compatibility On Windows (native cmd/PowerShell), process.env.HOME is undefined. Seven CLI entry points and two library files pass process.env.HOME directly as homeDir without a cross-platform fallback, causing all path resolutions to silently fail (resolving to "undefined/.claude/..."). Node.js os.homedir() correctly handles all platforms (HOME on Unix, USERPROFILE on Windows, OS-level fallback). The project already uses this pattern in scripts/lib/state-store/index.js and has a getHomeDir() utility in scripts/lib/utils.js, but it was not applied consistently. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Lidang-Jiang --- scripts/doctor.js | 3 ++- scripts/install-apply.js | 3 ++- scripts/lib/install-executor.js | 3 ++- scripts/lib/install-lifecycle.js | 7 ++++--- scripts/list-installed.js | 3 ++- scripts/repair.js | 3 ++- scripts/sessions-cli.js | 3 ++- scripts/status.js | 3 ++- scripts/uninstall.js | 3 ++- 9 files changed, 20 insertions(+), 11 deletions(-) diff --git a/scripts/doctor.js b/scripts/doctor.js index 0da3ff74..4341315d 100644 --- a/scripts/doctor.js +++ b/scripts/doctor.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +const os = require('os'); const { buildDoctorReport } = require('./lib/install-lifecycle'); const { SUPPORTED_INSTALL_TARGETS } = require('./lib/install-manifests'); @@ -88,7 +89,7 @@ function main() { const report = buildDoctorReport({ repoRoot: require('path').join(__dirname, '..'), - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), projectRoot: process.cwd(), targets: options.targets, }); diff --git a/scripts/install-apply.js b/scripts/install-apply.js index 593cf58d..6eda0845 100644 --- a/scripts/install-apply.js +++ b/scripts/install-apply.js @@ -6,6 +6,7 @@ * target-specific mutation logic into testable Node code. */ +const os = require('os'); const { SUPPORTED_INSTALL_TARGETS, listLegacyCompatibilityLanguages, @@ -118,7 +119,7 @@ function main() { }); const plan = createInstallPlanFromRequest(request, { projectRoot: process.cwd(), - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), claudeRulesDir: process.env.CLAUDE_RULES_DIR || null, }); diff --git a/scripts/lib/install-executor.js b/scripts/lib/install-executor.js index 63be3844..7ad7a408 100644 --- a/scripts/lib/install-executor.js +++ b/scripts/lib/install-executor.js @@ -1,4 +1,5 @@ const fs = require('fs'); +const os = require('os'); const path = require('path'); const { execFileSync } = require('child_process'); @@ -442,7 +443,7 @@ function planAntigravityLegacyInstall(context) { function createLegacyInstallPlan(options = {}) { const sourceRoot = options.sourceRoot || getSourceRoot(); const projectRoot = options.projectRoot || process.cwd(); - const homeDir = options.homeDir || process.env.HOME; + const homeDir = options.homeDir || process.env.HOME || os.homedir(); const target = options.target || 'claude'; validateLegacyTarget(target); diff --git a/scripts/lib/install-lifecycle.js b/scripts/lib/install-lifecycle.js index a8f04f1b..4cdfffd4 100644 --- a/scripts/lib/install-lifecycle.js +++ b/scripts/lib/install-lifecycle.js @@ -1,4 +1,5 @@ const fs = require('fs'); +const os = require('os'); const path = require('path'); const { resolveInstallPlan, loadInstallManifests } = require('./install-manifests'); @@ -696,7 +697,7 @@ function buildDiscoveryRecord(adapter, context) { function discoverInstalledStates(options = {}) { const context = { - homeDir: options.homeDir || process.env.HOME, + homeDir: options.homeDir || process.env.HOME || os.homedir(), projectRoot: options.projectRoot || process.cwd(), }; const targets = normalizeTargets(options.targets); @@ -904,7 +905,7 @@ function buildDoctorReport(options = {}) { }).filter(record => record.exists); const context = { repoRoot, - homeDir: options.homeDir || process.env.HOME, + homeDir: options.homeDir || process.env.HOME || os.homedir(), projectRoot: options.projectRoot || process.cwd(), manifestVersion: manifests.modulesVersion, packageVersion: readPackageVersion(repoRoot), @@ -988,7 +989,7 @@ function repairInstalledStates(options = {}) { const manifests = loadInstallManifests({ repoRoot }); const context = { repoRoot, - homeDir: options.homeDir || process.env.HOME, + homeDir: options.homeDir || process.env.HOME || os.homedir(), projectRoot: options.projectRoot || process.cwd(), manifestVersion: manifests.modulesVersion, packageVersion: readPackageVersion(repoRoot), diff --git a/scripts/list-installed.js b/scripts/list-installed.js index 4803f965..a3f070bf 100644 --- a/scripts/list-installed.js +++ b/scripts/list-installed.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +const os = require('os'); const { discoverInstalledStates } = require('./lib/install-lifecycle'); const { SUPPORTED_INSTALL_TARGETS } = require('./lib/install-manifests'); @@ -70,7 +71,7 @@ function main() { } const records = discoverInstalledStates({ - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), projectRoot: process.cwd(), targets: options.targets, }).filter(record => record.exists); diff --git a/scripts/repair.js b/scripts/repair.js index 382cfa4d..74055b52 100644 --- a/scripts/repair.js +++ b/scripts/repair.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +const os = require('os'); const { repairInstalledStates } = require('./lib/install-lifecycle'); const { SUPPORTED_INSTALL_TARGETS } = require('./lib/install-manifests'); @@ -74,7 +75,7 @@ function main() { const result = repairInstalledStates({ repoRoot: require('path').join(__dirname, '..'), - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), projectRoot: process.cwd(), targets: options.targets, dryRun: options.dryRun, diff --git a/scripts/sessions-cli.js b/scripts/sessions-cli.js index 436796f5..173e68d4 100644 --- a/scripts/sessions-cli.js +++ b/scripts/sessions-cli.js @@ -1,6 +1,7 @@ #!/usr/bin/env node 'use strict'; +const os = require('os'); const { createStateStore } = require('./lib/state-store'); function showHelp(exitCode = 0) { @@ -134,7 +135,7 @@ async function main() { store = await createStateStore({ dbPath: options.dbPath, - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), }); if (!options.sessionId) { diff --git a/scripts/status.js b/scripts/status.js index 2e5349df..13d86ef3 100644 --- a/scripts/status.js +++ b/scripts/status.js @@ -1,6 +1,7 @@ #!/usr/bin/env node 'use strict'; +const os = require('os'); const { createStateStore } = require('./lib/state-store'); function showHelp(exitCode = 0) { @@ -139,7 +140,7 @@ async function main() { store = await createStateStore({ dbPath: options.dbPath, - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), }); const payload = { diff --git a/scripts/uninstall.js b/scripts/uninstall.js index 6456c406..c9bdc859 100644 --- a/scripts/uninstall.js +++ b/scripts/uninstall.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +const os = require('os'); const { uninstallInstalledStates } = require('./lib/install-lifecycle'); const { SUPPORTED_INSTALL_TARGETS } = require('./lib/install-manifests'); @@ -73,7 +74,7 @@ function main() { } const result = uninstallInstalledStates({ - homeDir: process.env.HOME, + homeDir: process.env.HOME || os.homedir(), projectRoot: process.cwd(), targets: options.targets, dryRun: options.dryRun,