- Terminal link provider: printed paths that are files of the session open
in Files (at the line); the file list is preloaded so the first hover works.
- Alerts: "In a new session" opens alert-<name> and types the prompt once
Claude is up.
- devdesk-guard PreToolUse(Bash) hook: permissionDecision "ask" for
destructive commands (verified to prompt in auto mode); DEVDESK_GUARD and
guard.local.
- State hook logs Bash commands and derives host tags (ssh targets, CT/VM
ids); --list carries tags, --peek the last commands; UI shows both.
Closes#21Closes#18Closes#27
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PermissionRequest hook: the state file records tool, detail and
description of a pending permission; Notification keeps it.
- devdesk attach --answer (presses 1/Esc only if the same wait is on and the
prompt is visible), --peek (last exchange from the transcript), --reply
(bracketed paste + Enter, streamed like uploads).
- Inbox: Allow/Deny/Open for permission waits; Peek & reply for other waits
and finished sessions. Matrix messages include the command.
Closes#22Closes#23
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Light mode with the house ☀/◐ toggle and lt_theme preference; light
terminal palette; Claude runs with dark-ansi so its colours follow the
palette; tmux and the statusLine use ANSI colours.
- Command palette (⌕, Ctrl+Shift+P) with session, terminal, view, link and
help commands.
- .lt-modal dialogs for new/rename/end and a keyboard shortcuts sheet.
- .lt-toast results for actions, uploads, copy and CI.
- ttyd dropped the reply of fast one-shot commands; replies now wait for the
browser to hang up, and the client hangs up as soon as it has one.
- Sessions panel re-fetches after an action instead of reusing a stale poll.
Closes#31Closes#32Closes#33Closes#34Closes#35
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Ask Claude: strip control characters, send as bracketed paste (closes#2)
- end: forget before kill, so ending from inside a session leaves no ghost (closes#3)
- reconnects use `attach --existing` and never resurrect ended/renamed sessions (closes#4)
- repo: git --no-optional-locks, no safe.directory override, refresh on connect/bell/60s (closes#5)
- uploads: unique names via mktemp, cleanup trap on hangup (closes#6)
- clipboard: write-only OSC 52 provider, tmux allow-passthrough off (closes#7)
- uploads: size check up front, streamed slices, idle timeout (closes#9)
- --list: path last in TSV rows, tolerant numbers (closes#10)
- tokens via curl config on stdin; userinfo stripped from remote URLs (closes#11)
- ttyd max clients 32 and at most 2 concurrent side-channel calls (#8; BroadcastChannel polling still open)
- tmux: fixed terminal-features index (no duplicates on re-source), no status-right clock
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- devdesk-state-hook (Claude UserPromptSubmit/PostToolUse/Notification/Stop/
SessionStart/SessionEnd) records whether each session is working, waiting on
you or idle; --list carries it. The sidebar shows it, the header shows the
current session's state, and a pulsing "needs you" chip jumps to sessions
waiting for input. Session refresh no longer depends on the sidebar being open.
- `devdesk attach --upload SESSION FILE BYTES` receives a file as base64
terminal input (raw mode, exact length, size-checked, sanitised name) into
/var/lib/devdesk/uploads/<session>/. The UI uploads dropped or pasted files and
pastes the path into Claude, which attaches images itself.
- `devdesk alerts` / `--alerts`: firing and pending Grafana alert rules with
severity, instances, summary and a link. The panel's "Ask Claude" types an
investigation prompt into the current session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sessions no longer need a project folder: any name works and starts in
DEVDESK_DEFAULT_DIR unless it matches a project; `devdesk new NAME [PROJECT]`.
- Rename (✎) and end/forget (×) sessions from the Sessions panel, plus
`devdesk rename`. The browser runs them as `devdesk attach --new|--rename|--end`
through ttyd. Renames keep the running Claude and its recorded conversation:
the hook, the run-wrapper and the statusline ask tmux for the current name.
- Claude Context panel is live: devdesk-statusline snapshots model,
context-window use, cost and edits per session, which --list reports;
Claude's footer gets a one-line summary. The panel now sits under Sessions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttyd serves a single-file xterm.js UI styled with the LotusGuild TDS
(web_template base.css). Sessions live in a dedicated tmux server unit
(devdesk-tmux.service), so restarting or upgrading the web unit never
stops Claude. Each named session maps to a project directory. A Claude
SessionStart hook records the conversation ID, so after a reboot the
session resumes that exact conversation.
- bin/devdesk: attach / new / ls / end / pick, with an fzf picker
- ttyd requires a credential that NPM injects; origin check enabled
- debian/: dh 13 with --no-stop-on-upgrade for the tmux unit, bundled
sha256-verified ttyd 1.7.7, lintian overrides, man page
- CI: lint, test, build, smoke-test, artifact; v* tags publish to the
Gitea apt registry and create a release
Refs: tinker ticket 887531976
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>