Skip to content

Commit da95673

Browse files
committed
More progress + add MCP server for winapp
1 parent 0d7993d commit da95673

20 files changed

Lines changed: 816 additions & 65 deletions

File tree

.github/skills/fieldworks-installer-diagnostics/SKILL.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ This skill is evidence-first. Installer problems are often ambiguous until Burn
2828
5. If the UI exits silently, capture Event Viewer entries and crash dumps.
2929
6. Summarize the first failing layer: Burn bootstrapper, chained package/MSI, custom action, Windows Installer engine, or environment.
3030

31+
## WinApp MCP Runtime Evidence
32+
33+
When the WinApp MCP server is available, use it to make UI diagnostics repeatable:
34+
35+
- Launch or attach to installer windows and wait for input idle before diagnosing UI state.
36+
- If the app snapshot is empty, list visible desktop windows and use `get_focused_element` plus keyboard navigation to identify and exercise controls.
37+
- Record the observed focus path and control names in the evidence notes, especially for silent/blank UI, MSI handoff, uninstall prompts, and ARP uninstall hangs.
38+
- For safe UI-only smoke tests, stop after proving the license checkbox/Install/Cancel path; do not proceed into install unless the scenario requires machine changes.
39+
- For hangs, combine WinApp focused-element/window evidence with bundle/MSI logs, before/after snapshots, Event Viewer entries, and process lists.
40+
3141
## Commands
3242

3343
Prefer the repo helper for repeatable runs:

.github/skills/fieldworks-wix6-migration-coordinator/SKILL.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ Use this as the routing and guardrail skill for FieldWorks installer migration w
3939
4. Make the smallest change that addresses the root cause.
4040
5. Validate with the relevant build/test/evidence checklist, or clearly report why validation could not be run.
4141

42+
## WinApp MCP UI Automation
43+
44+
When the WinApp MCP server is installed, prefer it for Windows installer UI proof before falling back to raw screenshots or manual notes.
45+
46+
- Use WinApp app/window tools to launch or attach to `FieldWorksBundle.exe`, `FieldWorksOfflineBundle.exe`, or `msiexec.exe` and collect UI snapshots where available.
47+
- WixStdBA may expose little or no UI Automation tree at the launcher PID. If the app snapshot is empty, inspect visible desktop windows, use the focused element, and drive the UI with keyboard navigation (`Tab`, `Shift+Tab`, `Space`, `Return`, `Esc`) or coordinates.
48+
- For safe click-through smoke tests, prove focus and interaction by toggling the license checkbox, reaching the Install button, then canceling and confirming exit. Do not click Install unless the task explicitly calls for an install/upgrade/uninstall run on that machine.
49+
- Always pair WinApp UI evidence with bundle/MSI logs in `Output/InstallerEvidence/<RunId>/` or the VM evidence folder.
50+
4251
## Source Credibility
4352

4453
Prefer sources in this order:

.github/skills/fieldworks-wix6-ui/SKILL.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This skill keeps FieldWorks installer UI work grounded in the actual Burn + MSI
1818
2. Inspect `FLExInstaller/wix6/Shared/Base/Bundle.wxs`, `OfflineBundle.wxs`, `BundleTheme.xml`, `BundleTheme.wxl`, and `FieldWorks.Bundle.wixproj` for bundle UI behavior.
1919
3. Inspect `Framework.wxs`, `WixUI_DialogFlow.wxs`, `GIInstallDirDlg.wxs`, and `GICustomizeDlg.wxs` for MSI UI behavior.
2020
4. If custom actions affect UI, inspect `Shared/CustomActions/CustomActions/CustomAction.cs` and the custom action IDs in `Framework.wxs`.
21-
5. Gather screenshots/logs before changing visual or sequencing behavior.
21+
5. Gather screenshots/logs before changing visual or sequencing behavior. If WinApp MCP is available, use it to drive the visible installer UI and record the controls/states observed.
2222

2323
## Mental Model
2424

@@ -55,9 +55,23 @@ This skill keeps FieldWorks installer UI work grounded in the actual Burn + MSI
5555
4. Preserve localization: put translatable strings in existing `.wxl`/`.resx` patterns, not hardcoded source where localization is expected.
5656
5. Validate full, passive, and quiet modes when changing `DisplayInternalUICondition` or dialog sequencing.
5757

