Commit graph

63 commits

Author SHA1 Message Date
Kynan Ware
4d74e057f2 refactor(huh prompter): pipe-based test harness with full coverage
Replace manual model updates with an io.Pipe-based test harness that
drives forms through bubbletea's real event loop. Interaction helpers
(tab(), toggle(), typeKeys(), enter(), etc.) send raw terminal bytes
through io.Pipe to form.Run() in a goroutine.

Add tests for AuthToken, ConfirmDeletion, and InputHostname including
validation rejection paths. Add MultiSelectWithSearch coverage for
persistent options and empty search results.

30 tests, ~1s, all build*Form methods at 94-100% coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-26 14:26:16 +01:00
Kynan Ware
f294831e7d Upgrade to huh/v2 and fix selection persistence in MultiSelectWithSearch
Migrate from github.com/charmbracelet/huh v1 to charm.land/huh/v2,
updating ThemeBase16 to the new ThemeFunc API.

Fix selected options being lost across searches in the huhPrompter's
MultiSelectWithSearch. The root cause was huh's internal Eval cache:
when the user returned to a previously-seen search query, cached
options with stale .selected state overwrote the current selections
via updateValue(). The fix includes selectedValues in the OptionsFunc
binding hash (via searchOptionsBinding) so the cache key changes
whenever selections change, preventing stale cache hits. A local
searchFunc result cache avoids redundant API calls when only the
selection state (not the query) has changed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-26 14:26:15 +01:00
Kynan Ware
87426ee236 Add experimental huh-only prompter gated by GH_EXPERIMENTAL_PROMPTER
Introduce a new Prompter implementation (huhPrompter) that uses the
charmbracelet/huh library in its standard interactive mode, as an
alternative to the survey-based default prompter. The new implementation
is gated behind the GH_EXPERIMENTAL_PROMPTER environment variable,
following the same truthy/falsey pattern as GH_ACCESSIBLE_PROMPTER.

Key differences from the accessible prompter:
- No WithAccessible(true) flag (full interactive TUI)
- Uses EchoModePassword (masked with *) instead of EchoModeNone
- No default value annotations appended to prompt text

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-26 14:24:56 +01:00
Kynan Ware
a33d809c88
Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-26 15:09:16 -07:00
Kynan Ware
d46f42a752 Refactor MultiSelectWithSearch to use result struct
Refactored the MultiSelectWithSearch function and related interfaces to use a MultiSelectSearchResult struct instead of multiple return values. This change improves clarity and extensibility of the search function signature, and updates all usages, mocks, and tests accordingly.
2026-01-26 13:29:22 -07:00
Kynan Ware
0beb74bf72 MultiSelectWithSearch initial implementation
Initial implementation of MultiSelectWithSearch:

- Implement by survey and accessible prompters. They use the same internal func under the hood.
- Implement in `gh preview prompter` for initial testing and demonstration
- Implement interface changes across the codebase and mocks to satisfy compiler.
- Implement tests for new MultiSelectWithSearch prompter
2026-01-26 13:29:22 -07:00
Kynan Ware
9b89a0ac0e fix(a11y prompter): remove invalid defaults 2025-05-08 07:41:36 -06:00
Kynan Ware
3594f6357b fix(a11y prompter): confirm prompt default is readable 2025-05-06 15:50:57 -06:00
Kynan Ware
04aaaea142 fix(a11y prompter): multi select defaults are readable 2025-05-06 15:43:26 -06:00
Kynan Ware
957667efe6 doc(prompter): remove TODO about default value panic 2025-05-06 15:33:51 -06:00
Kynan Ware
cab906151f fix(a11y prompter): select prompt default value is readable 2025-05-06 15:33:15 -06:00
Kynan Ware
ab4cfb84d2 refactor(a11yprompter): shared method for prompt defaults 2025-05-06 15:33:15 -06:00
Kynan Ware
2ee68411a7 fix(a11y prompter): Select prompt respects defaults 2025-05-06 15:33:15 -06:00
Kynan Ware
9bc2c388da fix(a11y prompter): input prompt default value is readable 2025-05-06 14:34:05 -06:00
Kynan Ware
00c930d509
doc(prompter): small typo 2025-04-30 08:04:16 -06:00
Andy Feller
8130126ce5
Merge pull request #10901 from cli/kw/fix-accessible-multi-select-prompter-respects-defaults
Fix: Accessible multiselect prompt respects default selections
2025-04-30 09:46:56 -04:00
Kynan Ware
d8512a9066 fix(prompter): respect default MultiSelect a11y prompter 2025-04-29 16:35:04 -06:00
Andy Feller
df0aedbe3c
Update internal/prompter/prompter.go 2025-04-28 11:16:35 -04:00
Andy Feller
97a3b70599 Update to huh@0.7.0, echo mode changes
This commit is the initial change around updating to huh@0.7.0; pre-testing changes.
2025-04-26 12:57:10 -04:00
Kynan Ware
138bccd437 feat(config): add accessible prompter and spinner 2025-04-22 16:50:58 -06:00
Kynan Ware
70537de132
test(prompter): fix invalid comment 2025-04-10 17:18:56 -06:00
Andy Feller
b8cd094ca8 Ensure markdown confirm prompt shows editor name
Apparently, `gh` might not actually have an editor at the time we're prompting
the user if they want to use it for markdown editing.  In the survey package,
there is a function that will handle fallback to the default editor based on
environment variables and parse it in the case the editor contains flags and
arguments for cases like Visual Studio Code.

