Skip to content

feat(desktop): a server manager you can browse and edit - #27

Merged
ralyodio merged 1 commit into
mainfrom
feat/site-manager
Aug 30, 2026
Merged

feat(desktop): a server manager you can browse and edit#27
ralyodio merged 1 commit into
mainfrom
feat/site-manager

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The app could create a connection and nothing else. No list, no edit, no delete, no rename. New server was a one-way door: get a field wrong and your only recourse was the CLI.

And every field beyond the six in that dialog was unreachable from the window entirely — tags most consequentially, since fleet selection is built on --on tag:production and there was nowhere in the app to set one. Same for the jump host, a non-standard remote rsync path, notes and agent forwarding.

The manager

Every server on the left with its tags; every field of the selected one on the right. New / Duplicate / Import from ~/.ssh/config / Save / Test / Delete.

One list shared by both tabs — the same servers back the transfer panes and Fleet, so it is one manager rather than two.

~/.ssh/config hosts are listed but not editable; that is somebody else's file. Save a copy turns one into a connection of your own — the same deliberate act the CLI's import performs — and leaves the file untouched.

Editing upserts on the connection id, so changing a name updates the row rather than leaving a second copy behind.

The smaller half of the same complaint

Saving a fleet command under an existing name has always updated it — the store upserts — but the control read "Save these settings" either way, so there was no way to tell an edit from a new one. It now reads Update <name> when what is on screen is a saved command, and prefills the name so one keypress is enough.

Why the fields were missing

The renderer's Connection type carried only the eight fields the two-pane view happened to need. The rest were absent from the type, so nothing could render them even though the store had them all along. It now describes what a connection actually holds.

Verified

By driving the built renderer: the list with tags, the full form, and selecting a different server loading it for editing. 517 tests, typecheck and pnpm smoke:desktop green.

Still to come, if you want it: the same browse-and-edit treatment for saved fleet lists and transfer profiles (both currently save/delete only, no rename or membership editing).

🤖 Generated with Claude Code

https://claude.ai/code/session_01UeSWg1Czsb2Lwxj8vHUnA4

The app could **create** a connection and nothing else. No list, no edit, no
delete, no rename. "New server" was a one-way door: get a field wrong and your
only recourse was the CLI.

And every field beyond the six in that dialog was unreachable from the window
entirely — **tags** most consequentially, since fleet selection is built on
`--on tag:production` and there was nowhere in the app to set one. Same for
the jump host, a non-standard remote rsync path, notes and agent forwarding.

So: a manager, in the shape the job actually has. Every server on the left
with its tags, every field of the selected one on the right, and New /
Duplicate / Import / Save / Test / Delete. One list shared by both tabs,
because servers are shared — the same list backs the transfer panes and Fleet.

`~/.ssh/config` hosts are listed but not editable; that is somebody else's
file. "Save a copy" turns one into a connection of your own, which is the same
deliberate act the CLI's import performs, and leaves the file untouched.

Editing upserts on the connection id, so changing a name updates the row
rather than leaving a second copy behind.

Also fixes the smaller half of the same complaint. Saving a fleet command
under an existing name has always updated it — the store upserts — but the
control read "Save these settings" either way, so there was no way to tell an
edit from a new one. It now reads "Update <name>" when what is on screen is a
saved command, and prefills the name so one keypress is enough.

The renderer's `Connection` type carried only the eight fields the two-pane
view happened to need, which is why the rest were uneditable: they were absent
from the type, so nothing could render them. It now describes what a
connection actually holds.

517 tests. Verified by driving the built renderer: the list, the tags, the
full form, and selecting a different server loading it for editing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UeSWg1Czsb2Lwxj8vHUnA4
@ralyodio
ralyodio merged commit 3e7b642 into main Aug 30, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant