Skip to content

Sync Aspire CLI config schemas through 13.6.0 and fix config docs - #1814

Merged
David Pine (IEvangelist) merged 4 commits into
microsoft:mainfrom
IEvangelist:ievangelist-fix-cli-config-schema-13-6
Oct 5, 2026
Merged

David Pine (IEvangelist) merged 4 commits into
microsoft:mainfrom
IEvangelist:ievangelist-fix-cli-config-schema-13-6

Conversation

@IEvangelist

@IEvangelist David Pine (IEvangelist) commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Summary

The aspire.config.json schema on aspire.dev stopped at 13.3.0, so /reference/cli/configuration/schema.json served an outdated schema. The CLI configuration docs had also drifted from the 13.6.0 CLI. This PR syncs the schema for every stable microsoft/aspire release through 13.6.0, keeps it in sync automatically, and corrects the config docs.

Schemas

  • Adds the schema for every stable release from 13.2.0 through 13.6.0: 22 new files, 24 versions in total. latest now points to 13.6.0 instead of 13.3.0.
  • Each file is generated from that release's own CLI. The sync installs the Aspire.Cli tool at the release version, reads aspire config info --json, and converts the output the same way upstream's extension/scripts/generate-schema.js does. $id is set to the file's aspire.dev URL.
  • Upstream's checked-in extension/schemas/aspire-config.schema.json is stale at the 13.3.x and 13.4.x tags. Starting with 13.3.0, the CLI emits camelCase JSON. The generator at those tags still read PascalCase, so it exited without writing anything, and the checked-in file kept the 13.2 content. 13.5.0 fixed the generator.
    • For 13.2.x, 13.5.x, and 13.6.0, the generated files are identical to upstream's checked-in file at each tag, apart from $id.
    • For 13.3.x and 13.4.x, the generated files follow what those CLIs actually accept. This also corrects the existing 13.3.0 file, which was a copy of the stale upstream file. That's the only change to a schema published before this PR, and it's there because the file didn't match the 13.3.0 CLI.
  • Schema changes by release:
    • 13.3.0 adds docs.llmsTxtUrl, docs.api.sitemapUrl, and features.nugetSignatureVerificationEnabled.
    • 13.4.0 adds features.aspireSkillsRemoteFetchEnabled and removes features.execCommandEnabled.
    • 13.5.0 adds features.polyglotIntegrationFilterEnabled and features.terminalCommandsEnabled, and hides features.aspireSkillsRemoteFetchEnabled.
    • 13.6.0 adds certificates.nssDbPaths and removes features.terminalCommandsEnabled.

Automation

  • scripts/update-schemas.ts now lists microsoft/aspire releases and generates the schema for each stable release from 13.2.0 on, including the v13.4.4-release tag form. For each missing version, it installs that Aspire.Cli version into a temporary directory with dotnet tool install, runs aspire config info --json, and generates the schema from the output. It skips versions it already has, keeps index.json sorted with latest set to the newest version, and fails when a release can't be installed or read. --version <version> generates a single version. The script now requires the .NET SDK, which the updater workflow already installs.
  • pnpm update:all now ends with pnpm update:schemas, so the daily Integration Data Updater workflow picks up new releases. The workflow's git add list and the updater script's allowed paths and PR body now include src/frontend/src/data/schemas/.
  • A release's schema never changes after it ships. The sync script never re-fetches or overwrites an existing versioned schema, and the updater's scope check fails if a run modifies, deletes, or renames one. New schema files and index.json updates are still allowed.

Tests

  • cli-config-schema.vitest.test.ts checks that index.json versions are unique and sorted, that latest is the newest version, and that every schema file is indexed. The structured-data suite now includes this file, so the updater validates schema changes before it opens a PR.
  • update-integrations.vitest.test.ts checks the schema sync wiring in update:all, the structured-data config, the updater's allowed paths, the workflow's git add list, the updater's rejection of changes to published schemas, and that the schema sync generates from the released CLI.

Docs

  • The settings table, shared by the configuration, aspire config, and aspire config set pages:
    • Merges the two identical key columns into one and adds a default value column.
    • Adds the missing settings: appHost.language, docs.api.sitemapUrl, docs.llmsTxtUrl, features.nugetSignatureVerificationEnabled, features.stagingChannelEnabled, packages.<packageId>, profiles.<name>.applicationUrl, profiles.<name>.environmentVariables, and sdk.version.
    • Updates the appHost.path, channel, features.polyglotIntegrationFilterEnabled, and overrideStagingFeed descriptions to match the 13.6.0 CLI.
    • Explains how dotted keys map to nested JSON, and adds a caution about the aspire config set limitation described under Known CLI issues.
  • The configuration page:
    • Uses %ASPIRE_VERSION% for the versioned schema URL instead of a hard-coded 13.2.3, and states that every stable release starting with 13.2.0 has a versioned schema that never changes after the release ships.
    • Corrects the schema dialect to draft-07. The page said Draft 2020-12.
    • Writes the Go example key as features.experimentalPolyglot:go to match the table, and explains why these flags need --global.
    • Moves the tip about aspire config list --all into the feature flags section, and updates the description and intro to mention default values.

