opencode.nix 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. {
  2. lib,
  3. stdenvNoCC,
  4. bun,
  5. sysctl,
  6. makeBinaryWrapper,
  7. models-dev,
  8. ripgrep,
  9. installShellFiles,
  10. versionCheckHook,
  11. writableTmpDirAsHomeHook,
  12. rev ? "dirty",
  13. }:
  14. let
  15. packageJson = lib.pipe ../packages/opencode/package.json [
  16. builtins.readFile
  17. builtins.fromJSON
  18. ];
  19. in
  20. stdenvNoCC.mkDerivation (finalAttrs: {
  21. pname = "opencode";
  22. version = "${packageJson.version}-${rev}";
  23. src = lib.fileset.toSource {
  24. root = ../.;
  25. fileset = lib.fileset.intersection (lib.fileset.fromSource (lib.sources.cleanSource ../.)) (
  26. lib.fileset.unions [
  27. ../packages
  28. ../bun.lock
  29. ../package.json
  30. ../patches
  31. ../install
  32. ]
  33. );
  34. };
  35. node_modules = stdenvNoCC.mkDerivation {
  36. pname = "${finalAttrs.pname}-node_modules";
  37. inherit (finalAttrs) version src;
  38. impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [
  39. "GIT_PROXY_COMMAND"
  40. "SOCKS_SERVER"
  41. ];
  42. nativeBuildInputs = [
  43. bun
  44. ];
  45. dontConfigure = true;
  46. buildPhase = ''
  47. runHook preBuild
  48. export HOME=$(mktemp -d)
  49. export BUN_INSTALL_CACHE_DIR=$(mktemp -d)
  50. bun install \
  51. --cpu="${if stdenvNoCC.hostPlatform.isAarch64 then "arm64" else "x64"}" \
  52. --os="${if stdenvNoCC.hostPlatform.isLinux then "linux" else "darwin"}" \
  53. --frozen-lockfile \
  54. --ignore-scripts \
  55. --no-progress \
  56. --linker=isolated
  57. bun --bun ${./scripts/canonicalize-node-modules.ts}
  58. bun --bun ${./scripts/normalize-bun-binaries.ts}
  59. runHook postBuild
  60. '';
  61. installPhase = ''
  62. runHook preInstall
  63. mkdir -p $out
  64. find . -type d -name node_modules -exec cp -R --parents {} $out \;
  65. runHook postInstall
  66. '';
  67. dontFixup = true;
  68. outputHashAlgo = "sha256";
  69. outputHashMode = "recursive";
  70. outputHash =
  71. (lib.pipe ./hashes.json [
  72. builtins.readFile
  73. builtins.fromJSON
  74. ]).nodeModules.${stdenvNoCC.hostPlatform.system};
  75. };
  76. nativeBuildInputs = [
  77. bun
  78. installShellFiles
  79. makeBinaryWrapper
  80. models-dev
  81. writableTmpDirAsHomeHook
  82. ];
  83. configurePhase = ''
  84. runHook preConfigure
  85. cp -R ${finalAttrs.node_modules}/. .
  86. runHook postConfigure
  87. '';
  88. env.MODELS_DEV_API_JSON = "${models-dev}/dist/_api.json";
  89. env.OPENCODE_VERSION = finalAttrs.version;
  90. env.OPENCODE_CHANNEL = "local";
  91. buildPhase = ''
  92. runHook preBuild
  93. cd ./packages/opencode
  94. bun --bun ./script/build.ts --single --skip-install
  95. bun --bun ./script/schema.ts schema.json
  96. runHook postBuild
  97. '';
  98. installPhase = ''
  99. runHook preInstall
  100. install -Dm755 dist/opencode-*/bin/opencode $out/bin/opencode
  101. install -Dm644 schema.json $out/share/opencode/schema.json
  102. wrapProgram $out/bin/opencode \
  103. --prefix PATH : ${
  104. lib.makeBinPath (
  105. [
  106. ripgrep
  107. ]
  108. # bun runs sysctl to detect if dunning on rosetta2
  109. ++ lib.optional stdenvNoCC.hostPlatform.isDarwin sysctl
  110. )
  111. }
  112. runHook postInstall
  113. '';
  114. postInstall = lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) ''
  115. # trick yargs into also generating zsh completions
  116. installShellCompletion --cmd opencode \
  117. --bash <($out/bin/opencode completion) \
  118. --zsh <(SHELL=/bin/zsh $out/bin/opencode completion)
  119. '';
  120. nativeInstallCheckInputs = [
  121. versionCheckHook
  122. writableTmpDirAsHomeHook
  123. ];
  124. doInstallCheck = true;
  125. versionCheckKeepEnvironment = [ "HOME" ];
  126. versionCheckProgramArg = "--version";
  127. passthru = {
  128. jsonschema = "${placeholder "out"}/share/opencode/schema.json";
  129. };
  130. meta = {
  131. description = "The open source coding agent";
  132. homepage = "https://opencode.ai/";
  133. license = lib.licenses.mit;
  134. mainProgram = "opencode";
  135. platforms = [
  136. "aarch64-linux"
  137. "x86_64-linux"
  138. "aarch64-darwin"
  139. "x86_64-darwin"
  140. ];
  141. };
  142. })