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}