58+
## WinApp MCP Click-Through Workflow
59+
60+
Use WinApp MCP for bundle/MSI UI smoke tests whenever the server is available.
61+
62+
1. Launch the bundle with an explicit log path, for example `FieldWorksBundle.exe /log Output\InstallerEvidence\<RunId>\bundle.log`.
63+
2. Wait for input idle, then request a UI snapshot. If the app-root snapshot has no accessible elements, list desktop windows and use the focused element/keyboard navigation.
64+
3. Safe bundle smoke test: focus Cancel, Tab/Shift+Tab through `license terms`, `I agree to the license terms.`, `Install`, and `Cancel`; press Space on the license checkbox; verify focus can reach `Install`; then Cancel and confirm exit.
65+
4. For install-intent tests, click `Install` only when the machine/VM is prepared for an install run and evidence collection is in place.
66+
5. If the MSI internal UI opens, attach to or inspect the visible `msiexec` window and capture the Destination Folders and feature-selection screens.
67+
68+
Known behavior: the Burn launcher PID may not own the visible WixStdBA window after startup. If `get_snapshot` returns no accessible elements, use desktop window discovery, `get_focused_element`, keyboard commands, or coordinate clicks rather than concluding the UI is untestable.
69+
5870
## Evidence Checklist
5971

6072
- Bundle command and UI level used.
73+
- WinApp MCP app/window IDs or visible window title/PID used for automation.
74+
- Focus/click path used to reach key controls when UI Automation does not expose a full element tree.
6175
- Screenshot of bundle welcome/license screen.
6276
- Screenshot of MSI destination folders dialog.
6377
- Screenshot of feature selection dialog if touched.

.github/skills/fieldworks-wix6-upgrade-patching/SKILL.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ When Programs and Features shows duplicate or strange FieldWorks entries:
6161
4. Use Windows Installer product inventory and registry snapshots to identify which product/package registered each ARP row.
6262
5. Verify uninstall from ARP does not hang and removes the expected entry only.
6363

64+
## WinApp MCP For Upgrade/Uninstall Runs
65+
66+
Use WinApp MCP to observe and drive UI during upgrade, repair, and uninstall evidence runs:
67+
68+
- Attach to the visible bundle/MSI/ARP window and capture the title, PID, focused element, and any prompt text before clicking.
69+
- For ARP uninstall hangs, use WinApp to identify whether focus is on a hidden prompt, MSI dialog, bundle confirmation, or UAC-adjacent window before changing authoring.
70+
- During WiX 3 to WiX 6 upgrade tests, use WinApp screenshots/focus traces for the bundle welcome/license page, MSI destination folders page, feature tree, progress, completion, and any maintenance prompt.
71+
- Do not use WinApp to bypass prompts silently. The point is to document and reproduce the user-visible path while bundle/MSI logs and snapshots capture the underlying state.
72+
6473
## MSP Patch Gate
6574

6675
Before creating a WiX 6 MSP path, classify the change:

