feat: doctor reports bubblewrap availability

Adds a non-fatal bubblewrap check to the doctor command that reports whether
the bwrap binary is available. This is necessary for sandboxed sessions and
the check is displayed alongside other system requirement checks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 21:37:30 -04:00
parent f6ed53ce23
commit 7d851dcb7e
2 changed files with 36 additions and 1 deletions
+6 -1
View File
@@ -1,5 +1,6 @@
import logging
import os
import shutil
import subprocess
import sys
import traceback
@@ -105,7 +106,6 @@ def launch(inside_tmux: bool = False):
@main.command()
def doctor():
"""Check system requirements."""
import shutil
from hqt.harnesses.registry import discover_harnesses
tmux = shutil.which("tmux")
@@ -119,6 +119,11 @@ def doctor():
click.echo(f"{name}: ✓")
if not harnesses:
click.echo("No harnesses found on PATH")
bwrap = shutil.which("bwrap")
if bwrap:
click.echo(f"bubblewrap: ✓ {bwrap}")
else:
click.echo("bubblewrap: ✗ not found — sandboxed sessions unavailable")
@main.command(name="list")
+30
View File
@@ -0,0 +1,30 @@
from unittest.mock import patch
from click.testing import CliRunner
from hqt import cli as cli_module
from hqt.cli import main
def _which(found: set[str]):
return lambda name: f"/usr/bin/{name}" if name in found else None
def test_doctor_reports_bwrap_present():
"""Test that doctor reports bubblewrap when present."""
# Patch the single shutil.which used by both cli and registry
with patch.object(
cli_module.shutil, "which", side_effect=_which({"tmux", "bwrap"})
):
result = CliRunner().invoke(main, ["doctor"])
assert result.exit_code == 0
assert "bubblewrap: ✓" in result.output
def test_doctor_reports_bwrap_missing():
"""Test that doctor reports bubblewrap as missing when not present."""
# Patch the single shutil.which used by both cli and registry
with patch.object(cli_module.shutil, "which", side_effect=_which({"tmux"})):
result = CliRunner().invoke(main, ["doctor"])
assert result.exit_code == 0
assert "bubblewrap: ✗" in result.output