81 lines
2.1 KiB
JavaScript
Executable File
81 lines
2.1 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
// bin/oh-my-opencode.js
|
|
// Wrapper script that detects platform and spawns the correct binary
|
|
|
|
import { spawnSync } from "node:child_process";
|
|
import { createRequire } from "node:module";
|
|
import { getPlatformPackage, getBinaryPath } from "./platform.js";
|
|
|
|
const require = createRequire(import.meta.url);
|
|
|
|
/**
|
|
* Detect libc family on Linux
|
|
* @returns {string | null} 'glibc', 'musl', or null if detection fails
|
|
*/
|
|
function getLibcFamily() {
|
|
if (process.platform !== "linux") {
|
|
return undefined; // Not needed on non-Linux
|
|
}
|
|
|
|
try {
|
|
const detectLibc = require("detect-libc");
|
|
return detectLibc.familySync();
|
|
} catch {
|
|
// detect-libc not available
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
const { platform, arch } = process;
|
|
const libcFamily = getLibcFamily();
|
|
|
|
// Get platform package name
|
|
let pkg;
|
|
try {
|
|
pkg = getPlatformPackage({ platform, arch, libcFamily });
|
|
} catch (error) {
|
|
console.error(`\noh-my-opencode: ${error.message}\n`);
|
|
process.exit(1);
|
|
}
|
|
|
|
// Resolve binary path
|
|
const binRelPath = getBinaryPath(pkg, platform);
|
|
|
|
let binPath;
|
|
try {
|
|
binPath = require.resolve(binRelPath);
|
|
} catch {
|
|
console.error(`\noh-my-opencode: Platform binary not installed.`);
|
|
console.error(`\nYour platform: ${platform}-${arch}${libcFamily === "musl" ? "-musl" : ""}`);
|
|
console.error(`Expected package: ${pkg}`);
|
|
console.error(`\nTo fix, run:`);
|
|
console.error(` npm install ${pkg}\n`);
|
|
process.exit(1);
|
|
}
|
|
|
|
// Spawn the binary
|
|
const result = spawnSync(binPath, process.argv.slice(2), {
|
|
stdio: "inherit",
|
|
});
|
|
|
|
// Handle spawn errors
|
|
if (result.error) {
|
|
console.error(`\noh-my-opencode: Failed to execute binary.`);
|
|
console.error(`Error: ${result.error.message}\n`);
|
|
process.exit(2);
|
|
}
|
|
|
|
// Handle signals
|
|
if (result.signal) {
|
|
const signalNum = result.signal === "SIGTERM" ? 15 :
|
|
result.signal === "SIGKILL" ? 9 :
|
|
result.signal === "SIGINT" ? 2 : 1;
|
|
process.exit(128 + signalNum);
|
|
}
|
|
|
|
process.exit(result.status ?? 1);
|
|
}
|
|
|
|
main();
|