diff --git a/cli/azd/cmd/env.go b/cli/azd/cmd/env.go index 20918413453..d4bd9ff2612 100644 --- a/cli/azd/cmd/env.go +++ b/cli/azd/cmd/env.go @@ -697,39 +697,78 @@ func newEnvSetSecretAction( func newEnvSelectCmd() *cobra.Command { return &cobra.Command{ - Use: "select ", + Use: "select []", Short: "Set the default environment.", - Args: cobra.ExactArgs(1), + Args: cobra.MaximumNArgs(1), } } type envSelectAction struct { azdCtx *azdcontext.AzdContext envManager environment.Manager + console input.Console args []string } -func newEnvSelectAction(azdCtx *azdcontext.AzdContext, envManager environment.Manager, args []string) actions.Action { +func newEnvSelectAction( + azdCtx *azdcontext.AzdContext, + envManager environment.Manager, + console input.Console, + args []string, +) actions.Action { return &envSelectAction{ azdCtx: azdCtx, envManager: envManager, + console: console, args: args, } } func (e *envSelectAction) Run(ctx context.Context) (*actions.ActionResult, error) { - _, err := e.envManager.Get(ctx, e.args[0]) + var environmentName string + + // If no argument provided, prompt the user to select an environment + if len(e.args) == 0 { + envs, err := e.envManager.List(ctx) + if err != nil { + return nil, fmt.Errorf("listing environments: %w", err) + } + + if len(envs) == 0 { + return nil, fmt.Errorf("no environments found. You can create one with \"azd env new \"") + } + + // Build list of environment names + envNames := make([]string, len(envs)) + for i, env := range envs { + envNames[i] = env.Name + } + + selection, err := e.console.Select(ctx, input.ConsoleOptions{ + Message: "Select an environment:", + Options: envNames, + }) + if err != nil { + return nil, fmt.Errorf("selecting environment: %w", err) + } + + environmentName = envNames[selection] + } else { + environmentName = e.args[0] + } + + _, err := e.envManager.Get(ctx, environmentName) if errors.Is(err, environment.ErrNotFound) { return nil, fmt.Errorf( `environment '%s' does not exist. You can create it with "azd env new %s"`, - e.args[0], - e.args[0], + environmentName, + environmentName, ) } else if err != nil { return nil, fmt.Errorf("ensuring environment exists: %w", err) } - if err := e.azdCtx.SetProjectState(azdcontext.ProjectState{DefaultEnvironment: e.args[0]}); err != nil { + if err := e.azdCtx.SetProjectState(azdcontext.ProjectState{DefaultEnvironment: environmentName}); err != nil { return nil, fmt.Errorf("setting default environment: %w", err) } diff --git a/cli/azd/cmd/testdata/TestFigSpec.ts b/cli/azd/cmd/testdata/TestFigSpec.ts index fbcec8a3821..11f41f1eb82 100644 --- a/cli/azd/cmd/testdata/TestFigSpec.ts +++ b/cli/azd/cmd/testdata/TestFigSpec.ts @@ -535,6 +535,7 @@ const completionSpec: Fig.Spec = { description: 'Set the default environment.', args: { name: 'environment', + isOptional: true, generators: azdGenerators.listEnvironments, }, }, diff --git a/cli/azd/cmd/testdata/TestUsage-azd-env-select.snap b/cli/azd/cmd/testdata/TestUsage-azd-env-select.snap index a30b0d792a9..9322a4fcbb6 100644 --- a/cli/azd/cmd/testdata/TestUsage-azd-env-select.snap +++ b/cli/azd/cmd/testdata/TestUsage-azd-env-select.snap @@ -2,7 +2,7 @@ Set the default environment. Usage - azd env select [flags] + azd env select [] [flags] Global Flags -C, --cwd string : Sets the current working directory. diff --git a/cli/azd/extensions/azure.ai.agents/go.mod b/cli/azd/extensions/azure.ai.agents/go.mod index 78453895d53..d7f8a573c55 100644 --- a/cli/azd/extensions/azure.ai.agents/go.mod +++ b/cli/azd/extensions/azure.ai.agents/go.mod @@ -17,6 +17,7 @@ require ( github.com/google/uuid v1.6.0 github.com/mark3labs/mcp-go v0.41.1 github.com/spf13/cobra v1.10.1 + github.com/spf13/pflag v1.0.10 go.yaml.in/yaml/v3 v3.0.4 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 @@ -75,7 +76,6 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/spf13/pflag v1.0.10 // indirect github.com/stretchr/testify v1.11.1 // indirect github.com/theckman/yacspin v0.13.12 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect