UX: implement new design of azd tool (install/upgrade/list/check)#9045
UX: implement new design of azd tool (install/upgrade/list/check)#9045hemarina wants to merge 45 commits into
Conversation
…na/issue-8990-tool-ux
|
azd tool install |
jongio
left a comment
There was a problem hiding this comment.
Solid UX overhaul. The Host/Command split is a clean design that separates display names from executable identities. Step spinner integration follows established patterns from azd provision, and the multi-select filter threshold is a nice touch for shorter lists.
The existing inline comments from the prior review cover the notable edge cases well (--no-prompt handling for multi-select, lineWriter thread safety, case sensitivity consistency). Those are worth addressing but don't block merge.
Test coverage for the new paths looks good.
kristenwomack
left a comment
There was a problem hiding this comment.
Thanks Marina, this is really nice work — the Host/Command split is clean and the comments make the intent easy to follow.
One small question: in the plugin output like Plugin "azure" updated from 1.1.73 to 1.1.86 — should "azure" be capitalized as "Azure"?
jongio
left a comment
There was a problem hiding this comment.
Re-reviewed at HEAD e4337d1. No new commits since my last pass; the only new activity is the automated inline batch, so a few notes on those so they don't cost you time.
The for range writers comment is a false positive here. go.mod targets go 1.26.4, and ranging over an integer has been valid since 1.22, so that test compiles fine. No change needed.
The lineWriter chunk-splitting note is also fine as-is. Emitting content per write rather than reassembling strict lines is intentional and documented: output is surfaced as it arrives so an interactive prompt with no trailing newline stays visible. Buffering whole lines would defeat that.
The generic Host display names, the singular success headers on --all, and the CHANGELOG covering only install are optional polish, your call.
My one earlier open item still stands and is non-blocking: with WithInteractive(true) dropped on the spinner path, host CLI stdout/stderr route through a piped writer while stdin stays attached. Please confirm the real host CLIs (Copilot, Claude) still surface and accept their trust/confirmation prompts through those piped streams. Approving.
|
This is a great redesign. The whole set of A few usability and copy notes:
Can we please fix these before merging? These show up across every Thanks, Marina. Nice work on this. |
jongio
left a comment
There was a problem hiding this comment.
One follow-up on the new lineWriter buffering, inline. The rename itself reads consistently across the tool commands.
|
Thanks @hemarina for the changes! It looks great! Few comments. 1. Let's use "upgrade" instead of "update" everywhere. So states should say "Upgrade available".2. When uninstalling azure-skills of Copilot, it shows extra message of "Successfully uninstalled plugin: azure (scope: user)" but this is redundant because we show the message right above it with the "Done" state. Can we remove this line?
3. The purple checkmarks are rendered on top of the square brackets. Can we use the same checkmark we use when showing "Done" state?
It should look like below screen:
|
Azure Dev CLI Install InstructionsInstall scriptsMacOS/Linux
bash: pwsh: WindowsPowerShell install MSI install Standalone Binary
MSI
Documentationlearn.microsoft.com documentationtitle: Azure Developer CLI reference
|
| spinner := uxlib.NewSpinner(&uxlib.SpinnerOptions{ | ||
| Text: spinnerText, | ||
| ClearOnStop: true, | ||
| }) |
| if status != nil { | ||
| currentVer = status.InstalledVersion | ||
| for _, h := range status.SkillAgents { | ||
| skillAgents = append(skillAgents, SkillAgentUpdate{ | ||
| Agent: h.Agent, | ||
| CurrentVersion: h.Version, | ||
| UpdateAvailable: isNewerVersion(latestVer, h.Version), | ||
| }) | ||
| } | ||
| } |
| for _, s := range statuses { | ||
| latest, ok := candidates[s.Tool.Id] | ||
| if ok && s.Installed && isNewerVersion(latest, s.InstalledVersion) { | ||
| if !ok || !s.Installed { | ||
| continue | ||
| } | ||
| // Count a skill whose first agent is current but another agent is stale | ||
| // (anyAgentUpdatable), as well as the plain single-version case. | ||
| if isNewerVersion(latest, s.InstalledVersion) || | ||
| anyAgentUpdatable(latest, s.SkillAgents) { |















Fix #8990
Figma: https://www.figma.com/design/3Fn9kwKZfODgwoq7H3yMSx/Azd-tool-commands?node-id=1-2&p=f&t=tr6lqYfeAox5Y6sn-0
Implements the new UX design for the
azd toolcommand family, making agent/skillterminology, progress rendering, and version reporting consistent across
install,upgrade,list, andcheck.Changes
azd tool install(skills)--host→--agentacross flags, descriptions, and messages. Split the internal notionof an agent host into a display
Host(e.g. "GitHub Copilot CLI") and an execCommand(e.g.
copilot), so commands run against the binary while the UI shows the friendly name.Tip:line, and add a multi-select prompt to choose agent(s).azd provision), keeping the spinner pinnedwhile the host CLI streams output or prompts interactively.
azd tool upgrade--allflag and an interactive multi-select of installed tools, mirroringazd tool install.detected before vs. after the upgrade.
Tool is upgraded to v2.0.0.orTool is already up to date (v1.1.75).azd tool list/azd tool checkcheckprints upgrade hints(
azd tool upgrade <id>/azd tool upgrade --all).Testing
go build ./...go test ./cmd/... ./pkg/tool/...gofmt,golangci-lint,cspellTestUsage/TestFigSpecsnapshots.