Files
2026-02-20 10:59:57 -03:00

222 lines
7.1 KiB
Nix

{
description = "Kilo development flake";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};
outputs =
{ self, nixpkgs, ... }:
let
systems = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
forEachSystem = f: nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
rev = self.shortRev or self.dirtyShortRev or "dirty";
in
{
devShells = forEachSystem (pkgs: {
default =
let
kilo-dev = pkgs.writeShellScriptBin "kilo-dev" ''
cd "$KILO_ROOT"
exec ${pkgs.bun}/bin/bun dev "$@"
'';
kilo-install-bin = pkgs.writeShellScriptBin "kilo-install" ''
set -euo pipefail
CACHE_DIR="$HOME/.cache/kilo-nix"
VERSION="''${1:-latest}"
# Platform detection
os=$(uname -s | tr '[:upper:]' '[:lower:]')
case "$os" in
darwin) os="darwin" ;;
linux) os="linux" ;;
*) echo "Unsupported OS: $os" >&2; exit 1 ;;
esac
arch=$(uname -m)
case "$arch" in
aarch64) arch="arm64" ;;
x86_64) arch="x64" ;;
*) echo "Unsupported architecture: $arch" >&2; exit 1 ;;
esac
# Rosetta 2 detection on macOS
if [ "$os" = "darwin" ] && [ "$arch" = "x64" ]; then
rosetta_flag=$(sysctl -n sysctl.proc_translated 2>/dev/null || echo 0)
if [ "$rosetta_flag" = "1" ]; then
arch="arm64"
fi
fi
# Musl detection on Linux
is_musl=""
if [ "$os" = "linux" ]; then
if [ -f /etc/alpine-release ] || (command -v ldd >/dev/null 2>&1 && ldd --version 2>&1 | grep -qi musl); then
is_musl="-musl"
fi
fi
# AVX2 detection for baseline builds
needs_baseline=""
if [ "$arch" = "x64" ]; then
if [ "$os" = "linux" ] && ! grep -qi avx2 /proc/cpuinfo 2>/dev/null; then
needs_baseline="-baseline"
elif [ "$os" = "darwin" ]; then
avx2=$(sysctl -n hw.optional.avx2_0 2>/dev/null || echo 0)
if [ "$avx2" != "1" ]; then
needs_baseline="-baseline"
fi
fi
fi
# Determine archive extension
if [ "$os" = "linux" ]; then
ext=".tar.gz"
else
ext=".zip"
fi
# Build filename and URL
target="$os-$arch$needs_baseline$is_musl"
filename="kilo-$target$ext"
if [ "$VERSION" = "latest" ]; then
url="https://github.com/Kilo-Org/kilo/releases/latest/download/$filename"
echo "Installing latest version of kilo..." >&2
else
# Strip leading 'v' if present
VERSION="''${VERSION#v}"
url="https://github.com/Kilo-Org/kilo/releases/download/v''${VERSION}/$filename"
echo "Installing kilo version $VERSION..." >&2
fi
# Create cache directory
mkdir -p "$CACHE_DIR"
# Download to temporary directory
tmp_dir=$(mktemp -d)
trap "rm -rf $tmp_dir" EXIT
echo "Downloading from $url..." >&2
if ! ${pkgs.curl}/bin/curl -fsSL -o "$tmp_dir/$filename" "$url"; then
echo "Error: Failed to download kilo from $url" >&2
echo "Please check your internet connection or visit https://github.com/Kilo-Org/kilo/releases" >&2
exit 1
fi
# Extract the archive
echo "Extracting..." >&2
if [ "$os" = "linux" ]; then
${pkgs.gnutar}/bin/tar -xzf "$tmp_dir/$filename" -C "$tmp_dir"
else
${pkgs.unzip}/bin/unzip -q "$tmp_dir/$filename" -d "$tmp_dir"
fi
# Install the binary
KILO_BIN="$CACHE_DIR/kilo"
mv "$tmp_dir/kilo" "$KILO_BIN"
chmod +x "$KILO_BIN"
# Get the installed version
installed_version=$("$KILO_BIN" --version 2>/dev/null || echo "unknown")
echo "Successfully installed kilo $installed_version to $KILO_BIN" >&2
'';
kilo-bin = pkgs.writeShellScriptBin "kilo" ''
set -euo pipefail
CACHE_DIR="$HOME/.cache/kilo-nix"
KILO_BIN="$CACHE_DIR/kilo"
if [ ! -f "$KILO_BIN" ]; then
echo "Error: kilo is not installed in the cache." >&2
echo "Please run 'kilo-install' first to download and install kilo." >&2
echo "" >&2
echo "Examples:" >&2
echo " kilo-install # Install latest version" >&2
echo " kilo-install 1.0.180 # Install specific version" >&2
exit 1
fi
# Execute the cached binary with all arguments
exec "$KILO_BIN" "$@"
'';
in
pkgs.mkShell {
packages = with pkgs; [
bun
nodejs_20
pkg-config
openssl
git
gh
playwright-driver.browsers
vsce
unzip
gnutar
gzip
ripgrep
kilo-dev
kilo-install-bin
kilo-bin
];
shellHook = ''
export KILO_ROOT="$PWD"
export PLAYWRIGHT_BROWSERS_PATH="${pkgs.playwright-driver.browsers}"
export PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS=true
'';
};
});
overlays = {
default =
final: _prev:
let
node_modules = final.callPackage ./nix/node_modules.nix {
inherit rev;
};
opencode = final.callPackage ./nix/opencode.nix {
inherit node_modules;
};
desktop = final.callPackage ./nix/desktop.nix {
inherit opencode;
};
in
{
inherit opencode;
opencode-desktop = desktop;
};
};
packages = forEachSystem (
pkgs:
let
node_modules = pkgs.callPackage ./nix/node_modules.nix {
inherit rev;
};
kilo = pkgs.callPackage ./nix/kilo.nix {
inherit node_modules;
};
desktop = pkgs.callPackage ./nix/desktop.nix {
inherit kilo;
};
in
{
default = kilo;
inherit kilo desktop;
# Updater derivation with fakeHash - build fails and reveals correct hash
node_modules_updater = node_modules.override {
hash = pkgs.lib.fakeHash;
};
}
);
};
}