Add opencode package and install via base role
- Add packages/opencode with pre-built binaries from GitHub releases (v1.4.0) - Support all 4 platforms (aarch64-darwin, x86_64-darwin, x86_64-linux, aarch64-linux) - Add update-opencode flake app for automated version bumps - Install opencode via home.roles.base so it's available on all machines - Reformat flake.nix and packages with nixfmt
This commit is contained in:
82
packages/opencode/default.nix
Normal file
82
packages/opencode/default.nix
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
lib,
|
||||
stdenv,
|
||||
fetchzip,
|
||||
patchelf,
|
||||
glibc,
|
||||
}:
|
||||
|
||||
let
|
||||
version = "1.4.0";
|
||||
|
||||
srcs = {
|
||||
aarch64-darwin = {
|
||||
url = "https://github.com/anomalyco/opencode/releases/download/v${version}/opencode-darwin-arm64.zip";
|
||||
sha256 = "0m97j2vln8yhhvnsjl92phx6dac24y7hgh75csmbkbhawkz9xm4l";
|
||||
};
|
||||
x86_64-darwin = {
|
||||
url = "https://github.com/anomalyco/opencode/releases/download/v${version}/opencode-darwin-x64.zip";
|
||||
sha256 = "17n04j06pdc2raxjm91y6p87gwpnra0liabpbjwdmyd1iqgqv0q8";
|
||||
};
|
||||
x86_64-linux = {
|
||||
url = "https://github.com/anomalyco/opencode/releases/download/v${version}/opencode-linux-x64.tar.gz";
|
||||
sha256 = "16117lwfj2lb8wjbq5cyf77vhi52ada5ys3212hjqw3qw3wrcc0r";
|
||||
};
|
||||
aarch64-linux = {
|
||||
url = "https://github.com/anomalyco/opencode/releases/download/v${version}/opencode-linux-arm64.tar.gz";
|
||||
sha256 = "06lvm1qiji74xdd3psqn6lwxak65gqsbmkib1pjb4n65f9246jwm";
|
||||
};
|
||||
};
|
||||
|
||||
src =
|
||||
srcs.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
|
||||
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
pname = "opencode";
|
||||
inherit version;
|
||||
|
||||
src = fetchzip {
|
||||
inherit (src) url sha256;
|
||||
};
|
||||
|
||||
# Bun standalone binaries have JS code appended after the ELF sections
|
||||
# stripping/patching would remove or corrupt this appended data
|
||||
dontStrip = true;
|
||||
dontPatchELF = true;
|
||||
|
||||
nativeBuildInputs = lib.optionals stdenv.isLinux [ patchelf ];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
install -Dm755 $src/opencode $out/bin/opencode
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
# Manually patch the interpreter for bun standalone binaries on Linux
|
||||
postFixup = lib.optionalString stdenv.isLinux ''
|
||||
interpreter="${glibc}/lib/${
|
||||
if stdenv.hostPlatform.system == "aarch64-linux" then
|
||||
"ld-linux-aarch64.so.1"
|
||||
else
|
||||
"ld-linux-x86-64.so.2"
|
||||
}"
|
||||
patchelf --set-interpreter "$interpreter" $out/bin/opencode
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Terminal-based AI coding assistant";
|
||||
homepage = "https://opencode.ai";
|
||||
license = licenses.mit;
|
||||
maintainers = [ ];
|
||||
platforms = [
|
||||
"aarch64-darwin"
|
||||
"x86_64-darwin"
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
];
|
||||
mainProgram = "opencode";
|
||||
};
|
||||
}
|
||||
148
packages/opencode/update.sh
Executable file
148
packages/opencode/update.sh
Executable file
@@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
DRY_RUN=false
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--dry-run|-n)
|
||||
DRY_RUN=true
|
||||
shift
|
||||
;;
|
||||
--help|-h)
|
||||
echo "Usage: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --dry-run, -n Show what would be updated without making changes"
|
||||
echo " --help, -h Show this help message"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
echo "Use --help for usage information"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
|
||||
NIX_FILE="$REPO_ROOT/packages/opencode/default.nix"
|
||||
|
||||
echo "Fetching latest opencode version from GitHub API..."
|
||||
|
||||
RELEASE_INFO=$(curl -fsSL https://api.github.com/repos/anomalyco/opencode/releases/latest)
|
||||
NEW_VERSION=$(echo "$RELEASE_INFO" | jq -r '.tag_name' | sed 's/^v//')
|
||||
|
||||
if [ -z "$NEW_VERSION" ] || [ "$NEW_VERSION" = "null" ]; then
|
||||
echo -e "${RED}Error: Failed to fetch version from GitHub API${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CURRENT_VERSION=$(grep -m1 'version = ' "$NIX_FILE" | sed -E 's/.*version = "([^"]+)".*/\1/')
|
||||
|
||||
if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then
|
||||
echo -e "${GREEN}Already up to date: $CURRENT_VERSION${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Updating from $CURRENT_VERSION to $NEW_VERSION${NC}"
|
||||
|
||||
# Compute SHA256 hashes for each platform
|
||||
# fetchzip hashes the unpacked directory, so we need to extract and hash
|
||||
compute_unpacked_hash() {
|
||||
local url="$1"
|
||||
local ext="$2"
|
||||
local tmpdir=$(mktemp -d)
|
||||
local archive="/tmp/opencode-archive.$ext"
|
||||
|
||||
curl -fsSL "$url" -o "$archive"
|
||||
|
||||
if [ "$ext" = "zip" ]; then
|
||||
(cd "$tmpdir" && unzip -q "$archive")
|
||||
else
|
||||
(cd "$tmpdir" && tar xzf "$archive")
|
||||
fi
|
||||
|
||||
local sri_hash=$(nix hash path "$tmpdir")
|
||||
local nix32_hash=$(nix hash convert --hash-algo sha256 --to nix32 "$sri_hash")
|
||||
|
||||
rm -rf "$tmpdir" "$archive"
|
||||
echo "$nix32_hash"
|
||||
}
|
||||
|
||||
echo "Computing SHA256 hashes (this may take a moment)..."
|
||||
|
||||
SHA_DARWIN_ARM=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-darwin-arm64.zip" "zip")
|
||||
echo " aarch64-darwin: $SHA_DARWIN_ARM"
|
||||
|
||||
SHA_DARWIN_X64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-darwin-x64.zip" "zip")
|
||||
echo " x86_64-darwin: $SHA_DARWIN_X64"
|
||||
|
||||
SHA_LINUX_X64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-linux-x64.tar.gz" "tar.gz")
|
||||
echo " x86_64-linux: $SHA_LINUX_X64"
|
||||
|
||||
SHA_LINUX_ARM64=$(compute_unpacked_hash "https://github.com/anomalyco/opencode/releases/download/v${NEW_VERSION}/opencode-linux-arm64.tar.gz" "tar.gz")
|
||||
echo " aarch64-linux: $SHA_LINUX_ARM64"
|
||||
|
||||
if [ "$DRY_RUN" = true ]; then
|
||||
echo -e "${YELLOW}DRY RUN - No changes will be made${NC}"
|
||||
echo ""
|
||||
echo "Would update:"
|
||||
echo " Version: $CURRENT_VERSION -> $NEW_VERSION"
|
||||
echo " aarch64-darwin SHA: $SHA_DARWIN_ARM"
|
||||
echo " x86_64-darwin SHA: $SHA_DARWIN_X64"
|
||||
echo " x86_64-linux SHA: $SHA_LINUX_X64"
|
||||
echo " aarch64-linux SHA: $SHA_LINUX_ARM64"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Update version
|
||||
sed -i.tmp "s/version = \".*\";/version = \"$NEW_VERSION\";/" "$NIX_FILE"
|
||||
|
||||
# Update SHA256 hashes using awk
|
||||
awk -v sha_arm="$SHA_DARWIN_ARM" -v sha_x64="$SHA_DARWIN_X64" -v sha_linux_x64="$SHA_LINUX_X64" -v sha_linux_arm="$SHA_LINUX_ARM64" '
|
||||
/aarch64-darwin = {/ { in_arm = 1 }
|
||||
/x86_64-darwin = {/ { in_x64 = 1; in_arm = 0 }
|
||||
/x86_64-linux = {/ { in_linux_x64 = 1; in_x64 = 0 }
|
||||
/aarch64-linux = {/ { in_linux_arm = 1; in_linux_x64 = 0 }
|
||||
/};/ {
|
||||
in_arm = 0
|
||||
in_x64 = 0
|
||||
in_linux_x64 = 0
|
||||
in_linux_arm = 0
|
||||
}
|
||||
/sha256 = / {
|
||||
if (in_arm) {
|
||||
sub(/sha256 = ".*";/, "sha256 = \"" sha_arm "\";")
|
||||
} else if (in_x64) {
|
||||
sub(/sha256 = ".*";/, "sha256 = \"" sha_x64 "\";")
|
||||
} else if (in_linux_x64) {
|
||||
sub(/sha256 = ".*";/, "sha256 = \"" sha_linux_x64 "\";")
|
||||
} else if (in_linux_arm) {
|
||||
sub(/sha256 = ".*";/, "sha256 = \"" sha_linux_arm "\";")
|
||||
}
|
||||
}
|
||||
{ print }
|
||||
' "$NIX_FILE" > "$NIX_FILE.new"
|
||||
|
||||
mv "$NIX_FILE.new" "$NIX_FILE"
|
||||
rm -f "$NIX_FILE.tmp"
|
||||
|
||||
echo -e "${GREEN}Successfully updated to version $NEW_VERSION${NC}"
|
||||
echo ""
|
||||
echo "Updated SHA256 hashes:"
|
||||
echo " aarch64-darwin: $SHA_DARWIN_ARM"
|
||||
echo " x86_64-darwin: $SHA_DARWIN_X64"
|
||||
echo " x86_64-linux: $SHA_LINUX_X64"
|
||||
echo " aarch64-linux: $SHA_LINUX_ARM64"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Review changes: git diff $NIX_FILE"
|
||||
echo " 2. Test build: nix build .#custom-opencode"
|
||||
echo " 3. Verify version: ./result/bin/opencode --version"
|
||||
echo " 4. Commit: git add $NIX_FILE && git commit -m 'opencode: Update to version $NEW_VERSION'"
|
||||
Reference in New Issue
Block a user