Known CLI issues

The docs now describe these 13.6.0 CLI behaviors as limitations. They need fixes in microsoft/aspire:

  • aspire config set treats every . and : in a key as a nesting separator. Without --global, aspire config set features.experimentalPolyglot:go true writes a nested experimentalPolyglot object to the local aspire.config.json file, and later commands fail to load the file. Dotted package IDs such as Aspire.Hosting.Redis also become nested objects.
  • The CLI reads overrideStagingFeed, but the published schema doesn't define it and sets additionalProperties: false, so schema-aware editors flag it as an unknown property.

Polyglot feature keys

The 13.6.0 docs and schema keep the experimentalPolyglot:<language> keys because that's what 13.6.0 ships: KnownFeatures.cs and extension/schemas/aspire-config.schema.json at v13.6.0 and on release/13.6 both use the colon form. microsoft/aspire#20481, a breaking change merged to main after the 13.6.0 branch was cut, renames them to experimentalPolyglotJava, experimentalPolyglotGo, experimentalPolyglotPython, and experimentalPolyglotRust. The schema sync adds the renamed keys with the first release that ships them. The docs table needs a follow-up update at that point.

Third-party links and affiliations

None. The new schema files carry upstream's standard $schema meta-schema URI, http://json-schema.org/draft-07/schema#, which the existing schema files already use.

Validation

Run from src/frontend on the final commit unless noted:

  • pnpm lint: passed.
  • pnpm test:unit: passed. 77 files, with 986 tests passed and 1 skipped.
  • pnpm test:unit:structured-data: passed. 5 files, with 99 tests passed.
  • Targeted vitest run of update-integrations.vitest.test.ts and cli-config-schema.vitest.test.ts: passed. 2 files, with 59 tests passed.
  • Ran the updater's scope check in a clean worktree. It passed on a clean tree, with a new schema file plus an index.json edit, and with a staged new schema. It failed with the new error when an existing schema was modified or deleted.
  • pnpm test:e2e tests/e2e/schema-routes.spec.ts: passed. 75 tests across the desktop, tablet, and mobile projects.
  • pnpm update:schemas, with all schema files removed: regenerated all 24 versions from the released CLIs. A second run generated nothing.
  • .github/scripts/check-forbidden-words.sh <merge-base> HEAD, run from the repository root: no forbidden phrases in added lines.
  • Installed all 24 released CLIs and compared each schema with that CLI's aspire config info --json output. Also ran each tag's own generate-schema.js against that output. For 13.2.x and 13.5.0 on, it reproduces the checked-in file. For 13.3.x and 13.4.x, it fails on the camelCase output and exits 0.
  • Checked the feature and property names in each tag's KnownFeatures.cs and AspireConfigFile.cs against the matching schema.
  • astro dev: the configuration, aspire config, and aspire config set pages render the new table and caution, %ASPIRE_VERSION% resolves to 13.6.0, and each versioned schema route serves the matching schema.
  • Checked the documented behavior against the v13.6.0 source and an isolated install of the 13.6.0 Aspire CLI, including aspire config set key handling, aspire add writing to packages, and the docs URL defaults.

Not run locally: pnpm build:production and the full Playwright suite. CI runs both.

- Backfill the aspire-config JSON Schema for every stable microsoft/aspire release from 13.2.0 through 13.6.0, and set latest to 13.6.0.
- Rewrite update-schemas.ts to sync every stable release, and run it from the scheduled Integration Data Updater workflow through update:all.
- Add tests for the schema index and the automation wiring.
- Rewrite the CLI config settings table for 13.6.0: merge the duplicate key columns, add defaults, and document the missing settings.
- Update the configuration page: versioned schema URLs, draft-07, and the aspire config set limitations for colon and dotted keys.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The daily updater now fails if an existing versioned schema is modified,
deleted, or renamed, so a release's schema never changes after it ships.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Upstream's checked-in schema is stale for 13.3.x and 13.4.x because the
generator at those tags couldn't read the CLI's camelCase output. Generate
each schema from the released CLI's `aspire config info --json` output
instead, and regenerate the 13.3.x and 13.4.x schemas.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@IEvangelist
David Pine (IEvangelist) marked this pull request as ready for review October 2, 2026 14:15
Copilot AI balanced review requested due to automatic review settings October 2, 2026 14:15
@IEvangelist
David Pine (IEvangelist) enabled auto-merge (squash) October 2, 2026 14:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Copilot review overview

Review effort: Lite
Findings: 3 Medium severity

Open (3)
What changed in this PR

