Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion hermes_cli/kanban.py
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,16 @@ def kanban_command(args: argparse.Namespace) -> int:
# keeps the patch small and inherits the exact same resolution the
# dispatcher uses for workers — consistency is a feature here.
board_override = getattr(args, "board", None)
prev_board_env = os.environ.get("HERMES_KANBAN_BOARD")
restore_board_env = False

def _restore_board_env() -> None:
if not restore_board_env:
return
if prev_board_env is None:
os.environ.pop("HERMES_KANBAN_BOARD", None)
else:
os.environ["HERMES_KANBAN_BOARD"] = prev_board_env
if board_override:
try:
normed = kb._normalize_board_slug(board_override)
Expand All @@ -667,12 +677,16 @@ def kanban_command(args: argparse.Namespace) -> int:
)
return 1
os.environ["HERMES_KANBAN_BOARD"] = normed
restore_board_env = True

# Boards management doesn't touch the DB at all — dispatch early so
# fresh installs that haven't initialized any DB can still use
# `hermes kanban boards create …`.
if action == "boards":
return _dispatch_boards(args)
try:
return _dispatch_boards(args)
finally:
_restore_board_env()

# Auto-initialize the DB before dispatching any subcommand. init_db
# is idempotent, so running it every invocation is cheap (one
Expand All @@ -685,6 +699,7 @@ def kanban_command(args: argparse.Namespace) -> int:
kb.init_db()
except Exception as exc:
print(f"kanban: could not initialize database: {exc}", file=sys.stderr)
_restore_board_env()
return 1

handlers = {
Expand Down Expand Up @@ -726,12 +741,16 @@ def kanban_command(args: argparse.Namespace) -> int:
handler = handlers.get(action)
if not handler:
print(f"kanban: unknown action {action!r}", file=sys.stderr)
_restore_board_env()
return 2
try:
return int(handler(args) or 0)
except (ValueError, RuntimeError) as exc:
print(f"kanban: {exc}", file=sys.stderr)
_restore_board_env()
return 1
finally:
_restore_board_env()


# ---------------------------------------------------------------------------
Expand Down
10 changes: 10 additions & 0 deletions tests/hermes_cli/test_kanban_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,13 @@ def test_run_slash_missing_required_arg_friendly_error(kanban_home):
out = kc.run_slash("show")
assert "/kanban show" in out
assert "task_id" in out


def test_run_slash_board_override_restores_prior_env(kanban_home, monkeypatch):
kb.create_board("alpha")
kb.create_board("beta")
monkeypatch.setenv("HERMES_KANBAN_BOARD", "beta")

kc.run_slash("--board alpha list")

assert os.environ.get("HERMES_KANBAN_BOARD") == "beta"