.github/workflows/CI.yml

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,103 @@ jobs:
6161
./Output/**/*.log
6262
./Output/**/*.log.stderr
6363
64+
wix6_installer_build:
65+
name: Build WiX 6 installer artifacts
66+
runs-on: windows-latest
67+
env:
68+
CROWDIN_API_KEY: ${{ secrets.FLEX_CROWDIN_API }}
69+
LcmRootDir: ${{ github.workspace }}/Localizations/LCM
70+
steps:
71+
- name: Checkout Files
72+
uses: actions/checkout@v6
73+
id: checkout
74+
75+
- name: Checkout Helps
76+
uses: actions/checkout@v6
77+
with:
78+
repository: 'sillsdev/FwHelps'
79+
ref: 'develop'
80+
fetch-depth: 0
81+
path: 'DistFiles/Helps'
82+
83+
- name: Checkout Localizations
84+
uses: actions/checkout@v6
85+
with:
86+
repository: 'sillsdev/FwLocalizations'
87+
ref: 'develop'
88+
fetch-depth: 0
89+
path: 'Localizations'
90+
91+
- name: Checkout liblcm
92+
uses: actions/checkout@v6
93+
with:
94+
repository: 'sillsdev/liblcm'
95+
ref: 'master'
96+
fetch-depth: 0
97+
path: 'Localizations/LCM'
98+
99+
- name: Setup dotnet
100+
uses: actions/setup-dotnet@v5
101+
with:
102+
dotnet-version: |
103+
8.0.x
104+
105+
- name: Validate installer prerequisites
106+
shell: powershell
107+
run: |
108+
.\Build\Agent\Setup-InstallerBuild.ps1 -ValidateOnly
109+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
110+
111+
- name: Build WiX 6 installer
112+
shell: powershell
113+
run: |
114+
$buildLog = Join-Path $pwd 'wix6-installer-build.log'
115+
$exitCode = 0
116+
Start-Transcript -Path $buildLog -Force
117+
try {
118+
.\build.ps1 -BuildInstaller -InstallerToolset Wix6 -Configuration Release -Verbosity detailed -MsBuildArgs @('/bl:wix6-installer-build.binlog','/p:FastBundleBuild=0')
119+
$exitCode = $LASTEXITCODE
120+
}
121+
catch {
122+
Write-Error $_
123+
$exitCode = 1
124+
}
125+
finally {
126+
Stop-Transcript
127+
}
128+
if ($exitCode -ne 0) { exit $exitCode }
129+
130+
- name: Audit WiX 6 installer evidence
131+
shell: powershell
132+
run: |
133+
.\Build\Agent\Test-Wix6InstallerBuildEvidence.ps1 -Configuration Release -Platform x64 -BuildLogPath .\wix6-installer-build.log -ReportPath .\Output\InstallerEvidence\wix6-ci-build-audit.txt
134+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
135+
136+
- name: Upload WiX 6 installer artifacts
137+
uses: actions/upload-artifact@v7
138+
if: ${{ !cancelled() }}
139+
with:
140+
name: wix6-installer-artifacts
141+
if-no-files-found: error
142+
path: |
143+
FLExInstaller/wix6/bin/x64/Release/FieldWorksBundle.exe
144+
FLExInstaller/wix6/bin/x64/Release/FieldWorksBundle.wixpdb
145+
FLExInstaller/wix6/bin/x64/Release/FieldWorksOfflineBundle.exe
146+
FLExInstaller/wix6/bin/x64/Release/FieldWorksOfflineBundle.wixpdb
147+
FLExInstaller/wix6/bin/x64/Release/en-US/FieldWorks.msi
148+
FLExInstaller/wix6/bin/x64/Release/en-US/FieldWorks.wixpdb
149+
150+
- name: Upload WiX 6 build evidence
151+
uses: actions/upload-artifact@v7
152+
if: ${{ always() }}
153+
with:
154+
name: wix6-installer-build-evidence
155+
if-no-files-found: warn
156+
path: |
157+
wix6-installer-build.log
158+
wix6-installer-build.binlog
159+
Output/InstallerEvidence/**
160+
64161
publish_test_results:
65162
name: Publish Test Results
66163
if: ${{ !cancelled() }}

.github/workflows/base-installer-cd.yml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
name: Base Installer
1+
name: Legacy Base Installer (WiX 3)
22

33
# Builds the FieldWorks Base Installers (On- and Offline) (x64).
4+
# Transitional WiX 3 release lane: this workflow still checks out PatchableInstaller/genericinstaller.
5+
# The WiX 6 migration lane lives in CI.yml and must not depend on PatchableInstaller.
46
# If `make_release` is true:
57
# - Uploads installers to https://flex-updates.s3.amazonaws.com/?prefix=jobs/FieldWorks-Win-all-Release-Base.
68
# - Tags the repository.
@@ -23,7 +25,7 @@ on:
2325
required: false
2426
default: 'develop'
2527
installer_ref:
26-
description: 'Commit-ish for PatchableInstaller repository'
28+
description: 'Commit-ish for PatchableInstaller repository (legacy WiX 3 lane only)'
2729
required: false
2830
default: 'master'
2931
localizations_ref:
@@ -40,7 +42,7 @@ on:
4042
default: 'false'
4143

4244
concurrency:
43-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
45+
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
4446
cancel-in-progress: true
4547

4648
jobs:
@@ -49,7 +51,7 @@ jobs:
4951
CROWDIN_API_KEY: ${{ secrets.FLEX_CROWDIN_API }}
5052
LcmRootDir: ${{ github.workspace }}/Localizations/LCM
5153
FILESTOSIGNLATER: ./signExternally
52-
name: Build Debug and run Tests
54+
name: Build legacy WiX 3 base installer and run tests
5355
runs-on: windows-latest
5456
steps:
5557
- name: Compute build number
@@ -60,6 +62,7 @@ jobs:
6062
$combined = $lastJenkins + $githubRun
6163
echo "Calculated build number: $combined"
6264
echo "FW_BUILD_NUMBER=$combined" >> $env:GITHUB_ENV
65+
echo "fw_build_number=$combined" >> $env:GITHUB_OUTPUT
6366
6467
- name: Checkout Files
6568
uses: actions/checkout@v6
@@ -77,7 +80,7 @@ jobs:
7780
fetch-depth: 0
7881
path: 'DistFiles/Helps'
7982

80-
- name: Checkout PatchableInstaller
83+
- name: Checkout PatchableInstaller (legacy WiX 3 only)
8184
uses: actions/checkout@v6
8285
id: installer-checkout
8386
with:
@@ -295,8 +298,8 @@ jobs:
295298
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe
296299
with:
297300
target_commitish: ${{ github.event.inputs.fw_ref || github.ref }}
298-
tag_name: build-${{ env.FW_BUILD_NUMBER }}
299-
name: "FieldWorks Base Build #${{ env.FW_BUILD_NUMBER }}"
301+
tag_name: build-${{ steps.build_number.outputs.fw_build_number }}
302+
name: "FieldWorks Base Build #${{ steps.build_number.outputs.fw_build_number }}"
300303
draft: false
301304
prerelease: true
302305
fail_on_unmatched_files: true

.github/workflows/patch-installer-cd.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
name: Patch Installer
1+
name: Legacy Patch Installer (WiX 3)
22

33
# Builds the FieldWorks Patch Installer on the specified `base_release`
4+
# Transitional WiX 3 patch lane: WiX 6 patch/MSP support is deferred and not provided by this workflow.
5+
# This workflow still checks out PatchableInstaller/genericinstaller for the legacy patch process.
46
# If `make_release` is true, uploads installers to https://flex-updates.s3.amazonaws.com/?prefix=jobs/FieldWorks-Win-all-Release-Patch.
57
# Saves the build log as an artifact of the workflow run.
68
# Note: FW_BUILD_NUMBER is higher than GITHUB_RUN_NUMBER because it needs to be higher than the build number on artifacts from our previous system.
@@ -23,7 +25,7 @@ on:
2325
required: false
2426
default: 'develop'
2527
installer_ref:
26-
description: 'Commit-ish for PatchableInstaller repository'
28+
description: 'Commit-ish for PatchableInstaller repository (legacy WiX 3 lane only)'
2729
required: false
2830
default: 'master'
2931
localizations_ref:
@@ -50,7 +52,7 @@ on:
5052
default: 'true'
5153

5254
concurrency:
53-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
55+
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
5456
cancel-in-progress: true
5557

5658
jobs:
@@ -63,7 +65,7 @@ jobs:
6365
FILESTOSIGNLATER: ./signExternally
6466
GH_TOKEN: ${{ github.token }}
6567
BASE_BUILD_NUMBER: ${{ inputs.base_build_number || '1416' }}
66-
name: Build Debug and run Tests
68+
name: Build legacy WiX 3 patch installer and run tests
6769
runs-on: windows-latest
6870
steps:
6971
- name: Compute build number for archival
@@ -92,7 +94,7 @@ jobs:
9294
fetch-depth: 0
9395
path: 'DistFiles/Helps'
9496

95-
- name: Checkout PatchableInstaller
97+
- name: Checkout PatchableInstaller (legacy WiX 3 only)
9698
uses: actions/checkout@v6
9799
id: installer-checkout
98100
with:

0 commit comments

Comments
 (0)