From 2ac395cf65fcd6fe8527501f824439e8f994b5b4 Mon Sep 17 00:00:00 2001 From: David Pine <7679720+IEvangelist@users.noreply.github.com> Date: Wed, 4 Nov 2026 05:43:46 -0600 Subject: [PATCH 1/2] Open a tracking issue when the Integration Data Updater fails Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/update-integration-data.yml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/update-integration-data.yml b/.github/workflows/update-integration-data.yml index 2074dbe96..e59bc9443 100644 --- a/.github/workflows/update-integration-data.yml +++ b/.github/workflows/update-integration-data.yml @@ -33,6 +33,7 @@ jobs: timeout-minutes: 45 permissions: contents: read + issues: write steps: - name: Create GitHub App token id: app-token @@ -177,6 +178,33 @@ jobs: echo "Created $new_pr" fi + - name: Report failure + if: ${{ failure() && github.event_name == 'schedule' }} + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + shell: bash + run: | + set -euo pipefail + + # One tracking issue for consecutive failures: comment on it while it is + # open, so a broken updater is noticed without a daily issue flood. + title="Integration Data Updater is failing" + existing=$(gh issue list \ + --state open \ + --search "\"$title\" in:title" \ + --json number,title \ + --jq "map(select(.title == \"$title\")) | .[0].number // empty") + + if [ -n "$existing" ]; then + gh issue comment "$existing" --body "Scheduled run failed again: $RUN_URL" + else + gh issue create \ + --title "$title" \ + --body "The scheduled [Integration Data Updater]($RUN_URL) run failed. This issue is updated on each consecutive failure; close it once the workflow is green." + fi + - name: Summary if: ${{ always() }} shell: bash From a2614d7c3bba6ace2a0da3c737894dfdefda127f Mon Sep 17 00:00:00 2001 From: David Pine <7679720+IEvangelist@users.noreply.github.com> Date: Wed, 4 Nov 2026 05:45:46 -0600 Subject: [PATCH 2/2] Read optional catalog fields safely under StrictMode Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../generate-package-json.ps1 | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/tools/PackageJsonGenerator/generate-package-json.ps1 b/src/tools/PackageJsonGenerator/generate-package-json.ps1 index 91a3e67f5..c335398b7 100644 --- a/src/tools/PackageJsonGenerator/generate-package-json.ps1 +++ b/src/tools/PackageJsonGenerator/generate-package-json.ps1 @@ -107,18 +107,26 @@ function Remove-StalePackageJsonFiles { $integrationsFile = [System.IO.Path]::Combine($RepoRoot, "src", "frontend", "src", "data", "aspire-integrations.json") $integrations = if (Test-Path $integrationsFile) { - # Entries marked `"apiReference": false` (third-party packages) are not documented here. + # Catalog fields are optional and StrictMode throws on missing properties, so + # read them through PSObject.Properties. Entries marked `"apiReference": false` + # (third-party packages) are not documented here. @(Get-Content $integrationsFile -Raw | ConvertFrom-Json | - Where-Object { $_.apiReference -ne $false }) + Where-Object { + $apiReference = $_.PSObject.Properties['apiReference'] + -not $apiReference -or $apiReference.Value -ne $false + }) } else { @() } $catalogVersions = @{} foreach ($integration in $integrations) { - if (-not [string]::IsNullOrWhiteSpace($integration.title) -and - -not [string]::IsNullOrWhiteSpace($integration.version)) { - $catalogVersions[$integration.title] = $integration.version + $title = $integration.PSObject.Properties['title'] + $version = $integration.PSObject.Properties['version'] + if ($title -and $version -and + -not [string]::IsNullOrWhiteSpace($title.Value) -and + -not [string]::IsNullOrWhiteSpace($version.Value)) { + $catalogVersions[$title.Value] = $version.Value } }