From 48a8d80e1edbfd15b622dcb35cfb668ebe0777b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 27 Jan 2026 16:09:11 +0100 Subject: [PATCH] feat: update build scripts --- packages/opencode/bin/{opencode => kilo} | 46 +++++------ packages/opencode/script/pack.ts | 67 ++++++++++++++++ packages/opencode/script/postinstall.mjs | 8 +- .../opencode/script/publish-registries.ts | 76 ++++++++++--------- packages/script/src/index.ts | 2 +- 5 files changed, 129 insertions(+), 70 deletions(-) rename packages/opencode/bin/{opencode => kilo} (50%) create mode 100755 packages/opencode/script/pack.ts diff --git a/packages/opencode/bin/opencode b/packages/opencode/bin/kilo similarity index 50% rename from packages/opencode/bin/opencode rename to packages/opencode/bin/kilo index e35cc00944..1c334383f3 100755 --- a/packages/opencode/bin/opencode +++ b/packages/opencode/bin/kilo @@ -4,6 +4,7 @@ const childProcess = require("child_process") const fs = require("fs") const path = require("path") const os = require("os") +const { createRequire } = require("module") function run(target) { const result = childProcess.spawnSync(target, process.argv.slice(2), { @@ -17,14 +18,11 @@ function run(target) { process.exit(code) } -const envPath = process.env.OPENCODE_BIN_PATH +const envPath = process.env.KILO_BIN_PATH if (envPath) { run(envPath) } -const scriptPath = fs.realpathSync(__filename) -const scriptDir = path.dirname(scriptPath) - const platformMap = { darwin: "darwin", linux: "linux", @@ -44,37 +42,27 @@ let arch = archMap[os.arch()] if (!arch) { arch = os.arch() } -const base = "opencode-" + platform + "-" + arch -const binary = platform === "windows" ? "opencode.exe" : "opencode" +const base = "@kilocode/cli-" + platform + "-" + arch +const binary = platform === "windows" ? "kilo.exe" : "kilo" -function findBinary(startDir) { - let current = startDir - for (;;) { - const modules = path.join(current, "node_modules") - if (fs.existsSync(modules)) { - const entries = fs.readdirSync(modules) - for (const entry of entries) { - if (!entry.startsWith(base)) { - continue - } - const candidate = path.join(modules, entry, "bin", binary) - if (fs.existsSync(candidate)) { - return candidate - } - } +function findBinary() { + // Use require.resolve to find the platform-specific package + // This handles scoped packages correctly (e.g., @kilocode/cli-darwin-arm64) + const req = createRequire(__filename) + try { + const pkgPath = req.resolve(base + "/package.json") + const pkgDir = path.dirname(pkgPath) + const candidate = path.join(pkgDir, "bin", binary) + if (fs.existsSync(candidate)) { + return candidate } - const parent = path.dirname(current) - if (parent === current) { - return - } - current = parent - } + } catch {} } -const resolved = findBinary(scriptDir) +const resolved = findBinary() if (!resolved) { console.error( - 'It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing the "' + + 'It seems that your package manager failed to install the right version of the Kilo CLI for your platform. You can try manually installing the "' + base + '" package', ) diff --git a/packages/opencode/script/pack.ts b/packages/opencode/script/pack.ts new file mode 100755 index 0000000000..28016637fa --- /dev/null +++ b/packages/opencode/script/pack.ts @@ -0,0 +1,67 @@ +#!/usr/bin/env bun +import { $ } from "bun" +import pkg from "../package.json" +import { Script } from "@opencode-ai/script" +import { fileURLToPath } from "url" + +const dir = fileURLToPath(new URL("..", import.meta.url)) +process.chdir(dir) + +const { binaries } = await import("./build.ts") +{ + const name = `${pkg.name}-${process.platform}-${process.arch}` + console.log(`smoke test: running dist/${name}/bin/kilo --version`) + await $`./dist/${name}/bin/kilo --version` +} + +await $`mkdir -p ./dist/${pkg.name}` +await $`cp -r ./bin ./dist/${pkg.name}/bin` +await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs` + +await Bun.file(`./dist/${pkg.name}/package.json`).write( + JSON.stringify( + { + name: pkg.name, + bin: { + kilo: `./bin/kilo`, + kilocode: `./bin/kilo`, + }, + scripts: { + postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs", + }, + version: Script.version, + optionalDependencies: binaries, + }, + null, + 2, + ), +) + +const tags = [Script.channel] + +const tasks = Object.entries(binaries).map(async ([name]) => { + if (process.platform !== "win32") { + await $`chmod -R 755 .`.cwd(`./dist/${name}`) + } + await $`bun pm pack --destination ..`.cwd(`./dist/${name}`) +}) +await Promise.all(tasks) +for (const tag of tags) { + await $`cd ./dist/${pkg.name} && bun pm pack --destination ..` +} + +if (!Script.preview) { + // Create archives for GitHub release + for (const key of Object.keys(binaries)) { + if (key.includes("linux")) { + await $`tar -czf ../../${key}.tar.gz *`.cwd(`dist/${key}/bin`) + } else { + await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`) + } + } + + const image = "ghcr.io/anomalyco/opencode" + const platforms = "linux/amd64,linux/arm64" + const tags = [`${image}:${Script.version}`, `${image}:latest`] + const tagFlags = tags.flatMap((t) => ["-t", t]) +} diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs index e8b5e995cc..4444d002f4 100644 --- a/packages/opencode/script/postinstall.mjs +++ b/packages/opencode/script/postinstall.mjs @@ -49,8 +49,8 @@ function detectPlatformAndArch() { function findBinary() { const { platform, arch } = detectPlatformAndArch() - const packageName = `opencode-${platform}-${arch}` - const binaryName = platform === "windows" ? "opencode.exe" : "opencode" + const packageName = `@kilocode/cli-${platform}-${arch}` + const binaryName = platform === "windows" ? "kilo.exe" : "kilo" try { // Use require.resolve to find the package @@ -89,7 +89,7 @@ function symlinkBinary(sourcePath, binaryName) { const { targetPath } = prepareBinDirectory(binaryName) fs.symlinkSync(sourcePath, targetPath) - console.log(`opencode binary symlinked: ${targetPath} -> ${sourcePath}`) + console.log(`kilo binary symlinked: ${targetPath} -> ${sourcePath}`) // Verify the file exists after operation if (!fs.existsSync(targetPath)) { @@ -112,7 +112,7 @@ async function main() { console.log(`Platform binary verified at: ${binaryPath}`) console.log("Wrapper script will handle binary execution") } catch (error) { - console.error("Failed to setup opencode binary:", error.message) + console.error("Failed to setup kilo binary:", error.message) process.exit(1) } } diff --git a/packages/opencode/script/publish-registries.ts b/packages/opencode/script/publish-registries.ts index efcf4f4c6f..e7082dda3c 100644 --- a/packages/opencode/script/publish-registries.ts +++ b/packages/opencode/script/publish-registries.ts @@ -4,10 +4,14 @@ import { Script } from "@opencode-ai/script" if (!Script.preview) { // Calculate SHA values - const arm64Sha = await $`sha256sum ./dist/opencode-linux-arm64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim()) - const x64Sha = await $`sha256sum ./dist/opencode-linux-x64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim()) - const macX64Sha = await $`sha256sum ./dist/opencode-darwin-x64.zip | cut -d' ' -f1`.text().then((x) => x.trim()) - const macArm64Sha = await $`sha256sum ./dist/opencode-darwin-arm64.zip | cut -d' ' -f1`.text().then((x) => x.trim()) + const arm64Sha = await $`sha256sum ./dist/@kilocode/cli-linux-arm64.tar.gz | cut -d' ' -f1` + .text() + .then((x) => x.trim()) + const x64Sha = await $`sha256sum ./dist/@kilocode/cli-linux-x64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim()) + const macX64Sha = await $`sha256sum ./dist/@kilocode/cli-darwin-x64.zip | cut -d' ' -f1`.text().then((x) => x.trim()) + const macArm64Sha = await $`sha256sum ./dist/@kilocode/cli-darwin-arm64.zip | cut -d' ' -f1` + .text() + .then((x) => x.trim()) const [pkgver, _subver = ""] = Script.version.split(/(-.*)/, 2) @@ -16,62 +20,62 @@ if (!Script.preview) { "# Maintainer: dax", "# Maintainer: adam", "", - "pkgname='opencode-bin'", + "pkgname='kilo-bin'", `pkgver=${pkgver}`, `_subver=${_subver}`, "options=('!debug' '!strip')", "pkgrel=1", "pkgdesc='The AI coding agent built for the terminal.'", - "url='https://github.com/anomalyco/opencode'", + "url='https://github.com/Kilo-Org/kilo-cli'", "arch=('aarch64' 'x86_64')", "license=('MIT')", - "provides=('opencode')", - "conflicts=('opencode')", + "provides=('kilo')", + "conflicts=('kilo')", "depends=('ripgrep')", "", - `source_aarch64=("\${pkgname}_\${pkgver}_aarch64.tar.gz::https://github.com/anomalyco/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-arm64.tar.gz")`, + `source_aarch64=("\${pkgname}_\${pkgver}_aarch64.tar.gz::https://github.com/Kilo-Org/kilo-cli/releases/download/v\${pkgver}\${_subver}/kilo-linux-arm64.tar.gz")`, `sha256sums_aarch64=('${arm64Sha}')`, - `source_x86_64=("\${pkgname}_\${pkgver}_x86_64.tar.gz::https://github.com/anomalyco/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-x64.tar.gz")`, + `source_x86_64=("\${pkgname}_\${pkgver}_x86_64.tar.gz::https://github.com/Kilo-Org/kilo-cli/releases/download/v\${pkgver}\${_subver}/kilo-linux-x64.tar.gz")`, `sha256sums_x86_64=('${x64Sha}')`, "", "package() {", - ' install -Dm755 ./opencode "${pkgdir}/usr/bin/opencode"', + ' install -Dm755 ./kilo "${pkgdir}/usr/bin/kilo"', "}", "", ].join("\n") - // Source-based PKGBUILD for opencode + // Source-based PKGBUILD for kilo const sourcePkgbuild = [ "# Maintainer: dax", "# Maintainer: adam", "", - "pkgname='opencode'", + "pkgname='kilo'", `pkgver=${pkgver}`, `_subver=${_subver}`, "options=('!debug' '!strip')", "pkgrel=1", "pkgdesc='The AI coding agent built for the terminal.'", - "url='https://github.com/anomalyco/opencode'", + "url='https://github.com/Kilo-Org/kilo-cli'", "arch=('aarch64' 'x86_64')", "license=('MIT')", - "provides=('opencode')", - "conflicts=('opencode-bin')", + "provides=('kilo')", + "conflicts=('kilo-bin')", "depends=('ripgrep')", "makedepends=('git' 'bun' 'go')", "", - `source=("opencode-\${pkgver}.tar.gz::https://github.com/anomalyco/opencode/archive/v\${pkgver}\${_subver}.tar.gz")`, + `source=("kilo-\${pkgver}.tar.gz::https://github.com/Kilo-Org/kilo-cli/archive/v\${pkgver}\${_subver}.tar.gz")`, `sha256sums=('SKIP')`, "", "build() {", - ` cd "opencode-\${pkgver}"`, + ` cd "kilo-\${pkgver}"`, ` bun install`, - " cd ./packages/opencode", + " cd ./packages/kilo", ` OPENCODE_CHANNEL=latest OPENCODE_VERSION=${pkgver} bun run ./script/build.ts --single`, "}", "", "package() {", - ` cd "opencode-\${pkgver}/packages/opencode"`, + ` cd "kilo-\${pkgver}/packages/kilo"`, ' mkdir -p "${pkgdir}/usr/bin"', ' target_arch="x64"', ' case "$CARCH" in', @@ -94,19 +98,19 @@ if (!Script.preview) { ' base="-baseline"', " fi", " fi", - ' bin="dist/opencode-linux-${target_arch}${base}${libc}/bin/opencode"', + ' bin="dist/@kilocode/cli-linux-${target_arch}${base}${libc}/bin/kilo"', ' if [ ! -f "$bin" ]; then', ' printf "unable to find binary for %s%s%s\\n" "$target_arch" "$base" "$libc" >&2', " return 1", " fi", - ' install -Dm755 "$bin" "${pkgdir}/usr/bin/opencode"', + ' install -Dm755 "$bin" "${pkgdir}/usr/bin/kilo"', "}", "", ].join("\n") for (const [pkg, pkgbuild] of [ - ["opencode-bin", binaryPkgbuild], - ["opencode", sourcePkgbuild], + ["kilo-bin", binaryPkgbuild], + ["kilo", sourcePkgbuild], ]) { for (let i = 0; i < 30; i++) { try { @@ -131,45 +135,45 @@ if (!Script.preview) { "# frozen_string_literal: true", "", "# This file was generated by GoReleaser. DO NOT EDIT.", - "class Opencode < Formula", + "class Kilo < Formula", ` desc "The AI coding agent built for the terminal."`, - ` homepage "https://github.com/anomalyco/opencode"`, + ` homepage "https://github.com/Kilo-Org/kilo-cli"`, ` version "${Script.version.split("-")[0]}"`, "", ` depends_on "ripgrep"`, "", " on_macos do", " if Hardware::CPU.intel?", - ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-darwin-x64.zip"`, + ` url "https://github.com/Kilo-Org/kilo-cli/releases/download/v${Script.version}/kilo-darwin-x64.zip"`, ` sha256 "${macX64Sha}"`, "", " def install", - ' bin.install "opencode"', + ' bin.install "kilo"', " end", " end", " if Hardware::CPU.arm?", - ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-darwin-arm64.zip"`, + ` url "https://github.com/Kilo-Org/kilo-cli/releases/download/v${Script.version}/kilo-darwin-arm64.zip"`, ` sha256 "${macArm64Sha}"`, "", " def install", - ' bin.install "opencode"', + ' bin.install "kilo"', " end", " end", " end", "", " on_linux do", " if Hardware::CPU.intel? and Hardware::CPU.is_64_bit?", - ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-linux-x64.tar.gz"`, + ` url "https://github.com/Kilo-Org/kilo-cli/releases/download/v${Script.version}/kilo-linux-x64.tar.gz"`, ` sha256 "${x64Sha}"`, " def install", - ' bin.install "opencode"', + ' bin.install "kilo"', " end", " end", " if Hardware::CPU.arm? and Hardware::CPU.is_64_bit?", - ` url "https://github.com/anomalyco/opencode/releases/download/v${Script.version}/opencode-linux-arm64.tar.gz"`, + ` url "https://github.com/Kilo-Org/kilo-cli/releases/download/v${Script.version}/kilo-linux-arm64.tar.gz"`, ` sha256 "${arm64Sha}"`, " def install", - ' bin.install "opencode"', + ' bin.install "kilo"', " end", " end", " end", @@ -180,8 +184,8 @@ if (!Script.preview) { await $`rm -rf ./dist/homebrew-tap` await $`git clone https://${process.env["GITHUB_TOKEN"]}@github.com/sst/homebrew-tap.git ./dist/homebrew-tap` - await Bun.file("./dist/homebrew-tap/opencode.rb").write(homebrewFormula) - await $`cd ./dist/homebrew-tap && git add opencode.rb` + await Bun.file("./dist/homebrew-tap/kilo.rb").write(homebrewFormula) + await $`cd ./dist/homebrew-tap && git add kilo.rb` await $`cd ./dist/homebrew-tap && git commit -m "Update to v${Script.version}"` await $`cd ./dist/homebrew-tap && git push` } diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index e722ba5094..63c8d64427 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -32,7 +32,7 @@ const IS_PREVIEW = CHANNEL !== "latest" const VERSION = await (async () => { if (env.OPENCODE_VERSION) return env.OPENCODE_VERSION if (IS_PREVIEW) return `0.0.0-${CHANNEL}-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}` - const version = await fetch("https://registry.npmjs.org/opencode-ai/latest") + const version = await fetch("https://registry.npmjs.org/@kilocode/cli/latest") .then((res) => { if (!res.ok) throw new Error(res.statusText) return res.json()