diff --git a/cli/azd/extensions/azure.ai.agents/README.md b/cli/azd/extensions/azure.ai.agents/README.md index 4c0125105b5..15726ba1cf7 100644 --- a/cli/azd/extensions/azure.ai.agents/README.md +++ b/cli/azd/extensions/azure.ai.agents/README.md @@ -2,7 +2,34 @@ ## Preview feature opt-ins -Three capabilities are independently disabled by default: +Three capabilities are independently disabled by default. + +Run `azd ai agent list-alpha` to see every available agent preview feature and its +effective status, including disabled features. Use `--environment ` (`-e`) +to read a specific environment. The command is always available and follows the +default `azd config list-alpha` format: + +```text +Name: agents.long_running +Description: Start background Responses invocations. +Status: Off + +Name: agents.managed_harness +Description: Use a Microsoft Copilot harness with prompt agents. +Status: Off + +Name: agents.voice +Description: Use managed voice agents and hosted voice bridges. +Status: Off +``` + +Records are sorted by feature ID. Each status uses the same opt-in checks as +agent operations and is either `On` or `Off`. The command ignores +`alpha.all` and does not list core-only features. Without a project +or default environment, available sources still apply. Explicit invalid +environments and source-loading errors fail before any records are printed. +The command adds no authentication, prompts, or configuration writes; existing +host project/environment loading behavior still applies. | Feature ID | Scope | Environment variable | | --- | --- | --- | diff --git a/cli/azd/extensions/azure.ai.agents/docs/specs/preview-feature-flags.md b/cli/azd/extensions/azure.ai.agents/docs/specs/preview-feature-flags.md index 9e4acb96719..1aaf70c7936 100644 --- a/cli/azd/extensions/azure.ai.agents/docs/specs/preview-feature-flags.md +++ b/cli/azd/extensions/azure.ai.agents/docs/specs/preview-feature-flags.md @@ -25,7 +25,7 @@ azure.ai.agents/ │ ├── cmd/ # Command discovery and runtime callers │ ├── project/ # Definition classification and callers │ └── featureflags/ -│ ├── agents.go # Identities and thin Require check +│ ├── agents.go # Catalog and thin Require check │ ├── featureflags.go # Validation, source reads, evaluation │ └── featureflags_test.go # Source combinations and regressions └── docs/specs/ @@ -44,10 +44,13 @@ Keep validation, reads, and small evaluation helpers together in one implementat ```go type Feature struct { - ID string - EnvVar string + ID string + Description string + EnvVar string } +func List() []Feature + func IsEnabled( ctx context.Context, client *azdext.AzdClient, @@ -82,6 +85,33 @@ azd env set AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE true The [README](../../README.md#preview-feature-opt-ins) lists the equivalent commands for all three capabilities. +### Listing preview features + +`azd ai agent list-alpha` is always available, including when all gates are off. +`List` returns copies of all three declarations sorted by ID, with descriptions +defined alongside their IDs and environment keys. The command calls `IsEnabled` +for each declaration with the parsed `ExtensionContext.Environment`; it does +not consult core's feature manager or infer a catalog from configured values. + +Output matches the default `azd config list-alpha` shape: `Name: `, +`Description: `, and `Status: On` or `Status: Off`, with blank lines +between records and a final newline. All statuses are resolved before anything +is printed to the Cobra command's injected writer. A later source error +therefore cannot leave earlier records looking like a successful partial list. +Writer failures also propagate. + +`alpha.all` is ignored: setting it alone leaves all three statuses `Off`. +`agents.hosted` and core-only features are absent. The only supported output +format is `default`; unsupported explicit formats, including an empty value, +and positional arguments fail before source reads. Existing global flags and +SDK help, completion, and metadata behavior are preserved. + +The command adds no cloud calls, authentication, prompts, writes, or +feature-specific telemetry. It inherits the optional-scope/error contract +below. Existing host project/environment loaders may still have their own +environment-selection or state-loading behavior; this is not a host-wide +no-side-effects guarantee. + ## Documented enablement methods The documented ways to opt into a feature are listed below. These opt-ins are additive: any enabling value is sufficient. @@ -126,7 +156,7 @@ An explicit HTTP `--agent-endpoint` carries no kind or harness information. It r Read, show, endpoint discovery, invocation show/follow/cancel, delete, and down retain access when opt-ins are disabled. There is no state migration or automatic enablement. Agents-private checks do **not** intercept evaluations or routines sending generic requests to existing agents. Those extensions cannot import this package, and this design makes no cross-extension enforcement claim. -The small API deliberately returns only an enablement decision and error, not a source report, registry entry, or policy object. OR semantics avoid accidental disabling by unrelated scopes, at the cost of having no local override for an existing opt-in. Exact optional-error matching avoids swallowing real failures but remains coupled to the existing host error contract. +The evaluator deliberately returns only an enablement decision and error, not a source report, registry entry, or policy object. The listing accessor exposes declarations, not source provenance. OR semantics avoid accidental disabling by unrelated scopes, at the cost of having no local override for an existing opt-in. Exact optional-error matching avoids swallowing real failures but remains coupled to the existing host error contract. Disabled capabilities return the structured `feature_not_enabled` compatibility error with the exact per-feature config/environment enable commands. Explicit preview inputs are rejected rather than silently dropped. Enabling one capability does not enable another. @@ -136,4 +166,10 @@ Tests cover source combinations, all supported boolean spellings and non-enablin Command/provider regressions additionally cover independent gates, obsolete hosted opt-in isolation, selected-environment forwarding, voice discovery, explicit init/add inputs, staged manifests, local invocation bypasses, unchanged inputs on disabled-feature rejection, ordinary flows, and retained read access. +Listing regressions cover the complete sorted catalog, independent statuses from +each source despite `alpha.all=on`, ignored global values, the exact record format, +selected/default/explicit-empty environment forwarding, optional scopes, and +source or writer failures without partial source-success output. Help and +metadata advertise the command and its contextual enable examples. + Run offline tests, build, vet, and scoped lint against the pinned SDK. Tier 0 scenarios document the new opt-in UX; they require a separate scenario-run request. No Azure scenario execution or user auth/config mutation is needed for unit validation. diff --git a/cli/azd/extensions/azure.ai.agents/internal/cmd/help_test.go b/cli/azd/extensions/azure.ai.agents/internal/cmd/help_test.go index 70499566a8e..c4d515feb1a 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/cmd/help_test.go +++ b/cli/azd/extensions/azure.ai.agents/internal/cmd/help_test.go @@ -82,7 +82,9 @@ func TestAgentHelpColor(t *testing.T) { color.NoColor = false t.Cleanup(func() { color.NoColor = previous }) - for _, path := range [][]string{nil, {"init"}, {"invoke"}, {"files", "list"}, {"optimize"}, {"eval", "show"}} { + for _, path := range [][]string{ + nil, {"init"}, {"invoke"}, {"list-alpha"}, {"files", "list"}, {"optimize"}, {"eval", "show"}, + } { t.Run(strings.Join(path, "_"), func(t *testing.T) { root := NewRootCommand() var buf bytes.Buffer diff --git a/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha.go b/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha.go new file mode 100644 index 00000000000..4625f072189 --- /dev/null +++ b/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha.go @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package cmd + +import ( + "fmt" + "strings" + + "azureaiagent/internal/exterrors" + "azureaiagent/internal/featureflags" + + "github.com/azure/azure-dev/cli/azd/pkg/azdext" + "github.com/spf13/cobra" +) + +func newListAlphaCommand(extCtx *azdext.ExtensionContext) *cobra.Command { + extCtx = ensureExtensionContext(extCtx) + cmd := &cobra.Command{ + Use: "list-alpha", + Short: "Display all available agent preview features and their status.", + Long: `Display all declared agent preview features, including disabled features, +sorted by name. Each entry includes its name, description, and On or Off status, +matching the default format of 'azd config list-alpha'. + +Status uses the same opt-in checks as agent operations. Enable individual +features through user config, the process environment, or the selected azd +environment (-e). An enabling value turns a feature on; false does not override +another opt-in. +Only alpha. config keys apply; alpha.all does not enable agent previews. + +Without a project or default environment, the available sources still apply. +An invalid explicit environment or a source read error fails without printing +feature records. This command is always available and needs no preview opt-in.`, + Example: fmt.Sprintf(` # List every agent preview feature and its effective status + azd ai agent list-alpha + + # Read values from a specific environment + azd ai agent list-alpha --environment dev + + # Enable voice through user config + azd config set alpha.%s on + + # Alternatively, enable voice in the selected environment + azd env set %s true`, featureflags.Voice.ID, featureflags.Voice.EnvVar), + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + client, err := azdext.NewAzdClient() + if err != nil { + return exterrors.Internal( + exterrors.CodeAzdClientFailed, + fmt.Sprintf("connecting to azd to list preview features: %s", err), + ) + } + defer client.Close() + + features := featureflags.List() + records := make([]string, 0, len(features)) + for _, feature := range features { + enabled, err := featureflags.IsEnabled(cmd.Context(), client, feature, extCtx.Environment) + if err != nil { + return err + } + status := "Off" + if enabled { + status = "On" + } + records = append(records, fmt.Sprintf( + "Name: %s\nDescription: %s\nStatus: %s", feature.ID, feature.Description, status, + )) + } + + if _, err := fmt.Fprintln(cmd.OutOrStdout(), strings.Join(records, "\n\n")); err != nil { + return fmt.Errorf("writing preview feature list: %w", err) + } + return nil + }, + } + azdext.RegisterFlagOptions(cmd, azdext.FlagOptions{ + Name: "output", + AllowedValues: []string{"default"}, + Default: "default", + }) + return cmd +} diff --git a/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha_test.go b/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha_test.go new file mode 100644 index 00000000000..cfb812232ac --- /dev/null +++ b/cli/azd/extensions/azure.ai.agents/internal/cmd/list_alpha_test.go @@ -0,0 +1,379 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package cmd + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "strings" + "sync/atomic" + "testing" + + "azureaiagent/internal/exterrors" + "azureaiagent/internal/featureflags" + + "github.com/azure/azure-dev/cli/azd/pkg/azdext" + "github.com/azure/azure-dev/cli/azd/pkg/environment" + "github.com/azure/azure-dev/cli/azd/pkg/environment/azdcontext" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +const listAlphaOutput = `Name: agents.long_running +Description: Start background Responses invocations. +Status: %s + +Name: agents.managed_harness +Description: Use a Microsoft Copilot harness with prompt agents. +Status: %s + +Name: agents.voice +Description: Use managed voice agents and hosted voice bridges. +Status: %s +` + +func TestListAlphaCommandSources(t *testing.T) { + for _, source := range []string{"process", "dotenv", "config", "service"} { + for mask := range 8 { + t.Run(fmt.Sprintf("%s/%03b", source, mask), func(t *testing.T) { + clearPreviewProcess(t) + agents := map[string]any{"hosted": "on"} + alpha := map[string]any{"agents": agents, "all": "on", "core-only": "on"} + config := &azdext.ProjectConfig{Services: map[string]*azdext.ServiceConfig{ + "web": {Host: "appservice", Environment: map[string]string{}}, + "api": {Host: "containerapp", Environment: map[string]string{}}, + }} + var values []*azdext.KeyValue + var statuses []string + for i, feature := range featureflags.List() { + enabled := mask&(1< config keys apply; alpha.all does not enable agent previews. + +Without a project or default environment, the available sources still apply. +An invalid explicit environment or a source read error fails without printing +feature records. This command is always available and needs no preview opt-in. + +Usage + azd ai agent list-alpha [flags] + +Global Flags + -C, --cwd string : Sets the current working directory + --debug : Enables debug and diagnostics logging + -e, --environment string : The name of the environment to use + -h, --help : help for list-alpha + --no-prompt : Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically. + -o, --output string : The output format (supported: default) (default "default") + +Examples + List every agent preview feature and its effective status + azd ai agent list-alpha + + Read values from a specific environment + azd ai agent list-alpha --environment dev + + Enable voice through user config + azd config set alpha.agents.voice on + + Alternatively, enable voice in the selected environment + azd env set AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE true diff --git a/cli/azd/extensions/azure.ai.agents/internal/cmd/testdata/TestAgentHelp-root.snap b/cli/azd/extensions/azure.ai.agents/internal/cmd/testdata/TestAgentHelp-root.snap index b4e88178c7d..ceeca7a4d17 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/cmd/testdata/TestAgentHelp-root.snap +++ b/cli/azd/extensions/azure.ai.agents/internal/cmd/testdata/TestAgentHelp-root.snap @@ -26,6 +26,7 @@ Available Commands init : Initialize a new prompt, hosted, or voice agent project. (Preview) invocations : Inspect and manage work created by invoking an agent. invoke : Send a message to your prompt or hosted agent. + list-alpha : Display all available agent preview features and their status. monitor : Monitor logs from a hosted agent. optimize : Evaluate and optimize AI agents. pack : Build a ready-to-sideload Teams app package for an activity agent. diff --git a/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents.go b/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents.go index a4723f83094..da82426c9d8 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents.go +++ b/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents.go @@ -4,9 +4,11 @@ package featureflags import ( + "cmp" "context" "fmt" "os" + "slices" "azureaiagent/internal/exterrors" @@ -16,21 +18,33 @@ import ( var ( // ManagedHarness controls prompt agents using a Copilot harness. ManagedHarness = Feature{ - ID: "agents.managed_harness", - EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_MANAGED_HARNESS", + ID: "agents.managed_harness", + Description: "Use a Microsoft Copilot harness with prompt agents.", + EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_MANAGED_HARNESS", } // Voice controls managed voice and hosted voice agents. Voice = Feature{ - ID: "agents.voice", - EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE", + ID: "agents.voice", + Description: "Use managed voice agents and hosted voice bridges.", + EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE", } // LongRunning controls starting background Responses invocations. LongRunning = Feature{ - ID: "agents.long_running", - EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_LONG_RUNNING", + ID: "agents.long_running", + Description: "Start background Responses invocations.", + EnvVar: "AZD_FOUNDRY_EXT_ENABLE_AGENTS_LONG_RUNNING", } ) +// List returns independent copies of all features, sorted by ID. +func List() []Feature { + features := []Feature{ManagedHarness, Voice, LongRunning} + slices.SortFunc(features, func(a, b Feature) int { + return cmp.Compare(a.ID, b.ID) + }) + return features +} + type environmentKey struct{} // WithEnvironment preserves the SDK environment for nested calls. diff --git a/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents_test.go b/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents_test.go index 69299a25571..058f77e3f35 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents_test.go +++ b/cli/azd/extensions/azure.ai.agents/internal/featureflags/agents_test.go @@ -13,6 +13,25 @@ import ( "github.com/stretchr/testify/require" ) +func TestList(t *testing.T) { + features := List() + require.Equal(t, []Feature{LongRunning, ManagedHarness, Voice}, features) + require.Equal(t, []string{ + "agents.long_running", "agents.managed_harness", "agents.voice", + }, []string{features[0].ID, features[1].ID, features[2].ID}) + require.Equal(t, []string{ + "AZD_FOUNDRY_EXT_ENABLE_AGENTS_LONG_RUNNING", + "AZD_FOUNDRY_EXT_ENABLE_AGENTS_MANAGED_HARNESS", + "AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE", + }, []string{features[0].EnvVar, features[1].EnvVar, features[2].EnvVar}) + for _, feature := range features { + require.NotEmpty(t, feature.Description) + } + + features[0] = Feature{ID: "changed", Description: "changed", EnvVar: "CHANGED"} + require.Equal(t, []Feature{LongRunning, ManagedHarness, Voice}, List()) +} + func TestAgentPreviewFourSourceCombinations(t *testing.T) { for _, feature := range []Feature{ManagedHarness, Voice, LongRunning} { for mask := range 16 { diff --git a/cli/azd/extensions/azure.ai.agents/internal/featureflags/featureflags.go b/cli/azd/extensions/azure.ai.agents/internal/featureflags/featureflags.go index 50d95e1f92b..44b8f235c4d 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/featureflags/featureflags.go +++ b/cli/azd/extensions/azure.ai.agents/internal/featureflags/featureflags.go @@ -25,6 +25,8 @@ import ( type Feature struct { // ID is the user config key under alpha. ID string + // Description explains the capability enabled by this feature. + Description string // EnvVar is the exact environment key read for this feature. EnvVar string } diff --git a/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/README.md b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/README.md index 44eab4c48bb..ae4e844409a 100644 --- a/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/README.md +++ b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/README.md @@ -345,6 +345,7 @@ in any order, any time. | `tier0/0.28-agent-add-multiple-projects.yaml` | `agent add` rejects multiple Project services before mutation | | `tier0/0.29-agent-add-path-safety.yaml` | `agent add` rejects definition and source paths outside the project | | `tier0/0.30-agent-add-wrong-host-collision.yaml` | `agent add` rejects a target service key owned by a non-Agent host without mutating `azure.yaml` | +| `tier0/0.32-list-alpha.yaml` | `list-alpha` complete sorted preview catalog, effective statuses, record format, and enable guidance | The invocation lifecycle scenarios above are offline help/validation checks, not live execution tests. They do not require a deployed long-running agent or add Tier 2 provisioning dependencies. Actual HTTP @@ -519,7 +520,7 @@ grouping — colons are treated as ordinary characters by the filter): | Namespace | Values | Meaning | |---|---|---| | `tier:N` | `tier:0`, `tier:1`, `tier:1b`, `tier:2` | The tier the scenario belongs to (same axis as the directory's four sections above). Use this to express cost / auth profile in one tag. | -| `cmd:*` | `cmd:init`, `cmd:show`, `cmd:invoke`, `cmd:invocations`, `cmd:sessions`, `cmd:files`, `cmd:state-stores`, `cmd:monitor`, `cmd:endpoint`, `cmd:run`, `cmd:doctor`, `cmd:eval`, `cmd:optimize`, `cmd:sample`, `cmd:down`, `cmd:provision`, `cmd:deploy`, `cmd:version`, `cmd:help`, `cmd:code`, `cmd:delete`, `cmd:toolbox`, `cmd:connection`, `cmd:add` | The top-level `azd ai agent` (or `azd`) command(s) the scenario exercises. Multi-command scenarios (e.g. `2.12-run-local-and-invoke-local` runs both `run` and `invoke --local`; `2.00-setup` runs `init` + `provision` + `deploy`) carry multiple `cmd:*` tags. `cmd:add` tags the Agent add command; `cmd:toolbox` and `cmd:connection` cover Agent dependency composition, not the sibling extensions' resource lifecycle commands. | +| `cmd:*` | `cmd:init`, `cmd:show`, `cmd:invoke`, `cmd:invocations`, `cmd:sessions`, `cmd:files`, `cmd:state-stores`, `cmd:monitor`, `cmd:endpoint`, `cmd:run`, `cmd:doctor`, `cmd:eval`, `cmd:optimize`, `cmd:sample`, `cmd:down`, `cmd:provision`, `cmd:deploy`, `cmd:version`, `cmd:help`, `cmd:code`, `cmd:delete`, `cmd:toolbox`, `cmd:connection`, `cmd:add`, `cmd:list-alpha` | The top-level `azd ai agent` (or `azd`) command(s) the scenario exercises. Multi-command scenarios (e.g. `2.12-run-local-and-invoke-local` runs both `run` and `invoke --local`; `2.00-setup` runs `init` + `provision` + `deploy`) carry multiple `cmd:*` tags. `cmd:add` tags the Agent add command; `cmd:toolbox` and `cmd:connection` cover Agent dependency composition, not the sibling extensions' resource lifecycle commands. | | traits | `parallel-safe`, `serial-only`, `negative-path`, `picker`, `verify-deploy`, `manual-seed` | `parallel-safe` ↔ `serial-only` are mutually exclusive: all Tier 0 / Tier 1 / Tier 1b scenarios are `parallel-safe`, all Tier 2 are `serial-only`. `negative-path` flags arg-/CLI-validation scenarios that assert errors or non-zero exit codes rather than happy-path success. `picker` flags scenarios whose primary purpose is exercising interactive picker UX. `verify-deploy` flags Tier 1b scenarios that verify a Tier 1 scaffold deploys. `manual-seed` flags an opt-in scenario that needs an externally prepared fixture before it runs; filtering by this tag does not create the fixture. | The tool returns matching `manual-seed` rows, but runner plans exclude them diff --git a/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.02-help-root.yaml b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.02-help-root.yaml index d87a3ab4b8f..1ebe5d6460d 100644 --- a/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.02-help-root.yaml +++ b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.02-help-root.yaml @@ -6,7 +6,7 @@ tags: ["tier:0", "cmd:help", "parallel-safe"] goals: - "Wait for the help output to render (it includes an ASCII-art banner and a 'Usage' section)." - - "Confirm the 'Available Commands' list includes: code, delete, doctor, endpoint, eval, files, init, invocations, invoke, monitor, optimize, pack, publish, run, sample, sessions, show, version." + - "Confirm the 'Available Commands' list includes: code, delete, doctor, endpoint, eval, files, init, invocations, invoke, list-alpha, monitor, optimize, pack, publish, run, sample, sessions, show, version." - "Confirm the global flags are listed: --cwd/-C, --debug, --environment/-e, --no-prompt, --output/-o." - "Confirm the Environments & Environment Variables section explains .azure//.env, azd env new/select/set/get-values, FOUNDRY_PROJECT_ENDPOINT, AGENT_ deployment values, and the service-level env mapping for runtime settings." - "Compare root, init, and files list help: headings should be consistently bold and underlined, command examples and flags highlighted, and usage paths start with azd ai agent. With NO_COLOR=1, the same content must remain readable without escape sequences." diff --git a/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.32-list-alpha.yaml b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.32-list-alpha.yaml new file mode 100644 index 00000000000..eb24c38ac2f --- /dev/null +++ b/cli/azd/extensions/azure.ai.agents/tests/cli-interactive-tester-scenarios/tier0/0.32-list-alpha.yaml @@ -0,0 +1,21 @@ +# Tier 0: agent preview feature discovery; no auth or Azure cost. +name: "list-alpha" +command: "azd ai agent list-alpha --no-prompt" +cwd: "/tmp" +tags: ["tier:0", "cmd:list-alpha", "parallel-safe"] +env: + NO_COLOR: "1" + AZURE_DEV_COLLECT_TELEMETRY: "no" + AZD_ENVIRONMENT: "" + AZURE_ENV_NAME: "" + AZD_FOUNDRY_EXT_ENABLE_AGENTS_LONG_RUNNING: "true" + AZD_FOUNDRY_EXT_ENABLE_AGENTS_MANAGED_HARNESS: "true" + AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE: "true" +goals: + - "Confirm the command exits with code 0 without a login prompt, picker, Azure request, or project/configuration write." + - "Confirm exactly three feature records appear, ordered by Name: agents.long_running, agents.managed_harness, agents.voice." + - "Confirm each record has exactly Name, Description, and Status lines, with a nonempty description and Status: On. Records must be separated by blank lines, matching the default azd config list-alpha shape." + - "Confirm alpha.all, agents.hosted, core-only features, raw environment values, and terminal escape sequences are absent from the listing." + - "Run 'azd ai agent list-alpha --help'; confirm the help explains disabled-feature listing, --environment selection, additive opt-in sources, and that alpha.all cannot enable agent previews, and includes 'azd config set alpha.agents.voice on' and 'azd env set AZD_FOUNDRY_EXT_ENABLE_AGENTS_VOICE true'." + - "Take a screenshot of the feature listing." + - "Report a finding if a feature is missing or unsorted, a status ignores the supplied true process values, the record format differs, help omits enable guidance, or the command prompts, writes configuration, or contacts Azure."