| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #!/usr/bin/env node
- import fs from "fs"
- import path from "path"
- import os from "os"
- import childProcess from "child_process"
- import { fileURLToPath } from "url"
- import { createRequire } from "module"
- const __dirname = path.dirname(fileURLToPath(import.meta.url))
- const require = createRequire(import.meta.url)
- // kilocode_change start - variant detection matching bin/kilo logic
- const platformMap = {
- darwin: "darwin",
- linux: "linux",
- win32: "windows",
- }
- const archMap = {
- x64: "x64",
- arm64: "arm64",
- arm: "arm",
- }
- function detectPlatformAndArch() {
- const platform = platformMap[os.platform()] || os.platform()
- const arch = archMap[os.arch()] || os.arch()
- return { platform, arch }
- }
- function supportsAvx2() {
- const { platform, arch } = detectPlatformAndArch()
- if (arch !== "x64") return false
- if (platform === "linux") {
- try {
- return /(^|\s)avx2(\s|$)/i.test(fs.readFileSync("/proc/cpuinfo", "utf8"))
- } catch {
- return false
- }
- }
- if (platform === "darwin") {
- try {
- const result = childProcess.spawnSync("sysctl", ["-n", "hw.optional.avx2_0"], {
- encoding: "utf8",
- timeout: 1500,
- })
- if (result.status !== 0) return false
- return (result.stdout || "").trim() === "1"
- } catch {
- return false
- }
- }
- return false
- }
- function isMusl() {
- try {
- if (fs.existsSync("/etc/alpine-release")) return true
- } catch {
- // ignore
- }
- try {
- const result = childProcess.spawnSync("ldd", ["--version"], { encoding: "utf8" })
- const text = ((result.stdout || "") + (result.stderr || "")).toLowerCase()
- if (text.includes("musl")) return true
- } catch {
- // ignore
- }
- return false
- }
- function getPackageNames() {
- const { platform, arch } = detectPlatformAndArch()
- const base = `@kilocode/cli-${platform}-${arch}`
- const avx2 = supportsAvx2()
- const baseline = arch === "x64" && !avx2
- if (platform === "linux") {
- const musl = isMusl()
- if (musl) {
- if (arch === "x64") {
- if (baseline) return [`${base}-baseline-musl`, `${base}-musl`, `${base}-baseline`, base]
- return [`${base}-musl`, `${base}-baseline-musl`, base, `${base}-baseline`]
- }
- return [`${base}-musl`, base]
- }
- if (arch === "x64") {
- if (baseline) return [`${base}-baseline`, base, `${base}-baseline-musl`, `${base}-musl`]
- return [base, `${base}-baseline`, `${base}-musl`, `${base}-baseline-musl`]
- }
- return [base, `${base}-musl`]
- }
- if (arch === "x64") {
- if (baseline) return [`${base}-baseline`, base]
- return [base, `${base}-baseline`]
- }
- return [base]
- }
- function findBinary() {
- const { platform } = detectPlatformAndArch()
- const binaryName = platform === "windows" ? "kilo.exe" : "kilo"
- const names = getPackageNames()
- for (const packageName of names) {
- try {
- const packageJsonPath = require.resolve(`${packageName}/package.json`)
- const packageDir = path.dirname(packageJsonPath)
- const binaryPath = path.join(packageDir, "bin", binaryName)
- if (fs.existsSync(binaryPath)) {
- return { binaryPath, binaryName }
- }
- } catch {
- // package not installed, try next variant
- }
- }
- throw new Error(`Could not find any binary package. Tried: ${names.map((n) => `"${n}"`).join(", ")}`)
- }
- // kilocode_change end
- function main() {
- if (os.platform() === "win32") {
- // On Windows, the .exe is already included in the package and bin field points to it
- console.log("Windows detected: binary setup not needed (using packaged .exe)")
- return
- }
- const { binaryPath } = findBinary()
- const target = path.join(__dirname, "bin", ".kilo") // kilocode_change
- if (fs.existsSync(target)) fs.unlinkSync(target)
- try {
- fs.linkSync(binaryPath, target)
- } catch {
- fs.copyFileSync(binaryPath, target)
- }
- fs.chmodSync(target, 0o755)
- }
- try {
- main()
- } catch (error) {
- console.error("Failed to setup kilo binary:", error.message)
- process.exit(1)
- }
|