From 1d1f55b868efccc61d498223301bead40d69b996 Mon Sep 17 00:00:00 2001 From: Keegan Carruthers-Smith Date: Mon, 18 May 2026 10:31:48 +0200 Subject: [PATCH] amp-cli: switch to binaries from npm Amp now ships binaries instead of being an NPM package. We switch to directly downloading those binaries. We use the same postPathelf code path used by the bun derivation since this binary produced by bun. Tested on x86_64-linux and aarch64-darwin. --- pkgs/by-name/am/amp-cli/package-lock.json | 246 ---------------------- pkgs/by-name/am/amp-cli/package.nix | 138 ++++++------ pkgs/by-name/am/amp-cli/update.sh | 23 +- 3 files changed, 91 insertions(+), 316 deletions(-) delete mode 100644 pkgs/by-name/am/amp-cli/package-lock.json diff --git a/pkgs/by-name/am/amp-cli/package-lock.json b/pkgs/by-name/am/amp-cli/package-lock.json deleted file mode 100644 index 6195cb95700c..000000000000 --- a/pkgs/by-name/am/amp-cli/package-lock.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "name": "amp-cli", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@sourcegraph/amp": "^0.0.1778343260-gb9a37d" - } - }, - "node_modules/@napi-rs/keyring": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.1.10.tgz", - "integrity": "sha512-PTMyX7FVZGP4s0LcjgrFonek7Sr9ZTdi0TgpR4/4RQmC2TiDcjpdZOXxRMe2aP+5N89Ix9RG9QWclgqRHLk/Xw==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/keyring-darwin-arm64": "1.1.10", - "@napi-rs/keyring-darwin-x64": "1.1.10", - "@napi-rs/keyring-freebsd-x64": "1.1.10", - "@napi-rs/keyring-linux-arm-gnueabihf": "1.1.10", - "@napi-rs/keyring-linux-arm64-gnu": "1.1.10", - "@napi-rs/keyring-linux-arm64-musl": "1.1.10", - "@napi-rs/keyring-linux-riscv64-gnu": "1.1.10", - "@napi-rs/keyring-linux-x64-gnu": "1.1.10", - "@napi-rs/keyring-linux-x64-musl": "1.1.10", - "@napi-rs/keyring-win32-arm64-msvc": "1.1.10", - "@napi-rs/keyring-win32-ia32-msvc": "1.1.10", - "@napi-rs/keyring-win32-x64-msvc": "1.1.10" - } - }, - "node_modules/@napi-rs/keyring-darwin-arm64": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.1.10.tgz", - "integrity": "sha512-qdXBVypPNgTzso5F/YXWy5dOfFEb9eo43uROMlvwlhj7Aw137iwqwHiqlxR0teFKA33cWnem+ZKeVSIPoobtNA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-darwin-x64": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.1.10.tgz", - "integrity": "sha512-53DgSzhTAJwxR3KCyggHWcLwp+cw2v1zAhBiqNn1P8XwSJSba7HzFwsei6zZMn7bn3UY1ngIHEtaA74UUJVJyw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-freebsd-x64": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.1.10.tgz", - "integrity": "sha512-pI6lect/Dp8NnV+g3w1hmYLt69FbSwKFAHn77vjeUaIT5H9C0ikAgwLk89Sd8/Ei/AHHldGkrLeWkNjnIiHfoQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.1.10.tgz", - "integrity": "sha512-w4psOx5m1ltvNLABT/BpIzP5roVcglR1kDhzZgSEOIIrf2i4FKPQqUIo5UQtjsu+AqhhYwnlnketKDf4h+D06g==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm64-gnu": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.1.10.tgz", - "integrity": "sha512-YMC+ZLj3RldGD2Q5wzlZbc8vTh5Fteln+FpB2lw7EbDib3mmIribNH1NG21E4SwculFRDkVJqYGzwIhafloT8Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-arm64-musl": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.1.10.tgz", - "integrity": "sha512-X/Gr5q2vJW7HMpcWRKj7eXer00a1PYb3zt3xsEG/VbcEo5A973pJANTBhYuoW098O/b7ORkunFt9WSbCgenw2A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-riscv64-gnu": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.1.10.tgz", - "integrity": "sha512-vA3R4NVBlU0TVDHavwr5hSqePSs9OwTzzzFlTbZzqgh9s7OqcSwNT096nbr5dRjuQfG9o4/xvjfvVJ4v5z0Egg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-x64-gnu": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.1.10.tgz", - "integrity": "sha512-qbKE72UeVOrIoiYYHh7joTpDIgQCZpW5OJHG4Ir19GHLdQwNZGKLfFxrTT2DvZ5EXwFJWbOp4Dew4OvvQ0E63g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-linux-x64-musl": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.1.10.tgz", - "integrity": "sha512-niLWyjD/JxQwlOTPeldIx8Xnf03Mp4ooorpWJMWbMuVz/6hSyLVghY/BDYu2Oaxhc+XlTEjmqwhoTWYhmti5eA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-arm64-msvc": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.1.10.tgz", - "integrity": "sha512-VBlqZ0MF5ksc/Z+yxoL2+p6TDu2rqBOcgZ+HwXzSfgFnfnuPds7xOVdFwwaiJbj9CsCrgnByr1jtHRvfEQ6Iiw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-ia32-msvc": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.1.10.tgz", - "integrity": "sha512-0AvwivxgtjdpTCZCFAQUCxFA45DNKXOsdZYXBCIDfPIpUPgLxhIAsg6q7NJK00r1M24StwwfD+AzZDu14J1PKQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/keyring-win32-x64-msvc": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.1.10.tgz", - "integrity": "sha512-T02DfUUvp3epOJ5lC7hcM5ff6xaLhIfymBf0LEa0oQMi+yCVoDrgjeKeGCUGwtVJWfphu58Tf9twX+hRiAD0dg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@sourcegraph/amp": { - "version": "0.0.1778343260-gb9a37d", - "resolved": "https://registry.npmjs.org/@sourcegraph/amp/-/amp-0.0.1778343260-gb9a37d.tgz", - "integrity": "sha512-TY4lL2lqwt+NtBa3ngKZSYfY5Z1qBAOd4UQMCT0nsUKatQGtSOIMec+zQSv6tr0L+z2jrDUzD0cpRkBDkLQjsQ==", - "license": "Amp Commercial License", - "dependencies": { - "@napi-rs/keyring": "1.1.10" - }, - "bin": { - "amp": "dist/main.js" - }, - "engines": { - "node": ">=20" - } - } - } -} diff --git a/pkgs/by-name/am/amp-cli/package.nix b/pkgs/by-name/am/amp-cli/package.nix index 3116d00e392a..1132acdd5c01 100644 --- a/pkgs/by-name/am/amp-cli/package.nix +++ b/pkgs/by-name/am/amp-cli/package.nix @@ -1,90 +1,106 @@ { + stdenvNoCC, lib, - buildNpmPackage, - fetchzip, - ripgrep, + fetchurl, + autoPatchelfHook, + gzip, makeWrapper, - testers, + ripgrep, + versionCheckHook, + writableTmpDirAsHomeHook, + cctools, + darwin, + rcodesign, }: -buildNpmPackage (finalAttrs: { - pname = "amp-cli"; - version = "0.0.1778343260-gb9a37d"; - - src = fetchzip { - url = "https://registry.npmjs.org/@sourcegraph/amp/-/amp-${finalAttrs.version}.tgz"; - hash = "sha256-48FyPDniLNQoeZ+SaheTvzLCYL3r95e9VDCW4Y5gMq8="; +let + platforms = { + # Upstream also publishes linux-x64, which is optimized for AVX2. Use the + # baseline build for nixpkgs so the x86_64-linux package works on all + # supported x86_64 CPUs instead of depending on the build user's CPU flags. + x86_64-linux = "linux-x64-baseline"; + aarch64-linux = "linux-arm64"; + x86_64-darwin = "darwin-x64"; + aarch64-darwin = "darwin-arm64"; }; - postPatch = '' - cp ${./package-lock.json} package-lock.json +in +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "amp-cli"; + version = "0.0.1779094967-g3f6594"; - # Create a minimal package.json with just the dependency we need (without devDependencies) - cat > package.json < bin/amp-wrapper.js << EOF - #!/usr/bin/env node - import('@sourcegraph/amp/dist/main.js') - EOF - chmod +x bin/amp-wrapper.js - ''; - - npmDepsHash = "sha256-Ce7TaJuSrha+NcFmppMm/byAFosBR2I/zMY4KA5JXuE="; - - propagatedBuildInputs = [ - ripgrep - ]; + src = finalAttrs.passthru.sources.${stdenvNoCC.hostPlatform.system}; nativeBuildInputs = [ + gzip makeWrapper - ]; + ] + ++ lib.optionals stdenvNoCC.hostPlatform.isLinux [ autoPatchelfHook ]; + strictDeps = true; - npmFlags = [ - "--no-audit" - "--no-fund" - "--ignore-scripts" - ]; + dontUnpack = true; + dontStrip = true; + dontFixup = !stdenvNoCC.hostPlatform.isLinux; - # Disable build and prune steps - dontNpmBuild = true; + installPhase = '' + runHook preInstall - postInstall = '' - wrapProgram $out/bin/amp \ - --prefix PATH : ${lib.makeBinPath [ ripgrep ]} \ - --set AMP_SKIP_UPDATE_CHECK 1 + mkdir -p $out/bin $out/libexec/amp-cli + gunzip -c $src > $out/libexec/amp-cli/amp + chmod +x $out/libexec/amp-cli/amp + + makeWrapper $out/libexec/amp-cli/amp $out/bin/amp \ + --set AMP_SKIP_UPDATE_CHECK 1 \ + --prefix PATH : ${lib.makeBinPath [ ripgrep ]} + + runHook postInstall ''; - passthru.updateScript = ./update.sh; - passthru.tests.version = testers.testVersion { - package = finalAttrs.finalPackage; - command = "HOME=$(mktemp -d) amp --version"; + postPhases = lib.optionals stdenvNoCC.hostPlatform.isDarwin [ "postPatchelf" ]; + postPatchelf = lib.optionalString stdenvNoCC.hostPlatform.isDarwin '' + '${lib.getExe' cctools "${cctools.targetPrefix}install_name_tool"}' $out/libexec/amp-cli/amp \ + -change /usr/lib/libicucore.A.dylib '${lib.getLib darwin.ICU}/lib/libicucore.A.dylib' + '${lib.getExe rcodesign}' sign --code-signature-flags linker-signed $out/libexec/amp-cli/amp + ''; + + doInstallCheck = stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform; + nativeInstallCheckInputs = [ + writableTmpDirAsHomeHook + versionCheckHook + ]; + versionCheckProgram = "${placeholder "out"}/bin/amp"; + versionCheckProgramArg = "--version"; + versionCheckKeepEnvironment = [ "HOME" ]; + + passthru = { + sources = lib.mapAttrs ( + system': platform: + fetchurl { + url = "https://static.ampcode.com/cli/${finalAttrs.version}/amp-${platform}.gz"; + hash = + { + x86_64-linux = "sha256-ZBqt8UWDY0SlYOOrJZib+UXdZ1cQxyRNp3T7fr+gcNs="; + aarch64-linux = "sha256-qztHMb4EJBOuEQh0OZ33dqx/MUy5LEPgLry6h+rmwVo="; + x86_64-darwin = "sha256-meedgFtc+DA4NoR0XJuLSX/gmiMKCZLACfPBbk6wfLk="; + aarch64-darwin = "sha256-0v3yM9zQ6ToWBHyPvrmPTP0lfPb1tCoAd6eNgHs3ZkM="; + } + .${system'}; + } + ) platforms; + updateScript = ./update.sh; }; meta = { description = "CLI for Amp, an agentic coding agent in research preview from Sourcegraph"; homepage = "https://ampcode.com/"; - downloadPage = "https://www.npmjs.com/package/@sourcegraph/amp"; + downloadPage = "https://ampcode.com/install"; license = lib.licenses.unfree; maintainers = with lib.maintainers; [ keegancsmith burmudar ]; mainProgram = "amp"; + platforms = builtins.attrNames platforms; + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; }; }) diff --git a/pkgs/by-name/am/amp-cli/update.sh b/pkgs/by-name/am/amp-cli/update.sh index 6bc4baf55545..86b348d857a2 100755 --- a/pkgs/by-name/am/amp-cli/update.sh +++ b/pkgs/by-name/am/amp-cli/update.sh @@ -1,15 +1,20 @@ #!/usr/bin/env nix-shell -#!nix-shell -i bash -p nodejs nix-update +#!nix-shell -i bash -p curl common-updater-scripts set -euo pipefail -version=$(npm view @sourcegraph/amp version) +version=$(curl -fsSL https://static.ampcode.com/cli/cli-version.txt) -# Generate updated lock file -cd "$(dirname "${BASH_SOURCE[0]}")" -npm i --package-lock-only @sourcegraph/amp@"$version" -rm -f package.json # package.json is not used by buildNpmPackage +cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." -# Update version and hashes -cd - -nix-update amp-cli --version "$version" +for system in \ + x86_64-linux \ + aarch64-linux \ + x86_64-darwin \ + aarch64-darwin +do + update-source-version amp-cli "$version" \ + --source-key="sources.$system" \ + --ignore-same-version \ + --ignore-same-hash +done