feat(desktop): a server manager you can browse and edit - #27
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:productionand 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/confighosts 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
Connectiontype 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:desktopgreen.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