- Explorer: context menus, multi-select, inline rename/new, drag to move
or copy, desktop drag-and-drop uploads (folders too), cut/copy/paste,
duplicate, download, delete to a 7-day trash with Undo. Server side in
libexec/devdesk-fsops.sh with bats tests. Closes#54
- Markdown preview in a shadow root: headings with anchors and outline,
highlighted code with copy, callouts, task lists, front matter, links
that open files, live split view. Editor status bar, multi-cursor,
closeBrackets, Ctrl+G, tab menus and reordering. Closes#55
- Search in files (Ctrl+Shift+F) via git grep / grep. Closes#56
- Fix: nested $(...) path checks now fail hard (set -e does not reach
them; an escape created /x in testing); newest folder listing wins;
sessionAction returns the reply JSON.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WHRLCCdXYm41Qx5kNhehaP
A left drag in the pane is turned into xterm's own selection (as Shift+drag
does) instead of tmux copy-mode, which dropped the highlight on release.
Copy on release with a toast; Ctrl+C copies when something is selected.
Wheel scroll and status-line clicks still reach tmux. Closes#51
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WHRLCCdXYm41Qx5kNhehaP
- Matrix "needs you": ignore Claude's idle reminder (no red, no post); post
only when no tab is in view, after 60 s, once per session per 10 min, and
say what is asked. Closes#50
- devdesk new NAME PROJECT --worktree: own checkout on devdesk/NAME,
cleaned up on end when clean/merged. Closes#44
- Usage meters: reset time, pace warning; Matrix ping past 90% when away.
Closes#45
- Repo panel lists changed files; click opens the diff. Closes#46
- Copy Claude's last reply (--last-reply). Closes#47
- Turn timer in chip, title and cards. Closes#48
- Compact button at 80% context when idle. Closes#49
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WHRLCCdXYm41Qx5kNhehaP
- devdesk attach --search (grep + jq over ~/.claude/projects, six files at
a time) and --resume-convo NAME ID [fork]; devdesk-claude-run passes
--fork-session once. Search dialog with Resume / Fork / Open.
- statusLine snapshots rate_limits and pr; footer/menu meters with a 90 %
warning; PR chip on session rows.
- CLAUDE_CLIENT_PRESENCE_FILE per tmux session id; --presence on|off with a
self-expiring marker; the page heartbeats it while visible.
Closes#24Closes#25Closes#26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- devdesk attach --fs-write SESSION PATH BYTES BASESHA|new: streamed like
uploads, temp file in the same folder, sha re-check (conflict reply instead
of overwriting), mode/owner kept, atomic mv; new files with folders, never
outside the session folder or through a symlink out of it.
- Editor: editable CodeMirror for UTF-8 text, dirty tracking, Ctrl+S,
Save/Revert, conflict dialog with a disk-vs-yours diff, changed-on-disk
banner, drafts in localStorage (flushed on pagehide), close/leave guards,
New file.
- Upload streaming factored into streamIn(), shared by uploads and saves.
Closes#20
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Explorer tree with inline expand/collapse and keyboard navigation, git
colours, change dots, dimmed gitignored entries (fs-list now flags them),
file-type badges, resizable explorer.
- Editor tabs: preview tab semantics, instant switching with scroll kept,
in-place reload when Claude changes an open file.
- Go to file: devdesk attach --fs-find (git ls-files or capped find) and a
fuzzy-ranked palette (CommandPalette gained custom search/async lists).
- Per-session memory of folders and tabs; empty state with recents.
Closes#37
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- devdesk attach --fs-list/--fs-read/--git-status/--git-show/--asset
(libexec/devdesk-files.sh), confined to the session folder.
- The state hook records files Claude edits (Edit/Write/MultiEdit/
NotebookEdit) for the Changes tab's "C" badge; rename/end carry it.
- Files pane: folders, CodeMirror read-only view, sanitized markdown preview
in a sandboxed iframe with inlined relative images, images, Changes tab with
line counts and diff against HEAD, "→ Claude" @path, resizable split.
- The editor bundle ships as /usr/share/devdesk/assets/editor.js, is fetched
over ttyd on first use, verified against the page's SHA-256 and cached in
IndexedDB.
- Fix: the state hook's field split collapsed empty fields.
Closes#19
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>
- Header: no SSO chip ("Sign in again" only on expiry), state dot on the
session chip, LIVE as a dot, ⋯ menu for text size/notifications/fullscreen,
Panels badge for waiting sessions and alerts.
- Session switcher on the chip; bare URL reattaches the last session; + New
opens the panel form with project folders.
- Notifications when other sessions start waiting; alerts polled with the
panels closed; one tab polls for all tabs over BroadcastChannel.
- Sidebar: context bar per session instead of the Context panel; compact
Repo/CI with "Ask Claude to fix CI"; legible labels.
- Phone: key bar, drawer with backdrop, visualViewport-aware layout, DOM
renderer on touch, compact connection dot.
- devdesk-notify-matrix: one Matrix message per wait that lasts
DEVDESK_MATRIX_DELAY seconds with nobody attached.
Closes#8Closes#13Closes#14Closes#15Closes#16Closes#17Closes#28
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>
- `devdesk attach --repo NAME` / `devdesk repo NAME`: git state of the session's
folder (branch, ahead/behind, uncommitted changes) plus the Gitea commit
status of HEAD and open PR count. Uses the anonymous API for public repos,
or /etc/devdesk/gitea-token when present. Runs over the ttyd channel, so no
sidecar is needed. The panel links to the repo, the CI run and PRs, and a
notification fires when HEAD's CI finishes while the tab is in the background.
- /etc/devdesk/env.local is read after the packaged env and never shipped, so
upgrades no longer stop at a conffile prompt.
- Hooks and status line only record for panes on DevDesk's own tmux server; the
Claude wrapper re-reads env before every launch (so the Remote Control toggle
applies on the next Claude restart).
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>