flake.nix

  1{
  2  description = "Vibe - Sandboxed OpenCode runner with firejail isolation";
  3
  4  inputs = {
  5    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  6    flake-utils.url = "github:numtide/flake-utils";
  7  };
  8
  9  outputs = { self, nixpkgs, flake-utils }:
 10    flake-utils.lib.eachDefaultSystem (system:
 11      let
 12        pkgs = nixpkgs.legacyPackages.${system};
 13        
 14        # jail package - wraps jail.sh
 15        # NOTE: Requires system-installed firejail and opencode
 16        jail = pkgs.stdenvNoCC.mkDerivation {
 17          pname = "jail";
 18          version = "0.1.0";
 19          
 20          src = ./.;
 21          
 22          nativeBuildInputs = [ pkgs.makeWrapper ];
 23          
 24          installPhase = ''
 25            runHook preInstall
 26            
 27            mkdir -p $out/bin
 28            cp jail.sh $out/bin/jail
 29            chmod +x $out/bin/jail
 30            
 31            # Wrap jail to ensure git, coreutils, and which are in PATH
 32            # firejail and opencode must be installed system-wide
 33            wrapProgram $out/bin/jail \
 34              --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.git pkgs.coreutils pkgs.which ]}
 35            
 36            runHook postInstall
 37          '';
 38          
 39          meta = with pkgs.lib; {
 40            description = "Run OpenCode in a sandboxed firejail environment (requires system firejail and opencode)";
 41            homepage = "https://kilimanjaro.io/vibe";
 42            license = licenses.mit;
 43            platforms = platforms.linux;
 44          };
 45        };
 46        
 47        # vibe package - wraps jail opencode
 48        # NOTE: Requires system-installed firejail and opencode
 49        vibe = pkgs.stdenvNoCC.mkDerivation {
 50          pname = "vibe";
 51          version = "0.1.0";
 52          
 53          src = ./.;
 54          
 55          nativeBuildInputs = [ pkgs.makeWrapper ];
 56          
 57          buildInputs = [ jail ];
 58          
 59          installPhase = ''
 60            runHook preInstall
 61            
 62            mkdir -p $out/bin
 63            cp vibe.sh $out/bin/vibe
 64            chmod +x $out/bin/vibe
 65            
 66            # Wrap vibe to ensure jail is in PATH
 67            # firejail and opencode must be installed system-wide
 68            wrapProgram $out/bin/vibe \
 69              --prefix PATH : ${pkgs.lib.makeBinPath [ jail ]}
 70            
 71            runHook postInstall
 72          '';
 73          
 74          meta = with pkgs.lib; {
 75            description = "Run OpenCode in a sandboxed environment with optional session token (requires system firejail and opencode)";
 76            homepage = "https://kilimanjaro.io/vibe";
 77            license = licenses.mit;
 78            platforms = platforms.linux;
 79          };
 80        };
 81        
 82      in {
 83        packages = {
 84          inherit jail vibe;
 85          default = vibe;
 86        };
 87        
 88        devShells.default = pkgs.mkShell {
 89          name = "vibe-dev";
 90          
 91          buildInputs = with pkgs; [
 92            jail
 93            vibe
 94            git
 95            bash
 96            jq
 97            curl
 98            which
 99          ];
100          
101          shellHook = ''
102            echo "Vibe development shell"
103            echo "NOTE: firejail and opencode must be installed system-wide"
104            echo "Available tools: git, jq, curl, which"
105            echo "Run 'jail' to start the sandbox wrapper"
106            echo "Run 'vibe' to start OpenCode in sandbox (optional: vibe <token>)"
107            
108            # Check for system dependencies
109            if ! command -v firejail &> /dev/null; then
110              echo ""
111              echo "WARNING: firejail not found in PATH"
112              echo "Install with: sudo pacman -S firejail  (Arch)"
113              echo "              sudo apt install firejail (Debian/Ubuntu)"
114            fi
115            
116            if ! command -v opencode &> /dev/null; then
117              echo ""
118              echo "WARNING: opencode not found in PATH"
119              echo "Please install opencode using your package manager"
120            fi
121          '';
122        };
123      });
124}