Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
320 commits
Select commit Hold shift + click to select a range
23f368f
chore: remove dead wine-exe-hashes.json
hughobrien May 19, 2026
6d4c891
chore: remove dead build-stub-thipx.sh (superseded by Nix ra-thipx32-…
hughobrien May 19, 2026
852234e
chore: remove dead soviet-cdlabel-patch.py and soviet-m2-scenario-pat…
hughobrien May 19, 2026
07a42b9
chore: remove 3 dead scripts (wine-ra-difficulty-capture, cdlabel-pat…
hughobrien May 19, 2026
a18c1c9
chore: remove wine-cnc-capture.sh and ra-data-verify.py
hughobrien May 19, 2026
0fb1957
chore: remove dead wine-ra-setup.sh and wine-td-setup.sh
hughobrien May 19, 2026
2b92630
fix: remove archived reference — only Nix is supported
hughobrien May 19, 2026
0d2bfb0
chore: remove dead tgautil.py and archived scripts
hughobrien May 19, 2026
ad431ed
chore: reorganize scripts into ra/ and td/ subdirectories
hughobrien May 19, 2026
50fff3f
feat: create scripts/ra/ra-native-smoke.sh with boot/release/m2 modes
hughobrien May 19, 2026
0554c05
Consolidate RA native smoke tests into single script with modes
hughobrien May 19, 2026
7ae5a4c
chore: remove dead run-e2e.sh
hughobrien May 19, 2026
ece72b6
refactor: make RA Nix package use cmake (like TD already does)
hughobrien May 19, 2026
ed96f89
chore: move RA patch scripts into scripts/ra/ with ra- prefix
hughobrien May 19, 2026
51cae69
chore: remove dead xvfb-ensure.sh
hughobrien May 19, 2026
7de8f67
chore: fix scripts.md alphabetical index and stale references
hughobrien May 19, 2026
efc9b8e
spec: wine capture driver consolidation
hughobrien May 19, 2026
717f4c1
refactor: make Wine prefix ephemeral (tempdir instead of ~/.wine-chec…
hughobrien May 19, 2026
5f2ba6e
feat: add GDI renderer config and REDALERT.INI to Wine driver
hughobrien May 19, 2026
76d549d
feat: add capture_boot() method for title/menu screenshots
hughobrien May 19, 2026
be6227d
feat: add title/menu capture types to capture-checkpoint.py
hughobrien May 19, 2026
bf162ac
chore: remove wine-ra.sh (superseded by capture-checkpoint.py)
hughobrien May 19, 2026
dbaafdf
spec: native RA autostart for headless screenshot capture
hughobrien May 19, 2026
1e14985
feat: wire RA_AUTOSTART_SCENARIO env var in native RA build
hughobrien May 19, 2026
b8354dc
fix: set native RA cwd to data directory for headless capture
hughobrien May 19, 2026
0d7f995
docs: spec for compare output dir and HTTP server
hughobrien May 19, 2026
e684526
feat: timestamped session dirs under /tmp/battlecontrol + HTTP server
hughobrien May 19, 2026
30dc6ec
chore: remove --dry-run flag from capture-checkpoint
hughobrien May 19, 2026
4eb3d80
chore: suppress LP64 audit output when clean
hughobrien May 19, 2026
f72526f
fix: standardize Wine OG pipeline on cnc-ddraw, drop SDM stub
hughobrien May 19, 2026
d029d25
fix: load HIRES.MIX before LORES.MIX in native RA bootstrap
hughobrien May 19, 2026
e087b9a
docs: add debugging.md with reusable parity-debugging patterns
hughobrien May 19, 2026
44e6991
chore: capture-checkpoint auto-restarts stale HTTP server on wrong dir
hughobrien May 19, 2026
590d976
fix: split RA_AUTOSTART gate, move smoke-test probes behind RA_SMOKE_…
hughobrien May 19, 2026
440a945
fix: native autostart picks DIFF_NORMAL; TIM-310 force-win gated on R…
hughobrien May 19, 2026
45f35a3
fix: native RA at canonical 640x400; harden capture pipeline
hughobrien May 19, 2026
5e767d0
chore: apply ruff format to wine.py
hughobrien May 19, 2026
8ee0172
feat: hard-fail WineCapture init on orphan cache state + sweep script
hughobrien May 19, 2026
c1240a2
chore: apply ruff format to sweep-state.py
hughobrien May 19, 2026
39d1880
refactor: auto-sweep at end of every capture run
hughobrien May 19, 2026
d3cb8d4
docs: anchor cnc-ddraw vs DDrawCompat decision in wine.py
hughobrien May 19, 2026
deee1ec
feat(linux): apply SHAPE_FADING remap LUT in Buffer_Frame_To_Page
hughobrien May 20, 2026
178ac53
docs: catalogue Linux stub landmines surfaced during remap fix
hughobrien May 20, 2026
a5b3d67
feat(linux): apply SHAPE_GHOST translucency table in Buffer_Frame_To_…
hughobrien May 20, 2026
1881f22
docs: survey GCC drift — release artefacts not standardised on clang
hughobrien May 20, 2026
30b2764
build: standardise native Linux toolchain on clang
hughobrien May 20, 2026
4e993fd
docs: note pre-existing TD nix package SDL2_ttf gap
hughobrien May 20, 2026
21bdb35
docs: archive investigation notes, plans, and cell-template issue brief
hughobrien May 20, 2026
9e0387f
FPS-limit Wine cnc-ddraw builds to 30 fps
hughobrien May 18, 2026
bccb00b
Add ra-archive and redalert-modding skills from ra.afraid.org research
hughobrien May 18, 2026
3921c96
add ra-autostart-patch for zero-click mission boot in Wine
hughobrien May 18, 2026
1877085
spec: parity checkpoint capture system
hughobrien May 18, 2026
66776eb
plan: parity checkpoint capture system implementation
hughobrien May 18, 2026
a93591a
feat: add common capture utilities (Xvfb, openbox, ffmpeg)
hughobrien May 18, 2026
eb09024
feat: add Native capture driver and comparison wrapper
hughobrien May 18, 2026
7786ec0
feat: add capture-checkpoint orchestrator and WASM capture driver
hughobrien May 18, 2026
6ce5d51
refactor: subsume capture scripts into capture-checkpoint system
hughobrien May 18, 2026
b94cf02
refactor: archive wine-allied-m2 and wine-soviet-m2 scripts
hughobrien May 18, 2026
06c90ea
Rename nix apps to match tool/script names
hughobrien May 18, 2026
56f87d4
Drop skill- prefix from companion scripts
hughobrien May 18, 2026
2520453
Remove redundant CI-specific nix apps
hughobrien May 18, 2026
c53238c
Fix native_capture extension tool stale reference
hughobrien May 18, 2026
2338bf6
Rename extension tools to match canonical nix app names
hughobrien May 18, 2026
cab8ab2
Add README to scripts/archive/ explaining subsumed scripts
hughobrien May 18, 2026
b4f0f58
Remove ci-build-wasm — use wasm-loop instead
hughobrien May 18, 2026
b8fb59f
Deprecate extension tool system, add wine-check nix app
hughobrien May 18, 2026
340a409
Fold clang-tidy and cppcheck into ci gate
hughobrien May 18, 2026
37da661
Remove ci-wasm-smoke, ci-cc-setup apps; fold clang-tidy/cppcheck into ci
hughobrien May 18, 2026
373795e
Remove data-verify and capture-native nix apps
hughobrien May 18, 2026
ef36fd3
default nix app now runs toolchain-check instead of redalert
hughobrien May 18, 2026
c0d0067
Merge release-build-ra and release-build-td into single release app
hughobrien May 18, 2026
dadc306
Remove serve-wasm and serve-assets — use serve for both
hughobrien May 18, 2026
47b6086
Merge test-t1 and test-t2 into test
hughobrien May 18, 2026
a494b3b
Remove stale test-t1 and test-t2 app definitions
hughobrien May 18, 2026
c8859b9
Bake validate-wasm into build-wasm, remove standalone validate-wasm app
hughobrien May 18, 2026
52a393e
Update scripts.md and workflows.md to reflect 27-app toolset
hughobrien May 18, 2026
a53e560
Simplify flake to combinatorial {game}-{platform}-{action} naming
hughobrien May 18, 2026
361e71e
Remove redundant include-shim nix app (auto-run by CMake)
hughobrien May 18, 2026
8cae850
Reformat run() function in regression scripts for readability
hughobrien May 18, 2026
0c9aa07
Replace VQA Python tooling with vqa-decode + vqa-compare
hughobrien May 18, 2026
4cb844d
Add dev cycle simplification design doc — four-tier lint/build/smoke/…
hughobrien May 18, 2026
6f57ffe
Add implementation plan for dev cycle simplification
hughobrien May 18, 2026
f1d84e8
Add _gating.sh — diff-based target gating helper
hughobrien May 18, 2026
c9b1369
Add test.sh — build + full regression orchestrator
hughobrien May 18, 2026
bf0cbc9
Remove ci-local.sh and per-game regression scripts
hughobrien May 18, 2026
bc03faf
Rewire flake.nix: add lint/build/smoke/test tier apps, simplify pre-c…
hughobrien May 18, 2026
26d2aeb
Collapse CI to single nix run .#test job
hughobrien May 18, 2026
4a200be
Fix shellcheck warnings in test-runner.sh
hughobrien May 18, 2026
05e4a79
Fix pipefail in lint.sh clang-tidy tee
hughobrien May 18, 2026
f243f1d
Update docs to reflect four-tier lint/build/smoke/test workflow
hughobrien May 18, 2026
ca088b0
Fix pre-commit hook: guard with IN_NIX_SHELL check, update regression…
hughobrien May 18, 2026
01f9e5d
feat: add scripts/check.sh for heavyweight static analysis
hughobrien May 19, 2026
cb641a7
refactor: remove clang-tidy and cppcheck from lint.sh
hughobrien May 19, 2026
e1baba5
refactor: rename smoke→test, test→regression
hughobrien May 19, 2026
4cd0385
feat(flake): rename smoke→test, test→regression, add check app
hughobrien May 19, 2026
58cf6ce
ci: update to nix run .#regression
hughobrien May 19, 2026
3e2784e
docs: update scripts.md for lint/check split and smoke→test→regressio…
hughobrien May 19, 2026
aee1f08
docs: add dev cycle simplification v2 spec and implementation plan
hughobrien May 19, 2026
d61bece
docs: add dev cycle simplification v3 design spec
hughobrien May 19, 2026
685dd1f
docs: add auto-fix mode to lint in v3 design spec
hughobrien May 19, 2026
b3c2161
feat(lint): auto-fix instead of check-only
hughobrien May 19, 2026
0b3867a
refactor(regression): always run all targets, no diff-gating
hughobrien May 19, 2026
34ac84b
refactor(flake): remove 8 per-game build/test apps
hughobrien May 19, 2026
5f42335
ci: use test tier instead of regression
hughobrien May 19, 2026
fea90cd
docs: update AGENTS.md for v3 dev cycle
hughobrien May 19, 2026
ae62d96
docs: update scripts.md for v3 dev cycle
hughobrien May 19, 2026
6a10940
fix(release): use nix build instead of ancient manual compile
hughobrien May 19, 2026
e386051
fix(release): replace removed wasm build apps with direct cmake
hughobrien May 19, 2026
05a9e4b
refactor: remove unused screenshot nix app
hughobrien May 19, 2026
cfd8977
fix(release): shorten long lines in release.yml
hughobrien May 19, 2026
f652281
refactor: remove unused capture-wine nix app
hughobrien May 19, 2026
f0852b9
feat: add parity nix app, remove 4 redundant app wrappers
hughobrien May 19, 2026
dcec758
refactor: remove capture-checkpoint nix app, absorb into parity
hughobrien May 19, 2026
1af90fa
chore: remove accidentally committed .swp file
hughobrien May 19, 2026
0cb593c
docs: update markdown files to reflect current app surface
hughobrien May 19, 2026
1112a36
chore: remove .swp from tracking, add to gitignore
hughobrien May 19, 2026
4f2311c
chore: remove dead setup-run-ra-remastered.sh
hughobrien May 19, 2026
3d65c76
chore: remove dead build-td.sh (redundant with build-native.sh)
hughobrien May 19, 2026
3537c4e
chore: remove dead wine-exe-hashes.json
hughobrien May 19, 2026
bbda1dd
chore: remove dead build-stub-thipx.sh (superseded by Nix ra-thipx32-…
hughobrien May 19, 2026
6d08874
chore: remove dead soviet-cdlabel-patch.py and soviet-m2-scenario-pat…
hughobrien May 19, 2026
249b720
chore: remove 3 dead scripts (wine-ra-difficulty-capture, cdlabel-pat…
hughobrien May 19, 2026
6b62e5b
chore: remove wine-cnc-capture.sh and ra-data-verify.py
hughobrien May 19, 2026
a43686e
chore: remove dead wine-ra-setup.sh and wine-td-setup.sh
hughobrien May 19, 2026
8c504d4
fix: remove archived reference — only Nix is supported
hughobrien May 19, 2026
a1e4e09
chore: remove dead tgautil.py and archived scripts
hughobrien May 19, 2026
b2706e8
chore: reorganize scripts into ra/ and td/ subdirectories
hughobrien May 19, 2026
c388740
feat: create scripts/ra/ra-native-smoke.sh with boot/release/m2 modes
hughobrien May 19, 2026
ca409f0
Consolidate RA native smoke tests into single script with modes
hughobrien May 19, 2026
25369f3
chore: remove dead run-e2e.sh
hughobrien May 19, 2026
291d81b
refactor: make RA Nix package use cmake (like TD already does)
hughobrien May 19, 2026
e734e36
chore: move RA patch scripts into scripts/ra/ with ra- prefix
hughobrien May 19, 2026
b32e464
chore: remove dead xvfb-ensure.sh
hughobrien May 19, 2026
76e57fc
chore: fix scripts.md alphabetical index and stale references
hughobrien May 19, 2026
3368cbe
spec: wine capture driver consolidation
hughobrien May 19, 2026
8d8300e
refactor: make Wine prefix ephemeral (tempdir instead of ~/.wine-chec…
hughobrien May 19, 2026
b533198
feat: add GDI renderer config and REDALERT.INI to Wine driver
hughobrien May 19, 2026
8105fac
feat: add capture_boot() method for title/menu screenshots
hughobrien May 19, 2026
044a010
feat: add title/menu capture types to capture-checkpoint.py
hughobrien May 19, 2026
30e0d40
chore: remove wine-ra.sh (superseded by capture-checkpoint.py)
hughobrien May 19, 2026
d99ddc4
spec: native RA autostart for headless screenshot capture
hughobrien May 19, 2026
4a4508a
feat: wire RA_AUTOSTART_SCENARIO env var in native RA build
hughobrien May 19, 2026
ccd988c
fix: set native RA cwd to data directory for headless capture
hughobrien May 19, 2026
d00a89c
docs: spec for compare output dir and HTTP server
hughobrien May 19, 2026
9c7e91a
feat: timestamped session dirs under /tmp/battlecontrol + HTTP server
hughobrien May 19, 2026
4bcc647
chore: remove --dry-run flag from capture-checkpoint
hughobrien May 19, 2026
e5ad2a8
chore: suppress LP64 audit output when clean
hughobrien May 19, 2026
10c9cc7
fix: standardize Wine OG pipeline on cnc-ddraw, drop SDM stub
hughobrien May 19, 2026
0633906
fix: load HIRES.MIX before LORES.MIX in native RA bootstrap
hughobrien May 19, 2026
882ae19
docs: add debugging.md with reusable parity-debugging patterns
hughobrien May 19, 2026
5079832
chore: capture-checkpoint auto-restarts stale HTTP server on wrong dir
hughobrien May 19, 2026
db55755
fix: split RA_AUTOSTART gate, move smoke-test probes behind RA_SMOKE_…
hughobrien May 19, 2026
555fa5e
fix: native autostart picks DIFF_NORMAL; TIM-310 force-win gated on R…
hughobrien May 19, 2026
693af8e
fix: native RA at canonical 640x400; harden capture pipeline
hughobrien May 19, 2026
2118c09
chore: apply ruff format to wine.py
hughobrien May 19, 2026
af78895
feat: hard-fail WineCapture init on orphan cache state + sweep script
hughobrien May 19, 2026
306f248
chore: apply ruff format to sweep-state.py
hughobrien May 19, 2026
b65f8a4
refactor: auto-sweep at end of every capture run
hughobrien May 19, 2026
e2a4a06
docs: anchor cnc-ddraw vs DDrawCompat decision in wine.py
hughobrien May 19, 2026
d22161d
feat(linux): apply SHAPE_FADING remap LUT in Buffer_Frame_To_Page
hughobrien May 20, 2026
6ffce8a
docs: catalogue Linux stub landmines surfaced during remap fix
hughobrien May 20, 2026
365948f
feat(linux): apply SHAPE_GHOST translucency table in Buffer_Frame_To_…
hughobrien May 20, 2026
a9733f5
docs: survey GCC drift — release artefacts not standardised on clang
hughobrien May 20, 2026
1c1f325
build: standardise native Linux toolchain on clang
hughobrien May 20, 2026
a73e974
docs: note pre-existing TD nix package SDL2_ttf gap
hughobrien May 20, 2026
e49d0ad
docs: archive investigation notes, plans, and cell-template issue brief
hughobrien May 20, 2026
9f700e8
fix ra allied mission parity rendering
hughobrien May 20, 2026
f244393
fix clipped terrain stamp origin
hughobrien May 20, 2026
3429c9c
document remaining shroud translucency divergences
hughobrien May 20, 2026
7a1864f
hide overlays in fogged cells
hughobrien May 20, 2026
ce2a5ee
fix inactive radar cover redraw
hughobrien May 20, 2026
5ae1b8c
add OpenWatcom to dev shell
hughobrien May 20, 2026
3900612
fix fading table palette search
hughobrien May 20, 2026
4134b53
harden RA mission parity capture sync
hughobrien May 20, 2026
527653a
prune old capture sessions
hughobrien May 20, 2026
2ea6726
Fix RA keyframe delta decoding
hughobrien May 20, 2026
5e160b3
Refactor RA stamp blitter around disk layout
hughobrien May 21, 2026
42810c5
Harden RA mission capture frame trust
hughobrien May 21, 2026
cf59994
Implement RA predator shape blit
hughobrien May 21, 2026
010047e
Improve RA capture tooling diagnostics
hughobrien May 21, 2026
56c3144
Fix RA Wine mission autostart tooling
hughobrien May 21, 2026
723a0b4
Add capture preflight guardrails
hughobrien May 21, 2026
c96f873
Add Wine screen timeline diagnostics
hughobrien May 21, 2026
7bfedd1
Add Wine mission state probe
hughobrien May 21, 2026
e9abfd8
Add native mission outcome tracing
hughobrien May 21, 2026
d9b055e
Prefer native internal capture frames
hughobrien May 21, 2026
fe5c310
Add capture strip runner
hughobrien May 21, 2026
7fadf27
Add capture matrix runner
hughobrien May 21, 2026
6fe5fe9
Record Wine patch manifests
hughobrien May 21, 2026
3bfcf9c
Add region comparison reports
hughobrien May 21, 2026
e2fea89
Add port history helper
hughobrien May 21, 2026
81b9f84
Enrich capture diagnostics
hughobrien May 21, 2026
f4eded7
Improve capture binary preflight
hughobrien May 21, 2026
ee4619d
Default capture binaries from PATH and build output
hughobrien May 21, 2026
59c6006
Expose Wine frame candidate failures
hughobrien May 21, 2026
d21d02c
Avoid Wine gameplay settle drift
hughobrien May 21, 2026
4770815
Allow per-mission Wine settle policy
hughobrien May 21, 2026
33e299a
Reject invalid Wine gameplay captures
hughobrien May 21, 2026
6aa9598
Default mission captures to fixed random seed
hughobrien May 21, 2026
5167aa6
Sweep Wine capture state before parity runs
hughobrien May 21, 2026
499cfe2
Fix Wine Soviet capture gamma drift
hughobrien May 21, 2026
f67921f
Reject Wine crash dialogs in parity captures
hughobrien May 21, 2026
dbfe84e
Fix Soviet native capture side assets
hughobrien May 21, 2026
24efe67
Document unified RA95 patcher design
hughobrien May 21, 2026
0678233
Plan unified RA95 patcher implementation
hughobrien May 21, 2026
a7a74dd
test: cover unified RA95 patcher contract
hughobrien May 21, 2026
a718d24
feat: add RA95 patch registry core
hughobrien May 21, 2026
2c1c37a
fix: harden RA95 patch registry core
hughobrien May 21, 2026
b406d31
feat: add RA95 mission patch modes
hughobrien May 21, 2026
be33256
feat: add unified RA95 patch CLI
hughobrien May 21, 2026
bf8bed3
fix: support module execution for RA95 patch CLI
hughobrien May 21, 2026
f5134cf
fix: honor side for explicit RA95 cd-label patches
hughobrien May 21, 2026
699643e
build: use unified RA95 base patcher
hughobrien May 21, 2026
995ccdb
refactor: route Wine RA95 patching through unified utility
hughobrien May 21, 2026
0f0b55c
fix: remove stale Wine RA95 patch chain
hughobrien May 21, 2026
7b991d5
fix: support non-mission Wine RA95 staging
hughobrien May 21, 2026
74507ae
docs: deprecate standalone RA95 patch scripts
hughobrien May 21, 2026
d854610
fix: quarantine legacy game-in-focus patch
hughobrien May 21, 2026
08e511a
docs: remove legacy game-in-focus chain references
hughobrien May 21, 2026
4dde7fc
docs: mark legacy game-in-focus rationale incorrect
hughobrien May 21, 2026
f0b06cd
Remove legacy RA95 patch scripts
hughobrien May 21, 2026
b3efcdd
Merge RA95 patch engine into CLI
hughobrien May 21, 2026
373cb24
fix: make flake tooling self-contained
hughobrien May 21, 2026
7983b79
delete old build files
hughobrien May 21, 2026
db1f986
divergences
hughobrien May 21, 2026
ce80935
Add deterministic Wine sequence capture
hughobrien May 21, 2026
4fe5d2d
Add native sequence capture harness
hughobrien May 21, 2026
b258767
Add deterministic native sequence capture
hughobrien May 22, 2026
a854940
Add sequence alignment report tool
hughobrien May 22, 2026
2767cef
Document frame sequence parity workflow
hughobrien May 22, 2026
89e1625
Fix RA sidebar powerbar overlap
hughobrien May 22, 2026
1374a64
Fix RA shroud fade table parity
hughobrien May 22, 2026
63516dd
Fix local test gate tooling
hughobrien May 22, 2026
20e775f
Fix RA sidebar overlap repair ordering
hughobrien May 22, 2026
c4c20e2
Fix RA sidebar background invalidation
hughobrien May 22, 2026
89191c4
Add MinGW RA parity build
hughobrien May 22, 2026
a141026
Document Red Alert run modes
hughobrien May 22, 2026
327bee1
Expand project overview sketch
hughobrien May 22, 2026
1019b8a
Document parity capture details
hughobrien May 22, 2026
e52cfff
Document Nix parity workflow benefits
hughobrien May 22, 2026
90f1378
Fix MinGW RA SDL3 runtime staging
hughobrien May 22, 2026
ec2ea1f
Add MinGW Wine probe target
hughobrien May 22, 2026
2ab077a
Fix MinGW binary MIX reads
hughobrien May 22, 2026
b698cb2
Capture MinGW frames through engine trap
hughobrien May 22, 2026
cc9b34a
TIM-924: add _saveToIDBFS, _loadFromIDBFS, _validateGameData to prelo…
hughobrien May 22, 2026
3e4f157
Merge parity tooling and RA retail fixes
hughobrien May 24, 2026
d26d1f7
Fix Nix build toolchain path
hughobrien May 24, 2026
0482873
Add cleanup app for parity artifacts
hughobrien May 24, 2026
c273657
Mark Allied L5 scenario parity passing
hughobrien May 24, 2026
edb0722
Match RA95 prebuilt team recruitment
hughobrien May 24, 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
1 change: 0 additions & 1 deletion .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,4 @@ CheckOptions:
bugprone-argument-comment.StrictMode: false

HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false
FormatStyle: none
303 changes: 28 additions & 275 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# CI — thin wrapper around flake apps.
# Local equivalent: nix run .#ci-build-native
# nix run .#ci-vqa
# nix run .#ci-build-wasm
# nix run .#ci-clang-tidy
# CI — thin wrapper around nix run .#test.
# Primary testing happens locally; this confirms the deploy artifact.
# Local equivalent: nix run .#test

name: CI

Expand All @@ -21,10 +19,10 @@ env:
EM_CACHE_DIR: ${{ github.workspace }}/.emscripten-cache

jobs:
build:
name: Compile and link (clang)
test:
name: Test (build + lint + boot tests)
runs-on: ubuntu-24.04
timeout-minutes: 30
timeout-minutes: 60

steps:
- uses: actions/checkout@v6.0.2
Expand All @@ -35,6 +33,9 @@ jobs:
extra_nix_config: |
experimental-features = nix-command flakes

- name: Install system deps
run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends cppcheck ffmpeg

- name: Cache ccache
uses: actions/cache@v5.0.5
with:
Expand All @@ -43,285 +44,37 @@ jobs:
restore-keys: |
ccache-

- name: Build native + smoke
run: |
nix develop --command bash -c "
export CCACHE_DIR=${{ env.CCACHE_DIR }}
ccache --zero-stats
ccache --max-size 500M
nix run .#ci-build-native
echo '### ccache hit rate' >> \"$GITHUB_STEP_SUMMARY\"
ccache --show-stats >> \"$GITHUB_STEP_SUMMARY\"
ccache --show-stats
"

vqa-pixel-diff:
name: VQA codec pixel-diff
runs-on: ubuntu-24.04
timeout-minutes: 10

steps:
- uses: actions/checkout@v6.0.2

- name: Install Nix
uses: cachix/install-nix-action@v31.10.6

- name: Install ffmpeg
run: sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends ffmpeg

- name: Run VQA pixel-diff
run: nix develop --command nix run .#ci-vqa

wine-comparison:
name: Wine OG comparison
runs-on: ubuntu-24.04
timeout-minutes: 30

steps:
- uses: actions/checkout@v6.0.2

- name: Install Nix
uses: cachix/install-nix-action@v31.10.6
with:
extra_nix_config: |
experimental-features = nix-command flakes

- name: Install Wine32 + system tools
run: |
sudo dpkg --add-architecture i386
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
wine32:i386 xvfb xdotool imagemagick

- name: Cache RA95.EXE
uses: actions/cache@v5.0.5
with:
path: ${{ runner.temp }}/ra95-cache
key: ra95-exe-a95e2ac85c4cc3aaacb7795e3c07b8aec7c3e10efe679766fb2ee15b12aa2d55

- name: Prepare RA95.EXE
run: |
sudo mkdir -p /opt/redalert && sudo chmod 777 /opt/redalert
if [ -f "$RUNNER_TEMP/ra95-cache/RA95.EXE" ]; then
echo "::notice::RA95 cache hit — copying to /opt/redalert"
cp "$RUNNER_TEMP"/ra95-cache/* /opt/redalert/
else
echo "::notice::RA95 cache miss — downloading from archive.org"
bash scripts/wine-ra-setup.sh
mkdir -p "$RUNNER_TEMP/ra95-cache"
cp /opt/redalert/*.EXE /opt/redalert/*.DLL "$RUNNER_TEMP/ra95-cache/" 2>/dev/null || true
fi

- name: Run OG Red Alert under Wine
id: wine-run
run: |
bash scripts/wine-ra.sh \
&& echo "wine_ok=true" >> "$GITHUB_OUTPUT" \
|| echo "wine_ok=false" >> "$GITHUB_OUTPUT"

- name: Set WINE_RA_READY when screenshots captured
if: steps.wine-run.outputs.wine_ok == 'true'
run: echo "WINE_RA_READY=1" >> "$GITHUB_ENV"

- name: Run Tier 1 + Tier 3 comparison tests
run: |
Xvfb :99 -screen 0 1280x1024x24 &
XVFB_PID=$!
for i in $(seq 1 10); do
if xdpyinfo -display :99 >/dev/null 2>&1; then break; fi
sleep 0.5
done
nix develop --command playwright test e2e/tim699-ra-compare.spec.ts \
--grep "Tier 1|Tier 3" --reporter=line
PW_EXIT=$?
kill "$XVFB_PID" 2>/dev/null || true
exit $PW_EXIT

- name: Upload comparison screenshots
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: wine-comparison-screenshots
path: e2e/screenshots/
if-no-files-found: ignore

- name: Upload Playwright test results on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: wine-comparison-test-results
path: |
e2e/test-results/
e2e/report/
if-no-files-found: ignore

build-wasm:
name: Build WASM + regression
runs-on: ubuntu-24.04
timeout-minutes: 45

steps:
- uses: actions/checkout@v6.0.2

- name: Install Nix
uses: cachix/install-nix-action@v31.10.6
with:
extra_nix_config: |
experimental-features = nix-command flakes

- name: Cache Emscripten system libraries
- name: Cache Emscripten
uses: actions/cache@v5.0.5
with:
path: ${{ env.EM_CACHE_DIR }}
key: emcc-cache-5.0.6-${{ hashFiles('CMakeLists.txt', 'CMakePresets.json') }}
restore-keys: |
emcc-cache-5.0.6-

- name: Build WASM + validate + smoke (T1/T2)
env:
EM_CACHE: ${{ env.EM_CACHE_DIR }}
run: nix develop --command nix run .#ci-build-wasm

- name: WASM regression — T3 TD menu click (asset-gated)
env:
TD_ASSETS_URL: ${{ secrets.TD_ASSETS_URL }}
run: |
if [ -z "$TD_ASSETS_URL" ]; then
echo "::notice::T3 skipped — TD_ASSETS_URL secret not set"
exit 0
fi
nix develop --command nix run .#ci-run-test -- e2e/regression/T3-td-wasm-menu.spec.ts

- name: Upload T3 artifacts on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: t3-td-wasm-menu-results
path: e2e/screenshots/t3-td-wasm-menu-*.png

- name: WASM regression — T6 TD mission start (asset-gated)
env:
TD_ASSETS_URL: ${{ secrets.TD_ASSETS_URL }}
run: |
if [ -z "$TD_ASSETS_URL" ]; then
echo "::notice::T6 skipped — TD_ASSETS_URL secret not set"
exit 0
fi
nix develop --command nix run .#ci-run-test -- e2e/regression/T6-td-wasm-mission-start.spec.ts

- name: Upload T6 artifacts on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: t6-td-wasm-mission-start-results
path: e2e/screenshots/t6-td-wasm-*.png

- name: WASM regression — T7 TD audio pitch (asset-gated)
env:
TD_ASSETS_URL: ${{ secrets.TD_ASSETS_URL }}
run: |
if [ -z "$TD_ASSETS_URL" ]; then
echo "::notice::T7 skipped — TD_ASSETS_URL secret not set"
exit 0
fi
nix develop --command nix run .#ci-run-test -- e2e/regression/T7-td-audio-pitch.spec.ts

- name: Upload T7 artifacts on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: t7-td-audio-pitch-results
path: e2e/screenshots/t7-td-*.png

- name: WASM regression — T8 RA audio pitch (asset-gated)
env:
RA_ASSETS_URL: ${{ vars.RA_ASSETS_URL || secrets.RA_ASSETS_URL || '' }}
run: |
if [ -z "$RA_ASSETS_URL" ]; then
echo "::notice::T8 skipped — RA_ASSETS_URL not set"
exit 0
fi
nix develop --command nix run .#ci-run-test -- e2e/regression/T8-ra-audio-pitch.spec.ts

- name: Upload T8 artifacts on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: t8-ra-audio-pitch-results
path: e2e/screenshots/t8-ra-*.png

- name: WASM regression — T9 RA mission start (asset-gated)
- name: Run test suite
env:
RA_ASSETS_URL: ${{ vars.RA_ASSETS_URL || secrets.RA_ASSETS_URL || '' }}
TD_ASSETS_URL: ${{ secrets.TD_ASSETS_URL || '' }}
EM_CACHE: ${{ env.EM_CACHE_DIR }}
run: |
if [ -z "$RA_ASSETS_URL" ]; then
echo "::notice::T9 skipped — RA_ASSETS_URL not set"
exit 0
fi
nix develop --command nix run .#ci-run-test -- e2e/regression/T9-ra-wasm-mission-start.spec.ts
nix develop --command bash -c "
export CCACHE_DIR=${{ env.CCACHE_DIR }}
ccache --zero-stats
ccache --max-size 500M
nix run .#test -- --all
ccache --show-stats
"

- name: Upload T9 artifacts on failure
- name: Upload artifacts on failure
if: failure()
uses: actions/upload-artifact@v7.0.1
with:
name: t9-ra-wasm-mission-start-results
path: e2e/screenshots/t9-ra-wasm-*.png

clang-tidy:
name: clang-tidy static analysis
runs-on: ubuntu-24.04
continue-on-error: true

steps:
- uses: actions/checkout@v6.0.2

- name: Install Nix
uses: cachix/install-nix-action@v31.10.6
with:
extra_nix_config: |
experimental-features = nix-command flakes

- name: Run clang-tidy
id: clang-tidy
continue-on-error: true
run: nix develop --command nix run .#ci-clang-tidy

- name: Upload clang-tidy report
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: clang-tidy-report
path: clang-tidy-report.txt
if-no-files-found: ignore

cppcheck:
name: cppcheck static analysis
runs-on: ubuntu-24.04
continue-on-error: true

steps:
- uses: actions/checkout@v6.0.2

- name: Install Nix
uses: cachix/install-nix-action@v31.10.6
with:
extra_nix_config: |
experimental-features = nix-command flakes

- name: Install cppcheck
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends cppcheck

- name: Run cppcheck
id: cppcheck
continue-on-error: true
run: nix develop --command nix run .#ci-cppcheck

- name: Upload cppcheck report
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: cppcheck-report
path: cppcheck-report.txt
name: test-results
path: |
e2e/screenshots/
e2e/test-results/
e2e/report/
/tmp/clang-tidy-report.txt
/tmp/cppcheck-report.txt
if-no-files-found: ignore
11 changes: 4 additions & 7 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# GitHub Pages Deploy — manual trigger only.
# Builds WASM targets, runs full regression suite, deploys to GitHub Pages.
# Local equivalent: nix run .#ci-build-wasm && nix run .#ci-wasm-smoke
# Local equivalent: nix run .#ra-wasm-build && nix run .#td-wasm-build

name: GitHub Pages Deploy

Expand Down Expand Up @@ -56,20 +56,17 @@ jobs:
- name: Configure ccache
env:
CCACHE_DIR: ${{ env.CCACHE_DIR }}
run: nix develop --command nix run .#ci-cc-setup
run: nix develop --command bash -c "ccache --zero-stats && ccache --max-size 500M"

- name: Build ra.wasm
env:
EM_CACHE: ${{ env.EM_CACHE_DIR }}
run: nix develop --command nix run .#build-wasm ra
run: nix develop --command nix run .#ra-wasm-build

- name: Build td.wasm
env:
EM_CACHE: ${{ env.EM_CACHE_DIR }}
run: nix develop --command nix run .#build-wasm td

- name: Validate and smoke test
run: nix develop --command bash -c "nix run .#validate-wasm && nix run .#ci-wasm-smoke"
run: nix develop --command nix run .#td-wasm-build

- name: Start Xvfb and WASM server
run: |
Expand Down
Loading
Loading