diff --git a/overlays/default.nix b/overlays/default.nix index de9cfa4a..45dcf619 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -5,4 +5,7 @@ # Fix Daisydisk ahead of upstream (import ./daisydisk.nix) + + # Override opencode ahead of nixpkgs pin + (import ./opencode.nix) ] diff --git a/overlays/opencode.nix b/overlays/opencode.nix new file mode 100644 index 00000000..7c3b3426 --- /dev/null +++ b/overlays/opencode.nix @@ -0,0 +1,3 @@ +final: prev: { + opencode = final.callPackage ../packages/opencode/package.nix {}; +} diff --git a/packages/opencode/package.nix b/packages/opencode/package.nix new file mode 100644 index 00000000..15873c4c --- /dev/null +++ b/packages/opencode/package.nix @@ -0,0 +1,190 @@ +{ + lib, + stdenvNoCC, + bun, + fetchFromGitHub, + makeBinaryWrapper, + models-dev, + nodejs, + nix-update-script, + ripgrep, + sysctl, + installShellFiles, + versionCheckHook, + writableTmpDirAsHomeHook, +}: +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "opencode"; + version = "1.3.10"; + + src = fetchFromGitHub { + owner = "anomalyco"; + repo = "opencode"; + tag = "v${finalAttrs.version}"; + hash = "sha256-/pVesY9fyfeAheT1gMvoVCaO9GlRHQB0H4HIB56pwnE="; + }; + + node_modules = stdenvNoCC.mkDerivation { + pname = "${finalAttrs.pname}-node_modules"; + inherit (finalAttrs) version src; + + impureEnvVars = + lib.fetchers.proxyImpureEnvVars + ++ [ + "GIT_PROXY_COMMAND" + "SOCKS_SERVER" + ]; + + nativeBuildInputs = [ + bun + writableTmpDirAsHomeHook + ]; + + dontConfigure = true; + + buildPhase = '' + runHook preBuild + + bun install \ + --cpu="*" \ + --frozen-lockfile \ + --filter ./packages/app \ + --filter ./packages/desktop \ + --filter ./packages/opencode \ + --ignore-scripts \ + --no-progress \ + --os="*" + + bun --bun ./nix/scripts/canonicalize-node-modules.ts + bun --bun ./nix/scripts/normalize-bun-binaries.ts + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out + find . -type d -name node_modules -exec cp -R --parents {} $out \; + + runHook postInstall + ''; + + # NOTE: Required else we get errors that our fixed-output derivation references store paths + dontFixup = true; + + outputHash = "sha256-Q7eyK6GNYE5dBYooDHbIQSkfe4fs6L7tzCfbsIlYY7o="; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + }; + + nativeBuildInputs = [ + bun + nodejs + installShellFiles + makeBinaryWrapper + models-dev + writableTmpDirAsHomeHook + ]; + + postPatch = '' + # NOTE: Relax Bun version check to be a warning instead of an error + substituteInPlace packages/script/src/index.ts \ + --replace-fail 'throw new Error(`This script requires bun@''${expectedBunVersionRange}' \ + 'console.warn(`Warning: This script requires bun@''${expectedBunVersionRange}' + ''; + + configurePhase = '' + runHook preConfigure + + cp -R ${finalAttrs.node_modules}/. . + patchShebangs node_modules + patchShebangs packages/*/node_modules + + runHook postConfigure + ''; + + env.MODELS_DEV_API_JSON = "${models-dev}/dist/_api.json"; + env.OPENCODE_VERSION = finalAttrs.version; + env.OPENCODE_CHANNEL = "stable"; + + buildPhase = '' + runHook preBuild + + cd ./packages/opencode + bun --bun ./script/build.ts --single --skip-install + bun --bun ./script/schema.ts schema.json + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -Dm755 dist/opencode-*/bin/opencode $out/bin/opencode + wrapProgram $out/bin/opencode \ + --prefix PATH : ${ + lib.makeBinPath ( + [ + ripgrep + ] + ++ lib.optionals stdenvNoCC.hostPlatform.isDarwin [ + sysctl + ] + ) + } + + install -Dm644 schema.json $out/share/opencode/schema.json + + runHook postInstall + ''; + + postInstall = lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) '' + installShellCompletion --cmd opencode \ + --bash <($out/bin/opencode completion) \ + --zsh <(SHELL=/bin/zsh $out/bin/opencode completion) + ''; + + nativeInstallCheckInputs = [ + versionCheckHook + writableTmpDirAsHomeHook + ]; + doInstallCheck = true; + versionCheckKeepEnvironment = ["HOME"]; + versionCheckProgramArg = "--version"; + + passthru = { + jsonschema = "${placeholder "out"}/share/opencode/schema.json"; + updateScript = nix-update-script { + extraArgs = [ + "--subpackage" + "node_modules" + ]; + }; + }; + + meta = { + description = "AI coding agent built for the terminal"; + homepage = "https://github.com/anomalyco/opencode"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ + delafthi + DuskyElf + graham33 + superherointj + ]; + sourceProvenance = with lib.sourceTypes; [fromSource]; + platforms = [ + "aarch64-linux" + "x86_64-linux" + "aarch64-darwin" + "x86_64-darwin" + ]; + mainProgram = "opencode"; + badPlatforms = [ + # Broken as 2026-04-23, errors as: + # CPU lacks AVX support, strange crashes may occur. Reinstall Bun + "x86_64-darwin" + ]; + }; +})