Handle AppHost path config guardrails#16467
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 16467Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 16467" |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds guardrails around AppHost path configuration so users can’t set it via global CLI settings or aspire config set, while keeping aspire.config.json’s appHost.path valid and updating the VS Code extension to consume the CLI’s camelCase JSON output.
Changes:
- Add an AppHost path policy and enforce it in
config set, plus warn when global settings contain an AppHost path key. - Hide legacy
appHostPathfrom generated settings schemas while retainingappHost.pathforaspire.config.json. - Update VS Code extension config-info types/schema generation to use camelCase JSON fields.
Reviewed changes
Copilot reviewed 25 out of 27 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/Aspire.Cli.Tests/ProgramTests.cs | Adds tests validating startup warning behavior for global settings containing AppHost path. |
| tests/Aspire.Cli.Tests/Configuration/AppHostPathConfigurationPolicyTests.cs | Adds unit tests for blocked key detection and JSON scanning for AppHost path keys. |
| tests/Aspire.Cli.Tests/Commands/SettingsSchemaBuilderTests.cs | Verifies legacy appHostPath is excluded from settings schemas while config file schema retains appHost.path. |
| tests/Aspire.Cli.Tests/Commands/ConfigCommandTests.cs | Adds tests ensuring config set rejects AppHost path keys but still allows appHost.language. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.zh-Hant.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.zh-Hans.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.tr.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.ru.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.pt-BR.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.pl.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.ko.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.ja.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.it.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.fr.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.es.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.de.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/xlf/ErrorStrings.cs.xlf | Adds localized string entries for new AppHost path guardrail messages. |
| src/Aspire.Cli/Resources/ErrorStrings.resx | Adds new resource strings for blocking config set AppHost path and warning on global AppHost path. |
| src/Aspire.Cli/Resources/ErrorStrings.Designer.cs | Adds strongly-typed accessors for the new resource strings. |
| src/Aspire.Cli/Program.cs | Adds startup warning when global settings file contains an AppHost path key. |
| src/Aspire.Cli/Configuration/HiddenFromConfigurationSchemaAttribute.cs | Introduces attribute to hide config properties from schema generation. |
| src/Aspire.Cli/Configuration/AspireJsonConfiguration.cs | Marks legacy appHostPath as hidden from generated schemas. |
| src/Aspire.Cli/Configuration/AppHostPathConfigurationPolicy.cs | Adds shared policy logic for detecting/identifying AppHost path config keys. |
| src/Aspire.Cli/Commands/SettingsSchemaBuilder.cs | Skips schema generation for properties marked as hidden. |
| src/Aspire.Cli/Commands/ConfigCommand.cs | Blocks setting AppHost path keys via aspire config set. |
| extension/src/utils/configInfoProvider.ts | Updates logging to use camelCase JSON fields from aspire config info --json. |
| extension/src/types/configInfo.ts | Renames TypeScript types to camelCase to match CLI JSON output. |
| extension/src/commands/openSettings.ts | Uses camelCase fields when opening local/global settings paths. |
| extension/src/commands/do.ts | Uses camelCase capabilities field for CLI capability checks. |
| extension/scripts/generate-schema.js | Updates schema generator to consume camelCase config info output. |
| extension/schemas/aspire-settings.schema.json | Regenerates local settings schema (removes legacy appHostPath; updates feature flags). |
| extension/schemas/aspire-global-settings.schema.json | Regenerates global settings schema (keeps appHostPath excluded; updates feature flags). |
| extension/schemas/aspire-config.schema.json | Regenerates config file schema (includes appHost object shape; updates feature flags). |
| .gitignore | Ignores .worktrees/ directory. |
Files not reviewed (1)
- src/Aspire.Cli/Resources/ErrorStrings.Designer.cs: Language not supported
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
adamint
left a comment
There was a problem hiding this comment.
Found 3 issues: 2 correctness issues and 1 test coverage issue.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
|
JamesNK
left a comment
There was a problem hiding this comment.
Clean PR — 1 minor UX nit on error message ordering in ConfigCommand.SetCommand.ExecuteAsync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Description
Warns when global settings contain an AppHost path, rejects global AppHost path settings and the legacy flat
appHostPathkey throughaspire config set, and hides the legacy flatappHostPathsetting from generated settings schemas.Local
aspire.config.jsoncontinues to supportappHost.path, including when set throughaspire config set appHost.path ....Fixes #15490
Validation:
dotnet test --project tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-class "*.AppHostPathConfigurationPolicyTests" --filter-class "*.ConfigCommandTests" --filter-class "*.SettingsSchemaBuilderTests" --filter-class "*.ProgramTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"dotnet test --project tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-class "*.ConfigurationServiceTests" --filter-class "*.ConfigurationHelperTests" --filter-class "*.AspireConfigFileTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"dotnet build /t:UpdateXlf src/Aspire.Cli/Aspire.Cli.csproj./build.sh --build /p:SkipNativeBuild=truedotnet test --project tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-class "*.SettingsSchemaBuilderTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"after reverting the extension config-info casing changesdotnet test --project tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-class "*.ConfigCommandTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"after allowing localappHost.pathdotnet test --project tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj --no-launch-profile -- --filter-class "*.AppHostPathConfigurationPolicyTests" --filter-class "*.SettingsSchemaBuilderTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"Checklist
<remarks />and<code />elements on your triple slash comments?aspire.devissue: