Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
9ec8ee7
msix(t1): manifest hardening, StartupTask, CommandPalette publisher fix
May 18, 2026
e6fd8fd
msix(t2): PermissionChecker uses AppCapability on packaged builds
May 19, 2026
c6a3cd9
msix(t5): document MSIX packaging strategy for OpenClaw.WinNode.Cli
May 19, 2026
f072d6f
msix(t4): .appinstaller pipeline for non-Store auto-update
May 19, 2026
4a119f1
msix(t3): sunset Inno + Updatum, add --purge-wsl-orphans recovery CLI
May 19, 2026
c1e79f4
msix(t6): test automation + manual E2E runbook
May 19, 2026
6aea012
msix(t3-followup): OrphanPurger detects PascalCase OpenClawGateway + …
May 19, 2026
5e6b5ea
Clean up WinAppSDK ghost frames after tray tests
May 19, 2026
05b430a
Harden tray test ghost window cleanup
May 19, 2026
2fccd24
Limit ghost window cleanup to test-created frames
shanselman May 19, 2026
5cfe67c
Clean up Terminal ghost frames during tray tests
May 19, 2026
6e34c90
msix(t1-followup): fix Privacy-list blue icon background + Notificati…
May 19, 2026
9fdff05
fix(uninstall): prune empty wsl\ and %LOCALAPPDATA%\OpenClawTray\ pos…
May 19, 2026
de5e73e
fix(tests): standalone ghost-window recovery script + auto-cleanup in…
May 19, 2026
9fdf999
fix(tests): ghost-cleanup script gains -Daemon and -InstallScheduledT…
May 19, 2026
f8393ac
fix(msix): harden appinstaller update channel
May 20, 2026
74fbd79
fix(msix): harden first-launch notifications and icons
May 20, 2026
d9725a4
fix(msix): remove unsupported tile show name
May 20, 2026
4f5a154
fix(msix): retry post-install launch handoff
May 20, 2026
c0167f6
fix(msix): gate WinUI startup after install
May 20, 2026
783f2ac
test(msix): add blue lobster update marker
May 20, 2026
13fae09
fix(msix): address top AppInstaller review findings
May 21, 2026
357401d
docs(msix): compare stable update endpoints
May 21, 2026
cd11bbf
fix(msix): address review-blocking update and purge risks
May 21, 2026
2f3ca95
feat(msix): automate stable appinstaller feed PRs
May 22, 2026
49f032f
fix(msix): surface update checks and package version
May 25, 2026
2faaf21
fix(msix): align update and version surfaces
May 25, 2026
48e3fbd
fix(msix): honor installed appinstaller source
May 26, 2026
118479d
feat(msix): add explicit apply update action
May 26, 2026
6c44363
fix(msix): keep apply update action visible
May 26, 2026
97faed8
Merge remote-tracking branch 'origin/master' into feat/msix-e2e-harde…
May 26, 2026
a429cf0
fix(msix): reconcile update hardening with master
May 26, 2026
c3d68ad
fix(msix): harden appinstaller feed resolution
May 26, 2026
c4ebf1e
fix(msix): include setup engine in package
May 26, 2026
3383aa9
fix(msix): retry WinUI startup after install
May 26, 2026
05b3376
fix(msix): launch setup engine as packaged app
May 26, 2026
b21aa34
fix(msix): require both architecture release artifacts
May 26, 2026
a583fc3
fix(msix): retry setup engine XAML startup
May 26, 2026
42d0420
fix(msix): force setup engine custom entrypoint
May 27, 2026
f8e8684
fix(msix): bootstrap setup engine before XAML
May 27, 2026
47cf324
fix(msix): run setup engine from package root
May 27, 2026
43cd21a
fix(msix): make setup engine framework dependent
May 27, 2026
90ec7fc
fix(msix): retry full setup engine XAML startup
May 27, 2026
3d8bc4d
fix(msix): restore self-contained setup launch
May 27, 2026
207aadf
fix(msix): stabilize setup engine launch
May 27, 2026
897b811
fix(msix): keep setup wizard off fragile XAML path
May 27, 2026
de004ee
Merge remote-tracking branch 'origin/master' into feat/msix-e2e-harde…
May 27, 2026
31b88c3
chore(msix): prepare production AppInstaller release flow
May 27, 2026
b1a3922
fix(msix): align tray WinUI startup retry
May 27, 2026
36eca6a
revert(msix): keep UX surfaces aligned with master
May 27, 2026
cde1d96
test(msix): align assertions with packaging-only UX
May 27, 2026
73e4d5b
fix(msix): include setup engine XAML resources
May 27, 2026
4f7e9b6
fix(msix): tighten release artifacts and tray bootstrap
May 27, 2026
f13b1de
fix(msix): sign and verify package payloads
May 27, 2026
faf1e22
fix(msix): simplify release path and stabilize setup launch
May 28, 2026
41f49ef
Merge remote-tracking branch 'origin/master' into feat/msix-e2e-harde…
May 28, 2026
3ffa7a6
fix(msix): remove setup startup breadcrumbs after master sync
May 28, 2026
3cbdaeb
fix(msix): address review feedback after master sync
May 28, 2026
e697b5b
chore(msix): drop ghost-frame cleanup from packaging PR
May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 169 additions & 0 deletions .github/workflows/appinstaller-feed-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
name: AppInstaller Feed PR

on:
workflow_dispatch:
inputs:
tag:
description: Release tag whose signed MSIX assets should advance the stable AppInstaller feed
required: true
type: string

permissions:
contents: write
pull-requests: write

jobs:
update-feed:
runs-on: windows-latest

steps:
- uses: actions/checkout@v6
with:
ref: master
fetch-depth: 0

- name: Render stable AppInstaller feed files
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: |
$ErrorActionPreference = 'Stop'

$repo = '${{ github.repository }}'
$tag = '${{ inputs.tag }}'.Trim()
if ([string]::IsNullOrWhiteSpace($tag)) {
throw "tag input is required."
}
if (-not $tag.StartsWith('v', [StringComparison]::OrdinalIgnoreCase)) {
throw "Release tag must start with 'v'. Got '$tag'."
}
if ($tag.Contains('-')) {
throw "Pre-release AppInstaller feed updates are blocked until alpha channel policy is decided. Tag: $tag"
}

$release = gh release view $tag --repo $repo --json tagName,isPrerelease,assets | ConvertFrom-Json
if ($release.isPrerelease) {
throw "Pre-release AppInstaller feed updates are blocked until alpha channel policy is decided. Tag: $tag"
}

$versionText = $tag.Substring(1)
if ($versionText -notmatch '^\d+\.\d+\.\d+$') {
throw "Stable release tag must be vX.Y.Z so the MSIX/AppInstaller version can be rendered as X.Y.Z.0. Got '$tag'."
}
$version = "$versionText.0"
$publisher = 'CN=Scott Hanselman, O=Scott Hanselman, L=Forest Grove, S=Oregon, C=US'
$identityName = 'OpenClaw.Companion'
$feedDir = 'installer\appinstaller'
New-Item -ItemType Directory -Force -Path $feedDir | Out-Null

function Get-RequiredAsset {
param([Parameter(Mandatory)] [string] $Pattern)
$matches = @($release.assets | Where-Object { $_.name -like $Pattern })
if ($matches.Count -ne 1) {
$available = ($release.assets | ForEach-Object { $_.name }) -join ', '
throw "Expected exactly one release asset matching '$Pattern' for $tag; found $($matches.Count). Assets: $available"
}
return $matches[0]
}

function Get-ReleaseAssetUri {
param([Parameter(Mandatory)] [string] $AssetName)
$escapedName = [Uri]::EscapeDataString($AssetName)
return "https://github.com/$repo/releases/download/$tag/$escapedName"
}

