From 0952900bb08a5defa4859d1ceff04affed6f906d Mon Sep 17 00:00:00 2001 From: David Pine Date: Fri, 2 Oct 2026 07:55:08 -0500 Subject: [PATCH 1/4] Sync Aspire CLI config schemas through 13.6.0 and fix config docs - 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> --- .github/workflows/update-integration-data.yml | 1 + src/frontend/package.json | 2 +- .../scripts/update-integration-data.ps1 | 5 +- src/frontend/scripts/update-schemas.ts | 166 +++++++--- .../docs/reference/cli/configuration.mdx | 48 +-- .../cli/includes/config-settings-table.md | 48 ++- .../schemas/aspire-config.13.2.0.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.2.1.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.2.2.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.2.4.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.3.1.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.3.2.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.3.3.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.3.4.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.3.5.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.0.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.1.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.2.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.3.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.4.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.5.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.4.6.schema.json | 239 ++++++++++++++ .../schemas/aspire-config.13.5.0.schema.json | 293 ++++++++++++++++++ .../schemas/aspire-config.13.5.1.schema.json | 293 ++++++++++++++++++ .../schemas/aspire-config.13.5.2.schema.json | 293 ++++++++++++++++++ .../schemas/aspire-config.13.5.3.schema.json | 293 ++++++++++++++++++ .../schemas/aspire-config.13.5.4.schema.json | 293 ++++++++++++++++++ .../schemas/aspire-config.13.6.0.schema.json | 288 +++++++++++++++++ src/frontend/src/data/schemas/index.json | 26 +- .../unit/cli-config-schema.vitest.test.ts | 27 +- .../unit/update-integrations.vitest.test.ts | 17 + src/frontend/vitest.structured-data.config.ts | 1 + 32 files changed, 5826 insertions(+), 92 deletions(-) create mode 100644 src/frontend/src/data/schemas/aspire-config.13.2.0.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.2.1.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.2.2.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.2.4.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.5.0.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.5.1.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.5.2.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.5.3.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.5.4.schema.json create mode 100644 src/frontend/src/data/schemas/aspire-config.13.6.0.schema.json diff --git a/.github/workflows/update-integration-data.yml b/.github/workflows/update-integration-data.yml index 2f3ef50a8c..2a017b333b 100644 --- a/.github/workflows/update-integration-data.yml +++ b/.github/workflows/update-integration-data.yml @@ -128,6 +128,7 @@ jobs: src/frontend/src/data/github-stats.json \ src/frontend/src/data/samples.json \ src/frontend/src/data/aspire-blog-posts.json \ + src/frontend/src/data/schemas \ src/frontend/src/assets/samples \ src/frontend/src/data/pkgs \ src/frontend/src/data/ts-modules \ diff --git a/src/frontend/package.json b/src/frontend/package.json index c5068f5a3c..4dec81b28f 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -52,7 +52,7 @@ "test:e2e:serve": "pnpm git-env && pnpm check-data && astro dev --host 127.0.0.1 --port 4321", "lint": "pnpm git-env && pnpm exec astro sync && pnpm verify-skill-digests && eslint . --max-warnings 0", "format": "prettier -w --cache --plugin prettier-plugin-astro .", - "update:all": "pnpm update:integrations && pnpm update:github-stats && pnpm update:samples && pnpm update:blogs", + "update:all": "pnpm update:integrations && pnpm update:github-stats && pnpm update:samples && pnpm update:blogs && pnpm update:schemas", "update:blogs": "tsx ./scripts/update-blogs.ts", "update:schemas": "tsx ./scripts/update-schemas.ts", "update:integrations": "tsx ./scripts/update-integrations.ts", diff --git a/src/frontend/scripts/update-integration-data.ps1 b/src/frontend/scripts/update-integration-data.ps1 index e797f2e7a7..fed34c1801 100644 --- a/src/frontend/scripts/update-integration-data.ps1 +++ b/src/frontend/scripts/update-integration-data.ps1 @@ -10,7 +10,8 @@ reliable scripting that runs identically in CI and locally. Phases: - 1. `pnpm update:all` — integration metadata, GitHub stats, samples, official blog archive. + 1. `pnpm update:all` — integration metadata, GitHub stats, samples, official blog archive, + and Aspire CLI config schemas for new microsoft/aspire releases. Reconciles documentation mappings, then runs structured-data tests. 2. Version-change detection — compares the committed aspire-integrations.json against the freshly written one by package @@ -76,6 +77,7 @@ $AllowedPaths = @( 'src/frontend/src/data/github-stats.json', 'src/frontend/src/data/samples.json', 'src/frontend/src/data/aspire-blog-posts.json', + 'src/frontend/src/data/schemas/', 'src/frontend/src/assets/samples/', 'src/frontend/src/data/pkgs/', 'src/frontend/src/data/ts-modules/', @@ -572,6 +574,7 @@ $sb = [System.Text.StringBuilder]::new() [void]$sb.AppendLine("- ``src/frontend/src/data/github-stats.json`` — repository statistics") [void]$sb.AppendLine("- ``src/frontend/src/data/samples.json`` — sample metadata, when changed") [void]$sb.AppendLine("- ``src/frontend/src/data/aspire-blog-posts.json`` — complete official Aspire blog metadata, when changed") +[void]$sb.AppendLine("- ``src/frontend/src/data/schemas/`` — Aspire CLI config schemas, when microsoft/aspire ships a new release") [void]$sb.AppendLine("- ``src/frontend/src/assets/samples/`` — sample thumbnails, when changed") [void]$sb.AppendLine("") [void]$sb.AppendLine("### API reference regeneration") diff --git a/src/frontend/scripts/update-schemas.ts b/src/frontend/scripts/update-schemas.ts index 28f9fdf2b1..9f90f731e9 100644 --- a/src/frontend/scripts/update-schemas.ts +++ b/src/frontend/scripts/update-schemas.ts @@ -1,10 +1,18 @@ /** - * Fetches the aspire-config JSON Schema from microsoft/aspire and saves a - * versioned copy under src/data/schemas/, then updates the version index. + * Syncs the aspire-config JSON Schema from microsoft/aspire into versioned + * copies under src/data/schemas/, then updates the version index. + * + * Every stable (non-prerelease, non-draft) microsoft/aspire release that ships + * the schema gets its own copy, so pinned + * https://aspire.dev/reference/cli/configuration/schema/.json URLs + * resolve for any shipped release. Existing copies are never re-fetched, and the + * index's `latest` is always the highest version. The scheduled Integration Data + * Updater workflow runs this script through `pnpm update:all`, so new releases + * are picked up automatically. * * Usage: - * pnpm update:schemas # fetch latest non-prerelease - * pnpm update:schemas -- --version 13.2.3 # pin to a specific version tag + * pnpm update:schemas # sync every stable release + * pnpm update:schemas -- --version 13.2.3 # sync a single version tag * pnpm update:schemas -- --version 13.3.0 --ref # label as 13.3.0 but fetch from * # the given commit SHA or branch ref * # (used before the v tag is @@ -28,6 +36,14 @@ const INDEX_FILE = path.join(SCHEMAS_DIR, 'index.json'); const SITE_ORIGIN = 'https://aspire.dev'; const SCHEMA_BASE_PATH = '/reference/cli/configuration/schema'; +/** The first microsoft/aspire release that ships the schema. */ +const MIN_SCHEMA_VERSION = '13.2.0'; + +/** Stable tags are `v..`; 13.4.4 was tagged `v13.4.4-release`. */ +const STABLE_RELEASE_TAG = /^v(\d+\.\d+\.\d+)(?:-release)?$/; + +const RELEASES_PAGE_SIZE = 100; + interface GitHubRelease { tag_name: string; prerelease: boolean; @@ -39,10 +55,26 @@ interface SchemaIndex { versions: string[]; } +/** A schema version and the microsoft/aspire git ref to fetch it from. */ +interface SchemaSource { + version: string; + ref: string; +} + function getErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error); } +/** Compare versions numerically, so 13.10.0 sorts after 13.9.0. */ +function compareVersions(a: string, b: string): number { + return a.localeCompare(b, undefined, { numeric: true }); +} + +function getArgValue(name: string): string | undefined { + const argIndex = process.argv.indexOf(name); + return argIndex >= 0 ? process.argv[argIndex + 1] : undefined; +} + function schemaFileName(version: string): string { return `aspire-config.${version}.schema.json`; } @@ -51,9 +83,8 @@ function schemaFilePath(version: string): string { return path.join(SCHEMAS_DIR, schemaFileName(version)); } -/** Fetch the latest non-prerelease, non-draft tag from microsoft/aspire. */ -async function fetchLatestReleaseVersion(): Promise { - const url = `https://api.github.com/repos/${ASPIRE_REPO}/releases`; +/** Fetch every stable microsoft/aspire release that ships the schema, oldest first. */ +async function fetchStableSchemaSources(): Promise { const headers: Record = { 'User-Agent': 'aspire-schema-updater', Accept: 'application/vnd.github.v3+json', @@ -62,19 +93,43 @@ async function fetchLatestReleaseVersion(): Promise { headers['Authorization'] = `token ${process.env.GITHUB_TOKEN}`; } - const res = await fetch(url, { headers }); - if (!res.ok) { - throw new Error(`Failed to fetch releases: ${res.status} ${res.statusText}`); + const sources = new Map(); + for (let page = 1; ; page++) { + const url = + `https://api.github.com/repos/${ASPIRE_REPO}/releases` + + `?per_page=${RELEASES_PAGE_SIZE}&page=${page}`; + const res = await fetch(url, { headers }); + if (!res.ok) { + throw new Error(`Failed to fetch releases: ${res.status} ${res.statusText}`); + } + + const releases = (await res.json()) as GitHubRelease[]; + for (const release of releases) { + if (release.prerelease || release.draft) { + continue; + } + + const version = STABLE_RELEASE_TAG.exec(release.tag_name)?.[1]; + if (!version) { + console.warn(`⚠️ Skipping stable release with an unrecognized tag: ${release.tag_name}`); + continue; + } + + if (compareVersions(version, MIN_SCHEMA_VERSION) >= 0) { + sources.set(version, { version, ref: release.tag_name }); + } + } + + if (releases.length < RELEASES_PAGE_SIZE) { + break; + } } - const releases = (await res.json()) as GitHubRelease[]; - const stable = releases.find((r) => !r.prerelease && !r.draft); - if (!stable) { - throw new Error('No stable release found in microsoft/aspire'); + if (sources.size === 0) { + throw new Error(`No stable ${ASPIRE_REPO} release found at or after ${MIN_SCHEMA_VERSION}`); } - // Tag names are like "v13.2.3" — strip the leading "v" - return stable.tag_name.replace(/^v/, ''); + return [...sources.values()].sort((a, b) => compareVersions(a.version, b.version)); } /** Fetch the raw schema JSON from microsoft/aspire at the given git ref (tag, branch, or SHA). */ @@ -119,52 +174,61 @@ function writeIndex(index: SchemaIndex): void { } } -async function main(): Promise { - // Resolve the target version - const versionArg = process.argv.indexOf('--version'); - let version: string; - if (versionArg >= 0 && process.argv[versionArg + 1]) { - version = process.argv[versionArg + 1].replace(/^v/, ''); - console.log(`📌 Using pinned version: ${version}`); - } else { - console.log(`🔍 Fetching latest release from ${ASPIRE_REPO}…`); - version = await fetchLatestReleaseVersion(); - console.log(`✅ Latest stable release: ${version}`); +/** Fetch and save the schema for a version unless a copy already exists. Returns true if saved. */ +async function syncSchema({ version, ref }: SchemaSource): Promise { + const outFile = schemaFilePath(version); + if (fs.existsSync(outFile)) { + return false; } - const refArg = process.argv.indexOf('--ref'); - const ref = - refArg >= 0 && process.argv[refArg + 1] - ? process.argv[refArg + 1] - : `v${version}`; + console.log(`⬇️ Fetching schema for ${version} from ${ASPIRE_REPO} @ ${ref}…`); + const schema = await fetchSchemaAtRef(ref); - const outFile = schemaFilePath(version); + // Update $id to point to the versioned aspire.dev URL + schema['$id'] = `${SITE_ORIGIN}${SCHEMA_BASE_PATH}/${version}.json`; - if (fs.existsSync(outFile)) { - console.log(`ℹ️ Schema for v${version} already exists at ${path.relative(FRONTEND_ROOT, outFile)}`); - } else { - console.log(`⬇️ Fetching schema from microsoft/aspire @ ${ref}…`); - const schema = await fetchSchemaAtRef(ref); + fs.mkdirSync(SCHEMAS_DIR, { recursive: true }); + fs.writeFileSync(outFile, JSON.stringify(schema, null, 2) + '\n', 'utf-8'); + console.log(`✅ Saved schema to ${path.relative(FRONTEND_ROOT, outFile)}`); + return true; +} - // Update $id to point to the versioned aspire.dev URL - schema['$id'] = `${SITE_ORIGIN}${SCHEMA_BASE_PATH}/${version}.json`; +async function main(): Promise { + const pinnedVersion = getArgValue('--version')?.replace(/^v/, ''); + const ref = getArgValue('--ref'); + + let sources: SchemaSource[]; + if (pinnedVersion) { + console.log(`📌 Using pinned version: ${pinnedVersion}`); + sources = [{ version: pinnedVersion, ref: ref ?? `v${pinnedVersion}` }]; + } else if (ref) { + throw new Error('--ref requires --version to label the schema fetched from that ref'); + } else { + console.log(`🔍 Fetching stable releases from ${ASPIRE_REPO}…`); + sources = await fetchStableSchemaSources(); + console.log(`✅ Found ${sources.length} stable releases that ship the schema`); + } - fs.mkdirSync(SCHEMAS_DIR, { recursive: true }); - fs.writeFileSync(outFile, JSON.stringify(schema, null, 2) + '\n', 'utf-8'); - console.log(`✅ Saved schema to ${path.relative(FRONTEND_ROOT, outFile)}`); + let savedCount = 0; + for (const source of sources) { + if (await syncSchema(source)) { + savedCount++; + } + } + if (savedCount === 0) { + console.log('ℹ️ All schemas already exist; nothing to fetch.'); } - // Update the index + // Update the index. `latest` is the highest version, so an out-of-band patch + // for an older minor release never replaces a newer latest version. const index = readIndex(); - - if (!index.versions.includes(version)) { - index.versions.push(version); - index.versions.sort((a, b) => a.localeCompare(b, undefined, { numeric: true })); - } - index.latest = version; + index.versions = [...new Set([...index.versions, ...sources.map((s) => s.version)])].sort( + compareVersions + ); + index.latest = index.versions[index.versions.length - 1]; writeIndex(index); - console.log(`✅ Updated ${path.relative(FRONTEND_ROOT, INDEX_FILE)} — latest: ${version}, versions: [${index.versions.join(', ')}]`); + console.log(`✅ Updated ${path.relative(FRONTEND_ROOT, INDEX_FILE)} — latest: ${index.latest}, versions: [${index.versions.join(', ')}]`); } main().catch((error: unknown) => { diff --git a/src/frontend/src/content/docs/reference/cli/configuration.mdx b/src/frontend/src/content/docs/reference/cli/configuration.mdx index 2c410077d3..935526ad14 100644 --- a/src/frontend/src/content/docs/reference/cli/configuration.mdx +++ b/src/frontend/src/content/docs/reference/cli/configuration.mdx @@ -1,6 +1,6 @@ --- title: Configuration settings -description: Learn about Aspire CLI configuration, the rooted aspire.config.json file, and the settings surfaced by aspire config list --all. +description: Learn about Aspire CLI configuration, the aspire.config.json settings and their default values, and the JSON Schema for editor completions and validation. --- import Include from '@components/Include.astro'; @@ -16,9 +16,10 @@ the feature flags surfaced by your installed CLI. -The consolidated `aspire.config.json` file can also contain other rooted Aspire -configuration such as SDK version, launch profiles, and package pins. This page -focuses on the settings surfaced through `aspire config`. +The consolidated `aspire.config.json` file also stores other rooted Aspire +configuration, such as the SDK version, launch profiles, and integration +packages. The [settings table](#settings-surfaced-by-aspire-config) lists the +settings you can configure in the file and their default values. ## Example `aspire.config.json` @@ -48,7 +49,7 @@ completions, validation, and hover documentation while you edit the file. Two URLs are available: -- **Latest** — always points to the newest published schema: +- The **latest** URL always points to the newest published schema: ```text title="Latest schema URL" https://aspire.dev/reference/cli/configuration/schema.json @@ -56,13 +57,13 @@ Two URLs are available: [`schema.json`](/reference/cli/configuration/schema.json) -- **Versioned** — pins to a specific Aspire release (for example, `13.2.3`): +- A **versioned** URL pins to a specific Aspire release, such as `%ASPIRE_VERSION%`: ```text title="Versioned schema URL" - https://aspire.dev/reference/cli/configuration/schema/13.2.3.json + https://aspire.dev/reference/cli/configuration/schema/%ASPIRE_VERSION%.json ``` - [`schema/13.2.3.json`](/reference/cli/configuration/schema/13.2.3.json) + A versioned schema is available for every stable Aspire release starting with 13.2.0. ### Reference the schema from `aspire.config.json` @@ -79,10 +80,10 @@ top-level `$schema` property: ``` :::note -Use the versioned URL (for example, `.../schema/13.2.3.json`) when you want -schema behavior to stay stable alongside a pinned Aspire CLI version, and use -the unversioned `schema.json` when you want to always validate against the -latest release. +Use a versioned URL, such as `.../schema/%ASPIRE_VERSION%.json`, when you want +schema behavior to stay stable alongside a pinned Aspire CLI version. Use the +unversioned `schema.json` when you want to always validate against the latest +release. ::: ### Associate the schema in Visual Studio Code @@ -91,7 +92,7 @@ With the [Aspire VS Code extension](/get-started/aspire-vscode-extension/) insta ### Other editors -Any editor or tool that understands JSON Schema Draft 2020-12 can consume the +Any editor or tool that understands JSON Schema draft-07 can consume the hosted schema — including JetBrains IDEs (**Settings → Languages & Frameworks → Schemas and DTDs → JSON Schema Mappings**), Neovim with [`jsonls`](https://github.com/microsoft/vscode-json-languageservice), and @@ -103,7 +104,8 @@ Point the tool at either the latest or versioned URL above. Use `aspire config list` to see the values that are currently set, and use `aspire config list --all` to enumerate the feature flags your installed CLI -can configure. +can configure. The following table lists the settings, their default values, and +what they control. @@ -150,17 +152,17 @@ platform path separator. If `certificates.nssDbPaths` is unset, `aspire certs trust` will also honor the `DOTNET_DEV_CERTS_NSSDB_PATHS` environment variable, but Aspire configuration will take precedence when present. When no specific configuration is supplied, Aspire applies certificate trust to NSS databases in well-known browser specific paths for Firefox and Chrome/Chromium. Run [`aspire certs trust`](../commands/aspire-certs-trust/) to apply the configured trust settings. -:::tip -Some feature flags shown by `aspire config list --all` may correspond to -preview, migration, or hidden functionality. Treat the output of your -installed CLI as the authoritative source for what can be configured. -::: - ## Toggle preview feature experiences Use feature flags to opt in to preview experiences that your installed Aspire CLI supports. +:::tip +The available feature flags depend on your installed CLI version. Treat the +output of `aspire config list --all` as the authoritative list of feature flags +and their default values. +::: + 1. Run `aspire config list --all` to discover available `features.*` keys. @@ -182,9 +184,13 @@ CLI supports. For example, consider the following that enables global support for Go: ```bash title="Enable global Go support" - aspire config set features:experimentalPolyglot:go true --global + aspire config set features.experimentalPolyglot:go true --global ``` + Always set `experimentalPolyglot:` flags with `--global`, or add + them to the local `aspire.config.json` file by hand. For details, see the + caution under [Settings surfaced by `aspire config`](#settings-surfaced-by-aspire-config). + 4. Turn a feature off by setting it to `false`, or remove the override with `aspire config delete `. diff --git a/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md b/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md index 6a3a71c6b6..37e54486ef 100644 --- a/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md +++ b/src/frontend/src/content/docs/reference/cli/includes/config-settings-table.md @@ -2,18 +2,36 @@ title: Config Settings Table --- -| Logical key | Stored in `aspire.config.json` as | Description | -| ----------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| `appHost.path` | `appHost.path` | Project-scoped path to the default AppHost entry point. This setting must be configured in the local `aspire.config.json` file. | -| `certificates.nssDbPaths` | `certificates.nssDbPaths` | NSS database paths used for browser certificate trust on Linux. Separate paths with the platform path separator. Prefix a path with `firefox=` or `chromium=` to apply the trust settings expected by that browser family. Takes precedence over the upstream `DOTNET_DEV_CERTS_NSSDB_PATHS` environment variable. | -| `channel` | `channel` | Default Aspire channel used by channel-aware commands such as `aspire new`, `aspire init`, and `aspire update`. | -| `features.defaultWatchEnabled` | `features.defaultWatchEnabled` | Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes. | -| `features.experimentalPolyglot:go` | `features.experimentalPolyglot:go` | Enable or disable experimental Go AppHost support. | -| `features.experimentalPolyglot:java` | `features.experimentalPolyglot:java` | Enable or disable experimental Java AppHost support. | -| `features.experimentalPolyglot:python` | `features.experimentalPolyglot:python` | Enable or disable experimental Python AppHost support. | -| `features.experimentalPolyglot:rust` | `features.experimentalPolyglot:rust` | Enable or disable experimental Rust AppHost support. | -| `features.polyglotIntegrationFilterEnabled` | `features.polyglotIntegrationFilterEnabled` | Enable or disable filtering `aspire add`, `aspire integration list`, and `aspire integration search` results to only integrations compatible with a non-C# AppHost. Disabled by default because remote NuGet feeds don't reliably answer the `tags:polyglot` query used to build the compatibility allow-list. | -| `features.showAllTemplates` | `features.showAllTemplates` | Show all available templates, including experimental ones, in `aspire new` and `aspire init`. | -| `features.showDeprecatedPackages` | `features.showDeprecatedPackages` | Show or hide deprecated packages in `aspire add` search results. | -| `features.updateNotificationsEnabled` | `features.updateNotificationsEnabled` | Enable or disable Aspire CLI update notifications. | -| `overrideStagingFeed` | `overrideStagingFeed` | Escape hatch that always allows the `staging` channel to be resolved, regardless of the running CLI's build identity. Set this to the staging feed URL you want channel-aware commands (`aspire new`, `aspire init`, `aspire update`) to use, for example: `aspire config set -g overrideStagingFeed `. Without this setting, `--channel staging` only resolves on `stable` or `staging` Aspire CLI builds — daily, local, and per-PR builds refuse it and report the recovery options. | +| Key | Default | Description | +| -------------------------------------------- | ---------------------------------- | ----------- | +| `appHost.language` | — | Language of the AppHost, such as `typescript/nodejs` or `python`. The CLI uses it to choose the runtime that runs the AppHost. | +| `appHost.path` | — | Path to the default AppHost entry point, such as `apphost.mts`, `Program.cs`, or an AppHost project file, relative to the directory that contains `aspire.config.json`. Set it in the local `aspire.config.json` file; the CLI ignores it in global configuration. | +| `certificates.nssDbPaths` | — | NSS database paths used for browser certificate trust on Linux. Separate paths with the platform path separator. Prefix a path with `firefox=` or `chromium=` to apply the trust settings expected by that browser family. Takes precedence over the upstream `DOTNET_DEV_CERTS_NSSDB_PATHS` environment variable. | +| `channel` | — | Aspire channel used to resolve Aspire packages, such as `stable`, `staging`, or `daily`. `aspire new`, `aspire init`, and `aspire update` can record it, `aspire add` reads it for non-C# AppHosts, and `aspire update` uses it when you don't pass `--channel`. | +| `docs.api.sitemapUrl` | `https://aspire.dev/sitemap-0.xml` | API reference sitemap used by `aspire docs api`. Leave it unset to use the built-in aspire.dev source. | +| `docs.llmsTxtUrl` | `https://aspire.dev/llms-full.txt` | `llms.txt` documentation source used by `aspire docs`. Leave it unset to use the built-in aspire.dev source. | +| `features.defaultWatchEnabled` | `false` | Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes. | +| `features.experimentalPolyglot:go` | `false` | Enable or disable experimental Go AppHost support. | +| `features.experimentalPolyglot:java` | `false` | Enable or disable experimental Java AppHost support. | +| `features.experimentalPolyglot:python` | `false` | Enable or disable experimental Python AppHost support. | +| `features.experimentalPolyglot:rust` | `false` | Enable or disable experimental Rust AppHost support. | +| `features.nugetSignatureVerificationEnabled` | `true` | Enable or disable defaulting the `DOTNET_NUGET_SIGNATURE_VERIFICATION` environment variable for NuGet operations. When enabled on Linux, the CLI sets the variable to `true` unless you've set it to `false`. | +| `features.polyglotIntegrationFilterEnabled` | `false` | Enable or disable an experimental filter that restricts `aspire add`, `aspire integration list`, and `aspire integration search` in non-C# AppHosts to integrations with the `polyglot` NuGet tag. The filter fails closed, so enabling it against a remote feed hides every integration. Azure DevOps Artifacts feeds ignore `tags:` query scoping, and nuget.org returns no first-party integrations for the tag. Enable it only against a local package source or hive, where the CLI reads the tag from the package's `.nuspec` file. | +| `features.showAllTemplates` | `false` | Show all available templates, including experimental ones, in `aspire new` and `aspire init`. | +| `features.showDeprecatedPackages` | `false` | Show or hide deprecated packages in `aspire add` search results. | +| `features.stagingChannelEnabled` | `false` | Enable or disable access to the `staging` channel for early access to preview features and packages. When enabled, daily, local, and per-PR CLI builds can also resolve the `staging` channel. | +| `features.updateNotificationsEnabled` | `true` | Enable or disable Aspire CLI update notifications. | +| `overrideStagingFeed` | — | Feed URL for the `staging` channel. Any non-empty value lets every CLI build resolve the `staging` channel, and a valid `http` or `https` URL replaces the default staging feed. To set it, run `aspire config set -g overrideStagingFeed `. Without this setting or `features.stagingChannelEnabled`, `--channel staging` only resolves on `stable` or `staging` Aspire CLI builds. Daily, local, and per-PR builds refuse it and report the recovery options. This key isn't part of the published JSON Schema, so schema-aware editors flag it as an unknown property. | +| `packages.` | — | Version of a hosting integration package for a non-C# AppHost, keyed by package ID. A value that ends in `.csproj` is treated as a project reference. `aspire add` adds entries, and `aspire update` updates their versions. For more information, see [Add and restore integrations](/app-host/typescript-apphost/#add-and-restore-integrations). | +| `profiles..applicationUrl` | — | Application URLs for the launch profile, such as `https://localhost:17000;http://localhost:15000`. To learn where each kind of AppHost stores launch profiles, see [AppHost configuration](/app-host/configuration/). | +| `profiles..environmentVariables` | — | Environment variables for the launch profile. | +| `sdk.version` | Installed CLI version | Aspire SDK version for a non-C# AppHost, which determines the version of the `Aspire.Hosting` packages to use. `aspire update` updates this value. | + +Each `.` in a key maps to a nested object in `aspire.config.json`. For example, `aspire config set appHost.path ./apphost.mts` writes `"appHost": { "path": "./apphost.mts" }`. Replace placeholders such as `` and `` with your own values. + +:::caution +`aspire config set` treats every `.` and `:` in a key as a nesting separator, so it can't write keys whose names contain those characters: + +- In `features.experimentalPolyglot:`, `experimentalPolyglot:` is a single feature name. Without `--global`, the CLI writes a nested `experimentalPolyglot` object to the local `aspire.config.json` file, and later commands fail to load the file. Set these flags with `--global`, or add them to the local file by hand, for example `"experimentalPolyglot:go": true` in the `features` object. +- Package IDs such as `Aspire.Hosting.Redis` contain dots. Use `aspire add` to add packages, or edit the `packages` object by hand. +::: diff --git a/src/frontend/src/data/schemas/aspire-config.13.2.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.2.0.schema.json new file mode 100644 index 0000000000..ef53aac596 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.2.0.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.2.0.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.2.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.2.1.schema.json new file mode 100644 index 0000000000..e7df27c599 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.2.1.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.2.1.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.2.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.2.2.schema.json new file mode 100644 index 0000000000..154ebdb343 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.2.2.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.2.2.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.2.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.2.4.schema.json new file mode 100644 index 0000000000..a01fa79161 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.2.4.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.2.4.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json new file mode 100644 index 0000000000..c7908365f1 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.3.1.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json new file mode 100644 index 0000000000..31f8bd4e71 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.3.2.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json new file mode 100644 index 0000000000..442991a405 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.3.3.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json new file mode 100644 index 0000000000..26c80f3c3e --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.3.4.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json new file mode 100644 index 0000000000..f7bd5153e4 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.3.5.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json new file mode 100644 index 0000000000..824b89baa5 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.0.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json new file mode 100644 index 0000000000..65c31ac3dc --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.1.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json new file mode 100644 index 0000000000..bd038891f7 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.2.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json new file mode 100644 index 0000000000..5fc6791c33 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.3.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json new file mode 100644 index 0000000000..b5f955f76e --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.4.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json new file mode 100644 index 0000000000..9acdbe7b0b --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.5.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json new file mode 100644 index 0000000000..1136936123 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json @@ -0,0 +1,239 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.4.6.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "execCommandEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.5.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.5.0.schema.json new file mode 100644 index 0000000000..f083e4657f --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.5.0.schema.json @@ -0,0 +1,293 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.5.0.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "terminalCommandsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Enable the 'aspire terminal' command group ('aspire terminal ps', 'aspire terminal attach'). Used in conjunction with the experimental WithTerminal() API (ASPIRETERMINAL001). Hidden by default while the API surface is in preview.", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.5.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.5.1.schema.json new file mode 100644 index 0000000000..3eda194dc4 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.5.1.schema.json @@ -0,0 +1,293 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.5.1.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "terminalCommandsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Enable the 'aspire terminal' command group ('aspire terminal ps', 'aspire terminal attach'). Used in conjunction with the experimental WithTerminal() API (ASPIRETERMINAL001). Hidden by default while the API surface is in preview.", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.5.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.5.2.schema.json new file mode 100644 index 0000000000..ece3102e5a --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.5.2.schema.json @@ -0,0 +1,293 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.5.2.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "terminalCommandsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Enable the 'aspire terminal' command group ('aspire terminal ps', 'aspire terminal attach'). Used in conjunction with the experimental WithTerminal() API (ASPIRETERMINAL001). Hidden by default while the API surface is in preview.", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.5.3.schema.json b/src/frontend/src/data/schemas/aspire-config.13.5.3.schema.json new file mode 100644 index 0000000000..0d7930699b --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.5.3.schema.json @@ -0,0 +1,293 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.5.3.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "terminalCommandsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Enable the 'aspire terminal' command group ('aspire terminal ps', 'aspire terminal attach'). Used in conjunction with the experimental WithTerminal() API (ASPIRETERMINAL001). Hidden by default while the API surface is in preview.", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.5.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.5.4.schema.json new file mode 100644 index 0000000000..8264245364 --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.5.4.schema.json @@ -0,0 +1,293 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.5.4.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "terminalCommandsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Enable the 'aspire terminal' command group ('aspire terminal ps', 'aspire terminal attach'). Used in conjunction with the experimental WithTerminal() API (ASPIRETERMINAL001). Hidden by default while the API surface is in preview.", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/aspire-config.13.6.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.6.0.schema.json new file mode 100644 index 0000000000..9b01622b8f --- /dev/null +++ b/src/frontend/src/data/schemas/aspire-config.13.6.0.schema.json @@ -0,0 +1,288 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://aspire.dev/reference/cli/configuration/schema/13.6.0.json", + "type": "object", + "title": "Aspire Configuration", + "description": "Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.", + "properties": { + "appHost": { + "description": "AppHost entry point configuration.", + "type": "object", + "properties": { + "path": { + "description": "Relative path to the AppHost entry point file (e.g., \"Program.cs\", \"app.ts\"). Relative to the directory containing aspire.config.json.", + "type": "string" + }, + "language": { + "description": "Language identifier (e.g., \"typescript/nodejs\", \"python\"). Used to determine which runtime to use for execution.", + "type": "string" + } + }, + "additionalProperties": false + }, + "certificates": { + "description": "Developer certificate configuration.", + "type": "object", + "properties": { + "nssDbPaths": { + "description": "NSS database paths used for browser certificate trust on Linux. Separate paths with the platform path separator. Prefix a path with \"firefox=\" or \"chromium=\" to apply the trust settings expected by that browser family.", + "type": "string" + } + }, + "additionalProperties": false + }, + "channel": { + "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", + "type": "string" + }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "features": { + "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", + "type": "object", + "properties": { + "defaultWatchEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "default": false + }, + "experimentalPolyglot:go": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Go language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:java": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Java language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:python": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Python language support for polyglot Aspire applications", + "default": false + }, + "experimentalPolyglot:rust": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", + "default": false + }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for NuGet operations", + "default": true + }, + "polyglotIntegrationFilterEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "(Experimental) Restrict 'aspire add', 'aspire integration list', and 'aspire integration search' in non-C# AppHosts to integrations carrying the 'polyglot' NuGet tag. Disabled by default because no remote feed resolves the tag usefully today: Azure DevOps Artifacts feeds ignore 'tags:' query scoping, and nuget.org returns no first-party integrations for it. The filter fails closed, so enabling it against a remote feed hides every integration. Enable it only against a local package source or hive, where the tag is read from the nuspec.", + "default": false + }, + "showAllTemplates": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show all available templates including experimental ones in 'aspire new' and 'aspire init' commands", + "default": false + }, + "showDeprecatedPackages": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Show or hide deprecated packages in 'aspire add' search results", + "default": false + }, + "stagingChannelEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable access to the staging channel for early access to preview features and packages", + "default": false + }, + "updateNotificationsEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Check if update notifications are disabled and set version check environment variable", + "default": true + } + }, + "additionalProperties": false + }, + "packages": { + "description": "Package references for non-first-class languages. Key is package name, value is version. A value ending in \".csproj\" is treated as a project reference.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "profiles": { + "description": "Launch profiles (ports, environment variables). Replaces apphost.run.json.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "applicationUrl": { + "description": "Application URLs (e.g., \"https://localhost:17000;http://localhost:15000\").", + "type": "string" + }, + "environmentVariables": { + "description": "Environment variables for this profile.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "sdk": { + "description": "Aspire SDK version configuration.", + "type": "object", + "properties": { + "version": { + "description": "The Aspire SDK version. Determines the version of Aspire.Hosting packages to use.", + "type": "string" + } + }, + "additionalProperties": false + }, + "$schema": { + "type": "string", + "description": "JSON Schema reference" + } + }, + "additionalProperties": false +} diff --git a/src/frontend/src/data/schemas/index.json b/src/frontend/src/data/schemas/index.json index e55c9f7128..e10407765b 100644 --- a/src/frontend/src/data/schemas/index.json +++ b/src/frontend/src/data/schemas/index.json @@ -1,7 +1,29 @@ { - "latest": "13.3.0", + "latest": "13.6.0", "versions": [ + "13.2.0", + "13.2.1", + "13.2.2", "13.2.3", - "13.3.0" + "13.2.4", + "13.3.0", + "13.3.1", + "13.3.2", + "13.3.3", + "13.3.4", + "13.3.5", + "13.4.0", + "13.4.1", + "13.4.2", + "13.4.3", + "13.4.4", + "13.4.5", + "13.4.6", + "13.5.0", + "13.5.1", + "13.5.2", + "13.5.3", + "13.5.4", + "13.6.0" ] } diff --git a/src/frontend/tests/unit/cli-config-schema.vitest.test.ts b/src/frontend/tests/unit/cli-config-schema.vitest.test.ts index 0479af7147..30347be579 100644 --- a/src/frontend/tests/unit/cli-config-schema.vitest.test.ts +++ b/src/frontend/tests/unit/cli-config-schema.vitest.test.ts @@ -1,4 +1,4 @@ -import { existsSync, readFileSync } from 'node:fs'; +import { existsSync, readFileSync, readdirSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect, test } from 'vitest'; @@ -23,6 +23,10 @@ function schemaFilePath(version: string): string { return path.join(schemasDir, `aspire-config.${version}.schema.json`); } +function compareVersions(a: string, b: string): number { + return a.localeCompare(b, undefined, { numeric: true }); +} + describe('cli-config-schema data files', () => { test('index.json exists', () => { expect(existsSync(indexFile)).toBe(true); @@ -41,6 +45,27 @@ describe('cli-config-schema data files', () => { expect(index.versions).toContain(index.latest); }); + test('index.versions is unique and sorted oldest to newest', () => { + const index = readIndex(); + expect(new Set(index.versions).size).toBe(index.versions.length); + expect(index.versions).toEqual([...index.versions].sort(compareVersions)); + }); + + test('index.latest is the highest version', () => { + const index = readIndex(); + const sorted = [...index.versions].sort(compareVersions); + expect(index.latest).toBe(sorted[sorted.length - 1]); + }); + + test('every schema file is listed in index.json', () => { + const index = readIndex(); + const fileVersions = readdirSync(schemasDir).flatMap((name) => { + const version = /^aspire-config\.(.+)\.schema\.json$/.exec(name)?.[1]; + return version ? [version] : []; + }); + expect(fileVersions.sort(compareVersions)).toEqual([...index.versions].sort(compareVersions)); + }); + test('all versions in index have corresponding schema files', () => { const index = readIndex(); for (const version of index.versions) { diff --git a/src/frontend/tests/unit/update-integrations.vitest.test.ts b/src/frontend/tests/unit/update-integrations.vitest.test.ts index 8e22f95b99..808be99fce 100644 --- a/src/frontend/tests/unit/update-integrations.vitest.test.ts +++ b/src/frontend/tests/unit/update-integrations.vitest.test.ts @@ -329,6 +329,23 @@ describe('integration update automation', () => { /test:unit:structured-data\s+if \(\$LASTEXITCODE -ne 0\) \{[^}]*exit 1/ ); }); + + test('syncs, validates, allows, and stages Aspire CLI config schemas', () => { + const packageJson = JSON.parse( + readFileSync(path.join(frontendRoot, 'package.json'), 'utf8') + ) as { scripts: Record }; + const structuredDataConfig = readFileSync( + path.join(frontendRoot, 'vitest.structured-data.config.ts'), + 'utf8' + ); + const allowedPaths = script.match(/\$AllowedPaths = @\(([\s\S]*?)\)/)?.[1]; + const stagedPaths = workflow.match(/git add -- \\[\s\S]*?\r?\n\r?\n/)?.[0]; + + expect(packageJson.scripts['update:all']).toContain('pnpm update:schemas'); + expect(structuredDataConfig).toContain("'tests/unit/cli-config-schema.vitest.test.ts'"); + expect(allowedPaths).toContain("'src/frontend/src/data/schemas/'"); + expect(stagedPaths).toContain('src/frontend/src/data/schemas'); + }); }); describe('Community Toolkit documentation mappings', () => { diff --git a/src/frontend/vitest.structured-data.config.ts b/src/frontend/vitest.structured-data.config.ts index b8507dbe8d..a4186f9ee1 100644 --- a/src/frontend/vitest.structured-data.config.ts +++ b/src/frontend/vitest.structured-data.config.ts @@ -17,6 +17,7 @@ export default defineConfig({ 'tests/unit/update-integrations.vitest.test.ts', 'tests/unit/validate-generated-api-data.vitest.test.ts', 'tests/unit/supplement-ats-enums.vitest.test.ts', + 'tests/unit/cli-config-schema.vitest.test.ts', ], environment: 'node', testTimeout: 30000, From 965742df16df367fa669d5d22da3df2ba22bd7ce Mon Sep 17 00:00:00 2001 From: David Pine Date: Fri, 2 Oct 2026 08:33:23 -0500 Subject: [PATCH 2/4] Reject changes to published Aspire CLI config schemas 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> --- src/frontend/scripts/update-integration-data.ps1 | 15 +++++++++++++++ src/frontend/scripts/update-schemas.ts | 7 ++++--- .../content/docs/reference/cli/configuration.mdx | 2 +- .../tests/unit/update-integrations.vitest.test.ts | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/frontend/scripts/update-integration-data.ps1 b/src/frontend/scripts/update-integration-data.ps1 index fed34c1801..f8397cdc64 100644 --- a/src/frontend/scripts/update-integration-data.ps1 +++ b/src/frontend/scripts/update-integration-data.ps1 @@ -518,14 +518,23 @@ elseif ($versionsChanged -and $SkipRegen) { Write-Section 'Phase 5 — scope check' $allStatus = @(Invoke-Git @('status', '--porcelain') | Where-Object { $_ -and $_.Trim().Length -gt 0 }) $outOfScope = [System.Collections.Generic.List[string]]::new() +# A release's schema never changes after it ships, so the updater may only add +# versioned schema files. Modifying, deleting, or renaming one is a violation. +$publishedSchemaPattern = '^src/frontend/src/data/schemas/aspire-config\..+\.schema\.json$' +$changedPublishedSchemas = [System.Collections.Generic.List[string]]::new() foreach ($line in $allStatus) { # Porcelain format: "XY " (path starts at column 4). Handle renames "old -> new". + $statusCode = $line.Substring(0, 2) $path = ($line.Substring(3)).Trim() if ($path -match ' -> ') { $path = ($path -split ' -> ')[-1].Trim() } $path = $path.Trim('"') if (-not (Test-PathAllowed -RelPath $path)) { $outOfScope.Add($path) } + $isNewFile = $statusCode -eq '??' -or $statusCode[0] -eq 'A' + if (($path -replace '\\', '/') -match $publishedSchemaPattern -and -not $isNewFile) { + $changedPublishedSchemas.Add($path) + } } if ($outOfScope.Count -gt 0) { Write-Error ("Working tree contains changes outside the allowed data paths:`n " + @@ -533,6 +542,12 @@ if ($outOfScope.Count -gt 0) { "`nAborting; no PR will be opened.") exit 1 } +if ($changedPublishedSchemas.Count -gt 0) { + Write-Error ("Published Aspire CLI config schemas never change, but these were modified, deleted, or renamed:`n " + + ($changedPublishedSchemas -join "`n ") + + "`nAborting; no PR will be opened.") + exit 1 +} Write-Host "All changes are within the allowed data paths." -ForegroundColor Green # ── File-count summary (for the PR body) ──────────────────────────────────── diff --git a/src/frontend/scripts/update-schemas.ts b/src/frontend/scripts/update-schemas.ts index 9f90f731e9..2696854656 100644 --- a/src/frontend/scripts/update-schemas.ts +++ b/src/frontend/scripts/update-schemas.ts @@ -5,10 +5,11 @@ * Every stable (non-prerelease, non-draft) microsoft/aspire release that ships * the schema gets its own copy, so pinned * https://aspire.dev/reference/cli/configuration/schema/.json URLs - * resolve for any shipped release. Existing copies are never re-fetched, and the - * index's `latest` is always the highest version. The scheduled Integration Data + * resolve for any shipped release. A release's schema never changes after it + * ships, so existing copies are never re-fetched or overwritten, and the index's + * `latest` is always the highest version. The scheduled Integration Data * Updater workflow runs this script through `pnpm update:all`, so new releases - * are picked up automatically. + * are picked up automatically, and it rejects any change to an existing copy. * * Usage: * pnpm update:schemas # sync every stable release diff --git a/src/frontend/src/content/docs/reference/cli/configuration.mdx b/src/frontend/src/content/docs/reference/cli/configuration.mdx index 935526ad14..210346d4ac 100644 --- a/src/frontend/src/content/docs/reference/cli/configuration.mdx +++ b/src/frontend/src/content/docs/reference/cli/configuration.mdx @@ -63,7 +63,7 @@ Two URLs are available: https://aspire.dev/reference/cli/configuration/schema/%ASPIRE_VERSION%.json ``` - A versioned schema is available for every stable Aspire release starting with 13.2.0. + Every stable Aspire release starting with 13.2.0 has a versioned schema, and that schema never changes after the release ships. ### Reference the schema from `aspire.config.json` diff --git a/src/frontend/tests/unit/update-integrations.vitest.test.ts b/src/frontend/tests/unit/update-integrations.vitest.test.ts index 808be99fce..2c6e25742a 100644 --- a/src/frontend/tests/unit/update-integrations.vitest.test.ts +++ b/src/frontend/tests/unit/update-integrations.vitest.test.ts @@ -346,6 +346,21 @@ describe('integration update automation', () => { expect(allowedPaths).toContain("'src/frontend/src/data/schemas/'"); expect(stagedPaths).toContain('src/frontend/src/data/schemas'); }); + + test('rejects changes to published Aspire CLI config schemas', () => { + const scopeCheck = script.slice(script.indexOf("Write-Section 'Phase 5")); + + expect(scopeCheck).toContain( + "$publishedSchemaPattern = '^src/frontend/src/data/schemas/aspire-config\\..+\\.schema\\.json$'" + ); + expect(scopeCheck).toContain("$isNewFile = $statusCode -eq '??' -or $statusCode[0] -eq 'A'"); + expect(scopeCheck).toMatch( + /if \(\$changedPublishedSchemas\.Count -gt 0\) \{[^}]*exit 1/ + ); + expect(scopeCheck.indexOf('$changedPublishedSchemas.Count -gt 0')).toBeLessThan( + scopeCheck.indexOf('All changes are within the allowed data paths.') + ); + }); }); describe('Community Toolkit documentation mappings', () => { From 6fe5b2a65353cfe4bae2960ad0275f1f3975037f Mon Sep 17 00:00:00 2001 From: David Pine Date: Fri, 2 Oct 2026 08:54:29 -0500 Subject: [PATCH 3/4] Generate Aspire CLI config schemas from each released CLI 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> --- src/frontend/scripts/update-schemas.ts | 309 ++++++++++++++---- .../schemas/aspire-config.13.3.0.schema.json | 38 +++ .../schemas/aspire-config.13.3.1.schema.json | 38 +++ .../schemas/aspire-config.13.3.2.schema.json | 38 +++ .../schemas/aspire-config.13.3.3.schema.json | 38 +++ .../schemas/aspire-config.13.3.4.schema.json | 38 +++ .../schemas/aspire-config.13.3.5.schema.json | 38 +++ .../schemas/aspire-config.13.4.0.schema.json | 46 ++- .../schemas/aspire-config.13.4.1.schema.json | 46 ++- .../schemas/aspire-config.13.4.2.schema.json | 46 ++- .../schemas/aspire-config.13.4.3.schema.json | 46 ++- .../schemas/aspire-config.13.4.4.schema.json | 46 ++- .../schemas/aspire-config.13.4.5.schema.json | 46 ++- .../schemas/aspire-config.13.4.6.schema.json | 46 ++- .../unit/update-integrations.vitest.test.ts | 12 + 15 files changed, 787 insertions(+), 84 deletions(-) diff --git a/src/frontend/scripts/update-schemas.ts b/src/frontend/scripts/update-schemas.ts index 2696854656..db93312c43 100644 --- a/src/frontend/scripts/update-schemas.ts +++ b/src/frontend/scripts/update-schemas.ts @@ -1,26 +1,34 @@ /** - * Syncs the aspire-config JSON Schema from microsoft/aspire into versioned - * copies under src/data/schemas/, then updates the version index. + * Generates the aspire-config JSON Schema for each stable microsoft/aspire + * release into versioned copies under src/data/schemas/, then updates the + * version index. * - * Every stable (non-prerelease, non-draft) microsoft/aspire release that ships - * the schema gets its own copy, so pinned + * Every stable (non-prerelease, non-draft) microsoft/aspire release from 13.2.0 + * on gets its own copy, so pinned * https://aspire.dev/reference/cli/configuration/schema/.json URLs - * resolve for any shipped release. A release's schema never changes after it - * ships, so existing copies are never re-fetched or overwritten, and the index's - * `latest` is always the highest version. The scheduled Integration Data - * Updater workflow runs this script through `pnpm update:all`, so new releases - * are picked up automatically, and it rejects any change to an existing copy. + * resolve for any shipped release. Each schema is generated from that release's + * own Aspire CLI: the script installs the Aspire.Cli .NET tool at the release + * version, reads `aspire config info --json`, and builds the schema the same + * way as microsoft/aspire's extension/scripts/generate-schema.js. The schema + * file checked in to microsoft/aspire isn't used, because it wasn't regenerated + * for the 13.3 and 13.4 releases and doesn't match their CLI. + * + * A release's schema never changes after it ships, so existing copies are never + * regenerated or overwritten, and the index's `latest` is always the highest + * version. The scheduled Integration Data Updater workflow runs this script + * through `pnpm update:all`, so new releases are picked up automatically, and it + * rejects any change to an existing copy. + * + * Requires the .NET SDK on PATH. * * Usage: - * pnpm update:schemas # sync every stable release - * pnpm update:schemas -- --version 13.2.3 # sync a single version tag - * pnpm update:schemas -- --version 13.3.0 --ref # label as 13.3.0 but fetch from - * # the given commit SHA or branch ref - * # (used before the v tag is - * # published) + * pnpm update:schemas # sync every stable release + * pnpm update:schemas -- --version 13.2.3 # sync a single released version */ +import { execFileSync } from 'child_process'; import fs from 'fs'; +import os from 'os'; import path from 'path'; import { fileURLToPath } from 'url'; @@ -30,7 +38,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); const FRONTEND_ROOT = path.resolve(__dirname, '..'); const ASPIRE_REPO = 'microsoft/aspire'; -const SCHEMA_SOURCE_PATH = 'extension/schemas/aspire-config.schema.json'; +const CLI_PACKAGE_ID = 'Aspire.Cli'; const SCHEMAS_DIR = path.join(FRONTEND_ROOT, 'src', 'data', 'schemas'); const INDEX_FILE = path.join(SCHEMAS_DIR, 'index.json'); @@ -56,12 +64,30 @@ interface SchemaIndex { versions: string[]; } -/** A schema version and the microsoft/aspire git ref to fetch it from. */ -interface SchemaSource { - version: string; - ref: string; +/** A property from `aspire config info --json`. */ +interface ConfigPropertyInfo { + name: string; + type: string; + description: string; + required: boolean; + subProperties?: ConfigPropertyInfo[]; + additionalPropertiesType?: string; +} + +/** A feature flag from `aspire config info --json`. */ +interface ConfigFeatureInfo { + name: string; + description: string; + defaultValue: boolean; +} + +interface ConfigInfo { + availableFeatures: ConfigFeatureInfo[]; + configFileProperties: ConfigPropertyInfo[]; } +type JsonObject = Record; + function getErrorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error); } @@ -84,8 +110,8 @@ function schemaFilePath(version: string): string { return path.join(SCHEMAS_DIR, schemaFileName(version)); } -/** Fetch every stable microsoft/aspire release that ships the schema, oldest first. */ -async function fetchStableSchemaSources(): Promise { +/** Fetch every stable microsoft/aspire release version that ships the schema, oldest first. */ +async function fetchStableSchemaVersions(): Promise { const headers: Record = { 'User-Agent': 'aspire-schema-updater', Accept: 'application/vnd.github.v3+json', @@ -94,7 +120,7 @@ async function fetchStableSchemaSources(): Promise { headers['Authorization'] = `token ${process.env.GITHUB_TOKEN}`; } - const sources = new Map(); + const versions = new Set(); for (let page = 1; ; page++) { const url = `https://api.github.com/repos/${ASPIRE_REPO}/releases` + @@ -117,7 +143,7 @@ async function fetchStableSchemaSources(): Promise { } if (compareVersions(version, MIN_SCHEMA_VERSION) >= 0) { - sources.set(version, { version, ref: release.tag_name }); + versions.add(version); } } @@ -126,24 +152,203 @@ async function fetchStableSchemaSources(): Promise { } } - if (sources.size === 0) { + if (versions.size === 0) { throw new Error(`No stable ${ASPIRE_REPO} release found at or after ${MIN_SCHEMA_VERSION}`); } - return [...sources.values()].sort((a, b) => compareVersions(a.version, b.version)); + return [...versions].sort(compareVersions); +} + +function readField(source: JsonObject, name: string): unknown { + return source[name] ?? source[name.charAt(0).toUpperCase() + name.slice(1)]; +} + +function readArray(source: JsonObject, name: string): JsonObject[] { + const value = readField(source, name); + if (!Array.isArray(value)) { + throw new Error(`Expected config info ${name} to be an array.`); + } + return value as JsonObject[]; +} + +function readString(source: JsonObject, name: string): string { + const value = readField(source, name); + if (typeof value !== 'string') { + throw new Error(`Expected config info ${name} to be a string.`); + } + return value; +} + +function readBoolean(source: JsonObject, name: string): boolean { + const value = readField(source, name); + if (typeof value !== 'boolean') { + throw new Error(`Expected config info ${name} to be a boolean.`); + } + return value; +} + +/** Normalize a property; the CLI emits PascalCase in 13.2 and camelCase from 13.3 on. */ +function normalizeProperty(property: JsonObject): ConfigPropertyInfo { + const subProperties = readField(property, 'subProperties'); + const additionalPropertiesType = readField(property, 'additionalPropertiesType'); + return { + name: readString(property, 'name'), + type: readString(property, 'type'), + description: readString(property, 'description'), + required: readBoolean(property, 'required'), + ...(subProperties == null + ? {} + : { subProperties: readArray(property, 'subProperties').map(normalizeProperty) }), + ...(additionalPropertiesType == null + ? {} + : { additionalPropertiesType: readString(property, 'additionalPropertiesType') }), + }; +} + +function normalizeConfigInfo(raw: JsonObject): ConfigInfo { + const configFileSchema = readField(raw, 'configFileSchema') as JsonObject | undefined; + if (!configFileSchema) { + throw new Error('The CLI config info output has no aspire.config.json schema.'); + } + + return { + availableFeatures: readArray(raw, 'availableFeatures').map((feature) => ({ + name: readString(feature, 'name'), + description: readString(feature, 'description'), + defaultValue: readBoolean(feature, 'defaultValue'), + })), + configFileProperties: readArray(configFileSchema, 'properties').map(normalizeProperty), + }; +} + +/** Install the released Aspire CLI in a temporary directory and read `aspire config info --json`. */ +function readReleasedConfigInfo(version: string): ConfigInfo { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `aspire-cli-${version}-`)); + const toolDir = path.join(tempDir, 'tool'); + const workDir = path.join(tempDir, 'work'); + fs.mkdirSync(workDir); + + const env = { + ...process.env, + ASPIRE_CLI_TELEMETRY_OPTOUT: '1', + DOTNET_CLI_TELEMETRY_OPTOUT: '1', + DOTNET_NOLOGO: '1', + }; + + try { + execFileSync( + 'dotnet', + ['tool', 'install', CLI_PACKAGE_ID, '--version', version, '--tool-path', toolDir], + { env, stdio: 'pipe' } + ); + + // 13.2 installs aspire.exe on Windows; later releases install an aspire.cmd shim. + const cli = ['aspire.exe', 'aspire.cmd', 'aspire'] + .map((name) => path.join(toolDir, name)) + .find((candidate) => fs.existsSync(candidate)); + if (!cli) { + throw new Error(`The ${CLI_PACKAGE_ID} ${version} tool has no aspire executable.`); + } + + // Node only runs .cmd files through a shell; the arguments are fixed literals. + const output = execFileSync(cli, ['config', 'info', '--json'], { + cwd: workDir, + encoding: 'utf-8', + env, + shell: cli.endsWith('.cmd'), + stdio: ['ignore', 'pipe', 'pipe'], + }); + + const json = output.slice(output.indexOf('{'), output.lastIndexOf('}') + 1); + return normalizeConfigInfo(JSON.parse(json) as JsonObject); + } finally { + fs.rmSync(tempDir, { recursive: true, force: true }); + } +} + +const BOOLEAN_SCHEMA = [{ type: 'boolean' }, { type: 'string', enum: ['true', 'false'] }]; + +/** Mirrors createPropertySchema in microsoft/aspire's extension/scripts/generate-schema.js. */ +function createPropertySchema(prop: ConfigPropertyInfo, info: ConfigInfo): JsonObject { + const schema: JsonObject = { description: prop.description }; + const type = prop.type.toLowerCase(); + + if (type === 'string') { + schema.type = 'string'; + } else if (type === 'boolean') { + schema.anyOf = BOOLEAN_SCHEMA; + } else if (type === 'number' || type === 'integer') { + schema.type = type; + } else if (type === 'array') { + schema.type = 'array'; + schema.items = {}; + } else if (type === 'object') { + schema.type = 'object'; + + if (prop.name === 'features') { + const properties: JsonObject = {}; + for (const feature of info.availableFeatures) { + properties[feature.name] = { + anyOf: BOOLEAN_SCHEMA, + description: feature.description, + default: feature.defaultValue, + }; + } + schema.properties = properties; + schema.additionalProperties = false; + } else if (prop.subProperties && prop.subProperties.length > 0) { + const properties: JsonObject = {}; + for (const subProp of prop.subProperties) { + properties[subProp.name] = createPropertySchema(subProp, info); + } + + if (prop.additionalPropertiesType === 'object') { + schema.additionalProperties = { + type: 'object', + properties, + additionalProperties: false, + }; + } else { + schema.properties = properties; + schema.additionalProperties = false; + } + } else if (prop.additionalPropertiesType) { + schema.additionalProperties = { type: prop.additionalPropertiesType }; + } else if (prop.name === 'packages') { + schema.additionalProperties = { type: 'string', description: 'Package version' }; + } else { + schema.additionalProperties = true; + } + } else { + schema.type = 'string'; + } + + return schema; } -/** Fetch the raw schema JSON from microsoft/aspire at the given git ref (tag, branch, or SHA). */ -async function fetchSchemaAtRef(ref: string): Promise> { - const rawUrl = - `https://raw.githubusercontent.com/${ASPIRE_REPO}/${ref}/${SCHEMA_SOURCE_PATH}`; - const res = await fetch(rawUrl, { - headers: { 'User-Agent': 'aspire-schema-updater' }, - }); - if (!res.ok) { - throw new Error(`Failed to fetch schema at ref ${ref}: ${res.status} ${res.statusText}`); +/** Mirrors generateJsonSchema in microsoft/aspire's extension/scripts/generate-schema.js. */ +function generateSchema(version: string, info: ConfigInfo): JsonObject { + const properties: JsonObject = {}; + const required: string[] = []; + for (const prop of info.configFileProperties) { + properties[prop.name] = createPropertySchema(prop, info); + if (prop.required) { + required.push(prop.name); + } } - return (await res.json()) as Record; + properties['$schema'] = { type: 'string', description: 'JSON Schema reference' }; + + return { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: `${SITE_ORIGIN}${SCHEMA_BASE_PATH}/${version}.json`, + type: 'object', + title: 'Aspire Configuration', + description: + 'Aspire CLI unified configuration file (aspire.config.json). Replaces .aspire/settings.json and apphost.run.json.', + properties, + ...(required.length > 0 ? { required } : {}), + additionalProperties: false, + }; } /** Read the current index, or return an empty one if it doesn't exist yet. */ @@ -175,18 +380,15 @@ function writeIndex(index: SchemaIndex): void { } } -/** Fetch and save the schema for a version unless a copy already exists. Returns true if saved. */ -async function syncSchema({ version, ref }: SchemaSource): Promise { +/** Generate and save the schema for a version unless a copy already exists. Returns true if saved. */ +function syncSchema(version: string): boolean { const outFile = schemaFilePath(version); if (fs.existsSync(outFile)) { return false; } - console.log(`⬇️ Fetching schema for ${version} from ${ASPIRE_REPO} @ ${ref}…`); - const schema = await fetchSchemaAtRef(ref); - - // Update $id to point to the versioned aspire.dev URL - schema['$id'] = `${SITE_ORIGIN}${SCHEMA_BASE_PATH}/${version}.json`; + console.log(`⬇️ Generating the schema for ${version} from ${CLI_PACKAGE_ID} ${version}…`); + const schema = generateSchema(version, readReleasedConfigInfo(version)); fs.mkdirSync(SCHEMAS_DIR, { recursive: true }); fs.writeFileSync(outFile, JSON.stringify(schema, null, 2) + '\n', 'utf-8'); @@ -196,36 +398,31 @@ async function syncSchema({ version, ref }: SchemaSource): Promise { async function main(): Promise { const pinnedVersion = getArgValue('--version')?.replace(/^v/, ''); - const ref = getArgValue('--ref'); - let sources: SchemaSource[]; + let versions: string[]; if (pinnedVersion) { console.log(`📌 Using pinned version: ${pinnedVersion}`); - sources = [{ version: pinnedVersion, ref: ref ?? `v${pinnedVersion}` }]; - } else if (ref) { - throw new Error('--ref requires --version to label the schema fetched from that ref'); + versions = [pinnedVersion]; } else { console.log(`🔍 Fetching stable releases from ${ASPIRE_REPO}…`); - sources = await fetchStableSchemaSources(); - console.log(`✅ Found ${sources.length} stable releases that ship the schema`); + versions = await fetchStableSchemaVersions(); + console.log(`✅ Found ${versions.length} stable releases that ship the schema`); } let savedCount = 0; - for (const source of sources) { - if (await syncSchema(source)) { + for (const version of versions) { + if (syncSchema(version)) { savedCount++; } } if (savedCount === 0) { - console.log('ℹ️ All schemas already exist; nothing to fetch.'); + console.log('ℹ️ All schemas already exist; nothing to generate.'); } // Update the index. `latest` is the highest version, so an out-of-band patch // for an older minor release never replaces a newer latest version. const index = readIndex(); - index.versions = [...new Set([...index.versions, ...sources.map((s) => s.version)])].sort( - compareVersions - ); + index.versions = [...new Set([...index.versions, ...versions])].sort(compareVersions); index.latest = index.versions[index.versions.length - 1]; writeIndex(index); diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.0.schema.json index 8095c8793c..d5ef4f7263 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.0.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.0.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json index c7908365f1..aceff7eca5 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.1.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json index 31f8bd4e71..23669f9c6e 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.2.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json index 442991a405..ee9ab4d74a 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.3.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json index 26c80f3c3e..fbe0854757 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.4.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json b/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json index f7bd5153e4..4c3afa2957 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.3.5.schema.json @@ -24,6 +24,28 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-small.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json index 824b89baa5..46ba88fe90 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.0.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json index 65c31ac3dc..363c28ffb5 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.1.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json index bd038891f7..e3a8e35bcd 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.2.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json index 5fc6791c33..47fdb8d079 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.3.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json index b5f955f76e..2dc57e6456 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.4.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json index 9acdbe7b0b..41bfc84d69 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.5.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json b/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json index 1136936123..9b0633fb8c 100644 --- a/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json +++ b/src/frontend/src/data/schemas/aspire-config.13.4.6.schema.json @@ -24,11 +24,33 @@ "description": "The Aspire channel to use for package resolution (e.g., \"stable\", \"preview\", \"staging\", \"daily\"). Used by aspire add to determine which NuGet feed to use.", "type": "string" }, + "docs": { + "description": "Documentation source overrides for aspire docs and aspire docs api. Leave these unset to use the built-in aspire.dev sources.", + "type": "object", + "properties": { + "llmsTxtUrl": { + "description": "Optional override for the llms.txt documentation source consumed by aspire docs. Defaults to https://aspire.dev/llms-full.txt.", + "type": "string" + }, + "api": { + "description": "Optional API reference source overrides consumed by aspire docs api. Leave these unset to use the built-in aspire.dev API sources.", + "type": "object", + "properties": { + "sitemapUrl": { + "description": "Optional override for the API sitemap consumed by aspire docs api. Defaults to https://aspire.dev/sitemap-0.xml.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "features": { "description": "Feature flags for enabling/disabling experimental or optional features. Key is feature name, value is enabled (true) or disabled (false).", "type": "object", "properties": { - "defaultWatchEnabled": { + "aspireSkillsRemoteFetchEnabled": { "anyOf": [ { "type": "boolean" @@ -41,10 +63,10 @@ ] } ], - "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", + "description": "(Preview) Allow the Aspire CLI to download the aspire-skills bundle from GitHub. When disabled (the 13.4 default), the CLI only uses the cached bundle and the embedded snapshot baked into the CLI; toggle on to opt in to the remote fetch path.", "default": false }, - "execCommandEnabled": { + "defaultWatchEnabled": { "anyOf": [ { "type": "boolean" @@ -57,7 +79,7 @@ ] } ], - "description": "Enable or disable the 'aspire exec' command for executing commands inside running resources", + "description": "Enable or disable watch mode by default when running Aspire applications for automatic restarts on file changes", "default": false }, "experimentalPolyglot:go": { @@ -124,6 +146,22 @@ "description": "Enable or disable experimental Rust language support for polyglot Aspire applications", "default": false }, + "nugetSignatureVerificationEnabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "true", + "false" + ] + } + ], + "description": "Enable or disable defaulting the DOTNET_NUGET_SIGNATURE_VERIFICATION environment variable for spawned processes", + "default": true + }, "showAllTemplates": { "anyOf": [ { diff --git a/src/frontend/tests/unit/update-integrations.vitest.test.ts b/src/frontend/tests/unit/update-integrations.vitest.test.ts index 2c6e25742a..adb997e71b 100644 --- a/src/frontend/tests/unit/update-integrations.vitest.test.ts +++ b/src/frontend/tests/unit/update-integrations.vitest.test.ts @@ -361,6 +361,18 @@ describe('integration update automation', () => { scopeCheck.indexOf('All changes are within the allowed data paths.') ); }); + + test('generates Aspire CLI config schemas from each released CLI', () => { + const schemaScript = readFileSync( + path.join(frontendRoot, 'scripts', 'update-schemas.ts'), + 'utf-8' + ); + + expect(schemaScript).toContain("'tool', 'install', CLI_PACKAGE_ID, '--version', version"); + expect(schemaScript).toContain("['config', 'info', '--json']"); + expect(schemaScript).not.toContain('extension/schemas/aspire-config.schema.json'); + expect(workflow).toContain('actions/setup-dotnet'); + }); }); describe('Community Toolkit documentation mappings', () => { From 62a7fffac91bc6f5554c8b8c6dfb5228172132e1 Mon Sep 17 00:00:00 2001 From: David Pine Date: Fri, 2 Oct 2026 13:11:56 -0500 Subject: [PATCH 4/4] Improve schema sync errors and validate --version 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> --- src/frontend/scripts/update-schemas.ts | 79 +++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/src/frontend/scripts/update-schemas.ts b/src/frontend/scripts/update-schemas.ts index db93312c43..baaa4bea62 100644 --- a/src/frontend/scripts/update-schemas.ts +++ b/src/frontend/scripts/update-schemas.ts @@ -23,7 +23,7 @@ * * Usage: * pnpm update:schemas # sync every stable release - * pnpm update:schemas -- --version 13.2.3 # sync a single released version + * pnpm update:schemas -- --version 13.2.3 # sync a single released version, 13.2.0 or later */ import { execFileSync } from 'child_process'; @@ -221,6 +221,51 @@ function normalizeConfigInfo(raw: JsonObject): ConfigInfo { }; } +/** Run a command and return its stdout, including its output in the error when it fails. */ +function runCommand( + description: string, + file: string, + args: string[], + options: { cwd?: string; env: NodeJS.ProcessEnv; shell?: boolean } +): string { + try { + return execFileSync(file, args, { + ...options, + encoding: 'utf-8', + stdio: ['ignore', 'pipe', 'pipe'], + }); + } catch (error) { + const { stdout, stderr } = error as { stdout?: string; stderr?: string }; + const output = [stdout, stderr] + .map((stream) => stream?.trim()) + .filter(Boolean) + .join('\n'); + // Node's message repeats stderr after its first line, so keep only the summary. + const summary = getErrorMessage(error).split('\n')[0]; + throw new Error(`${description} failed: ${summary}${output ? `\n${output}` : ''}`, { + cause: error, + }); + } +} + +/** Return the outermost JSON object in the CLI output, ignoring any text around it. */ +function extractJsonObject(output: string, description: string): JsonObject { + const start = output.indexOf('{'); + const end = output.lastIndexOf('}'); + if (start === -1 || end < start) { + throw new Error(`${description} didn't print a JSON object. Output:\n${output.trim()}`); + } + + try { + return JSON.parse(output.slice(start, end + 1)) as JsonObject; + } catch (error) { + throw new Error( + `${description} printed invalid JSON: ${getErrorMessage(error)}. Output:\n${output.trim()}`, + { cause: error } + ); + } +} + /** Install the released Aspire CLI in a temporary directory and read `aspire config info --json`. */ function readReleasedConfigInfo(version: string): ConfigInfo { const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `aspire-cli-${version}-`)); @@ -236,10 +281,11 @@ function readReleasedConfigInfo(version: string): ConfigInfo { }; try { - execFileSync( + runCommand( + `Installing ${CLI_PACKAGE_ID} ${version}`, 'dotnet', ['tool', 'install', CLI_PACKAGE_ID, '--version', version, '--tool-path', toolDir], - { env, stdio: 'pipe' } + { env } ); // 13.2 installs aspire.exe on Windows; later releases install an aspire.cmd shim. @@ -251,16 +297,14 @@ function readReleasedConfigInfo(version: string): ConfigInfo { } // Node only runs .cmd files through a shell; the arguments are fixed literals. - const output = execFileSync(cli, ['config', 'info', '--json'], { + const description = `Running aspire config info --json with ${CLI_PACKAGE_ID} ${version}`; + const output = runCommand(description, cli, ['config', 'info', '--json'], { cwd: workDir, - encoding: 'utf-8', env, shell: cli.endsWith('.cmd'), - stdio: ['ignore', 'pipe', 'pipe'], }); - const json = output.slice(output.indexOf('{'), output.lastIndexOf('}') + 1); - return normalizeConfigInfo(JSON.parse(json) as JsonObject); + return normalizeConfigInfo(extractJsonObject(output, description)); } finally { fs.rmSync(tempDir, { recursive: true, force: true }); } @@ -396,8 +440,25 @@ function syncSchema(version: string): boolean { return true; } +/** Accept `13.4.4`, `v13.4.4`, or the `v13.4.4-release` tag form, and require a version that ships the schema. */ +function parsePinnedVersion(value: string): string { + const version = STABLE_RELEASE_TAG.exec(value.startsWith('v') ? value : `v${value}`)?.[1]; + if (!version) { + throw new Error( + `Invalid --version "${value}". Use a stable release version such as ${MIN_SCHEMA_VERSION}.` + ); + } + if (compareVersions(version, MIN_SCHEMA_VERSION) < 0) { + throw new Error( + `--version ${version} is older than ${MIN_SCHEMA_VERSION}, the first release that ships the schema.` + ); + } + return version; +} + async function main(): Promise { - const pinnedVersion = getArgValue('--version')?.replace(/^v/, ''); + const versionArg = getArgValue('--version'); + const pinnedVersion = versionArg === undefined ? undefined : parsePinnedVersion(versionArg); let versions: string[]; if (pinnedVersion) {