This PR updates aspire.dev’s hosted Aspire CLI configuration JSON Schemas and documentation to match stable microsoft/aspire releases through 13.6.0, and adds automation + tests to keep schemas in sync going forward.

Changes:

  • Adds/updates versioned Aspire CLI config schema files and updates latest to 13.6.0.
  • Automates schema generation by installing each released Aspire.Cli version and generating schema from aspire config info --json.
  • Updates CLI configuration documentation + adds unit coverage to validate schema indexing and updater wiring.
File Description
src/​frontend/​vitest.structured-data.config.ts Adds schema integrity tests to the structured-data suite so updater PRs validate schema data.
src/​frontend/​tests/​unit/​update-integrations.vitest.test.ts Extends updater wiring tests to ensure schema sync is run, allowed, and staged by automation.
src/​frontend/​tests/​unit/​cli-config-schema.vitest.test.ts Adds index/sorting/coverage checks ensuring every schema file is indexed and latest is correct.
src/​frontend/​src/​data/​schemas/​index.json Expands schema versions list through 13.6.0 and advances latest.
src/​frontend/​src/​data/​schemas/​aspire-config.13.6.0.schema.json Adds generated schema for Aspire 13.6.0.
src/​frontend/​src/​data/​schemas/​aspire-config.13.5.4.schema.json Adds generated schema for Aspire 13.5.4.
src/​frontend/​src/​data/​schemas/​aspire-config.13.5.3.schema.json Adds generated schema for Aspire 13.5.3.
src/​frontend/​src/​data/​schemas/​aspire-config.13.5.2.schema.json Adds generated schema for Aspire 13.5.2.
src/​frontend/​src/​data/​schemas/​aspire-config.13.5.1.schema.json Adds generated schema for Aspire 13.5.1.
src/​frontend/​src/​data/​schemas/​aspire-config.13.5.0.schema.json Adds generated schema for Aspire 13.5.0.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.6.schema.json Adds generated schema for Aspire 13.4.6.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.5.schema.json Adds generated schema for Aspire 13.4.5.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.4.schema.json Adds generated schema for Aspire 13.4.4.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.3.schema.json Adds generated schema for Aspire 13.4.3.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.2.schema.json Adds generated schema for Aspire 13.4.2.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.1.schema.json Adds generated schema for Aspire 13.4.1.
src/​frontend/​src/​data/​schemas/​aspire-config.13.4.0.schema.json Adds generated schema for Aspire 13.4.0.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.5.schema.json Adds generated schema for Aspire 13.3.5.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.4.schema.json Adds generated schema for Aspire 13.3.4.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.3.schema.json Adds generated schema for Aspire 13.3.3.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.2.schema.json Adds generated schema for Aspire 13.3.2.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.1.schema.json Adds generated schema for Aspire 13.3.1.
src/​frontend/​src/​data/​schemas/​aspire-config.13.3.0.schema.json Updates schema content for 13.3.0 to match released CLI behavior (camelCase era).
src/​frontend/​src/​data/​schemas/​aspire-config.13.2.4.schema.json Adds generated schema for Aspire 13.2.4.
src/​frontend/​src/​data/​schemas/​aspire-config.13.2.2.schema.json Adds generated schema for Aspire 13.2.2.
src/​frontend/​src/​data/​schemas/​aspire-config.13.2.1.schema.json Adds generated schema for Aspire 13.2.1.
src/​frontend/​src/​data/​schemas/​aspire-config.13.2.0.schema.json Adds generated schema for Aspire 13.2.0.
src/​frontend/​src/​content/​docs/​reference/​cli/​includes/​config-settings-table.md Updates settings table layout, adds missing settings/defaults, and documents CLI key limitations.
src/​frontend/​src/​content/​docs/​reference/​cli/​configuration.mdx Fixes schema dialect info, schema URLs, and updates feature-flag guidance for 13.6.0 behavior.
src/​frontend/​scripts/​update-schemas.ts Reworks schema updater to generate per-release schemas from the released CLI and maintain an immutable version index.
src/​frontend/​scripts/​update-integration-data.ps1 Expands updater allowed paths/staging to include schemas and enforces “published schema immutability”.
src/​frontend/​package.json Ensures pnpm update:all runs schema sync so the daily updater can ingest new releases.
.github/​workflows/​update-integration-data.yml Stages schema directory in updater workflow so PRs include generated schema changes.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/frontend/scripts/update-schemas.ts Outdated
Comment thread src/frontend/scripts/update-schemas.ts Outdated
Comment thread src/frontend/scripts/update-schemas.ts
Include command output when installing or running the CLI fails, check that
the CLI printed a JSON object before parsing it, and reject --version values
that aren't stable releases at or after 13.2.0.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@IEvangelist
David Pine (IEvangelist) merged commit 35d54c1 into microsoft:main Oct 5, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants