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