Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
8366daa
chore: remove legacy WPF launcher and vendored packages
Jaredl-Dev Aug 31, 2026
725f79f
build: add solution scaffolding and central package management
Jaredl-Dev Aug 31, 2026
06da6fc
style: add editorconfig with enforced analyzer rules
Jaredl-Dev Aug 31, 2026
8cd03d4
feat(core): add launcher path resolution and filesystem layout
Jaredl-Dev Aug 31, 2026
56569a0
feat(core): add mod catalog domain models
Jaredl-Dev Aug 31, 2026
7f761d6
feat(core): add launching and content integrity contracts
Jaredl-Dev Aug 31, 2026
c5b1396
feat(core): add preferences, update, and platform contracts
Jaredl-Dev Aug 31, 2026
9131a42
feat(infra): add path safety and atomic file persistence
Jaredl-Dev Aug 31, 2026
2c1ef24
feat(infra): add HTTP remote access, archive extraction, and logging
Jaredl-Dev Aug 31, 2026
65413c0
feat(infra): add launcher preferences persistence
Jaredl-Dev Aug 31, 2026
080b4d5
feat(infra): add game installation discovery and shell services
Jaredl-Dev Aug 31, 2026
3f5b1e1
feat(infra): add mod catalog, local content, and image caching
Jaredl-Dev Aug 31, 2026
783a169
feat(infra): add resumable download and S3 package update pipeline
Jaredl-Dev Aug 31, 2026
1cefd0f
feat(infra): add content integrity scanning and snapshots
Jaredl-Dev Aug 31, 2026
227fb94
feat(infra): add hard-link deployment and game process launching
Jaredl-Dev Aug 31, 2026
1f88431
feat(infra): register infrastructure services
Jaredl-Dev Aug 31, 2026
5f184e3
feat(ui): add application shell, theming, and shared controls
Jaredl-Dev Aug 31, 2026
a216ea1
feat(ui): add localization infrastructure and default strings
Jaredl-Dev Aug 31, 2026
6d8f8f7
feat(ui): add translated string resources
Jaredl-Dev Aug 31, 2026
4298ba8
feat(ui): add application host and first-run setup workflow
Jaredl-Dev Aug 31, 2026
5072bee
feat(ui): add launcher main window and view model
Jaredl-Dev Aug 31, 2026
629e019
feat(ui): add launcher workflow coordination services
Jaredl-Dev Aug 31, 2026
f9b07a0
feat(ui): add mod tiles, import, and info dialogs
Jaredl-Dev Aug 31, 2026
15b137d
feat(ui): add settings and custom executable management
Jaredl-Dev Aug 31, 2026
20d47cb
feat(ui): add integrity review dialog and package activity
Jaredl-Dev Aug 31, 2026
f121413
test: add shared test fixtures and stubs
Jaredl-Dev Aug 31, 2026
3881d1f
test: add core domain tests
Jaredl-Dev Aug 31, 2026
1f41f48
test: add platform, persistence, and remote tests
Jaredl-Dev Aug 31, 2026
7557610
test: add mod catalog tests
Jaredl-Dev Aug 31, 2026
5d57cf8
test: add download and package update tests
Jaredl-Dev Aug 31, 2026
7642ff2
test: add deployment, launching, and integrity tests
Jaredl-Dev Aug 31, 2026
c727100
test: add startup and shared UI tests
Jaredl-Dev Aug 31, 2026
465c408
test: add launcher window tests
Jaredl-Dev Aug 31, 2026
f5c4501
test: add mods, settings, integrity, and dialog UI tests
Jaredl-Dev Aug 31, 2026
fe160d7
test: add architecture and naming convention tests
Jaredl-Dev Aug 31, 2026
f81f9cc
build: add coverage and mutation testing configuration
Jaredl-Dev Aug 31, 2026
7026619
ci: replace repository automation with build and audit workflows
Jaredl-Dev Aug 31, 2026
8903327
docs: rewrite README and add contributor guides
Jaredl-Dev Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .codex/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[mcp_servers.avalonia-docs]
url = "https://docs-mcp.avaloniaui.net/mcp"
20 changes: 20 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-reportgenerator-globaltool": {
"version": "5.5.10",
"commands": [
"reportgenerator"
],
"rollForward": false
},
"dotnet-stryker": {
"version": "4.16.0",
"commands": [
"dotnet-stryker"
],
"rollForward": false
}
}
}
673 changes: 673 additions & 0 deletions .editorconfig

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Line endings are declared in .editorconfig (end_of_line = crlf) and enforced
# on C# by `dotnet format whitespace`. Without this file the working-tree result
# depends on each contributor's core.autocrlf setting, so the same checkout can
# pass locally and fail the format gate in CI.
#
# Everything text-like is stored as LF and checked out as CRLF, which matches
# what the index already contains, so this changes no stored content.
* text=auto eol=crlf

