opencode.nix 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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_DISABLE_MODELS_FETCH = true;
  33. env.OPENCODE_VERSION = finalAttrs.version;
  34. env.OPENCODE_CHANNEL = "local";
  35. buildPhase = ''
  36. runHook preBuild
  37. cd ./packages/opencode
  38. bun --bun ./script/build.ts --single --skip-install
  39. bun --bun ./script/schema.ts schema.json
  40. runHook postBuild
  41. '';
  42. installPhase = ''
  43. runHook preInstall
  44. install -Dm755 dist/opencode-*/bin/opencode $out/bin/opencode
  45. install -Dm644 schema.json $out/share/opencode/schema.json
  46. wrapProgram $out/bin/opencode \
  47. --prefix PATH : ${
  48. lib.makeBinPath (
  49. [
  50. ripgrep
  51. ]
  52. # bun runs sysctl to detect if dunning on rosetta2
  53. ++ lib.optional stdenvNoCC.hostPlatform.isDarwin sysctl
  54. )
  55. }
  56. runHook postInstall
  57. '';
  58. postInstall = lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) ''
  59. # trick yargs into also generating zsh completions
  60. installShellCompletion --cmd opencode \
  61. --bash <($out/bin/opencode completion) \
  62. --zsh <(SHELL=/bin/zsh $out/bin/opencode completion)
  63. '';
  64. nativeInstallCheckInputs = [
  65. versionCheckHook
  66. writableTmpDirAsHomeHook
  67. ];
  68. doInstallCheck = true;
  69. versionCheckKeepEnvironment = [ "HOME" "OPENCODE_DISABLE_MODELS_FETCH" ];
  70. versionCheckProgramArg = "--version";
  71. passthru = {
  72. jsonschema = "${placeholder "out"}/share/opencode/schema.json";
  73. };
  74. meta = {
  75. description = "The open source coding agent";
  76. homepage = "https://opencode.ai/";
  77. license = lib.licenses.mit;
  78. mainProgram = "opencode";
  79. inherit (node_modules.meta) platforms;
  80. };
  81. })