From df7001df9ee3a6d1668b178c94264513aa915792 Mon Sep 17 00:00:00 2001 From: lei Date: Tue, 2 Jun 2026 22:07:28 +0300 Subject: [PATCH] fix(vm): restore hint bar on wizard's self-prompting pickers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The vm create wizard's storage, ssh-keys, and startup-script steps prompt inside their Loaders via direct prompter.Select/MultiSelect calls. In per-prompt mode the composite program (which draws the layout's hint bar) isn't running while a Loader executes, so these pickers rendered without the hint legend — the SSH multi-select looked like a plain list, and pressing enter without space-toggling threw "at least 1 selection required" with no visible cue that space toggles. Pass WithShowHints / WithMultiSelectShowHints to all seven such calls (the three step prompts plus the add-key, pick-pub-file, add-script, and attach-volume sub-flows). Also trim the hand-rolled "(Ctrl+D to finish)" from the two startup-script editor labels; verdagostack's editor now renders the standard "(ctrl+d to submit, esc to cancel)" affordance by default. Bump verdagostack v1.4.1 -> v1.4.2 for the improved multiselect min-selection error message ("... — press space to select") and the editor hint/summary override hooks. Co-Authored-By: Claude Opus 4.8 (1M context) --- go.mod | 2 +- go.sum | 4 ++-- internal/verda-cli/cmd/startupscript/add.go | 2 +- internal/verda-cli/cmd/vm/wizard.go | 6 +++--- internal/verda-cli/cmd/vm/wizard_subflows.go | 10 +++++----- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 1eac9ec..01b272b 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/verda-cloud/verdacloud-sdk-go v1.4.2 - github.com/verda-cloud/verdagostack v1.4.1 + github.com/verda-cloud/verdagostack v1.4.2 go.yaml.in/yaml/v3 v3.0.4 ) diff --git a/go.sum b/go.sum index 99d6ce7..d03f89f 100644 --- a/go.sum +++ b/go.sum @@ -189,8 +189,8 @@ github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CP github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/verda-cloud/verdacloud-sdk-go v1.4.2 h1:oVb8fHVQOY+YPuuMYMee9gYCkPTwAw01LmkqxM21T/Y= github.com/verda-cloud/verdacloud-sdk-go v1.4.2/go.mod h1:pmlpiCL9fTSikZ3qWLJPpHOG0E8PKkQVUX5s4Z+SktY= -github.com/verda-cloud/verdagostack v1.4.1 h1:Jj+15fw+RlBWGuY4dPSbjgLoqS8UKLdQa9RTYeB8VxM= -github.com/verda-cloud/verdagostack v1.4.1/go.mod h1:TuJkNkis787dfJTU//dTKEMTbL/tDWDlgcPPI0WiJgw= +github.com/verda-cloud/verdagostack v1.4.2 h1:JiTBWB+WeFOSPoWO2dBVkP3NyV2tId8OEeJw9MNI32k= +github.com/verda-cloud/verdagostack v1.4.2/go.mod h1:TuJkNkis787dfJTU//dTKEMTbL/tDWDlgcPPI0WiJgw= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= diff --git a/internal/verda-cli/cmd/startupscript/add.go b/internal/verda-cli/cmd/startupscript/add.go index e0f8b86..5ba27f0 100644 --- a/internal/verda-cli/cmd/startupscript/add.go +++ b/internal/verda-cli/cmd/startupscript/add.go @@ -122,7 +122,7 @@ func runAdd(cmd *cobra.Command, f cmdutil.Factory, ioStreams cmdutil.IOStreams, } content = string(data) case 1: // Paste content - content, err = prompter.Editor(ctx, "Script content (Ctrl+D to finish)", + content, err = prompter.Editor(ctx, "Script content", tui.WithEditorDefault("#!/bin/bash\n\n# Your startup script here\n"), tui.WithFileExt(".sh")) if err != nil { diff --git a/internal/verda-cli/cmd/vm/wizard.go b/internal/verda-cli/cmd/vm/wizard.go index 364938b..e654fd2 100644 --- a/internal/verda-cli/cmd/vm/wizard.go +++ b/internal/verda-cli/cmd/vm/wizard.go @@ -523,7 +523,7 @@ func stepStorage(getClient clientFunc, cache *apiCache, opts *createOptions) wiz for i, c := range choices { labels[i] = c.Label } - idx, err := prompter.Select(ctx, "Storage", labels) + idx, err := prompter.Select(ctx, "Storage", labels, tui.WithShowHints(true)) if err != nil { return nil, err } @@ -610,7 +610,7 @@ func stepSSHKeys(getClient clientFunc, opts *createOptions) wizard.Step { for i, c := range choices { labels[i] = c.Label } - indices, err := prompter.MultiSelect(ctx, "SSH keys to inject", labels, tui.WithMinSelections(1)) + indices, err := prompter.MultiSelect(ctx, "SSH keys to inject", labels, tui.WithMinSelections(1), tui.WithMultiSelectShowHints(true)) if err != nil { return nil, err } @@ -692,7 +692,7 @@ func stepStartupScript(getClient clientFunc, opts *createOptions) wizard.Step { for i, c := range choices { labels[i] = c.Label } - idx, err := prompter.Select(ctx, "Startup script (optional)", labels) + idx, err := prompter.Select(ctx, "Startup script (optional)", labels, tui.WithShowHints(true)) if err != nil { return nil, err } diff --git a/internal/verda-cli/cmd/vm/wizard_subflows.go b/internal/verda-cli/cmd/vm/wizard_subflows.go index e197c02..8916fab 100644 --- a/internal/verda-cli/cmd/vm/wizard_subflows.go +++ b/internal/verda-cli/cmd/vm/wizard_subflows.go @@ -54,7 +54,7 @@ func promptAddSSHKey(ctx context.Context, prompter tui.Prompter, client *verda.C sourceIdx, err := prompter.Select(ctx, "Public key source", []string{ "Load from file", "Paste content", - }) + }, tui.WithShowHints(true)) if err != nil { return nil, nil //nolint:nilerr // User canceled. } @@ -127,7 +127,7 @@ func promptSSHKeyFilePath(ctx context.Context, prompter tui.Prompter) (string, e copy(labels, pubFiles) labels[len(pubFiles)] = "Enter path manually..." - idx, err := prompter.Select(ctx, "Select public key file", labels) + idx, err := prompter.Select(ctx, "Select public key file", labels, tui.WithShowHints(true)) if err != nil { return "", err } @@ -208,7 +208,7 @@ func promptAddStartupScript(ctx context.Context, prompter tui.Prompter, client * sourceIdx, err := prompter.Select(ctx, "Script source", []string{ "Load from file", "Paste content", - }) + }, tui.WithShowHints(true)) if err != nil { return nil, nil //nolint:nilerr // User canceled or left input blank. } @@ -227,7 +227,7 @@ func promptAddStartupScript(ctx context.Context, prompter tui.Prompter, client * } content = string(data) case 1: // Paste content - content, err = prompter.Editor(ctx, "Script content (Ctrl+D to finish)", + content, err = prompter.Editor(ctx, "Script content", tui.WithEditorDefault("#!/bin/bash\n\n# Your startup script here\n"), tui.WithFileExt(".sh")) if err != nil { @@ -343,7 +343,7 @@ func promptAttachExisting(ctx context.Context, prompter tui.Prompter, status tui } labels = append(labels, "← Back") - idx, err := prompter.Select(ctx, "Select volume to attach", labels) + idx, err := prompter.Select(ctx, "Select volume to attach", labels, tui.WithShowHints(true)) if err != nil { return "", nil //nolint:nilerr // User canceled or left input blank. }