# Binary assets must never be normalized or diffed as text.
*.png binary
*.jpg binary
*.ico binary
28 changes: 0 additions & 28 deletions .github/ISSUE_TEMPLATE/bug_report.md

This file was deleted.

20 changes: 0 additions & 20 deletions .github/ISSUE_TEMPLATE/feature_request.md

This file was deleted.

50 changes: 50 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Package versions are centralized in Directory.Packages.props, which Dependabot
# updates in place. Two things here are deliberately not covered and stay manual:
# the SDK pin in global.json, and the tool pin in .config/dotnet-tools.json.
#
# Updates are grouped so a framework arrives as one reviewable pull request
# rather than one per package. Every pull request still has to clear the full
# build, which treats style, naming, and code quality violations as errors, so a
# bump that introduces a new diagnostic will fail until it is dealt with.
version: 2

updates:
- package-ecosystem: nuget
directory: "/"
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: chore
include: scope
groups:
avalonia:
patterns:
- "Avalonia*"
serilog:
patterns:
- "Serilog*"
microsoft-extensions:
patterns:
- "Microsoft.Extensions.*"
test-tooling:
patterns:
- "coverlet.*"
- "FluentAssertions"
- "Microsoft.NET.Test.Sdk"
- "NSubstitute*"
- "xunit*"

- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
day: monday
commit-message:
prefix: ci
include: scope
groups:
actions:
patterns:
- "*"
84 changes: 84 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: CI

on:
push:
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
# Normalizes source paths in the produced assemblies, which is what makes the
# Deterministic setting in Directory.Build.props reproducible off this machine.
ContinuousIntegrationBuild: true

jobs:
build-and-test:
name: Build, test, and verify coverage
runs-on: windows-2025
timeout-minutes: 20
env:
GENLAUNCHERGO_REQUIRE_SYMBOLIC_LINK_TESTS: true

steps:
- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6

- name: Set up .NET
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
global-json-file: global.json

- name: Restore
run: dotnet restore .\GenLauncherGO.sln

# Style, naming, and code quality rules are `error` in .editorconfig and
# run through EnforceCodeStyleInBuild, so the build itself is the primary
# gate.
- name: Build
run: dotnet build .\GenLauncherGO.sln --configuration Release --no-restore

# Runs the whitespace, style, and analyzer formatters. Not redundant with
# the build: whitespace and end-of-line violations are reported here only,
# as are style fixers that have no build-time implementation. Configuration
# independent, so once is enough.
- name: Verify formatting
run: dotnet format .\GenLauncherGO.sln --verify-no-changes --no-restore

- name: Test with coverage backstop
run: dotnet msbuild .\eng\coverage.proj -target:Coverage -property:Configuration=Release -property:SkipCoverageBuild=true

publish-smoke-test:
name: Publish smoke test
runs-on: windows-2025
timeout-minutes: 20

steps:
- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6

- name: Set up .NET
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
global-json-file: global.json

- name: Publish supported single-file executable
shell: pwsh
run: |
$publishDirectory = Join-Path $env:RUNNER_TEMP "GenLauncherGO-publish"
dotnet publish .\GenLauncherGO.UI\GenLauncherGO.UI.csproj -p:PublishProfile=WinX64SelfContained --output $publishDirectory
$launcherPath = Join-Path $publishDirectory "GenLauncherGO.exe"
if (-not (Test-Path -LiteralPath $launcherPath -PathType Leaf)) {
throw "Expected the supported launcher executable at $launcherPath."
}
$looseLibraries = @(Get-ChildItem -LiteralPath $publishDirectory -Filter "*.dll" -File -Recurse)
if ($looseLibraries.Count -ne 0) {
throw "The supported single-file publish unexpectedly produced loose DLL files."
}
58 changes: 58 additions & 0 deletions .github/workflows/dependency-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Dependency audit

on:
schedule:
# Weekly, so advisory checks run without waiting for a code change.
- cron: "0 6 * * 1"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true

jobs:
dependency-audit:
name: Dependency audit
runs-on: windows-2025
timeout-minutes: 15

# NU1901-NU1904 are downgraded to warnings in Directory.Build.props so that a
# newly published advisory cannot fail an unrelated pull request. This job is
# the other half of that decision: it fails loudly, on a schedule, so the
# findings are acted on rather than merely visible.
steps:
- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6

- name: Set up .NET
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
global-json-file: global.json

- name: Restore
run: dotnet restore .\GenLauncherGO.sln

- name: Fail on vulnerable packages
shell: pwsh
run: |
$report = dotnet list .\GenLauncherGO.sln package --vulnerable --include-transitive | Out-String
Write-Host $report
if ($report -match "has the following vulnerable packages") {
throw "Vulnerable packages detected. See the report above."
}

- name: Report deprecated packages
shell: pwsh
run: |
$report = dotnet list .\GenLauncherGO.sln package --deprecated | Out-String
Write-Host $report
if ($report -match "has the following deprecated packages") {
throw "Deprecated packages detected. See the report above."
}
Loading