$x64Asset = Get-RequiredAsset -Pattern "OpenClawCompanion-$versionText-win-x64.msix"
$arm64Asset = Get-RequiredAsset -Pattern "OpenClawCompanion-$versionText-win-arm64.msix"
$x64RuntimeAsset = Get-RequiredAsset -Pattern "Microsoft.WindowsAppRuntime.2-2.0.1.0-win-x64.msix"
$arm64RuntimeAsset = Get-RequiredAsset -Pattern "Microsoft.WindowsAppRuntime.2-2.0.1.0-win-arm64.msix"
$x64Uri = Get-ReleaseAssetUri -AssetName $x64Asset.name
$arm64Uri = Get-ReleaseAssetUri -AssetName $arm64Asset.name
$x64RuntimeUri = Get-ReleaseAssetUri -AssetName $x64RuntimeAsset.name
$arm64RuntimeUri = Get-ReleaseAssetUri -AssetName $arm64RuntimeAsset.name

$rawBase = "https://raw.githubusercontent.com/$repo/master/installer/appinstaller"
$x64FeedPath = Join-Path $feedDir 'openclaw-x64.appinstaller'
$arm64FeedPath = Join-Path $feedDir 'openclaw-arm64.appinstaller'

.\scripts\render-appinstaller.ps1 `
-Version $version `
-Publisher $publisher `
-IdentityName $identityName `
-ProcessorArchitecture x64 `
-MsixUri $x64Uri `
-WindowsAppRuntimeUri $x64RuntimeUri `
-AppInstallerUri "$rawBase/openclaw-x64.appinstaller" `
-OutputPath $x64FeedPath

.\scripts\render-appinstaller.ps1 `
-Version $version `
-Publisher $publisher `
-IdentityName $identityName `
-ProcessorArchitecture arm64 `
-MsixUri $arm64Uri `
-WindowsAppRuntimeUri $arm64RuntimeUri `
-AppInstallerUri "$rawBase/openclaw-arm64.appinstaller" `
-OutputPath $arm64FeedPath

.\scripts\validate-appinstaller-hosting.ps1 `
-AppInstallerPath $x64FeedPath `
-MsixUri $x64Uri `
-AllowGitHubContentTypes
.\scripts\validate-appinstaller-hosting.ps1 `
-AppInstallerPath $arm64FeedPath `
-MsixUri $arm64Uri `
-AllowGitHubContentTypes

$branch = "automation/appinstaller-feed-$($tag -replace '[^A-Za-z0-9._-]', '-')"
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git checkout -B $branch
git add $feedDir

$changes = git status --short -- $feedDir
if ([string]::IsNullOrWhiteSpace($changes)) {
Write-Host "Stable AppInstaller feed already points at $tag; no PR needed."
exit 0
}

git commit -m "chore(msix): update AppInstaller feed for $tag" `
-m "Advance the stable Windows AppInstaller feed to the signed MSIX assets from $tag." `
-m "Merging this PR advances the auto-update source for installed MSIX clients."
git push --force-with-lease origin $branch

$bodyPath = Join-Path $env:RUNNER_TEMP 'appinstaller-feed-pr.md'
@"
Updates the stable Windows AppInstaller feed files for `$tag`.

Merging this PR advances installed MSIX clients that poll the stable feed:

- x64 feed: `$rawBase/openclaw-x64.appinstaller`
- ARM64 feed: `$rawBase/openclaw-arm64.appinstaller`
- x64 MSIX: `$x64Uri`
- ARM64 MSIX: `$arm64Uri`
- x64 Windows App Runtime: `$x64RuntimeUri`
- ARM64 Windows App Runtime: `$arm64RuntimeUri`

Validation performed:

- Rendered both feed files from `scripts/render-appinstaller.ps1`
- Parsed local AppInstaller XML before publishing
- Validated GitHub release MSIX headers with candidate GitHub content-type compatibility enabled
- Blocked pre-release/alpha feed updates until channel policy is decided
"@ | Set-Content -Path $bodyPath -Encoding UTF8

$existingPr = gh pr list --repo $repo --base master --head $branch --json number --jq '.[0].number'
if ([string]::IsNullOrWhiteSpace($existingPr)) {
gh pr create `
--repo $repo `
--base master `
--head $branch `
--title "chore(msix): update AppInstaller feed for $tag" `
--body-file $bodyPath
}
else {
gh pr edit $existingPr `
--repo $repo `
--title "chore(msix): update AppInstaller feed for $tag" `
--body-file $bodyPath
}
Loading
Loading