Conversation
…ration test - Add integration_test/feature_screenshots_test.dart: captures all major UI screens from the Flutter render tree (no Screen Recording permission needed); backs up and restores user prefs around the run - Add 14 new screenshots organised into subfolders by feature group (terminal-ssh, sftp, port-forwarding, credentials-security, settings, plugins, audit-recording) - Reorganise README Screenshots section by feature group with HTML tables; retain legacy flat screenshots for features requiring live connections (SSH terminal, DevOps, Web Tools, RDP workspace) - Add .claude/skills/yourssh-screenshots skill for repeatable screenshot refresh workflow
Password field was always initialized empty, causing users to think their saved password was lost on every edit. Now loads the stored password from Keychain after the first frame so the field shows it is set (obscured), without requiring the user to re-enter it.
- Add _stopped flag to guard against concurrent stop() calls - Wrap cleanup sequence in nested try-finally to ensure all steps run even if an earlier step throws (order: _serverSub → _server → _closers → _kubectlSub)
Adds context optional param to listPods, streamLogs (kubectl logs -f via execStream), startPodPortForward (kubectl port-forward + local ServerSocket piped through SSH), and _pipeK8s helper. Also fixes K8sForwardHandle constructor to use public named params for cross-library construction.
Replace inline K8s pod list, namespace controls, and execPod logic with KubernetesPanel; add onOpenBrowser param to ContainersScreen.
- container: stop accumulating kubectl port-forward log lines once the forward is confirmed. `lines` is read only for the pre-ready error message, so appending after `ready` completed grew the buffer unbounded for the lifetime of a long-lived forward. - hosts dashboard: memoize the sort and filter the sorted result, so each search keystroke is an O(n) filter instead of an O(n log n) re-sort (sortHosts is a total order, so filter-after-sort is equivalent). Prune stale selections via a Set lookup instead of O(selected * hosts). - external edit: dedupe watchers per (host, remote path) so re-opening a file replaces its watcher instead of stacking a duplicate mtime-poll timer for the lifetime of the screen.
HostDetailPanel._loadExistingPassword reads context.read<SshService>() in a post-frame callback when editing an existing password host. The five host_detail_panel_* test harnesses never provided the service, so every test that opened an existing host threw ProviderNotFoundException (19 failures). Production always supplies it via main.dart. Add a Provider<SshService> to each harness.
- CHANGELOG: add Kubernetes panel, onOpenBrowser DevOps callback, and perf fixes (sort memo, watcher dedup, k8s log accumulation) to 0.1.34 - README: add keyword highlighting, server monitor panel, network discovery, import sources (9 formats), known hosts import, K8s panel; check off Docker/K8s exec in roadmap phase list - Roadmap: bump current version 0.1.33 → 0.1.34; replace (develop) labels with (0.1.34); add Kubernetes panel to shipped; retire P0 - App icon assets updated
- add app/assets/logo.png (2048px master) and logo-readme.png (256px, ~23KB) - point README header at logo-readme.png at width 120 for fast page load - remove rolled-back feature bullets and uncheck Phase 4 Docker/K8s item
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.
Summary
Release PR rolling up the unreleased
developwork intomasteras v0.1.34.Features shipped in this release
DevOps / Infra tooling
KubernetesPanelwidget in the DevOps plugin: context switcher, streamedkubectl logs -f, and 1-clickkubectl port-forwardvia a newContainerService.execStreampersistent exec channel. The K8s tab in ContainersScreen now delegates fully to this widget.FirewallStatusServiceauto-detects ufw / iptables / nftables.onOpenBrowserDevOps callback —DevOpsPluginConfiggainsonOpenBrowserso the host app handles in-app browser navigation from DevOps tools without a hard dependency on the WebTools plugin.Terminal UX
Host management
_ssh._tcp,_rdp._tcp) + configurable TCP subnet scan; results in a bottom sheet with one-tap Add Host..reg, MobaXterm.mxtsessions, SecureCRT XML, Ansible INI, WinSCP.ini, Termius JSON, SSH URI (onessh://per line).~/.ssh/known_hostsinto the app store; skips duplicates and hashed entries.Host panel
Performance / memory
ContainerService.startPodPortForwardlistener early-returns afterForwarding fromis matched, stopping unbounded log-line accumulation for long-lived forwards._memoSortedHosts(identical-element guard); prune stale selections via a Set lookup. O(n log n) per keystroke → amortized O(1) for unchanged inputs.ExternalEditService._startWatchercancels any existing watcher for the same (host, remote path) before creating a new one, preventing duplicate poll timers on re-open.Test fixes
host_detail_panel_*harnesses never providedProvider<SshService>, which_loadExistingPasswordreads in a post-frame callback. Added the provider to each harness.Docs / assets
Verification
flutter analyze→ cleanflutter test→ +1337 all passing (was 1318 pass / 19 fail before the harness fix)🤖 Generated with Claude Code