Additionally, there are no tests for the EditorName function and the fact it
is loaded via `init` makes this difficult to test.

Co-authored-by: Kynan Ware <47394200+BagToad@users.noreply.github.com>
2025-04-10 16:28:58 -06:00
Kynan Ware
20ff409bfc fix(prompter): remove needless default value assignment 2025-04-10 16:28:57 -06:00
Kynan Ware
fab0de5583 fix(prompter): pass io to huh and refactor tests 2025-04-09 15:51:02 -06:00
Kynan Ware
2f5e896535 fix(prompter): update huh and fix tests 2025-04-09 15:18:53 -06:00
Kynan Ware
8fc8486af5 refactor(prompter): rename speechSynthesizerFriendlyPrompter to accessiblePrompter 2025-04-09 08:24:54 -06:00
Kynan Ware
19387b8418 fix(prompter): rename GH_ACCESSIBLE_PROMPTER 2025-04-08 12:52:39 -06:00
Kynan Ware
9cf341302e refactor(prompter): explicit return values 2025-04-08 12:03:55 -06:00
Kynan Ware
8821f77fbb doc(prompter): remove senseless comment 2025-04-08 12:00:02 -06:00
Kynan Ware
c4be95afd9 refactor(prompter): remove unused variable 2025-04-08 11:58:50 -06:00
Kynan Ware
d8d3874778 fix(prompter): use os.lookupenv for accessible prompter 2025-04-08 11:38:54 -06:00
Kynan Ware
66407402c0
doc: comment typos and formatting
Co-authored-by: Andy Feller <andyfeller@github.com>
2025-04-07 14:53:31 -06:00
Kynan Ware
f89700160b doc(prompter): clarify comments 2025-04-04 15:08:17 -06:00
Kynan Ware
0b49522467 refactor(prompter): less magic strings 2025-04-04 15:07:21 -06:00
Kynan Ware
2e48cadf58 fix(prompter): remove impossible condition 2025-04-04 15:05:23 -06:00
Kynan Ware
5c39e0bd10 fix(prompter): notes about Confirm default 2025-04-04 14:52:25 -06:00
Kynan Ware
4cf048a8d1 fix(prompter): input returns default when blank 2025-04-04 11:33:10 -06:00
Kynan Ware
5b0d49c6ec test(prompter): more tests for bad input 2025-04-04 11:06:40 -06:00
Kynan Ware
a30df14b6a refactor(prompter): rename env var for speech synthesizer friendly prompter 2025-04-03 13:08:16 -06:00
Kynan Ware
49ddacf5b8 docs(prompter): doc prompter interface 2025-04-03 13:06:31 -06:00
Kynan Ware
88e6285b49 test(prompter): move to external package 2025-04-03 08:45:58 -06:00
Kynan Ware
8827803bd1 test(prompter): skip vt10x tests on Windows 2025-04-03 08:25:33 -06:00
Kynan Ware
94bbd26aab fix(prompter): rename huhprompter 2025-04-02 12:56:44 -06:00
Kynan Ware
88a98ea63a
feat(prompter): include no as false-y value
Co-authored-by: Andy Feller <andyfeller@github.com>
2025-04-02 11:58:10 -06:00
Kynan Ware
e973ee332d fix(md prompter): accessible prompt allows blank
Allow the accessible markdownEditor prompt to be blank when the blank
comes from the result of an interactive session with an editor, even when
blankAllowed is false.

This behavior aligns the accessible prompter with the behavior of the
current standard prompter.
2025-03-31 15:58:20 -06:00
Kynan Ware
7b0c09541d feat(md prompter): md prompt respects blankAllowed
Accessible prompter now respects blankAllowed and
will not prompt for "skip" if blankAllowed is false.
2025-03-31 15:52:26 -06:00
Kynan Ware
202c1ad16b feat(prompter): add accessible prompter support 2025-03-31 15:04:57 -06:00
Tyler McGoffin
13e916bcfb Change prompts for gh auth login to reflect change from GHE to Other 2024-09-20 14:10:05 -07:00
Sam Coe
8016244dbb
Use go-gh prompter package (#7896) 2023-08-28 08:08:43 -05:00
Nate Smith
7d470c4df4 name MultiSelect parameters in interface
I wanted the parameters to show up in my autocomplete
2023-08-07 17:59:12 -07:00