- 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>
- 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>