openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
44 lines (43 loc) • 1.62 kB
JavaScript
import fs from "node:fs";
import path from "node:path";
import os from "node:os";
//#region src/infra/brew.ts
function isExecutable(filePath) {
try {
fs.accessSync(filePath, fs.constants.X_OK);
return true;
} catch {
return false;
}
}
function resolveBrewFromPath(pathEnv = process.env.PATH) {
for (const dir of (pathEnv ?? "").split(path.delimiter)) {
const trimmed = dir.trim();
if (!trimmed || !path.isAbsolute(trimmed)) continue;
const candidate = path.join(trimmed, "brew");
if (isExecutable(candidate)) return candidate;
}
}
/** Returns standard Homebrew bin directories suitable for PATH augmentation. */
function resolveBrewPathDirs(opts) {
const homeDir = opts?.homeDir ?? os.homedir();
const dirs = [];
dirs.push(path.join(homeDir, ".linuxbrew", "bin"));
dirs.push(path.join(homeDir, ".linuxbrew", "sbin"));
dirs.push("/home/linuxbrew/.linuxbrew/bin", "/home/linuxbrew/.linuxbrew/sbin");
dirs.push("/opt/homebrew/bin", "/usr/local/bin");
return dirs;
}
/** Resolves an executable `brew` path from trusted PATH entries or standard install roots. */
function resolveBrewExecutable(opts) {
const homeDir = opts?.homeDir ?? os.homedir();
const pathBrew = resolveBrewFromPath();
if (pathBrew) return pathBrew;
const candidates = [];
candidates.push(path.join(homeDir, ".linuxbrew", "bin", "brew"));
candidates.push("/home/linuxbrew/.linuxbrew/bin/brew");
candidates.push("/opt/homebrew/bin/brew", "/usr/local/bin/brew");
for (const candidate of candidates) if (isExecutable(candidate)) return candidate;
}
//#endregion
export { resolveBrewPathDirs as n, resolveBrewExecutable as t };