vibe.sh
1#!/usr/bin/env bash
2
3# vibe - Run OpenCode in a sandboxed firejail environment
4# Usage: vibe [--allow <dir>]... [<session_token>]
5#
6# NOTE: This script requires system-installed jail (from this package),
7# firejail, and opencode. Install firejail and opencode via your package manager.
8
9set -euo pipefail
10
11# Check for required dependencies
12if ! command -v jail &> /dev/null; then
13 echo "Error: jail is not installed or not in PATH" >&2
14 echo "Please install the jail package from this flake" >&2
15 exit 1
16fi
17
18if ! command -v firejail &> /dev/null; then
19 echo "Error: firejail is not installed or not in PATH" >&2
20 echo "Please install firejail using your system package manager:" >&2
21 echo " Arch Linux: sudo pacman -S firejail" >&2
22 echo " Ubuntu/Debian: sudo apt install firejail" >&2
23 echo " Fedora: sudo dnf install firejail" >&2
24 exit 1
25fi
26
27if ! command -v opencode &> /dev/null; then
28 echo "Error: opencode is not installed or not in PATH" >&2
29 echo "Please install opencode using your system package manager" >&2
30 exit 1
31fi
32
33# Parse --allow flags and handle session token
34ALLOWED_DIRS=()
35SESSION_TOKEN=""
36
37while [[ $# -gt 0 ]]; do
38 case "$1" in
39 --allow)
40 if [[ $# -lt 2 ]]; then
41 echo "Error: --allow requires a directory argument" >&2
42 exit 1
43 fi
44 ALLOWED_DIRS+=("$2")
45 shift 2
46 ;;
47 -s)
48 if [[ $# -lt 2 ]]; then
49 echo "Error: -s requires a token argument" >&2
50 exit 1
51 fi
52 SESSION_TOKEN="$2"
53 shift 2
54 ;;
55 -*)
56 echo "Error: Unknown flag: $1" >&2
57 echo "Usage: vibe [--allow <dir>]... [<session_token>]" >&2
58 exit 1
59 ;;
60 *)
61 if [[ -z "$SESSION_TOKEN" ]]; then
62 SESSION_TOKEN="$1"
63 shift
64 else
65 echo "Error: Unexpected argument: $1" >&2
66 echo "Usage: vibe [--allow <dir>]... [<session_token>]" >&2
67 exit 1
68 fi
69 ;;
70 esac
71done
72
73# Build jail command with allowed directories
74JAIL_ARGS=()
75for dir in "${ALLOWED_DIRS[@]}"; do
76 JAIL_ARGS+=(--allow "$dir")
77done
78
79# Execute with or without session token
80if [[ -n "$SESSION_TOKEN" ]]; then
81 exec jail "${JAIL_ARGS[@]}" opencode -s "$SESSION_TOKEN"
82else
83 exec jail "${JAIL_ARGS[@]}" opencode
84fi