opencode.nix 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. {
  2. lib,
  3. stdenvNoCC,
  4. callPackage,
  5. bun,
  6. sysctl,
  7. makeBinaryWrapper,
  8. models-dev,
  9. ripgrep,
  10. installShellFiles,
  11. versionCheckHook,
  12. writableTmpDirAsHomeHook,
  13. node_modules ? callPackage ./node-modules.nix { },
  14. }:
  15. stdenvNoCC.mkDerivation (finalAttrs: {
  16. pname = "opencode";
  17. inherit (node_modules) version src;
  18. inherit node_modules;
  19. nativeBuildInputs = [
  20. bun
  21. installShellFiles
  22. makeBinaryWrapper
  23. models-dev
  24. writableTmpDirAsHomeHook
  25. ];
  26. configurePhase = ''
  27. runHook preConfigure
  28. cp -R ${finalAttrs.node_modules}/. .
  29. runHook postConfigure
  30. '';
  31. env.MODELS_DEV_API_JSON = "${models-dev}/dist/_api.json";
  32. env.OPENCODE_VERSION = finalAttrs.version;
  33. env.OPENCODE_CHANNEL = "local";
  34. buildPhase = ''
  35. runHook preBuild
  36. cd ./packages/opencode
  37. bun --bun ./script/build.ts --single --skip-install
  38. bun --bun ./script/schema.ts schema.json
  39. runHook postBuild
  40. '';
  41. installPhase = ''
  42. runHook preInstall
  43. install -Dm755 dist/opencode-*/bin/opencode $out/bin/opencode
  44. install -Dm644 schema.json $out/share/opencode/schema.json
  45. wrapProgram $out/bin/opencode \
  46. --prefix PATH : ${
  47. lib.makeBinPath (
  48. [
  49. ripgrep
  50. ]
  51. # bun runs sysctl to detect if dunning on rosetta2
  52. ++ lib.optional stdenvNoCC.hostPlatform.isDarwin sysctl
  53. )
  54. }
  55. runHook postInstall
  56. '';
  57. postInstall = lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) ''
  58. # trick yargs into also generating zsh completions
  59. installShellCompletion --cmd opencode \
  60. --bash <($out/bin/opencode completion) \
  61. --zsh <(SHELL=/bin/zsh $out/bin/opencode completion)
  62. '';
  63. nativeInstallCheckInputs = [
  64. versionCheckHook
  65. writableTmpDirAsHomeHook
  66. ];
  67. doInstallCheck = true;
  68. versionCheckKeepEnvironment = [ "HOME" ];
  69. versionCheckProgramArg = "--version";
  70. passthru = {
  71. jsonschema = "${placeholder "out"}/share/opencode/schema.json";
  72. };
  73. meta = {
  74. description = "The open source coding agent";
  75. homepage = "https://opencode.ai/";
  76. license = lib.licenses.mit;
  77. mainProgram = "opencode";
  78. inherit (node_modules.meta) platforms;
  79. };
  80. })